@SpringCloudApplication 注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
一个注解引用三个注解,标示这是springboot应用 注册中心客户端、开启熔断器。
业务场景:用户中心需要调用用户服务、商品服务、优惠券服务等等,打开一次用户中心页面需要请求3个服务接口。
服务雪崩效应
用户中心依赖用户服务、商品服务、优惠券等服务。大流量打过来,用户中心不断的创建线程,远程调用三个服务。当优惠券服务(也可以其它服务)不可用时,用户中心创建线程调用优惠券服务,线程hang住一阵,直到timeout。这些阻塞的线程导致应用用户中心服务器线程资源耗尽,应用挂掉,假死。
复述一遍:依赖的下游服务不可用,在大流量环境下导致前端服务都不可用。
hystrix 提供解决方案可以解决服务雪崩问题。提供了
- 服务熔断
- 降级
- 限流
- 资源隔离
- 运维监控
服务熔断
服务熔断也被称为服务过载保护。
回到上一个场景,用户中心远程调用优惠券服务,调用失败达到一定次数后断路器打开。用户中心将不发起远程调用,直接提示优惠券服务异常这样的错误信息。返回错误的响应。一段时间后,断路器会变成半开状态,如果下一个请求成功了,就关闭断路器,反之就开启断路器。
----- 这是我对服务熔断的理解,这里的一定次数在hystrix 框架中是明确的可控制的。
hystrix 关键的三个参数
hystrix.command.default.circuitBreaker.requestVolumeThreshold(当在配置时间窗口内达到此数量的失败后,进行短路。默认20个)简言之,10s内请求失败数量达到20个,断路器就会变成打开状态。
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds(短路多久以后开始尝试是否恢复,默认5s)
hystrix.command.default.circuitBreake.errorThresholdPercentage(出错百分比阈值,当达到此阈值后,开始短路。默认50%)