自定义限流策略

说明

  • 在自定义开发前,请先自定义搭建好网关环境,请参考: 自定义部署

  • 本文介绍如何对 org.apache.shenyu.plugin.ratelimiter.algorithm.RateLimiterAlgorithm 进行自定义扩展。

扩展实现

  • 新建一个工程,引入如下依赖:
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.shenyu</groupId>
  4. <artifactId>shenyu-plugin-base</artifactId>
  5. <version>${project.version}</version>
  6. </dependency>
  7. </dependencies>
  • 新增一个类 ${you class},实现 org.apache.shenyu.plugin.ratelimiter.algorithm.RateLimiterAlgorithm
  1. public class ${you class} implements RateLimiterAlgorithm<T> {
  2. /**
  3. * Gets script.
  4. *
  5. * @return the script
  6. */
  7. public RedisScript<T> getScript() {
  8. //你的开发逻辑
  9. }
  10. /**
  11. * Gets keys.
  12. *
  13. * @param id the id
  14. * @return the keys
  15. */
  16. public List<String> getKeys(String id) {
  17. //你的开发逻辑
  18. }
  19. /**
  20. * Callback string.
  21. *
  22. * @param script the script
  23. * @param keys the keys
  24. * @param scriptArgs the script args
  25. */
  26. default void callback(final RedisScript<?> script, final List<String> keys, final List<String> scriptArgs) {
  27. //你的开发逻辑
  28. }
  29. }
  • 在项目 resources 目录下,新建 META-INF/shenyu 目录, 并且新增文件名为 : org.apache.shenyu.plugin.ratelimiter.algorithm.RateLimiterAlgorithm. 内容新增 ${you spi name} = ${you class path}:
  1. ${you spi name} = ${you class path}
  • 将工程打包,拷贝到网关 (bootstrap-bin) 的 libext-lib 目录。

  • Admin 后台 —-> 基础管理 —-> 字典管理 , 找到字典编码为 ALGORITHM_*,新增一条数据,注意字典名称要为: ${you spi name}

自定义限流策略 - 图1

  • 或者执行以下自定义SQL语句:
  1. INSERT IGNORE INTO `shenyu_dict` (
  2. `id`,
  3. `type`,
  4. `dict_code`,
  5. `dict_name`,
  6. `dict_value`,
  7. `desc`,
  8. `sort`,
  9. `enabled`,
  10. `date_created`,
  11. `date_updated`
  12. )
  13. VALUES (
  14. 'you id',
  15. 'matchMode',
  16. 'MATCH_MODE',
  17. 'you spi name',
  18. 'you value',
  19. 'you spi name',
  20. 0,
  21. 1,
  22. '2021-08-30 19:29:10',
  23. '2021-08-30 20:15:23'
  24. );