在使用Spring Boot Admin進行監控時,如果被監控的服務沒有加context-path的話是不會有任何問題的,一旦服務加了context-path的配置,監控就會失敗。
下圖是正常情況的顯示:
我們給被監控的服務增加一個context-path:
server.servlet.context-path=/yinjihuan
當被監控的服務增加了context-path之后,這邊就會報異常了,如下圖:
原因是什么呢?
這是因為加了context-path后actuator的訪問路徑都發生變化了,默認的路徑都訪問不到,拿不到數據導致的。
如何解決呢?
大家看上面貼的圖片,右上角顯示了健康狀態監測的地址:
http://192.168.31.244:8083/
http://192.168.31.244:8083/actuator
http://192.168.31.244:8083/actuator/health
在沒加context-path之前,就是這個地址去訪問的,加了之后訪問的時候就要把context-path給加上,也就是變成了下面的信息:
http://192.168.31.244:8083/yinjihuan
http://192.168.31.244:8083/yinjihuan/actuator
http://192.168.31.244:8083/yinjihuan/actuator/health
關鍵是如何去修改這個地址啊,我們想想看,Spring Boot Admin只是一個展示平台,本身是不存儲信息的,我們用的是整合了Eureka的方式,所以信息都是從Eureka過來的,查看下Eureka中服務的信息就知道了。
通過eureka部署的地址+/eureka/apps/服務名稱查看,如下圖:
可以看到在instance下面有homePageUrl,statusPageUrl,healthCheckUrl的值是沒加上context-path的,於是我把這三個值改過來:
eureka.instance.home-page-url-path=${server.servlet.context-path}
eureka.instance.health-check-url-path=${server.servlet.context-path}/actuator/health
eureka.instance.status-page-url-path=${server.servlet.context-path}/actuator/info
然后發現確實不報錯了,顯示如下:
問題是還有很多的監控信息不見了,現在只有一個Metadata和Health信息,還是沒有完全改好。
這個時候就兩種方式了,要么通過源碼的方式去解決問題,要么直接細讀官方文檔,我看了下文檔,找到了一個配置:
大概意思是將這個路徑追加到服務URL中,用於訪問端點信息,這個配置是需要增加到服務的metadata中的,如下:
eureka.instance.metadata-map.management.context-path=${server.servlet.context-path}/actuator
加了這句之后數據就能全部出來了,問題到此全部解決。
還有一種方式就是通過源碼的方式來解決,給大家提供點思路,當報錯的時候,我們可以抓包,看頁面是從哪個地址獲取的數據,比如:
主要是applications這個地址,可以看到重要的信息是endpoints里面的數據,這些端點信息和對應的url就是最終顯示的數據來源,當加了context-path之后這些地址還是之前的,所以獲取不到數據,那么為什么需要配置management.context-path就可以解決呢?
大家可以一步步跟進去看源碼,我直接告訴大家這塊的代碼在哪里
de.codecentric.boot.admin.server.services.endpoints.QueryIndexEndpointStrategy.detectEndpoints(Instance)
這個方法里面:
這邊就是獲取所有Endpoints的方法,instance.getRegistration().getManagementUrl()就是我們需要改正確的地址,只有這個地址正確了才能獲取到正確的Endpoints信息。