限流降级熔断确保服务高可用的必要手段,Spring Cloud Hystrix和Spring Cloud sentinel是Spring Cloud完成此功能的两大组件,这两大组件以SDK的方式提供。
基本原理
限流的方法有滑动窗口、漏桶、令牌桶等算法。
- 滑动窗口有静态滑动窗口和动态滑动窗口,其中静态滑动窗口,如果流量都集中在窗口交接处,也会产生不平均现象。而动态滑动窗口实现比较复杂。
- 漏桶法。固定桶大小,如果桶已满,则流入桶的请求将会被丢弃。可以应对瞬间高流量。
- 令牌桶。以一个固定的速度产生令牌,服务请求如能拿到令牌则可以继续处理,否则就丢弃。
这三种方法是限流的主要算法。
熔断降级主要判断依据为并发线程数和调用时间,基本规则是异常数、异常比例、调用平均时间。
Hystrix和Sentinel都提供了基本的限流降方式。
Hystrix
在Netflix套件中,Openfeign组件集成了hystrix组件,见如下定义
public @interface FeignClient {
@AliasFor("name")
String value() default "";
String contextId() default "";
@AliasFor("value")
String name() default "";
/** @deprecated */
@Deprecated
String qualifier() default "";
String[] qualifiers() default {};
String url() default "";
boolean decode404() default false;
Class<?>[] configuration() default {};
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
String path() default "";
boolean primary() default true;
}
在https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign-circuitbreaker中1.5和1.6有相关介绍,其中OpenFeign的fallback就是降级实现。
sentinel
sentinel的实现是FlowRule和DegradeRule两个实现,具体使用参见
https://www.jianshu.com/p/f1f052413d1c
其中几个块的关系
服务启动时从nacos中拉取规则,并且在运行过程中可以通过nacos随时修改规则,通过sentinel Dashboard查看限流熔断情况。
另外sentinel提供了集群限流功能。
小结
在程序设计的时候,我们一般会从算法角度考虑程序,即空间复杂度和时间复杂度,一般情况下,在高并发系统,都会考虑空间复杂度,如上漏桶设计,就是以时间换空间的一种设计方式。例如说处理消息,使用blockingqueue限制队列大小,消息从MQ拉去,如果blockingqueue满则阻塞,处理的速率就看服务的处理能力了。通过这种限流的方式,有效的限制了空间大小,让服务始终保持在一个平稳高效的状态。
网友评论