SpringCloud Gateway源码流程
2023-03-25 19:36:39 23 举报
SpringCloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。它的核心是一个Filter链,负责对请求进行过滤处理。当一个请求到达时,Gateway会根据配置文件中定义的规则(如路径、方法、头信息等),将请求转发到对应的服务实例。同时,Gateway还提供了限流、熔断、重试等功能,以及对请求和响应的日志记录、监控等支持。
作者其他创作
大纲/内容
获取处理网关请求的Handlermapping.getHandler(exchange)
返回处理路由请求的webHandler类型为FilteringWebHandlerreturn Mono.just(webHandler);
调用下一个过滤器return chain.filter(exchange);
源RUIURI uri = exchange.getRequest().getURI();
拿到路由配置的过滤器List<GatewayFilter> gatewayFilters = route.getFilters();
http://127.0.0.1:8100/cz-provider/gateway
SpringCloud Gateway 采用的是Netty+webflux+reactor实现,通过DispatcherHandler的handle方法处理请求
找到SimpleHandlerAdapter
处理请求org.springframework.web.reactive.DispatcherHandler#handle
路由匹配实现,其中一种路径匹配
return webHandler
拿到之前匹配好放入Attribute的路由Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
拿到所有路由信息this.routeLocator.getRoutes()
处理过滤器链new DefaultGatewayFilterChain(combined).filter(exchange)
getHandlerInternal(exchange)
选择目标实例,使用默认轮询。choose详细路径见链接final ServiceInstance instance = choose(exchange);
filter
PathRoutePredicateFactory =r.getPredicate()
使用路由/断言器匹配HandlerRoutePredicateHandlerMapping#getHandlerInternal()
负载均衡调用过滤器LoadBalancerClientFilter
找到支持webHandler的处理器适配器handlerAdapter.supports(handler)
handle(ServerWebExchange exchange)
查找路由逻辑
这里两个过滤器举例
开始请求
webHandle
apply
拿到全局过滤器List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
找路由lookupRoute(exchange)
将请求发送到目标服务NettyRoutingFilter
匹配路由r.getPredicate().apply(exchange);
return webHandler
Mono.just(delegate.test(t))
支持true
经过过滤器链处理网关请求WebHandler webHandler = (WebHandler) handler; Mono<Void> mono = webHandler.handle(exchange);
webHandler.handle
合并过滤器并按order排序combined.addAll(gatewayFilters); AnnotationAwareOrderComparator.sort(combined);
0 条评论
回复 删除
下一页