一、 Spring Boot Admin介绍
- Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含:应用状态、内存、线程、堆栈等等,比较全面的监控了Spring Boot应用的整个生命周期。
但是Actuator的监控也有一些问题:第一,所有的监控都需要调用固定的接口来查看,如果全面查看应用状态需要调用很多接口;第二,如果Spring Boot应用集群非常大,每个应用都需要调用不同的接口来查看监控信息,操作非常繁琐低效。为了解决上述问题,诞生了另外一个开源应用:Spring Boot Admin。 - 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端
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>
配置文件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: "*"
启动类
添加注解@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端
通过服务发现的方式配置客户端。
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>
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监控暴露所有接口
启动类
@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会自动从注册中心抓取这些应用进行监控,并且不需要在客户端配置服务端的凭证信息。
Admin Server端的pom.xml中增加安全控制的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在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 开放的端点。在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支持邮件告警功能。实现步骤:
pom.xml中添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
修改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客户端和服务端,当关闭客户端服务时18766198932@163.com邮箱中会接收到下图中的邮件: