Spring Boot Admin【Finchley 版】

一、 Spring Boot Admin介绍

  1. Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含:应用状态、内存、线程、堆栈等等,比较全面的监控了Spring Boot应用的整个生命周期。
    但是Actuator的监控也有一些问题:第一,所有的监控都需要调用固定的接口来查看,如果全面查看应用状态需要调用很多接口;第二,如果Spring Boot应用集群非常大,每个应用都需要调用不同的接口来查看监控信息,操作非常繁琐低效。为了解决上述问题,诞生了另外一个开源应用:Spring Boot Admin。
  2. Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源项目,分为admin-server和admin-client两个组件,admin-server将采集到的相关应用的actuator端点数据显示在spring-boot-admin-ui上。另外,通过 spring-boot-admin 可以动态切换日志级别、监控应用的各项指标等。
    Spring Boot Admin可以同时监控多个Spring Boot应用,通过eureka、consul等注册中心的方式实现多服务的监控和管理,每个Spring Boot应用都是一个admin-client。

二、 Spring Boot Admin监控Spring Boot应用

搭建Admin Server端

  1. pom.xml中添加以下依赖

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.0.1</version>
        </dependency>
        <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>
        <dependency>
            <groupId>org.jolokia</groupId>
            <artifactId>jolokia-core</artifactId>
        </dependency>
    
        <!--访问/actuator/info接口-->
         <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>build-info</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
  2. 配置文件application.yml

    (1) Spring Boot2.x中,Actuator默认只开放了/actuator/info、/actuator/health两个端点,如果要访问其他端口需要自己通过配置management.endpoints.web.exposure.include属性来实现,下面我们暴露了所有endpoints,如果应用到生产环境,考虑到安全问题,对于Actuator的Endpoints要根据需要进行配置。
    (2) Spring Boot Admin 注册到Eureka Server 中后,可以管理所有注册到 Eureka Server 的应用,包括 Spring Boot Admin自己,Spring Boot Admin 会自动从注册中心抓取这些应用的相关信息并进行监控。

    server:
      port: 5000
    
    eureka:
      instance:
        leaseRenewalIntervalInSeconds: 10
        health-check-url-path: /actuator/health   #健康检查的地址
        instance-id: microservicecloud-adminserver #服务中心中该服务的注册名
        prefer-ip-address: true #是否显示IP
      client:
        registryFetchIntervalSeconds: 5
        serviceUrl:
          defaultZone: http://localhost:7001/eureka  #注册中心地址
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"
  3. 启动类
    添加注解@EnableAdminServer

    @Configuration
    @EnableAutoConfiguration
    @EnableAdminServer
    public class AdminserverApplication5000 {
    
        public static void main(String[] args) {
            SpringApplication.run(AdminserverApplication5000.class,args);
        }
    }

    上述配置完成之后,启动Eureka Server和Admin Server,访问http://localhost:5000,可以看到如下界面
    这里写图片描述

Admin Client端

通过服务发现的方式配置客户端。

  1. pom.xml中添加以下依赖

    <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>
  2. application.yml配置文件

    server:
      port: 5001
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
      instance:
        instance-id: microservicecloud-adminclient 
        prefer-ip-address: true
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'  // SpringBootActuator监控暴露所有接口
  3. 启动类

    @SpringBootApplication
    @EnableEurekaClient
    public class AdminclientApplication5001 {
    
        public static void main(String[] args) {
            SpringApplication.run(AdminclientApplication5001.class, args);
        }
    }

    配置完成后,启动Eureka Server和Admin Server、Admin Client(Admin服务端和客户端的启动无先后顺序),再次访问http://localhost:5000,界面如下

    选中其中一个服务,进入首页,可以查看该服务的具体监控信息。
    这里写图片描述

三、为Admin Server添加安全访问控制

Admin Server服务是Spring Boot的安全端点管理程序,自身的安全也是比不可少的,所以我们需要为Admin Server服务添加安全访问控制。官方已经提供了对应的支持。

如果Admin的客户端和服务端都注册到同一个注册中心,则不需要在客户端指定服务端的地址,Admin Server会自动从注册中心抓取这些应用进行监控,并且不需要在客户端配置服务端的凭证信息。

  1. Admin Server端的pom.xml中增加安全控制的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. 在application.yml中设置用户名和密码

    eureka:
      instance:
        leaseRenewalIntervalInSeconds: 10
        health-check-url-path: /actuator/health
        instance-id: adminserver
        prefer-ip-address: true
        metadata-map:
          user.name: user  #用户名和密码必须和security下配置的用户名和密码相同,否则启动后服务端是DOWN的状态
          user.password: 123456
      client:
        registryFetchIntervalSeconds: 5
        serviceUrl:
          defaultZone: http://eureka7001.com:7001/eureka
    spring:
        security:
            user:
            name: user
            password: 123456

    Eureka 中的 metadataMap 专门用来存放一些自定义的数据,当注册中心或者其他服务需要此服务的某些配置时可以在 metadataMap 里取。实际上,每个 instance 都有各自的 metadataMap,map中存放着需要用到的属性。
    例如,上面配置中的 eureka.instance.metadata-map.user.name,当这个服务成功注册到 Eureka 上,Spring Boot Admin 就会取拿到这个 instance,进而拿到 metadataMap 里的属性,然后放入请求头,向此服务发送请求,访问此服务的 Actuator 开放的端点。

  3. 在Admin Server中配置security的拦截配置

        @Configuration
        public static class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
            private final String adminContextPath;
    
            public SecuritySecureConfig(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
            }
        }   

    重启程序,再次访问http://localhost:5000,提示需要输入用户名和密码。
    这里写图片描述

四、邮件告警

Spring Boot Admin将微服务中所有应用信息在后台进行了展示,非常方便我们对微服务整体的监控和治理。当某个服务的状态发生改变时,为保证运维人员能及时知道,Spring Boot Admin支持邮件告警功能。实现步骤:

  1. pom.xml中添加依赖

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-mail</artifactId>
      </dependency>
  2. 修改application.yml

    spring:
      boot:
        admin:
          notify:
            mail:
              to: XXXXX@163.com  # 邮件接收方
              from: XXXXX@qq.com  # 邮件发送方
      mail:
        host: smtp.qq.com   # qq邮箱服务器主机host,需要在QQ邮箱设置中开启smtp协议 163邮箱为smtp.163.com
        username: XXXXX@qq.com  # qq邮箱账号
        password: XXXXXXXXXX  # 第三方登录的授权码
        properties:
          mail.debug: false
          mail.smtp.auth: true
          mail.smtp.starttls.enable: true
          mail.smtp.ssl.enable: true

    上述配置完成之后重新启动Spring Boot Admin客户端和服务端,当关闭客户端服务时[email protected]邮箱中会接收到下图中的邮件:
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013739073/article/details/80970302