图书馆新生专栏网站建设重庆网网站建设公司
2026/2/16 14:01:27 网站建设 项目流程
图书馆新生专栏网站建设,重庆网网站建设公司,espresso wordpress函数,erp软件免费版发现公司的网关项目里有很多的轮子#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-120412uri: http://127.0.0.1:12041/predicates:- Weightxiaofu-group, 1- Path/test/version1/**filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: AddRequestHeaderargs:name: X-Request-Source # Header名称value: gateway # Header值场景传递请求来源标识如gateway、app方便下游服务做权限控制。2. RemoveRequestHeader作用移除请求中的 Header转发前移除请求中指定的 Header如敏感信息。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: RemoveRequestHeaderargs:name: Authorization # 移除客户端传来的 Authorization 头场景下游服务不需要客户端直接传递的令牌由网关统一处理认证时使用。3. SetRequestHeader作用覆盖请求中的 Header若请求中已存在指定 Header直接覆盖其值不存在则添加。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: SetRequestHeaderargs:name: Authorizationvalue: 111111 # 强制将 Authorization 设为 111111注意与 AddRequestHeader 的区别是SetRequestHeader 会覆盖原有值而 AddRequestHeader 会保留原有值若存在。4. AddRequestParameter作用转发请求时给请求添加参数URL 或请求体添加参数支持 GET/POST。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: AddRequestParameterargs:name: fromvalue: gateway # 所有请求会带上 ?fromgateway 参数场景统计请求来源或给下游服务传递额外标识如灰度标记。5. RemoveRequestParameter作用移除请求中的参数转发前移除请求中的指定参数如敏感参数 password。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: RemoveRequestParameterargs:name: password # 移除请求中的 password 参数6. MapRequestHeader作用把网关请求头的值映射到另一个请求头里。比如前端调用网关请求头有一个 X-User-Id 用来验证但是要转发的下游服务只校验请求头 userId这时要自动做一个映射。配置示例filters:- MapRequestHeaderX-User-Id, userId7. RequestSize作用限制请求体大小拒绝请求体超过指定大小的请求防止大文件上传压垮服务。配置示例filters:- name: RequestSizeargs:maxSize: 10MB # 最大请求体10MB超过返回4138. RequestHeaderSize作用限制请求头大小拒绝请求头超过指定大小的请求如下任何请求头的大小超过1000字节这将发送一个 431状态码的响应。配置示例filters:- RequestHeaderSize1000B9. PreserveHostHeader作用保留原始 Host 头转发请求时保留客户端的原始 Host 头默认会改为下游服务的 Host。配置示例filters:- name: PreserveHostHeader # 无参数直接启用场景下游服务依赖 Host 头进行逻辑处理时使用。10. SetRequestHostHeader作用某些情况下host 头可能需要被重写。修改请求的 Host 头转发请求时强制修改 Host 头为指定值。配置示例filters:- name: SetRequestHostHeaderargs:host: target-service.com # 强制 Host 头为 target-service.com11. CacheRequestBody作用缓存请求体请求体如 POST 请求的 JSON 数据我们知道默认请求体只能读一次所以为了后续的操作使用该过滤器来缓存请求体然后再把它发送到下游从 exchange 属性中获取请求体。配置示例filters:- name: CacheRequestBodyargs:cacheName: requestBodyCache # 缓存名称场景多个过滤器需要读取请求体时使用如先校验签名再解析参数。二、响应相关主要是调整服务返回的响应信息比如响应头 Header 等。1. AddResponseHeader作用给响应添加 Header服务返回响应后给响应添加指定 Header如跨域标识、缓存控制。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: AddResponseHeaderargs:name: X-Response-Timevalue: 120 # 可结合全局过滤器动态设置响应时间场景添加 Cache-Control: max-age3600 控制静态资源缓存。2. RemoveResponseHeader作用移除响应中的 Header移除服务返回的敏感响应头如 X-Application-Context 暴露服务信息。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: RemoveResponseHeaderargs:name: X-Application-Context3. SetResponseHeader作用覆盖响应中的 Header覆盖服务返回的响应头如统一设置 Content-Encoding。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: SetResponseHeaderargs:name: Content-Encodingvalue: gzip # 强制响应使用 gzip 编码4. RewriteResponseHeader作用重写响应 Header 的值用正则表达式修改响应 Header 的值如脱敏处理。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: RewriteResponseHeaderargs:name: X-User-Phoneregexp: (.{3}).\*(.{4}) # 保留前3位和后4位replacement: \$1\*\*\*\*\$2 # 手机号脱敏为 138\*\*\*\*56785. DedupeResponseHeader作用去重响应头当响应头存在多个相同名称时去重并保留指定值。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: DedupeResponseHeaderargs:name: Access-Control-Allow-Originstrategy: 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: SetStatusargs: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: RewritePathargs:regexp: /api/(?\segment.\*) # 匹配 /api/testreplacement: /\$\\{segment} # 重写为 /test转发到下游服务场景前端请求带 /api 前缀网关转发时去掉适配下游服务接口路径。2. PrefixPath作用给路径添加前缀转发前给请求路径添加指定前缀如下游服务接口统一带 /v1。配置示例filters:- name: PrefixPathargs:prefix: /v1 # 请求 /user → 转发到 /v1/user3. StripPrefix作用移除路径前缀移除路径中指定数量的前缀段如 /api/v1/user 移除 2 段前缀。配置示例filters:- name: StripPrefixargs:parts: 2 # /api/v1/user → 转发到 /user注意与 RewritePath 的区别是StripPrefix 按段数移除RewritePath 按正则匹配更灵活。4. RedirectTo作用重定向请求将请求重定向到指定 URL支持 301/302 状态码。配置示例filters:- name: RedirectToargs:status: 302 # 临时重定向url: https://baidu.com # 重定向到新域名场景域名迁移、旧接口废弃时引导到新地址。5. SetPath作用直接设置路径用模板语法直接设置请求路径替代原有路径。配置示例filters:- name: SetPathargs:template: /fixed/path # 所有请求都转发到 /fixed/path四、安全相关控制请求参数与路由转发相关的操作比如请求限流、重试、负载均衡等。1. RequestRateLimiter作用基于令牌桶算法限流默认用 Redis 存储限流计数。配置示例filters:- RewritePath/test/version1/(?segment.*),/$\{segment}- name: RequestRateLimiterargs: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 {Overridepublic MonoString resolve(ServerWebExchange exchange) {// 例如根据请求头中的某个字段生成keyreturn Mono.just(8888888x-api-key:exchange.getRequest().getHeaders().getFirst(x-api-key));}}由于默认是 redis 做底层限流所以这里要加上 redis 配置信息spring:redis:host: localhostport: 6379password: xxxx场景保护下游服务防止流量过载如秒杀接口限制单 IP 访问频率。2. Retry作用请求重试当服务返回指定状态码或超时自动重试请求。配置示例filters:- name: Retryargs:retries: 3 # 最多重试3次statuses: BAD_GATEWAY, SERVICE_UNAVAILABLE # 遇到 502/503 重试methods: GET,POSTbackoff:firstBackoff: 10ms # 第一次重试延迟100msmaxBackoff: 50ms # 最大延迟1sfactor: 2 # 延迟倍数100ms → 200ms → 400msbasedOnPreviousValue: false注意重试可能导致下游服务重复处理需确保接口幂等性。3. Hystrix作用熔断降级已过时推荐 CircuitBreaker服务调用超时或失败时触发熔断并返回降级响应。配置示例filters:- name: Hystrixargs:name: fallbackCommand # 熔断命令名fallbackUri: forward:/fallback # 降级接口返回默认数据4. CircuitBreaker作用熔断降级替代 Hystrix基于 Resilience4j 实现熔断支持超时、失败率阈值配置。配置示例filters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/inCaseOfFailureUseThis # 这里是网关内的控制器uristatusCodes: # 也可根据状态来控制是否熔断- 500- NOT_FOUNDRestControllerRequestMapping(/)Slf4jpublic class InCaseOfFailureUseThisController {GetMapping(value /inCaseOfFailureUseThis)public String inCaseOfFailureUseThis() {System.out.println(inCaseOfFailureUseThis);return inCaseOfFailureUseThis;}}如果我们希望熔断后不路由到网关而且是转发到其他的外部路径可以如下设置。spring:cloud:gateway:routes:- id: ingredientsuri: http://127.0.0.1:12041/predicates:- Path//ingredients/**filters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/fallback- id: myCircuitBreaker-fallbackuri: http://localhost:9994predicates:- Path/fallback5. SaveSession在转发调用下游之前强制进行 WebSession::save 操作这在使用类似 Spring Session 的懒数据存储时特别有用因为你需要确保在进行转发调用之前已经保存了Session状态。配置示例filters:- SaveSession如果集成了 Spring Security 与 Spring Session 而且希望确保安全细节已被转发到下游进程这一点至关重要。写在最后

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询