当前位置: 首页 > news >正文

使用Spring Boot Actuator构建用户应用

Spring Boot Actuator基础配置

快速启用监控功能

通过添加spring-boot-starter-actuator依赖即可快速启用生产级监控功能。该依赖会自动配置所有Actuator默认设置,包括健康检查、环境变量、指标数据等核心功能。在Gradle构建文件中添加以下依赖:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

默认健康端点

默认情况下,Spring Boot Actuator仅暴露/actuator/health端点,该端点返回应用健康状态:

{"status": "UP"
}

健康状态可能为:

  • UP:应用运行正常
  • DOWN:应用存在严重问题
  • OUT_OF_SERVICE:应用暂时不可用
  • UNKNOWN:状态未知

自定义端点路径

可以通过management.endpoints.web.base-path属性修改Actuator端点前缀路径。在application.properties中添加:

# 修改Actuator基础路径
management.endpoints.web.base-path=/users-system-management# 应用名称配置
spring.application.name=Users App

修改后,健康检查端点将变为:http://localhost:8080/users-system-management/health

使用Spring Profiles隔离配置

建议为Actuator创建独立的profile配置:

  1. 创建application-actuator.properties配置文件
  2. 添加特定环境的Actuator配置:
# 暴露特定端点
management.endpoints.web.exposure.include=health,info# 信息端点配置
management.info.env.enabled=true
info.application.name=${spring.application.name}
info.developer.name=Felipe
info.developer.email=felipe@email.com
info.api.version=1.0
  1. 运行应用时激活profile:
./gradlew bootRun --args='--spring.profiles.active=actuator'

端点暴露控制

可以通过以下属性精确控制哪些端点对外暴露:

# 暴露所有端点
management.endpoints.web.exposure.include=*# 选择性暴露特定端点
management.endpoints.web.exposure.include=health,info,env,metrics# 排除敏感端点
management.endpoints.web.exposure.exclude=shutdown

端点安全配置

默认情况下,Actuator端点不包含敏感信息,但建议添加安全控制:

  1. 添加Spring Security依赖:
implementation 'org.springframework.boot:spring-boot-starter-security'
  1. 配置端点访问权限:
