higress icon indicating copy to clipboard operation
higress copied to clipboard

基于ip的限流插件

Open CPAltair opened this issue 11 months ago • 3 comments

key-rate-limit插件目前只支持limit_by_header和limit_by_param 2种限流维度,希望插件能加上基于client ip的限流 或 新插件实现 需求:

  1. 每个client请求达到阈值触发限流并可自定义的respon code和respon text
  2. 基于client ip的策略可与 limit_by_header 或 limit_by_param同时启用不冲突
  3. 基于client ip的策略支持 令牌、桶漏、滑动窗口等主流限流算法
  4. 支持全局限流

CPAltair avatar Mar 01 '24 06:03 CPAltair

计划后续基于插件中访问redis的能力来扩展实现这一能力

johnlanni avatar Mar 03 '24 04:03 johnlanni

插件sdk已经支持redis api,欢迎认领

johnlanni avatar Apr 17 '24 08:04 johnlanni

这个是go的插件吗,如果是go的话,我这边可以尝试下,请帮忙分配下,感谢 @johnlanni

hanxiantao avatar Apr 24 '24 13:04 hanxiantao

@johnlanni 插件是还没更新么,在官方文档中还只有limit_by_header和limit_by_param image

wapmnw avatar May 17 '24 03:05 wapmnw

@johnlanni 插件是还没更新么,在官方文档中还只有limit_by_header和limit_by_param image

@wapmnw 集群限流的插件需要使用redis的能力,但envoy中使用redis的能力还未开源,开源后我这边会继续跟进这个功能,目前已经开发了一部分,但无法调试和使用

hanxiantao avatar May 17 '24 04:05 hanxiantao

@johnlanni 插件是还没更新么,在官方文档中还只有limit_by_header和limit_by_param image

@wapmnw 集群限流的插件需要使用redis的能力,但envoy中使用redis的能力还未开源,开源后我这边会继续跟进这个功能,目前已经开发了一部分,但无法调试和使用

好的明白了,谢谢

wapmnw avatar May 17 '24 06:05 wapmnw

@hanxiantao 最新发布的1.4.0-rc.1已经支持插件里访问redis了,可以试试

johnlanni avatar May 19 '24 10:05 johnlanni

@hanxiantao 最新发布的1.4.0-rc.1已经支持插件里访问redis了,可以试试

好的

hanxiantao avatar May 19 '24 12:05 hanxiantao

集群中的redis地址要怎么写才对呢? 我在default namespace下部署了一个redis,service就叫redis,没有密码,默认端口

我的wasm中配置这样的

spec:
  matchRules:
  - config:
      redis:
        service_name: redis.default
      rule_items:
      - limit_by_per_header: X-USER
        limit_keys:
        - key: regexp:.*
          token_per_second: 10
      rule_name: default_rule
    configDisable: false
    ingress:
    - baichuan
  phase: UNSPECIFIED_PHASE
  priority: 600

但是日志老报错,我不确定这个格式要怎么写了

[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][critical][wasm] wasm log: failed to init redis: error status returned by host: bad argument
[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][warning][wasm] wasm log: [ai-token-ratelimit] parse rule config failed: error status returned by host: bad argument

我尝试过 redis://redis.static redis 都没效果 我看到wasm-go中用的是 ClusterName() 方法,这在evoy内部有啥自己转换机制吗? https://github.com/alibaba/higress/blob/0ce52de59b2416193fdb62854210142aceef98f5/plugins/wasm-go/pkg/wrapper/redis_wrapper.go#L114

pepesi avatar Jun 26 '24 03:06 pepesi

集群中的redis地址要怎么写才对呢? 我在default namespace下部署了一个redis,service就叫redis,没有密码,默认端口

我的wasm中配置这样的

spec:
  matchRules:
  - config:
      redis:
        service_name: redis.default
      rule_items:
      - limit_by_per_header: X-USER
        limit_keys:
        - key: regexp:.*
          token_per_second: 10
      rule_name: default_rule
    configDisable: false
    ingress:
    - baichuan
  phase: UNSPECIFIED_PHASE
  priority: 600

但是日志老报错,我不确定这个格式要怎么写了

[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][critical][wasm] wasm log: failed to init redis: error status returned by host: bad argument
[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][warning][wasm] wasm log: [ai-token-ratelimit] parse rule config failed: error status returned by host: bad argument

