生产上对 Web
应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以通过一个轻量级的监控工具 Spring Boot Admin (SBA) 来进行监控。
Spring Boot Admin是由德国软件工程师 Johannes Edmeier 开源的用于管理和监控 Spring Boot 应用程序。已经被收纳入 Spring Initializr 截至发文时间的最新正式版本为 2.1.6 ,快照为 2.2.0-SNAPSHOT 。 C/S 架构风格 。 应用程序作为 Spring Boot Admin Client 向 Spring Boot Admin Server 注册(通过 HTTP
)或使用 Spring Cloud 注册中心(如 Eureka , Consul )发现。SERVER程序采用了 响应式Web框架 Spring Webflux 。 展示UI采用了 Vue.js ,展示Spring Boot Admin Client 通过 Spring Boot Actuator 端点上的一些监控。常见的功能或者监控如下:
显示应用度量指标详情,例如
heapdump
jvm
系统和环境属性 JMX-beans
交互 http
跟踪 auditevents
http-endpoints
Flyway
/ Liquibase
数据库迁移 接下来让我们来在 Spring Boot 项目中集成 Spring Boot Admin 。注意版本的兼容性,可通过 Spring Initializr 来验证。
Spring Boot Admin Server一般推荐独立作为一个 Spring Boot jar
应用运行。 只需要将下列依赖添加到你的 pom.xml
中:
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.2.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 生产需要保证监控的安全性--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
然后通过添加 @EnableAdminServer
到配置中来引入 Spring Boot Admin Server 配置:
@EnableAdminServer @SpringBootApplication public class SpringBootAdminApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminApplication.class, args); } }
每个要注册的应用程序都必须包括 Spring Boot Admin Client 。为了保护端点,你还应该添加安全依赖 spring-boot-starter-security
。
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.2.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
然后在客户端应用程序的 application.yml
中增加以下配置:
spring: boot: admin: client: # Spring Boot Admin Server 地址 http://localhost:8080 可自定义 url: http://localhost:8080 # 默认情况下,大多数端点都不通过http公开,我们公开了所有端点。对于生产,您应该仔细选择要公开的端点。 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: ALWAYS
分别启动 SBA
服务端和客户端 。打开服务端页面 http://localhost:8080
将进入以下监控界面:
进而也可以获取 admin-client
的具体监控指标:
如果您已经将 Spring Cloud Discovery ( eureka
、 consul
等)用于您的应用程序,则不需要 Spring Boot Admin 客户端。只需将 DiscoveryClient 添加到 Spring Boot Admin Server ,其余的事情通过自动配置完成,可通过官方示例来查看。
应用的监控指标都是极其敏感的数据。所以生产上必须增加安全访问控制以避免发生泄漏事件。你可以使用你擅长的安全框架来做访问控制。这里我们采用 Spring Security 来保护我们的 Spring Boot Admin 。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
spring: security: user: name: SBA_admin password: SBA_password roles: SBA_ADMIN
package cn.felord.admin.server.configuer; import de.codecentric.boot.admin.server.config.AdminServerProperties; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import java.util.UUID; /** * The type Security secure config. * * @author Felordcn * @since 2019 /10/19 23:33 */ @Configuration public class AdminServerSecurityConfig extends WebSecurityConfigurerAdapter { private final AdminServerProperties adminServer; /** * Instantiates a new Security secure config. * * @param adminServer the admin server */ public AdminServerSecurityConfig(AdminServerProperties adminServer) { this.adminServer = adminServer; } @Override protected void configure(HttpSecurity http) throws Exception { // @formatter:off SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); final String adminServerContextPath = this.adminServer.getContextPath(); successHandler.setDefaultTargetUrl(adminServerContextPath+"/"); http.authorizeRequests() .antMatchers(adminServerContextPath + "/assets/**").permitAll() // <1> .antMatchers(adminServerContextPath + "/login").permitAll() .anyRequest().authenticated() // <2> .and() .formLogin().loginPage(adminServerContextPath + "/login").successHandler(successHandler).and() // <3> .logout().logoutUrl(adminServerContextPath + "/logout").and() .httpBasic().and() // <4> .csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // <5> .ignoringRequestMatchers( new AntPathRequestMatcher(adminServerContextPath + "/instances", HttpMethod.POST.toString()), // <6> new AntPathRequestMatcher(adminServerContextPath + "/instances/*", HttpMethod.DELETE.toString()), // <6> new AntPathRequestMatcher(adminServerContextPath + "/actuator/**") // <7> ) .and() .rememberMe().key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600); } }
然后启动 SBA Server 服务器 http://localhost:8237
会进入登录页面,输入你配置的账密即可:
服务端端点被访问控制后,客户端注册需要权限,同时客户端的一些 Actuator 端点也必须被保护。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
spring: security: user: name: SBA_admin password: SBA_password roles: SBA_ADMIN
将我们在 Spring Boot Admin 服务端配置配置的安全账户配置到以下属性中:
boot: admin: client: # Spring Boot Admin Server 管理账户 username: SBA_admin password: SBA_password
当使用 HTTP Basic
身份验证保护执行器端点时, SBA Server 需要凭据才能访问它们。所以我们通过以下来配置以授权服务端访问 Actuator 端点:
spring: boot: admin: client: instance: metadata: # 这里是我们在 client 设置安全账户信息 步骤中设置的账密 user.name: ${spring.security.user.name} user.password: ${spring.security.user.password}
启动客户端应用就可以了。
HttpHeadersProvider
来满足你的需要。 Spring Boot Admin还提供了一些我们常用的功能。
默认情况下,日志文件无法通过执行器端点访问,因此在 Spring Boot Admin 中不可见。为了启用日志文件执行器端点,您需要通过设置 logging.path
或 logging.file
。
Spring Boot Admin将检测所有看起来像URL的内容,并将其呈现为超链接。还支持 ANSI
颜色转义。您需要设置一个自定义文件日志模式,因为 Spring Boot 的默认模式不使用颜色。
以 logging.file
为例, 我们在客户端 application.yml
增加以下配置:
logging: file: /application.log pattern: file: '%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx'
然后即可在 SBA
控制台显示:
Tags
是我们区别同一应用的不同实例的有效方法。比如我们同时使用 SBA
监控了 spring.application.name=admin-client
应用的三个实例,分别是开发( DEV
)、测试( TEST
)、生产( PROD
)。我们可以通过(以开发为例):
使用信息端点 /info
:
info: tags: environment: DEV
或者配置 SBA
元数据:
spring: boot: admin: client: instance: metadata: tags: environment: DEV
然后我们就可以通过详情界面查看到具体的信息:
Spring Boot Admin支持配置邮件来发送邮件通知,以便于我们及时处置系统警报。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
# spring boot mail 配置 spring: mail: host: smtp.qq.com username: username@xx.com password: password properties: mail: smtp: auth: true starttls: enable: true required: true
# SBA 邮件配置 boot: admin: notify: mail: from: from_user@xxx.com to: to_admin@xxx.com
这样就可以接收邮件告警了。国内也可以使用钉钉机器人通知功能。
还有其它一些功能,可以通过官方文档进行学习。
今天我们学习了使用 Spring Boot Admin 对 Spring Boot 应用进行监控。也学习了如何对 Spring Boot Admin 进行安全访问控制,还有一些有用的进阶操作。
这里需要说明的是对一些小型应用 Spring Boot Admin 可以完全胜任监控功能,也非常简单好用。
但是对于大型分布式集群应用来说我个人不建议使用 Spring Boot Admin ,需要其它更加专业的 APM
监控,比如开源的 Apache Skywalking
、 Prometheus + Grafana
等等。
SBA
实战完整代码可关注公众号: Felordcn
回复 sba
获取 关注公众号:Felordcn获取更多资讯
个人博客:https://felord.cn