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