服务隔离Hystrix
Hystrix可以提供服务隔离(限流),服务熔断等功能
服务隔离,可以将不同的请求的使用资源做限制,比如服务中有AB两个接口,如果A接口背大量并发调用,占用了资源,导致B接口的调用由于各种原因(比如连接被用完,线程池被用完,阻塞等问题)会变得不可用,这时就可以使用服务隔离,来避免A接口对其他服务的影响,防止服务雪崩
<!-- maven依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
功能开启注解
//开启断路器功能
@EnableCircuitBreaker
功能使用
@HystrixCommand //在提供出来的接口上添加注解
@Override
public String queryTicket() {
return "queryTicket";
}
Hystrix服务隔离策略
Hystrix提供两种服务隔离策略
execution.isolation.strategy
1-THREAD 线程池隔离策略 独立线程接收请求
2-SEMAPHORE 信号量隔离策略 在调用线程上执行
一般来说,使用线程池更快一点点,并发有一定锁竞争;使用信号量的资源开销更小,毕竟减少了线程池
//信号量注解配置方式
@HystrixCommand(
commandKey = "queryDemo",
groupKey = "querygroup-one",
//降级方法
fallbackMethod = "queryDemoFallback",
commandProperties = {
//最大并发数
@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10"),
//隔离策略
@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),
//超时时间
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
}
)
//线程池
@HystrixCommand(
commandKey = "queryDemo",
groupKey = "querygroup-one",
fallbackMethod = "queryDemoFallback",
commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
},
threadPoolKey = "my-hystrix-pool",
threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "10")}
)
其中 fallbackMethod 参数配置的是服务降级方法
Hystrix 数据监控 dashboard
Hystrix 进行服务熔断时会对调用结果进行统计,比如超时数、bad 请求数、降级数、异常数等等都会有统计,那么统计的数据就需要有一个界面来展示,hystrix-dashboard 就是这么一个展示 hystrix 统计结果的服务。
<!-- maven依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启动类注解
@EnableHystrixDashboard
然后默认打开
http://监控服务的主机端口/hystrix
在界面中默认输入
http://{被监控服务的主机端口}/actuator/hystrix.stream
就可以得到以commonKey为单元的接口监控
如果无法得到监控数据,检查配置中访问控制,暴露服务
management.endpoints.web.exposure.include=*
Hystrix 熔断
服务熔断会在某些情况下,不在接受新的请求;就像电路短路时保险丝熔断;
熔断发生的三个必要条件:
1、有一个统计的时间周期,滚动窗口
相应的配置属性 metrics.rollingStats.timeInMilliseconds
默认 10000 毫秒
2、请求次数必须达到一定数量
相应的配置属性 circuitBreaker.requestVolumeThreshold
默认 20 次
3、失败率达到默认失败率
相应的配置属性 circuitBreaker.errorThresholdPercentage
默认 50%
上述 3 个条件必须全部满足才能开启 hystrix 的熔断功能
如果配置了服务降级方法,则会进入降级方法
熔断器的三个状态:
1、关闭状态 circuit: open
关闭状态时用户请求是可以到达服务提供方的
2、开启状态 circuit: closed
开启状态时用户请求是不能到达服务提供方的,直接会走降级方法
3、半开状态
当 hystrix 熔断器开启时,过一段时间后,熔断器就会由开启状态变成半开状态。半开状态的熔断器是可以接受用户请求并把请求传递给服务提供方的,这时候如果远程调用返回成功,那么熔断器就会有半开状态变成关闭状态,反之,如果调用失败,熔断器就会有半开状态变成开启状态。
Hystrix 功能建议在并发比较高的方法上使用,并不是所有方法都得使用的。部分情况可以用于防网络抖动(也可以用其他方式ribbon或者retry)