1. 程式人生 > 實用技巧 >Eureka的細節(首頁顯示微服務名、外網訪問顯示正確ip、詳情資訊、服務發現)

Eureka的細節(首頁顯示微服務名、外網訪問顯示正確ip、詳情資訊、服務發現)

一、首頁顯示的微服務名

  Eureka 首頁顯示的微服務名預設為:機器主機名:應用名稱:應用埠,也就是:

${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id}:${server.port}

我們很難識別,自定義顯示名字

在application.yml配置檔案中修改引數:

#eureka相關配置
eureka:
  instance:
    hostname: 127.0.0.1  (這裡沒關係)
   #設定是否將自己作為客戶端註冊到註冊中心(預設true)
   #這裡為不需要,檢視@EnableEurekaServer註解的原始碼,會發現它間接用到了@EnableDiscoveryClient
    instance-id:
userService-${spring.cloud.client.ipaddress}-${server.port}

二、給伺服器一個正確的IP

  上面我們給服務指定了一個更順眼的名字,但是當我們把滑鼠移到上面時,

顯示的是:http://localhost:8084/actuator/info

可讀性太低了,這裡理論上應該是顯示該服務自身的 ip 才對,那麼如何讓這裡的 ip 顯示正常呢?

在application.yml配置檔案中修改引數:

#服務資訊顯示的真實的ip, 開發中一定要設定為true, 如果不設定, 其他電腦訪問不到你的服務
prefer-ip-address: true

三、設定微服務的詳細資訊

但是預設情況下,是沒有微服務的資訊的,它是一個空的

    顯示{}

在大型專案中,微服務可能會有成百上千個,如果你沒有填寫微服務的資訊,否則你的專案維護會非常痛苦。

填寫微服務的資訊

1、在你的微服務專案中新增actuator依賴,以及外掛

<!-- 微服務的詳細資訊 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId
> </dependency> 外掛: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimiter>$</delimiter> </delimiters> </configuration> </plugin> </plugins> </build>

2、在專案的配置檔案中,填寫該微服務的資訊:

#服務的描述資訊
info:
  app:
    name: helloServer-microcloud
  author:
    name: hhj
  build:
    artifactId: $project.artifactId$
    version: $project.version$
  company:
    name: www.zl.com
  server:
    port: ${server.port}

顯示:

四、服務發現

  通過上面一些配置,這個服務的相關資訊可以說比較友好了。但是還有個問題啊,

我公司別名起好了,地址也有了,也錄入地圖裡了,但是我怎麼能讓外界知道這些資訊呢?

我得有個公司主頁吧,也就是說,得有個入口讓別人知道這些資訊才行。

我們需要暴露一個介面給外界,專門提供本服務的詳細資訊。

寫一個介面,暴露給外界呼叫:

@RestController
@RequestMapping("/hello")
public class InfoController {
@Resource
private EurekaClient client;

private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);

@GetMapping("/discovery")
public Object discovery() {
    // 獲取Eureka中所有的服務節點
    List<Application> applications = client.getApplications().getRegisteredApplications();
    if (applications != null) {
        for (Application application : applications) {
            // 對外暴露的服務名稱
            String name = application.getName();
            // 只看hello服務資訊
            if ("house-userService".equalsIgnoreCase(name)) {
                // 服務有多少個例項,比如訂單服務可能部署了多個,有多個訂單服務註冊到了eureka
                List<InstanceInfo> instances = application.getInstances();
                LOGGER.info("所有的hello服務:{}", instances);
                if (instances != null) {
                    for (InstanceInfo info : instances) {
                        LOGGER.info("服務id:{}", info.getInstanceId());
                        LOGGER.info("服務主機:{}", info.getHostName());
                        LOGGER.info("服務埠:{}", info.getPort());
                    }
                }
                return instances;
            }
        }
    }
    return null;
}
}

需要引入 EurekaClient 端,在介面內部,通過 EurekaClient 獲取到註冊在 Eureka 上的所有 Application,

這裡的 application 其實就是我們常說的服務節點,從而獲取到服務節點的資訊,

包括服務節點的名稱、狀態、IP、埠、心跳情況等資訊。直接將服務的資訊返回即可。