学习成长

提供在线文档,方便大家学习


熔断机制 -- 断路器hystrix

<p>SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/77c82088aaa8e98e8411f4eb5009da5e?showdoc=.jpg" alt="" /> 一个微服务的超时失败可能导致瀑布式连锁反映,下图中,Hystrix通过自主反馈实现的断路器, 防止了这种情况发生。 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/2d15cefd2051e7aebdc4f64c3ab4a5b1?showdoc=.jpg" alt="" /> 图中的服务B因为某些原因失败,变得不可用,所有对服务B的调用都会超时。当对B的调用失败达到一个特定的阀值(5秒之内发生20次失败是Hystrix定义的缺省值), 链路就会被处于open状态, 之后所有所有对服务B的调用都不会被执行, 取而代之的是由断路器提供的一个表示链路open的Fallback消息. Hystrix提供了相应机制,可以让开发者定义这个Fallbak消息.</p> <p>open的链路阻断了瀑布式错误, 可以让被淹没或者错误的服务有时间进行修复。这个fallback可以是另外一个Hystrix保护的调用, 静态数据,或者合法的空值. Fallbacks可以组成链式结构,所以,最底层调用其它业务服务的第一个Fallback返回静态数据.</p> <p>下面,进入正题,在之前的两HELLO WORLD服务集群中加入断路器, 防止其中一个Hello world挂掉后, 导致系统发生连锁超时失败。</p> <h3>1. 在maven工程Feign工程(消费者)的pom.xml中添加hystrix库支持断路器</h3> <pre><code>&lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-hystrix&lt;/artifactId&gt; &lt;/dependency&gt;</code></pre> <h3>2. 在Feign应用中使用断路器</h3> <p>1). Feign内部已经支持了断路器,所以不需要想Ribbon方式一样,在Spring Boot启动类上加额外注解 2). 用@FeignClient注解添加fallback类, 该类必须实现@FeignClient修饰的接口。 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/28fbcfa4260b6dfc60da13903fa59f00?showdoc=.jpg" alt="" /> 3). 创建一个实现类, 去实现被@FeignClient修饰的如上图中的接口。注意添加@Component或者@Service注解,在Spring容器中生成一个Bean <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/8f46b5f9061f43bf4518d01d8c2c26be?showdoc=.jpg" alt="" /> 4). Spring Cloud之前的Brixton版本中,Feign是缺省是自动激活了断路器的,但最近的Dalston版本已经将缺省配置修改为禁止。所以要在Feign中使用断路器, 必须在配置中添加如下配置:(两种方式,根据文件类型不同) feign: hystrix: enabled: true 或 feign.hystrix.enabled=true</p> <h3>3. Hystrix Dashboard (断路器:hystrix 仪表盘)</h3> <p>Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboard可以很高效的现实每个断路器的健康状况。</p> <p>1). 在Feign服务(消费者)的Maven工程的pom.xml中都加入依赖</p> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <pre><code>&lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-starter-hystrix-dashboard&lt;/artifactId&gt; &lt;/dependency&gt;</code></pre> <p>spring-boot-starter-actuator用于手机metric, 支持hystrix.stream。spring-cloud-starter-hystrix-dashboard支持dashboard的UI 2)在Spring Boot启动类上用@EnableHystrixDashboard注解和@EnableCircuitBreaker注解。需要特别注意的是我们之前的Feign服务由于内置断路器支持, 所以没有@EnableCircuitBreaker注解,但要使用Dashboard则必须加,如果不加,Dashboard无法接收到来自Feign内部断路器的监控数据,会报“Unable to connect to Command Metric Stream”错误 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/a6be9ba5ab6f073c2429302555f488dc?showdoc=.jpg" alt="" /></p> <p>3)然后就可以访问/hystrix,这个URL将dashboard指向定义在Hystrix客户端应用中的/hystrix.stream <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/004fbdcf74cf983908086f5aa012207b?showdoc=.jpg" alt="" /> 在dashboard中输入服务的URL:点击 monitor后进入监控界面,访问Feign服务http://192.168.1.33:63006/可以看到监控UI动态变化 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f2d3fcaad7d3b2bc1bcf74025d8e64c7?showdoc=.jpg" alt="" /></p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/46cf457892eea653e4ddbd0cf16d9c8b?showdoc=.jpg" alt="" /></p>

页面列表

ITEM_HTML