当前位置: 首页 > news >正文

MCP Server 封装存量 Java 微服务的工程模式

MCP Server 封装存量 Java 微服务的工程模式


一、为什么这件事值得单独做成一层

企业里真正重要的能力,往往不在新写的 AI Demo 里,而在已经跑了很多年的 Java 微服务里:

  • 订单、库存、支付、会员、营销等核心域能力,通常已经沉淀在 Spring Boot、Dubbo、gRPC 或内部 REST 服务中
  • 这些系统经过多年演进,拥有完备的数据模型、业务规则、鉴权体系和审计链路
  • 问题不在于“能力不存在”,而在于这些能力并不是为 LLM 和 Agent 设计的

于是团队常常会掉进两个误区:

  1. 直接让 Agent 调已有 OpenAPI。
  2. 重新写一套“AI 专用后端”。

这两种方式都不理想。

前者的问题是,传统 API 面向的是前端或系统集成,不是面向模型语义。接口名、参数名、枚举值、异常语义、前置条件,对 LLM 来说往往并不透明。后者的问题则是重复建设,把已经在线上被验证过的业务逻辑又复制一遍,最终形成两套规则、两套治理、两套数据口径。

更合理的做法,是在存量微服务与 Agent 之间增加一层 MCP Server 能力适配层

  • 对上,暴露统一、可发现、可描述、可组合的 Tool/Resource/Prompt 能力
  • 对下,复用现有 Java 微服务的业务实现、权限模型和数据边界
  • 对中间,补齐 LLM 场景下必须有的语义描述、调用约束、并发治理和安全审计

这才是 MCP 在企业架构中的真正价值:**不是替代微服务,而是把微服务升级为 Agent 可安全消费的标准能力面。**


二、先把概念讲透:MCP 在微服务体系中的角色到底是什么

2.1 MCP 不是网关,也不是 Agent 框架

很多文章一上来就写“用 MCP 暴露工具”,但没有把它在整体架构中的职责讲清楚。

MCP 更接近一种 面向模型的能力协议层。它解决的是三类问题:

  • 能力发现:Agent 如何知道系统里有哪些可调用能力
  • 能力语义:模型如何理解工具的用途、参数含义、约束条件和返回结构
  • 能力调用:模型如何用统一协议触发后端动作

它不直接解决的事情包括:

  • 复杂业务实现本身
  • 企业服务治理本身
  • 多智能体编排本身
  • API 网关的统一南北向流量接入

所以在企业架构里更准确的定位应该是:

用户 / Agent / Host │ │ MCP Protocol ▼ MCP Server(语义暴露层 + 治理适配层) │ │ HTTP / Dubbo / gRPC / MQ / DB ▼ 存量 Java 微服务与企业基础设施

一句话总结:

  • 微服务负责业务能力
  • 网关负责流量接入
  • MCP Server负责让模型“理解并安全调用这些能力”

2.2 Tool、Resource、Prompt 如何映射企业系统

在企业系统里,MCP 三类原语可以这样理解:

MCP 原语本质存量系统中的典型映射
Tool有意图、可执行、可能有副作用的动作创建订单、发起退款、锁库存、发布配置
Resource只读、可获取的上下文资源订单详情、商品资料、系统配置、知识文档
Prompt预置交互模板或任务模板故障排查模板、报表分析模板、客服 SOP 模板

实际项目里,最核心的是 Tool。因为企业希望 Agent 不只是“会回答”,而是“能做事”。

但一旦进入“做事”这个维度,架构要求就完全变了。你需要的不再只是一个能返回 JSON 的接口,而是:

  • 明确的前置条件
  • 强约束参数定义
  • 幂等语义
  • 超时策略
  • 权限校验
  • 审计追踪
  • 失败补偿
  • 风险分级

这也是为什么很多 MCP Demo 可以工作,但无法直接进生产。


三、存量 Java 微服务接入 MCP 的四种主流工程模式

先给出结论:**不存在唯一最佳模式,只有最适合当前系统约束的模式。**

3.1 选型矩阵

模式适用场景改造成本运行时性能治理灵活性推荐度
同进程嵌入模式可改代码、Spring Boot 为主的新老系统最高很高
独立网关代理模式遗留系统不可改、接口分散很高很高
Sidecar 伴生模式K8s 环境、服务粒度清晰
事件驱动异步模式长耗时任务、强解耦、最终一致性很高

下面分别展开。


四、模式 A:同进程嵌入模式

4.1 适用场景

如果你的存量服务本身就是 Spring Boot 应用,而且可以正常发版,那么最推荐从这一种开始。它的核心思想是:

在现有服务内部直接嵌入 MCP Server,把服务中的领域能力以薄适配层方式暴露为 Tool。

优势很明显:

  • 不需要再多维护一套代理服务
  • 没有额外网络转发损耗
  • 能最自然地复用现有 Spring Bean、事务、权限、日志和监控体系
  • 适合先在单个核心域快速打样,再逐步规模化

4.2 推荐分层

即使是同进程模式,也不建议直接把 @Service 方法原封不动暴露成 Tool,而应该分四层:

