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

作者:Bob_F 时间:2022-03-05 05:28:56 

一:什么是Hystrix

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

Hystrix旨在执行以下操作

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

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

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

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

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

二:为什么需要Hystrix?

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

(图片官方图片)

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

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

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

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

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

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

三:Hystrix解决什么问题?

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

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

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

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

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

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

详解SpringCloud微服务架构之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很详细,就是看起来有点费劲,

来源:http://www.cnblogs.com/xiaojunbo/p/7094438.html

标签:Spring,Cloud,Hystrix
0
投稿

猜你喜欢

  • MyBatis-Plus实现多数据源的示例代码

    2023-11-11 12:58:11
  • SpringBoot2.x 参数校验问题小结

    2023-05-22 02:21:22
  • spring boot中使用@Async实现异步调用任务

    2023-04-25 13:35:18
  • IDEA中java断言assert语法及使用

    2022-12-28 21:07:00
  • spring获取bean的源码解析

    2023-10-11 22:15:43
  • java实现FTP文件上传与文件下载

    2023-08-16 08:28:38
  • Java增加自定义注解进行校验入参详解

    2023-01-05 13:34:25
  • Java下http下载文件客户端和上传文件客户端实例代码

    2021-09-09 16:52:11
  • Java Eclipse进行断点调试的方法

    2023-06-14 06:31:27
  • 设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解

    2022-12-27 12:56:57
  • mybatis查询返回Map<String,Object>类型的讲解

    2022-12-25 02:07:38
  • 关于MyBatis plus条件构造器的逐条详解

    2021-10-06 07:31:51
  • Java虚拟机JVM性能优化(三):垃圾收集详解

    2021-10-16 10:38:49
  • unity里获取text中文字宽度并截断省略的操作

    2023-11-02 07:48:52
  • Java matches类,Pattern类及matcher类用法示例

    2022-02-21 22:39:52
  • Java IO异常如何处理详析

    2023-12-04 21:51:29
  • myBatis实现三 级嵌套复杂对象的赋值问题

    2023-11-23 06:42:26
  • 详解java 三种调用机制(同步、回调、异步)

    2023-11-25 07:59:57
  • java操作elasticsearch的案例解析

    2021-06-27 19:17:13
  • android异步消息机制 从源码层面解析(2)

    2023-08-06 15:55:39
  • asp之家 软件编程 m.aspxhome.com