在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

熔断状态机3个状态:
-
Closed:关闭状态,所有请求都正常访问。
-
Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
-
Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
开启熔断
启动类上添加 @EnableCircuitBreaker (@SpringBootApplication,@EnbaleDiscoveryClient,@EnableCircuitBreaker 可用一个组合注解 @SpringCloudApplication)
服务的降级
@Controller @RequestMapping("consumer/user") public class UserController { @Autowired private RestTemplate restTemplate; @GetMapping @ResponseBody @HystrixCommand(fallbackMethod = "queryUserByIdFallBack") //用来声明一个降级逻辑的方法 public String queryUserById(@RequestParam("id") Long id) { String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class); return user; } public String queryUserByIdFallBack(Long id){ return "请求繁忙,请稍后再试!"; } }
-
-
@HystrixCommand:在方法上直接使用该注解,使用默认的剪辑方法。
-
@Controller @RequestMapping("consumer/user") @DefaultProperties(defaultFallback = "fallBackMethod") // 指定一个类的全局熔断方法 public class UserController { @Autowired private RestTemplate restTemplate; @GetMapping @ResponseBody @HystrixCommand // 标记该方法需要熔断 public String queryUserById(@RequestParam("id") Long id) { String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class); return user; } /** * 熔断方法 * 返回值要和被熔断的方法的返回值一致 * 熔断方法不需要参数 * @return */ public String fallBackMethod(){ return "请求繁忙,请稍后再试!"; } }
设置超时
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 6000 # 设置hystrix的超时时间为6000ms
配置熔断策略
circuitBreaker.requestVolumeThreshold=10 circuitBreaker.sleepWindowInMilliseconds=10000 circuitBreaker.errorThresholdPercentage=50
-
-
errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%
-
Feign 上使用
Feign 本身支持Hystrix,不需要额外引入依赖。
配置文件开启
feign: hystrix: enabled: true
client包下创建impl包,包下创建熔断实现类,实现自接口
@FeignClient(value="API‐base",fallback = LabelClientImpl.class)
@Component
public class LabelClientImpl implements LabelClient {
@Override public Result findById(String id) {
return new Result(false, StatusCode.ERROR,"熔断器启动了");
} }