Hystrix断路器在微服务架构SpringCloud场景中应用详解

Hystrix是什么?

在分布式环境中,许多服务依赖项中的一些将不可避免地失败。Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止其间的级联故障以及提供回退选项,从而提高系统的整体弹性。
文章篇幅过长。感兴趣的朋友可以提前收藏加关注,后续会有类似文章更新。分享一下个人整理的架构进阶学习路线以及学习资料,需要的朋友可以自行领取:Java高级架构学习资料分享+架构师成长之路​
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

<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 服务,
出现
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. 

为了不影响大家的阅读效果,文章不再编写过长篇幅。个人整理了更多资料以PDF文件的形式分享给大家,需要查阅的程序员朋友可以来免费领取。还有我的学习笔记PDF文件也免费分享给有需要朋友!Java高级架构学习资料分享+架构师成长之路​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章