zuul版本的源码解析:  转载https://blog.csdn.net/forezp/article/details/76211680

  在zuul请求过程中,首先请求给zuulServlet处理,zuulServlet中有一个zuulRuuer对象,该对象中初始化了RerequestContext;作为存储

  请求的一些数据,并且被所有的zuulFilter共享, zuulRunner中还有FilterProcessor,作为整个执行所有zuulFilter的管理器,最后被

   FilterFileManager加载,首先会执行pre类型过滤器,然后在执行route类型过滤器,最后执行post类型过滤器,

   如果有错误会执行error类型的过滤器,执行完这些过滤器最终把结果返回给客户端.

 

zuul执行转发的是: ribbonRoutingFilter RibbonCommandFactoryConfiguration作为负载均衡相关的.

 

ribbon负载均衡管理 loadBalancerClient 根据serviceId获取到url 他有一个定时任务默认10秒钟从注册中心获取url

chooseServer函数获取了负载均衡策略分配到的服务实例对象server之后,将其内容包装成RibbonServer对象

Ribbon底层用的HttpClient。从createDelegate这个方法可以看出通过HttpClientBuilder建立HttpClient,并且是可配置的,配置类是CommonClientConfigKey,我们可以配置这几个参数实现对于连接池大小和每个路由连接大小的控制

RibbonRoutingFilter:它的执行顺序为10,是route阶段第一个执行的过滤器。该过滤器只对请求上下文中存在serviceId参数的请求进行处理,即只对通过serviceId配置路由规则的请求生效。而该过滤器的执行逻辑就是面向服务路由的核心,它通过使用Ribbon和Hystrix来向服务实例发起请求,并将服务实例的请求结果返回。

SimpleHostRoutingFilter:它的执行顺序为100,是route阶段第二个执行的过滤器。该过滤器只对请求上下文中存在routeHost参数的请求进行处理,即只对通过url配置路由规则的请求生效。而该过滤器的执行逻辑就是直接向routeHost参数的物理地址发起请求,从源码中我们可以知道该请求是直接通过httpclient包实现的,而没有使用Hystrix命令进行包装,所以这类请求并没有线程隔离和断路器的保护。

 

==================================F版本网关=====================================================

转载: http://cmsblogs.com/?p=3604

DispatcherHandler :接收到请求,匹配 HandlerMapping ,此处会匹配到 RoutePredicateHandlerMapping 。

RoutePredicateHandlerMapping :接收到请求,匹配 Route 。

FilteringWebHandler :获得 Route 的 GatewayFilter 数组,创建 GatewayFilterChain 处理请求。

1.首先在config包内,加载他的配置信息,

  ① GatewayAutoConfiguration: 核心配置类:

        加载RoutePredicateHandlerMapping: 加载route配置

         NettyConfiguration:

               NettyRoutingFilter: 创建一个底层使用的是reactor的httpclient,请求下游服务

         GlobalFilter: 实现类 ServerWebExchange里面存放着request信息,response, attributes等等

                             GatewayFilterChain: 主要是用于构建当前执行过滤对应的下次执行的链表

            ① RouteToRequestUrlFilter: 根据匹配的 Route,计算请求地址得到 lb://XC-APP-SERVER-DEV/video/queryVideo

           ②  ForwardRoutingFilter : 转发路由网关过滤器。其根据 forward:// 前缀( Scheme )过滤处理,

                                                    将请求转发到当前网关实例本地接口

         FilteringWebHandler: 通过创建请求对应的 Route 对应的 GatewayFilterChain 进行处理
      

        PrefixPathGatewayFilterFactory:可以看到这里使用config的prefix构造newPath,然后构造新的ServerHttpRequest

        RouteDefinitionLocator: 实现接口或者类

            ① RouteDefinitionRepository:通过实现该接口,实现从存储器( 例如,内存 / Redis / MySQL 等 )

                                                         读取、保存、删除路由配置。默认是基于内存的存储器       

            ②  DiscoveryClientRouteDefinitionLocator: DiscoveryClient 注册发现客户端,用于向注册中心发起请求,

                                           获取注册(HttpClient) 在注册中心的服务列表,生成对应的 RouteDefinition 数组。

         

       RouteLocator 可以直接自定义路由( org.springframework.cloud.gateway.route.Route ) ,

                             也可以通过 RouteDefinitionRouteLocator 获取 RouteDefinition ,并转换成 Route

  ② GateWayLoadBalancerClientAutoCofiguraytion :

      初始化LoadBalancerClientFilter负载均衡,根据 lb:// 前缀过滤处理,使用 serviceId 选择一个服务实例,

       从而实现负载均衡

 ③ GatewayClassPathWarningAutoConfiguration:

    检查项目是否正确导入webflux

 ④ GatewayRedisAutoConfiguration:

   初始化 RedisRateLimiter 。使用 Redis + Lua 实现分布式限流。而限流的粒度,默认情况下根据令牌桶算法

 

2.GatewayControllerEndpoint: 提供管理网关的 HTTP API : 刷新,获取所有路由等等;

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