MCP Transport 层 ↓ Tool Facade 层 ↓ Application Service 层 ↓ Domain / Repository / External Client

其中真正需要暴露给 LLM 的,只应该是 Tool Facade

原因很简单:

  • 领域服务的接口通常对人类程序员友好,不一定对模型友好
  • 领域服务中的参数对象往往缺少面向模型的描述信息
  • Tool 层更适合承接参数规整、风险检查、权限校验和结果裁剪

4.3 生产级代码示例

下面给一份更接近真实项目的实现,而不是只停留在注解 Demo。

1. 领域服务
package com.example.order.application; import com.example.order.domain.Order; import com.example.order.domain.OrderRepository; import com.example.order.domain.command.CreateOrderCommand; import com.example.order.domain.command.RefundOrderCommand; import com.example.order.domain.exception.OrderNotFoundException; import com.example.order.domain.exception.RefundNotAllowedException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class OrderApplicationService { private final OrderRepository orderRepository; private final InventoryGateway inventoryGateway; private final PaymentGateway paymentGateway; public OrderApplicationService(OrderRepository orderRepository, InventoryGateway inventoryGateway, PaymentGateway paymentGateway) { this.orderRepository = orderRepository; this.inventoryGateway = inventoryGateway; this.paymentGateway = paymentGateway; } @Transactional(readOnly = true) public OrderDetailDTO getOrder(String orderId) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new OrderNotFoundException(orderId)); return OrderDetailDTO.from(order); } @Transactional public CreateOrderResult createOrder(CreateOrderCommand command) { inventoryGateway.reserve(command.items()); Order order = Order.create(command.userId(), command.items(), command.requestId()); orderRepository.save(order); return new CreateOrderResult(order.getOrderId(), order.getStatus().name()); } @Transactional public RefundResult refundOrder(RefundOrderCommand command) { Order order = orderRepository.findById(command.orderId()) .orElseThrow(() -> new OrderNotFoundException(command.orderId())); if (!order.canRefund(command.amount())) { throw new RefundNotAllowedException(command.orderId(), command.amount()); } paymentGateway.refund(order.ge
http://www.jsqmd.com/news/920831/

相关文章:

  • 基于ReAct与LLM的自主渗透测试与防御规则生成系统VANGUARD解析
  • 校园网没WiFi?一根网线搞定树莓派SSH连接(Windows 11/10保姆级教程)
  • 【Gemini系统架构设计核心机密】:谷歌内部未公开的5层解耦模型与实时推理优化策略
  • SGE搜索革命:从链接列表到AI生成式体验的范式转移
  • AI神像实践解析:从技术架构到伦理边界,看传统信仰数字化
  • 柔性电子应力监测分类器的设计与优化
  • STM32 HAL库模拟IIC vs 硬件IIC:驱动MT6701磁编码器,哪个更适合你的项目?
  • 从一张序列图到动态火焰:手把手教你用UE5.3 Niagara实现可交互的篝火特效(附材质球工程)
  • 别再让PCIe设备偷偷耗电了!手把手教你配置L1.1/L1.2低功耗状态(以Intel平台为例)
  • Unity混沌开发:快速原型验证与高效游戏创作实践
  • DashScope灵积模型API调用保姆级教程:从注册到第一个AI菜谱(Python版)
  • GovTech攻坚:AI在政务热线中的落地实践与系统工程
  • 从《原神》的草地到你的项目:手把手教你用GPU实例化搞定海量物体渲染(Unity 2022+)
  • 保险业AI转型:从战略框架到核心场景落地的实践指南
  • 数据堆栈解释性缺陷:从根源到修复的实战指南
  • AI前沿周报:OpenAI降价80%、苹果WWDC AI战略与开源模型新突破
  • GPT-4无代码应用指南:五大场景提升生产力与创造力
  • 别再手动调面积了!用ArcGIS Pro二次开发搞定土地调查面积平差(附完整C#代码)
  • AI个人助理核心技术解析:从架构原理到应用实践
  • ECB02蓝牙模块AT指令避坑指南:STM32主机模式配置的5个常见错误与调试技巧
  • 寒武纪MLU架构实战:从TP到MTP,手把手教你用Cambricon BANG写出高性能AI算子
  • FreeVM虚拟化平台安装后必做的5件事:从修改默认密码到配置管理网络
  • 解锁空间智能新未来,镜像视界核心技术点亮视频孪生
  • 【Gemini服务条款生成避坑指南】:20年合规专家亲授5大法律雷区与自动化生成黄金法则
  • RAG技术赋能时尚营销:从原理到实战的智能内容革命
  • AI结果解读指南:从被动接收到主动驾驭的实用方法论
  • 对话式贷款:用NLP与AI重塑普惠金融的交互范式
  • 最新AI论文网站势力榜(2026 实测推荐)
  • 算法管理时代:从任务分配到绩效评估的职场变革
  • Claude Opus 4.8 行业落地全解析:法律、金融与医疗的AI安全革命,诚实性如何成为最贵的能力