07 spring-cloud-gateway 的路由相关

前言

我们这里 大致梳理一下 spring-cloud-gateway 路由的相关处理 

spring-cloud 微服务组件中的网关

这里主要分为几个 步骤

  1. 路由规则怎么获取
  2. 如何路由
  3. 网关过滤器的处理
  4. 如何转发请求道下游微服务组件

 

 

路由规则怎么获取?

GatewayAutoConfiguration 中包含了 spring-cloud-gateway 实现所需要的各个对象

CachingRouteLocator 存储的是路由相关信息, CachingRouteLocator - CompositeRouteLocator - RouteDefinitionRouteLocator - CompositeRouteDefinitionLocator - DiscoveryClientRouteDefinitionLocator/PropertiesRouteDefinitionLocator

路由上面最基层的 CompositeRouteDefinitionLocator 来自于 routeDefinitionLocator, 各个 List<RouteDefinitionLocator> 来自于 spring 容器,

DiscoveryClientRouteDefinitionLocator 来自于 GatewayDiscoveryClientAutoConfiguration, 这里面定义的路由是一套默认路由, /appName/** -> appName

PropertiesRouteDefinitionLocator 来自于 GatewayAutoConfiguration

这里面定义的路由是从 properties 中加载路由配置

 

 

我们这里主要关心 DiscoveryClientRouteDefinitionLocator 和 PropertiesRouteDefinitionLocator, 这两套路由规则 加起来就是完整的路由规则

这里面根据注册的服务 为每一个服务注册了一套默认的路由方式 

这一套默认的配置方式也请参见 GatewayDiscoveryClientAutoConfiguration 中的 DiscoveryLocatorProperties

7f043709746a4088838f477f5db11bca.png

 

PropertiesRouteDefinitionLocator 

这里的配置来自于 GatewayApplication 读取到的路由配置信息, 转换为 RouteDefinition 列表 

8f8a15ae4eb540768e8089f7cb337701.png

 

 

路由规则的使用 

如下是某一个具体的 Predicate 的使用的地方 

d33f0bc226aa4c298b42063c06e670dc.png

 

FluxIterable$IterableSubscription.slowPath 中迭代所有的 路由配置  

MonoFilterWhen$MonoFilterWhenMain.onNext 目前是调用 apply 方法, 后面处理 GatewayFilter 会调用 p.subscribe(inner)

迭代的路由列表来自于

a5b31a1116da4a908936c6f17e9cf1bf.png

 

FluxIterable 的路由列表来自于 外层 CacheFlux

这里的 cacheMap 来自于 CachingRouteLocator 的路由缓存 cache 

dfde631b9a414d9bbda9b0ca9bd03f32.png

 

CacheFlux 来自于 CachingRouteLocator 中创建, routes 为当前 RouteLocator 维护的路由列表, 带缓存 

这里拿到的路由列表即为 DiscoveryClientRouteDefinitionLocator + PropertiesRouteDefinitionLocator + 自定义的 RouteDefinicationLocator 获取到的路由列表 

586bdcdab1b743ac8f0f7c4807b1c8b6.png

 

 

路由规则的自动刷新

默认的这套配置中 路由规则会自动刷新

收到 心跳信息之后, RouteRefreshListener 会发出一个 RefreshRoutesEvent

然后 CachingRouteLocator 中会刷新路由缓存 

159c9c466fc24e618a492469d7e25421.png

54cb152f3eb84d698887d03a7e127ff7.png 

 

GatewayFilter 的使用

比如 StripPrefix 对应会创建 RewritePathGatewayFilter

然后其中的业务处理就是 去掉 系统名称, /ay-resource-portals, 处理如下 

3b2b72d4419a4e798983499141ac9ef6.png

 

各个 GatewayFilter 的处理是基于 责任链模式, 这已经是一个 很典型的责任链的使用场景

比如 tomcat 的 Filter 等等 

a9905f3cec4546c2bb41de8084bf42a2.png

 

 

转发请求到下游组件

这里具体转发 请求到下游的组件 也是基于 GatewayFilter, 主要是基于 NettyRoutingFilter

基于 netty 封装的 httpClient 来发送 http 请求, 下游的服务信息来自于 匹配的 路由信息

66262b70e7c6494580bb9f35d8f66fe4.png

 

如下是对于响应的处理

后面会响应给客户端 

c11dabab86664de0b572d6927399b340.png

 

 

将数据响应给客户端

这里将 响应体 返回给客户端

fe0879c9cab549fba9bbbd3cb679d6ed.png

 

 

 

完 

 

 

 

相关推荐

  1. Spring Cloud Gateway 配置策略

    2024-04-09 06:34:06       55 阅读
  2. 【SpringCloud】6、Spring Cloud Gateway配置

    2024-04-09 06:34:06       51 阅读
  3. Spring Cloud Gateway:使用RestController动态更新

    2024-04-09 06:34:06       44 阅读
  4. Spring Cloud Gateway通过配置文件方式提供服务

    2024-04-09 06:34:06       29 阅读
  5. Spring Cloud Gateway如何匹配某路径并进行转发

    2024-04-09 06:34:06       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 06:34:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 06:34:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 06:34:06       82 阅读
  4. Python语言-面向对象

    2024-04-09 06:34:06       91 阅读

热门阅读

  1. springboot设置RestTemplate支持http&https

    2024-04-09 06:34:06       32 阅读
  2. Qt-线程2-moveToThread

    2024-04-09 06:34:06       37 阅读
  3. Rust---解构(Destructuring)

    2024-04-09 06:34:06       32 阅读
  4. Junit

    Junit

    2024-04-09 06:34:06      29 阅读
  5. 中国移动运营商网络码大全-2024

    2024-04-09 06:34:06       63 阅读
  6. arm-none-eabi-addr2line和arm-none-eabi-objdump使用笔记

    2024-04-09 06:34:06       29 阅读
  7. 18、Lua 错误处理

    2024-04-09 06:34:06       37 阅读