Sentinel入门

1.侵入式的方式

侵入式的代码如下,用SphU.entry定义要限制的业务逻辑

csharp 复制代码
package com.hamster.sentineldemo;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import java.util.ArrayList;
import java.util.List;

//测试侵入式代码的方式
public class Test {

    public static void main(String[] args) throws Exception {
        initFlowRules();
        while (true) {
            Entry entry = null;
            try {
                entry = SphU.entry("HelloWorld");
                /*您的业务逻辑 - 开始*/
                System.out.println("hello world");
                /*您的业务逻辑 - 结束*/
            } catch (BlockException e1) {
                /*流控逻辑处理 - 开始*/
                System.out.println("block!");
                /*流控逻辑处理 - 结束*/
                break;
            } finally {
                if (entry != null) {
                    entry.exit();
                }
            }
        }
    }

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

2.注解方式

首先用@SentinelResource定义要限流的方法:

csharp 复制代码
package com.hamster.sentineldemo;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/test")
    @SentinelResource(
            value = "test",
            blockHandler = "testBlockHandler",
            fallback = "testFallback"
    )
    public String test(){
        return "test";
    }
    public String testBlockHandler(BlockException ex){
        return "testBlockHandler";
    }
}

blockHandler 是被限流后的操作

fallback 是出错误时的操作,即熔断

然后定义规则:

csharp 复制代码
package com.hamster.sentineldemo;

import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import jakarta.annotation.PostConstruct;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;

@Configuration
public class SentinelConfig {
    @PostConstruct
    public void initRules(){
        FlowRule rule = new FlowRule("test")
                .setCount(1)
                .setGrade(RuleConstant.FLOW_GRADE_QPS)
                .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
        FlowRuleManager.loadRules(Collections.singletonList(rule));
        System.out.println("Rules loaded successfully.");
    }
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

注解不生效的可能情况:

1.两个方法都要用public不要用private,第一个方法不加会导致sentinel找不到getResult这个资源名,同样的第二个不加会导致sentinel找不到这个方法然后报错。

2.两个方法返回类型必须一样。

3.两个方法的参数类型必须一样,数量和参数类型要保持一致,注意第一个方法加了@PathVariable这个注解,这个只是url传参用的不需要加。

4.blockHandler的值必须与你的兜底方法,也就是第二个方法保持一致。

5.blockHandler对应方法必须要加BlockException这个异常类参数。

参考:

入门教程 https://developer.aliyun.com/article/783342

不生效情况 https://www.cnblogs.com/ningyyrx/p/16018484.html

相关推荐
mahuifa3 小时前
C++(Qt)软件调试---Windows 性能分析器WPA(28)
c++·windows·性能分析·wpa·wpr
盖盖衍上6 小时前
Java 8 新特性
java·windows·python
大丈夫在世当日食一鲲8 小时前
Java的流表达式使用
java·开发语言·windows
扛枪的书生8 小时前
Windows 提权-不安全的 GUI 程序
windows·渗透·kali·提权
暴躁的小胡!!!11 小时前
Windows权限维持之不死马(一)
运维·服务器·网络·windows·安全
Eugene__Chen11 小时前
Java8面试
开发语言·windows·python
猫咪钓鱼15 小时前
Windows 上通过 VScode 配置 Docker
windows·vscode·docker
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧16 小时前
C语言复习4:有关数组的基础常见算法
c语言·数据结构·windows·算法·visualstudio·排序算法·visual studio
Tanecious.16 小时前
C语言--预处理详解
c语言·windows·microsoft