本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
今天的 AI 圈,可热闹了。先是美国方面,进行了 AI 技术迭代,死磕生产力。Anthropic 率先推出 Claude Opus 4.6,重点升级代码规划与调试,引入 100 万 token 上下文窗口,强化 Excel、PPT 集成。OpenAI 也不甘示弱,发布了 GPT-5.3-Codex,主打“智能体编程”,在 SWE-bench Pro 等测试中表现强劲,速度提升 25%。
而在国内方面,随着元宝发起 AI 春节攻势,百度、阿里先后加入了“红包”大赛。千问今天特别火爆,服务都崩了好几个小时,到现在都还没修好。
上图中的搞笑对比图,在朋友圈里疯传,果然还是自家人更懂自家人嘛。
AI 大战这么火热,Java 生态里的 Spring AI 也不甘落后。就在近日,Spring AI 2.0 引入了重磅功能,通过 A2A 协议实现智能体跨平台协作。
随着 Spring AI 2.0.0-M2 这个预发版的发布,Spring 团队推出了全新的 A2A(Agent2Agent)协议支持,这标志着企业级 AI 智能体开发进入“互联互通”新纪元。本文将深入解析 A2A 协议的工作原理以及如何在 Spring AI 中落地实现。
为什么要关注 A2A 协议?
在当前的 AI 应用开发中,我们始终面临一个现实问题:不同框架、不同语言开发的 AI 智能体之间难以协作。你可能有一个用 Spring AI 开发的智能客服,一个用 Python 开发的数据分析 Agent,还有一个第三方的天气查询 Agent 等。如何让它们像一个团队一样协同工作?
面对这样的场景,A2A(Agent2Agent)协议诞生了,它正是为了解决这个痛点而生的开放标准。由 Google 等厂商推动,基于 HTTP、SSE 和 JSON-RPC 标准构建,实现了:
- 能力发现:智能体可以自动发现其他智能体的能力
- 消息交换:标准化的通信协议
- 工作流协调:跨平台任务编排
Spring AI A2A 的架构设计
Spring AI A2A 项目(社区版)提供了 Spring Boot 自动配置,可以让我们无缝的将 Spring AI 应用暴露为 A2A 兼容的服务端。
Spring AI A2A 的核心组件如下。
- AgentCard:智能体的“名片”,描述能力、技能和协议版本
- MessageController:处理 A2A 消息请求
- DefaultAgentExecutor:连接 A2A SDK 与 Spring AI 的 ChatClient
- 自动配置端点:
POST /处理 JSON-RPC sendMessage 请求GET /.well-known/agent-card.json标准 A2A 能力发现端点GET /card备选 Agent Card 端点
5 分钟构建可互操作的天气智能体
下面我们来一个简单的实战,通过大概 5 分钟的时间构建可互操作的天气智能体。
添加依赖
<!-- Spring AI A2A 服务端自动配置 -->
<dependency>
<groupId>org.springaicommunity</groupId>
<artifactId>spring-ai-a2a-server-autoconfigure</artifactId>
<version>0.2.0</version>
</dependency>
<!-- 如需调用远程 A2A Agent,添加客户端 SDK -->
<dependency>
<groupId>io.github.a2asdk</groupId>
<artifactId>a2a-java-sdk-client</artifactId>
<version>0.3.3.Final</version>
</dependency>
配置 Agent Card
@Configuration
public class WeatherAgentConfiguration {
@Bean
public AgentCard agentCard(@Value("${server.port:8080}") int port,
@Value("${server.servlet.context-path:/}") String contextPath) {
return new AgentCard.Builder()
.name("Weather Agent")
.description("提供城市天气信息查询服务")
.url("http://localhost:" + port + contextPath + "/")
.version("1.0.0")
.capabilities(new AgentCapabilities.Builder()
.streaming(false)
.build())
.defaultInputModes(List.of("text"))
.defaultOutputModes(List.of("text"))
.skills(List.of(
new AgentSkill.Builder()
.id("weather_search")
.name("天气查询")
.description("获取任意城市的温度信息")
.tags(List.of("weather", "temperature"))
.examples(List.of("北京今天天气怎么样?"))
.build()
))
.protocolVersion("0.3.0")
.build();
}
}
实现业务逻辑
@Bean
public AgentExecutor agentExecutor(ChatClient.Builder chatClientBuilder,
WeatherTools weatherTools) {
ChatClient chatClient = chatClientBuilder.clone()
.defaultSystem("你是天气助手,使用 temperature 工具回答问题。")
.defaultTools(weatherTools) // 注册 Spring AI 工具
.build();
// DefaultAgentExecutor 自动桥接 A2A 协议和 ChatClient
return new DefaultAgentExecutor(chatClient, (chat, requestContext) -> {
String userMessage = DefaultAgentExecutor
.extractTextFromMessage(requestContext.getMessage());
return chat.prompt().user(userMessage).call().content();
});
}
@Service
class WeatherTools {
@Tool(description = "获取指定城市的当前温度")
public String getTemperature(@ToolParam(description = "城市名称") String city) {
// 调用天气 API...
return "北京当前温度 22°C,晴朗";
}
}
写完上面的代码,基本上就搞定了!这样,我们的 Spring AI 应用现在就是一个标准的 A2A 服务端,其他智能体可以通过标准的 A2A 协议发现并调用它。
多智能体编排实战
上面的案例,只是一个最简单的实战。A2A 真正的威力在于多智能体协作。下面来看一个旅行规划场景:一个 Host Agent 协调 Airbnb 预订 Agent 和天气查询 Agent。
Host Agent 配置(客户端)
@Service
public class RemoteAgentConnections {
private final Map<String, AgentCard> agentCards = new HashMap<>();
public RemoteAgentConnections(@Value("${remote.agents.urls}") List<String> agentUrls) {
// 启动时发现远程 Agent
for (String url : agentUrls) {
AgentCard card = A2A.getAgentCard(url, "/.well-known/agent-card.json", null);
this.agentCards.put(card.name(), card);
}
}
@Tool(description = "向远程 Agent 发送任务,委派给专业 Agent 处理")
public String sendMessage(
@ToolParam(description = "Agent 名称") String agentName,
@ToolParam(description = "任务描述") String task) throws Exception {
AgentCard agentCard = this.agentCards.get(agentName);
// 构建 A2A 消息
Message message = new Message.Builder()
.role(Message.Role.USER)
.parts(List.of(new TextPart(task, null)))
.build();
// 使用 A2A Java SDK 客户端发送
CompletableFuture<String> responseFuture = new CompletableFuture<>();
Client client = Client.builder(agentCard)
.withTransport(JSONRPCTransport.class, new JSONRPCTransportConfig())
.addConsumers(List.of(consumer -> {
if (consumer instanceof TextPart textPart) {
responseFuture.complete(textPart.getText());
}
}))
.build();
client.sendMessage(message);
return responseFuture.get(60, TimeUnit.SECONDS);
}
public String getAgentDescriptions() {
return agentCards.values().stream()
.map(card -> card.name() + ": " + card.description())
.collect(Collectors.joining("\n"));
}
}
协调逻辑
@Bean
public ChatClient routingChatClient(ChatClient.Builder chatClientBuilder,
RemoteAgentConnections connections) {
String systemPrompt = """
你是旅行规划协调员,统筹以下专业 Agent:
%s
使用 sendMessage 工具将任务委派给合适的 Agent。
例如:用户说"帮我订伦敦的酒店",应调用 Airbnb Agent。
""".formatted(connections.getAgentDescriptions());
return chatClientBuilder
.defaultSystem(systemPrompt)
.defaultTools(connections) // 注册为 Spring AI 工具
.build();
}
上述代码的大致工作流程如下。
- 启动时自动发现远程 Agent 能力(Airbnb Agent、Weather Agent)
- 用户输入:“帮我规划伦敦 3 日游”
- LLM 自动决策:先查天气 → 再订酒店 → 整合结果
- 通过 A2A 协议调用对应 Agent,结果聚合返回
通信流程深度解析
理解 A2A 协议的三步握手,如下图所示。
- 发现阶段:客户端从
/.well-known/agent-card.json获取服务端能力 - 请求阶段:发送 JSON-RPC
sendMessage请求 - 执行阶段:
MessageController→AgentExecutor→ChatClientExecutor→ 业务逻辑 - 响应阶段:Spring AI ChatClient 的结果打包为 A2A 响应返回
Spring AI 2.0 与 A2A 的未来展望
当前版本(0.2.0)已支持服务端自动配置,社区还正在进行以下规划:
| 功能 | 状态 | 说明 |
|---|---|---|
| 安全认证 | 计划中 | A2A 身份验证与授权机制 |
| Agent 发现自动配置 | 规划中 | Spring Boot 风格的远程 Agent 自动发现 |
| 客户端自动配置 | 待开发 | 更友好的 A2A 客户端抽象 |
| SSE 流式支持 | 待开发 | 实时流式响应传输 |
| Actuator 监控 | 构想 | A2A 交互的可观测性支持 |
Spring AI 2.0.0-M2,是第二次预览了,预计正式版将很快就会与大家见面!
总结
Spring AI 2.0 引入 A2A 协议支持,带来了三大价值:
- 标准化:基于开放协议,打破框架和语言壁垒
- 低侵入:通过 Spring Boot 自动配置,现有应用几乎零改造成本
- 可编排:支持构建复杂的多智能体协作系统
Spring AI A2A 是社区项目,随着 Spring AI 2.0 正式版临近,A2A 生态有望成为企业级 AI 集成的重要标准。
我记得是 3 月份还是 4 月份,Spring 有两个重要大会。应该会在 Spring IO 大会之前发布正式版,说不定年后正式版就推出来了,到时候我将再次探索 Spring AI A2A 会给我们带来哪些惊喜。

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!