A2A协议:Java开发者的下一个必修课

0 阅读1分钟

===

前排提醒:本文面向有Java后端基础、想转AI Agent开发的工程师。MCP部分不展开,默认你已经了解基本概念。

两个协议,一张图说清楚

很多人被MCP和A2A搞晕。先上结论:

协议

职责

类比

MCP

Agent → Tools

Feign调用微服务API

A2A

Agent ↔ Agent

微服务间HTTP通信

MCP让Agent能调用外部工具(数据库、API、文件系统)。

A2A让Agent能和另一个Agent对话、派任务、传结果。

两者互补,不是替代。

现实项目里,一个完整的Agent往往同时用MCP和A2A:用MCP调用工具,用A2A和其他Agent协作。

真实场景:代码审查Multi-Agent系统

拿我的Dream-SaaS项目举例,假设要做智能代码审查:

plaintext

用户上传Java代码
    ↓
code-review-agent(主Agent)
    ↓ 发现需要Java升级建议
    ↓ 通过A2A委派
java-modernization-agent(子Agent)
    ↓ 返回升级方案
code-review-agent整合结果
    ↓
返回给用户

没用A2A时,code-review-agent得自己内置所有Java升级知识。

用了A2A后,它只需要知道"有个Java升级专家Agent",然后把活派出去。专业解耦,职责分离。

A2A v0.2更新了什么

2025年4月Google在Cloud Next上首次公布A2A协议,5月在Google I/O 2025正式发布v0.2,6月快速迭代到v0.2.6。

关键版本演进

plaintext

v0.2.0 (2025.05)  —— 初始版本,JSON-RPC over HTTPS
v0.2.1 (2025.05.27) —— 扩展AgentCard、referenceTaskIds
v0.2.2 (2025.06.09) —— ⚡ gRPC/REST双传输、扩展机制
v0.2.5 (2025.06.30) —— AgentCard强制包含protocolVersion
v0.3.0 (2025.07.30) —— mTLS、agent-card.json(Breaking Change)

v0.2.2是Java开发者的分水岭:协议从纯HTTP演进到支持gRPC和REST双传输。

v0.2.2新增的AgentCard字段

json

{
  "name": "my-agent",
  "version": "1.0.0",
  "protocolVersion": "0.2.2",
  "url": "http://localhost:8080",
  "iconUrl": "https://example.com/icon.png",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true,
    "stateTransitionHistory": true,
    "extensions": [
      {
        "identifier": "google.a2a.payments",
        "version": "1.0"
      }
    ]
  }
}

注意extensions字段——v0.2.2引入了扩展机制,允许在协议上叠加特定领域的能力(比如支付协议)。

Java开发者怎么接入A2A

方案一:Google官方A2A Java SDK

官方仓库刚起步,但结构清晰:

bash

git clone https://github.com/google-a2a/a2a-samples
cd a2a-samples/samples/java
./mvnw clean install -DskipTests

核心模块:

plaintext

samples/java/
├── model/          # A2A协议数据模型
├── server/         # A2A Server SDK(基于Spring Boot)
└── client/         # A2A Client SDK

方案二:Spring Actions(推荐)

专门为Spring生态做的A2A+MCP双协议框架,作者是Google ADK团队的Vishal Mysore。

项目地址: github.com/vishalmysor…

Maven配置

xml

<dependency>
    <groupId>io.github.vishalmysore</groupId>
    <artifactId>a2ajava</artifactId>
    <version>0.1.0</version>
</dependency>

定义一个Agent

java

@Agent(name = "code-review", description = "Java代码审查专家")
public class CodeReviewService {
    
    @Action(name = "review-java", description = "审查Java代码质量")
    public ReviewResult reviewJava(String code) {
        // 业务逻辑
        return ReviewResult.builder()
            .score(85)
            .issues(List.of(
                new Issue("WARN", "使用Date而非LocalDateTime", 5)
            ))
            .build();
    }
}

启动A2A Server

java

@SpringBootApplication
@EnableA2A
public class CodeReviewApplication {
    public static void main(String[] args) {
        SpringApplication.run(CodeReviewApplication.class, args);
    }
}

Agent自动暴露.well-known/agent-card.json端点。

方案三:MusaeMotion/A2A-server-java

国产方案,基于Spring AI,支持Nacos服务注册。

项目地址: github.com/MusaeMotion…

Maven BOM

