在 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
<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。
@Configuration
@EnableAutoConfiguration
@EnableAdminServer
public class SpringBootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}
}
注册到微服务注册中心
添加注册中心客户端依赖,配置注册到注册中心URL。见 客户端 > 服务发现注册客户端 小节内容。
服务发现静态配置
Spring Cloud 提供了一个 SimpleDiscoveryClient,允许通过静态配置指定客户端应用。
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
application.yml
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
<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>-->
静态注册客户端
# 设置通过 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
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.4</version>
</dependency>
客户端和服务端都添加注册到 Eureka Server 配置,示例如下:
application.properties
# 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 为前缀的属性,示例如下:
logging.file=${spring.application.name}.log
配置后,在管理 Web 页面的 Logging 导航栏可以看到输出到日志文件的内容。如果日志使用 logback 或 log4j2,则输出的日志路径必须与 logging.file 一致。
标记客户端实例
默认情况下,不会为客户端实例添加任何标记,由客户端通过向元数据信息或端点添加信息来指定所需的标记。可为实例自定义标记。
application.properties
#using the metadata
spring.boot.admin.client.instance.metadata.tags.environment=test
#using the info endpoint
info.tags.environment=test
安全认证
服务端开启安全认证
服务端添加 Spring Security 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
服务端创建 Security Java 配置
/** * @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 } }
服务端配置安全认证的账号和密码
spring.security.user.name=user spring.security.user.password=123456
账号密码登录
执行了上面安全认证的设置后,访问服务端的 Web 会先进入登录页面,需要输入用户名和密码才能成功登录。
客户端注册到服务端,需添加认证信息
Spring Boot Admin Server 开启了安全认证后,在 Admin Client 应用的属性文件需要加上用户的认证信息。
spring.boot.admin.client.username=user spring.boot.admin.client.password=123456
客户端开启安全认证
客户也可以通过添加 spring-boot-starter-security 依赖来开启安全认证保护客户端暴露的端点。
客户端同样添加 Spring Security 依赖
客户端配置安全认证的账号和密码
spring.security.user.name=admin spring.security.user.password=123456
配置客户端元数据,在注册到 Admin Server 时将客户端的安全认证信息通过元数据传递给服务端
服务端会从元数据中取出认证信息用于向客户端端点发送请求
spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}
配置 Eureka Client 元数据,在注册到 Eureka Server 时将客户端的安全认证信息通过元数据传递给注册中心
eureka.instance.metadata-map.user.name=${spring.security.user.name} eureka.instance.metadata-map.user.password=${spring.security.user.password}
配置忽略端点路径的跨域请求
有些通过 HTTP 暴露的端点只支持 POST 请求,当使用 Spring Security 时,需要忽略对端点的 CSRF(跨域请求伪造)
@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 支持集群复制。 当存在 HazelcastConfig 或 HazelcastInstance-Bean 时,它会自动启用。
还可以将 Hazelcast 实例配置为持久化,以使状态保持重新启动状态。 另请参阅 Spring Boot support for Hazelcast。
添加 Hazelcast 依赖
pom.xml
<dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> </dependency>
实例化 HazelcastConfig
@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 的支持。
注意:本文归作者所有,未经作者允许,不得转载