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

相关推荐
程序视点6 小时前
FDM下载神器:免费多线程下载工具,速度90+M/S,完美替代1DM!
windows·后端
aiprtem7 小时前
LVGL + ESP-Brookesia 在Windows下的编译和运行
windows·物联网
悟能不能悟9 小时前
cmd怎么取消关机命令
windows
迷渡9 小时前
用自然语言控制你的电脑:Windows-MCP 项目实测
windows
caisexi10 小时前
Windows批量启动java服务bat脚本
java·windows·python
NullPointerExpection10 小时前
win10 环境删除文件提示文件被使用无法删除怎么办?
java·ide·windows·win10
xiaopengbc10 小时前
[Windows] 微软.Net运行库离线合集包 Microsoft .Net Packages AIO v13.05.25
windows·microsoft·.net
winfredzhang13 小时前
Windows字体simsum.ttf的安装与Python路径设置指南
windows·字体·simsun·fontforge
威桑1 天前
记一次Windwos非常离谱的系统错误,IPF错误,程序构建卡顿,程序启动卡顿。。。
windows
Young_Zn_Cu1 天前
Windows安装虚拟机遇到内容解码失败
linux·windows·ubuntu