本篇和你们分享的是springcloud-hystrix熔断器,其主要功能是对某模块调用失败作断路和降级,简单点就当某个模块程序出问题了并达到某阈值就限制后面请求,并降级的方式提供一个默认返回数据。最近在琢磨hystrix源码,琢磨思路写一个本身的简易熔断器,但愿你们后期关注。java
因为市面上其版本比较多,版本不一可能形成了读者尝试时版本问题,因此这里指明当前做者写文章时使用的cloud版本
springboot版本:spring
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>2.0.7.RELEASE</version> 5 <relativePath/> <!-- lookup parent from repository --> 6 </parent>
springcloud版本:api
1 <properties> 2 <java.version>1.8</java.version> 3 <spring-cloud.version>Finchley.SR2</spring-cloud.version> 4 </properties>
实际工做中遇到过这样的状况,咱们系统中记录日志的方式是往队列发送数据,而后其余服务消费队列来记录到es中,某一天队列主机ip没法访问了,致使消息一直发不出去,虽然发送队列信息是用的线程,但请求api量太大致使了线程池发送队列失败并一直堆积,影响了整个系统,最终api接口不吐数据。springboot
此刻若是用上hystrix话,便可避免api不吐数据问题,而且经过她的failcallback还能干点其余事情,并入发送邮件或是记录文本日志,防止日志丢失。网络
首先要明了hystrix通常做用于调用端,更容易理解的是假若客户机和服务机网络问题形成没法联通,这个时候hystrix做用于客户机就能够暂停对服务机的访问,以此达到对客户端系统的稳定。app
首先这里我有eureka注册中心和provider服务,而后建立了个consumer模块,并添加pom信息:ide
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 4 </dependency>
而后在Application入口增长注解 @EnableCircuitBreaker 启动熔断,调用其余服务的地方如service层方法添加注解 @HystrixCommand 达到最小侵入式使用熔断:函数
1 @Override 2 @HystrixCommand(fallbackMethod = "fallbackMethod") 3 public List<MoUser> getList() { 4 //调用provider服务 5 return restTemplate.getForObject("http://PROVIDER/list", List.class); 6 }
注意 fallbackMethod 用来指定熔断后降级的方法名,降级方法须要和被注解方法返回值同样,保持数据格式一致嘛:spring-boot
1 List<MoUser> fallbackMethod() { 2 return new ArrayList<MoUser>() { 3 { 4 add(new MoUser(1, "服务挂了")); 5 } 6 }; 7 }
最后须要在配置文件中增长开启熔断功能(默认是开启状态,因此能够不用配):微服务
1 hystrix: 2 metrics: 3 enabled: true
此时当eureka,provider,consumer依次启动后,访问consumer接口可以正常返回数据,把provider服务停了,而后再访问consumer可以获得以下返回信息:
若是用了springcloud集成的注册中心(eureka,console等),一般就会用到feign客户端,由于springcloud是基于http的微服务,实际原理其实仍是http去调用接口地址这有区别于rpc方式,feign中集成了hystrix,因此她很方便不用本身在写一套,先在consumer中加入feign依赖:
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-feign</artifactId> 4 <version>1.4.6.RELEASE</version> 5 </dependency>
Application入口加 @EnableFeignClients 注解,在consumer接口上增长FeignClient,以下:
1 @FeignClient(name = "PROVIDER",fallbackFactory = UserServiceFallback.class) 2 public interface IUserService { 3 @GetMapping("/list") 4 List<MoUser> getList(); 5 }
下面简单接受feign构造函数的参数:
name:服务提供这application服务名
fallbackFactory:hystrix降级回调类
这里咱们须要有一个自定义降级回调类,其实现 FallbackFactory 代码以下:
1 @Component 2 public class UserServiceFallback implements FallbackFactory<IUserService> { 3 4 @Override 5 public IUserService create(Throwable throwable) { 6 return new IUserService() { 7 @Override 8 public List<MoUser> getList() { 9 return new ArrayList<MoUser>() { 10 { 11 add(new MoUser(0, "神牛-fallback:" + 12 throwable.toString())); 13 } 14 }; 15 } 16 }; 17 } 18 }
要自定义降级返回接口的信息主要是里面实现了provider服务提供的IUserService接口里面的方法,增长降级返回的信息,这里能够接受 Throwable 致使降级的错误信息,最后须要咱们配置启动feign的hystrix
1 feign: 2 hystrix: 3 enabled: true
有了上面的调整后,重启consumer并再次访问接口,可以获得以下想要的信息: