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,配置麻烦了点,但是可以自定义很多东西。
上面的不过是理解原理,其实自己能做的,还是在过滤器这里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!