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,配置麻烦了点,但是可以自定义很多东西。

上面的不过是理解原理,其实自己能做的,还是在过滤器这里