sentinel基本使用

Sentinel 限流规则:

  • 直接:统计当前资源请求,超过阈值直接限流

  • 关联:统计与当前资源相关的另一个资源的请求数,触发阈值限流

场景:用户支付时修改订单状态,同时用户查询订单信息,查询和修改操作会争抢数据库的锁,产生竞争。因此当修改订单到达一定的阈值时对查询订单限流

  • 链路:统计指定链路访问到本资源的请求数,触发阈值限流

sentinel 默认值标记controller里的方法作为资源,如果要标记其他方法作为资源需使用 @SentinelResource 注解,配置文件添加

spring:
  cloud:
    sentinel:
      web-context-unify: false

流控模式QPS:

快速失败:到达阈值,直接抛出异常

warm up:对于超出阈值的请求同样会抛出异常,但是这种模式阈值会动态变化,从一个较小的值逐渐增加到最大阈值

排队等待:让所有的请求排队先后执行,两个请求时间不能小于指定时长,超过等待时长直接拒绝

image

热点参数限流:

分别统计参数相同的请求,到达阈值后进行限流

Feign 整合 sentinel
yaml配置:
feign:
  sentinel:
	enabled: true
  1. 实现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;
     			}
    
     		};
     	}
     }
    
  2. @FeignClient 指定 fallbackFactory

线程隔离模式:

线程池隔离:在服务调用放指定调用服务的线程池,当线程到达最大数限制则直接拒绝, 需要创建多个线程池

因为每次服务调用都是创建的新线程所以有点如下

  1. 支持出动超时

  2. 支持一步调用

    但是需要不断的创建线程开销比较大,使用场景,低扇出(依赖的服务比较小)

信号量隔离(sentinel默认): 计数器统计访问资源数

轻量级,无需额外开销。不支持主动调用与异步调用,使用高扇出的场景

熔断降级

由断路器统计服务调用异常,慢的比例,到达一定阈值后会直接拦截该服务的一切请求,服务恢复时会进行放行

image

授权规则

授权规则可以对调用方的来源做控制,有黑名单和白名单两种方式

黑名单:在黑名单的调用和不允许访问

白名单:在白名单的调用者允许访问

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 具有很多子类,具体如下
image
具体代码类似于springboot 统一异常处理

sentinel规则保存

sentinel 默认控制台添加的规则是直接保存到内存中。

posted @ 2022-08-26 11:16  原来是晴天啊  阅读(300)  评论(0编辑  收藏  举报