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.ymlapplication.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


原始标题:Introduction to Chaos Monkey