Sentinel webflux QPS限流基本配置总结

2021-02-25 19:56
482
0

1,下载 sentinel-dashboard.jar 控制面板  

2, 运行控制面板 java -Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8088 -Dproject.name=AAA -jar sentinel-dashboard.jar

 

3,在需要进行流量控制的项目中引入jar包:

 

       <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.8.1</version>
        </dependency>

        <!--  如果是webflux项目则需要引入此包 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-webflux-adapter</artifactId>
            <version>1.8.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.8.1</version>
        </dependency>

        <!--

          如果不加入此jar包会提示:  

          机器 192.168.1.136:8719 的 Sentinel 客户端版本不支持热点参数限流功能,请升级至 0.2.0 以上版本并引入 sentinel-                     parameter-flow-control 依赖。          -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-parameter-flow-control</artifactId>
            <version>1.8.1</version>
        </dependency>

 

4,在需要做流控的代码块加入:

1,webflux:

1.1

@Configuration
public class WebFluxConfig {

    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public WebFluxConfig(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                         ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    @Bean
    @Order(-1)
    public SentinelBlockExceptionHandler sentinelBlockExceptionHandler() {
        // 注册 SentinelBlockExceptionHandler 处理流控降级异常
        return new SentinelBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    @Bean
    @Order(-1)
    public SentinelWebFluxFilter sentinelWebFluxFilter() {
        // 注册 SentinelWebFluxFilter
        return new SentinelWebFluxFilter();
    }
}

 

1.2

    return  chain.filter(build).transform(new SentinelReactorTransformer<>("resourceName"));

1.3

private void initFlowRules()
{
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule(); 
 
    rule.setResource("resourceName");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule); 
    FlowRuleManager.loadRules(rules);
}

1.4 在项目启动后初始化流控规则

 initFlowRules();

2.1,  普通项目:

try(Entry entry = SphU.entry("resourceName"))
{
    // 被保护的逻辑
     ........
}
catch (BlockException ex)
{
    // 处理被流控的逻辑
    return "系统繁忙,请稍后再试!";
}

 

2.2

private void initFlowRules()
{
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule(); 
 
    rule.setResource("resourceName");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule); 
    FlowRuleManager.loadRules(rules);
}

2.3 在项目启动后初始化流控规则

 initFlowRules();

 

3 启动项目时加上如下虚拟机参数即可:

-Dcsp.sentinel.dashboard.server=localhost:8088 -Dproject.name=XXX

 

全部评论