我尝试过 redis://redis.static redis 都没效果 我看到wasm-go中用的是 ClusterName() 方法,这在evoy内部有啥自己转换机制吗?

https://github.com/alibaba/higress/blob/0ce52de59b2416193fdb62854210142aceef98f5/plugins/wasm-go/pkg/wrapper/redis_wrapper.go#L114

创建一条路由规则目标服务选择对应的redis服务,然后配置时使用控制台中服务列表的服务名称,再尝试下 ps:因为我这边手头没有现成的示例,可以先试下

hanxiantao avatar Jun 26 '24 03:06 hanxiantao

集群中的redis地址要怎么写才对呢? 我在default namespace下部署了一个redis,service就叫redis,没有密码,默认端口 我的wasm中配置这样的

spec:
  matchRules:
  - config:
      redis:
        service_name: redis.default
      rule_items:
      - limit_by_per_header: X-USER
        limit_keys:
        - key: regexp:.*
          token_per_second: 10
      rule_name: default_rule
    configDisable: false
    ingress:
    - baichuan
  phase: UNSPECIFIED_PHASE
  priority: 600

但是日志老报错,我不确定这个格式要怎么写了

[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][critical][wasm] wasm log: failed to init redis: error status returned by host: bad argument
[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][warning][wasm] wasm log: [ai-token-ratelimit] parse rule config failed: error status returned by host: bad argument

我尝试过 redis://redis.static redis 都没效果 我看到wasm-go中用的是 ClusterName() 方法,这在evoy内部有啥自己转换机制吗? https://github.com/alibaba/higress/blob/0ce52de59b2416193fdb62854210142aceef98f5/plugins/wasm-go/pkg/wrapper/redis_wrapper.go#L114

创建一条路由规则目标服务选择对应的redis服务,然后配置时使用控制台中服务列表的服务名称,再尝试下 ps:因为我这边手头没有现成的示例,可以先试下

可以了,我创建了一个redis.dns的服务,将它指向了redis.default.svc就好了,配置中service_name换成redis.dns

pepesi avatar Jun 26 '24 05:06 pepesi

集群中的redis地址要怎么写才对呢? 我在default namespace下部署了一个redis,service就叫redis,没有密码,默认端口 我的wasm中配置这样的

spec:
  matchRules:
  - config:
      redis:
        service_name: redis.default
      rule_items:
      - limit_by_per_header: X-USER
        limit_keys:
        - key: regexp:.*
          token_per_second: 10
      rule_name: default_rule
    configDisable: false
    ingress:
    - baichuan
  phase: UNSPECIFIED_PHASE
  priority: 600

但是日志老报错,我不确定这个格式要怎么写了

[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][critical][wasm] wasm log: failed to init redis: error status returned by host: bad argument
[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][warning][wasm] wasm log: [ai-token-ratelimit] parse rule config failed: error status returned by host: bad argument

我尝试过 redis://redis.static redis 都没效果 我看到wasm-go中用的是 ClusterName() 方法,这在evoy内部有啥自己转换机制吗? https://github.com/alibaba/higress/blob/0ce52de59b2416193fdb62854210142aceef98f5/plugins/wasm-go/pkg/wrapper/redis_wrapper.go#L114

创建一条路由规则目标服务选择对应的redis服务,然后配置时使用控制台中服务列表的服务名称,再尝试下 ps:因为我这边手头没有现成的示例,可以先试下

可以了,我创建了一个redis.dns的服务,将它指向了redis.default.svc就好了,配置中service_name换成redis.dns

好的,我看很多人都有遇到这个问题,我后续会补充下文档,包含docker-compose部署和在控制台中怎么配置

hanxiantao avatar Jun 26 '24 05:06 hanxiantao

集群中的redis地址要怎么写才对呢? 我在default namespace下部署了一个redis,service就叫redis,没有密码,默认端口 我的wasm中配置这样的

spec:
  matchRules:
  - config:
      redis:
        service_name: redis.default
      rule_items:
      - limit_by_per_header: X-USER
        limit_keys:
        - key: regexp:.*
          token_per_second: 10
      rule_name: default_rule
    configDisable: false
    ingress:
    - baichuan
  phase: UNSPECIFIED_PHASE
  priority: 600

但是日志老报错,我不确定这个格式要怎么写了

[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][critical][wasm] wasm log: failed to init redis: error status returned by host: bad argument
[Envoy (Epoch 0)] [2024-06-26 03:07:42.131][32][warning][wasm] wasm log: [ai-token-ratelimit] parse rule config failed: error status returned by host: bad argument

