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、埠、心跳情況等資訊。直接將服務的資訊返回即可。