微服务监控之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 | <dependency> |
开启Server
在 Spring Boot 入口类上添加 @EnableAdminServer 注解来开启 Spring Boot Admin Server。
1 |
|
注册到微服务注册中心
添加注册中心客户端依赖,配置注册到注册中心URL。见 客户端 > 服务发现注册客户端 小节内容。
服务发现静态配置
Spring Cloud 提供了一个 SimpleDiscoveryClient,允许通过静态配置指定客户端应用。
pom.xml
1 | <dependency> |
application.yml
1 | spring: |
客户端
要注册到服务端的应用需要添加 Spring Boot Admin Client ,为了确保端点的安全,还需要添加 spring-boot-starter-security 依赖。
添加依赖
pom.xml
1 | <dependency> |
静态注册客户端
1 | # 设置通过 HTTP 暴露的端点 |
注意:如果 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 | <dependency> |
客户端和服务端都添加注册到 Eureka Server 配置,示例如下:
application.properties
1 | # eureka server 开启了安全认证,url 增加了身份认证信息 |
服务注册表中的信息同上 ServiceInstanceConverter 转换,Spring Boot Admin 附带一个默认和 Eureka 转换器实现,自动配置(AutoConfiguration)会选择一个正确的来使用。或提供自己的 ServiceInstanceConverter。
使用 Eureka 时,可通过设置 eureka.instance.healthCheckUrl 设置健康检测的端点。
查看客户端日志
客户端应用需输出日志到文件,使用 logging.file 属性配置,更多配置可参考台 logging 为前缀的属性,示例如下:
1 | ${spring.application.name}.log = |
配置后,在管理 Web 页面的 Logging 导航栏可以看到输出到日志文件的内容。如果日志使用 logback 或 log4j2,则输出的日志路径必须与 logging.file 一致。
标记客户端实例
默认情况下,不会为客户端实例添加任何标记,由客户端通过向元数据信息或端点添加信息来指定所需的标记。可为实例自定义标记。
application.properties
1 | #using the metadata |
安全认证
服务端开启安全认证
服务端添加 Spring Security 依赖
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>服务端创建 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 配置
**/
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
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
}
}服务端配置安全认证的账号和密码
1
2user =
123456 =账号密码登录
执行了上面安全认证的设置后,访问服务端的 Web 会先进入登录页面,需要输入用户名和密码才能成功登录。
客户端注册到服务端,需添加认证信息
Spring Boot Admin Server 开启了安全认证后,在 Admin Client 应用的属性文件需要加上用户的认证信息。
1
2user =
123456 =
客户端开启安全认证
客户也可以通过添加 spring-boot-starter-security 依赖来开启安全认证保护客户端暴露的端点。
客户端同样添加 Spring Security 依赖
客户端配置安全认证的账号和密码
1
2admin =
123456 =配置客户端元数据,在注册到 Admin Server 时将客户端的安全认证信息通过元数据传递给服务端
服务端会从元数据中取出认证信息用于向客户端端点发送请求
1
2${spring.security.user.name} =
${spring.security.user.password} =配置 Eureka Client 元数据,在注册到 Eureka Server 时将客户端的安全认证信息通过元数据传递给注册中心
1
2${spring.security.user.name} =
${spring.security.user.password} =配置忽略端点路径的跨域请求
有些通过 HTTP 暴露的端点只支持 POST 请求,当使用 Spring Security 时,需要忽略对端点的 CSRF(跨域请求伪造)
1
2
3
4
5
6
7
8
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
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 支持集群复制。 当存在 HazelcastConfig 或 HazelcastInstance-Bean 时,它会自动启用。
还可以将 Hazelcast 实例配置为持久化,以使状态保持重新启动状态。 另请参阅 Spring Boot support for Hazelcast。
添加 Hazelcast 依赖
pom.xml
1
2
3
4<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
</dependency>实例化 HazelcastConfig
1
2
3
4
5
6
7
8
9
10
11
12
public class HazelcastConfig {
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 的支持。
微服务监控之Spring Boot Admin Web管理
http://blog.gxitsky.com/2019/06/03/ArchitectureDesign-Microservice-monitor-spring-boot-admin/