Springcloud gateway笔记

过滤器

Spring Cloud Gateway 的过滤器分为两种类型,生效方式不同:

全局过滤器(GlobalFilter)

你的 LoggingFilter1 实现了 GlobalFilter 接口,并且通过 @Configuration + @Bean 注册为 Spring 容器中的 Bean。
对于全局过滤器,Spring Cloud Gateway 会自动扫描并加载所有 GlobalFilter 类型的 Bean,对所有路由生效,无需在 application.yml 中做任何配置。

你的代码中:

  • @Configuration 确保类被 Spring 扫描到;
  • @BeanloggingFilter() 方法返回的 GlobalFilter 实例注册到容器;
  • 这两个注解共同保证了过滤器会被自动识别并应用到所有请求中。

路由过滤器(Route Filter)

只有针对特定路由的局部过滤器(如 StripPrefixRequestRateLimiter 等)才需要在 application.ymlroutes.filters 中配置,例如:

routes:
  - id: user-service
    filters:
      - StripPrefix=1  # 这是路由过滤器,需要显式配置

配置

routes:  # 所有“分拣规则”的集合(可以有多条规则)
  # 示例路由1:路由到用户服务(含限流)—— 这条规则的备注,说明它是给“用户服务”用的
  - id: user-service  # 给这条规则起个唯一的“名字标签”,比如叫“用户服务专线”
                      # 作用:方便后续排查问题(比如这条规则没生效,能快速定位到它)
    uri: lb://user-service  # 包裹最终要送到的“目标网点地址”
                            # 拆解:
                            # 1. lb:全称“Load Balance”(负载均衡),相当于“网点有多个分店,包裹随机/按压力分到不同分店”,避免某一个分店忙死
                            # 2. user-service:目标网点的“店名”(就是你之前注册到 Nacos 的服务名),Gateway 会自动找到所有叫“user-service”的服务实例
    predicates:  # 「判断条件」—— 什么样的包裹(请求)才走这条“专线”
      - Path=/api/users/**  # 唯一条件:包裹的“收件地址前缀”必须是 /api/users/ 开头
                            # 比如:
                            # ✅ 符合的请求:/api/users/1(查用户1的信息)、/api/users/list(查用户列表)
                            # ❌ 不符合的请求:/api/orders/1(订单相关,走其他规则)、/test(无匹配规则,会报错)
                            # 注:** 表示“任意字符”,只要开头对就行
    filters:  # 「预处理动作」—— 包裹(请求)送出去之前,要做的“加工”
      - StripPrefix=1  # 动作1:“撕掉包裹地址的第一层前缀”
                       # 比如:用户发的请求是 /api/users/1,撕掉第一层“/api”,变成 /users/1
                       # 为什么要撕?因为目标服务(user-service)只认 /users/1 这种地址,不认 /api 开头的(相当于网点只认“街道门牌号”,不认“城市前缀”)
      # 限流过滤器:动作2:“给包裹设‘通行上限’,防止太多包裹挤爆网点”
      - name: RequestRateLimiter  # 过滤器名字:“请求限速器”(固定写法,Gateway 自带的)
        args:  # 限速的具体规则(参数)
          redis-rate-limiter.replenishRate: 10  # 规则1:“每秒发10个‘通行令牌’”
                                               # 白话:每个请求要拿一个“令牌”才能进网点,每秒只发10个,超过的请求得等下一秒
          redis-rate-limiter.burstCapacity: 20  # 规则2:“令牌最多存20个”
                                               # 白话:允许“偶尔多来一点”——比如某一秒突然来20个请求,能先把之前存的令牌用完;但超过20个,多余的请求会被拒绝(返回“请求太频繁”)
          key-resolver: "#{@ipKeyResolver}"     # 规则3:“按‘发件人IP’算令牌”
                                               # 白话:给每个IP单独发令牌——比如A的IP每秒能拿10个,B的IP也能拿10个,互不影响(避免一个IP占完所有令牌,其他IP用不了)

背景和价值 # 参考资料

posted @ 2025-09-23 16:33  向着朝阳  阅读(26)  评论(0)    收藏  举报