SpringCloud 的 gateway 是基于 webflux 实现的 API 网关服务,本文汇总网关相关的知识。
经典流程图网关服务是位于 SpringCloud 端服务之前的一个模块,充当后端服务的门户:
到处都能看到的经典流程图:
网关服务有三大组件:
- 路由:对应 yml 中的 routes 配置,包含四部分 id,uri,predicates,filters 。
- 谓词:predicate ,内置 11 种,对应路由的 predicates 配置。
- GatewayFilter:拦截器,对应路由的 filters 配置。
路由配置filters 的 RewritePath 属性时常见的路径替换正则解释 参考文档。
常见 demo 是这样的:
filters: RewritePath=/mydata/(?.*), /${segment}
它的作用是将元素请求种 mydata 这部分路径去掉,(?
谓词 predicate 对应的 11 种内置谓词。
GatewayFilter- 自定义 Filter 及引用规则:默认可只简写 GatewayFilterFactory 之前的部分。
- 获取网关真实 IP 的用法 参考文档
在自定义 Filter 获取到数据后可以从 exchange 种得到:
public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).then().then(Mono.fromRunnable(() -> { // 真实的 IP,可以全局缓存 URI uri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); chain.filter(exchange); })); }
- 相互关联的两次请求,要保证都被转发到同一个后端主机的话,如何处理?结合第一步将其缓存,然后在另外的 Filter 中重置 URL:
Mapattributes = exchange.getAttributes(); // 使用与前一个请求一样的主机和端口 url = url.concat(request.getPath().value()); // 重置网确请求 URL ,保证后面的转发与前面的请求是由同一个主机 attributes.put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, new URI(url));



