共計 3449 個字符,預(yù)計需要花費(fèi) 9 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“eureka 中怎么把自己的服務(wù)打造的更加人性化”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
先來看下 eureka 的可視化界面如下。
我們知道,左側(cè)的服務(wù)名稱 MICROSERVICE-ORDER 是在項目中通過配置文件指定的。右邊的信息是注冊到 eureka 的服務(wù)信息,但是通過這個信息,我們無法獲知具體的細(xì)節(jié)。我們首先要改的就是這個地方。
1. 給服務(wù)起個更順眼的名字
我先打個比方,還是上一節(jié)舉的例子,很多創(chuàng)業(yè)公司入住經(jīng)濟(jì)開發(fā)區(qū)的寫字樓,那每個公司總得有名字吧,或者對外總得有一個合適的稱呼吧,你不能用一大長串公司代碼來指定該公司,這樣不僅不容易記住,更重要的是不好識別。
當(dāng)有很多微服務(wù)注冊到 Eureka 時,如果有哪個服務(wù)壞掉了,我們希望是能夠很直觀的知道是哪個服務(wù)出了問題,這樣能更加快捷的定位問題。比如我們知道這是個訂單服務(wù),端口號是 8001,那么如果我們直接顯示“訂單服務(wù) -8001”,是不是更加直觀呢?答案是肯定的,我們在訂單服務(wù)的配置文件中,通過 eureka.instance.instance-id 即可指定。如下:
2. 給服務(wù)指定一個正確的 IP
上面我們給服務(wù)指定了一個更順眼的名字,但是當(dāng)我們把鼠標(biāo)移到上面時,觀看左下角的 url 信息,如下:
可以看到,顯示的是:http://ifly-1741:8001/actuator/info,這不知道是啥啊。
這就好比說,我告訴你,你要想來了解我們公司的信息,你可以來 xxx 大樓 8001 層來了解。但是我根本就不知道 xxx 大樓的地址啊……
我們當(dāng)然不希望出現(xiàn)這種情況,可讀性太低了,這里理論上應(yīng)該是顯示該服務(wù)自身的 ip 才對,那么如何讓這里的 ip 顯示正常呢?
eureka 有個配置 eureka.instance.prefer-ip-address,該配置默認(rèn)為 false,我們需要把它設(shè)置為 true,這樣就能正常顯示 ip 地址了。
3. 給服務(wù)一個展示詳細(xì)信息頁面
做好了上面這一步之后,我們點擊“訂單服務(wù) -8001”這個鏈接,會訪問:
http://192.168.75.1:8001/actuator/info 這個地址,這沒問題。但是發(fā)現(xiàn)會報 404 錯誤,說明并不能找到該服務(wù)的詳細(xì)信息。
這就好比說,我這公司的名字也起了,地址也給你了,你接下來就跟著高德地圖的導(dǎo)航來找我了,但是我的信息還沒有導(dǎo)入到高德地圖啊……也就是說,高德地圖還不能監(jiān)視到我的信息,你當(dāng)然找不到我了。那怎么辦呢?
我們看這個 url 里面有個 actuator,沒錯,Actuator 在 Spring Boot 中是用來監(jiān)控的,我們在使用時需要導(dǎo)入這個依賴。
!-- spring boot actuator 監(jiān)控信息 --
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-actuator /artifactId
/dependency
但是光導(dǎo)入依賴還不行啊,就好比你去高德地圖注冊了賬號,但是你的詳細(xì)信息還得錄入到高德地圖的系統(tǒng)里啊。那怎么辦呢?
在導(dǎo)入了 actuator 依賴后,我們可以在配置文件中可以將這些服務(wù)的相關(guān)信息給初始化好,當(dāng)用戶點擊上面的服務(wù)鏈接后,就可以以 json 的格式展示出來。比如:
# 用來展示項目的基本信息
info:
author.name: shengwu ni
app.name: microservice
server.port: ${server.port}
application.name: ${spring.application.name}
當(dāng)點擊“訂單服務(wù) -8001”訪問 http://192.168.75.1:8001/actuator/info 時就會出現(xiàn)以下 json,即我們項目中配置的信息。
{
author : {
name : shengwu ni
},
app : {
name : microservice
},
server : {
port : 8001
},
application : {
name : microservice-order
}
}
哎?這樣就比較友好了,我公司名字也有了,地址也給你了,在地圖上的信息也錄入了,接下來你就可以順利到我公司來參觀,來了解我司信息了。
4. 給別人一個了解你的機(jī)會
通過上面一些配置,這個服務(wù)的相關(guān)信息可以說比較友好了。但是還有個問題啊,我公司別名起好了,地址也有了,也錄入地圖里了,但是我怎么能讓外界知道這些信息呢?我得有個公司主頁吧,也就是說,得有個入口讓別人知道這些信息才行。
這就叫服務(wù)發(fā)現(xiàn)。我們都說 Eureka 服務(wù)注冊與發(fā)現(xiàn),說到現(xiàn)在,我們一直在討論 Eureka 的服務(wù)注冊功能,讓服務(wù)注冊到 Eureka 中,我們可以在 Eureka 界面看到這些服務(wù),但是如何被外界發(fā)現(xiàn)呢?我們需要暴露一個接口給外界,專門提供本服務(wù)的詳細(xì)信息。
如何提供呢?我們需要寫一個接口,暴露給外界調(diào)用,如下:
/**
* 訂單服務(wù)
* @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 中所有的服務(wù)節(jié)點
List Application applications = client.getApplications().getRegisteredApplications();
if (applications != null) {
for (Application application : applications) {
// 對外暴露的服務(wù)名稱
String name = application.getName();
// 只看訂單服務(wù)信息
if (MICROSERVICE-ORDER .equals(name)) {
// 服務(wù)有多少個實例,比如訂單服務(wù)可能部署了多個,有多個訂單服務(wù)注冊到了 eureka
List InstanceInfo instances = application.getInstances();
LOGGER.info(所有的訂單服務(wù):{} , instances);
if (instances != null) {
for (InstanceInfo info : instances) {
LOGGER.info(服務(wù) id:{} , info.getInstanceId());
LOGGER.info(服務(wù)主機(jī):{} , info.getHostName());
LOGGER.info(服務(wù)端口:{} , info.getPort());
}
}
return instances;
}
}
}
return null;
}
}
首先,需要引入 EurekaClient 端,在接口內(nèi)部,通過 EurekaClient 獲取到注冊在 Eureka 上的所有 Application,這里的 application 其實就是我們常說的服務(wù)節(jié)點,從而獲取到服務(wù)節(jié)點的信息,包括服務(wù)節(jié)點的名稱、狀態(tài)、IP、端口、心跳情況等信息。直接將服務(wù)的信息返回即可。
這樣我們通過訪問該接口,通過返回的 json 可以很清楚的看到服務(wù)的詳細(xì)信息了。
“eureka 中怎么把自己的服務(wù)打造的更加人性化”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實用文章!