Springcloud gateway笔记
过滤器
Spring Cloud Gateway 的过滤器分为两种类型,生效方式不同:
全局过滤器(GlobalFilter)
你的 LoggingFilter1 实现了 GlobalFilter 接口,并且通过 @Configuration + @Bean 注册为 Spring 容器中的 Bean。
对于全局过滤器,Spring Cloud Gateway 会自动扫描并加载所有 GlobalFilter 类型的 Bean,对所有路由生效,无需在 application.yml 中做任何配置。
你的代码中:
@Configuration确保类被 Spring 扫描到;@Bean将loggingFilter()方法返回的GlobalFilter实例注册到容器;- 这两个注解共同保证了过滤器会被自动识别并应用到所有请求中。
路由过滤器(Route Filter)
只有针对特定路由的局部过滤器(如 StripPrefix、RequestRateLimiter 等)才需要在 application.yml 的 routes.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用不了)

浙公网安备 33010602011771号