SpringBoot分布式限流组件零配置

举报
西魏陶渊明 发表于 2022/09/25 03:10:14 2022/09/25
【摘要】 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qFboLgql-1658487287538)(https://ws3.sinaimg.cn/large/006tNc79gy...

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qFboLgql-1658487287538)(https://ws3.sinaimg.cn/large/006tNc79gy1g2e0ejmbv0j312s0bsmxv.jpg)]

EasySentinel


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3Vx7uE5-1658487287538)(https://img.shields.io/badge/build-passing-brightgreen.svg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D09Jy3VH-1658487287538)(https://img.shields.io/badge/license-Apache%202-blue.svg)]

是一款专门为SpringBoot项目设计的限流组件,利用Redis+lua从而来实现高性能和分布式的能力。使用比较简单。通过半嵌入式的开发即可使用分布式注解。引用使用Redis作为注册中心,所以需要添加redis依赖

SpringBoot2版本之后官方强烈建议以此来替换spring-boot-starter-redis

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4

正在Coding

为了有更好的用户体验,控制台的开发已经提上日常。当前项目只有本人维护,欢迎前端或者后端的同学一起来参与

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPhca1ZM-1658487287539)(https://ws3.sinaimg.cn/large/006tNc79gy1g2e0wi3bpuj31320ihmz8.jpg)]

开始引入依赖

<dependency>
 <groupId>com.github.lxchinesszz</groupId>
    <artifactId>easy-sentinel</artifactId>
    <version>1.0.1-SNAPSHOT</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

使用案例

只用将需要限制的接口加上@EasySentinel即可实现限流能力

通过Qps设置当前接口的qps,fallback指定限流后的备用方法 。

@RestController
public class WebController {

  @EasySentinel(Qps = 10, fallback = "mock", resourceName = "获取用户名")
  @GetMapping(value = "/user/{name}")
  public String getUser(@PathVariable("name") String userName) {
    System.out.println("process:" + userName);
    return userName;
  }

  public String mock(String userName) {
    System.out.println("Mock::" + userName);
    return "Mock::" + userName;
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

备用方法高级案例

前面只通过fallback实现备用方法的执行,但是平时为了让控制层的代码尽量保证精简,EasySentinel也支持通过工具类的方式来,指定blockHandlerClass处理类的方法blockHandler

@RestController
public class WebController {
  @EasySentinel(resourceName = "获取用户名2", Qps = 1, blockHandler = "fallBack",    `		blockHandlerClass = DefaultLimiterBlockHandler.class)
  @GetMapping(value = "/user1/{name}")
  public String getUser2(@PathVariable("name") String userName) {
    System.out.println("process:" + userName);
    return userName;
  }
}
public class DefaultLimiterBlockHandler {
  public Object fallBack(BlockException block, String userName) {
    return "DefaultLimiterBlockHandler::" + userName + block.getMessage();
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

压力测试

ab -n 14 -c 1 http://127.0.0.1:8889/user/lxchinesszz

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2KxduH9-1658487287539)(https://ws2.sinaimg.cn/large/006tNc79gy1g2evzcxz9rj311b0hy4qp.jpg)]

创作者

lxchinesszz

  • https://blog.springlearn.cn

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/89521731

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。