ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Agent 之间怎么对话?A2A 协议全景解析:从概念到 Java 落地

2026/8/14 5:11:04 拓冰建站 浏览量
Agent 之间怎么对话?A2A 协议全景解析:从概念到 Java 落地

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拆子任务" │ │ │ └───────────────────────┘ └───────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘
维度A2AMCP子 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 HTTPJSON-RPC 2.0 over HTTP
认证方式OAuth2 / API Key国密算法 + OAuth2
扩展点Skill、Part 类型增加合规审计字段
互操作性可互操作可互操作

实践建议:国内项目优先适配国标,出海项目用 A2A 标准。两者核心模型一致,切换成本很低。

七、A2A 生产落地 Checklist

实践原因
Agent Card 必须 HTTPS + 认证防止伪造 Agent 能力描述
长任务用 Push NotificationPolling 浪费资源,SSE 不适合跨组织
Task 设置超时Agent 可能宕机,调用方不能无限等
Artifact 做版本控制Agent 可能多次迭代产出
敏感数据用加密 PartAgent 间传输的数据可能包含个人信息
加可观测性(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 怎么对话、怎么协作、怎么安全地交换任务:

  1. Agent Card 是入口:声明式能力描述,运行时发现
  2. Task 是核心:明确的生命周期,从提交到完成
  3. JSON-RPC 2.0 是骨架:简单、标准、语言无关
  4. 三种通知模式:Polling / SSE / Push Notification,按场景选
  5. MCP 互补不竞争:一个管工具集成,一个管 Agent 协作

一句话:MCP 给 Agent 装了手和脚,A2A 给 Agent 装了社交网络。两手都要硬,Agent 才能真正干活。


相关阅读:

  • A2A Protocol 官方规范
  • Spring AI A2A 集成文档
  • GB/Z 185-2026 智能体间协作通信协议