Spring Boot Admin无法监控部分服务的排查与修复

Spring Boot Admin 无法监控部分服务的排查与修复

各位朋友,大家好!今天我们来聊一聊 Spring Boot Admin 无法监控部分服务的问题。这个问题在实际开发中很常见,原因也多种多样。我们将从各个方面入手,详细讲解排查思路和修复方法,帮助大家更好地解决这个问题。

一、问题现象与排查思路

首先,我们需要明确问题现象:Spring Boot Admin 服务运行正常,能够监控一部分 Spring Boot 应用,但有一部分应用无法被监控到。

针对这个问题,我们的排查思路可以分为以下几个步骤:

  1. 确认被监控服务是否启动成功: 这是最基本的一步,确保问题服务确实在运行,并且没有启动失败。
  2. 检查被监控服务的依赖配置: 确认被监控服务是否正确引入了 Spring Boot Admin Client 的依赖。
  3. 核对被监控服务的配置信息: 检查被监控服务的 application.ymlapplication.properties 文件中与 Spring Boot Admin Client 相关的配置是否正确。
  4. 查看被监控服务的日志信息: 仔细阅读被监控服务的日志,查找是否有与 Spring Boot Admin Client 相关的错误或警告信息。
  5. 检查 Spring Boot Admin Server 的配置: 确认 Spring Boot Admin Server 的配置是否正确,例如服务发现方式是否配置正确。
  6. 网络连通性测试: 确认被监控服务和 Spring Boot Admin Server 之间的网络是否畅通。
  7. 版本兼容性问题: 确认 Spring Boot Admin Server 和 Client 的版本是否兼容。
  8. 权限问题: 检查被监控服务是否有权限访问 Spring Boot Admin Server。

下面我们将逐一深入分析这些步骤,并提供相应的解决方案。

二、被监控服务依赖配置检查

被监控服务需要引入 Spring Boot Admin Client 的依赖才能被 Spring Boot Admin Server 监控到。通常,我们使用 Maven 或 Gradle 来管理依赖。

Maven:

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.7.x</version> <!-- 使用最新版本,替换 x 为最新小版本号 -->
</dependency>

Gradle:

dependencies {
    implementation 'de.codecentric:spring-boot-admin-starter-client:2.7.x' // 使用最新版本,替换 x 为最新小版本号
}

注意:

  • spring-boot-admin-starter-client 的版本需要与 Spring Boot Admin Server 的版本兼容。建议使用相同的版本。
  • 如果你的项目使用了 Spring Cloud,并且已经引入了 spring-cloud-starter-netflix-eureka-client 或类似的注册中心客户端依赖,那么可以省略 Spring Boot Admin Client 的依赖,直接通过注册中心进行服务发现。

排查方法:

  1. 打开被监控服务的 pom.xml (Maven) 或 build.gradle (Gradle) 文件。
  2. 确认是否包含了上述依赖。
  3. 确认依赖的版本号是否正确。
  4. 重新构建项目,确保依赖被正确加载。

三、被监控服务配置信息核对

Spring Boot Admin Client 需要一些配置信息才能正确连接到 Spring Boot Admin Server。这些配置信息通常在 application.ymlapplication.properties 文件中配置。

常用配置项:

配置项 说明
spring.boot.admin.client.url Spring Boot Admin Server 的 URL 地址。
spring.boot.admin.client.instance.name 被监控服务的实例名称。如果不配置,默认使用 spring.application.name
spring.boot.admin.client.instance.metadata.management.context-path 被监控服务的管理端点上下文路径。默认值为 ${server.servlet.context-path}/actuator。如果你的应用使用了自定义的上下文路径,需要进行相应的修改。
spring.boot.admin.client.instance.metadata.management.port 被监控服务的管理端点端口。默认值为 ${server.port}。如果你的应用的管理端点使用了不同的端口,需要进行相应的修改。
spring.boot.admin.client.instance.metadata.management.address 被监控服务的管理端点地址。默认值为 ${server.address}。如果你的应用的管理端点绑定了不同的地址,需要进行相应的修改。
spring.boot.admin.client.username 连接 Spring Boot Admin Server 的用户名(如果 Spring Boot Admin Server 启用了安全认证)。
spring.boot.admin.client.password 连接 Spring Boot Admin Server 的密码(如果 Spring Boot Admin Server 启用了安全认证)。
spring.boot.admin.client.enabled 是否启用 Spring Boot Admin Client。默认为 true

示例配置 (application.yml):

spring:
  application:
    name: my-service
  boot:
    admin:
      client:
        url: http://localhost:8080  # Spring Boot Admin Server 的地址
        instance:
          name: my-service-instance
          metadata:
            management:
              context-path: /actuator
              port: 8081       # 如果 actuator 端口和 server 端口不一样
              address: 127.0.0.1 # 如果 actuator 绑定了指定 IP
        username: admin      # 如果 SBA 启用了 security
        password: password   # 如果 SBA 启用了 security

