zoukankan      html  css  js  c++  java
  • 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并再次访问接口,能够得到如下想要的信息:

  • 相关阅读:
    PDF创建及动态转换控件程序包ActivePDF Portfolio
    银行支票和汇票中使用的专用字体MICR E13B条形码控件字体
    可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK
    在网页中编辑报表的报表设计器Stimulsoft Reports Designer.Web报表控件
    dhtmlxScheduler日历日程控件包括天视图,周视图,月视图,年视图和日程表视图
    交互式的Flash图表和仪表控件AnyChart
    Xceed WPF 主题皮肤控件Xceed Professional Themes for WPF详细介绍
    Hibernate的使用
    日志的级别
    动态Web应用工程 前端和后端,如何区分
  • 原文地址:https://www.cnblogs.com/wangrudong003/p/10260456.html
Copyright © 2011-2022 走看看