当前位置:   article > 正文

Spring Boot Admin client配置 context-path与base-path 后 Spring Boot Admin 监控不到Spring Cloud信息_management.server.servlet.context-path

management.server.servlet.context-path

前言

      上一章说了Spring Boot Admin(SBA)的client端自定义management.server.servlet.context-path、management.endpoints.web.base-path来解决一个Tomcat多个实例的问题。但是这个配置eureka instance是SBA Admin端通过eureka server获取的配置不能识别的,SBA Admin从client的配置获取不到监控管理路径,会使用默认/actuator,这显然不然拿到我们定制的信息采集接口。

1. 模拟client

笔者就使用上一章的demo,分别配置management.server.servlet.context-path、management.endpoints.web.base-path来调试源码来确认Spring Cloud的这个坑

配置management.endpoints.web.base-path,management.server.servlet.context-path同理(上一章就是配置的这个)

  1. #server.port=8180
  2. spring.application.name=BootClient
  3. #spring.boot.admin.client.url=http://127.0.0.1:8082
  4. eureka.client.service-url.defaultZone=http://127.0.0.1:8088/eureka
  5. eureka.client.registry-fetch-interval-seconds=30
  6. eureka.instance.lease-renewal-interval-in-seconds=30
  7. eureka.instance.health-check-url-path=/bootClient/actuator/health
  8. #eureka.instance.metadata-map.management.context-path=ROOT2
  9. management.endpoints.web.exposure.include=*
  10. management.endpoint.health.show-details=always
  11. management.endpoints.web.base-path=/bootClient/actuator

这里把 eureka.instance.metadata-map.management.context-path注释了

2. SBA Admin源码分析

