1. 简介
本文将介绍如何在 Spring Boot 项目中集成 Chaos Monkey,用于实践混沌工程(Chaos Engineering)的核心思想。
简单来说,Chaos Monkey 能在运行时人为制造“故障”,比如:
- ✅ 给 REST 接口注入延迟
- ✅ 随机抛出异常
- ✅ 直接干掉应用进程
这些“攻击”能帮助我们验证系统的容错性和稳定性,提前发现线上可能踩坑的场景。对于微服务架构尤其有价值——毕竟没人想半夜被报警叫醒。
2. 环境搭建
只需要引入一个 Maven 依赖即可:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>chaos-monkey-spring-boot</artifactId>
<version>2.0.0</version>
</dependency>
⚠️ 注意:建议只在测试或预发环境使用,生产环境开启等于自爆。
3. 配置与启用
引入依赖后,需要通过配置激活 Chaos Monkey。有两种方式:
方式一:使用 Spring Profile(推荐)
启动时指定 chaos-monkey
profile:
java -jar your-app.jar --spring.profiles.active=chaos-monkey
✅ 优势:无需重启应用即可动态启停,适合临时测试。
方式二:通过配置项启用
在 application.yml
或 application.properties
中设置:
chaos.monkey.enabled=true
此外,建议开启管理接口以便实时控制:
management.endpoint.chaosmonkey.enabled=true
启用后,可通过以下接口查看状态和调整配置:
http://localhost:8080/chaosmonkey
📌 所有可用接口详见官方文档:Chaos Monkey Endpoints
通过丰富的 配置属性,你可以精细控制“混沌”的范围和强度。
4. 工作原理
Chaos Monkey 的核心机制由两部分组成:Watcher(观察者) 和 Assault(攻击)。
- Watcher:基于 Spring AOP 实现,监控带有特定 Spring 注解的类中公共方法的调用。
- Assault:当被监控的方法执行时,根据配置施加“攻击”。
支持监控的注解包括:
@Component
@Controller
@RestController
@Service
@Repository
根据配置,公共方法可能遭遇以下三种“攻击”之一:
- ⏳ Latency Assault:增加随机延迟
- 💥 Exception Assault:抛出运行时异常
- 💀 AppKiller Assault:直接终止 JVM
接下来我们看看如何配置 Watcher 和各类攻击。
5. Watcher 配置
默认情况下,Watcher 仅对 @Service
类生效。也就是说,只有 @Service
中的公共方法可能被攻击。
可通过以下配置项调整监控范围:
chaos.monkey.watcher.controller=false
chaos.monkey.watcher.restController=false
chaos.monkey.watcher.service=true
chaos.monkey.watcher.repository=false
chaos.monkey.watcher.component=false
⚠️ 注意:一旦应用启动,无法通过管理接口动态修改 Watcher 的监控范围,必须重启生效。
6. 攻击类型详解
Assault 是实际制造混乱的行为。以下是三种攻击方式及其配置方法。
6.1. 延迟攻击(Latency Assault)
模拟慢请求场景,比如数据库响应变慢、网络延迟增加等。
配置示例(application.properties
):
chaos.monkey.assaults.latencyActive=true
chaos.monkey.assaults.latencyRangeStart=3000
chaos.monkey.assaults.latencyRangeEnd=15000
上述配置表示:启用延迟攻击,每次调用增加 3~15 秒的随机延迟。
你也可以通过管理接口动态调整(例如改为 2~5 秒):
curl -X POST http://localhost:8080/chaosmonkey/assaults \
-H 'Content-Type: application/json' \
-d '
{
"latencyRangeStart": 2000,
"latencyRangeEnd": 5000,
"latencyActive": true,
"exceptionsActive": false,
"killApplicationActive": false
}'
6.2. 异常攻击(Exception Assault)
测试系统对异常的处理能力,比如熔断、降级、重试等机制是否正常。
启用方式(通过接口):
curl -X POST http://localhost:8080/chaosmonkey/assaults \
-H 'Content-Type: application/json' \
-d '
{
"latencyActive": false,
"exceptionsActive": true,
"killApplicationActive": false
}'
✅ 效果:被监控的方法会随机抛出 RuntimeException
,可用于验证全局异常处理器或 Hystrix 等组件是否生效。
6.3. 应用终结者(AppKiller Assault)
最狠的一种攻击——随机干掉整个应用进程。
启用命令:
curl -X POST http://localhost:8080/chaosmonkey/assaults \
-H 'Content-Type: application/json' \
-d '
{
"latencyActive": false,
"exceptionsActive": false,
"killApplicationActive": true
}'
⚠️ 踩坑提醒:建议搭配 Kubernetes 或 Docker 使用,确保应用能自动重启。否则你可能需要手动拉起来,影响测试效率。
7. 总结
本文介绍了 Chaos Monkey for Spring Boot 的基本使用方法,它将混沌工程的理念落地到了 Java 应用中。
通过简单的配置,你就能在测试环境中模拟各种故障场景,验证系统的健壮性。对于构建高可用微服务系统来说,是一种简单粗暴但非常有效的手段。
示例代码已托管至 GitHub:https://github.com/tech-engineer/spring-boot-chaos-demo