SpringCloud gateway 知识汇总

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud gateway 知识汇总相关的知识,希望对你有一定的参考价值。

背景

SpringCloud 的 gateway 是基于 webflux 实现的 API 网关服务,本文汇总网关相关的知识。

经典流程图

网关服务是位于 SpringCloud 端服务之前的一个模块,充当后端服务的门户:

到处都能看到的经典流程图:

主要组件

网关服务有三大组件:

  1. 路由:对应 yml 中的 routes 配置,包含四部分 id,uri,predicates,filters 。
  2. 谓词:predicate ,内置 11 种,对应路由的 predicates 配置。
  3. GatewayFilter:拦截器,对应路由的 filters 配置。

路由配置filters 的 RewritePath 属性时常见的路径替换正则解释 参考文档

常见 demo 是这样的:

filters:
   RewritePath=/mydata/(?<segment>.*), /$\\segment

它的作用是将元素请求种 mydata 这部分路径去掉,(?<segment>.*) 是一个命名分组。

谓词 predicate 对应的 11 种内置谓词

GatewayFilter

  1. 自定义 Filter 及引用规则:默认可只简写 GatewayFilterFactory 之前的部分。
  2. 获取网关真实 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);
        ));
 
  1. 相互关联的两次请求,要保证都被转发到同一个后端主机的话,如何处理?结合第一步将其缓存,然后在另外的 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动态路由教程

spring cloud 2.x版本 Gateway动态路由教程

SpringCloud GateWay 万字详解

SpringCloud集成Gateway

springcloud-gateway 网关异常处理