排查方法:

  1. 打开被监控服务的 application.ymlapplication.properties 文件。
  2. 确认是否包含了上述必要的配置项。
  3. 确认配置项的值是否正确,例如 Spring Boot Admin Server 的 URL 地址是否正确。
  4. 特别注意 management.context-pathmanagement.portmanagement.address 这三个配置项,确保它们与被监控服务的实际配置一致。
  5. 如果 Spring Boot Admin Server 启用了安全认证,确保配置了正确的用户名和密码。

四、被监控服务日志信息查看

被监控服务的日志信息是排查问题的重要线索。我们需要仔细阅读日志,查找是否有与 Spring Boot Admin Client 相关的错误或警告信息。

常见的错误信息:

  • Connection refusedConnection timeout:表示无法连接到 Spring Boot Admin Server。
  • Unauthorized:表示认证失败,用户名或密码错误。
  • No instances available for <service-id>:表示无法从注册中心获取到 Spring Boot Admin Server 的实例信息。
  • Registration failed:表示注册到 Spring Boot Admin Server 失败。

排查方法:

  1. 查看被监控服务的日志文件,例如 application.logcatalina.out
  2. 搜索关键词,例如 spring-boot-admin, registration, connection, error, warn
  3. 仔细阅读错误信息,尝试理解错误的原因。
  4. 根据错误信息,修改配置或代码,解决问题。

示例:

如果日志中出现以下错误信息:

2023-10-27 10:00:00.000 ERROR [my-service,1234567890abcdef,1234567890abcdef] 1 --- [istrationTask] de.codecentric.boot.admin.client.registration.RegistrationClient : Registration at spring-boot-admin failed: 401 Unauthorized

这表示认证失败,我们需要检查 spring.boot.admin.client.usernamespring.boot.admin.client.password 配置是否正确。

五、Spring Boot Admin Server 配置检查

Spring Boot Admin Server 的配置也会影响到服务的监控。我们需要确保 Spring Boot Admin Server 的配置正确,例如服务发现方式是否配置正确。

常用的配置项:

配置项 说明
spring.boot.admin.ui.title Spring Boot Admin 的页面标题。
spring.boot.admin.ui.favicon Spring Boot Admin 的页面图标。
spring.boot.admin.client.enabled 是否启用 Spring Boot Admin Client。默认为 true。在 Spring Boot Admin Server 中,这个配置通常没有意义,因为它本身就是 Server。
spring.boot.admin.discovery.enabled 是否启用服务发现。默认为 true。如果设置为 false,则需要手动配置被监控服务的 URL 地址。
eureka.client.service-url.defaultZone Eureka Server 的地址。如果使用 Eureka 进行服务发现,需要配置此项。
spring.security.user.name Spring Security 的用户名(如果启用了安全认证)。
spring.security.user.password Spring Security 的密码(如果启用了安全认证)。

示例配置 (application.yml):

spring:
  application:
    name: spring-boot-admin-server
  boot:
    admin:
      ui:
        title: My Spring Boot Admin
      discovery:
        enabled: true # 启用服务发现
  security:
    user:
      name: admin
      password: password

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/ # Eureka Server 的地址

排查方法:

  1. 打开 Spring Boot Admin Server 的 application.ymlapplication.properties 文件。
  2. 确认是否启用了服务发现 (spring.boot.admin.discovery.enabled=true)。
  3. 如果使用 Eureka 进行服务发现,确认 eureka.client.service-url.defaultZone 配置是否正确。
  4. 如果启用了安全认证,确认 spring.security.user.namespring.security.user.password 配置是否正确。

六、网络连通性测试

确保被监控服务和 Spring Boot Admin Server 之间的网络畅通。可以使用 pingtelnet 命令进行测试。

测试方法:

  1. 在被监控服务的服务器上,执行 ping <Spring Boot Admin Server 的 IP 地址> 命令。
  2. 如果 ping 命令无法正常执行,表示网络不通。需要检查防火墙设置、网络配置等。
  3. 在被监控服务的服务器上,执行 telnet <Spring Boot Admin Server 的 IP 地址> <Spring Boot Admin Server 的端口> 命令。
  4. 如果 telnet 命令无法连接到 Spring Boot Admin Server,表示端口不通。需要检查防火墙设置、端口配置等。

示例:

ping 192.168.1.100
telnet 192.168.1.100 8080

七、版本兼容性问题

Spring Boot Admin Server 和 Client 的版本需要兼容。如果不兼容,可能会导致监控失败。

建议:

  • 使用相同版本的 Spring Boot Admin Server 和 Client。
  • 查阅官方文档,了解版本兼容性信息。

