SpringBootAdmin 学习探究

SpringBootAdmin 是一个监控工具,旨在以良好且易于访问的方式可视化 Spring Boot Actuators 提供的信息

概念说明

SpringBootAdmin 是基于 spring-boot-actuator 实现的。spring-boot-actuator 负责基础的监控统计,
SpringBootAdmin 负责传输和展示监控统计结果。

SpringBootAdmin 分为客户端和服务端:spring-boot-admin-server 和 spring-boot-admin-client。
spring-boot-admin-server 是一个完整的项目,可以统管多个 spring-boot-admin-client,有完整的管理页面,
登录部分需要 spring-boot-security 实现,且需要手动引入和配置相关认证信息。

spring-boot-admin-client 只是一个内嵌在业务系统中的组件,它负责连接注册到 spring-boot-admin-server,
使得 spring-boot-admin-server 可以看到业务系统的监控统计。它只是负责注册连接 spring-boot-admin-server,
真正的监控统计需要 spring-boot-admin-server 反向调用业务系统的 spring-boot-actuator 相关接口,
且 spring-boot-actuator 的接口必须是免登录状态,不然 spring-boot-admin-server 展示的页面为空状态。

spring-boot-admin-server 和 spring-boot-admin-client 也可以同时集成在一个业务系统中,只要把两端的配置整合即可。

注意:SpringBootAdmin 只是 Spring 的第三方库,而其依赖的 spring-boot-actuator 是官方库

配置 spring-boot-admin-server

  1. maven 依赖配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- 基础Web依赖 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- spring-boot-admin-server 依赖 -->
    <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    </dependency>
    <!-- 登录部分需要 spring-boot-security 实现 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. spring 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    server:
    port: 8000

    spring:
    application:
    name: spring-admin
    # SpringBootAdmin 的原理是 先启动 SpringBootAdminServer 使用上面的 ${server.port:8000} 端口
    # 浏览器可以访问 http://localhost:8000 访问登录 SpringBootAdminServer
    # SpringBootAdminServer 是一个被动等待 SpringBootAdminClient 的连接
    # SpringBootAdminClient 需要配置 http://localhost:8000 注册地址和 admin:admin 的账号信息
    boot:
    admin:
    # 改变 SpringBootAdminServer 的注册地址
    # SpringBootAdminClient 配置的注册地址也要跟着修改
    context-path: /
    # SpringBootAdminServer 的登录认证要结合 SpringSecurity 一起使用
    # 要在Java代码 SecurityConfig 中
    # 配置 SpringBootAdminServer 的相关资源连接免登录如 /assets/**
    # 配置 SpringBootAdminServer 认证相关页面 /login /logout
    security:
    user:
    name: admin
    password: admin
  3. Java配置登录认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@EnableWebSecurity
public class SecurityConfig {

private final String adminContextPath;
private final AdminServerProperties adminServer;

public SecurityConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
this.adminServer = adminServerProperties;
}

@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
// adminServer.path("/") 和 adminContextPath + "/" 等效
successHandler.setDefaultTargetUrl(adminContextPath + "/");
successHandler.setDefaultTargetUrl(adminServer.path("/"));

return httpSecurity
.headers().frameOptions().disable()
.and()
.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**"
, adminContextPath + "/login"
, "/actuator"
, "/actuator/**"
).permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login")
.successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout")
.and()
.httpBasic().and()
.csrf()
.disable()
.build();
}
}

配置 spring-boot-admin-client

  1. maven 依赖配置
    1
    2
    3
    4
    5
    6
    7
    <!-- spring-boot-admin-client (内部已经包含了 spring-boot-actuator ) -->
    <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    </dependency>
    <!-- ... 其他业务系统依赖 -->

  2. spring 配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    spring:
    application:
    name: spring-app
    boot:
    admin:
    # SpringBootAdmin 监控的原理是先启动一个 SpringBootAdminServer 暴露地址 http://127.0.0.1:8000/admin
    # 然后 由 SpringBootAdminClient 向 SpringBootAdminServer 登录并注册服务
    client:
    enabled: true
    # SpringBootAdminServer 的用户名和密码
    username: admin
    password: admin
    # 连接SpringBootAdminServer的地址
    # 但是注册成功后,展示监控内容时,SpringBootAdminServer 会反向请求本服务的 /actuator 接口
    # 所以 /actuator 的接口应该是免登录的,否则注册成功后 SpringBootAdminServer 展示的监控内容为空
    url: http://127.0.0.1:8000/admin
    instance:
    # 向 SpringBootAdminServer 注册的服务名称
    name: ${spring.application.name}
    prefer-ip: true
    service-host-type: IP

    # 提供详细信息,可以在 SpringBootAdminServer 中看得到
    info:
    # app 是一个字典,内部的 key 可以随意定义
    app:
    name: app-info
    version: 1.0
    test: test
    # 随意的 Key 值
    scwang: name

    # spring-boot-actuator 的配置信息
    management:
    info:
    env:
    enabled: true
    endpoint:
    loggers:
    enabled: true
    health:
    show-details: always
    endpoints:
    enabled-by-default: true
    web:
    # spring-boot-actuator 监控接口前缀
    base-path: /actuator
    exposure:
    include: '*'

client 和 server 单实例部署

经过试验验证,他们是可以混合在一起部署的,把 client 和 server 的配置混合在一起再微调就行

  1. spring 配置调整

配置只给出了特别要修改的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8000

spring:
boot:
admin:
# 改变 SpringBootAdminServer 的注册地址,防止和业务系统的功能冲突
# 修改后的地址为 http://localhost:8000/admin
# SpringBootAdminClient 配置的注册地址也要改为 http://localhost:8000/admin
context-path: admin
# SpringBootAdmin 监控的原理是先启动一个 SpringBootAdminServer 暴露地址 http://127.0.0.1:8000/admin
# 然后 由 SpringBootAdminClient 向 SpringBootAdminServer 登录并注册服务
client:
# 连接SpringBootAdminServer的地址
# 但是注册成功后,展示监控内容时,SpringBootAdminServer 会反向请求本服务的 /actuator 接口
# 所以 /actuator 的接口应该是免登录的,否则注册成功后 SpringBootAdminServer 展示的监控内容为空
url: http://127.0.0.1:8000/admin
  1. Java 代码调整

如果业务系统使用的认证框架不是 spring-boot-security,则需要另作修改,这里也无法给出配置代码