本篇和大家分享的是springcloud-hystrix熔断器,其主要功能是对某模块调用失败做断路和降级,简单点就当某个模块程序出问题了并达到某阈值就限制后面请求,并降级的方式提供一个默认返回数据。最近在琢磨hystrix源码,琢磨思路写一个自己的简易熔断器,希望大家后期关注。

  • springcloud版本说明
  • hystrix可用于工作中场景
  • springcloud-hystrix运用
  • feign客户端使用hystrix

springcloud版本说明

由于市面上其版本比较多,版本不一可能造成了读者尝试时版本问题,所以这里指明当前作者写文章时使用的cloud版本
springboot版本:

     <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0..RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

springcloud版本:

     <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>

hystrix可用于工作中场景

实际工作中遇到过这样的情况,我们系统中记录日志的方式是往队列发送数据,然后其他服务消费队列来记录到es中,某一天队列主机ip无法访问了,导致消息一直发不出去,虽然发送队列信息是用的线程,但请求api量太大导致了线程池发送队列失败并一直堆积,影响了整个系统,最终api接口不吐数据。

此刻如果用上hystrix话,即可避免api不吐数据问题,并且通过她的failcallback还能干点其他事情,并入发送邮件或是记录文本日志,防止日志丢失。

springcloud-hystrix运用

首先要明了hystrix一般作用于调用端,更容易理解的是倘若客户机和服务机网络问题造成无法联通,这个时候hystrix作用于客户机就可以暂停对服务机的访问,以此达到对客户端系统的稳定。

首先这里我有eureka注册中心和provider服务,然后创建了个consumer模块,并添加pom信息:

         <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后在Application入口增加注解 @EnableCircuitBreaker 启动熔断,调用其他服务的地方如service层方法添加注解 @HystrixCommand 达到最小侵入式使用熔断:

     @Override
@HystrixCommand(fallbackMethod = "fallbackMethod")
public List<MoUser> getList() {
//调用provider服务
return restTemplate.getForObject("http://PROVIDER/list", List.class);
}

注意 fallbackMethod 用来指定熔断后降级的方法名,降级方法需要和被注解方法返回值一样,保持数据格式一致嘛:

     List<MoUser> fallbackMethod() {
return new ArrayList<MoUser>() {
{
add(new MoUser(, "服务挂了"));
}
};
}

最后需要在配置文件中增加开启熔断功能(默认是开启状态,所以可以不用配):

 hystrix:
metrics:
enabled: true

此时当eureka,provider,consumer依次启动后,访问consumer接口能够正常返回数据,把provider服务停了,然后再访问consumer能够得到如下返回信息:

feign客户端使用hystrix

如果用了springcloud集成的注册中心(eureka,console等),通常就会用到feign客户端,因为springcloud是基于http的微服务,实际原理其实还是http去调用接口地址这有区别于rpc方式,feign中集成了hystrix,所以她很方便不用自己在写一套,先在consumer中加入feign依赖:

         <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4..RELEASE</version>
</dependency>

Application入口加 @EnableFeignClients 注解,在consumer接口上增加FeignClient,如下:

 @FeignClient(name = "PROVIDER",fallbackFactory = UserServiceFallback.class)
public interface IUserService {
@GetMapping("/list")
List<MoUser> getList();
}

下面简单接受feign构造函数的参数:
name:服务提供这application服务名
fallbackFactory:hystrix降级回调类
这里我们需要有一个自定义降级回调类,其实现 FallbackFactory 代码如下:

 @Component
public class UserServiceFallback implements FallbackFactory<IUserService> { @Override
public IUserService create(Throwable throwable) {
return new IUserService() {
@Override
public List<MoUser> getList() {
return new ArrayList<MoUser>() {
{
add(new MoUser(, "神牛-fallback:" +
throwable.toString()));
}
};
}
};
}
}

