{"id":21838996,"url":"https://github.com/aqiu202/limiting-spring-boot-starter","last_synced_at":"2025-09-09T12:33:28.927Z","repository":{"id":48746602,"uuid":"221709134","full_name":"aqiu202/limiting-spring-boot-starter","owner":"aqiu202","description":"集防重复提交和接口限流功能于一体的一个spring boot的starter，开箱即用，简单方便，如果觉得好请给个Star 谢谢","archived":false,"fork":false,"pushed_at":"2021-03-31T21:43:30.000Z","size":49,"stargazers_count":26,"open_issues_count":1,"forks_count":6,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-27T23:51:07.716Z","etag":null,"topics":["limit-spring-boot-starter","limiting","limiting-spring-boot-starter","spring","spring-boot","spring-boot2","springboot","springboot2"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aqiu202.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-14T13:53:22.000Z","updated_at":"2025-02-07T09:01:01.000Z","dependencies_parsed_at":"2022-09-19T19:50:37.967Z","dependency_job_id":null,"html_url":"https://github.com/aqiu202/limiting-spring-boot-starter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aqiu202%2Flimiting-spring-boot-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aqiu202%2Flimiting-spring-boot-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aqiu202%2Flimiting-spring-boot-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aqiu202%2Flimiting-spring-boot-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aqiu202","download_url":"https://codeload.github.com/aqiu202/limiting-spring-boot-starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248866184,"owners_count":21174491,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["limit-spring-boot-starter","limiting","limiting-spring-boot-starter","spring","spring-boot","spring-boot2","springboot","springboot2"],"created_at":"2024-11-27T21:15:23.228Z","updated_at":"2025-04-14T10:40:21.733Z","avatar_url":"https://github.com/aqiu202.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# limiting-spring-boot-starter\n### 描述\n对接口的限流功能的封装，主要应用场景： \n\n- 单位时间内防止重复提交\n\n- 对某个接口进行并发数的限制\n\n- 对某个接口进行单位时间内请求数量的限制（令牌桶算法）\n\n【注】其功能实现都使用了缓存，其中缓存可选择redis、caffeine和guava， \n只有redis可以实现分布式，其他方式只能在单机上使用\n### 引用\nmaven坐标（已经发布到maven中央仓库）\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.aqiu202\u003c/groupId\u003e\n    \u003cartifactId\u003elimiting-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e0.0.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 用法\n##### 开启\n```java\n@SpringBootApplication\n@EnableLimiting(\n    cacheMode = CacheMode.caffeine, //配置防重复提交的缓存使用caffeine（还可使用guava和redis）\n    timeout = 3,    //配置防重复提交的接口几秒内不能重复访问\n    timeUnit = TimeUnit.SECONDS) //时间单位，默认秒\npublic class DemoApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(DemoApplication.class, args);\n    }\n\n}\n```\n##### 使用\n1.key的生成规则\n```java\n@Configuration\npublic class KenGeneratorConfig {\n\n    //配置通过token生成key的规则（防重复提交默认还会添加sessionID标识，详情查看SimpleKeyGenerator类）\n    @Bean(name = \"keyGeneratorWithToken\")\n    public KeyGenerator keyGeneratorWithToken() {\n        return (request, target, method, params) -\u003e {\n            StringJoiner joiner = new StringJoiner(\",\");\n            for (Object param : params) {\n                joiner.add(param.getClass().getName());\n            }\n            String token = request.getHeader(\"token\");\n            return target.getClass().getName().concat(\":\")\n                    .concat(method.getName()).concat(joiner.toString())\n                    .concat(token);\n        };\n    }\n\n    //配置通过方法生成key的规则（已内置名称为methodKeyGenerator的方法生成规则，自定义的配置会覆盖该规则）\n    //并发数的限制和令牌桶算法的限流方式默认使用该规则生成key\n    @Bean(name = KeyGenerator.DEFAULT_METHOD_KEY_GENERATOR)\n    public KeyGenerator methodKeyGenerator() {\n        return (request, target, method, params) -\u003e {\n           StringJoiner joiner = new StringJoiner(\",\");\n           for (Object param : params) {\n               joiner.add(param.getClass().getName());\n           }\n           return target.getClass().getName().concat(\":\").concat(method.getName()).concat(\":\")\n                   .concat(joiner.toString());\n        };\n    }\n\n}\n```\n2.还可以为每个接口单独设置key，可以使用SpEL表达式\n接口试例：\n```java\n@RestController\npublic class UploadController {\n    \n    //防重复提交\n    @PostMapping(\"submit\")\n    @RepeatLimiting(keyGenerator = \"keyGeneratorWithToken\")\n    public JsonResult\u003cVoid\u003e testRepeat() {\n        return JsonResult.ok();\n    }\n    \n    //防重复提交，单独使用SpEL设置key（已废弃spEl属性，处理时会自动判断是否是spEl表达式）\n    @RepeatLimiting(key = \"'test-repeat-' + #key\")\n    @PostMapping(\"submit\")\n    public JsonResult\u003cVoid\u003e testRepeat(String key) {\n        return JsonResult.ok();\n    }\n\n    //基于线程数控制并发量，只允许5个线程同时访问\n    @ThreadLimiting(threads = 5, keyGenerator = KeyGenerator.DEFAULT_METHOD_KEY_GENERATOR)\n    @GetMapping(\"thread\")\n    public JsonResult\u003cVoid\u003e testThread() {\n        return JsonResult.ok();\n    }\n\n    //基于令牌桶算法限制接口访问，每秒钟只允许两个用户访问\n    @GetMapping(\"current\")\n    @CurrentLimiting(permits = 2)\n    public JsonResult\u003cVoid\u003e testCurrent() {\n        return JsonResult.ok();\n    }\n\n}\n```\n3.进阶：spEl扩展，通过EvaluationFiller扩展自定义全局SpEl变量\n```java\npublic class SpElConfiguration {\n    @Bean\n    public EvaluationFiller evaluationFiller() {\n        //context spEl上下文，target当前类实例，method当前调用方法，parameters方法的参数\n        return ((context, target, method, parameters) -\u003e {\n            context.setVariable(\"className\", target.getClass().getName());\n            //配置好参数以后可以在spEl中使用，例如：@RepeatLimiting(key=\"#className + '-key'\")\n        });\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faqiu202%2Flimiting-spring-boot-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faqiu202%2Flimiting-spring-boot-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faqiu202%2Flimiting-spring-boot-starter/lists"}