xml

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.github.musaemotion</groupId>
            <artifactId>a2a-pom</artifactId>
            <version>0.5.2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

多Agent协作示例

项目内置了多个专业Agent:

  • agent-server-ollama-sentiment-analysis — 情感分析

  • agent-server-ollama-vision — 图像识别

  • agent-server-zhipu-generate-images — 文生图

组合使用:

java

@Autowired
private HostAgentService hostAgent;

// 注册远程Agent
hostAgent.registerAgent(
    "sentiment-analysis",
    "http://localhost:8081"
);

// 通过A2A调用
TaskResponse response = hostAgent.delegate(
    "sentiment-analysis",
    "analyze",
    new TextInput("这个产品太棒了!")
);

Agent Card设计要点

Agent Card是A2A的核心——它告诉其他Agent你是谁、你能干什么。

json

// .well-known/agent-card.json(v0.3.0从agent.json改名)
{
  "name": "java-modernization-agent",
  "version": "1.0.0",
  "protocolVersion": "0.2.5",
  "url": "http://localhost:8080",
  "provider": {
    "organization": "Dream-SaaS",
    "url": "https://dream-saas.example.com"
  },
  "capabilities": {
    "streaming": true,
    "pushNotifications": true,
    "stateTransitionHistory": true
  },
  "securitySchemes": {
    "bearer": {
      "type": "http",
      "scheme": "bearer"
    }
  },
  "security": [{"bearer": []}],
  "defaultInputModes": ["application/json", "text/plain"],
  "defaultOutputModes": ["application/json", "text/markdown"],
  "skills": [
    {
      "id": "date-to-localdatetime",
      "name": "Date API升级",
      "description": "将java.util.Date迁移到java.time.LocalDateTime",
      "tags": ["java", "migration", "java8+"],
      "examples": [
        "把new Date()改成LocalDateTime.now()"
      ],
      "inputModes": ["application/json", "text/plain"],
      "outputModes": ["application/json", "text/markdown"]
    },
    {
      "id": "for-to-stream",
      "name": "循环转Stream",
      "description": "将传统for循环转换为Java Stream API",
      "tags": ["java", "stream", "refactor"],
      "examples": [
        "把users.stream().filter(u -> u.isActive()).collect(Collectors.toList())"
      ]
    }
  ]
}

设计原则

  • skills必须有至少一个,否则其他Agent不知道你能干嘛

  • id要全局唯一,建议用模块-功能格式

  • description要写给AI看的,AI会根据这个决定是否调用你

Task生命周期

A2A的核心抽象是Task(任务),有完整的状态机:

plaintext

submitted  working  completed
                
         input-required(需要用户输入)
                
         auth-required(需要认证)
                
         failed / canceled / rejected

发送同步任务

java

// A2A Client调用
A2AClient client = A2AClient.builder()
    .url("http://localhost:8080")
    .build();

Task task = client.sendMessage(
    Message.builder()
        .role(Role.USER)
        .parts(List.of(new TextPart("帮我审查这段代码:" + code)))
        .build()
);

订阅流式更新

java

client.streamingSend(
    message,
    new StreamingEventListener() {
        @Override
        public void onArtifact(Artifact artifact) {
            // 收到增量输出
        }
        
        @Override
        public void onStatusUpdate(TaskStatusUpdateEvent event) {
            // 状态变更
            System.out.println("Task状态: " + event.getStatus().getState());
        }
    }
);

现状判断

给想转AI的Java开发者几个判断:

1. MCP是现在,A2A是未来

MCP已经成熟可用,Spring AI Alibaba、Spring AI官方都支持。A2A生态还在早期,但Google、Zoom、Salesforce、SAP这些大厂都在押注。

2. Java生态正在追赶

Python在AI领域领先是事实,但A2A/MCP的Java支持在快速追赶。Spring Actions、MusaeMotion/A2A-server-java都在积极开发。

3. 两个都要学

你以后写的Agent,既要有MCP工具调用能力(Agent的手),也要有A2A协作能力(Agent的嘴)。这才是完整的多Agent系统。

4. 最佳学习路径

plaintext

Step 1: 学MCP → 用Spring AI Alibaba快速上手
Step 2: 搭Multi-Agent → 用Spring AI Graph体验多Agent协作
Step 3: 跟进A2A → 关注Spring Actions和官方SDK演进

评论区聊一聊:你的项目里更缺哪种能力——Agent调用工具,还是Agent之间通信?