排查方法:

  1. 查看 Spring Boot Admin Server 和 Client 的版本号。
  2. 查阅官方文档,确认版本是否兼容。
  3. 如果版本不兼容,尝试升级或降级版本。

八、权限问题

如果 Spring Boot Admin Server 启用了安全认证,需要确保被监控服务有权限访问 Spring Boot Admin Server。

解决方案:

  1. 在 Spring Boot Admin Server 中配置正确的用户角色和权限。
  2. 在被监控服务的配置中,配置正确的用户名和密码。
  3. 如果使用了 OAuth2 或其他认证方式,确保配置正确。

示例 (Spring Boot Admin Server SecurityConfig):

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final String adminUsername;
    private final String adminPassword;

    public SecurityConfig(@Value("${spring.security.user.name}") String adminUsername,
                          @Value("${spring.security.user.password}") String adminPassword) {
        this.adminUsername = adminUsername;
        this.adminPassword = adminPassword;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl("/");

        http.authorizeRequests()
            .antMatchers("/assets/**").permitAll()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin().loginPage("/login").successHandler(successHandler).and()
            .logout().logoutUrl("/logout").and()
            .httpBasic().and()
            .csrf().disable(); // 生产环境需要开启 csrf 保护
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser(adminUsername).password("{noop}" + adminPassword).roles("ADMIN");
    }
}

排查方法:

  1. 检查 Spring Boot Admin Server 的安全配置。
  2. 确认被监控服务的用户名和密码配置是否正确。
  3. 查看 Spring Boot Admin Server 的日志,查找是否有认证相关的错误信息。

九、其他常见问题

除了上述常见问题外,还有一些其他情况可能导致 Spring Boot Admin 无法监控部分服务:

  • Actuator 端点未暴露: 确保被监控服务的 Actuator 端点已暴露。可以在 application.yml 中配置:

    management:
      endpoints:
        web:
          exposure:
            include: "*"
  • Actuator 端点安全配置: 确保 Actuator 端点的安全配置允许 Spring Boot Admin Server 访问。

  • Spring Cloud Gateway 路由配置: 如果使用 Spring Cloud Gateway,确保路由配置正确,将请求转发到被监控服务的 Actuator 端点。

  • 注册中心问题: 如果使用注册中心,确保注册中心运行正常,并且被监控服务已成功注册到注册中心。

十、解决案例分析

案例一:Actuator 端口与 Server 端口不一致

某服务正常启动,也注册到了 Eureka,但是 SBA 一直无法监控。查看服务日志,发现 SBA Client 成功注册,但是一直报 connection refused。仔细排查发现该服务的 Actuator 端口和 Server 端口不一致,Server 端口是 8080,Actuator 端口是 8081。

解决方案:

在服务的 application.yml 中添加如下配置:

spring:
  boot:
    admin:
      client:
        instance:
          metadata:
            management:
              port: 8081

案例二:SBA Client 和 Server 版本不一致

某服务升级了 SBA Client 的版本,但是 SBA Server 的版本没有升级,导致监控失败。

解决方案:

将 SBA Server 的版本升级到与 SBA Client 相同的版本。

十一、Debugging技巧

当遇到无法监控服务的问题时,可以使用以下 Debugging 技巧:

  1. 设置日志级别: 将 Spring Boot Admin Client 的日志级别设置为 DEBUG,可以输出更详细的日志信息,帮助定位问题。

    logging:
      level:
        de.codecentric.boot.admin.client: DEBUG
  2. 使用断点调试: 在 Spring Boot Admin Client 的相关代码中设置断点,可以跟踪代码的执行流程,了解 Spring Boot Admin Client 的工作原理。

  3. 抓包分析: 使用 Wireshark 等工具抓包分析,可以查看 Spring Boot Admin Client 和 Server 之间的网络通信情况。

十二、排查思路总结

通过以上步骤,我们应该能够找到 Spring Boot Admin 无法监控部分服务的原因,并采取相应的解决方案。总结一下,排查思路如下:

  1. 基础检查: 服务是否启动成功?依赖是否正确引入?
  2. 配置核对: application.ymlapplication.properties 配置是否正确?尤其是 URL、端口、用户名密码等。
  3. 日志分析: 查看服务和 SBA Server 的日志,是否有错误或警告信息?
  4. 网络测试: pingtelnet 测试网络连通性。
  5. 版本兼容: SBA Client 和 Server 的版本是否兼容?
  6. 权限检查: 是否存在权限问题?
  7. 其他问题: Actuator 端点是否暴露?安全配置是否正确?

希望今天的分享能够帮助大家解决 Spring Boot Admin 无法监控部分服务的问题。感谢大家的收听!

维护和持续监控的重要性

Spring Boot Admin 的监控不仅仅是配置完成就结束了,需要定期维护和持续监控,确保所有服务都能被正确监控,及时发现并解决潜在问题。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注