loveqq-mvc 再进化,又一款分布式网关框架可用

loveqq-mvc 是 loveqq-framework 框架的一个模块,旨在提供统一的 web server 抽象,统一响应式 / 命令式编程风格。

loveqq-mvc 中一直都有路由的概念,但是由于一直仅基于 RequestMapping 注解开发,所以路由的概念比较模糊,几乎绑定到了控制器 + 方法的实现上。

从而导致请求分发器 (AbstractDispatcher) 中耦合了大量的和 java 方法相关的处理逻辑。

因此,最新的里程碑版本,将路由的概念明确抽象出来,而路由最终如何应用则交由路由本身处理。从而请求分发器的职责更清晰,路由的扩展性更强。

最新版本将路由抽象为 Route 接口,而原有的基于控制器 + 方法的路由则作为一种实现而存在 (HandlerMethodRoute)。

本次更新的网关路由 (GatewayRoute),就是基于 Route 接口的扩展实现。

没错,仅仅扩展一下就可以实现分布式网关的功能,并且用户还可以自行扩展自己的路由实现,为更多路由场景提供了无限可能。

由于网关路由对性能要求较高,因此仅有同时支持响应式 / 命令式的 loveqq-boot-starter-netty 启动器支持。

下面介绍一下网关路由的配置方式:
yaml 配置风格:

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

两种编码配置风格:

less 复制代码
    /**
     * 以 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,感兴趣的童鞋可以看看。

相关推荐
一只叫煤球的猫21 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9651 天前
tcp/ip 中的多路复用
后端
bobz9651 天前
tls ingress 简单记录
后端
皮皮林5511 天前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友1 天前
什么是OpenSSL
后端·安全·程序员
bobz9651 天前
mcp 直接操作浏览器
后端
前端小张同学1 天前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook1 天前
Manim实现闪光轨迹特效
后端·python·动效
武子康1 天前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在1 天前
6个值得收藏的.NET ORM 框架
前端·后端·.net