Spring Cloud Gateway 学习笔记一

目录

  • SpringCloudGateway 角色及初始化过程
    • 1.RouteDefinition
    • 2.RouteDefinitionLocator
    • 3.Route对象
    • 4.RouteLocator
    • 5.FilteringWebHandler
    • 6.RoutePredicateHandlerMapping

SpringCloudGateway 角色及初始化过程

gateway 初学源码理解笔记,如有错误,望指正。

1.RouteDefinition

定义了路由定义的组合信息

  1. 路由ID: 用于全局唯一标志一条路由信息
  2. URI: 目标服务的域名信息
  3. predicate列表: 用于过滤请求,判断请求是否进行路由,可以指定如Path匹配、Header属性匹配、Host 匹配等,具体预定义的匹配项可见: org.springframework.cloud.gateway.handler.predicate 包下的PredicateFactory类。也可以通过实现RoutePredicateFactory接口,自定义匹配工厂,然后注入Spring即可使用
  4. filter列表: 对Request做的一些预处理,比如添加参数 ,修改header之类的。具体见:org.springframework.cloud.gateway.filter.factory 包下的GatewayFactory实现
  5. order: 指定路由匹配的优先级别,值越小,越优先匹配
  6. **metadata信息:**暂未研究

2.RouteDefinitionLocator

用于获取各个位置配置的RouteDefinition的接口定义,默认实现类如下:

  1. PropertiesRouteDefinitionLocator
    功能说明:用于获取yml或propertis 中配置的RouteDefinition
    使用场景:单机部署,启动前所有路由已确定,修改路由需重启服务

  2. InMemoryRouteDefinitionRepository
    功能说明:用于获取内存中的RouteDefinition,该实现提供save 和 delete方法,用于动态更新路由信息
    使用场景:网关单机部署

  3. DiscoveryClientRouteDefinitionLocator
    功能说明:从DiscoveryClient中自动拉取RouteDefinition配置信息,该实现默认未开启,需手动注入Spring
    使用场景:存在注册中心,如Eureka。当其他服务注册到Eureka后,DiscoveryClientRouteDefinitionLocator 会从Eureka中获取所有已注册的服务,当通过网关调用时,路由至对应服务,实现负载均衡
    调用方式:127.0.0.1:8080/DBSERVER/api/getApiInfo?param=replace-scheme
    其中127.0.0.1:8080为网关的IP和端口
    DBSERVER为远程服务在Eureka注册的服务名
    api/getApiInfo?param=replace-scheme 为DBSERVER 存在的具体接口声明

  4. CompositeRouteDefinitionLocator
    功能说明:组合路由定位器,构造函数接收一个Flux ,该实现的getRouteDefinitions方法提取Flux 中的所有RouteDefinitions
    本实现为Cloud Gateway的默认注入实现

  5. CachingRouteDefinitionLocator
    功能说明:暂未研究

默认初始化顺序:
PropertiesRouteDefinitionLocator -> InMemoryRouteDefinitionRepository -> 用户自己实现RouteDefinitionLocator 的类 -> CompositeRouteDefinitionLocator
注:CompositeRouteDefinitionLocator 被@Primary修饰,除非使用@Qualifier明确指定实现类,使用CompositeRouteDefinitionLocator 注入

最终:CompositeRouteDefinitionLocator.getRouteDefinitions() 获取到所有RouteDefinition

3.Route对象

路由信息,根据RouteDefinition对象定义的配置,使用RouteLocator转化为Route对象

4.RouteLocator

用于获取Router对象 ,定义:Flux getRoutes(); 默认实现如下:

  1. CompositeRouteLocator
    组合转换类,构造接收一个Flux ,缓存所有RouteLocator对象
  2. CachingRouteLocator
    路由缓存类,每次request到达时,都从该类获取Route用于匹配、过滤,该类实现ApplicationListener,处理RefreshRouteEvent事件,当路由信息变化时,用于更新Route缓存
  3. RouteDefinitionRouteLocator
    用于将CompositeRouteDefinitionLocator获取到的RouteDefinition列表转化为Route对象 ,并通过getRoutes()输出,其构造方法接收参数如下 :
    predicateFactory列表和GatewayFileterFacatory列表 :用于将已存在的所有 谓词 工厂和过滤器工厂 以key-value形式缓存,解决RouteDefinition时,方便提取对应的Factory
    RouteDefinitionLocator:用于获取所有RouteDefinitions,此处注入:CompositeRouteDefinitionLocator

默认初始化顺序:
RouteDefinitionRouteLocator 获取到所有factory和routeDefinition >> 用户自己定义的RouteLocator >> CompositeRouteLocator >> CachingRouteLocator

5.FilteringWebHandler

过滤器处理类

  1. 实现WebHandler,由web容器 调用其handle方法,执行对request的filer 链
  2. 构造方法:接收一个List ,并将GlobalFilter转化为GatewayFilter
  3. handle方法将GlobalFilter和当前route定义的GatewayFilter 合并为一个GatewayFilter链,并按order进行升序排列 ,然后依次执行GatewayFilter的 filter方法,完成对Request的处理

6.RoutePredicateHandlerMapping

request的谓词匹配实现类

  1. 构造方法:接收一个FilteringWebHandler ,将做为request的处理webhandler返回
  2. 该类为HandlerMapping的实现类,通过@Bean 交给Spring管理,WebFlux启动配置时,将获取到该类的实例,request进入WebFlux 的 DistpatchHandler 类,执行其handle方法时,会调用RoutePredicateHandlerMapping 的 gethandler方法,此处会完成对request的条件匹配,如果满足其中一个Route配置,则返回一个FilteringWebHandler ,并将满足条件的Route 写入到request对象的attributes

你可能感兴趣的:(Spring Cloud Gateway 学习笔记一)