Hystrix 熔断器

Hystrix 熔断器

薛定谔的汪

最近往返北京-邯郸较频繁,有点累,好久没集中学习了。今天周六来公司加班,配合测试联调,趁着这个时间正好学习 SpringCloud-Netflix 下 Hystrix 熔断器的使用。

背景

之前说过,在分布式、集群服务环境中,通常会有多个服务层之间调用,如果某个服务出现故障,进而导致其他服务级联实效,甚至导致整个系统不可用。

Hystrix 熔断器

Hystrix 熔断器类似电路中的保险丝,或者开关。当检测到某个服务有问题时(默认20s 内失败5次),熔断器会强制以后的其他调用快速失败,不再访问此服务,向调用方返回一个符合预期的、可处理的备选响应(FallBack,可以是默认值也可以是缓存中的值),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

Hystrix 熔断器也具有自动检测恢复的机制,保证服务正常后仍可继续被调用。

Fegin Hystrix

新建一个 SpringBoot 项目 eureka-consumer-hystrix

Fegin 整合了 Ribbon 和 Hystrix,默认关闭了 Hystrix,需要开启。

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server:
port: 10000
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
spring:
application:
name: customer
#开启 Hystrix 支持
feign:
hystrix:
enabled: true

FeginHystrix 熔断器

1
2
3
4
5
6
7
8
@Component
public class FeginHystrix implements FeginClient {
@Override
public String hello() {
//目标服务熔断后,返回“failed”
return "failed";
}
}

FeignClient 接口

1
2
3
4
5
6
7
//name=调用的服务名,fallback:指定服务熔断时调用的熔断器
@FeignClient(name = "provider",fallback = FeginHystrix.class)
public interface FeginClient {

@GetMapping("hello")
String hello();
}

测试

启动 eureka-server 注册中心、eureka-provider 服务提供者、启动 eureka-consumer 服务消费者,浏览器输入 http://localhost:10000/hello

发现可以正常返回内容:hello! Yakai! from provider

关闭服务提供者eureka-provider,再次请求http://localhost:10000/hello

页面返回:failed,说明熔断器生效。

  • Title: Hystrix 熔断器
  • Author: 薛定谔的汪
  • Created at : 2018-06-09 18:20:16
  • Updated at : 2023-11-17 19:37:36
  • Link: https://www.zhengyk.cn/2018/06/09/springcloud/hystrix/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
Hystrix 熔断器