Chaos Monkey设计场景与应用

设计场景与应用

下面例子是 Spring Boot 微服务中 Chaos Monkey 的应用,展示如何在 Spring Boot 应用程序中包含 Codecentric 的 Chaos Monkey,然后在一些微服务示例系统中实现混沌工程。Chaos Monkey 库可以与 Spring Boot 2.0 一起使用,它的当前发行版本是 1.0.1。但是,这里将使用 2.0.0-SNAPSHOT 版本实现示例,因为它具有此库的早期版本中不能用的一些新的有趣功能。为了能够下载 Codecentric 的 Chaos Monkey 库的 SNAPSHOT 版本,必须记住包含 Maven 存储库 https://oss.sonatype.org/content/repositories/snapshotspom.xml 存储库中。

为应用程序启用 Chaos Monkey

为 Spring Boot 应用程序启用 Chaos Monkey 有两个必需的步骤。首先,让我们将 chaos-monkey-spring-boot 库添加到项目的依赖项中。

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>chaos-monkey-spring-boot</artifactId>
    <version>2.0.0-SNAPSHOT</version>
</dependency>

然后,我们应该在应用程序启动时激活 chaos-monkey 文件。

$java -jar target/order-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey

样本系统架构

该示例系统由三个微服务组成,每个微服务都在两个实例中启动,还有一个服务发现服务器。微服务将自己注册到发现服务器,并通过 HTTP API 相互通信。Chaos Monkey 库包含在所有正在运行的微服务的每个实例中,但不包含在发现服务器中。

样本应用程序的源代码可以在 GitHub 的仓库 sample-spring-chaosmonkey 中找到。克隆此存储库并使用 mvn clean install 命令构建它之后,应该首先运行 discovery-service。然后通过 -Dserver.port 使用适当的数字设置属性,在不同端口上运行每个微服务的两个实例。

$java -jar target/discovery-service-1.0-SNAPSHOT.jar
$java -jar target/order-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey
$java -jar -Dserver.port=9091 target/order-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey
$java -jar target/product-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey
$java -jar -Dserver.port=9092 target/product-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey
$java -jar target/customer-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey
$java -jar -Dserver.port=9093 target/customer-service-1.0-SNAPSHOT.jar --spring.profiles.active=chaos-monkey

流程配置

在版本 2.0.0-SNAPSHOT 的 chaos-monkey-spring-boot 库中,Chaos Monkey 默认启用它包含的应用程序。你可以使用 chaos.monkey.enabled 属性禁用它。但是,默认情况下启用的唯一攻击是延迟。这种类型的攻击会通过属性 chaos.monkey.assaults.latencyRangeStart 和 chaos.monkey.assaults.latencyRangeEnd 确定的范围为应用程序处理的请求添加随机延迟。受攻击请求的数量取决于属性 chaos.monkey.assaults.level,其中 1 表示每个请求,10 表示每第 10 个请求。我们还可以为我们的应用程序启用异常和 appKiller 攻击。为简单起见,我为所有微服务设置了配置。我们来看看 application.yml 文件中提供的设置。

  • chaos:

  • monkey:

  • assaults:

  • level: 8

  • latencyRangeStart: 1000

  • latencyRangeEnd: 10000

  • exceptionsActive: true

  • killApplicationActive: true

  • watcher:

  • repository:true

  • estController: true

理论上,上面显示的配置应该启用所有三种可用类型的攻击。但是,如果启用 latency 和 exceptions,killApplication 永远不会发生。此外,如果同时启用 latency 和 exceptions,则无论使用 chaos.monkey.assaults.level 属性设置哪个级别,发送给应用程序的所有请求都将受到攻击。记住激活 restController 观察者很重要,默认情况下禁用观察者。

启用 Spring Boot Actuator 端点

Codecentric 在其 Chaos Monkey 库的 2.0 版本中实现了一项新功能 - Spring Boot Actuator 的端点。要为我们的应用程序启用它,我们必须按照执行程序约定激活它 - 通过将属性 management.endpoint.chaosmonkey.enabled 设置为 true。此外,从 Spring Boot 2.0 版开始,我们必须公开该 HTTP 端点在应用程序启动后可用。

management:
  endpoint:
    chaosmonkey:
      enabled: true
  endpoints:
    web:
      exposure:
        include: health,info,chaosmonkey

chaos-monkey-spring-boot 提供了几个端点,允许你查看和修改配置。你可以使用 GET /chaosmonkey 方法来获取库的整个配置。你也可以在启动应用程序后,通过调用 /chaosmonkey/disable 方法,禁用 chaos monkey。此处列出了可用端点的完整列表:https://codecentric.github.io/chaos-monkey-spring-boot/2.0.0-SNAPSHOT/#endpoints。

运行应用程序

所有示例微服务都在 MySQL 中存储数据。因此,第一步是使用 Docker 镜像在本地运行 MySQL 数据库。下面显示的 Docker 命令还会创建具有密码的数据库和用户。

$docker run -d --name mysql -e MYSQL_DATABASE=chaos -e MYSQL_USER=chaos -e MYSQL_PASSWORD=chaos123 -e MYSQL_ROOT_PASSWORD=123456 -p 33306:3306 mysql

在运行所有示例应用程序之后,所有微服务都在两个实例中使用不同端口。我们可以通过调用流行的性能测试库:Gatling

我们这里使用性能测试库 Gatling 来进行测试,将创建 20 个并发线程,将通过 API 网关服务来调用 order-service,每个线程调用 500 次。测试的 POST 请求访问端口是 OrderControlleradd(…) 方法,这个方法将通过 OpenFeign 客户端来调用 customer-serviceproduct-service。如果顾客用足够的资金并且相应商品有库存的情况下,就接受订单通过 PUT 方法对顾客和商品服务进行修改。运行 Gatling 性能测试,到 performance-test 目录中运行 gradle loadTest 命令,测试结果跟 Chaos Monkey 袭击设置以及 Ribbon、Feign 客户端的超时设置都相关。这是针对设置延迟攻击生成的结果。当然,可以通过设置 Chaos Monkey 的延迟值或 Ribbon 和 Feign 超时值来更改此结果。

img

-------------本文结束 感谢您的阅读-------------