Spring AI Alibaba + JManus:从架构原理到生产落地的全栈实践——一篇面向 Java 架构师的 20 分钟深度阅读
目录
一、背景与问题域
1、为什么需要“Java 原生”AI 框架?
2、JManus 的定位:把“多智能体”做成 Spring Bean
二、核心概念模型
1、LLM 三元组
2、Tool 三元组
3、Agent 三元组
4、Workflow 三元组
三、架构详解
1、模块依赖图
2、线程模型
3、状态机
4、MCP(Manus Communication Protocol)
四、快速开始
1 、环境准备
2、项目骨架
3、引入 BOM
4、声明 ChatClient
5、第一个单 Agent
五、深度实战:订单退款机器人
1、需求拆解
2、定义 Tool
3、定义 Agent
4、编排工作流
5、REST 入口
六、可观测性
1、指标
2、Tracing
3、日志
七、性能调优
1、Token 优化
2、并发模型
3、JVM 参数
八、高可用与弹性
1、多活架构
2、断点续跑
3、灰度发布
九、多租户与权限
1、租户隔离
2、工具权限
十、常见坑与规避
十一、Roadmap
十二、总结
附录 A:参考链接
附录 B:一键部署 Helm Chart
一、背景与问题域
1、为什么需要“Java 原生”AI 框架?
- 语言生态壁垒:Python 生态虽成熟,但企业 70 % 的微服务、网关、消息总线仍跑在 Java/Spring 体系。
- 治理一致性:熔断、限流、灰度、链路追踪、配置中心、服务网格都是 Java 侧现成的。重写意味着双倍成本。
- 工程团队经验:大量 CRUD 工程师熟悉 Spring Boot,却缺乏 Python AI 工程能力。
Spring AI Alibaba(下文简称 SAA)应运而生:
“让 Java 工程师用三天时间,把 LLM 能力接入现有 Spring Cloud 体系,而不需要换语言、换协议、换监控。”
2、JManus 的定位:把“多智能体”做成 Spring Bean
OpenManus(Python)已证明:
- 多 Agent 协作可将复杂任务端到端成功率提升 4–6 倍;
- 但 Python 长进程 + 单线程 + 无状态,难以水平扩展。
JManus 用 Java 改写,核心目标:
维度 | 目标值 |
单 Pod 并发 | 10 k req/s |
水平扩展 | 无状态,秒级弹性 |
故障恢复 | 断点续跑,幂等重试 |
监控粒度 | 每个 Task 的 Token/Latency/异常 |
二、核心概念模型
1、LLM 三元组
SAA 把一次 LLM 调用抽象为:
PromptTemplate → ChatClient → ChatResponse
- PromptTemplate:支持 SpEL、嵌套子模板、占位符验证。
- ChatClient:统一接口屏蔽 OpenAI、通义、DeepSeek、Bedrock。
- ChatResponse:包含 Generation 列表 + Usage 计量 + RateLimit 元数据。
2、Tool 三元组
ToolDefinition → ToolExecutor → ToolCallback
- ToolDefinition:JSON Schema 描述输入/输出,自动生成 Swagger/OpenAPI。
- ToolExecutor:线程池隔离,防止外部 API 拖死 LLM 线程。
- ToolCallback:支持重试、熔断、Mock、缓存。
3、Agent 三元组
SystemPrompt → Tools → State
- SystemPrompt:支持多语言、版本化、热更新(Spring Cloud Bus)。
- Tools:运行时动态装配,按租户/灰度/特性开关注入。
- State:KV 存储,Redis / Mongo / PostgreSQL 插件化。
4、Workflow 三元组
StateGraph → Node → Edge
- StateGraph:有向图,支持 DAG 与循环。
- Node:Agent 或函数。
- Edge:条件表达式(SpEL + Groovy)。
三、架构详解
1、模块依赖图
spring-ai-alibaba├─ spring-ai-core├─ spring-ai-chat├─ spring-ai-vector-store├─ spring-ai-observability└─ jmanus├─ jmanus-engine├─ jmanus-planner├─ jmanus-memory└─ jmanus-mcp
2、线程模型
- Boss 线程:Netty EventLoop,负责 IO。
- Worker 线程:Virtual Thread(JDK21),1 MB 栈 → 10 k 并发。
- Tool 线程池:ThreadPoolTaskExecutor,隔离外部调用。
- LLM 线程池:Semaphore 限流,防止 Token 爆炸。
3、状态机
使用 Spring Statemachine 3.x:
enum States { PLANNING, EXECUTING, WAITING, COMPLETED, FAILED }
enum Events { TASK_CREATED, TOOL_RETURN, ERROR, TIMEOUT }
状态快照持久化到 Redis Stream(XADD workflow:{id}),支持断点续跑。
4、MCP(Manus Communication Protocol)
- 传输层:gRPC + Protobuf。
- 鉴权:mTLS + JWT。
- 插件:官方已提供 30+ 实现(钉钉、飞书、支付宝、OSS、Kafka、MySQL…)。
示例声明:
mcp:clients:dingtalk:endpoint: dingtalk-mcp.default.svc.cluster.local:9000auth:type: hmac-sha256secret: ${DING_SECRET}
四、快速开始
1 、环境准备
-
JDK 17+
-
Spring Boot 3.2+
-
Redis 7+(带 Stream)
-
Kubernetes(可选,HPA 弹性)
2、项目骨架
spring init \--dependencies=web,data-redis,actuator \--groupId=com.example \--artifactId=order-bot \order-bot
cd order-bot
3、引入 BOM
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-ai-alibaba-dependencies</artifactId><version>1.2.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
4、声明 ChatClient
spring:ai:tongyi:api-key: ${ALI_API_KEY}chat:options:model: qwen-maxtemperature: 0.3max-tokens: 2048
5、第一个单 Agent
@RestController
@RequiredArgsConstructor
public class HelloController {private final ChatClient chatClient;@GetMapping("/chat")public String chat(@RequestParam String q) {return chatClient.prompt().user(q).call().content();}
}
五、深度实战:订单退款机器人
1、需求拆解
角色 | 任务 |
---|---|
用户 | “我要退昨天的订单” |
Planner | 1. 识别意图 → 2. 查询订单 → 3. 校验规则 → 4. 调用退款接口 → 5. 通知用户 |
RefundAgent | 执行步骤 4 |
NotifyAgent | 执行步骤 5 |
2、定义 Tool
@Component
public class OrderTool implements ToolCallback<OrderRequest, OrderResponse> {@Overridepublic String getName() { return "orderQuery"; }@Overridepublic String getDescription() {return "根据订单号查询订单,返回金额、状态、物流信息";}@Overridepublic OrderResponse call(OrderRequest req) {return restTemplate.getForObject("http://order-svc/orders/{id}", OrderResponse.class, req.id());}
}
3、定义 Agent
@Bean
public Agent refundAgent(ChatClient chatClient, List<ToolCallback> tools) {return Agent.builder().name("refundAgent").system("""你是退款助手。请遵循:1. 金额>100元需主管审批2. 必须输出 JSON {"action":"refund","amount":99}""").tools(tools).chatClient(chatClient).build();
}
4、编排工作流
@Configuration
public class WorkflowConfig {@Beanpublic StateGraph refundWorkflow(Agent classifyAgent,Agent refundAgent,Agent notifyAgent) {return StateGraph.of("refundWorkflow").node("classify", classifyAgent).node("refund", refundAgent).node("notify", notifyAgent).edge(START, "classify").conditional("classify",ctx -> ctx.get("intent").equals("refund") ? "refund" : "notify").edge("refund", "notify").edge("notify", END);}
}
5、REST 入口
@RestController
@RequiredArgsConstructor
public class RefundController {private final ManusEngine engine;@PostMapping("/refund")public String refund(@RequestBody Map<String, Object> payload) {return engine.start("refundWorkflow", payload).block();}
}
六、可观测性
1、指标
名称 | 含义 |
---|---|
jmanus_agent_latency_seconds | 每个 Agent 的 P99 延迟 |
jmanus_token_total | 按模型、租户、Agent 维度 |
jmanus_workflow_failures_total | 失败原因标签化 |
Grafana 大盘 JSON 已内置,导入 ID 18686
。
2、Tracing
-
OpenTelemetry:自动透传 TraceId 到 LLM 调用。
-
Baggage:把租户 ID 带到 Tool 调用,方便灰度。
3、日志
-
Logback Encoder:JSON 格式,字段包括
workflowId
、agentName
、tokenUsage
。 -
Loki:Grafana 直接索引。
七、性能调优
1、Token 优化
-
Prompt 压缩:滑动窗口 + 摘要,减少 30 % Token。
-
模型分级:简单任务 qwen-1.5b,复杂推理 qwen-max。
-
缓存:相同问题 Redis 缓存 TTL 10 min。
2、并发模型
场景 | 建议 |
---|---|
CPU 密集 | Virtual Thread 数量 ≈ CPU × 2 |
IO 密集 | Virtual Thread 数量 = 10 k |
LLM 调用 | 限流 semaphore = 100 |
3、JVM 参数
-XX:+UseZGC
-XX:MaxGCPauseMillis=20
-Djdk.virtualThreadScheduler.parallelism=256
八、高可用与弹性
1、多活架构
-
双集群:北京 + 上海
-
Redis 跨地域同步:阿里 DTS
-
模型网关:就近路由(华北调用北京节点)
2、断点续跑
-
快照:每 30 s 写入 Redis Stream
-
故障:Pod Crash 后,新 Pod 读取 Stream 恢复
-
幂等:TaskId + 幂等 Token
3、灰度发布
-
Spring Cloud LoadBalancer 权重
-
模型灰度:10 % 流量 → 新模型
-
回滚:修改 ConfigMap,30 s 生效
九、多租户与权限
1、租户隔离
-
逻辑:Redis key 前缀
tenant:{id}:workflow:{wfId}
-
资源:HPA 按租户打标签,独立扩缩容
2、工具权限
-
MCP 鉴权:JWT + Scope
-
白名单:每个租户可使用的 Tool 列表动态下发
十、常见坑与规避
问题 | 现象 | 解决 |
---|---|---|
Token 超限 | 502 from LLM | Prompt 压缩 + 模型升级 |
Tool 超时 | 99th 延迟飙高 | 线程池隔离 + 熔断 |
状态膨胀 | Redis 内存暴涨 | 快照 TTL + 压缩 |
版本漂移 | 线上结果不一致 | 锁定 system prompt 版本 |
十一、Roadmap
-
2025 Q3:支持 Function Calling V2(并行工具调用)
-
2025 Q4:Workflow DSL 图形化编辑器(VS Code 插件)
-
2026 Q1:Serverless 模式,Pod 冷启动 < 300 ms
十二、总结
Spring AI Alibaba + JManus 提供了:
-
Java 工程师最熟悉的编程模型(Bean、注解、配置中心)。
-
面向生产的可观测、弹性、灰度、多租户。
-
与现有 Spring Cloud 网关、配置、注册中心无侵入集成。
一句话:“用写 CRUD 的心智,写 AI 时代的复杂 Agent 系统。”
附录 A:参考链接
-
官方文档:https://spring-ai-alibaba.io
-
GitHub:https://github.com/alibaba/spring-ai-alibaba
-
示例仓库:https://github.com/spring-ai-alibaba/examples
附录 B:一键部署 Helm Chart
helm repo add spring-ai https://charts.spring-ai-alibaba.io
helm install jmanus-demo spring-ai/jmanus \--set image.tag=1.2.0 \--set redis.enabled=true \--set autoscaling.enabled=true
🫡🫡🫡