上一篇博客中,我介绍了如何通过 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 实现包含三个核心组件:

  1. A2A Server:将本地 ReactAgent 暴露为 A2A 服务
  2. A2A Registry:Agent 注册中心(支持 Nacos)
  3. A2A Discovery:Agent 发现机制(支持 Nacos)

环境准备

<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 中。

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。

@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,并开启发现功能。

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 的信息。

@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,完美解决了多智能体在复杂业务场景下的远程通信与调度问题。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