1.侵入式的方式
侵入式的代码如下,用SphU.entry定义要限制的业务逻辑
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定义要限流的方法:
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 是出错误时的操作,即熔断
然后定义规则:
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 {@PostConstructpublic 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.");}@Beanpublic 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