Spring Boot Admin Server 部署与多应用管理

好的,没问题!咱们来聊聊 Spring Boot Admin Server 部署与多应用管理,保证你读完之后,能像老司机一样轻松驾驭它。

Spring Boot Admin Server:应用监控界的瑞士军刀

想象一下,你是一位餐厅老板,旗下有N家分店。每天你都要亲自跑到每家店里,看看后厨的食材是否新鲜,服务员是不是在摸鱼,顾客的反馈如何。这得多累啊!有没有一种工具,能让你坐在办公室里,就能掌握所有分店的运营状况呢?

Spring Boot Admin Server 就是这样一款工具,它能集中监控和管理你的 Spring Boot 应用,让你对应用的运行状态一目了然。它就像一个中央控制台,把所有应用的健康状况、性能指标、日志信息等等都汇集到一起,让你运筹帷幄,决胜千里。

为什么要用 Spring Boot Admin Server?

  • 集中管理,省时省力: 无需登录到每个应用的服务器查看状态,所有信息都在一个地方。
  • 可视化监控,一目了然: 提供友好的 UI 界面,让你快速了解应用的健康状况、内存使用、CPU 占用等关键指标。
  • 告警通知,防患未然: 可以配置告警规则,当应用出现异常时,及时发送通知,让你第一时间处理问题。
  • 扩展性强,灵活定制: 可以自定义监控指标,集成第三方告警系统,满足不同的监控需求。

搭建 Spring Boot Admin Server:只需几步,轻松搞定

  1. 创建 Spring Boot 项目

    首先,我们需要创建一个 Spring Boot 项目作为 Admin Server。可以使用 Spring Initializr (https://start.spring.io/) 来快速生成项目。

    • Group: com.example
    • Artifact: admin-server
    • Dependencies:
      • spring-boot-starter-web
      • spring-boot-admin-starter-server
      • spring-boot-starter-security (可选,用于增加安全性)

    生成项目后,导入到你的 IDE (例如 IntelliJ IDEA 或 Eclipse)。

  2. 添加依赖

    确认 pom.xml 文件中包含以下依赖:

    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
        <version>3.1.5</version> <!-- 请使用最新版本 -->
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    注意: spring-boot-admin-starter-server 的版本要与你的 Spring Boot 版本兼容。建议使用最新版本。spring-boot-starter-security 是可选的,如果需要增加安全性,可以添加。

  3. 配置 Admin Server

    src/main/java/com/example/adminserver 目录下,创建一个类 AdminServerApplication.java,并添加 @EnableAdminServer 注解:

    import de.codecentric.boot.admin.server.config.EnableAdminServer;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableAdminServer
    public class AdminServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AdminServerApplication.class, args);
        }
    }

    这个 @EnableAdminServer 注解是关键,它告诉 Spring Boot 这是一个 Admin Server。

  4. 修改 application.propertiesapplication.yml

    src/main/resources 目录下,修改 application.propertiesapplication.yml 文件,添加以下配置:

    spring.application.name=admin-server
    server.port=8080 # 你可以选择其他端口
    spring.security.user.name=admin
    spring.security.user.password=admin # 生产环境务必修改密码
    spring.security.user.roles=ADMIN
    management.endpoints.web.exposure.include=*

    或者,使用 application.yml

    spring:
      application:
        name: admin-server
    server:
      port: 8080 # 你可以选择其他端口
    security:
      user:
        name: admin
        password: admin # 生产环境务必修改密码
        roles: ADMIN
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    • spring.application.name: 设置应用名称,方便识别。
    • server.port: 设置 Admin Server 监听的端口。
    • spring.security.user.namespring.security.user.password: 设置登录 Admin Server 的用户名和密码。 重要提示:在生产环境中,务必修改默认密码!
    • spring.security.user.roles: 设置用户的角色,这里设置为 ADMIN,拥有所有权限。
    • management.endpoints.web.exposure.include=*: 暴露所有的 management endpoints,让 Admin Server 可以获取应用的监控信息。
  5. 启动 Admin Server

    运行 AdminServerApplication.java,启动 Admin Server。

  6. 访问 Admin Server

    在浏览器中输入 http://localhost:8080 (如果你的端口是 8080),你应该能看到 Admin Server 的登录界面。输入你设置的用户名和密码,登录后就可以看到 Admin Server 的主界面了。

注册 Spring Boot 应用到 Admin Server:让应用乖乖听话

  1. 添加依赖

    在你的 Spring Boot 应用的 pom.xml 文件中,添加以下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
        <version>3.1.5</version> <!-- 请使用最新版本,与Admin Server保持一致 -->
    </dependency>
    • spring-boot-starter-web: 提供 Web 功能,让应用可以被访问。
    • spring-boot-starter-actuator: 提供 Actuator endpoints,用于暴露应用的监控信息。
    • spring-boot-admin-starter-client: 用于将应用注册到 Admin Server。
  2. 配置 Spring Boot 应用

    在你的 Spring Boot 应用的 application.propertiesapplication.yml 文件中,添加以下配置:

    spring.application.name=my-app # 设置应用名称
    server.port=8081 # 设置应用端口
    management.endpoints.web.exposure.include=* # 暴露所有 Actuator endpoints
    spring.boot.admin.client.url=http://localhost:8080 # Admin Server 的地址
    spring.boot.admin.client.username=admin # Admin Server 的用户名
    spring.boot.admin.client.password=admin # Admin Server 的密码

    或者,使用 application.yml

    spring:
      application:
        name: my-app # 设置应用名称
    server:
      port: 8081 # 设置应用端口
    management:
      endpoints:
        web:
          exposure:
            include: "*" # 暴露所有 Actuator endpoints
    spring.boot.admin:
      client:
        url: http://localhost:8080 # Admin Server 的地址
        username: admin # Admin Server 的用户名
        password: admin # Admin Server 的密码
    • spring.application.name: 设置应用名称,在 Admin Server 中显示。
    • server.port: 设置应用监听的端口。
    • management.endpoints.web.exposure.include=*: 暴露所有 Actuator endpoints,让 Admin Server 可以获取应用的监控信息。
    • spring.boot.admin.client.url: 设置 Admin Server 的地址。
    • spring.boot.admin.client.usernamespring.boot.admin.client.password: 设置 Admin Server 的用户名和密码,用于应用向 Admin Server 注册。
  3. 启动 Spring Boot 应用

    启动你的 Spring Boot 应用。

  4. 查看 Admin Server

    刷新 Admin Server 的页面,你应该能看到你的 Spring Boot 应用已经注册上去了。点击应用名称,可以查看应用的详细信息,例如健康状况、内存使用、线程信息等等。

