===
前排提醒:本文面向有Java后端基础、想转AI Agent开发的工程师。MCP部分不展开,默认你已经了解基本概念。
两个协议,一张图说清楚
很多人被MCP和A2A搞晕。先上结论:
协议
职责
类比
MCP
Agent → Tools
Feign调用微服务API
A2A
Agent ↔ Agent
微服务间HTTP通信
MCP让Agent能调用外部工具(数据库、API、文件系统)。
A2A让Agent能和另一个Agent对话、派任务、传结果。
两者互补,不是替代。
现实项目里,一个完整的Agent往往同时用MCP和A2A:用MCP调用工具,用A2A和其他Agent协作。
真实场景:代码审查Multi-Agent系统
拿我的Dream-SaaS项目举例,假设要做智能代码审查:
plaintext
用户上传Java代码
↓
code-review-agent(主Agent)
↓ 发现需要Java升级建议
↓ 通过A2A委派
java-modernization-agent(子Agent)
↓ 返回升级方案
code-review-agent整合结果
↓
返回给用户
没用A2A时,code-review-agent得自己内置所有Java升级知识。
用了A2A后,它只需要知道"有个Java升级专家Agent",然后把活派出去。专业解耦,职责分离。
A2A v0.2更新了什么
2025年4月Google在Cloud Next上首次公布A2A协议,5月在Google I/O 2025正式发布v0.2,6月快速迭代到v0.2.6。
关键版本演进
plaintext
v0.2.0 (2025.05) —— 初始版本,JSON-RPC over HTTPS
v0.2.1 (2025.05.27) —— 扩展AgentCard、referenceTaskIds
v0.2.2 (2025.06.09) —— ⚡ gRPC/REST双传输、扩展机制
v0.2.5 (2025.06.30) —— AgentCard强制包含protocolVersion
v0.3.0 (2025.07.30) —— mTLS、agent-card.json(Breaking Change)
v0.2.2是Java开发者的分水岭:协议从纯HTTP演进到支持gRPC和REST双传输。
v0.2.2新增的AgentCard字段
json
{
"name": "my-agent",
"version": "1.0.0",
"protocolVersion": "0.2.2",
"url": "http://localhost:8080",
"iconUrl": "https://example.com/icon.png",
"capabilities": {
"streaming": true,
"pushNotifications": true,
"stateTransitionHistory": true,
"extensions": [
{
"identifier": "google.a2a.payments",
"version": "1.0"
}
]
}
}
注意extensions字段——v0.2.2引入了扩展机制,允许在协议上叠加特定领域的能力(比如支付协议)。
Java开发者怎么接入A2A
方案一:Google官方A2A Java SDK
官方仓库刚起步,但结构清晰:
bash
git clone https://github.com/google-a2a/a2a-samples
cd a2a-samples/samples/java
./mvnw clean install -DskipTests
核心模块:
plaintext
samples/java/
├── model/ # A2A协议数据模型
├── server/ # A2A Server SDK(基于Spring Boot)
└── client/ # A2A Client SDK
方案二:Spring Actions(推荐)
专门为Spring生态做的A2A+MCP双协议框架,作者是Google ADK团队的Vishal Mysore。
项目地址: github.com/vishalmysor…
Maven配置:
xml
<dependency>
<groupId>io.github.vishalmysore</groupId>
<artifactId>a2ajava</artifactId>
<version>0.1.0</version>
</dependency>
定义一个Agent:
java
@Agent(name = "code-review", description = "Java代码审查专家")
public class CodeReviewService {
@Action(name = "review-java", description = "审查Java代码质量")
public ReviewResult reviewJava(String code) {
// 业务逻辑
return ReviewResult.builder()
.score(85)
.issues(List.of(
new Issue("WARN", "使用Date而非LocalDateTime", 5)
))
.build();
}
}
启动A2A Server:
java
@SpringBootApplication
@EnableA2A
public class CodeReviewApplication {
public static void main(String[] args) {
SpringApplication.run(CodeReviewApplication.class, args);
}
}
Agent自动暴露.well-known/agent-card.json端点。
方案三:MusaeMotion/A2A-server-java
国产方案,基于Spring AI,支持Nacos服务注册。
项目地址: github.com/MusaeMotion…
Maven BOM:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.github.musaemotion</groupId>
<artifactId>a2a-pom</artifactId>
<version>0.5.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
多Agent协作示例:
项目内置了多个专业Agent:
-
agent-server-ollama-sentiment-analysis— 情感分析 -
agent-server-ollama-vision— 图像识别 -
agent-server-zhipu-generate-images— 文生图
组合使用:
java
@Autowired
private HostAgentService hostAgent;
// 注册远程Agent
hostAgent.registerAgent(
"sentiment-analysis",
"http://localhost:8081"
);
// 通过A2A调用
TaskResponse response = hostAgent.delegate(
"sentiment-analysis",
"analyze",
new TextInput("这个产品太棒了!")
);
Agent Card设计要点
Agent Card是A2A的核心——它告诉其他Agent你是谁、你能干什么。
json
// .well-known/agent-card.json(v0.3.0从agent.json改名)
{
"name": "java-modernization-agent",
"version": "1.0.0",
"protocolVersion": "0.2.5",
"url": "http://localhost:8080",
"provider": {
"organization": "Dream-SaaS",
"url": "https://dream-saas.example.com"
},
"capabilities": {
"streaming": true,
"pushNotifications": true,
"stateTransitionHistory": true
},
"securitySchemes": {
"bearer": {
"type": "http",
"scheme": "bearer"
}
},
"security": [{"bearer": []}],
"defaultInputModes": ["application/json", "text/plain"],
"defaultOutputModes": ["application/json", "text/markdown"],
"skills": [
{
"id": "date-to-localdatetime",
"name": "Date API升级",
"description": "将java.util.Date迁移到java.time.LocalDateTime",
"tags": ["java", "migration", "java8+"],
"examples": [
"把new Date()改成LocalDateTime.now()"
],
"inputModes": ["application/json", "text/plain"],
"outputModes": ["application/json", "text/markdown"]
},
{
"id": "for-to-stream",
"name": "循环转Stream",
"description": "将传统for循环转换为Java Stream API",
"tags": ["java", "stream", "refactor"],
"examples": [
"把users.stream().filter(u -> u.isActive()).collect(Collectors.toList())"
]
}
]
}
设计原则:
-
skills必须有至少一个,否则其他Agent不知道你能干嘛 -
id要全局唯一,建议用模块-功能格式 -
description要写给AI看的,AI会根据这个决定是否调用你
Task生命周期
A2A的核心抽象是Task(任务),有完整的状态机:
plaintext
submitted → working → completed
↓
input-required(需要用户输入)
↓
auth-required(需要认证)
↓
failed / canceled / rejected
发送同步任务:
java
// A2A Client调用
A2AClient client = A2AClient.builder()
.url("http://localhost:8080")
.build();
Task task = client.sendMessage(
Message.builder()
.role(Role.USER)
.parts(List.of(new TextPart("帮我审查这段代码:" + code)))
.build()
);
订阅流式更新:
java
client.streamingSend(
message,
new StreamingEventListener() {
@Override
public void onArtifact(Artifact artifact) {
// 收到增量输出
}
@Override
public void onStatusUpdate(TaskStatusUpdateEvent event) {
// 状态变更
System.out.println("Task状态: " + event.getStatus().getState());
}
}
);
现状判断
给想转AI的Java开发者几个判断:
1. MCP是现在,A2A是未来
MCP已经成熟可用,Spring AI Alibaba、Spring AI官方都支持。A2A生态还在早期,但Google、Zoom、Salesforce、SAP这些大厂都在押注。
2. Java生态正在追赶
Python在AI领域领先是事实,但A2A/MCP的Java支持在快速追赶。Spring Actions、MusaeMotion/A2A-server-java都在积极开发。
3. 两个都要学
你以后写的Agent,既要有MCP工具调用能力(Agent的手),也要有A2A协作能力(Agent的嘴)。这才是完整的多Agent系统。
4. 最佳学习路径
plaintext
Step 1: 学MCP → 用Spring AI Alibaba快速上手
Step 2: 搭Multi-Agent → 用Spring AI Graph体验多Agent协作
Step 3: 跟进A2A → 关注Spring Actions和官方SDK演进
评论区聊一聊:你的项目里更缺哪种能力——Agent调用工具,还是Agent之间通信?