Gateway源码分析
2025-02-26 15:03:17   1  举报             
     
         
 Gateway源码分析,分享给大家学习。 更多干货内容,欢迎关注我的公众号:Fox爱分享
    作者其他创作
 大纲/内容
 DispatcherHandler#handle
  返回的是Mono.empty(),不会触发handleResult方法
  implements
  RouteDefinitionRouteLocator
  gateway实现的WebHandler
  NettyConfiguration
  netty线程模型,处理read事件
  调用路由断言工厂,进行路由匹配
  @Bean
  2.根据请求url和断言条件匹配路由
  初始化
  LoadBalancerClientFilter
  Netty 配置类
  通过httpClient发送请求到下游微服务
  GatewayLoadBalancerClientAutoConfiguration
  choose(exchange)
  HandlerResultHandler:处理响应结果
  PropertiesRouteDefinitionLocator
  执行Gateway过滤器链
  Route.async(routeDefinition).asyncPredicate(predicate)\t\t\t\t.replaceFilters(gatewayFilters).build()
  通过 GatewayFilterAdapter 将 GlobalFilter 适配成 GatewayFilter
  xxxRoutePredicateFactory
  GatewayReactiveLoadBalancerClientAutoConfiguration
  RouteDefinitionLocator
  Gateway实现的HandlerMapping,匹配请求对应的 Route ,并返回 FilteringWebHandler
  用户发起request请求
  HttpClient
    RouteDefinitionRouteLocator#convertToRoute
  GlobalFilter实现类
  LoadBalancerClientFilter#filter
  添加路由中配置的GateWayFilter和GlobalFilter到filter链中
  @Configuration
  r.getPredicate().apply(exchange)
  GatewayAutoConfiguration
  调用HandlerMapping#getHandler
  routeLocator.getRoutes()
  http://192.168.65.103:8888/order/findOrderByUserId/1
  调用HandlerResultHandler#handleResult
  GatewayPredicate#test
   WebHandler
  可以将RouteDefinition转换为Route
  GatewayProperties#getRoutes
  Mono.just(webHandler)
  请求url: http://192.168.65.103:8020/order/findOrderByUserId/1
  HandlerAdapter#handle
  GlobalFilter
  lookupRoute(exchange)
  获取服务实例
  AbstractHandlerMapping#getHandler
  Netty 路由网关过滤器,请求下游微服务
  重建请求的url
  RoutePredicateFactory beans
  GatewayProperties
  用于从配置文件( 比如yml/ properties) 读取路由配置信息
  Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);  List<GatewayFilter> gatewayFilters = route.getFilters();List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);  combined.addAll(gatewayFilters);
  根据 lb:// 前缀过滤处理,使用 serviceId 选择一个服务实例,从而实现负载均衡
  基于 Spring WebFlux + Reactor + Netty
  1.获取路由信息
  mapping.getHandler(exchange)
  网关负责负载均衡的GlobalFilter
  GatewayFilterFactory beans
  调用HandlerAdapter#handle
  RouteDefinitionLocator#getRouteDefinitions
  WebFlux请求入口,对比SpringMVC的DispatcherServlet#doDispatch理解,在DispatcherHandler中三个依次调用的核心接口是HandlerMapping、HandlerAdapter、HandlerResultHandler
  根据path进行匹配
  2. 将RouteDefinition转换为Route
  HandlerResultHandler#handleResult
  mono.then(Mono.empty())
  会委托GlobalFilter处理
  NioEventLoop#processSelectedKey
  gateway配置属性类,解析后会生成RouteDefinition
  SimpleHandlerAdapter#handle
  1.匹配路由信息,通过断言判断路由是否可用
  绑定url到请求的上下文
  基于loadbalancer实现负载均衡器
  Mono.just(route).filterWhen
  FilteringWebHandler#handle
  基于 Netty 实现的 HttpClient
  适配WebHandler类型
  RouteDefinitionRouteLocator#getRoutes
  HandlerMapping负责路径到handler的映射
  请求调度器,负责请求分发,请求和响应实例会被封装为ServerWebExchange 
  1.读取路由配置
  spring-cloud-gateway-core-2.2.5.RELEASE.jar!\\META-INF\\spring.factories
  NettyRoutingFilter
  GatewayFilterAdapter#filter
  请求上下文绑定路由id
  RoutePredicateFactory
  2.绑定路由信息到请求上下文
  gateway的实现的HandlerMapping
  通过ribbon去nacos中获取对应微服务名的实例列表,通过负载均衡算法选出一个服务实例
  RoutePredicateHandlerMapping#getHandlerInternal
  HandlerMapping
  gateway属性配置类
  RoutePredicateHandlerMapping
  new DefaultGatewayFilterChain(combined).filter(exchange)
  GlobalFilter beans
  NettyRoutingFilter#filter
  思考: http://192.168.65.103:8888/order/findOrderByUserId/1=======》http://192.168.65.103:8020/order/findOrderByUserId/1 如何实现的?
    
    收藏 
      
    收藏 
     
 
 
 
 
  0 条评论
 下一页
  
   
   
  
  
  
  
  
  
  
  
 