在上一篇博客中,我介绍了如何通过 MCP Gateway 将存量 Restful 服务转化为 AI 可调用的工具,但这通常解决的是单一任务 。现实业务往往是复杂的:"先并行收集信息 -> 再串行处理逻辑 -> 最后根据情况动态分流"。单个 Agent 往往因为上下文过长、技能过多而"精神分裂"或"力不从心"。Multi-Agent 将复杂应用分解为多个协同工作的专业化 Agent,各司其职。
Spring AI Alibaba 主要支持 顺序 (Sequential) 、并行 (Parallel) 、路由 (LlmRoutingAgent) 、监督者 (SupervisorAgent) 以及自定义模式 。其中,监督者模式在 1.1.2.1 版本中已被弃用,可以通过官方示例查看如何构建监督模式代理。
Multi-Agent 主要聚焦于单应用内部的架构模式。而这篇博客,我们将重点讨论如何解决 Agent 之间的远程通信 与分布式协作问题。
为什么需要 A2A?
随着智能体应用的广泛落地,智能体应用间的分布式部署与远程通信成为要解决的关键问题,Google 推出的 Agent2Agent(A2A)协议即面向这一落地场景。A2A 解决智能体与其他使用不同框架、部署在不同机器、不同公司的智能体进行有效通信和协作的问题。
A2A 协议定义了智能体之间通信的标准方式,使得不同框架、不同部署环境的智能体能够无缝协作。
Spring AI Alibaba 的 A2A 实现包含三个核心组件:
- A2A Server:将本地 ReactAgent 暴露为 A2A 服务
- A2A Registry:Agent 注册中心(支持 Nacos)
- A2A Discovery:Agent 发现机制(支持 Nacos)
环境准备
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.1.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-agent-framework</artifactId>
<version>1.1.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-a2a-nacos</artifactId>
<version>1.1.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
发布 A2A 智能体
本节我们要将一个本地的 ReactAgent 发布为可以通过网络被调用的服务。
1. 配置文件 (application.yml)
关键配置是 spring.ai.alibaba.a2a.server,它定义了 Agent 的元数据,这些数据会被注册到 Nacos 中。
yaml
server:
port: 8082
spring:
application:
name: a2a-server
ai:
alibaba:
a2a:
nacos:
server-addr: 192.168.0.201:8848
username: nacos
password: z123
registry:
enabled: true # 启用服务注册
server:
version: 1.0.0
card:
name: data_analysis_agent
description: 专门用于数据分析和统计计算的本地智能体
provider:
name: Spring AI Alibaba Documentation
organization: Spring AI Alibaba
url: http://192.168.0.88:8082/
2. 定义 Agent Bean
创建一个处理数据分析的 Agent。
java
@Configuration
public class A2AAgentConfig {
@Autowired
private ChatModel chatModel;
@Bean(name = "dataAnalysisAgent")
public ReactAgent dataAnalysisAgent() {
return ReactAgent.builder()
.name("data_analysis_agent")
.model(chatModel)
.description("专门用于数据分析和统计计算的本地智能体")
.instruction("你是一个专业的数据分析专家...")
.build();
}
}
3.启动验证
启动应用后,登录 Nacos 控制台,你会看到 a2a-server 实例以及对应的元数据(AgentCard)已经注册成功。


调用 A2A 远程智能体
现在我们编写客户端代码,从 Nacos 发现并调用刚才发布的 Agent。
1. 客户端配置
同样连接到 Nacos,并开启发现功能。
yaml
spring:
application:
name: a2a-client
ai:
alibaba:
a2a:
nacos:
server-addr: 192.168.0.201:8848
username: nacos
password: z123
discovery:
enabled: true # 启用服务发现
2.服务调用逻辑
使用 NacosAgentCardProvider 自动从注册中心获取远程 Agent 的信息。
java
@Service
public class A2AExampleService {
@Autowired
@Qualifier("nacosAgentCardProvider")
private AgentCardProvider agentCardProvider;
public void runDemo() {
// 构建远程代理,自动从 Nacos 获取 AgentCard
A2aRemoteAgent remote = A2aRemoteAgent.builder()
.name("data_analysis_agent")
.agentCardProvider(agentCardProvider)
.description("数据分析远程代理")
.build();
System.out.println("执行远程调用...");
Optional<OverAllState> remoteResult = remote.invoke("请根据季度数据给出同比与环比分析概要。");
remoteResult.flatMap(s -> s.value("output")).ifPresent(r ->
System.out.println("✓ 远程调用成功,结果: " + r));
}
}
分布式负载均衡
为了验证 A2A 的分布式能力,我启动了两个相同的服务实例(端口分别为 8082 和 8084)【参考上图】。
当我通过客户端发起两次调用时,观察两个实例的控制台日志:

请求被成功分发到了不同的实例上,实现了分布式负载均衡的效果。Spring AI Alibaba A2A 结合 Nacos,完美解决了多智能体在复杂业务场景下的远程通信与调度问题。