Spring Cloud Gateway中 Filters的理解
Filters
Filters拦截器的作用是,对请求进行处理
可以进行流量染色
⭐增加请求头
例子
yaml
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://localhost:8123
predicates:
- Path=/api/**
filters:
- AddRequestHeader=ylx,666
访问 http://localhost:8080/api/name 自动跳转到 http://localhost:8123/api/name
http://localhost:8123/api/name 后端中获取request.getHeader("ylx") 中的请求头,打印出来666
说明添加请求头成功
我们可以通过在请求头上添加信息,特定的标识,可以实现对接口的保护,确保只有带有这个请求头的请求才能被下游的服务认可并允许调用。这就是流量染色
⭐增加请求参数
yaml
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://localhost:8123
predicates:
- Path=/api/**
filters:
- AddRequestHeader=ylx,666
- AddRequestParameter=name,ylx
过滤器AddRequestParameter=name,ylx 添加ylx到参数name中
❓为什么控制器方法参数没有添加注解@RequestParam
gateway网关中配置的添加请求参数也能添加到控制器的方法参数中?
💡请求参数默认绑定 : 在 GET 请求中,控制器方法的参数如果与请求中的参数名匹配,Spring MVC 会自动将请求参数绑定到方法参数上。这种自动绑定的行为是 Spring MVC 的核心功能之一,不需要显式的 @RequestParam
注解。@RequestParam
注解只是用于明确指定请求参数名和方法参数之间的映射关系,但如果参数名匹配,Spring MVC 会自动处理这个绑定。
添加响应头
yaml
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://localhost:8123
predicates:
- Path=/api/**
filters:
- AddResponseHeader=ylxresponse,success
访问 localhost:8080/api/name
自动跳转到 localhost:8123/api/name
打开浏览器控制台,查看响应,响应成功
⭐CircuitBreaker(断路器)
断路器的作用:实现服务的降级。
使用前提:
添加依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
在项目gateway中添加配置
yaml
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://localhost:8123
predicates:
- Path=/api/**
filters:
- AddResponseHeader=ylxresponse,success
- name: CircuitBreaker
args:
name: myCircuitbreaker
fallbackUri: forward:/fallback
- id: new_route
uri: https://www.ylxovo.cyou
predicates:
- Path=/fallback
解释:
路由一
add_request_header_route
重定向地址:http://localhost:8123
断言:Path=/api/**
过滤器:
- 添加响应头:ylxresponse,success
- 添加断路器:
- name: CircuitBreaker
- 参数args:
- name: 短路器名称
- 降级地址:forward:/fallback
路由二
new_route
重定向地址:https://www.ylxovo.cyou
断言:Path=/fallback
add_request_header_route路由会添加响应头,并通过断路器实现降级功能。当路由的目标地址出现故障,请求会被转发到 /fallback
路由,路由二的断言规则符合,则将路由转发到路由二中,即new_route
CacheRequestBody
作用:让原本的请求信息中的body参数可以被多次读取。默认情况下,请求中的body参数只能被读取一次,使用这个配置之后,可以多次的读取请求中的body参数,并将其作为一个持久化的缓存。
yaml
spring:
cloud:
gateway:
routes:
- id: cache_request_body_route
uri: lb://downstream
predicates:
- Path=/downstream/**
filters:
- name: CacheRequestBody
args:
bodyClass: java.lang.String
DedupeResponseHeader 去重复
作用:请求经过多个服务器之后,每个服务器都会添加一个跨域头。但是都是重复的跨域头,可能会导致最终跨域失败,为了解决这个问题,我们可以使用这个配置来去除重复的响应头;检查响应头是否包含重复的头信息,并进行去重处理。另外还提供了一些去重策略。
yaml
spring:
cloud:
gateway:
routes:
- id: dedupe_response_header_route
uri: https://example.org
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
Retry Gateway filter 重试
Retry
网关过滤器在 Spring Cloud Gateway 中用于自动重试失败的请求。这对于处理临时性的网络问题或者服务的不稳定性非常有用。
配置Retry网关过滤器
yaml
spring:
cloud:
gateway:
routes:
- id: retry_route
uri: http://httpbin.org
filters:
- name: Retry
args:
retries: 3 # 设置重试次数
statuses: 500, 502, 503, 504 # 设置哪些 HTTP 状态码会触发重试
backoff: 2000 # 设置重试的间隔时间,单位是毫秒
predicates:
- Path=/delay/3
⭐Default filters 默认过滤器
以上我们过滤器都是在单个路由下,只在一个路径下生效,或者是对一个断言生效。
Default filters 可以给整个网关订一些默认的过滤器,比如染色功能
全局的染色:给所有经过网关的请求都加一个响应头
yaml
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=source, ylx
⭐跨域配置
可以直接在网关定义想要的跨域配置、可以指定允许跨域的请求头,那些请求需要跨域支持,以及允许的跨域方法,通过网关配置可以简单的集中地管理跨域设置
Spring Cloud Gateway 并不直接提供一个全局的 CORS 过滤器,而是通过 Spring 的标准方式配置 CORS。你可以通过 Spring Boot 的 CorsConfiguration
和 CorsConfigurationSource
实现这个功能。下面是具体的步骤和示例:
yaml
spring:
cloud:
gateway:
globalcors:
cors-configurations:
"[/**]":
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allowedHeaders:
- "*"
allowCredentials: true
这个配置会为所有路径([/**]
)启用 CORS。具体参数说明如下:
allowedOrigins
: 允许哪些源访问,*
表示允许所有源。你可以根据需要设置具体的源地址。allowedMethods
: 允许的 HTTP 方法。你可以指定GET
,POST
,PUT
,DELETE
,OPTIONS
等。allowedHeaders
: 允许的请求头,*
表示允许所有头部。你也可以设置具体的头部名称。allowCredentials
: 是否允许发送凭证(如 cookies)。设置为true
表示允许。