一、断路器的概念。
有一条山路,被山洪冲垮了,但是大家都不知道。车辆还是沿着山路前进,直到被挡住了去路才发现此路不通,但是此时路上车太多了,前面的车走不了也退不回来,后面的车还在源源不断的开过来,所有人都挤在山上不能动。后来有人就制作了一个提示牌——“此路不通,车辆绕行”。以后每次山路被冲毁的时候,都把这块牌子立在山脚,来往的车辆一看见这牌子就掉头回去了。
这块牌子就是一个断路器,这条山路就是一个服务组件。平时服务组件正常访问的时候断路器不发挥作用,但是一旦服务组件运转异常,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。断路器的作用就显现出来了,断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。
注意:当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。
二、实例准备
启动四个项目:
- eurekaserver:8081
- webserver:8082/webserver:8083/webserver:8084
- service-feign:8100
- service-ribbon:8090
三、在ribbon使用断路器
1.在serice-ribbon项目的pom.xml文件中引入spring-cloud-starter-hystrix依赖包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
2.启动类ServiceRibbonApplication上加@EnableHystrix标签,开启断路器
@SpringBootApplication @EnableDiscoveryClient //向服务中心注册 @EnableHystrix //开启断路器组件 public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced //开启负载均衡 RestTemplate restTemplate() { return new RestTemplate(); } }
3.改造HelloService,在可能出现异常的方法上加@HystrixCommand标签,并指定熔断方法。这里熔断方法为“helloError”,返回一个简单的字符串提示。
@HystrixCommand(fallbackMethod = "helloError") public String hello(){ return restTemplate.getForObject("http://peoduceserver/hello",String.class); } public String helloError(){ return "不知道为什么就出现这个错误了,可能是服务关闭了"; }
4.启动service-ribbon,浏览器访问http://localhost:8090/hello
5.此时关闭webserver服务,发现断路器起作用了。
四、Feign中使用断路器
1. Fegin自带断路器,默认关闭,需要在appliaction.yml配置文件中打开。
feign: hystrix: enabled: true
2.改造service-fegin工程,在FeignService接口的注解中通过fallback =XXX.class加上指定类即可。
@FeignClient(value = "peoduceserver",fallback = FeignServiceHiHystric.class) public interface FeignService { @RequestMapping(value = "/hello",method = RequestMethod.GET) String helloFeign (); }
3.新建FeignServiceHiHystric类,实现FeginService接口。
@Component public class FeignServiceHiHystric implements FeignService{ @Override public String helloFeign() { return "这里出现错误,大概是熔断器的原因"; } }
4.启动service-fegin项目,访问http://localhost:8100/hello
5.启动webserver的三个实例。再次访问。
另外还有个断路仪表盘(Hystrix Dashboard),不知道是什么操作。暂时不写了。
参考资料:
1.点击打开链接