Ip-Limit: 轻量级注解式IP限流组件(一)

这篇具有很好参考价值的文章主要介绍了Ip-Limit: 轻量级注解式IP限流组件(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

author: van , ggfanwentao@gmail.com

Ip-Limit: 轻量级注解式IP限流组件

项目简介

基于JVM缓存的轻量级、注解式IP限流组件,方便项目快速引用,满足多线程场景。
默认为滑动窗口限流器,内置令牌桶限流器,可通过注解的属性配置修改
项目Github地址: https://github.com/DDAaTao/ip-limiter
项目Gitee地址:https://gitee.com/fanwentaomayun/ip-limiter

使用样例

包含较为详细的演示使用代码

样例项目地址: https://github.com/DDAaTao/ip-limiter-example

Ip-Limit 具有以下特性:

  • 基于注解使用,简单快捷,可添加到Controller类上,也可以添加到具体的API方法上
  • 业务入侵小,不用过多配置类,但可以支持多种场景配置
  • 实现组级别统一限流,即可满足单接口单组场景,又可满足多接口单组
  • 支持配置文件配置、外部动态配置(新增、删除)黑白名单
# 配置文件中配置,需要注意分隔符为半角的','
my.white.ip.list=172.16.50.21,172.16.50.22,172.16.50.23
// 代码中使用时
@IpLimit(limitType = LimitType.WHITE_LIST, whiteList = "${my.white.ip.list}")
// 或
@IpLimit(limitType = LimitType.WHITE_LIST, whiteList = {"${my.white.ip.list}","172.16.50.35"})
  • 黑白名单IP规则实现多种模糊模式配置,支持IPv6
    • 172.*.*.1
    • 172.*.1
    • 172.*
    • *.21
    • *

核心限流模式 - LimitType类

  • DEFAULT - 走默认限流策略,不考虑黑白名单参数
  • WHITE_LIST - 只考虑白名单策略,非白名单的请求全部回绝
  • BLACK_LIST - 只考虑黑名单策略,非黑名单请求不做限流措施
  • DEFAULT_WITH_WHITE_LIST - 在默认限流策略的基础上,白名单内的IP不做限流
  • DEFAULT_WITH_BLACK_LIST - 在默认限流策略的基础上,直接403黑名单
  • DEFAULT_WITH_WHITE_AND_BLACK_LIST - 在默认限流策略的基础上,直接403黑名单,再让白名单内的IP直接同行

快速开始

  1. 引入Ip-Limit依赖(已发布至Maven中央仓库)
  <!-- 建议使用最新版本{ip-limiter.version} -->
  <dependency>
    <groupId>io.github.DDAaTao</groupId>
    <artifactId>ip-limiter</artifactId>
    <version>1.0.3</version>
  </dependency>
  1. 将 @EnableIpLimit 添加到 webApplication 类上,或其他可以被 Spring 扫描到的类上
  2. 将 @IpLimit 注解添加到想要做IP限流的方法(接口)上,根据需求动态调整参数

如果项目中没有引入guava、spring-context包,则需要手动引入,否则会报java.lang.NoSuchMethodError异常

从1.0.1开始默认引入,如果项目中已有相关依赖,可以考虑通过去除掉

最佳实践

一、自定义限流异常处理机制

/**
 * 默认情况下,当请求超出限流限制时,会打印日志并抛出 IpLimitException 异常
 * 用户可以通过统一异常拦截器捕获并自定义业务处理
 * 后续考虑增加回调或钩子方法
 * */
@Slf4j
@ControllerAdvice
public class BaseExceptionHandler {

  @ExceptionHandler(IpLimitException.class)
  @ResponseBody
  public RestApiResult<Object> resolveCommonException(IpLimitException e) {
    log.error("IpLimitException Intercept. Please try again later.. " + e.getMessage());
    // 此处可以通过 e.getRequestIp() 和 e.getGroupName() 做一些限流回调业务处理
    return RestApiResult.fail("IpLimitException Intercept. Please try again later.. ");
  }
  
}

二、已存在鉴权方案时的接入方案

SpringCloud 项目或者大部分项目一般都会有做自己的鉴权机制,比如Spring-Security。
这个时候如果有需要和外部对接的接口,有两种处理方法,一个是通过类似Oauth2之类的三方协议处理,
但是流程对接较为麻烦。

尤其是有些内网项目,本身已有较好的安全保证。此时就可以另外一种方式,也就是 白名单 来处理
也就是 LimitType.WHITE_LIST

或在白名单之上追加限流规则,保障系统的可用性,也就是 LimitType.DEFAULT_WITH_WHITE_LIST

三、动态配置黑白名单

1.0.3 版本开始提供IpLimitUtils工具类,通过注入获取实例后可以实现动态配置黑白名单,该动态配置数据与注解中的配置取并集

IpLimitUtils提供方法如下

  • putWhiteIpGroup - 可通过该方法动态配置新增白名单
  • removeWhiteIpGroup - 可通过该方法动态清空对应 group 的白名单配置
  • deleteWhiteIpGroupArrayStr - 可通过该方法动态去掉对应 group 中的某项 arrayStr 白名单
  • putBlackIpGroup - 可通过该方法动态配置新增黑名单
  • removeBlackIpGroup - 可通过该方法动态清空对应 group 的黑名单配置
  • deleteBlackIpGroupArrayStr - 可通过该方法动态去掉对应 group 中的某项 arrayStr 黑名单

有了这些方法,就可以通过第三方(比如数据库)存储黑白名单数据,然后动态初始化、修改黑名单配置

异常记录

  1. 暂时不支持Spring-6.x

更新日志

加粗表示重要版本更新,删除线表示废弃版本,不建议使用文章来源地址https://www.toymoban.com/news/detail-588388.html

  • 1.0.1 实现滑动窗口限流模式
  • 1.0.2 调整规范,添加样例项目链接
  • 1.0.3 开放用户动态配置黑白名单

Ip-Limit 计划实现功能

  • 用户自定义限流器
  • 全局限流、全局分IP限流
  • 添加限流监控,监控数据回调(目前可以通过@ExceptionHandler(IpLimitException.class)处理异常回调)
  • IP缓存统计数据可更换其他存储数据源,避免过多占用JVM缓存
  • 可将IP更换为指定字段(比如账号)限流
  • 更加灵活的异常处理机制

到了这里,关于Ip-Limit: 轻量级注解式IP限流组件(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 轻量级web开发框架Flask本地部署及无公网ip远程访问界面

    本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团

    2024年02月04日
    浏览(61)
  • 本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

    本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团

    2024年01月23日
    浏览(57)
  • git轻量级服务器gogs、gitea,非轻量级gitbucket

    本文来源:git轻量级服务器gogs、gitea,非轻量级gitbucket, 或 gitcode/gogs,gitea.md 结论: gogs、gitea很相似 确实轻, gitbucket基于java 不轻, 这三者都不支持组织树(嵌套组织 nested group) 只能一层组织。 个人用,基于gogs、gitea,两层结构树 简易办法: 把用户当成第一层节点、该用户的

    2024年02月07日
    浏览(70)
  • 轻量灵动: 革新轻量级服务开发

    从 JDK 8 升级到 JDK 17 可以让你的应用程序受益于新的功能、性能改进和安全增强。下面是一些 JDK 8 升级到 JDK 17 的最佳实战: 1.1、确定升级的必要性:首先,你需要评估你的应用程序是否需要升级到 JDK 17。查看 JDK 17 的新特性、改进和修复的 bug,以确定它们对你的应用程序

    2024年02月07日
    浏览(54)
  • 轻量级 HTTP 请求组件

    Apache HttpClient 是著名的 HTTP 客户端请求工具——现在我们模拟它打造一套简单小巧的请求工具库, 封装 Java 类库里面的 HttpURLConnection 对象来完成日常的 HTTP 请求,诸如 GET、HEAD、POST 等等,并尝试应用 Java 8 函数式风格来制定 API。 组件源码在:https://gitee.com/sp42_admin/ajaxjs/tr

    2024年02月01日
    浏览(65)
  • Tomcat轻量级服务器

    目录 1.常见系统架构  C-S架构 B-S架构 2.B-S架构系统的通信步骤 3.常见WEB服服务器软件 4.Tomcat服务器的配置 下载安装 环境变量配置 测试环境变量是否配置成功 测试Tomcat服务器是否配置成功  Tomcat窗口一闪而过的解决步骤 Tomcat解决乱码 介绍: C-S架构即Client/Server(客户端/服务

    2023年04月14日
    浏览(135)
  • 一种轻量级定时任务实现

    现在市面上有各式各样的分布式定时任务,每个都有其独特的特点,我们这边的项目因为一开始使用的是分布式开源调度框架TBSchedule,但是这个框架依赖ZK, 由于ZK的不稳定性和项目老旧无人维护 ,导致我们的定时任务会偶发出现异常,比如:任务停止、任务项丢失、任务不

    2024年02月14日
    浏览(43)
  • C++轻量级单元测试框架

    单元测试是构建稳定、高质量的程序、服务或系统的必不可少的一环。通过单元测试,我们可以在开发过程中及时发现和修复代码中的问题,提高代码的质量和可维护性。同时,单元测试也可以帮助我们更好地理解代码的功能和实现细节,从而更好地进行代码重构和优化。

    2023年04月25日
    浏览(71)
  • 108中超轻量级的加载动画!

    大家好,我是【程序视点】小二哥! 今天要上的菜不是 Animate.js,也不是 Move.js,而是能提供108种加载动画的库: Whirl . 话不多说,直接来看例子。 以上只是冰山一角。whirl的CSS加载动画集合中有108种选项供你挑选。选中喜欢的动画后,点击“Grab the CSS on Github!”。 将跳转到

    2024年02月03日
    浏览(51)
  • Kotlin 轻量级Android开发

    Kotlin 是一门运行在 JVM 之上的语言。 它由 Jetbrains 创建,而 Jetbrains 则是诸多强大的工具(如知名的 Java IDE IntelliJ IDEA )背后的公司。 Kotlin 是一门非常简单的语言,其主要目标之一就是提供强大语言的同时又保持简单且精简的语法。 其主要特性如下所示: 轻量级:这一点对

    2024年02月07日
    浏览(131)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包