SpringCloud学习-part54 sentinel流控之链路

定义

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。

测试用service

@Service
public class OrderServiceImpl implements OrderService {
    @Override
    @SentinelResource(value="getOrder",blockHandler = "handleException")
    public CommonResult getOrder() {
        return new CommonResult(0, String.valueOf(new Random().nextInt()));
    }

    public CommonResult handleException(BlockException  ex){
        return new CommonResult(-1,
                ex.getClass().getCanonicalName() + "\t服务不可用");
    }
}

补充Controller

    @Resource
    private OrderService orderService;

    @GetMapping("/test1")
    public CommonResult test1(){
        return  orderService.getOrder();
    }

    @GetMapping("/test2")
    public CommonResult test2(){
        return orderService.getOrder();
    }

禁止收敛URL入口处的context

从1.6.3 版本开始,Sentinel Web fifilter默认收敛所有URL的入口context,因此链路限流不生效。

1.7.0 版本开始(对应SCA的2.1.1.RELEASE),官方在CommonFilter 引入了

WEB_CONTEXT_UNIFY 参数,用于控制是否收敛context。将其配置为 false 即可根据不同的URL 进行链路限流。

SCA 2.1.1.RELEASE之后的版本,可以通过配置spring.cloud.sentinel.web-context-unify=false即可关闭收敛我们当前使用的版本是SpringCloud Alibaba 2.1.0.RELEASE,无法实现链路限流。

目前官方还未发布SCA 2.1.2.RELEASE,所以我们只能使用2.1.1.RELEASE,需要写代码的形式实现

增加config

@Configuration
class FilterContextConfig {

    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        // 入口资源关闭聚合
        registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
        registration.setName("sentinelFilter");
        registration.setOrder(1);
        return registration;
    }
}

配置文件修改

关闭sentinel的CommonFilter实例化

spring:
	cloud:
		sentinel:
			filter:
				enabled: false

配置限流规则

SpringCloud学习-part54 sentinel流控之链路_第1张图片

测试

当QPS超过1时,test1访问被限流,test2则完全不受影响
SpringCloud学习-part54 sentinel流控之链路_第2张图片

你可能感兴趣的:(SpringCloud)