前言
我们这里 大致梳理一下 spring-cloud-gateway 路由的相关处理
spring-cloud 微服务组件中的网关
这里主要分为几个步骤
- 路由规则怎么获取
- 如何路由
- 网关过滤器的处理
- 如何转发请求道下游微服务组件
路由规则怎么获取?
GatewayAutoConfiguration 中包含了spring-cloud-gateway 实现所需要的各个对象
CachingRouteLocator 存储的是路由相关信息, CachingRouteLocator – Composit服务器托管eRouteLocator – RouteDefinitionRouteLocator – CompositeRouteDefinitionLocator – DiscoveryClientRouteDefinitionLocator/PropertiesRouteDefinitionLocator
路由上面最基层的 CompositeRouteDefinitionLocator 来自于 routeDefinitionLocator, 各个 List 来自于 spring 容器,
DiscoveryClientRouteDefinitionLocator 来自于 GatewayDiscoveryClientAutoConfiguration, 这里面定义的路由是一套默认路由, /appName/** -> appName
PropertiesRouteDefinitionLocator 来自于 GatewayAutoConfiguration
这里面定义的路由是从 properties 中加载路由配置
我们这里主要关心 DiscoveryClientRouteDefinitionLocator和PropertiesRouteDefinitionLocator, 这两套路由规则加起来就是完整的路由规则
这里面根据注册的服务为每一个服务注册了一套默认的路由方式
这一套默认的配置方式也请参见GatewayDiscoveryClientAutoConfiguration 中的DiscoveryLocatorProperties
PropertiesRouteDefinitionLocator
这里的配置来自于GatewayApplication 读取服务器托管到的路由配置信息,转换为RouteDefinition 列表
路由规则的使用
如下是某一个具体的Predicate 的使用的地方
FluxIterable$IterableSubscription.slowPath 中迭代所有的路由配置
MonoFilterWhen$MonoFilterWhenMain.onNext 目前是调用apply方法,后面处理GatewayFilter 会调用p.subscribe(inner)
迭代的路由列表来自于
FluxIterable 的路由列表来自于 外层 CacheFlux
这里的cacheMap 来自于CachingRouteLocator的路由缓存 cache
CacheFlux 来自于CachingRouteLocator 中创建,routes 为当前RouteLocator 维护的路由列表,带缓存
这里拿到的路由列表即为DiscoveryClientRouteDefinitionLocator+PropertiesRouteDefinitionLocator+自定义的RouteDefinicationLocator 获取到的路由列表
路由规则的自动刷新
默认的这套配置中 路由规则会自动刷新
收到心跳信息之后,RouteRefreshListener 会发出一个RefreshRoutesEvent
然后CachingRouteLocator 中会刷新路由缓存
GatewayFilter 的使用
比如StripPrefix 对应会创建 RewritePathGatewayFilter
然后其中的业务处理就是去掉 系统名称,/ay-resource-portals, 处理如下
各个GatewayFilter 的处理是基于责任链模式, 这已经是一个很典型的责任链的使用场景
比如tomcat 的Filter 等等
转发请求到下游组件
这里具体转发 请求到下游的组件 也是基于GatewayFilter,主要是基于 NettyRoutingFilter
基于netty 封装的httpClient 来发送http 请求,下游的服务信息来自于匹配的 路由信息
如下是对于响应的处理
后面会响应给客户端
将数据响应给客户端
这里将响应体 返回给客户端
完
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 【Bugs】class path resource [xxx.xml] cannot be opened because it does not exist
报错: 关键报错信息: class path resource [scope.xml] cannot be opened because it does not exist 完整报错信息: 2024-03-01 14:26:58 866 [main] DEBU…