访问gateway的地址:localhost:8080/spring-nacos/user/info
是如何转发到 localhost:8081/spring-nacos/user/info 项目的
DispatcherHandler类就是gateway的请求入口,
(怎么知道这是入口,大概是:http请求——>netty线程模型,处理read事件——>然后调用DispatcherHandler.hanlder方法。这一块没去研究,百度到的)。
先介绍一下这个类:
public class DispatcherHandler implements WebHandler, ApplicationContextAware {
//1: 实现了 ApplicationContextAware 接口,setApplicationContext(ApplicationContext applicationContext)方法,
//2: 实现了WebHandler 接口,handle(ServerWebExchange exchange); 方法。
}
看下其实现该方法的逻辑:
1:setApplicationContext: @Override
public void setApplicationContext(ApplicationContext applicationContext) {
//初始化策略
initStrategies(applicationContext);
}
//这里初始化是给 属性handlerMappings ,handlerAdapters ,resultHandlers 赋值。
protected void initStrategies(ApplicationContext context) {
//这里是获取所有的 HandlerMapping 的Bean,
//例如:RoutePredicateHandlerMapping, 是在:GatewayAutoConfiguration中 用@Bean注入
//RequestMappingHandlerMapping, 是在:WebFluxAutoConfiguration中内部类:EnableWebFluxConfiguration的RequestMappingHandlerAdapter--->super.createRequestMappingHandlerAdapter();
//RouterFunctionMapping, 与上面 RequestMappingHandlerMapping 实在同一个类中: @Bean RouterFunctionMapping
//SimpleUrlHandlerMapping 是在 WebFluxConfigurationSupport 的 @Bean的HandlerMapping
Map mappingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
context, HandlerMapping.class, true, false);
//排序
ArrayList mappings = new ArrayList<>(mappingBeans.values());
AnnotationAwareOrderComparator.sort(mappings);
//定义为 不可以修改
this.handlerMappings = Collections.unmodifiableList(mappings);
//获取 HandlerAdapter ,有三个。
// RequestMappingHandlerAdapter 是在 WebFluxConfigurationSupport 的@Bean RequestMappingHandlerAdapter
// HandlerFunctionAdapter 是在 WebFluxConfigurationSupport 的@Bean HandlerFunctionAdapter
// SimpleHandlerAdapter 是在 WebFluxConfigurationSupport 的@Bean SimpleHandlerAdapter
Map adapterBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
context, HandlerAdapter.class, true, false);
this.handlerAdapters = new ArrayList<>(adapterBeans.values());
AnnotationAwareOrderComparator.sort(this.handlerAdapters);
// 这里获取 :HandlerResultHandler, 都是在 WebFluxConfigurationSupport类中注入的Bean
// ResponseEntityResultHandler
// ResponseBodyResultHandler
// ViewResolutionResultHandler
// ServerResponseResultHandler
Map beans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
context, HandlerResultHandler.class, true, false);
this.resultHandlers = new ArrayList<>(beans.values());
AnnotationAwareOrderComparator.sort(this.resultHandlers);
}
2:handle(ServerWebExchange exchange)方法
@Override public Mono2.1 mapping.getHandler(exchange)方法handle(ServerWebExchange exchange) { if (this.handlerMappings == null) { return createNotFoundError(); } //明天再将主流程,很重要 return Flux.fromIterable(this.handlerMappings) //这里创建一个流 .concatMap(mapping -> mapping.getHandler(exchange)) // 转换流后并 进行合并 .next() //插入消息,不太懂 .switchIfEmpty(createNotFoundError()) .flatMap(handler -> invokeHandler(exchange, handler)) // flatMap转换。 .flatMap(result -> handleResult(exchange, result)); }
RoutePredicateHandlerMapping,RequestMappingHandlerMapping,RouterFunctionMapping,SimpleUrlHandlerMapping
这四个类都会进入AbstractHandlerMapping.getHandler(ServerWebExchange exchange)
public Mono2.1.1: getHandlerInternal(exchange)
这个方法每个子类都有实现,以下分别开始讲。2.1.1.1: RoutePredicateHandlerMapping.getHandlerInternal
protected Mono> getHandlerInternal(ServerWebExchange exchange) {
// don't handle requests on management port if set and different than server port
if (this.managementPortType == DIFFERENT && this.managementPort != null
&& exchange.getRequest().getURI().getPort() == this.managementPort) {
return Mono.empty();
}
//这一步 设置属性 org.springframework.cloud.gateway.support.ServerWebExchangeUtils.gatewayHandlerMapper = RoutePredicateHandlerMapping
exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName());
//检查路由:
return lookupRoute(exchange)
// .log("route-predicate-handler-mapping", Level.FINER) //name this
.flatMap((Function>) r -> {
exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);
if (logger.isDebugEnabled()) {
logger.debug(
"Mapping [" + getExchangeDesc(exchange) + "] to " + r);
}
exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r);
return Mono.just(webHandler);
}).switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() -> {
exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);
if (logger.isTraceEnabled()) {
logger.trace("No RouteDefinition found for ["
+ getExchangeDesc(exchange) + "]");
}
})));
}
lookupRoute(exchange):检查路由:
protected Mono2.1.1.2: RequestMappingHandlerMapping. 2.1.1.3: RouterFunctionMapping. 2.1.1.4: SimpleUrlHandlerMapping . 2.2:handler -> invokeHandler(exchange, handler) 2.3:result -> handleResult(exchange, result)lookupRoute(ServerWebExchange exchange) { // this.routeLocator是CachingRouteLocator, // getRoutes()= RouteDefinitionRouteLocator, // 这些都是@Bean注入的。 // this.routeLocator.getRoutes()就会进入到: RouteDefinitionRouteLocator.getRoutes() return this.routeLocator.getRoutes() // individually filter routes so that filterWhen error delaying is not a // problem .concatMap(route -> Mono.just(route).filterWhen(r -> { // add the current route we are testing exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId()); return r.getPredicate().apply(exchange); }) // instead of immediately stopping main flux due to error, log and // swallow it .doOnError(e -> logger.error( "Error applying predicate for route: " + route.getId(), e)) .onErrorResume(e -> Mono.empty())) .next() .map(route -> { if (logger.isDebugEnabled()) { logger.debug("Route matched: " + route.getId()); } validateRoute(route, exchange); return route; }); }