高级用法:自定义监控指标和告警

Spring Boot Admin Server 不仅仅能监控 Spring Boot Actuator 提供的默认指标,还可以自定义监控指标,并设置告警规则。

  1. 自定义监控指标

    可以使用 Spring Boot Actuator 提供的 MeterRegistry 来注册自定义指标。例如,我们可以监控一个接口的调用次数:

    import io.micrometer.core.instrument.Counter;
    import io.micrometer.core.instrument.MeterRegistry;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MyController {
    
        private final Counter myApiCounter;
    
        @Autowired
        public MyController(MeterRegistry meterRegistry) {
            this.myApiCounter = meterRegistry.counter("my_api.calls");
        }
    
        @GetMapping("/my-api")
        public String myApi() {
            myApiCounter.increment();
            return "Hello, World!";
        }
    }

    这段代码定义了一个名为 my_api.calls 的 Counter,每次调用 /my-api 接口时,Counter 的值就会加 1。

    在 Admin Server 中,你可以在应用的 "Metrics" 页面看到这个自定义指标。

  2. 配置告警

    Spring Boot Admin Server 提供了告警功能,可以根据应用的健康状况、指标值等触发告警。

    • 创建 Notifier: 首先,需要创建一个 Notifier,用于发送告警通知。 Spring Boot Admin Server 支持多种 Notifier,例如 Email、Slack、Microsoft Teams 等。
    • 配置告警规则: 然后,需要配置告警规则,指定告警的条件和触发时要执行的动作。

    例如,我们可以配置一个告警规则,当应用的堆内存使用率超过 80% 时,发送邮件通知:

    import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
    import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.event.EventListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyAlertHandler {
    
        private static final Logger log = LoggerFactory.getLogger(MyAlertHandler.class);
        private final InstanceRepository instanceRepository;
    
        public MyAlertHandler(InstanceRepository instanceRepository) {
            this.instanceRepository = instanceRepository;
        }
    
        @EventListener
        public void handleInstanceStatusChangedEvent(InstanceStatusChangedEvent event) {
            String instanceId = event.getInstance();
            instanceRepository.find(instanceId).ifPresent(instance -> {
                if (instance.getStatusInfo().getStatus().isDown()) {
                    log.warn("Instance {} ({}) is DOWN!", instance.getRegistration().getName(), instance.getId());
                    // 在这里添加发送告警通知的逻辑,例如发送邮件或调用第三方告警系统
                }
            });
        }
    }

    这段代码监听 InstanceStatusChangedEvent 事件,当应用的健康状况变为 DOWN 时,会记录一条警告日志,并可以在这里添加发送告警通知的逻辑。

安全配置:保护你的 Admin Server

Admin Server 暴露了应用的监控信息,因此需要进行安全配置,防止未经授权的访问。

  1. 修改默认密码

    首先,务必修改默认的用户名和密码。在 application.propertiesapplication.yml 文件中,修改 spring.security.user.namespring.security.user.password 的值。

  2. 启用 HTTPS

    建议启用 HTTPS,对 Admin Server 的流量进行加密,防止数据泄露。

  3. 限制访问权限

    可以使用 Spring Security 来限制访问权限,只允许特定的用户或 IP 地址访问 Admin Server。

    例如,可以使用 Spring Security 的 httpBasic() 认证方式,只允许通过用户名和密码认证的用户访问:

    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                .antMatchers("/actuator/**").permitAll() // 允许 actuator endpoints 被访问
                .antMatchers("/assets/**").permitAll() // 允许静态资源被访问
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .and()
                .httpBasic();
        }
    }

    这段代码配置了 Spring Security,允许 /actuator/**/assets/**/login 路径被匿名访问,其他所有请求都需要进行身份验证。

总结:Spring Boot Admin Server,你的得力助手

Spring Boot Admin Server 是一款强大的应用监控和管理工具,可以帮助你轻松掌握应用的运行状态,及时发现和解决问题。通过本文的介绍,相信你已经掌握了 Spring Boot Admin Server 的基本用法和高级特性。赶快动手试试吧,让它成为你应用监控的得力助手!

表格:常用配置项

配置项 说明
spring.application.name 应用名称,用于在 Admin Server 中显示。
server.port 应用监听的端口。
management.endpoints.web.exposure.include 暴露的 Actuator endpoints,* 表示暴露所有 endpoints。
spring.boot.admin.client.url Admin Server 的地址。
spring.boot.admin.client.username Admin Server 的用户名。
spring.boot.admin.client.password Admin Server 的密码。
spring.security.user.name 登录 Admin Server 的用户名。
spring.security.user.password 登录 Admin Server 的密码。 重要提示:在生产环境中,务必修改默认密码!
spring.security.user.roles 登录 Admin Server 的用户角色。

希望这篇文章能帮助你更好地理解和使用 Spring Boot Admin Server。祝你使用愉快!

发表回复

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