@Configuration
public class ActuatorSecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/actuator/**").hasRole("ACTUATOR").anyRequest().authenticated()).httpBasic(Customizer.withDefaults());return http.build();}
}

常用基础端点

端点路径说明默认启用
/health应用健康状态
/info应用基本信息
/env环境变量信息
/metrics应用指标数据
/loggers日志配置信息

通过合理配置这些基础功能,可以快速构建出适合生产环境的监控体系,为后续深入使用Actuator高级功能奠定基础。

核心Actuator端点详解

/actuator/info端点:应用元数据展示

该端点用于展示应用基础信息与自定义元数据,需通过以下配置显式启用:

management.endpoints.web.exposure.include=info
management.info.env.enabled=true

典型配置示例:

# 基础信息
info.application.name=@project.name@
info.application.version=@project.version@# 自定义元数据
info.developer.team=Platform-Engineering
info.deployment.region=us-east-1

端点响应示例:

{"application": {"name": "Users App","version": "2.1.0"},"git": {"branch": "main","commit": {"id": "3d1e846","time": "2023-05-15T08:42:19Z"}},"build": {"artifact": "users-service","group": "com.example"}
}

/actuator/env端点:环境变量探查

该端点实时暴露应用运行环境的所有配置属性,包括:

  1. 系统环境变量
  2. JVM系统属性
  3. 应用配置文件(application.properties/yml)
  4. 随机属性值

启用方式:

management.endpoints.web.exposure.include=env

典型响应结构:

{"activeProfiles": ["production"],"propertySources": [{"name": "systemEnvironment","properties": {"PATH": {"value": "/usr/local/bin:/usr/bin"}}},{"name": "applicationConfig: [classpath:/application.yml]","properties": {"spring.datasource.url": {"value": "jdbc:h2:mem:testdb"}}}]
}

/actuator/beans端点:容器Bean分析

展示Spring应用上下文中所有注册的Bean定义信息,包括:

  • Bean作用域(Singleton/Prototype)
  • 依赖关系
  • 资源位置
  • 类型信息

启用配置:

management.endpoints.web.exposure.include=beans

示例输出片段:

{"contexts": {"Users App": {"beans": {"userController": {"scope": "singleton","type": "com.example.UserController","dependencies": ["userService"]},"jpaRepositories": {"scope": "singleton","type": "org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean"}}}}
}

/actuator/metrics端点:系统指标监控

提供JVM及系统级性能指标数据,支持按指标名称细查:

基础启用配置:

management.endpoints.web.exposure.include=metrics

获取所有可用指标:

GET /actuator/metrics

响应示例:

{"names": ["jvm.memory.used","system.cpu.usage","http.server.requests","hikaricp.connections.active"]
}

查询特定指标(如JVM内存):

GET /actuator/metrics/jvm.memory.used

详细指标响应:

{"name": "jvm.memory.used","measurements": [{"statistic": "VALUE","value": 250892312}],"availableTags": [{"tag": "area","values": ["heap", "nonheap"]}]
}

/actuator/threaddump端点:线程分析

生成当前JVM线程快照,用于诊断死锁、线程阻塞等问题:

启用方式:

management.endpoints.web.exposure.include=threaddump

典型线程信息结构:

{"threads": [{"threadName": "http-nio-8080-exec-1","threadId": 31,"state": "WAITING","stackTrace": [{"className": "java.lang.Object","methodName": "wait","lineNumber": -2}]}]
}

端点安全增强配置

对于生产环境,建议对敏感端点进行细粒度控制:

@Bean
public SecurityFilterChain actuatorSecurity(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/actuator/health").permitAll().requestMatchers("/actuator/info").permitAll().requestMatchers("/actuator/**").hasRole("ADMIN")).httpBasic(Customizer.withDefaults());return http.build();
}

配合细化的健康端点展示策略:

# 仅对管理员显示详情
management.endpoint.health.show-details=when_authorized
management.endpoint.health.roles=ADMIN

通过合理配置这些核心端点,可以全面掌握应用运行状态,快速定位性能瓶颈和运行时问题。建议根据实际生产需求选择暴露的端点,并配合安全机制保护敏感信息。

安全与审计配置

集成Spring Security保护端点访问

为保护Actuator端点中的敏感信息,需集成Spring Security进行访问控制。在build.gradle中添加安全依赖:

implementation 'org.springframework.boot:spring-boot-starter-security'

配置基于角色的端点访问策略,仅允许具有ACTUATOR角色的用户访问监控端点:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception {MvcRequestMatcher.Builder mvcMatcherBuilder = new MvcRequestMatcher.Builder(introspector);http.csrf(csrf -> csrf.disable()).authorizeHttpRequests(auth -> auth.requestMatchers(mvcMatcherBuilder.pattern("/actuator/**")).hasRole("ACTUATOR").anyRequest().authenticated()).formLogin(Customizer.withDefaults()).httpBasic(Customizer.withDefaults());return http.build();
}

配置角色化用户管理

通过UserDetailsManager创建内存用户存储,并分配不同权限角色:

@Bean
UserDetailsManager userDetailsManager(PasswordEncoder passwordEncoder){UserDetails admin = User.builder().username("admin").password(passwordEncoder.encode("admin")).roles("ADMIN","USER","ACTUATOR").build();UserDetails manager = User.builder().username("manager").password(passwordEncoder.encode("manager")).roles("ADMIN","USER").build();return new InMemoryUserDetailsManager(admin, manager);
}@Bean
PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();
}

审计事件记录实现

Actuator提供/actuator/auditevents端点记录安全事件,需配置审计存储库:

@Bean
public AuditEventRepository auditEventRepository() {return new InMemoryAuditEventRepository();
}

该端点会记录三类关键事件:

  1. AUTHENTICATION_SUCCESS:认证成功事件
  2. AUTHORIZATION_FAILURE:授权失败事件
  3. AUTHENTICATION_FAILURE:认证失败事件

示例审计日志输出:

{"events": [{"timestamp": "2023-11-20T19:04:28.683151Z","principal": "admin","type": "AUTHENTICATION_SUCCESS","data": {"remoteAddress": "0:0:0:0:0:0:0:1"}}]
}

自定义审计事件处理

可通过监听AuditApplicationEvent实现自定义审计逻辑:

@EventListener
public void on(AuditApplicationEvent event) {log.info("审计事件触发 - 类型: {}, 用户: {}", event.getAuditEvent().getType(),event.getAuditEvent().getPrincipal());
}

生产环境建议

  1. 替换InMemoryAuditEventRepository为持久化实现
  2. 配置HTTPS加密通信
  3. 定期轮换审计日志
  4. 实现审计日志分析告警机制

完整安全配置示例:

# 安全相关配置
management.endpoint.health.roles=ACTUATOR
management.endpoint.health.show-details=when_authorized
management.endpoints.web.exposure.include=health,info,auditevents

通过以上配置,可构建完整的端点安全防护体系,同时满足审计合规性要求。实际生产部署时,建议结合企业安全规范进行扩展。

自定义端点开发

端点基础实现

通过实现@Endpoint注解可创建自定义Actuator端点,以下示例展示日志事件配置端点的完整实现:

@Component
@Endpoint(id="event-config")
public class LogEventEndpoint {private LogEventConfig config = new LogEventConfig();@ReadOperationpublic LogEventConfig config() {return config;}@WriteOperationpublic void eventConfig(@Nullable Boolean enabled, @Nullable String prefix, @Nullable String postfix) {if (enabled != null) this.config.setEnabled(enabled);if (prefix != null) this.config.setPrefix(prefix);if (postfix != null) this.config.setPostfix(postfix);}
}

关键注解说明:

  • @Endpoint(id="event-config"):定义端点ID,自动映射为/actuator/event-config路径
  • @ReadOperation:标记HTTP GET操作,返回当前配置状态
  • @WriteOperation:标记HTTP POST操作,支持动态修改配置参数

配置模型设计

端点配置模型采用Lombok简化代码:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogEventConfig {private Boolean enabled = true;private String prefix = ">> ";private String postfix = " <<";
}

业务集成示例

在日志处理器中集成端点配置功能:

@Slf4j
@Component
@AllArgsConstructor
public class UserLogs {private final LogEventEndpoint endpoint;@Async@EventListenervoid userEventHandler(UserEvent event) {if (endpoint.isEnable()) {log.info("{} {} {}", endpoint.config().getPrefix(),event.getMessage(),endpoint.config().getPostfix());}}
}

JMX集成管理

自定义端点自动通过JMX暴露,可通过JConsole进行操作:

  1. 连接应用JMX端口
  2. 导航至org.springframework.boot > Endpoint > event-config
  3. 在Operations标签页执行读写操作

![JMX操作界面示意图]

端点安全配置

application-actuator.properties中启用端点:

management.endpoints.web.exposure.include=health,info,event-config
management.endpoint.health.show-details=when_authorized

动态配置验证

通过cURL测试端点功能:

# 读取当前配置
curl -u admin:admin http://localhost:8080/actuator/event-config# 修改配置参数
curl -X POST -H "Content-Type: application/json" -d '{"prefix": "[EVENT] ","postfix": " [END]"
}' http://localhost:8080/actuator/event-config

生产环境建议

  1. 为写操作添加@Secured注解进行权限控制
  2. 实现配置持久化存储
  3. 添加参数校验逻辑
  4. 考虑配置变更的原子性

这种自定义端点模式适用于需要运行时调整的业务参数,相比传统配置文件方式,提供了更灵活的动态管理能力。

健康检查高级配置

健康指标优先级控制

通过management.endpoint.health.status.order属性可以自定义健康状态的优先级顺序。默认值为:

management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up

当存在多个健康指标时,系统会按照该顺序确定最终应用状态。例如,若RabbitMQ健康状态为DOWN但优先级配置中移除了down

management.endpoint.health.status.order=fatal,out-of-service,unknown,up

此时即使RabbitMQ不可用,应用整体状态仍会显示为UP

内置健康指标详解

Spring Boot Actuator内置了多种健康指标:

  1. 数据库健康指标
    自动检测DataSource连接状态,支持H2、PostgreSQL等常见数据库:

    "db": {"status": "UP","details": {"database": "H2","validationQuery": "isValid()"}
    }
    
  2. 磁盘空间指标
    监控系统磁盘使用情况,默认阈值10MB:

    "diskSpace": {"status": "UP","details": {"total": 1000240963584,"free": 97917366272,"threshold": 10485760}
    }
    
  3. 中间件健康指标
    包括RabbitMQ、Redis等组件的自动检测:

    "rabbit": {"status": "DOWN","details": {"error": "Connection refused"}
    }
    

自定义健康指标实现

通过实现HealthIndicator接口可创建业务专属健康检查:

@Component
public class EventsHealthIndicator implements HealthIndicator {private final LogEventEndpoint endpoint;@Overridepublic Health health() {return endpoint.isEnable() ? Health.up().build() :Health.status(new Status("EVENTS-DOWN", "事件服务已禁用")).build();}
}

命名约定:类名需以HealthIndicator结尾,注册的组件名称为前缀部分(如EventsHealthIndicator对应events组件)

健康详情暴露策略

通过以下配置控制健康详情信息的可见性:

# 显示策略:never|when_authorized|always
management.endpoint.health.show-details=when_authorized# 允许查看详情的角色
management.endpoint.health.roles=ACTUATOR

RabbitMQ健康检测实战

  1. 添加AMQP依赖:

    implementation 'org.springframework.boot:spring-boot-starter-amqp'
    
  2. 健康状态自动检测:

    {"status": "DOWN","components": {"rabbit": {"status": "DOWN","details": {"error": "Connection refused"}}}
    }
    
  3. 启动RabbitMQ服务后状态变化:

    "rabbit": {"status": "UP","details": {"version": "3.12.9"}
    }
    

复合状态决策机制

当多个健康指标状态冲突时,系统按照以下逻辑决策最终状态:

  1. status.order定义顺序检查
  2. 遇到第一个匹配的非UP状态即终止判断
  3. 全部通过则返回UP状态

这种机制允许根据业务重要性灵活调整不同组件的健康影响权重。

生产环境建议

  1. 关键组件采用自定义健康指标
  2. 合理设置状态优先级顺序
  3. 通过show-details控制敏感信息暴露
  4. 结合Kubernetes的liveness/readiness探针使用
  5. 对核心组件实现降级处理逻辑

Spring Boot Actuator核心价值总结

Spring Boot Actuator作为Spring生态中的生产级监控组件,通过标准化端点暴露、细粒度健康检查和灵活的安全控制三大核心机制,为现代化应用提供了开箱即用的运维能力支撑。

端点暴露体系

Actuator采用分层式端点设计,通过management.endpoints.web.exposure属性实现精确控制:

# 暴露核心监控端点
management.endpoints.web.exposure.include=health,info,metrics
# 排除敏感端点
management.endpoints.web.exposure.exclude=env

这种设计既保证了基础监控需求,又能防止敏感信息泄露。端点路径支持自定义前缀,便于与企业现有监控体系集成:

management.endpoints.web.base-path=/monitor

健康检查机制

健康检查系统采用模块化设计,具有以下特点:

  1. 多级状态聚合:通过status.order定义状态优先级
management.endpoint.health.status.order=critical,warning,up
  1. 内置指标丰富:包含数据库、磁盘、中间件等20+健康指标
  2. 业务状态扩展:支持自定义健康指示器
@Component
public class PaymentHealthIndicator implements HealthIndicator {@Overridepublic Health health() {return checkPaymentGateway() ? Health.up().build() : Health.down().withDetail("error", "支付通道不可用").build();}
}

安全审计体系

通过与Spring Security深度集成,提供完整的审计跟踪能力:

@Bean
public SecurityFilterChain actuatorSecurity(HttpSecurity http) {http.authorizeHttpRequests(auth -> auth.requestMatchers("/actuator/**").hasRole("MONITOR").requestMatchers("/actuator/shutdown").hasRole("ADMIN"));return http.build();
}

审计事件自动记录认证、授权等关键操作,支持自定义事件处理:

@EventListener
public void handleAuditEvent(AuditApplicationEvent event) {auditService.record(event.getAuditEvent());
}

生产实践建议

  1. 端点暴露:按最小权限原则控制端点可见性
  2. 健康检查:关键业务组件实现自定义HealthIndicator
  3. 安全配置:结合企业安全规范启用HTTPS和角色控制
  4. 监控集成:通过Micrometer对接Prometheus等监控系统

以下代码展示了一个完整的生产就绪配置示例:

# 端点配置
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=when_authorized# 安全配置
management.endpoint.health.roles=OPS
management.server.port=9091
management.server.ssl.enabled=true# 健康检查
management.endpoint.health.status.order=critical,maintenance,up

Spring Boot Actuator通过这种模块化、可扩展的设计,在保持轻量级的同时满足了企业级应用的监控需求,是构建云原生应用不可或缺的基础组件。

相关文章:

  • 前馈神经网络
  • macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
  • DataSource学习
  • k8s使用自建nfs做持久化无法控制磁盘使用大小问题处理
  • 游戏测试面试八股汇总(持续更新版)
  • 借助AI识别测试盲区:从需求文档中挖掘遗漏场景
  • 《高等数学》(同济大学·第7版)第四章第二节换元积分法
  • axios取消请求
  • iOS 抖音首页头部滑动标签的实现
  • iOS和桌面双端抓包实战经验总结:Sniffmaster与常见工具组合解析
  • 为什么选择物理服务器租用?
  • iOS超级签申请流程及环境部署
  • 基于OpenCV的风格迁移:图像金字塔方法
  • 安全生产管理是什么?安全生产管理系统都有哪些核心功能?
  • 傲软录屏:轻松录制,高效分享
  • 【时时三省】(C语言基础)静态局部变量(static局部变量)
  • Ubuntu中安装CURL
  • SQL进阶之旅 Day 24:复杂业务场景SQL解决方案
  • ubuntu24安装cuda12.6+cudnn9.6
  • 谈谈ConcurrentHashMap相比于Hashtable的优势
  • 温州网站制作优化/百度seo排名在线点击器
  • dedecms一键更新网站/关键seo排名点击软件
  • wordpress 浮动定位/铜川网站seo
  • 住房和城乡建设部科技网站首页/关联词有哪些五年级
  • 什么网站可下载可做海报的图片/广州seo诊断
  • 三个字的洋气商标名字/搜索引擎优化的主要策略