Spring Boot Admin

Spring Boot Admin 通过 Actuator 获得应用运行过程中的各项指标。以图形化界面展示出来。监控以下内容:

  • 应用概览信息
  • 度量指标信息
  • 环境变量信息
  • 所有创建的Bean信息
  • 查看应用中所有配置信息
  • 应用运行日志信息
  • 查看JVM信息
  • 查看可以访问的Web端点
  • 查看HTTP跟踪信息

一 admin-server

新建admin项目,按照以下步骤添加依赖和配置。

1.添加依赖

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.2.4</version> 
</dependency>

2.打开开关

@EnableAdminServer

3.配置

server:
  port: 9301
spring:
  application:
    name: admin-server

访问http://localhost:9301查看效果

二 admin-client

选择(或新建)项目,作为admin client接入admin服务。

1. 引依赖

<!--admin客户端-->
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.2.4</version> <!--2.6.2不兼容 -->
</dependency>
<!-- 开启监控接口-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. 配置

spring.boot.admin.client.url 告诉admin server地址 management 开启查询端口

spring:
  boot:
    admin:
      client:
        url: http://localhost:9301 #配置admin-server地址
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
logging:
  file: # 开启admin的日志监控
    name: admin-client.log

启动后,再次查看admin服务,可以观察到接入服务的相关信息。

三 演示

  • 1 访问监控地址 http://localhost:9301
  • 2 点击wallboard按钮,选择要监控的实例查看详情
  • 3 度量指标信息 JVM,Tomcat及进程信息
  • 4 环境变量信息
  • 5 所有的Bean信息
  • 6 查看应用中的所有配置信息
  • 7 查看日志信息

四 结合注册中心

上面的配置中我们指定了admin服务的地址,这样admin服务地址变更时就比较麻烦,所以我们可以使用eureka来实现动态查找admin服务。

Admin Server的修改

首先需要引入eureka client依赖和添加相应配置。

添加eureka-client

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

打开EurekaClient

@EnableEurekaClient

添加注册中心配置


eureka:
  client:
    fetch-registry: true #指定是否要从注册中心获取服务(注册中心不需要开启)
    register-with-eureka: true #指定是否要注册到注册中心(注册中心不需要开启)
    # 需要注意,如果eureka服务开始了security保护,这里需要有用户名和密码
    # http://username:password@localhost:8761/eureka/
    #集群的配置
    #defaultZone: http://node1:8761/eureka,http://node2:8762/eureka,http://node3:8763/eureka
    #单机的配置
    service-url:
      defaultZone: http://localhost:8761/eureka/

Admin Client

management: # Admin 通过 actuator提供的端口进行监控系统,因此需要打开各端口
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
logging:
  file: # 开启admin的日志监控
    name: admin-client.log

五 添加登陆认证

引入安全依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置用户名和密码

spring:
  security:
    user:
      name: xxx
      password: 123456
    boot:
      admin:
        discovery:
          ignored-services: ${spring.application.name} # 忽略自己的信息

增加security后,对于没有使用eureka注册中心,直接去通知admin的就 会受到影响,需要对security进行配置,以允许admin-client对admin的请求。

Spring Security

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
  private final String adminContextPath;
  public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
    this.adminContextPath = adminServerProperties.getContextPath();
  }
 @Override
 protected void configure(HttpSecurity http) throws Exception {
  SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
  successHandler.setTargetUrlParameter("redirectTo");
  successHandler.setDefaultTargetUrl(adminContextPath + "/");
  http.authorizeRequests()
   //1.配置所有静态资源和登录页可以公开访问
  .antMatchers(adminContextPath + "/assets/**").permitAll()
  .antMatchers(adminContextPath + "/login").permitAll()
  .antMatchers(adminContextPath+"/instances").permitAll()
  .antMatchers(adminContextPath+"/actuator/**").permitAll()
  .anyRequest().authenticated()
  .and()
   //2.配置登录和登出路径
  .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
  .logout().logoutUrl(adminContextPath + "/logout").and()
  //3.开启 http basic 支持,admin-client 注册时需要使用
  .httpBasic().and()
  .csrf()
  //4.开启基于 cookie 的 csrf 保护
  .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
  //5.忽略这些路径的 csrf 保护以便 admin-client 注册
  .ignoringAntMatchers(adminContextPath + "/instances",adminContextPath + "/actuator/**");
 }
}