springcloud之hystrix熔断器-Finchley.SR2版
本篇和大家分享的是springcloud-hystrix熔断器,其主要功能是对某模块调用失败做断路和降级,简单点就当某个模块程序出问题了并达到某阈值就限制后面请求,并降级的方式提供一个默认返回数据。最近在琢磨hystrix源码,琢磨思路写一个自己的简易熔断器,希望大家后期关注。
- springcloud版本说明
- hystrix可用于工作中场景
- springcloud-hystrix运用
- feign客户端使用hystrix
springcloud版本说明
由于市面上其版本比较多,版本不一可能造成了读者尝试时版本问题,所以这里指明当前作者写文章时使用的cloud版本
springboot版本:
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版本:
1 <properties> 2 <java.version>1.8</java.version> 3 <spring-cloud.version>finchley.sr2</spring-cloud.version> 4 </properties>
hystrix可用于工作中场景
实际工作中遇到过这样的情况,我们系统中记录日志的方式是往队列发送数据,然后其他服务消费队列来记录到es中,某一天队列主机ip无法访问了,导致消息一直发不出去,虽然发送队列信息是用的线程,但请求api量太大导致了线程池发送队列失败并一直堆积,影响了整个系统,最终api接口不吐数据。
此刻如果用上hystrix话,即可避免api不吐数据问题,并且通过她的failcallback还能干点其他事情,并入发送邮件或是记录文本日志,防止日志丢失。
springcloud-hystrix运用
首先要明了hystrix一般作用于调用端,更容易理解的是倘若客户机和服务机网络问题造成无法联通,这个时候hystrix作用于客户机就可以暂停对服务机的访问,以此达到对客户端系统的稳定。
首先这里我有eureka注册中心和provider服务,然后创建了个consumer模块,并添加pom信息:
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 用来指定熔断后降级的方法名,降级方法需要和被注解方法返回值一样,保持数据格式一致嘛:
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能够得到如下返回信息:
feign客户端使用hystrix
如果用了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并再次访问接口,能够得到如下想要的信息:
上一篇: 移动APP开发框架盘点
推荐阅读
-
详解SpringCloud微服务架构之Hystrix断路器
-
详解SpringCloud微服务架构之Hystrix断路器
-
SpringCloud之Hystrix使用高级篇
-
springcloud 熔断器Hystrix的具体使用
-
SpringCloud之Hystrix使用高级篇
-
springboot2.0和springcloud Finchley版项目搭建(包含eureka,gateWay,Freign,Hystrix)
-
springcloud 熔断器Hystrix的具体使用
-
SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版
-
SpringCloud之熔断监控Hystrix Dashboard的实现
-
springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版