Ip-Limit: Java轻量级注解式IP限流(黑名单/白名单)组件【一】

这篇具有很好参考价值的文章主要介绍了Ip-Limit: Java轻量级注解式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-637386.html

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

Ip-Limit 计划实现功能

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

到了这里,关于Ip-Limit: Java轻量级注解式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)
  • Java中轻量级规则引擎Groovy介绍

    假如在开发一个充值功能,需要支持经常变化的充值营销活动,产品提出了以下需求: 1、根据不同季节,不同节日做不同的充值送活动,以及不定期的优惠活动。 2、还需要根据用户的等级以及用户以往的充值历史做不同的营销活动。 3、能够灵活的配置营销活动 需求很简单

    2024年02月10日
    浏览(69)
  • Lightly —— Java轻量级在线编译器

    Lightly,一款轻量级在线集成开发工具(IDE)。 Lightly,支持客户端和云端在线开发模式。 Lightly,支持项目实时协作、共同开发。 初始界面——引导          了解Lightly IDE提供多种语言的项目编译环境以及数据库云端存储,其为两大重要特性。 支持的语言编译环境(13):

    2024年04月27日
    浏览(35)
  • 《Java Web轻量级整合开发入门》学习笔记

    轻量级Java Web整合开发 第一章 轻量级Java Web开发概述 1.2  java web 开发概述 1.JSP是一种编译执行的前台页面技术。对于每个JSP页面,Web服务器都会生成一个相应的Java文件,然后再编译该Java文件,生成相应的Class类型文件。在客户端访问到的JSP页面,就是相应Class文件执行的结果

    2024年02月08日
    浏览(52)
  • Java轻量级全文检索引擎Lucene使用及优化

    Lucene是一个开源的全文检索引擎工具包由Doug Cutting编写。它被设计用于实现全文搜索功能,即读入一堆文本文件并将其转换为易于搜索的数据结构。Lucene提供了一组简单而强大的API,使得索引和搜索过程变得非常方便。 Lucene广泛应用于从1200万站点中进行互联网搜索等搜索引

    2024年02月16日
    浏览(53)
  • 架构:Oracle推出开源轻量级Java微服务框架Helidon

    在当今数字化时代,微服务架构已经成为构建灵活、可伸缩和高度可维护的应用程序的首选方式之一。Java一直以其稳定性和跨平台性而闻名,而Oracle则一直是Java的领先开发者之一。为了满足不断增长的微服务市场需求,Oracle于近年推出了开源的轻量级Java微服务框架Helidon,为

    2024年02月02日
    浏览(50)
  • 【java表达式引擎】四、高性能、轻量级的AviatorScript

    github:(https://github.com/killme2008/aviatorscript%60) 参考文档1:https://www.yuque.com/boyan-avfmj/aviatorscript 参考博客2:https://blog.csdn.net/ZhangQingmu/article/details/125087255 Aviator起源于2011年,由国内的开发者开源的,表达式引擎 表达式引擎当时国内开源的已经有 IKExpression,可惜是纯解释执行的,

    2024年02月10日
    浏览(51)
  • 【表达式引擎】简单高效的轻量级Java表达式引擎:Aviator

    Aviator 是一个高性能、、轻量级的表达式引擎,支持表达式动态求值。其设计目标为轻量级和高性能,相比于 Groovy 和 JRuby 的笨重, Aviator 就显得更加的小巧。与其他的轻量级表达式引擎不同,其他的轻量级表达式引擎基本都是通过解释代码的方式来运行,而 Aviator 则是直接

    2024年02月09日
    浏览(58)
  • 开箱即用轻量级雪花算法id生成器Java工具类

    在 Java后端研发过程中,对于分布式微服务来说,一般需要分布式 id生成. 这里分享一个非常好用且大多数情况下都可用的开箱即用轻量级雪花算法id生成器Java工具类。 这种方式生成的雪花算法生成器生成的唯一主键id,好处是不依赖第三方组件,轻量级,缺点是服务器的时钟

    2024年02月07日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包