返回

SCG RoutePredicateHanderMapping 接管 WebFlux 请求的深入剖析

后端

引言

在上一篇博文中,我们探究了 SCG 如何在 WebFlux 流程中进行切入、启动和初始化。本篇博文将深入 WebFlux 的三大组件,进一步了解 SCG 的实现原理,以及如何通过 RoutePredicateHandlerMapping 接管 WebFlux 请求。

SCG 对 WebFlux 组件的拦截

WebFlux 框架由三个主要组件组成:

  • HandlerMapping:负责将请求映射到请求处理程序。
  • HandlerAdapter:将请求处理程序适配到 WebFlux 处理流程。
  • WebHandler:处理请求并生成响应。

SCG 通过以下机制拦截和扩展了这些组件:

  • SCGWebFluxConfiguration 类:自定义 HandlerMappingHandlerAdapter 的 Bean 定义。
  • SCGWebFluxHandlerMapping 类:扩展 DefaultAnnotationHandlerMapping,支持 SCG 注解。
  • SCGWebFluxHandlerAdapter 类:扩展 AbstractUrlHandlerMapping,支持 SCG 处理程序。

RoutePredicateHandlerMapping

RoutePredicateHandlerMapping 是 SCG 引入的一个关键组件。它允许 SCG 根据自定义路由谓词动态路由请求。通过以下步骤启用 RoutePredicateHandlerMapping

  1. SCGWebFluxConfiguration 类中声明 RoutePredicateHandlerMapping Bean:
@Bean
public RoutePredicateHandlerMapping routePredicateHandlerMapping() {
    return new RoutePredicateHandlerMapping();
}
  1. 定义 SCGRoutePredicate 类来指定自定义路由谓词:
public class SCGRoutePredicate implements Predicate<ServerWebExchange> {

    @Override
    public boolean test(ServerWebExchange exchange) {
        // 自定义路由条件
    }
}
  1. SCGWebFluxHandlerMapping 中使用 RoutePredicateHandlerMapping
@Override
public Map<RequestMappingInfo, HandlerMethod> getHandlerMethods(Class<?> handlerType) {
    ...

    Map<RequestMappingInfo, HandlerMethod> result = new HashMap<>();
    for (HandlerMethod handlerMethod : getHandlerMethodsInternal(handlerType)) {
        RequestMappingInfo mappingInfo = handlerMethod.getResolvedMethodAnnotation(RequestMapping.class);
        ...

        RoutePredicateHandlerMapping routePredicateHandlerMapping = applicationContext.getBean(RoutePredicateHandlerMapping.class);
        routePredicateHandlerMapping.register(mappingInfo, new SCGRoutePredicate());
    }

    ...
}

通过 RoutePredicateHandlerMapping 接管请求

启用 RoutePredicateHandlerMapping 后,SCG 就可以通过以下步骤接管 WebFlux 请求:

  1. 使用 @SCGController 注解控制器类和 @SCGRoute 注解处理程序方法:
@SCGController
public class MyController {

    @SCGRoute
    public Mono<String> handleRequest(ServerWebExchange exchange) {
        // 处理请求的代码
    }
}
  1. 定义 SCGRoutePredicate 来指定自定义路由条件。

  2. SCG 会自动根据路由谓词将请求路由到 MyControllerSCGRoute 处理程序方法。

结论

通过 RoutePredicateHandlerMapping,SCG 能够根据自定义路由谓词灵活地接管 WebFlux 请求。这种机制为 SCG 提供了强大的扩展能力,使其能够无缝地集成到 WebFlux 应用程序中,并控制请求处理流程。