前言: 微服务架构应用的特点就是多服务, 而服务层之间通过网络进行通信, 从而支撑起整个应用系统, 所以, 各个微服务之间不可避免的存在耦合依赖关系. 但任何的服务应用实例都不可能永远的健康或网络不可能永远的都相安无事, 所以一旦某个服务或局部业务发生了故障, 会导致系统的不可用, 我们知道当故障累积到一定程度就会造成系统层面的灾害, 也就是级联故障, 也叫雪崩效应, 所以微服务需要在故障累计到上限之前阻止或疏通这些故障以保证系统的稳固安全, 在市面上已经有很多这样的框架来解决这样的问题, 如 Twitter 的 Finagle,Netflix 的 Hystrix 和 Google 的 Stubby 等, 下面就简单介绍下 Hystrix 和 Hystrix 在 SpringCloud 中的应用.
一, Hystrix 简介
Hystrix(https://github.com/Netflix/Hystrix)是由 Netflix 开源的一个延迟和容错库, 用于隔离访问远程系统, 服务或者第三方库, 防止级联失败, 从而提升系统的可用性, 容错性与局部应用的弹性, 是一个实现了超市机制和断路器模式的工具类库.
二, Hystrix 如何解决依赖隔离
1, 包裹请求: 使用 HystrixCommand 包裹对依赖的调用逻辑, 每个命令在独立的线程中执行, 使用了设计模式中的 "命令模式";
2, 跳闸机制: 当某服务的错误率超过一定阈值时, Hystrix 可以自动或者手动跳闸, 停止请求该服务一段时间;
3, 资源隔离: Hystrix 为每个依赖都维护了一个小型的线程池(或者信号量). 如果该线程已满, 则发向该依赖的请求就会被立即拒绝, 而不是排队等候, 从而加速失败判定;
4, 监控: Hystrix 可以近乎实时地监控运行指标和配置的变化, 例如成功, 失败, 超时, 以及被拒绝的请求等;
5, 回退机制: 当请求失败, 超时, 被拒绝, 或当断路器打开时, 执行回退逻辑, 回退逻辑由开发人员自行提供, 如返回一个缺省值;
6, 自我修复: 断路器打开一段时间后, 会自动进入 "半开" 状态, 此时断路器可允许一个请求访问依赖的服务, 若请求成功, 则断路器关闭, 否则断路器转为 "打开" 状态;
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-hystrix</artifactId>
- </dependency>
- @HystrixCommand(fallbackMethod = "getDefaultUser")
- @RequestMapping("/getUser")
- public String getUser() {
- return restTemplate.getForObject("http://client-87/getUser", String.class);
- }
- private String getDefaultUser() {
- System.out.println("熔断, 默认回调函数");
- return "{\"username\":\"admin\",\"age\":\"-1\"}";
- }
- pom.xml:
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-feign</artifactId>
- </dependency>
- server.port=8762
- spring.application.name=client-8762
- # 默认 feign 的 hystrix 为关闭状态
- feign.hystrix.enabled=true
- eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
- package com.cn.feign;
- import org.springframework.cloud.netflix.feign.FeignClient;
- import org.springframework.web.bind.annotation.RequestMapping;
- // 接口类上加入的注解中添加属性 fallback, 指定回调类
- @FeignClient(name = "CLIENT-87",fallback = FeignClientFallback.class)
- public interface UserFeign {
- @RequestMapping("/getUser")
- public String getUser();
- }
- package com.cn.feign;
- import org.springframework.stereotype.Component;
- /**
- * @Description: 回调实现类
- * @Param:
- * @return:
- * @Author:
- * @Date: 2018/6/19
- */
- @Component
- class FeignClientFallback implements UserFeign {
- @Override
- public String getUser() {
- System.out.println("熔断, 默认回调函数");
- return "{\"username\":\"admin\",\"age\":\"-1\"}";
- }
- }
来源: https://www.cnblogs.com/lfalex0831/p/9199459.html