return Flux.fromIterable(this.handlerMappings)
.concatMap(mapping -> mapping.getHandler(exchange))
.next()
.switchIfEmpty(createNotFoundError())
.flatMap(handler -> invokeHandler(exchange, handler))
.flatMap(result -> handleResult(exchange, result));
DispatcherHandler的handle方法,其实这里只是封装,实际的调用要在subscribe方法执行的时候,那个就在很多层的封装之后了,concatMap如果后面直接flatMap那就复杂了,现在中间有个next()就很好理解,next方法会去找第一个mapping.getHandler方法返回不是空的handler。那下面就是看handlerMappging是哪些了。
最后面的SimpleUrlHandlerMapping是管理静态文件的,第二个requestMappingHandlerMapping是写controller的,一般没人在gateway这样干,这两个先忽略。routerFuncionMapping好像是FLUX自己的什么路由,先不管。
再说routePredicateHandlerMapping,这个类是管理微服务路由的关键类
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
# routes:
# - id: user
# uri: lb://user
# predicates:
# - Path=/user/**
# filters:
# - StripPrefix=1
注释的这段是自定义的映射,其实如果路径和微服务的名字相同,直接用上面这段即可,记得locator.enabled要配成true才会自动映射,还有下面的lowerCaseServiceId要配成true,因为比如order服务,在微服务中心那里会转成大写的ORDER。两种方式并不兼容,推荐使用routes,配置麻烦了点,但是可以自定义很多东西。
上面的不过是理解原理,其实自己能做的,还是在过滤器这里