我尝试过 redis://redis.static redis 都没效果 我看到wasm-go中用的是 ClusterName() 方法,这在evoy内部有啥自己转换机制吗? https://github.com/alibaba/higress/blob/0ce52de59b2416193fdb62854210142aceef98f5/plugins/wasm-go/pkg/wrapper/redis_wrapper.go#L114

创建一条路由规则目标服务选择对应的redis服务,然后配置时使用控制台中服务列表的服务名称,再尝试下 ps:因为我这边手头没有现成的示例,可以先试下

可以了,我创建了一个redis.dns的服务,将它指向了redis.default.svc就好了,配置中service_name换成redis.dns

好的,我看很多人都有遇到这个问题,我后续会补充下文档,包含docker-compose部署和在控制台中怎么配置

请问已经更新了docker部署的集群key限流的文档了吗

Mroldpeng avatar Aug 21 '24 09:08 Mroldpeng

请问已经更新了docker部署的集群key限流的文档了吗

这个暂时还没有,我这边也没太用过使用docker部署,也都是在Kubernetes中部署然后在控制台中加

hanxiantao avatar Aug 21 '24 09:08 hanxiantao

请问已经更新了docker部署的集群key限流的文档了吗

这个暂时还没有,我这边也没太用过使用docker部署,也都是在Kubernetes中部署然后在控制台中加

请问docker单机部署的可以使用集群key限流吗?

Mroldpeng avatar Aug 21 '24 09:08 Mroldpeng

请问已经更新了docker部署的集群key限流的文档了吗

这个暂时还没有,我这边也没太用过使用docker部署,也都是在Kubernetes中部署然后在控制台中加

请问docker单机部署的可以使用集群key限流吗?

插件是通用的,但是docker单机部署要怎么下发redis cluster的信息给envoy要试一下 我不太了解docker部署的使用方式,在Kubernetes中部署是在控制台中添加服务来源,然后手工加一条路由关联redis对应的服务,redis cluster的信息就会下发给envoy了 只要curl http://localhost:15000/clusters中有对应的redis cluster就可以访问redis了

hanxiantao avatar Aug 21 '24 09:08 hanxiantao

请问已经更新了docker部署的集群key限流的文档了吗

这个暂时还没有,我这边也没太用过使用docker部署,也都是在Kubernetes中部署然后在控制台中加

请问docker单机部署的可以使用集群key限流吗?

然后昨天有人反馈 Docker compose 本地搭建 Redis开发环境,Redis cluster用 dns 模式连接不上,改成 static 模式 就可以连上,可能是这个导致的

hanxiantao avatar Aug 21 '24 09:08 hanxiantao

请问已经更新了docker部署的集群key限流的文档了吗

这个暂时还没有,我这边也没太用过使用docker部署,也都是在Kubernetes中部署然后在控制台中加

请问docker单机部署的可以使用集群key限流吗?

然后昨天有人反馈 Docker compose 本地搭建 Redis开发环境,Redis cluster用 dns 模式连接不上,改成 static 模式 就可以连上,可能是这个导致的

我现在使用的就是 static模式, 但是依然连接不上, 有什么地方可以看见连接日志的吗, 我看go代码中是有一层这样的操作 config.redisClient = wrapper.NewRedisClusterClient(wrapper.FQDNCluster{ FQDN: serviceName, Port: int64(servicePort), })

Mroldpeng avatar Aug 21 '24 09:08 Mroldpeng

请问已经更新了docker部署的集群key限流的文档了吗

这个暂时还没有,我这边也没太用过使用docker部署,也都是在Kubernetes中部署然后在控制台中加

请问docker单机部署的可以使用集群key限流吗?

然后昨天有人反馈 Docker compose 本地搭建 Redis开发环境,Redis cluster用 dns 模式连接不上,改成 static 模式 就可以连上,可能是这个导致的

我现在使用的就是 static模式, 但是依然连接不上, 有什么地方可以看见连接日志的吗, 我看go代码中是有一层这样的操作 config.redisClient = wrapper.NewRedisClusterClient(wrapper.FQDNCluster{ FQDN: serviceName, Port: int64(servicePort), })

image 插件初始化的时候如果连不上redis 会有个这个类似的报错的

hanxiantao avatar Aug 21 '24 09:08 hanxiantao