Gateway源码分析
2025-02-26 15:03:17 0 举报
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 条评论
下一页