loveqq-mvc 是 loveqq-framework 框架的一个模块,旨在提供统一的 web server 抽象,统一响应式/命令式编程风格。
loveqq-mvc 中一直都有路由的概念,但是由于一直仅基于 RequestMapping 注解开发,所以路由的概念比较模糊,几乎绑定到了控制器+方法的实现上。
从而导致请求分发器(AbstractDispatcher)中耦合了大量的和 java 方法相关的处理逻辑。
因此,最新的里程碑版本,将路由的概念明确抽象出来,而路由最终如何应用则交由路由本身处理。从而请求分发器的职责更清晰,路由的扩展性更强。
最新版本将路由抽象为 Route 接口,而原有的基于控制器+方法的路由则作为一种实现而存在(HandlerMethodRoute)。
本次更新的网关路由(GatewayRoute),就是基于 Route 接口的扩展实现。
没错,仅仅扩展一下就可以实现分布式网关的功能,并且用户还可以自行扩展自己的路由实现,为更多路由场景提供了无限可能。
由于网关路由对性能要求较高,因此仅有同时支持响应式/命令式的 loveqq-boot-starter-netty 启动器支持。
下面介绍一下网关路由的配置方式:
yaml 配置风格:
k: server: port: 8080 virtualThread: false gateway: routes: - uri: lb://demo # 下面注释的是全配置形式,示例是两种简易形式 predicates: Path=/api/demo/** # 最简配置形式 # - id: Path # args: # path: /api/demo/** filters: StripPrefix=stripPrefix=1 # 多参数简易配置形式 # - id: StripPrefix # args: # stripPrefix: 1
两种编码配置风格:
/** * 以 RouteDefinition 的方式配置 * * @return 路由定义 */ @Bean public RouteDefinition routeDefinition() { return RouteDefinition.builder() .uri("http://127.0.0.1:8080") .predicate(RouteDefinition.Predicates.builder().id("Path").args("path", "/api/demo/**").build()) .filter(RouteDefinition.Filters.builder().id("StripPrefix").args("stripPrefix", "1").build()) .order(1) .build(); } /** * 以 GatewayRoute 的方式配置,不推荐 * * @return 路由定义 */ @Bean public GatewayRoute gatewayRoute(PathGatewayPredicate pathGatewayPredicate, StripPrefixGatewayFilter stripPrefixGatewayFilter) { pathGatewayPredicate.setConfig(new PathGatewayPredicate.Config("/api/demo/**"), null); stripPrefixGatewayFilter.setConfig(new StripPrefixGatewayFilter.Config(1), null); GatewayRoute route = new GatewayRoute(); route.setUri(URI.create("http://127.0.0.1:7070")); route.setPredicates(Arrays.asList(pathGatewayPredicate)); route.setFilters(Arrays.asList(stripPrefixGatewayFilter)); route.setOrder(1); return route; }
网关路由代码示例已上传 loveqq-framework-example,感兴趣的童鞋可以看看。
还没有评论,来说两句吧...