Spring Cloud Gateway - GatewayFilter路由过滤器
本文会对Spring cloud Gateway 作更深入的应用解析。
既然网关会对请求进行权限验证, 这一步就会在GatewayFilter里实现。
路由过滤器 GatewayFilter
Filter 可以对进入网关的请求进行处理 , 例如读取/修改 Headers…
同样地, 可以对微服务返回的相应(response) 做处理(例如 enable CORS)再返回给客户端。
过滤器工厂 GatewayFilterFactories
Spring Cloud 已经提供了各种各样的过滤器工厂, 我们很难对它们都研究透彻。
但是, Spring的文档和很完善
https://cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories
里面已经有完善的解析和例子。
例如:
AddRequestHeader
这个一看就是用来对请求加上Header的
用的时候查阅文档无脑向配置文件写就行。
例子
Api gateway 的配置文件, 加上:
- id: demo-cloud-user-service_check_header
# uri: http://xxx.xx.xxx.x:xxxx Not suggestion to use
uri: lb://demo-cloud-user-service # lb means load balance
predicates: # url mapping
- Path=/checkheader/**
filters:
- AddRequestHeader=tokenA, AAAAA
- AddRequestHeader=tokenB, BBBBB
作用于user service的checkheader 下面的url
然后为所有请求加上两个header tokenA tokenB
在user sevice上加上1个HeaderController:
@RestController
@RequestMapping("/checkheader")
public class HeaderController {
@Autowired
private UserService userService;
@GetMapping("/user/{id}")
public User queryById(@PathVariable("id") Long id,
@RequestHeader(value="tokenA", required = false) String tokenA,
@RequestHeader(value="tokenB", required = false) String tokenB) {
User user = userService.queryById(id);
String tokens = String.format("token A: %s, token B: %s", tokenA, tokenB);
user.setAddress(user.getAddress() + tokens);
return user;
}
}
注意在controller的接口加上两个接受Header的参数。
然后把token 加在地址上返回给前段
测试:
默认Filters, default-filters
如果我们想令某个Filter对全局生效, 所谓全局就是Gateway 所有的API
那么我们可以利用default-filters
server:
port: 8890
spring:
application:
name: demo-cloud-api-gateway # cannot use _
cloud:
gateway:
routes:
- id: demo-cloud-user-service
# uri: http://xxx.xx.xxx.x:xxxx Not suggestion to use
uri: lb://demo-cloud-user-service # lb means load balance
predicates: # url mapping
- Path=/user/**
- id: demo-cloud-user-service_check_header
# uri: http://xxx.xx.xxx.x:xxxx Not suggestion to use
uri: lb://demo-cloud-user-service # lb means load balance
predicates: # url mapping
- Path=/checkheader/**
filters:
- AddRequestHeader=tokenA, AAAAA
- AddRequestHeader=tokenB, BBBBB
- id: demo-cloud-user-service
uri: lb://demo-cloud-order-service # lb means load balance
predicates: # url mapping
- Path=/order/**
default-filters:
- AddRequestHeader=tokenGlobal, GGGGG