Agent 之间怎么对话?A2A 协议全景解析:从概念到 Java 落地
你公司 HR Agent 用 Google ADK 构建,销售 Agent 用 LangChain,财务 Agent 用 CrewAI——一个入职流程要横跨三个系统,靠人工串联?A2A 协议让它们自己对话、自己协作。
一、为什么需要 A2A?
先看一个真实场景:
新员工入职流程: 1. HR Agent 完成背调 2. 销售 Agent 创建客户关系 3. 财务 Agent 开通报销权限 没有 A2A:邮件 → 钉钉 → 手动填单 → 等审批 有了 A2A:HR Agent 完成 → 自动通知销售 Agent → 自动通知财务 Agent当前 Agent 生态的痛点:
| 痛点 | 具体表现 |
|---|---|
| 框架孤岛 | LangChain、CrewAI、AutoGPT 各自闭环,跨框架无法直接通信 |
| 手动串联 | 多 Agent 流程靠人手动传递信息,效率低且易出错 |
| 能力不可见 | A Agent 不知道 B Agent 能干什么,无法动态发现和调度 |
| 安全失控 | Agent 之间直接调用 API,没有标准化的身份认证和权限管理 |
A2A(Agent-to-Agent)协议由 Google 于 2025 年 4 月发布,专门解决这些问题。2025 年 6 月捐赠给 Linux 基金会,已发布 V1.0 GA,150+ 组织生产部署。
二、A2A vs MCP vs 子 Agent:三个层次别搞混
聊 A2A 最大的误区是把它跟 MCP、子 Agent 混在一起——它们解决的根本不是同一层问题:
┌─────────────────────────────────────────────────────────────┐ │ 应用层(业务流程) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ A2A:Agent ↔ Agent 横向协作 │ │ │ │ "你做背调,我做报销审批,我们怎么对接?" │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────┐ ┌───────────────────────────┐ │ │ │ MCP:Agent ↔ 工具 │ │ 子Agent:Agent 内部派生 │ │ │ │ 纵向集成 │ │ 纵向编排 │ │ │ │ "连数据库、调API" │ │ "主Agent拆子任务" │ │ │ └───────────────────────┘ └───────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘| 维度 | A2A | MCP | 子 Agent |
|---|---|---|---|
| 解决什么 | Agent 间横向协作 | Agent 与工具/数据纵向集成 | 系统内任务拆分 |
| 一句话类比 | SMTP(邮件协议) | USB-C(设备接口) | 团队内部分工 |
| 通信方向 | 对等 | 主从 | 主从 |
| 跨框架 | 天然支持 | 不涉及 | 通常同框架内 |
| 部署边界 | 跨组织 | 单 Agent | 单 Agent |
MCP 是给 Agent 装手脚,A2A 是给 Agent 装社交网络。
三、A2A 四大核心对象
3.1 Agent Card——Agent 的"名片"
每个支持 A2A 的 Agent 发布一个 JSON 格式的 Agent Card,描述自己的能力、接口和认证方式:
{"name":"HR Background Check Agent","description":"负责新员工背景调查,包括学历验证、工作经历核实","url":"https://hr-agent.example.com/a2a","capabilities":{"streaming":true,"pushNotifications":true},"skills":[{"id":"background-check","name":"背调执行","description":"执行候选人背景调查,返回验证结果","inputModes":["text","file"],"outputModes":["text"]}],"authentication":{"type":"oauth2","authorizationUrl":"https://hr-agent.example.com/auth"}}关键设计:Agent Card 是声明式的,类似 WSDL/OpenAPI spec。调用方不需要提前硬编码对方接口,运行时读 Card 即可。
3.2 Task——任务生命周期
Task 是 A2A 协作的核心单元,有明确的生命周期:
┌──────────────────────────────────────────────────┐ │ Task 生命周期 │ │ │ │ submitted → working → completed │ │ │ │ │ │ │ │ │ └→ failed │ │ │ │ │ │ │ └→ input-required(需要人工输入) │ │ │ │ │ └→ canceled │ └──────────────────────────────────────────────────┘| 状态 | 含义 |
|---|---|
submitted | 任务已提交,远端 Agent 已接收 |
working | 远端 Agent 正在处理 |
input-required | 需要调用方补充信息(人工介入点) |
completed | 任务完成,产出 Artifact |
failed | 任务失败 |
canceled | 任务取消 |
3.3 Message——对话消息
Agent 之间的对话通过 Message 传递:
{"role":"user","parts":[{"type":"text","text":"请对候选人张三进行背调"},{"type":"file","file":{"name":"resume.pdf","url":"https://example.com/resume.pdf"}}]}Part 的多种类型:text、file、data(结构化 JSON),确保不同类型内容都能在 Agent 间流转。
3.4 Artifact——任务产出
Task 完成后产出 Artifact:
{"artifact":{"parts":[{"type":"text","text":"背调结论:学历验证通过,工作经历核实通过"},{"type":"data","data":{"candidate":"张三","education_verified":true,"experience_verified":true,"risk_level":"low"}}]}}四、A2A 通信协议:JSON-RPC 2.0
A2A 基于 JSON-RPC 2.0,所有请求/响应都是标准 JSON:
4.1 核心方法
| 方法 | 用途 | 方向 |
|---|---|---|
tasks/send | 发送任务给远端 Agent | 调用方 → 远端 |
tasks/get | 查询任务状态 | 调用方 → 远端 |
tasks/cancel | 取消任务 | 调用方 → 远端 |
tasks/push-notification/set | 注册推送通知 | 调用方 → 远端 |
4.2 请求示例
{"jsonrpc":"2.0","method":"tasks/send","id":"1","params":{"id":"task-2026-001","message":{"role":"user","parts":[{"type":"text","text":"请对候选人张三进行背景调查"}]}}}4.3 三种长任务状态获取模式
┌───────────────────────────────────────────────────────┐ │ 模式一:Polling(轮询) │ │ 调用方定期调 tasks/get 查状态 │ │ ✓ 简单 ✗ 浪费资源 ✗ 延迟高 │ ├───────────────────────────────────────────────────────┤ │ 模式二:Streaming SSE(服务端推送事件) │ │ 远端 Agent 通过 SSE 流式返回状态更新 │ │ ✓ 实时 ✗ 需保持连接 ✓ 适合大模型流式输出 │ ├───────────────────────────────────────────────────────┤ │ 模式三:Push Notification(Webhook 回调) │ │ 调用方注册回调 URL,远端状态变化时主动推送 │ │ ✓ 解耦 ✓ 适合跨组织 ✗ 需公网可达 │ └───────────────────────────────────────────────────────┘| 模式 | 适用场景 | 实时性 | 复杂度 |
|---|---|---|---|
| Polling | 简单场景、内网 | 低 | 低 |
| Streaming SSE | 大模型流式输出 | 高 | 中 |
| Push Notification | 跨组织协作 | 中 | 高 |
五、Java 落地:Spring AI + A2A
5.1 引入依赖
Spring AI 已提供 A2A 支持:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-a2a</artifactId><version>1.0.0-GA</version></dependency>5.2 发布 Agent Card
@ConfigurationpublicclassA2aConfig{@BeanpublicAgentCardhrAgentCard(){returnAgentCard.builder().name("HR Background Check Agent").description("负责新员工背景调查").url("https://hr-agent.example.com/a2a").capabilities(Capabilities.builder().streaming(true).pushNotifications(true).build()).skills(List.of(Skill.builder().id("background-check").name("背调执行").description("执行候选人背景调查").inputModes(List.of("text","file")).outputModes(List.of("text")).build())).build();}}5.3 实现 A2A 端点
@RestController@RequestMapping("/a2a")publicclassA2aController{privatefinalHrBackgroundCheckServicecheckService;@PostMappingpublicResponseEntity<JsonRpcResponse>handleRequest(@RequestBodyJsonRpcRequestrequest){switch(request.getMethod()){case"tasks/send":Tasktask=checkService.startCheck(request.getParams());returnResponseEntity.ok(JsonRpcResponse.success(task));case"tasks/get":Taskcurrent=checkService.getStatus(request.getParams().getId());returnResponseEntity.ok(JsonRpcResponse.success(current));case"tasks/cancel":checkService.cancel(request.getParams().getId());returnResponseEntity.ok(JsonRpcResponse.success(null));default:returnResponseEntity.ok(JsonRpcResponse.error("Method not found",-32601));}}// Agent Card 端点@GetMapping("/.well-known/agent-card")publicAgentCardgetAgentCard(){returnhrAgentCard();}}5.4 调用远端 Agent
@ServicepublicclassOnboardingService{privatefinalA2aClienta2aClient;publicStringstartBackgroundCheck(StringcandidateName){// 1. 发现 Agent(读 Agent Card)AgentCardhrCard=a2aClient.discover("https://hr-agent.example.com/a2a/.well-known/agent-card");// 2. 发送任务TaskRequesttaskRequest=TaskRequest.builder().message(Message.builder().role("user").parts(List.of(TextPart.of("请对候选人 "+candidateName+" 进行背调"))).build()).build();Tasktask=a2aClient.sendTask(hrCard.getUrl(),taskRequest);// 3. 轮询等待完成(生产环境用 Push Notification)while(task.getStatus().getState()==TaskState.WORKING){Thread.sleep(5000);task=a2aClient.getTask(hrCard.getUrl(),task.getId());}// 4. 获取产出if(task.getStatus().getState()==TaskState.COMPLETED){returntask.getArtifacts().get(0).getParts().get(0).getText();}thrownewRuntimeException("背调任务失败: "+task.getStatus());}}5.5 注册 Push Notification
// 调用方注册回调a2aClient.setPushNotification(hrCard.getUrl(),PushNotificationConfig.builder().url("https://my-agent.example.com/a2a/callback").authentication(AuthConfig.builder().type("oauth2").tokenUrl("https://auth.example.com/token").build()).build());六、A2A 与中国国标 GB/Z 185-2026
中国于 2026 年发布了 GB/Z 185-2026《智能体间协作通信协议》,与 A2A 高度对齐:
| 维度 | A2A (Google/Linux Foundation) | GB/Z 185-2026 (中国国标) |
|---|---|---|
| 核心模型 | Agent Card + Task + Message | 基本一致 |
| 传输协议 | JSON-RPC 2.0 over HTTP | JSON-RPC 2.0 over HTTP |
| 认证方式 | OAuth2 / API Key | 国密算法 + OAuth2 |
| 扩展点 | Skill、Part 类型 | 增加合规审计字段 |
| 互操作性 | 可互操作 | 可互操作 |
实践建议:国内项目优先适配国标,出海项目用 A2A 标准。两者核心模型一致,切换成本很低。
七、A2A 生产落地 Checklist
| 实践 | 原因 |
|---|---|
| Agent Card 必须 HTTPS + 认证 | 防止伪造 Agent 能力描述 |
| 长任务用 Push Notification | Polling 浪费资源,SSE 不适合跨组织 |
| Task 设置超时 | Agent 可能宕机,调用方不能无限等 |
| Artifact 做版本控制 | Agent 可能多次迭代产出 |
| 敏感数据用加密 Part | Agent 间传输的数据可能包含个人信息 |
| 加可观测性(Trace ID) | 多 Agent 链路追踪,出了问题能定位 |
| Agent Card 版本管理 | 能力变更需要版本控制,避免调用方缓存过期 |
八、A2A 生态现状
| 指标 | 数据 |
|---|---|
| 协议版本 | V1.0 GA |
| 管理方 | Linux Foundation |
| 生产部署组织 | 150+ |
| 主流框架支持 | Spring AI、LangChain4j、Google ADK、CrewAI |
| 中国国标 | GB/Z 185-2026 |
| 与 MCP 关系 | 互补(A2A 管横向,MCP 管纵向) |
九、总结
A2A 解决的是 Agent 世界的"社交问题"——不同框架、不同厂商的 Agent 怎么对话、怎么协作、怎么安全地交换任务:
- Agent Card 是入口:声明式能力描述,运行时发现
- Task 是核心:明确的生命周期,从提交到完成
- JSON-RPC 2.0 是骨架:简单、标准、语言无关
- 三种通知模式:Polling / SSE / Push Notification,按场景选
- MCP 互补不竞争:一个管工具集成,一个管 Agent 协作
一句话:MCP 给 Agent 装了手和脚,A2A 给 Agent 装了社交网络。两手都要硬,Agent 才能真正干活。
相关阅读:
- A2A Protocol 官方规范
- Spring AI A2A 集成文档
- GB/Z 185-2026 智能体间协作通信协议