要自定义降级返回接口的信息主要是里面实现了provider服务提供的IUserService接口里面的方法,增加降级返回的信息,这里可以接受 Throwable 导致降级的错误信息,最后需要我们配置启动feign的hystrix

 feign:
hystrix:
enabled: true

有了上面的调整后,重启consumer并再次访问接口,能够得到如下想要的信息:

springcloud之hystrix熔断器-Finchley.SR2版的更多相关文章

  1. springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

    新年第一篇博文,接着和大家分享springcloud相关内容:本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的 ...

  2. springcloud之config配置中心-Finchley.SR2版

    本篇和大家分享的是springcloud-config配置中心搭建,写到这里突然想起自己曾今开源过基于Redis发布订阅编写的一个配置中心,刚看了git星数有点少哈哈,这里顺势发个连接欢迎大侠们点赞: ...

  3. Spring-Cloud之Hystrix熔断器-5

    一.在分布式系统中,服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务会出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞 Hystrix是Netflix 公司开源的一个项目,它提供了 ...

  4. SpringCloud 之 Hystrix熔断器

    Hystrix  Hystrix请求熔断与服务降级 Hystrix线程隔离&请求缓存&请求合并

  5. springcloud(八)-Hystrix熔断器

    雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者” ...

  6. Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】

    Spring Cloud(四):服务容错保护 Hystrix[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  分布式系统中经常会出现某个基础服务不可用 ...

  7. SpringCloud学习(6)——Hystrix熔断器

    分布式系统面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系, 每个依赖关系在某些时刻不可避免的失败. 服务雪崩效应 多个微服务调用的时候, 假设微服务A调用微服务B和微服务C, 微服务B和 ...

  8. 5.Spring Cloud初相识-------Hystrix熔断器

    前言: 1.介绍Hystrix 在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情.Hy ...

  9. 高并发场景-请求合并(一)SpringCloud中Hystrix请求合并

    背景 在互联网的高并发场景下,请求会非常多,但是数据库连接池比较少,或者说需要减少CPU压力,减少处理逻辑的,需要把单个查询,用某些手段,改为批量查询多个后返回. 如:支付宝中,查询"个人信 ...

随机推荐

  1. 通过配置tomcat实现项目免部署

    对于一些比较大的项目,比如说使用了EXTJS这种重量级UI框架的项目,在部署的时候,eclipse会卡崩的,所以可以通过配置tomcat来实现免部署,直接运行即可: 首先找到tomcat的localh ...

  2. Javascript中没有块级作用域(模仿)

    在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域).而在javascript中则没有块级作用域,首先来看一段代码: function test(){ for(var ...

  3. requests+selenium==requestium模块介绍

    有时,你可能会在网上实现一些自动化操作.比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要.Python提供了非常优秀的Requests库可以辅助进行这些操作.可惜, ...

  4. Python 函数式编程和面向对象编程

    函数式编程 函数:function.函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式.函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同   高阶函数 ...

  5. conn.go 源码阅读

    ),         Conn: conn,     }     return k, v } // 返回远程节点地址 func (self *Connect) Addr() string {      ...

  6. BZOJ_2809_[Apio2012]dispatching_可并堆

    BZOJ_2809_[Apio2012]dispatching_可并堆 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称 ...

  7. Nginx重新编译添加新模块

    找到nginx的安装包目录,如果没有的话去官网重新下载 查看ngixn版本极其编译参数 /usr/local/nginx/sbin/nginx -V 进入nginx源码目录,重新设置nginx ./c ...

  8. 【功耗测试环境预置自动化脚本开发】【切换wifi模式为siso模式】【用到方法*args】

    import os,reimport logginglogging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[ ...

  9. eclipse中去掉py文件中烦人的黄色弹框

    eclipse中写py文件,当鼠标点击在参数上时总是出现黄线的弹框,影响人操作,感觉特别烦,如下: 解决方案: windows--preferences--hover--pydev--hover取消选 ...

  10. maven创建web报错Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:maven-compiler-plugin:3.5.1:runtime Cause: error in opening zip file

    Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:m ...