为什么需要Spring Boot Admin

  • 在Spring Boot Admin之前,我们知道可以使用 Spring Boot Actuator 对项目的健康状况进行监控,但都只是以一些文字表述性的形式展示,可以说信息并不美观也并不便捷,而Spring Boot Admin可以说是Spring Boot Actuator的可视化版本,可以结合Spring Boot Actuator向用户展示更多可视化监控信息(如系统压力、QPS、CPU、内存、日活等)

整合Spring Boot Admin

  • Spring Boot Admin将系统分成两种角色:

    • Spring Boot Admin Server: 监控服务端,用于展示监控数据
    • Spring Boot Admin Client: 被监控的客户端
  • 被监控的客户端通过向监控服务端注册(HTTP),即可让服务端展示相关监控信息

    • 但是,如果系统内集成了SC(注册中心),则只需要向注册中心注册即可。
    • 由于项目内整合了Eureka注册中心,我们选择第二种模式。

构建监控服务端

建工程

  • 引依赖。建一个工程:system-admin-server,引入Spring Boot Admin Server依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <description>系统可视化监控服务</description>
    <dependencies>
    <!--admin服务-->
    <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <!-- <version>2.3.1</version>-->
    </dependency>
    <!--eureka 客户端-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--作为网络服务-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    </dependencies>

加配置

  • 在system-admin-server的项目配置文件bootstrap.yml中添加如下配置:

    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
    server:
    port: 5000 #服务端口
    spring:
    profiles:
    active: 700 #当前生效环境
    application:
    name: springcloud-admin-server #指定应用的唯一标识/服务名

    # 监控注册配置
    eureka:
    client:
    registryFetchIntervalSeconds: 5 #表示eureka client间隔多久去拉取服务注册信息,默认为30秒
    service-url:
    defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ #服务注册中心地址
    instance:
    leaseRenewalIntervalInSeconds: 10 #表示eureka client发送心跳给server端的频率
    health-check-url-path: /actuator/health #健康检查页面的URL,相对路径,默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置

    #暴露所有监控端点
    management:
    endpoints:
    web:
    exposure:
    include: "*"
    endpoint:
    health:
    show-details: ALWAYS #总是展示详情信息

开启Admin监控服务

  • 使用@EnableAdminServer注解开启Admin监控服务

    1
    2
    3
    4
    5
    6
    7
    8
    @EnableEurekaClient
    @EnableAdminServer //开启Admin监控服务
    @SpringBootApplication
    public class SpringCloudAdminApplication {
    public static void main(String[] args) {
    SpringApplication.run(SpringCloudAdminApplication.class, args);
    }
    }

构建监控客户端

引依赖

  • 监控客户端必须引入Spring Boot Actuator 依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!--eureka 客户端-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!--实时健康监控-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

加配置

  • 在springcloud-client工程的bootstrap.yml文件配置暴露监控端点,以便被监控服务端监控发现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #暴露所有监控端点
    management:
    endpoints:
    web:
    exposure:
    include: "*"
    endpoint:
    health:
    show-details: ALWAYS #总是展示详情信息

启动类

  • 由于使用SC注册中心模式,此处只需要在服务启动类添加注册发现注解@EnableEurekaClient即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @SpringBootApplication
    @EnableEurekaClient
    public class SpringCloudClientApplication {

    public static void main(String[] args){
    SpringApplication.run(SpringCloudClientApplication.class, args);
    }

    }

查看效果

  • 启动服务端和客户端服务

    ![](9-整合Spring Boot Admin/de28445cd26a1b7d08dbada3acb4fec1.png)

  • 访问上面配置的http://localhost:5000查看效果

    ![](9-整合Spring Boot Admin/630c98119b87a55f128e218c4b8294a1.png)

    ![](9-整合Spring Boot Admin/49a0d28046f4a2e5dd88a932f18c95a8.png)

Admin 整合Spring Security

  • 监控端口终归不能裸奔,毕竟不安全,所以鉴权还是需要的

引依赖

  • system-admin-server服务模块引入Spring Security依赖

    1
    2
    3
    4
    5
    <!--集成security-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

加配置

  • 在system-admin-server的服务配置文件bootstrap.yml中添加如下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    eureka:
    instance:
    metadata-map: #携带登录用户及密码
    user.name: ${spring.security.user.name}
    user.password: ${spring.security.user.password}
    ---
    spring:
    security:
    user:
    name: "admin" #登录用户名
    password: "admin" #登录密码
  • 新建Security配置类,配置登录页信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    @Configuration
    public class AdminSecurityConfig extends WebSecurityConfigurerAdapter {
    private final String adminContextPath;
    public AdminSecurityConfig(AdminServerProperties adminServerProperties) {
    this.adminContextPath = adminServerProperties.getContextPath();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successHandler.setTargetUrlParameter( "redirectTo" );
    http.authorizeRequests()
    .antMatchers( adminContextPath + "/assets/**" ).permitAll()
    .antMatchers( adminContextPath + "/login" ).permitAll()
    .anyRequest().authenticated()
    .and()
    .formLogin().loginPage( adminContextPath + "/login" ).successHandler( successHandler ).and()
    .logout().logoutUrl( adminContextPath + "/logout" ).and()
    .httpBasic().and()
    .csrf().disable();
    // @formatter:on
    }
    }
  • 启动服务,访问5000端口,重定向到登录页,使用上述配置的用户名及密码(admin/admin)进行登录

    ![](9-整合Spring Boot Admin/44a03d6cdc730ff9e1710af03a5d0782.png)