在使用 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 信息。
欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)
PS:目前星球中正在星主的带领下组队学习 Sentinel,等你哦!