sentinel基本使用
Sentinel 限流规则:
-
直接:统计当前资源请求,超过阈值直接限流
-
关联:统计与当前资源相关的另一个资源的请求数,触发阈值限流
场景:用户支付时修改订单状态,同时用户查询订单信息,查询和修改操作会争抢数据库的锁,产生竞争。因此当修改订单到达一定的阈值时对查询订单限流
- 链路:统计指定链路访问到本资源的请求数,触发阈值限流
sentinel 默认值标记controller里的方法作为资源,如果要标记其他方法作为资源需使用 @SentinelResource 注解,配置文件添加
spring:
cloud:
sentinel:
web-context-unify: false
流控模式QPS:
快速失败:到达阈值,直接抛出异常
warm up:对于超出阈值的请求同样会抛出异常,但是这种模式阈值会动态变化,从一个较小的值逐渐增加到最大阈值
排队等待:让所有的请求排队先后执行,两个请求时间不能小于指定时长,超过等待时长直接拒绝
热点参数限流:
分别统计参数相同的请求,到达阈值后进行限流
Feign 整合 sentinel
yaml配置:
feign:
sentinel:
enabled: true
-
实现FallbackFactory
/** * @Author: tlj * @Date: 2022/8/25 * @Description: */ @Slf4j @Component public class UserClientFallbackFactory implements FallbackFactory<UserClient> { @Override public UserClient create(Throwable throwable) { return new UserClient() { @Override public UserDetailVo getUserDetail(Long aLong) { return null; } }; } }
-
@FeignClient 指定 fallbackFactory
线程隔离模式:
线程池隔离:在服务调用放指定调用服务的线程池,当线程到达最大数限制则直接拒绝, 需要创建多个线程池
因为每次服务调用都是创建的新线程所以有点如下
-
支持出动超时
-
支持一步调用
但是需要不断的创建线程开销比较大,使用场景,低扇出(依赖的服务比较小)
信号量隔离(sentinel默认): 计数器统计访问资源数
轻量级,无需额外开销。不支持主动调用与异步调用,使用高扇出的场景
熔断降级
由断路器统计服务调用异常,慢的比例,到达一定阈值后会直接拦截该服务的一切请求,服务恢复时会进行放行
授权规则
授权规则可以对调用方的来源做控制,有黑名单和白名单两种方式
黑名单:在黑名单的调用和不允许访问
白名单:在白名单的调用者允许访问
Sentinel 是通过 RequestOriginParser 来获取来源名称,需要自定义业务逻辑,在网关添加请求头
样例:
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
* @Author: tanglj
* @Date: 2022/8/26
* @Description:
*/
@Component
public class HeaderConfig implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
String auth = httpServletRequest.getHeader("auth");
if (Objects.equals(auth, "*******")) {
return "a";
}
return "b";
}
}
发生限流,降级,授权拦截时 都会抛异常到服务调用方,自定义异常需要继承 BlockExceptionHandler 接口,BlockException 具有很多子类,具体如下
具体代码类似于springboot 统一异常处理
sentinel规则保存
sentinel 默认控制台添加的规则是直接保存到内存中。