Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性、容错性与局部应用的弹性,是一个实现了超时机制和断路器模式的工具类库。
服务降级(fallback):
- 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度。
- 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户。
- 服务降级有很多种降级方式!如开关降级、限流降级、熔断降级,服务熔断属于降级方式的一种。
服务熔断(break):
- 当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
服务限流(flowlimit):
- 只允许系统能够承受的访问量进来,超出的会被丢弃。降级从系统功能优先级角度考虑如何应对故障,而限流则从用户访问压力的角度来考虑如何应对故障。
案例
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
controller
@RequestMapping("/postFeign2")
@HystrixCommand(fallbackMethod = "postFeign2FallBack")
public String postFeign2(){
Persion p = new Persion();
p.setUserName("卢大宝");
int s = 10/0;
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
return p.getUserName();
}
public String postFeign2FallBack(){
return "请稍后重试";
}
完整配置
server:
port: 8083 #端口号
spring:
application:
name: ludb-client-3 #应用名称
eureka:
instance:
prefer-ip-address: true #是否使用IP地址注册(用于eureka展示)
instance-id: ${spring.cloud.client.ip-address}:${server.port} #当前客户端IP:端口
client:
service-url: #设置服务注册中心地址【向注册中心集群注册(注册两台是为了防止第一台宕机还可以挂在第2台上)】
defaultZone: http://ludb:ludb123@localhost:8761/eureka/,http://ludb:ludb123@localhost:8762/eureka/
registry-fetch-interval-seconds: 10 #表示10秒拉取一次服务注册信息,默认30秒
register-with-eureka: true #是否将自己注册到注册中心,默认true
#默认情况下大多数端点都没有通过 http 公开,我们公开了所有端点,以便SpringAdmin访问
management:
endpoint.health.show-details: always
endpoints:
web:
exposure:
include: '*'
#设置feign日志监控级别
logging:
level:
com.eurekaclient3.feign.FeignService: debug
feign:
circuitbreaker:
#开启feign的熔断处理
enabled: true
client:
config:
default:
#connectTimeout 防止由于服务器处理时间长而阻塞调用者。
connectTimeout: 5000
#readTimeout 从连接建立时开始应用,在返回响应时间过长时触发。
readTimeout: 5000
hystrix:
threadpool.default.coreSize: 10 #包裹默认的线程池
threadpool.messageMoveGroup.coreSize: 5 #包裹默认的线程池
command.default.execution.isolation.thread.timeoutInMilliseconds: 10000 #熔断超时
command.messageMoveCommand.execution.isolation.thread.timeoutInMilliseconds: 600000 #熔断超时