
昨天有朋友在微信裡聯系我,問我啥時候繼續更新 Spring Cloud 的文章,我很欣慰,那就來吧~繼續撸起!
在上一節(外行人都能看得懂的Spring Cloud服務注冊與發現,錯過了血虧!)中,我們介紹了如何搭建 Eureka 服務注冊中心,以及将訂單服務成功注冊到該服務中心,Eureka 的服務端口号是 7001,訂單服務的端口号是 8001。
這篇文章,繼續用通俗易懂的語言,告訴大家如何使我們的服務更加人性化。先來看下 eureka 的可視化界面如下。
由上一節内容,我們知道,左側的服務名稱MICROSERVICE-ORDER 是在項目中通過配置檔案指定的。右邊的資訊是注冊到 eureka 的服務資訊,但是通過這個資訊,我們無法獲知具體的細節。我們首先要改的就是這個地方。
1. 給服務起個更順眼的名字
我先打個比方,還是上一節舉的例子,很多創業公司入住經濟開發區的寫字樓,那每個公司總得有名字吧,或者對外總得有一個合适的稱呼吧,你不能用一大長串公司代碼來指定該公司,這樣不僅不容易記住,更重要的是不好識别。
當有很多微服務注冊到 Eureka 時,如果有哪個服務壞掉了,我們希望是能夠很直覺的知道是哪個服務出了問題,這樣能更加快捷的定位問題。比如我們知道這是個訂單服務,端口号是 8001,那麼如果我們直接顯示 “訂單服務-8001”,是不是更加直覺呢?答案是肯定的,我們在訂單服務的配置檔案中,通過eureka.instance.instance-id 即可指定。如下:
2. 給服務指定一個正确的 IP
上面我們給服務指定了一個更順眼的名字,但是當我們把滑鼠移到上面時,觀看左下角的 url 資訊,如下:
可以看到,顯示的是:http://ifly-1741:8001/actuator/info,這不知道是啥啊。
這就好比說,我告訴你,你要想來了解我們公司的資訊,你可以來 xxx 大樓8001層來了解。但是我根本就不知道 xxx 大樓的位址啊……
我們當然不希望出現這種情況,可讀性太低了,這裡理論上應該是顯示該服務自身的 ip 才對,那麼如何讓這裡的 ip 顯示正常呢?
eureka 有個配置eureka.instance.prefer-ip-address,該配置預設為 false,我們需要把它設定為 true,這樣就能正常顯示 ip 位址了。
3. 給服務一個展示詳細資訊頁面
做好了上面這一步之後,我們點選“訂單服務-8001”這個連結,會通路:
http://192.168.75.1:8001/actuator/info這個位址,這沒問題。但是發現會報404錯誤,說明并不能找到該服務的詳細資訊。
這就好比說,我這公司的名字也起了,位址也給你了,你接下來就跟着高德地圖的導航來找我了,但是我的資訊還沒有導入到高德地圖啊……也就是說,高德地圖還不能監視到我的資訊,你當然找不到我了。那怎麼辦呢?
我們看這個 url 裡面有個 actuator,沒錯,Actuator 在 Spring Boot 中是用來監控的,我們在使用時需要導入這個依賴。
<!-- spring boot actuator 監控資訊 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
複制
但是光導入依賴還不行啊,就好比你去高德地圖注冊了賬号,但是你的詳細資訊還得錄入到高德地圖的系統裡啊。那怎麼辦呢?
在導入了 actuator 依賴後,我們可以在配置檔案中可以将這些服務的相關資訊給初始化好,當使用者點選上面的服務連結後,就可以以 json 的格式展示出來。比如:
# 用來展示項目的基本資訊
info:
author.name: shengwu ni
app.name: microservice
server.port: ${server.port}
application.name: ${spring.application.name}
複制
當點選“訂單服務-8001”通路 http://192.168.75.1:8001/actuator/info 時就會出現以下 json,即我們項目中配置的資訊。
{
"author": {
"name": "shengwu ni"
},
"app": {
"name": "microservice"
},
"server": {
"port": "8001"
},
"application": {
"name": "microservice-order"
}
}
複制
哎?這樣就比較友好了,我公司名字也有了,位址也給你了,在地圖上的資訊也錄入了,接下來你就可以順利到我公司來參觀,來了解我司資訊了。
4. 給别人一個了解你的機會
通過上面一些配置,這個服務的相關資訊可以說比較友好了。但是還有個問題啊,我公司别名起好了,位址也有了,也錄入地圖裡了,但是我怎麼能讓外界知道這些資訊呢?我得有個公司首頁吧,也就是說,得有個入口讓别人知道這些資訊才行。
這就叫服務發現。我們都說 Eureka 服務注冊與發現,說到現在,我們一直在讨論 Eureka 的服務注冊功能,讓服務注冊到 Eureka 中,我們可以在 Eureka 界面看到這些服務,但是如何被外界發現呢?我們需要暴露一個接口給外界,專門提供本服務的詳細資訊。
如何提供呢?我們需要寫一個接口,暴露給外界調用,如下:
/**
* 訂單服務
* @author shengwu ni
*/
@RestController
@RequestMapping("/provider/order")
public class OrderProviderController {
@Resource
private EurekaClient client;
private static final Logger LOGGER = LoggerFactory.getLogger(OrderProviderController.class);
@GetMapping("/discovery")
public Object discovery() {
// 擷取Eureka中所有的服務節點
List<Application> applications = client.getApplications().getRegisteredApplications();
if (applications != null) {
for (Application application : applications) {
// 對外暴露的服務名稱
String name = application.getName();
// 隻看訂單服務資訊
if ("MICROSERVICE-ORDER".equals(name)) {
// 服務有多少個執行個體,比如訂單服務可能部署了多個,有多個訂單服務注冊到了eureka
List<InstanceInfo> instances = application.getInstances();
LOGGER.info("所有的訂單服務:{}", 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、端口、心跳情況等資訊。直接将服務的資訊傳回即可。
這樣我們通過通路該接口,通過傳回的 json 可以很清楚的看到服務的詳細資訊了。
OK,這篇文章主要給大家介紹了一些完善 Eureka 中服務資訊的幾點方法,這麼完善之後,服務就更加人性化了,對排查問題也有很大的幫助作用。
每天
進步一點點