断路器--Hystrix
<h1>Hystrix是什么</h1>
<p>防止服务提供者不可用导致服务调用者不可用,进而发生连锁反应的工具。
例如:
当调用的服务无响应,或者规定时间内调用失败多次时,停止调用该服务,避免整个微服务系统被请求等待拖垮,发生雪崩。</p>
<p>假设服务A依赖服务B和服务C,而B服务和C服务有可能继续依赖其他的服务,继续下去会使得调用链路过长。如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住,堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃。</p>
<p>一般情况对于服务依赖的保护主要有两种方式:熔断和限流。
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/6481cef2dfb395deedc5016359fcf7cb?showdoc=.jpg" alt="" /></p>
<h1>Hystrix的Demo位置与配置</h1>
<h2>包含的组件</h2>
<h3>Hystrix面板</h3>
<p>工程名:nisbos-springcloud-example-hystrix-dashboard
用途:展现配置工程的服务降级,服务断路等信息。</p>
<h3>Hystrix服务提供者</h3>
<p>工程名:nisbos-springcloud-example-hystrix-biz
用途:提供将被降级,断路的服务</p>
<h3>Hystrix服务消费者</h3>
<p>工程名:nisbos-springcloud-example-frame-biz
用途:统一调用各种组件demo提供的服务,包括该Hystrix的demo服务,改善演示效果</p>
<h2>位置</h2>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b813531a2b7bf238f976ecf226638b80?showdoc=.jpg" alt="" /></p>
<h2>关键代码</h2>
<h3>1. 在Hystrix面板工程配置</h3>
<h4>配置要监控的项目</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/10f9199678a9e91fb5491cdb62b68813?showdoc=.jpg" alt="" />
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/914bd1f6f78b6e8d7dee95dfe933b00d?showdoc=.jpg" alt="" />
如图,Hystrix面板工程里监控了nisbos-springcloud-example-hystrix,nisbos-springcloud-example-oms两个项目。</p>
<h4>Pom文件引入相关包</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/c7c5982cd984dfa1cde6a12abb03a658?showdoc=.jpg" alt="" /></p>
<h4>启动类加入注解</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b68bb7a5092bebdf659565e08c74ede7?showdoc=.jpg" alt="" /></p>
<h3>2.服务提供者工程配置</h3>
<h4>application.yml配置</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/22369f3ef2f897718c0f088b168e23c3?showdoc=.jpg" alt="" /></p>
<h4>Pom文件引入相关包</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/66806b609409ec3cc877a7ab5f7cfa29?showdoc=.jpg" alt="" /></p>
<h4>启动类加入注解</h4>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9617db1f3b8ac6db989b8476663f65ed?showdoc=.jpg" alt="" /></p>
<h3>3.关键代码参数</h3>
<h4>熔断例子:</h4>
<p>@HystrixCommand(fallbackMethod = "circuitBreakerFallback", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")//超时1秒,开启熔断
})</p>
<h4>降级例子:</h4>
<p>待补充</p>
<h4>核心线程例子:</h4>
<p>待补充</p>
<h1>Hystrix测试与结果查看</h1>
<h2>第一步:启动面板工程,并配置监控</h2>
<p>启动工程
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b7b61f99c1772c722398cd68ee49145e?showdoc=.jpg" alt="" />
访问
<a href="http://127.0.0.1:8910/hystrix">http://127.0.0.1:8910/hystrix</a></p>
<p>填写流地址
<a href="http://localhost:8910/turbine.stream">http://localhost:8910/turbine.stream</a>
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/cf7ade1746cb2b1a560946e2768f0e7d?showdoc=.jpg" alt="" />
此时面板处于加载数据状态
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f8d2f65ca1d945710b9e863ba59243a3?showdoc=.jpg" alt="" /></p>
<h2>第二步:启动服务提供者与服务调用者工程</h2>
<p>启动服务提供者工程
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9d19b2252241932c64fee3f9a5835bc4?showdoc=.jpg" alt="" />
启动服务调用者工程
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b0d3ca9de4f0ce2fb0a3828df10fa764?showdoc=.jpg" alt="" /></p>
<h2>第三步:调用降级服务</h2>
<p><a href="http://127.0.0.1:8920/api/frameDemo/hystrix/exceptionDown">http://127.0.0.1:8920/api/frameDemo/hystrix/exceptionDown</a></p>
<h2>第四步:在面板查看结果</h2>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b5339b0e19311130062fd3f8281adaa5?showdoc=.jpg" alt="" /></p>
<h1>参考资料</h1>
<h2>Hystrix原理</h2>
<p><a href="https://blog.csdn.net/liaojiamin0102/article/details/93606893">https://blog.csdn.net/liaojiamin0102/article/details/93606893</a></p>
<h2>Hystrix面板</h2>
<p><a href="https://www.jianshu.com/p/b7b20fc09ca9">https://www.jianshu.com/p/b7b20fc09ca9</a></p>
<h1>踩坑集</h1>
<h2>踩坑一:fallbackMethod必须跟母函数完全一致</h2>
<p>在control层加入
@HystrixCommand(fallbackMethod = "exceptionDownFallback")
报找不到exceptionDownFallback方法错误,原来是因为该fallbackMethod的参数和返回类型必须跟母方法一模一样,比如:
@HystrixCommand(fallbackMethod = "placeAnOrderExceptionDownFallback")
@RequestMapping("/seckillByCode/{goodsCode}")
@ResponseBody
public RPCResult seckillByCode(@PathVariable String goodsCode){
..略..
}
它的fallbackMethod方法定义为
public RPCResult placeAnOrderExceptionDownFallback(){
..略..
}
就会报错,修改为
public RPCResult placeAnOrderExceptionDownFallback(@PathVariable String goodsCode){
..略..
}
则调用正常</p>