个人随笔
目录
五、springCloudAlibaba-sentinel的初步使用
2023-10-30 22:40:23

sentinel可以进行流量控制,熔断限流等保护我们的系统,那么这里进行简单的使用下,看看怎么用,主要参考官网
https://sentinelguard.io/zh-cn/docs/quick-start.htmlhttps://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
因为我这边是学习springCloudAlibaba,所以就直接在前面的基础上来搞了,其实任何项目都是可以的,这里用最简单的springboot项目为例子

1、目的

新建一个请求,通过sentinel来限制请求的QPS也就是每秒查询最多1次

2、搭建个springboot项目

https://www.suibibk.com/topic/1133524977824301056

3、引入sentinel的依赖

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>sentinel-core</artifactId>
  4. <version>1.8.6</version>
  5. </dependency>

4、测试类

  1. package com.suibibk.springCloud.order.controller;
  2. import com.alibaba.csp.sentinel.Entry;
  3. import com.alibaba.csp.sentinel.SphU;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import com.alibaba.csp.sentinel.slots.block.RuleConstant;
  6. import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
  7. import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import javax.annotation.PostConstruct;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. @RestController
  14. @RequestMapping("/order")
  15. public class OrderController {
  16. public static final String HELLO_RESOURCE_NAME = "hello";
  17. @RequestMapping("/hello")
  18. public String hello(){
  19. // 1.5.0 版本开始可以直接利用 try-with-resources 特性
  20. try (Entry entry = SphU.entry(HELLO_RESOURCE_NAME)) {
  21. // 被保护的逻辑
  22. return "hello world";
  23. } catch (BlockException ex) {
  24. // 处理被流控的逻辑
  25. return "被限流了";
  26. }
  27. }
  28. @PostConstruct
  29. private void initFlowRules(){
  30. List<FlowRule> rules = new ArrayList<>();
  31. FlowRule rule = new FlowRule();
  32. rule.setResource(HELLO_RESOURCE_NAME);
  33. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  34. // Set limit QPS to 20. 这里表示超过1秒的频率就会限流
  35. rule.setCount(1);
  36. rules.add(rule);
  37. FlowRuleManager.loadRules(rules);
  38. }
  39. }

若是IDEA import Entry 提示 “Cannot resolve symbol” 解决办法 “File” -> “Invalidate Caches / Restart”

上面主要的就是对资源进行控制比如这里的资源是“hello”,先是在bean初始化的时候进行流量规则设置,resource为“hello”.

  1. @PostConstruct
  2. private void initFlowRules(){
  3. List<FlowRule> rules = new ArrayList<>();
  4. FlowRule rule = new FlowRule();
  5. rule.setResource(HELLO_RESOURCE_NAME);
  6. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  7. // Set limit QPS to 20. 这里表示超过1秒的频率就会限流
  8. rule.setCount(1);
  9. rules.add(rule);
  10. FlowRuleManager.loadRules(rules);
  11. }

然后在我们的业务逻辑里就可以对这个资源进行控制了

  1. @RequestMapping("/hello")
  2. public String hello(){
  3. // 1.5.0 版本开始可以直接利用 try-with-resources 特性
  4. try (Entry entry = SphU.entry(HELLO_RESOURCE_NAME)) {
  5. // 被保护的逻辑
  6. return "hello world";
  7. } catch (BlockException ex) {
  8. // 处理被流控的逻辑
  9. return "被限流了";
  10. }
  11. }

//被保护的逻辑就是我们的正常业务逻辑,若超过了流量控制规则,那么就会到catch逻辑,我们访问http://localhost:8080/order/hello 点快两下,发现就返回了“被限流了”.

上面太麻烦了,用注解比较好,下面用下注解,文档参考

https://sentinelguard.io/zh-cn/docs/annotation-support.html

5、用注解

pom.xml引入

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>sentinel-annotation-aspectj</artifactId>
  4. <version>1.8.0</version>
  5. </dependency>

再添加个规则

  1. FlowRule rule2 = new FlowRule();
  2. rule2.setResource(USER_RESOURCE_NAME);
  3. rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);
  4. // Set limit QPS to 20. 这里表示超过1秒的频率就会限流
  5. rule2.setCount(1);
  6. rules.add(rule2);

添加个测试方法

  1. /**
  2. * @param id
  3. * @return
  4. */
  5. @RequestMapping("/user")
  6. @SentinelResource(value = USER_RESOURCE_NAME, blockHandler = "exceptionHandler")
  7. public String user(String id) {
  8. return "返回用户成功"+id;
  9. }
  10. // Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.
  11. public String exceptionHandler(String id, BlockException ex) {
  12. // Do some log here.
  13. ex.printStackTrace();
  14. return "被限流了"+id;
  15. }

启动类需要加上

  1. @Bean
  2. public SentinelResourceAspect sentinelResourceAspect(){
  3. return new SentinelResourceAspect();
  4. }

启动测试,发现也是ok的, @SentinelResource还可以指定异常所在类,以及fallback异常等,这些直接参考官方文档就可以了,很详细!

ok!

 53

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2