Spring Boot Actuator 提供了对单个 Spring Boot 应用的监控,信息包含应用状态、内存、线程、堆栈等,比较全面的监控了 Spring Boot 应用的整个生命周期。前端
可是这样监控也有一些问题:第一,全部的监控都须要调用固定的接口来查看,若是全面查看应用状态须要调用不少接口,而且接口返回的 JSON 信息不方便运营人员理解;第二,若是 Spring Boot 应用集群很是大,每一个应用都须要调用不一样的接口来查看监控信息,操做很是繁琐低效。在这样的背景下,就诞生了另一个开源软件:Spring Boot Admin。web
Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源软件,每一个应用都认为是一个客户端,经过 HTTP 或者使用 Eureka 注册到 admin server 中进行展现,Spring Boot Admin UI 部分使用 Vue.js 将数据展现在前端。spring
Spring Boot Admin 是一个针对 Spring Boot 的 Actuator 接口进行 UI 美化封装的监控工具,它能够在列表中浏览全部被监控 spring-boot 项目的基本信息、详细的 Health 信息、内存信息、JVM 信息、垃圾回收信息、各类配置信息(好比数据源、缓存列表和命中率)等,还能够直接修改 logger 的 level。缓存
值得注意的是 Spring Boot Admin 并非 Spring Boot 官方出品的开源软件,可是其软件质量和使用普遍度都很是的高,而且 Spring Boot Admin 会及时随着 Spring Boot 的更新而更新,当 Spring Boot 推出 2.X 版本时 Spring Boot Admin 也及时进行了更新。安全
Spring Boot Admin 2.x 不只是跟着支持了 Spring Boot 2.x,还在 1.x 的基础上进行了大量的更新和优化:app
Spring Boot Admin 分为服务端和客户端,服务端其实就是一个监控后台用来汇总展现全部的监控信息,客户端就是咱们的应用,使用时须要先启动服务端,在启动客户端的时候打开 Actuator 的接口,并指向服务端的地址,这样服务端会定时读取相关信息以达到监控的目的。dom
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.x 下只须要添加此一个包便可,其余组件会自动依赖添加。ide
(2)配置文件spring-boot
//服务端设置端口为:8000。 server.port=8000
@EnableAdminServer @SpringBootApplication public class AdminServerApplication { public static void main(String[] args) { SpringApplication.run(AdminServerApplication.class, args); } }
完成上面三步以后,启动服务端,访问网址 http://localhost:8000
能够看到如下界面:微服务
由于刚启动没有应用,所以显示:No applications registered.,同时根据上图也能够看出 applications 页面会展现项目的应用数、实例数和状态三个信息。
接下来咱们构建一个客户端,并注册到服务端。
<dependencies> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
添加 spring-boot-starter-web 是为了使应用处于启动状态,spring-boot-admin-starter-client 会自动添加 Actuator 相关依赖。
(2)配置文件
server.port=8001 spring.application.name=Admin Client spring.boot.admin.client.url=http://localhost:8000 management.endpoints.web.exposure.include=*
@SpringBootApplication public class AdminClientApplication { public static void main(String[] args) { SpringApplication.run(AdminClientApplication.class, args); } }
配置完成以后,启动 Client 端,Admin 服务端会自动检查到客户端的变化,并展现其应用:
页面会展现被监控的服务列表,点击项目名称会进入此应用的详细监控信息:
经过上图能够看出,Spring Boot Admin 以图形化的形式展现了应用的各项信息,这些信息大多都来自于 Spring Boot Actuator 提供的接口。利用图形化的形式很容易看到应用的各项参数变化,甚至有些页面还能够进行一些操做,好比改变打印日志的级别等。
点击 journal 页面能够看到应用状态变化的历史过程:
点击第一个菜单 wallboard 能够以更形象的方式查看应用数量启动的时间等。
若是咱们使用的是单个 Spring Boot 应用,就须要在每个被监控的应用中配置 Admin Server 的地址信息;若是应用都注册在 Eureka 中就不须要再对每一个应用进行配置,Spring Boot Admin 会自动从注册中心抓取应用的相关信息。
若是使用了 Spring Cloud 的服务发现功能,就不须要再单独添加 Admin Client 客户端,仅仅须要 Spring Boot Server,其余内容会自动进行配置。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
@Configuration @EnableAutoConfiguration @EnableDiscoveryClient @EnableAdminServer public class SpringBootAdminApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminApplication.class, args); } @Configuration public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().permitAll() .and().csrf().disable(); } } }
使用类 SecurityPermitAllConfig 关闭了安全验证。
(3)在客户端中配置服务发现的地址
eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health metadata-map: startup: ${random.int} #needed to trigger info and endpoint update after restart client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/ management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS
Spring Boot Admin 后台有不少的敏感信息和操做,若是公司不作权限控制可能会影响到公司系统的安全性。Spring Boot Admin 也考虑到了这个因素,能够利用前面的 Spring Security 作安全访问控制,在 spring-boot-admin-server 上进行改造。
(1)添加 Spring Boot Security 依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
@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() .httpBasic().and() .csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringAntMatchers( adminContextPath + "/instances", adminContextPath + "/actuator/**" ); } }
spring.security.user.name=admin spring.security.user.password=admin
配置完成以后重启 Admin Server 端,访问网址 http://localhost:8000
就会发现须要一个登陆的用户名和密码了。
(3)其余方式
若是 Actuator 的端口被使用 HTTP 认证保护,那么 Spring Boot Admin Server 访问的时候须要凭证信息,这时候可使用 metadata 的方式对帐户和密码进行配置。
直接使用客户端注册的方式:
spring.boot.admin.client: url: http://localhost:8080 instance: metadata: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password}
eureka: instance: metadata-map: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password}
Spring Boot Admin 将微服务中全部应用信息在后台进行了展现,很是方便咱们对微服务总体的监控和治理。可是咱们的运营人员也不可能一天 24 小时盯着监控后台,所以若是服务有异常的时候,有对应的邮件告警就太好了,其实 Spring Boot Admin 也给出了支持。
咱们对上面的示例项目 spring-boot-admin-server 进行改造。
(1)添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
spring.mail.host=smtp.qq.com spring.mail.username=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.boot.admin.notify.mail.from=yyyy@qq.com spring.boot.admin.notify.mail.to=zzz@qq.com
在配置文件中添加邮件发送相关信息:邮件的发送者、接受者、协议、移动受权码等。
配置完成后,从新启动项目 spring-boot-admin-server,这样 Admin Server 就具有了邮件告警的功能,默认状况下 Admin Server 对 Eureka 中的服务上下线都进行了监控,当服务上下线的时候咱们就会收到以下邮件:
固然这只是最基本的邮件监控,在实际的使用过程当中,须要根据状况对邮件告警内容进行自定义,好比监控堆内存的使用状况,当到达必定比例的时候进行告警等。
Spring Boot Admin 解决了咱们对大规模 Spring Boot 应用监控的需求,Spring Boot Admin 充分利用了 Actuator 开放的相关接口,采用优秀的图形界面将这些信息进行了展现,方便咱们更加直观的查看集群中应用的状态。Spring Boot Admin 不只能够监控单个 Spring Boot 应用,也能够结合 Spring Cloud 监控注册到服务中心的全部应用状态,再结合报警系统的使用就能够随时感知到应用的状态变化。在实际工做中 Spring Boot Admin 是咱们在后期运营中频繁用到的一个组件,应该做为重点关注。