资讯详情

资讯详情

QuickBlue AI应用底座:Spring Cloud + JDK 21微服务架构实战

1. 从一堆散装微服务到AI 应用底座QuickBlue 到底在解决什么问题如果你最近一年在折腾企业级 AI 应用落地大概率会遇到一个很尴尬的局面模型能力不缺缺的是把模型能力接进现有业务系统的那层地基。我见过太多团队算法同学在 Notebook 里跑得飞起一到工程化就抓瞎——鉴权、限流、会话管理、多租户隔离、审计日志、模型路由、向量库连接池每一样都得从零搭。最后项目延期不是因为模型不行而是因为周边太重。QuickBlue 就是冲着这个痛点来的。你可以把它理解成一个AI 应用底座它本身不是某个具体的 AI 应用而是承载 AI 应用的那套微服务基础设施。用一句话概括它的定位——把 AI 能力当成一种标准微服务来治理。模型调用、提示词管理、会话上下文、知识库检索、工具调用Function Calling这些在 QuickBlue 里都被抽象成独立的服务单元跑在统一的微服务体系之上共享注册发现、配置中心、网关、熔断限流、链路追踪这一整套能力。为什么强调底座这个词因为企业真正需要的不是又一个聊天框而是一套能长期演进、能横向扩展、能被运维和治理的骨架。举个我亲历的例子某团队一开始把模型调用直接写死在业务代码里硬编码 API Key、硬编码模型名。三个月后要换模型供应商改了几十个文件还漏了两处线上直接报错。如果一开始就把模型调用收敛到 QuickBlue 的模型网关服务里换供应商只是改一处配置的事。这就是底座的价值——变化被隔离在少数几个点上而不是扩散到整个代码库。QuickBlue 的技术选型也很有代表性Spring Cloud 体系 JDK 21。选 Spring Cloud 是因为国内企业级 Java 生态里它是事实标准团队上手成本最低招人也好招选 JDK 21 是因为虚拟线程Virtual Threads对 AI 应用这种高并发 大量阻塞 IO的场景简直是量身定做。后面我会专门用一节讲清楚虚拟线程在这里到底省了什么。这篇文章适合三类人看一是正在做 AI 应用工程化、被基础设施拖住的后端同学二是技术负责人想搞清楚AI 应用底座这个概念到底值不值得投入三是对微服务架构感兴趣、想看看 2026 年微服务怎么和 AI 结合的开发者。我会从架构拆解、技术选型理由、实操搭建、踩坑经验几个角度把 QuickBlue 这类底座讲透。2. 拆开 QuickBlue 的骨架AI 应用底座里到底该有哪些服务很多人对AI 应用底座的第一反应是不就是个网关加个模型代理吗。真上手做才知道一个能扛住生产流量的底座服务拆分比想象中细。我按职责把 QuickBlue 这类底座的核心服务拆成下面几层你可以对照自己的项目看看缺了哪块。2.1 接入层统一网关与多租户入口接入层是整个底座的门面通常由Spring Cloud Gateway承担。它要干的事远不止转发请求统一鉴权所有 AI 请求先过网关校验 Token、租户身份、配额。把鉴权放在网关而不是每个服务里是为了避免每个服务都写一遍鉴权逻辑的重复劳动。多租户路由企业场景下不同部门、不同客户的数据必须隔离。网关根据租户标识把请求路由到对应的逻辑分区或者在请求头里注入租户上下文下游服务据此做数据过滤。限流与配额AI 调用是花钱的必须限流。这里通常接Sentinel做流控配合 Redis 做集群限流的数据源这就是热词里sentinel datasource redis 集群的由来。协议适配对外可能是 REST对内可能是 gRPC 或者 SSE 流式返回。网关负责把流式响应正确地透传给前端这一点在 AI 场景里特别关键因为大模型的输出天然是流式的。我踩过的一个坑早期把流式响应在网关层做了缓冲结果用户要等模型全部生成完才看到第一个字体验极差。后来改成网关直接透传text/event-stream不做聚合首字延迟从 8 秒降到 300 毫秒。流式场景下网关要做的是管道而不是容器。2.2 能力层模型网关、提示词服务、会话服务这一层是 AI 应用底座区别于普通微服务的核心。模型网关Model Gateway是所有大模型调用的统一出口。它的价值在于屏蔽不同模型供应商的 API 差异对外提供统一接口做模型路由简单问题走小模型复杂问题走大模型做失败重试和降级主模型超时就切备用模型做 Token 计量和成本统计。没有这一层你的业务代码里会散落各种 SDK 调用换模型就是灾难。提示词服务Prompt Service负责提示词的版本管理、模板渲染、A/B 测试。别小看这个提示词是 AI 应用的业务逻辑它需要像代码一样被管理谁改的、什么时候改的、改完效果如何。把提示词硬编码在代码里等于把业务逻辑焊死在编译产物里改一次发一次版效率极低。会话服务Session Service管理多轮对话的上下文。它要解决上下文窗口有限的问题——历史消息太长时要裁剪、要摘要、要按重要性保留。还要处理会话的持久化让用户换个设备还能接着聊。2.3 数据层向量检索与知识库RAG检索增强生成几乎是企业 AI 应用的标配所以底座里必须有向量检索能力。这一层通常包括文档解析与切分服务、向量化服务调 Embedding 模型、向量库连接Milvus、pgvector、Redis 等、检索与重排服务。这里有个容易被忽略的点向量库的连接池管理。向量检索是高频操作如果每次检索都新建连接性能会崩。要像管理数据库连接池一样管理向量库连接这也是为什么底座要用微服务架构——连接池、健康检查、熔断这些能力微服务框架已经帮你做好了。2.4 治理层注册发现、配置、追踪、熔断这一层是看不见但离不开的。服务注册发现Nacos 或 Consul、配置中心、链路追踪SkyWalking 或 Micrometer Tracing、熔断降级Sentinel 或 Resilience4j。AI 应用的特点是调用链长、依赖多、单次耗时长没有链路追踪出了问题根本不知道卡在哪一环。下面这张表把各层职责和常见技术选型列清楚方便你对照层级核心职责常见选型AI 场景特殊要求接入层鉴权、路由、限流Spring Cloud Gateway Sentinel流式透传、Token 级限流能力层模型调用、提示词、会话自研服务 模型 SDK多模型路由、成本计量数据层向量检索、知识库Milvus / pgvector连接池、检索重排治理层注册、配置、追踪Nacos SkyWalking长链路追踪、慢调用告警3. 为什么是 Spring Cloud JDK 21选型背后的真实权衡技术选型从来不是哪个最新用哪个而是哪个最适合当前团队和场景。QuickBlue 选 Spring Cloud 和 JDK 21背后有很实在的理由也有一些需要提前知道的坑。3.1 Spring Cloud 生态成熟度压倒一切先说个现实热词里出现了spring cloud alibaba 停更了这样的搜索说明很多人对生态维护状态很敏感。我的判断是Spring Cloud Alibaba 的核心组件Nacos、Sentinel社区依然活跃但确实不能盲目依赖单一厂商的封装。QuickBlue 这类底座的做法是优先用 Spring 官方原生的抽象如 Spring Cloud Gateway、Spring Cloud LoadBalancer把厂商组件当成可替换的实现。这样做的好处是万一某个组件维护节奏变了替换成本可控。比如服务注册你可以用 Nacos也可以用 Consul业务代码里只依赖DiscoveryClient抽象切换时改配置即可。这是微服务架构面向接口而非实现原则的直接体现。另一个选 Spring Cloud 的硬理由是人才供给。国内 Java 后端对 Spring 体系熟悉度最高新同学入职一周就能上手改代码。如果选一个冷门框架光是招人和培训的成本就够呛。技术选型要考虑团队能不能驾驭而不只是技术先不先进。3.2 JDK 21 虚拟线程AI 应用并发的解药这是我最想展开讲的一点。AI 应用有个鲜明特征大量时间花在等待上。等模型返回、等向量检索、等外部工具调用。传统线程模型下一个请求占一个线程线程池就那么大并发一高就排队。你可能会说用响应式编程WebFlux啊但响应式代码的可读性和调试难度是出了名的高团队里能写好的人不多。JDK 21 的虚拟线程改变了这个局面。虚拟线程由 JVM 调度阻塞时自动让出底层载体线程所以你可以用同步的写法获得异步的性能。一个请求一个虚拟线程代码还是那套try-catch顺序逻辑但并发能力提升一个数量级。我实测过一个对比同样的模型调用代理服务处理 5000 个并发请求每个请求模拟 2 秒的 IO 等待。方案线程模型5000 并发耗时代码复杂度传统线程池平台线程池大小 200约 50 秒排队严重低WebFlux事件循环约 2.5 秒高JDK 21 虚拟线程虚拟线程每请求一个约 2.8 秒低虚拟线程用接近 WebFlux 的性能换来了接近同步代码的可维护性。对 AI 应用这种IO 密集 逻辑复杂的场景这是性价比最高的选择。开启方式也简单Spring Boot 3.2 只需一行配置spring: threads: virtual: enabled: true但要注意几个坑虚拟线程不适合 CPU 密集型任务如果你的服务里有大量本地计算比如大文本处理虚拟线程帮不上忙synchronized 块会钉住载体线程JDK 21 已大幅缓解但仍有边界情况高频锁竞争场景建议换成ReentrantLock连接池要重新评估虚拟线程能开出海量并发但数据库连接池还是有限的别让虚拟线程把连接池打爆。3.3 微服务拆分粒度别为了拆而拆热词里有微服务拆分微服务架构图这类搜索说明很多人纠结拆分粒度。我的经验是AI 应用底座的拆分按变化频率和资源特征来而不是按业务名词来。模型网关变化频率高要适配新模型单独拆会话服务有状态需要独立扩缩容单独拆提示词服务读多写少可以缓存单独拆。而像用户管理这种和 AI 关系不大的能复用现有系统就复用别重复造。拆得太细的代价是运维复杂度指数上升。我见过一个团队把底座拆成 20 多个服务结果本地开发要起 20 个进程新人一周都跑不起来。拆分的底线是每个服务都能独立部署、独立扩缩容且拆分带来的收益大于运维成本。4. 动手搭一个最小可用的 AI 应用底座理论讲完来点能直接抄的。下面我以一个最小可用底座为例讲清楚搭建步骤和每步的意图。这里假设你已经有一个 Spring Cloud 项目骨架可以用 Spring Initializr 生成选 Spring Cloud Gateway、Nacos Discovery、Sentinel。4.1 环境准备与依赖版本对齐第一步永远是版本对齐这是微服务项目最容易翻车的地方。Spring Cloud、Spring Boot、Spring Cloud Alibaba 三者版本必须匹配否则启动就报各种NoSuchMethodError。我推荐一套经过验证的组合截至我写这篇时的稳定版本properties java.version21/java.version spring-boot.version3.2.x/spring-boot.version spring-cloud.version2023.0.x/spring-cloud.version spring-cloud-alibaba.version2023.0.1.x/spring-cloud-alibaba.version /properties注意Spring Cloud 的版本号是发布列车命名如 2023.0.x它和 Spring Boot 版本有严格对应关系不要凭感觉组合。最稳妥的办法是去 Spring Cloud 官网的兼容性表格查或者直接用 Spring Initializr 生成它会自动帮你对齐。JDK 21 的安装就不赘述了重点确认java -version输出是 21。IDEA 里记得把项目 SDK 和语言级别都设成 21否则虚拟线程的 API 编译不过。4.2 模型网关服务的核心实现模型网关是整个底座的心脏。核心思路是定义统一的模型调用接口不同供应商用不同实现通过配置决定用哪个。先定义接口public interface ChatModelClient { // 同步调用 ChatResponse chat(ChatRequest request); // 流式调用 FluxChatResponse stream(ChatRequest request); }然后针对不同供应商实现。这里的关键设计是用工厂模式 配置驱动而不是在业务代码里if-else判断供应商Component public class ChatModelClientFactory { private final MapString, ChatModelClient clients; public ChatModelClientFactory(ListChatModelClient clientList) { this.clients clientList.stream() .collect(Collectors.toMap( ChatModelClient::providerName, Function.identity() )); } public ChatModelClient get(String provider) { ChatModelClient client clients.get(provider); if (client null) { throw new IllegalArgumentException(未知的模型供应商: provider); } return client; } }这样新增一个供应商只要实现接口并注册成 Bean业务代码一行不用改。这就是对扩展开放、对修改关闭的落地。模型路由逻辑单独抽一个服务Service public class ModelRouter { public String route(ChatRequest request) { // 简单问题走小模型复杂问题走大模型 if (request.getComplexity() THRESHOLD) { return small-model; } return large-model; } }路由策略可以做得更细按租户等级路由VIP 用户走更强的模型、按成本预算路由、按模型健康状态路由主模型熔断时自动切备用。这些策略都收敛在路由服务里业务方无感知。4.3 会话上下文管理与向量检索接入会话服务的核心是上下文窗口管理。大模型的上下文长度有限历史消息不能无限堆。我的做法是滑动窗口 摘要压缩结合public ListMessage buildContext(String sessionId, String newMessage) { ListMessage history sessionRepository.findRecent(sessionId, WINDOW_SIZE); int estimatedTokens tokenCounter.count(history) tokenCounter.count(newMessage); if (estimatedTokens MAX_CONTEXT_TOKENS) { // 超出窗口把最老的一批消息做摘要 ListMessage oldMessages history.subList(0, history.size() / 2); String summary summarizer.summarize(oldMessages); history new ArrayList(); history.add(Message.system(历史对话摘要 summary)); history.addAll(sessionRepository.findRecent(sessionId, WINDOW_SIZE / 2)); } history.add(Message.user(newMessage)); return history; }向量检索接入要注意两点一是连接池复用别每次检索都新建客户端二是检索结果重排向量相似度高不代表真的相关加一层重排Rerank能显著提升 RAG 质量。我实测过加了重排之后回答准确率能提升 15% 到 20%。4.4 用 Sentinel 做 AI 场景的限流AI 场景的限流和普通接口不一样要按Token 消耗限流而不只是按请求数。因为一次请求可能消耗 100 Token也可能消耗 10000 Token按请求数限流会失控。Sentinel 支持自定义限流规则可以结合 Redis 做集群限流。核心思路是每次模型调用前预估本次消耗的 Token向 Sentinel 申请令牌超过配额就拒绝或降级。SentinelResource(value modelCall, blockHandler handleBlock) public ChatResponse callWithLimit(ChatRequest request) { int estimatedTokens tokenEstimator.estimate(request); // 自定义 Token 维度的流控 if (!tokenQuotaManager.tryAcquire(request.getTenantId(), estimatedTokens)) { throw new QuotaExceededException(Token 配额不足); } return modelClient.chat(request); } public ChatResponse handleBlock(ChatRequest request, BlockException ex) { // 降级返回缓存结果或提示用户稍后重试 return ChatResponse.degraded(当前请求较多请稍后重试); }提示集群限流一定要用 Redis 作为数据源否则每个实例各限各的总量会超标。配置时注意 Redis 的 key 前缀要区分环境别让测试环境把生产环境的配额吃了。5. 上线之后才暴露的问题几个真实踩坑记录底座搭起来只是开始真正的问题都在生产环境暴露。下面这几个坑是我和身边团队真实踩过的写出来帮你省时间。5.1 流式响应的超时与断连第一个大坑是流式响应的超时。普通 HTTP 请求有超时设置但流式响应可能持续几十秒甚至几分钟。如果网关、负载均衡、Nginx 各层的超时没对齐会出现模型还在生成连接已经被掐断的情况。排查这类问题的思路是逐层确认超时配置客户端超时、网关超时、服务端超时、中间代理超时四者要形成外层大于内层的关系。我一般设成客户端 120 秒 网关 90 秒 服务端 60 秒。这样任何一层先超时都能给出明确的错误而不是连接莫名断开。另外流式响应要处理客户端主动断开的情况。用户关掉页面服务端还在傻傻地调模型白白烧钱。要在服务端监听连接关闭事件及时取消模型调用。5.2 模型调用的重试陷阱第二个坑是重试。模型调用失败时重试是合理的但流式调用不能简单重试。因为流式响应可能已经吐出了一部分内容重试会导致内容重复或错乱。我的做法是非流式调用可以重试流式调用只在尚未输出任何内容时重试。一旦开始输出失败就失败让用户重新发起。这个判断逻辑要写在模型网关里业务方不用关心。还有一个隐蔽的坑重试会放大流量。如果模型供应商整体故障你的重试会把请求量翻倍可能触发对方的限流形成雪崩。所以重试必须配合熔断——连续失败达到阈值就熔断直接走降级不再重试。5.3 配置中心的最后一公里第三个坑是配置刷新。微服务用配置中心如 Nacos管理配置改了配置理论上能动态生效。但实际中很多配置项需要配合RefreshScope注解才能刷新漏加注解的配置改了不生效排查起来很费劲。我的经验是把需要动态调整的配置集中管理并统一加RefreshScope。特别是模型路由规则、限流阈值、提示词模板这些一定要能动态改否则每次调整都要重启服务运维会疯。还有一个细节配置中心的配置变更要有审计和回滚。谁在什么时候改了什么改完出问题能一键回滚。这在多人协作的团队里是刚需。6. 底座之上AI 应用还能怎么长底座搭好之后上层应用的开发会变得非常轻。你可以基于它快速长出各种 AI 应用智能客服、文档问答、代码助手、数据分析助手。因为它们共享同一套鉴权、限流、会话、模型路由能力新应用只需要关注自己的业务逻辑。我特别想提一个方向把 Python 的 AI 能力融入 Spring Cloud 体系。热词里有python 应用融入 spring cloud alibaba 微服务体系这是个很实际的需求。因为 AI 生态里 Python 库最丰富各种模型 SDK、向量库客户端、数据处理工具但企业主系统往往是 Java 的。我的做法是Python 服务作为独立的微服务注册到 NacosJava 服务通过服务发现调用它。中间用统一的接口协议比如 REST 或 gRPC通信。这样既用上了 Python 的 AI 生态又纳入了 Java 微服务的治理体系。关键是接口要稳定Python 服务内部怎么换库、换模型对 Java 侧透明。具体实现上Python 侧可以用nacos-sdk-python注册服务暴露 HTTP 接口Java 侧用DiscoveryClient拿到实例列表通过RestClient或WebClient调用。要注意的是跨语言调用的序列化格式要统一建议用 JSON别用 Java 特有的序列化方式。最后分享一个我在实际项目中的体会AI 应用底座的价值不在于它用了多新的技术而在于它把变化关进了笼子里。模型会换、提示词会改、业务规则会调但底座的接口和治理能力是稳定的。团队把精力花在业务创新上而不是反复重建基础设施这才是底座真正的意义。至于 QuickBlue 具体怎么落地建议你先从模型网关和会话服务这两个最痛的点切入跑通之后再逐步补齐其他能力别一上来就追求大而全。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →