微服务监控之Spring Boot Admin Web管理

在 Spring Cloud 微服务架构中,使用 Spring Boot Admin 对微服务进行监控和管理。

关于 Spring Boot Admin 的基本应用,可参考 Spring Boot 2实践系列(十六):Spring Boot Admin - Actuator 监控管理 Web 框架 ,Spring Boot Actuator 可参考 Spring Boot 2实践系列(六):应用监控模块 Actuator 详解和集成Spring Boot Admin 2.14 官方文档

服务端

创建一个 Spring Boot Web 应用,此示例台 Spring Boot 2.1.5.RELEASE 和 Spring Cloud Greenwich.SR1 版本为例。

添加依赖

spring-boot-starter-web 依赖包含了 spring-boot-admin-server、spring-boot-admin-server-ui、spring-boot-admin-server-cloud 依赖

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

开启Server

在 Spring Boot 入口类上添加 @EnableAdminServer 注解来开启 Spring Boot Admin Server。

1
2
3
4
5
6
7
8
@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class SpringBootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}
}

注册到微服务注册中心

添加注册中心客户端依赖,配置注册到注册中心URL。见 客户端 > 服务发现注册客户端 小节内容。

服务发现静态配置

Spring Cloud 提供了一个 SimpleDiscoveryClient,允许通过静态配置指定客户端应用。

pom.xml

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
cloud:
discovery:
client:
simple:
instances:
test:
- uri: http://instance1.intern:8080
metadata:
management.context-path: /actuator
- uri: http://instance2.intern:8080
metadata:
management.context-path: /actuator

客户端

要注册到服务端的应用需要添加 Spring Boot Admin Client ,为了确保端点的安全,还需要添加 spring-boot-starter-security 依赖。

添加依赖

pom.xml

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.1.4</version>
</dependency>
<!-- 若要增加安全认证,取消下面注释
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>-->

静态注册客户端

1
2
3
4
5
6
7
8
# 设置通过 HTTP 暴露的端点
management.endpoints.web.exposure.include=*
# 开启显示详细信息
management.endpoint.health.show-details=always
# Spring Boot Admin Server URL
spring.boot.admin.client.url=http://localhost:8080
# IP 地址优先
spring.boot.admin.client.instance.prefer-ip=true

注意:如果 Spring Boot Admin Server 配置了 spring.boot.admin.context-path ,则在客户端配置的服务URL需要加上此值。

服务发现注册客户端

Spring Boot Admin Server 默认开启了服务发现来获取服务实例,在微服务集群架构,自动监控获取到的服务实例。

Sprign Boot 客户端应用和服务端应用都添加 Spring Cloud 依赖,添加 Eureka Client 依赖。更多关于 Eureka 配置可参考 Spring Cloud系列(二):服务发现之Eureka注册中心(1)-服务、客户端、安全认证。服务发现还可使用 Spring Cloud 自身提供的 DiscoveryClient 实现来完成。

pom.xml

1
2
3
4
5
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.4</version>
</dependency>

客户端和服务端都添加注册到 Eureka Server 配置,示例如下:

application.properties

1
2
3
4
5
6
7
# eureka server 开启了安全认证,url 增加了身份认证信息
eureka.client.service-url.defaultZone=http://admin:123456@eureka.master.com:8761/eureka,http://admin:123456@eureka.slave.com:8762/eureka
eureka.instance.prefer-ip-address=true
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.health-check-url-path=/actuator/health
eureka.instance.metadata-map.startup=${random.int}
eureka.client.registry-fetch-interval-seconds=5

服务注册表中的信息同上 ServiceInstanceConverter 转换,Spring Boot Admin 附带一个默认和 Eureka 转换器实现,自动配置(AutoConfiguration)会选择一个正确的来使用。或提供自己的 ServiceInstanceConverter。

使用 Eureka 时,可通过设置 eureka.instance.healthCheckUrl 设置健康检测的端点。

查看客户端日志

客户端应用需输出日志到文件,使用 logging.file 属性配置,更多配置可参考台 logging 为前缀的属性,示例如下:

1
logging.file=${spring.application.name}.log

配置后,在管理 Web 页面的 Logging 导航栏可以看到输出到日志文件的内容。如果日志使用 logback 或 log4j2,则输出的日志路径必须与 logging.file 一致。

标记客户端实例

默认情况下,不会为客户端实例添加任何标记,由客户端通过向元数据信息或端点添加信息来指定所需的标记。可为实例自定义标记。

application.properties

1
2
3
4
5
#using the metadata
spring.boot.admin.client.instance.metadata.tags.environment=test

#using the info endpoint
info.tags.environment=test

安全认证

服务端开启安全认证

  1. 服务端添加 Spring Security 依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. 服务端创建 Security 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
    41
    42
    43
    44
    /**
    * @name: SecuritySecureConfig
    * @desc: 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 {
    // @formatter:off
    SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successHandler.setTargetUrlParameter("redirectTo");
    successHandler.setDefaultTargetUrl(adminContextPath + "/");

    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()
    //启用HTTP-Basic支持。Spring Boot Admin Client注册必需的。
    .httpBasic().and()
    .csrf()
    //使用Cookie启用CSRF保护
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
    .ignoringAntMatchers(
    //禁用CRSF-Protection Spring Boot Admin Client用于注册的端点。
    adminContextPath + "/instances",
    //禁用执行器端点的CRSF保护。
    adminContextPath + "/actuator/**"
    );
    // @formatter:on
    }
    }
  3. 服务端配置安全认证的账号和密码

    1
    2
    spring.security.user.name=user
    spring.security.user.password=123456
  4. 账号密码登录

    执行了上面安全认证的设置后,访问服务端的 Web 会先进入登录页面,需要输入用户名和密码才能成功登录。

  5. 客户端注册到服务端,需添加认证信息

    Spring Boot Admin Server 开启了安全认证后,在 Admin Client 应用的属性文件需要加上用户的认证信息。

    1
    2
    spring.boot.admin.client.username=user
    spring.boot.admin.client.password=123456

客户端开启安全认证

客户也可以通过添加 spring-boot-starter-security 依赖来开启安全认证保护客户端暴露的端点。

  1. 客户端同样添加 Spring Security 依赖

  2. 客户端配置安全认证的账号和密码

    1
    2
    spring.security.user.name=admin
    spring.security.user.password=123456
  3. 配置客户端元数据,在注册到 Admin Server 时将客户端的安全认证信息通过元数据传递给服务端

    服务端会从元数据中取出认证信息用于向客户端端点发送请求

    1
    2
    spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
    spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}
  4. 配置 Eureka Client 元数据,在注册到 Eureka Server 时将客户端的安全认证信息通过元数据传递给注册中心

    1
    2
    eureka.instance.metadata-map.user.name=${spring.security.user.name}
    eureka.instance.metadata-map.user.password=${spring.security.user.password}
  5. 配置忽略端点路径的跨域请求

    有些通过 HTTP 暴露的端点只支持 POST 请求,当使用 Spring Security 时,需要忽略对端点的 CSRF(跨域请求伪造)

    1
    2
    3
    4
    5
    6
    7
    8
    @Configuration
    public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.csrf().ignoringAntMatchers("/actuator/**");
    }
    }

安全认证注意事项

通过元数据提交认证凭据,应为 Spring Boot Admin 或 服务注册表URL 配置 HTTPS 。

在使用 Spring Cloud Discover 时,需要知道的是,任何可以查询服务注册表的用户都可以获取凭据。

安全认证还可以使用更复杂的 OAuth2 方案,可参考 joshiste/spring-boot-admin-samples 示例。

如果通过元数据传递配置信息,元数据优先于服务器配置。

服务端集群

Spring Boot Admin Server 可通过 Hazelcast 支持集群复制。 当存在 HazelcastConfigHazelcastInstance-Bean 时,它会自动启用。

还可以将 Hazelcast 实例配置为持久化,以使状态保持重新启动状态。 另请参阅 Spring Boot support for Hazelcast

  1. 添加 Hazelcast 依赖

    pom.xml

    1
    2
    3
    4
    <dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
    </dependency>
  2. 实例化 HazelcastConfig

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Configuration
    public class HazelcastConfig {

    @Bean
    public Config hazelcastConfig() {
    MapConfig mapConfig = new MapConfig("spring-boot-admin-event-store").setInMemoryFormat(InMemoryFormat.OBJECT)
    .setBackupCount(1)
    .setEvictionPolicy(EvictionPolicy.NONE)
    .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100));
    return new Config().setProperty("hazelcast.jmx", "true").addMapConfig(mapConfig);
    }
    }

通知信息

提醒通知过滤通知邮件通知页面即时通知 等等。

其它参考

GitHub > Spring Boot Admin ,提供了 consul、eureka、hazelcast、reactive、servlet、zookeeper 示例。

注意: Spring Boot Admin 2.0 已不包含对 Hystrix 和 Turbine 的支持。

作者

光星

发布于

2019-06-03

更新于

2022-07-12

许可协议

评论