在admin 端打上断点,查看Spring Boot Admin的官方说明,实际上是client与admin保持心跳方式,我们看admin端监听器,可以看到使用了webflux技术

  1. /**
  2. * Listener for Heartbeats events to publish all services to the instance registry.
  3. *
  4. * @author Johannes Edmeier
  5. */
  6. public class InstanceDiscoveryListener {

跟踪registerInstance注册方法,这个方法是异步执行的定期心跳,可配置

  1. protected Mono<InstanceId> registerInstance(ServiceInstance instance) {
  2. try {
  3. Registration registration = converter.convert(instance).toBuilder().source(SOURCE).build();
  4. log.debug("Registering discovered instance {}", registration);
  5. return registry.register(registration);
  6. }
  7. catch (Exception ex) {
  8. log.error("Couldn't register instance for discovered instance ({})", toString(instance), ex);
  9. return Mono.empty();
  10. }
  11. }

跟踪注册方法

  1. @Override
  2. public Registration convert(ServiceInstance instance) {
  3. LOGGER.debug("Converting service '{}' running at '{}' with metadata {}", instance.getServiceId(),
  4. instance.getUri(), instance.getMetadata());
  5. return Registration.create(instance.getServiceId(), getHealthUrl(instance).toString())
  6. .managementUrl(getManagementUrl(instance).toString()).serviceUrl(getServiceUrl(instance).toString())
  7. .metadata(getMetadata(instance)).build();
  8. }

这里面有注册信息的拼接,getHealthUrl(instance)与getManagementUrl(instance)

getHealthUrl(instance),是心跳接口获取URL,也调用了getManagementUrl(instance)
  1. protected URI getHealthUrl(ServiceInstance instance) {
  2. return UriComponentsBuilder.fromUri(getManagementUrl(instance)).path("/").path(getHealthPath(instance)).build()
  3. .toUri();
  4. }
getManagementUrl(instance), 获取数据信息接口

这里很关键

  1. protected URI getManagementUrl(ServiceInstance instance) {
  2. return UriComponentsBuilder.newInstance().scheme(getManagementScheme(instance))
  3. .host(getManagementHost(instance)).port(getManagementPort(instance)).path("/")
  4. .path(getManagementPath(instance)).build().toUri();
  5. }

关键在于

.path(getManagementPath(instance)

前面是拼接http://hostname:port/;关键在于path,就是admin识别的client暴露的actuator接口信息URL

  1. protected String getManagementPath(ServiceInstance instance) {
  2. String managementPath = instance.getMetadata().get(DefaultServiceInstanceConverter.KEY_MANAGEMENT_PATH);
  3. if (!isEmpty(managementPath)) {
  4. return managementPath;
  5. }
  6. return this.managementContextPath;
  7. }

调试代码,是从client的注册中心的客户端配置读取的,为空就使用默认,eureka server,consul配置都是

management.context-path

只是配置的前缀不一样,这个配置是map里获取的,配置的metadata是map结构。

源码看出

可配置项如上。

默认路径,单独的应用肯定是没问题的

我们如果没有配置,就使用默认

见证本质的地方,这个URL是错误的

页面上也可以看到

3. 解决方法

源码看了,解决方法就很简单了,只要SBA识别的路径正确就可以了。需要配置

eureka.instance.metadata-map.management.context-path

使这个路径地址 = management.server.servlet.context-path + management.endpoints.web.base-path + "/actuator"

配置

management.server.servlet.context-path

要注意,这个是servlet 的content-path,不能和Spring boot的server.context-path同时配置,否则在心跳时会拼接两个contentPath,但是eureka instance都是配置eureka.instance.metadata-map.management.context-path

#这年头Spring Boot的基础配置也变了

server.context-path  #Spring Boot 1.X

server.servlet.context-path #Spring Boot 2.X

比如我配置

  1. #server.port=8180
  2. spring.application.name=BootClient
  3. #spring.boot.admin.client.url=http://127.0.0.1:8082
  4. eureka.client.service-url.defaultZone=http://127.0.0.1:8088/eureka
  5. eureka.client.registry-fetch-interval-seconds=30
  6. eureka.instance.lease-renewal-interval-in-seconds=30
  7. eureka.instance.health-check-url-path=/bootClient/actuator/health
  8. eureka.instance.status-page-url-path=/bootClient/actuator/info
  9. eureka.instance.metadata-map.management.context-path=/bootClient/actuator
  10. management.endpoints.web.exposure.include=*
  11. management.endpoint.health.show-details=always
  12. management.endpoints.web.base-path=/bootClient/actuator
  13. #management.server.servlet.context-path=/bootClient

页面正常

比如

  1. #server.port=8180
  2. spring.application.name=BootClient
  3. server.servlet.context-path=/boot
  4. #spring.boot.admin.client.url=http://127.0.0.1:8082
  5. eureka.client.service-url.defaultZone=http://127.0.0.1:8088/eureka
  6. eureka.client.registry-fetch-interval-seconds=30
  7. eureka.instance.lease-renewal-interval-in-seconds=30
  8. eureka.instance.health-check-url-path=/bootClient/actuator/health
  9. eureka.instance.status-page-url-path=/bootClient/actuator/info
  10. eureka.instance.metadata-map.management.context-path=/boot/bootClient/actuator
  11. management.endpoints.web.exposure.include=*
  12. management.endpoint.health.show-details=always
  13. management.endpoints.web.base-path=/bootClient/actuator
  14. #management.server.servlet.context-path=/boot

笔者配置上

management.server.servlet.context-path=/boot

就会有两个contentpath了,心跳不通过,数据是可以获取到的,上一章这个参数在Tomcat多实例服务器发挥作用了。

 

总结

      调试源码就可以解决这种奇特的问题,但是Spring Boot Admin的路径管理实在太麻烦了,各种拼接;当然使用默认不用配置,但必须 单应用单实例。不过一般微服务就是这样,所以估计Spring Boot Admin设计的时候就没深度的设计这块。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/856467
推荐阅读
相关标签
  

闽ICP备14008679号