生产环境Spring Boot这些骚操作你可知道?

文摘   科技   2024-11-18 08:00   新疆  
 

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:SpringBoot.2.7.18



1. 简介

Spring Boot包括许多附加特性,可以帮助你在将应用程序投入生产环境时监视和管理它。你可以选择使用HTTP或JMX来管理和监视应用程序。审计、运行状况和指标收集也可以自动应用于你的应用程序。

spring-boot-actuator模块提供了Spring Boot所有生产环境可用的特性

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-actuator</artifactId></dependency>

Actuator端点可让你监控应用程序并与之交互。Spring Boot 包含许多内置端点,还可以添加自己的端点。例如,health 端点提供基本的应用程序健康信息。

关于Actuator都提供了哪些Endpoints自行查看官方文档。

2. 强大的功能

2.1 跨域支持

management:  endpoints:    web:      cors:        allow-credentials: true        allowed-headers: '*'        allowed-origins: ''


2.2 自定义Endpoint

通过 @Endpoint 注解可以轻松实现自定义的Endpoint。

@Component// id相当于@RequestMapping中设置的uri@Endpoint(id = "pack")public class PackEndpoint {
@ReadOperation public CustomData getData() {    return new CustomData("Custom Endpoint"); } @WriteOperation public void writeData(String title) { System.out.printf("修改标题:%s%n", title) ;  } static class CustomData { private String title ; public CustomData(String title) { this.title = title ; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }  }}

写操作

2.3 应用健康信息

默认访问/health返回如下信息

通过如下参数显示更多的信息

management:  endpoint:    health:      show-details: always

这里根据你当前的环境显示了数据库及磁盘信息。

控制db或disk相关信息

management:  endpoint:    health:      show-details: always  health:    db:      enabled: false    diskspace:      enabled: true

如你当前环境还存在redis或rabbit等中间件,那么都可以通过上面的方式进行控制。

management:  endpoint:    health:      show-details: when-authorized

当将值配置为如上时,这需要我们集成Spring Security框架,进行认证授权。同时可以指定具体拥有访问详细信息的角色。

management:  endpoint:    health:      show-details: when-authorized      roles:      - ROLE_ADMIN

如果上配置后,只有当前登录人具有ADMIN角色的人才能查看健康状态的详细信息。否则,只能查看到status: "UP" 这样的信息。

2.4 自定义健康指标

要提供自定义健康信息,可以注册实现HealthIndicator接口的Spring bean。你需要提供health()方法的实现,并返回健康响应。健康响应应包括状态,并可选择包括要显示的其他详细信息。

@Componentpublic class PackHealthIndicator implements HealthIndicator {  @Override  public Health health() {    int errorCode = check() ;    if (errorCode != 0) {      return Health.down().withDetail("Error Code", errorCode).build();    }    return Health.up().build() ;  }
private int check() { return new Random().nextInt(2) ; }}

访问/health接口后,你会看到"status": "UP"切换中。

2.5 HTTP请求跟踪

你可以通过在应用程序配置中提供HttpTraceRepository类型的bean来启用HTTP跟踪。为了方便起见,Spring Boot提供了InMemoryHttpTraceRepository,用于存储最近100个(默认)请求-响应交换的跟踪信息。生产环境应该使用如Zipkin或Spring Cloud Sleuth。或者,你可以创建自己的HttpTraceRepository。

通过使用/httptrace端点来获取存储在HttpTraceRepository中的请求-响应交换的信息。

@BeanInMemoryHttpTraceRepository inMemoryHttpTraceRepository() {  return new InMemoryHttpTraceRepository() ;}

任意请求HTTP接口后,/httptrace

通过如下方式细化配置

management:        trace:    http:      include:      - request-headers      - response-headers

支持如下属性配置


2.6 安全审计

使用了Spring Security之后,Spring Boot Actuator就有了一个灵活的审计框架,可以发布事件(默认情况下,“身份验证成功”、“失败”和“访问被拒绝”异常)。此功能对于报告和实现基于身份验证失败的锁定策略非常有用。

通过在应用程序配置中提供AuditEventRepository类型的bean来启用审计。为了方便起见,Spring Boot提供了InMemoryAuditEventRepository。对于生产环境,请考虑创建自己的替代AuditEventRepository实现。

@BeanSecurityFilterChain actuatorSecurityFilterChain(HttpSecurity http) throws Exception {  http.csrf(csrf -> csrf.disable());  http.authorizeHttpRequests().antMatchers("/ac/**").hasRole("ACTUATOR") ;  http.authorizeHttpRequests().anyRequest().permitAll() ;  http.formLogin(customizer -> Customizer.withDefaults()) ;  return http.build() ;}@BeanInMemoryAuditEventRepository auditEventRepository() {  return new InMemoryAuditEventRepository() ;}

2.7 进程监控

在spring-boot模块中,你通过下面两个类用来创建文件,它们通常用于监控进程。

  • ApplicationPidFileWriter:创建一个包含应用程序 PID 的文件(默认情况下位于应用程序目录下,文件名为 application.pid)。

  • WebServerPortFileWriter:创建一个(或多个)文件,其中包含运行中的网络服务器的端口(默认情况下位于应用程序目录下,文件名为 application.port)。


在项目中新建META-INF/spring.factories文件添加如下内容:

org.springframework.context.ApplicationListener=\org.springframework.boot.context.ApplicationPidFileWriter,\org.springframework.boot.web.context.WebServerPortFileWriter

启动服务后,在项目的跟目录下会分别建立如下文件:

以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

@Order注解,你理解错了!

速看!Spring Boot任务调度你不知道的使用技巧

Spring Boot + 事务钩子,完美解决事务并发问题

性能提升!Spring Boot使用Guava中3大神技

必学!Spring Boot结合MDC全方位的日志跟踪(支持跨线程)

提升性能:Java工程师必备的20条SQL最佳实践

基于Spring Boot REST API设计指南

在Spring Boot中具有多个实现的接口正确注入的6种方式

虚拟线程在Spring Boot中的应用及性能对比

Spring Boot中通过3种方式初始化数据,你们如何选择?

优雅!SpringBoot详细记录SQL执行耗时情况

真香!SpringBoot内置性能监控工具

高性能缓存神器Caffeine

Controller接口地址还能这样玩?

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章