Chaosblade: 阿里一个超级牛逼的混沌实验实施工具

场景三:调用某个Dubbo服务超时

官网的Demo中给我们提供了:

  • dubbo-provider

  • dubbo-consumer

大家把上面的服务提供者和服务消费者jar包下载下来之后,进到下载目录,然后通过下面命令运行起来:

# 启动 dubbo-provider
nohup java -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-provider -jar dubbo-provider-1.0-SNAPSHOT.jar > provider.nohup.log 2>&1 &
# 稍等 2 秒,然后启动 dubbo-consumer
nohup java -Dserver.port=8080 -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-consumer -jar dubbo-consumer-1.0-SNAPSHOT.jar > consumer.nohup.log 2>&1 &

nohup是linux中的命令,可以让java命令后台运行。

运行起来后,可以通过下面的命令来进行服务调用:

http://localhost:8080/hello?msg=world

正常情况下,该请求会很快的完成并返回:

{
"date": "Wed Jul 03 16:33:10 CST 2019",
"msg": "Dubbo Service: Hello world"
}

进行故障演练:

$ ./blade prepare jvm --process dubbo.consumer
{"code":200,"success":true,"result":"5cdbc31f46a3d621"}
$ ./blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --consumer --process dubbo.consumer
{"code":200,"success":true,"result":"3e705e8babe8a86c"}

上面的命令会使consumer在调用com.alibaba.demo.HelloService服务的hello方法时增加3秒的延时。当我们访问上面访问的路径时会比之前等待的更久一点。

在对dubbo进行故障演练时,其实支持的细分场景很多,因为在dubbo中分为consumer和provider两种角色,当consumer在调用provider时,我们现在想使这个请求增加延时,我们既可以在provider端针对指定的服务增加延时,也可以在consumer调用时针对指定的服务进行延时,所以我们可以稍微看下上面的命令,它其实是在consumer进行控制的,命令也是支持在provider端进行控制的,我们运行一下以下命令:

blade create dubbo delay --help

将看到帮助中有下面的信息:

Flags:
      --appname string          The consumer or provider application name
      --consumer                To tag consumer role experiment.
      --effect-count string     The count of chaos experiment in effect
      --effect-percent string   The percent of chaos experiment in effect
  -h, --help                    help for delay
      --methodname string       The method name
      --offset string           delay offset for the time
      --process string          Application process name
      --provider                To tag provider experiment
      --service string          The service interface
      --time string             delay time (required)
      --timeout string          set timeout for experiment
      --version string          the service version

其中就有 --consumer--provider ,表示的就是命令中可以控制服务调用的两端。所以如果我们想控制provider端,想让某个接口被调用时超时的话,是完全可以进行故障演练的。

那么关于底层原理的话,需要大家对Dubbo比较了解,Dubbo中是有动态配置功能的,所以Chaosblade应该也是利用了dubbo的动态配置功能。