Coup de Grace

Chaos monkey源码解读

Chaos Monkey 我知道的最早是 Netflix 提出来的概念,石破天惊.

但是当时跟持续交付绑定的很紧,也不太关心机房中间件以外/代码以内的事情.

今儿闲逛 github 看到 sba 的作者又写了个chaos-monkey-spring-boot.

读读看.

官方使用文档在这里,不过还没全部实现就是了.


实现

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  de.codecentric.spring.boot.chaos.monkey.configuration.ChaosMonkeyConfiguration

EnableAutoConfigurationImportSelectorselectImport读取到,并通过SpringFactoriesLoader 加载实例.


核心内容如下:

在 profile为 chaos-monkey 时,创建 ChaosMonkey 并根据条件创建测试切面

针对以下内容:

@Profile("chaos-monkey")
ChaosMonkeyConfiguration

    @Bean
    public ChaosMonkey chaosMonkey() {
        return new ChaosMonkey(assaultProperties);
    }

    @Bean
    @Conditional(AttackControllerCondition.class)
    public SpringControllerAspect controllerAspect() {
        return new SpringControllerAspect(chaosMonkey());
    }

    @Bean
    @Conditional(AttackRestControllerCondition.class)
    public SpringRestControllerAspect restControllerAspect() {
        return new SpringRestControllerAspect(chaosMonkey());
    }

    @Bean
    @Conditional(AttackServiceCondition.class)
    public SpringServiceAspect serviceAspect() {
        return new SpringServiceAspect(chaosMonkey());
    }

其中 ChaosMonkey 手持 applicationContext 实现以下功能:


切面实现我直接拿出来其中一个,比较简单粗暴了

@Aspect
public class SpringServiceAspect {

    private final ChaosMonkey chaosMonkey;

    public SpringServiceAspect(ChaosMonkey chaosMonkey) {
        this.chaosMonkey = chaosMonkey;
    }

    @Pointcut("within(@org.springframework.stereotype.Service *)")
    public void classAnnotatedWithControllerPointcut() {
    }

    @Pointcut("execution(* *.*(..))")
    public void allPublicMethodPointcut() {
    }

    @Around("classAnnotatedWithControllerPointcut() && allPublicMethodPointcut()")
    public Object intercept(ProceedingJoinPoint pjp) {
        chaosMonkey.callChaosMonkey();
        return pjp.proceed();
    }
}

另外有一些边缘的自定义 endpoint 暴露就不谈了.


结构

结构较简单,不多说了,功能丰富起来我们继续补充.


done.