详解SpringCloud微服务架构之Hystrix断路器

 更新时间:2018年01月10日 14:54:14   作者:Bob_F  
本篇文章主要介绍了详解SpringCloud微服务架构之Hystrix断路器,Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互,有兴趣的可以了解一下

一:什么是Hystrix

在分布式环境中,许多服务依赖项中的一些将不可避免地失败。Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止其间的级联故障以及提供回退选项,从而提高系统的整体弹性。

Hystrix旨在执行以下操作

1:对通过第三方客户端库访问(通常通过网络)的依赖关系提供保护并控制延迟和故障。

2:隔离复杂分布式系统中的级联故障。

3:快速发现故障,尽快恢复。

4:回退,尽可能优雅地降级。

5:启用近实时监控,警报和操作控制。

二:为什么需要Hystrix?

大型分布式系统中,一个客户端或者服务依赖外部服务,如果一个服务宕了,那么由于我们设置了服务调用系统超时时间,势必会影响相应时间,在高并发的情况下大多数服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性。

(图片官方图片)

当一切都健康时,请求可以看起来像这样

当许多后端服务系统中的一个宕掉时,整个用户请求:

如果多个客户端调用同一个异常服务的时候,出现的情况是:

 

三:Hystrix解决什么问题?

分布式架构中的应用程序具有几十个依赖关系,每个依赖关系在某个时刻将不可避免的出现异常。如果应用程序不与这些外部故障隔离,则可能出现线程池阻塞,引起系统雪崩。

例如,对于依赖30个服务的应用程序,每个服务的正常运行时间为99.99%,您可以:

99.99%的30次方 = 99.7%正常运行时间

0.3%的10亿次请求= 3,000,000次故障

2+小时宕机/月,即使所有依赖关系正常运行时间。

当使用Hystrix进行熔断后,每个依赖关系彼此隔离了,限制了当发生延迟时的阻塞。

 

四:Hystrix结合Feign使用

创建一个工程eureka_feign_hystrix_client

pom.xml文件内容

<dependencies>

    <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-feign</artifactId>

    </dependency>

    <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-eureka</artifactId>

    </dependency>

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-actuator</artifactId>

    </dependency>

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-test</artifactId>

      <scope>test</scope>

    </dependency>

  </dependencies>

  <dependencyManagement>

    <dependencies>

      <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-dependencies</artifactId>

        <version>Brixton.SR5</version>

        <type>pom</type>

        <scope>import</scope>

      </dependency>

    </dependencies>

  </dependencyManagement> 

创建启动文件

FeignHystrixApplication

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignHystrixApplication {
  public static void main(String[] args) {

    SpringApplication.run(FeignHystrixApplication.class, args);
  }
} 

UserClient类

@FeignClient(value = "biz-service-0",fallback = UserClientHystrix.class)
public interface UserClient {
  @RequestMapping(method = RequestMethod.GET, value = "/getuser")
  public User getuserinfo();
  @RequestMapping(method = RequestMethod.GET, value = "/getuser")
  public String getuserinfostr();
  @RequestMapping(method = RequestMethod.GET, value = "/info")
  public String info();
} 


创建熔断类UserClientHystrix

@Service
public class UserClientHystrix implements UserClient {

   @Override
  public User getuserinfo() {
    throw new NullPointerException(" User getuserinfo() 服务不可用。。");

  }

  @Override
  public String getuserinfostr() {
    return " UserClientHystrix getuserinfostr() is fallback 服务不可用。。";

  }

  @Override
  public String info() {
    return " UserClientHystrix info() is fallback 服务不可用。。";

  }
} 

当网络出现异常的时候或直接跳转到这里实现类里面

创建action类

UserController

@Autowired
  UserClient userClient;

  @RequestMapping(value = "/getuserinfo", method = RequestMethod.GET)
  public User getuserinfo() {
    return userClient.getuserinfo();
  }

  @RequestMapping(value = "/getuserinfostr", method = RequestMethod.GET)
  public String getuserinfostr() {
    return userClient.getuserinfostr();
  }

  @RequestMapping(value = "/info", method = RequestMethod.GET)
  public String info() {
    return userClient.info();
  } 

先启动:eureka_register_service(注册中心)工程

然后运行我们写好的FeignHystrixApplication

这个时候我们明显发现没有运行biz-service-0 服务,那么我们 打开 http://127.0.0.1:8005/getuserinfostr

出现

UserClientHystrix getuserinfostr() is fallback 服务不可用。。

这个就是我们自定义的熔断返回结果

如果不用熔断 页面会出现这个

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Mar 22 14:32:21 CST 2017

There was an unexpected error (type=Internal Server Error, status=500).

getuserinfo failed and fallback failed. 

代码地址:https://github.com/zhp8341/SpringCloudDemo

本人也看了一些Hystrix相关原理,由于没有全部看完所以暂时没有写上去,本文是结合Feign使用和学习。

有兴起的可以看下官方的Hystrix很详细,就是看起来有点费劲,

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot使用AOP记录接口操作日志详解

    SpringBoot使用AOP记录接口操作日志详解

    这篇文章主要为大家详细介绍了SpringBoot使用AOP记录接口操作日志,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringCloud实现服务调用feign与熔断hystrix和网关gateway详细分析

    SpringCloud实现服务调用feign与熔断hystrix和网关gateway详细分析

    这篇文章主要介绍了SpringCloud实现服务调用feign与熔断hystrix和网关gateway,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • 详解Spring关于@Resource注入为null解决办法

    详解Spring关于@Resource注入为null解决办法

    这篇文章主要介绍了详解Spring关于@Resource注入为null解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • mybatis对传入基本类型参数的判断方式

    mybatis对传入基本类型参数的判断方式

    这篇文章主要介绍了mybatis对传入基本类型参数的判断方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅析java程序中hibernate的应用总结

    浅析java程序中hibernate的应用总结

    hibernate可以理解为是一个中间件它负责把java程序的sql语句接收过来发送到数据库,而数据库返回来的信息hibernate接收之后直接生成一个对象传给java
    2013-07-07
  • Java使用Log4j记录日志的方法详解

    Java使用Log4j记录日志的方法详解

    log4j是一个常用的日志框架,用于记录应用程序的执行过程或异常等记录在日志文件中。本文将利用Log4j记录日志,感兴趣的可以了解一下
    2022-03-03
  • java通过URLClassLoader类加载器加载外部jar代码示例

    java通过URLClassLoader类加载器加载外部jar代码示例

    ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见,下面这篇文章主要给大家介绍了关于java通过URLClassLoader类加载器加载外部jar的相关资料,需要的朋友可以参考下
    2024-01-01
  • 使用Logback设置日志级别

    使用Logback设置日志级别

    这篇文章主要介绍了使用Logback设置日志级别的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java垃圾回收之分代收集算法详解

    Java垃圾回收之分代收集算法详解

    今天小编就为大家分享一篇关于Java垃圾回收之分代收集算法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Java连接MySQL数据库实例

    Java连接MySQL数据库实例

    这篇文章介绍了Java连接MySQL数据库实例的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论