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,感兴趣的童鞋可以看看。

相关推荐
盖伦发发4 分钟前
RAG 能跑≠能用:用 EDD 把 Eval 做成基础设施 (附源码)
人工智能·后端·python·功能测试
阿黎梨梨9 分钟前
Docker 容器化实战:从零搭建 Web 服务与反向代理
前端·后端·docker
王中阳Go9 分钟前
做了 3 年 Spring Boot,老板让我一周搭个 AI Agent,上线当天被安全叫停:Java 团队落地 AI 的三道坎,我替你踩完了
后端·面试
GISer_Jing11 分钟前
全栈AI实战:基于 TypeScript + LangChain + MCP 的企业级智能研发助手
前端·后端·ai·langchain·前端框架
用户31268748772012 分钟前
别再 Thread.sleep 硬等了!并发工具类到底怎么选?
java
乒乓狂魔147867399700013 分钟前
Grafana 的全家桶,Tempo、Loki 看起来过时了
后端
Java内核笔记13 分钟前
万字长文剖析 Spring Boot 4 自动配置机制源码:从 @EnableAutoConfiguration 到条件装配
java·后端
无责任此方_修行中15 分钟前
AI 成本复盘!5 个月后的真实使用情况(附账单)
后端·程序员·ai编程
喜欢睡觉16 分钟前
Docker 入门科普:让"我的电脑能跑,你的电脑也能跑"
后端
嘟嘟071717 分钟前
从入口到 CRUD:用 NestJS 的模块化与装饰器思想读懂一个后端应用
后端·typescript·nestjs