spring-cloud hystrix(三)
作用:
作为保护机制,在服务宕机,网络等原因引起的服务不可用时,触发服务降级或者熔断以保证其他服务的可用。从而解决微服务的”雪崩效应“
服务降级原理:
以下举例说明:
在未使用hystrix时,假设tomcat的线程池中有1000条线程提供连接。当某个微服务挂掉后,访问该微服务的请求连接就被挂起,
逐渐占满所谓连接数,从而导致整个微服务无连接可用也就导致整个系统不可用了。
hystrix 给出以下方案:
1、线程池隔离:给每个微服务提供一定数量的线程,每个微服务自身拥有各自的线程池用以维护自身被分配的线程。
那么该微服务宕机后,连接数量就算被占满也仅仅是分配的那几个,从而不会影响其他微服务。
2、超时返回 : 如果连接超过一定时长则立即返回一个友好的错误提示从而解决上宕机的微服务连接数被占满而无法访问的问题。
实现步骤
1、在服务的调用方增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、在服务调用方的启动类上加注解
@EnableCircuitBreaker
@SpringCloudApplication //该注解1顶3 (@EnableCircuitBreaker ,@SpringBootApplication,@EnableDiscoveryClient)
3、在对应类上增加通用的错误返回方法以及配置错误方法
@DefaultProperties(defaultFallback = "fallBack") //使用通用的方法作为错误的返回
public class UserController {
public String fallBack(){
return "服务异常";
}
}
4、在application.yml 中添加超时时长(可选 默认2000ms)
#设置超时时长 为3S
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
熔断器启动原理:
![](https://app.yinxiang.com/shard/s47/res/a620b0e8-4ef9-4721-ba6c-564c000e775b/rongduanqi.png)
根据上图:
closed : 熔断器关闭状态,服务正常,请求正常访问。
open : 表示熔断器打开访问请求立即返回错误消息
half open : 半开熔断器,放过一部分请求尝试访问,如果访问失败则返回到open 状态,如果成功则熔断器关闭
机制理解:判断最近的20次请求失败率(请求超时)是否超过50%,一旦超过则熔断器打开,当再次有请求访问时则立即返回错误,
并且在此刻启动定时器计算5S,5S后熔断器转换到半开状态尝试放开部分请求通过去测试请求是否正常,如果请求依然失败返回open 状态,再次进入5S计时直到请求成功,熔断器关闭。
服务降级与服务熔断的区别: 见下图
熔断与服务降级的区别:
小红常用A号码拨打电话,发现A号码无法正常拨通,采用备用号码B拨打电话.这个过程就叫做降级(主逻辑失败采用备用逻辑的过程).
打完电话后,小红又碰到了一些问题,于是他又尝试用A号码拨打,这一次又没有能够拨通,所以她又用号码B拨号,就这样连续的经过了几次在拨号设备选择上的“降级”,小红觉得短期内A号码可能因为运营商问题无法正常拨通了,所以决定近期直接用B号码进行拨号,这样的策略就是熔断(A号码因短期内多次失败,而被暂时性的忽略,不再尝试使用)。
打完电话后,小红又碰到了一些问题,于是他又尝试用A号码拨打,这一次又没有能够拨通,所以她又用号码B拨号,就这样连续的经过了几次在拨号设备选择上的“降级”,小红觉得短期内A号码可能因为运营商问题无法正常拨通了,所以决定近期直接用B号码进行拨号,这样的策略就是熔断(A号码因短期内多次失败,而被暂时性的忽略,不再尝试使用)。
https://files.cnblogs.com/files/lanSeGeDiao/springCloud-demo.zip以上是springCloud的DEMO例子 请自行复制路径到浏览器