SpringCloud gateway 知识汇总
Posted 毕小宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud gateway 知识汇总相关的知识,希望对你有一定的参考价值。
背景
SpringCloud 的 gateway 是基于 webflux 实现的 API 网关服务,本文汇总网关相关的知识。
经典流程图
网关服务是位于 SpringCloud 端服务之前的一个模块,充当后端服务的门户:
到处都能看到的经典流程图:
主要组件
网关服务有三大组件:
- 路由:对应 yml 中的 routes 配置,包含四部分 id,uri,predicates,filters 。
- 谓词:predicate ,内置 11 种,对应路由的 predicates 配置。
- GatewayFilter:拦截器,对应路由的 filters 配置。
路由配置filters 的 RewritePath 属性时常见的路径替换正则解释 参考文档。
常见 demo 是这样的:
filters:
RewritePath=/mydata/(?<segment>.*), /$\\segment
它的作用是将元素请求种 mydata 这部分路径去掉,(?<segment>.*)
是一个命名分组。
谓词 predicate 对应的 11 种内置谓词。
GatewayFilter
- 自定义 Filter 及引用规则:默认可只简写
GatewayFilterFactory
之前的部分。 - 获取网关真实 IP 的用法 参考文档
在自定义 Filter 获取到数据后可以从 exchange 种得到:
public Mono<Void> filter(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:
Map<String, Object> attributes = exchange.getAttributes();
// 使用与前一个请求一样的主机和端口
url = url.concat(request.getPath().value());
// 重置网确请求 URL ,保证后面的转发与前面的请求是由同一个主机
attributes.put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, new URI(url));
以上是关于SpringCloud gateway 知识汇总的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud H版 GateWay 过滤器讲解 及 使用Guava 统一限流处理。
spring cloud 2.x版本 Gateway动态路由教程