苏州外贸网站,网站建设的多吗,河北建站科技网络公司,网站语言包是什么我发现公司的网关项目里有很多的轮子#xff0c;几乎每个人接手这个项目开发#xff0c;都会自定义过滤器#xff0c;导致有非常非常多的过滤器#xff0c;修改其中一个#xff0c;指不定就会影响其他的人功能#xff0c;非常的恼火。其实在 Spring Cloud Gateway 本身内…我发现公司的网关项目里有很多的轮子几乎每个人接手这个项目开发都会自定义过滤器导致有非常非常多的过滤器修改其中一个指不定就会影响其他的人功能非常的恼火。其实在 Spring Cloud Gateway 本身内置了很多通用的过滤器组件有些功能无需重复开发直接通过配置就能完成请求修改、参数处理、安全校验等功能。但遗憾的是很多同学只知道RewritePath等常用过滤器却忽略了官方早已内置的 30 过滤器。下边小富梳理Spring Cloud Gateway 30 个过滤器包含配置示例与实战场景你会发现有些代码真的不用写。一、请求相关1.AddRequestHeader作用给请求添加 Header转发请求前给请求添加指定 Header。配置示例spring: cloud: gateway: routes: -id:xiaofu-120412 uri:http://127.0.0.1:12041/ predicates: -Weightxiaofu-group,1 -Path/test/version1/** filters: -RewritePath/test/version1/(?segment.*),/$\{segment} -name:AddRequestHeader args: name:X-Request-Source# Header名称 value:gateway # Header值场景传递请求来源标识如gateway、app方便下游服务做权限控制。2.RemoveRequestHeader作用移除请求中的 Header转发前移除请求中指定的 Header如敏感信息。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: RemoveRequestHeader args: name: Authorization # 移除客户端传来的 Authorization 头场景下游服务不需要客户端直接传递的令牌由网关统一处理认证时使用。3.SetRequestHeader作用覆盖请求中的 Header若请求中已存在指定 Header直接覆盖其值不存在则添加。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: SetRequestHeader args: name: Authorization value: 111111 # 强制将 Authorization 设为 111111注意与AddRequestHeader的区别是SetRequestHeader会覆盖原有值而AddRequestHeader会保留原有值若存在。4.AddRequestParameter作用转发请求时给请求添加参数URL 或请求体添加参数支持 GET/POST。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: AddRequestParameter args: name: from value: gateway # 所有请求会带上 ?fromgateway 参数场景统计请求来源或给下游服务传递额外标识如灰度标记。5.RemoveRequestParameter作用移除请求中的参数转发前移除请求中的指定参数如敏感参数password。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: RemoveRequestParameter args: name: password # 移除请求中的 password 参数6.MapRequestHeader作用把网关请求头的值映射到另一个请求头里。比如前端调用网关请求头有一个X-User-Id用来验证但是要转发的下游服务只校验请求头userId这时要自动做一个映射。配置示例filters: - MapRequestHeaderX-User-Id, userId7.RequestSize作用限制请求体大小拒绝请求体超过指定大小的请求防止大文件上传压垮服务。配置示例filters: - name: RequestSize args: maxSize: 10MB # 最大请求体10MB超过返回4138.RequestHeaderSize作用限制请求头大小拒绝请求头超过指定大小的请求如下任何请求头的大小超过1000字节这将发送一个 431状态码的响应。配置示例filters: - RequestHeaderSize1000B9.PreserveHostHeader作用保留原始 Host 头转发请求时保留客户端的原始 Host 头默认会改为下游服务的 Host。配置示例filters: - name: PreserveHostHeader # 无参数直接启用场景下游服务依赖 Host 头进行逻辑处理时使用。10.SetRequestHostHeader作用某些情况下host 头可能需要被重写。修改请求的 Host 头转发请求时强制修改 Host 头为指定值。配置示例filters: - name: SetRequestHostHeader args: host: target-service.com # 强制 Host 头为 target-service.com11.CacheRequestBody作用缓存请求体请求体如 POST 请求的 JSON 数据我们知道默认请求体只能读一次所以为了后续的操作使用该过滤器来缓存请求体然后再把它发送到下游从 exchange 属性中获取请求体。配置示例filters: - name: CacheRequestBody args: cacheName: requestBodyCache # 缓存名称场景多个过滤器需要读取请求体时使用如先校验签名再解析参数。二、响应相关主要是调整服务返回的响应信息比如响应头 Header 等。1.AddResponseHeader作用给响应添加 Header服务返回响应后给响应添加指定 Header如跨域标识、缓存控制。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: AddResponseHeader args: name: X-Response-Time value: 120 # 可结合全局过滤器动态设置响应时间场景添加Cache-Control: max-age3600控制静态资源缓存。2.RemoveResponseHeader作用移除响应中的 Header移除服务返回的敏感响应头如X-Application-Context暴露服务信息。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: RemoveResponseHeader args: name: X-Application-Context3.SetResponseHeader作用覆盖响应中的 Header覆盖服务返回的响应头如统一设置Content-Encoding。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: SetResponseHeader args: name: Content-Encoding value: gzip # 强制响应使用 gzip 编码4.RewriteResponseHeader作用重写响应 Header 的值用正则表达式修改响应 Header 的值如脱敏处理。配置示例filters: -RewritePath/test/version1/(?segment.*),/$\{segment} -name:RewriteResponseHeader args: name:X-User-Phone regexp:(.{3}).\*(.{4})# 保留前3位和后4位 replacement:\$1\*\*\*\*\$2 # 手机号脱敏为 138\*\*\*\*56785.DedupeResponseHeader作用去重响应头当响应头存在多个相同名称时去重并保留指定值。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - name: DedupeResponseHeader args: name: Access-Control-Allow-Origin strategy: RETAIN\_FIRST # 保留第一个值场景解决跨域配置中Access-Control-Allow-Origin重复的问题。6.RemoveJsonAttributesResponseBody作用从根层 JSON 响应结果中移除指定字段只对 Content-Type: application/json 的响应生效。配置示例filters: - RewritePath/test/version1/(?segment.*),/$\{segment} - RemoveJsonAttributesResponseBodyxiaofu场景比如在某些敏感或无意义的字段下游服务暂时无法改动而响应结果又不想暴漏出来的字段。注意2021.x版本的网关还不支持需要高版本。7.SetStatus设置响应状态码作用强制修改响应的 HTTP 状态码如将 404 改为 200 并返回自定义提示。配置示例filters: - name: SetStatus args: status: 200 # 无论服务返回什么响应状态码都设为 2008.RewriteLocationResponseHeader作用重写响应头中的 Location用于反向代理场景。 NEVER_STRIP、AS_IN_REQUEST默认和 ALWAYS_STRIP。NEVER_STRIP: 即使最初的请求路径不包含versionversion也不会被剥离。AS_IN_REQUEST: 只有当原始请求路径不包含version时才会剥离version。ALWAYS_STRIP: version 总是被剥离即使原始请求路径包含version 。配置示例filters: - RewriteLocationResponseHeaderAS_IN_REQUEST, Location三、路径处理相关修改请求路径与跳转相关的操作1.RewritePath最常用作用重写请求路径用正则表达式修改请求路径如去掉/api前缀。配置示例filters: - name: RewritePath args: regexp: /api/(?\segment.\*) # 匹配 /api/test replacement: /\$\\{segment} # 重写为 /test转发到下游服务场景前端请求带/api前缀网关转发时去掉适配下游服务接口路径。2.PrefixPath作用给路径添加前缀转发前给请求路径添加指定前缀如下游服务接口统一带/v1。配置示例filters: - name: PrefixPath args: prefix: /v1 # 请求 /user → 转发到 /v1/user3.StripPrefix作用移除路径前缀移除路径中指定数量的前缀段如/api/v1/user移除 2 段前缀。配置示例filters: - name: StripPrefix args: parts: 2 # /api/v1/user → 转发到 /user注意与RewritePath的区别是StripPrefix按段数移除RewritePath按正则匹配更灵活。4.RedirectTo作用重定向请求将请求重定向到指定 URL支持 301/302 状态码。配置示例filters: - name: RedirectTo args: status: 302 # 临时重定向 url: https://baidu.com # 重定向到新域名场景域名迁移、旧接口废弃时引导到新地址。5.SetPath作用直接设置路径用模板语法直接设置请求路径替代原有路径。配置示例filters: - name: SetPath args: template: /fixed/path # 所有请求都转发到 /fixed/path四、安全相关控制请求参数与路由转发相关的操作比如请求限流、重试、负载均衡等。1.RequestRateLimiter作用基于令牌桶算法限流默认用 Redis 存储限流计数。配置示例filters: -RewritePath/test/version1/(?segment.*),/$\{segment} -name:RequestRateLimiter args: redis-rate-limiter.replenishRate:10# 令牌桶填充速率每秒10个 redis-rate-limiter.burstCapacity:20# 令牌桶最大容量最多存20个 key-resolver:#{myKeyResolver} # 需自定义 KeyResolverkey-resolver用于定义如何生成限流的key这通常基于请求的某些属性如IP地址、用户ID等。你可以通过实现 KeyResolver 接口来自定义key解析器。import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; Component(myKeyResolver) public class MyKeyResolver implements KeyResolver { Override public MonoString resolve(ServerWebExchange exchange) { // 例如根据请求头中的某个字段生成key return Mono.just(8888888x-api-key:exchange.getRequest().getHeaders().getFirst(x-api-key)); } }由于默认是 redis 做底层限流所以这里要加上 redis 配置信息spring: redis: host: localhost port: 6379 password: xxxx场景保护下游服务防止流量过载如秒杀接口限制单 IP 访问频率。2.Retry作用请求重试当服务返回指定状态码或超时自动重试请求。配置示例filters: -name:Retry args: retries:3# 最多重试3次 statuses:BAD_GATEWAY,SERVICE_UNAVAILABLE# 遇到 502/503 重试 methods:GET,POST backoff: firstBackoff:10ms# 第一次重试延迟100ms maxBackoff:50ms# 最大延迟1s factor:2# 延迟倍数100ms → 200ms → 400ms basedOnPreviousValue:false注意重试可能导致下游服务重复处理需确保接口幂等性。3.Hystrix作用熔断降级已过时推荐CircuitBreaker服务调用超时或失败时触发熔断并返回降级响应。配置示例filters: - name: Hystrix args: name: fallbackCommand # 熔断命令名 fallbackUri: forward:/fallback # 降级接口返回默认数据4.CircuitBreaker作用熔断降级替代 Hystrix基于 Resilience4j 实现熔断支持超时、失败率阈值配置。配置示例filters: -name:CircuitBreaker args: name:myCircuitBreaker fallbackUri:forward:/inCaseOfFailureUseThis# 这里是网关内的控制器uri statusCodes:# 也可根据状态来控制是否熔断 -500 -NOT_FOUNDRestController RequestMapping(/) Slf4j public class InCaseOfFailureUseThisController { GetMapping(value /inCaseOfFailureUseThis) public String inCaseOfFailureUseThis() { System.out.println(inCaseOfFailureUseThis); return inCaseOfFailureUseThis; } }如果我们希望熔断后不路由到网关而且是转发到其他的外部路径可以如下设置。spring: cloud: gateway: routes: -id:ingredients uri:http://127.0.0.1:12041/ predicates: -Path//ingredients/** filters: -name:CircuitBreaker args: name:myCircuitBreaker fallbackUri:forward:/fallback -id:myCircuitBreaker-fallback uri:http://localhost:9994 predicates: -Path/fallback5.SaveSession在转发调用下游之前强制进行 WebSession::save 操作这在使用类似 Spring Session 的懒数据存储时特别有用因为你需要确保在进行转发调用之前已经保存了Session状态。配置示例filters: - SaveSession如果集成了 Spring Security 与 Spring Session 而且希望确保安全细节已被转发到下游进程这一点至关重要。写在最后这期东西还是很多的其实 80% 的路由增强场景如路径重写、限流、跨域都能通过内置过滤器实现无需手写代码所有不要动不动就想着加过滤器。还有在使用过滤器的时候要注意多个过滤器的配置顺序顺序不对容易出奇奇怪怪的问题哦。看完等于学会点个赞吧