1.高级特性—过滤器(Filter)
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生,下面将对各个过滤器进行一一说明
Spring Cloud Gateway 内置的过滤器工厂一览表如下:
1.1 AddRequestHeader GatewayFilter
通过配置name和value可以增加请求的header。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 给请求增加Header X-Request-red
# 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
- AddRequestHeader=X-Request-red, blue
请求http://localhost:9100/provider/demo/hello ,我们可以从后端获取到添加的header头
1.2 AddRequestParameter GatewayFilter
通过配置name和value可以增加请求的参数
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 给请求增加参数name
# 访问http://localhost:9100/provider/demo/feign -> eureka-client-provider/demo/feign
- AddRequestParameter=name, Trazen
通过请求http://localhost:9100/provider/demo/feign ,相当于http://localhost:9100/provider/demo/feign?name=Trazen
1.3 AddResponseHeader GatewayFilter
AddResponseHeader GatewayFilter Factory通过配置name和value可以增加响应的header。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
# 给请求增加响应的header
# 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
- AddResponseHeader=X-Response-Foo, Bar
通过请求http://localhost:9100/provider/demo/hello 可以看到返回的header中带有配置的值。
1.4 DedupeResponseHeader GatewayFilter
剔除重复的响应头。
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
#剔除重复的响应头
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_FIRST
例如:
我们在Gateway以及微服务上都设置了CORS(解决跨域)header,如果不做任何配置,请求 -> 网关 -> 微服务,获得的响应就是这样的:
Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://hxmec.com, https://hxmec.com
也就是Header重复了。要想把这两个Header去重,只需设置成如下即可。
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
也就是说,想要去重的Header如果有多个,用空格分隔即可;
去重策略:
- RETAIN_FIRST: 默认值,保留第一个值
- RETAIN_LAST: 保留最后一个值
- RETAIN_UNIQUE: 保留所有唯一值,以它们第一次出现的顺序保留
1.5 Hystrix GatewayFilter
Hystrix 过滤器允许你将断路器功能添加到网关路由中,使你的服务免受级联故障的影响,并提供服务降级处理。
要开启断路器功能,我们需要在pom.xml中添加Hystrix的相关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
然后添加相关服务降级的处理类:
@RestController
public class FallbackController {
@GetMapping("/fallback")
public Object fallback() {
Map<String,Object> result = new HashMap<>(3);
result.put("data",null);
result.put("message","request fallback!!!");
result.put("code",500);
return result;
}
}
在application-filter.yml中添加相关配置,当路由出错时会转发到服务降级处理的控制器上:
spring:
cloud:
gateway:
routes:
- id: eureka-client-provider #路由的ID
uri: lb://eureka-client-provider
predicates:
- Path=/provider/** # 路由规则
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackcmd
fallback-uri: forward:/fallback
重新启动网关后停止spring-cloud-eureka-client-provider服务,再请求http://localhost:9100/provider/demo/hello 。可以看到已经返回服务降级后的处理信息。