1,Spring Cloud Hystrix是什么
spring cloud Hystrix是netflix服务套件中的一部分。spring cloud基于Netflix Hystrix做了封装。Hystrix是用于服务保护,避免服务雪崩效应(个别服务的不可用,导致整体依赖该服务的不可用,进而扩大到整个系统不可用)。避免服务雪崩效应的方式大体有如下处理:
服务降级:当系统访问高峰期,为了确保高峰期重要、核心服务的正常运行,拒绝或者关闭不重要的服务,将资源用于重要核心服务。当拒绝(不完全关闭,可以允许少量访问)或者关闭服务时,对被降级服务的请求直接在客户端调用本地方法返回,不实际执行调用。(比如Spring Cloud环境下,关闭了服务,则在Eureka注册中心,该服务已经不存在,Hystrix会直接使访问直接调用对应本地fallback方法返回)。
服务熔断:当某个服务异常或者超时等达到设定值,则关闭对该服务的调用,直接调用本地方法返回,避免服务堆积等引起级联的服务奔溃。Hystrix监控在指定时间内,服务异常达到设定值,则自动熔断服务,在设定时间内,不调用被熔断的服务,直接调用本地fallback方法返回;在设定时间段结束后,进入半开启状态,部分尝试调用该服务,如果服务正常,则开启,否则再次关闭。
服务限流:由于服务的资源环境有限,为避免大量的访问,导致服务堆积奔溃,采用限制访问的方式,避免将所有的请求都直接堆积到该服务。(服务限流,也可以通过API网关Zuul实现,自定义ZuulFilter来实现限流)
2,Hystrix 熔断器
Hystrix熔断器在客户端实现,在Spring Cloud中,通过Feign整合Hystrix,实现服务降级、熔断、限流等功能。启动类在Feign的基础上不需要再特殊处理。
1,pom文件配置
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- hystrix 单独hystrix配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2,yaml配置:
feign:
hystrix:
enabled: true
# 配置hystrix的参数
hystrix:
#配置线程池大小、缓存区大小、缓冲区超限阈值
threadpool:
default:
coreSize: 10
maxQueueSize: 100
queueSizeRejectionThreshold: 2
#配置执行策略
execution:
#超时打开
timeout:
enabled: true
# 资源隔离模式,默认thread。还有semaphore(信号量)
isolation:
strategy: THREAD
thread:
#超时时间、超时中断线程、取消时中断线程、
timeoutInMilliseconds: 1000
interruptOnTimeout: true
command:
default:
fallback:
# 开启服务降级
enabled: true
circuitBreaker:
# 开启熔断,关闭强制开启、关闭熔断
enabled: true
forceOpen: false
forceClosed: false
#窗口期内,至少10次请求熔断器才发生作用
requestVolumeThreshold: 10
#错误率达到50%,熔断器断开
errorThresholdPercentage: 50
#熔断5s后,进入半打开状态
sleepWindowInMilliseconds: 5000
#度量策略
metrics:
rollingStats:
#度量窗口时间周期5s、度量桶数量、
timeInMilliseconds: 5000
numBuckets: 10
4,客户端服务调用接口FallbackFactory
@Component
public class ClientServiceFallbackFactory implements FallbackFactory<ClientService>
{
@Override
public ClientService create(Throwable throwable)
{
return new ClientService() {
@Override
public String getInfo(long id)
{
return "服务降级了";
}
};
}
}
5,Feign客户端引入ClientServiceFallbackFactory
@FeignClient(value = "SERVICE-PROVIDER",fallbackFactory=ClientServiceFallbackFactory.class)
public interface ClientService
{
public String getInfo(long id);
}
3,总结
Spring Cloud Hystrix可以有效避免在复杂的分布式集群环境下的大面积服务瘫痪的问题,只需要配置即可使用。