图片来源:Unsplash | 技术抽象背景
文章目录
- [1. 引言](#1. 引言)
- [2. Web与AI Agent的衔接点](#2. Web与AI Agent的衔接点)
- [3. A2A协议核心机制解析(用Web术语类比)](#3. A2A协议核心机制解析(用Web术语类比))
- [4. 实战:用Java + Vue构建一个A2A交互Demo](#4. 实战:用Java + Vue构建一个A2A交互Demo)
-
- [4.1 后端(Java 17 + Spring Boot 3.x)](#4.1 后端(Java 17 + Spring Boot 3.x))
- [4.2 前端(Vue 3 + Axios)](#4.2 前端(Vue 3 + Axios))
- [4.3 通信流程图(Mermaid)](#4.3 通信流程图(Mermaid))
- [5. Web开发者常见问题与避坑指南](#5. Web开发者常见问题与避坑指南)
-
- Q1:Agent之间如何保持上下文不丢失?
- Q2:异步响应如何通知前端?
- Q3:如何防止恶意Agent冒充?
- Q4:JSON-LD太复杂,能否用普通JSON?
- [Q5:A2A和Function Calling有什么区别?](#Q5:A2A和Function Calling有什么区别?)
- [6. 总结与Web开发者AI学习路径建议](#6. 总结与Web开发者AI学习路径建议)
-
- [🔜 推荐学习路径:](#🔜 推荐学习路径:)
- [📚 真实可靠资源:](#📚 真实可靠资源:)
1. 引言
作为Web开发者,我们早已习惯通过RESTful API、GraphQL或gRPC进行服务间通信。而如今,随着LLM驱动的智能体(Agent)成为AI应用的核心单元,如何让多个Agent高效、可靠地协同工作,成了新的挑战。
这就引出了 A2A(Agent-to-Agent)协议 ------一种专为智能体间交互设计的通信范式。它不是简单的"调用另一个API",而是包含语义化消息、上下文继承、身份认证、异步协商等机制的新一代交互标准。
💡 类比理解:
- RESTful API ≈ 人与服务的对话
- A2A 协议 ≈ 智能体之间的"外交谈判"
本文将从Web开发者的视角,拆解A2A协议的工作原理,并提供一个基于Java + Vue的端到端实战案例。
2. Web与AI Agent的衔接点

Web开发者具备三大优势,可无缝切入A2A开发:
- HTTP/HTTPS通信经验:A2A底层仍基于HTTP/WebSocket,Web开发者熟悉请求/响应模型、超时、重试等机制。
- 状态管理能力:前端Vuex/Pinia、后端Session/JWT经验,可直接迁移到Agent会话上下文管理。
- 安全意识:OAuth2、JWT、CORS等安全实践,是实现Agent身份认证与权限控制的基础。
✅ 关键洞察:
A2A不是取代Web技术,而是在其之上叠加一层语义化、自治化的智能层。
3. A2A协议核心机制解析(用Web术语类比)
A2A协议虽新,但其核心概念可通过Web开发经验轻松理解:
| A2A 概念 | Web 类比 | 说明 |
|---|---|---|
| Message Payload | JSON Request Body | 使用 JSON-LD 格式,支持语义标签(如 @type: "TaskRequest") |
| Conversation ID | Session ID / Trace ID | 唯一会话标识,用于上下文追踪(类似分布式链路追踪) |
| Agent Identity | JWT Token + Issuer Claim | 每个Agent持有数字身份证书,通信前需验证 |
| Async Handshake | WebSocket / SSE | 支持长连接、事件推送,避免轮询 |
| Capability Negotiation | OPTIONS / CORS Preflight | Agent先声明自己能做什么(如"支持图像生成"),再决定是否协作 |
🌐 示例消息结构(JSON-LD):
json
{
"@context": "https://a2a.ai/contexts/v1",
"@type": "TaskRequest",
"conversationId": "conv_abc123",
"from": "agent://marketing-assistant",
"to": "agent://design-generator",
"task": {
"action": "generate_banner",
"params": {
"theme": "cyberpunk",
"size": "1920x1080"
}
},
"auth": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
4. 实战:用Java + Vue构建一个A2A交互Demo

我们将构建两个Agent:
- MarketingAgent(营销助手):接收用户需求,发起设计任务
- DesignAgent(设计助手):接收任务,返回图片URL
4.1 后端(Java 17 + Spring Boot 3.x)
项目结构
a2a-demo/
├── marketing-agent/
│ ├── controller/AgentController.java
│ └── service/A2AClient.java
└── design-agent/
└── controller/TaskController.java
AgentController.java(MarketingAgent)
java
@RestController
@RequestMapping("/a2a")
public class AgentController {
private final A2AClient a2aClient;
public AgentController(A2AClient a2aClient) {
this.a2aClient = a2aClient;
}
@PostMapping("/request-design")
public ResponseEntity<String> requestDesign(@RequestBody UserRequest req) {
String convId = UUID.randomUUID().toString();
A2AMessage message = new A2AMessage()
.setType("TaskRequest")
.setFrom("agent://marketing-assistant")
.setTo("http://localhost:8081/a2a/task") // DesignAgent地址
.setConversationId(convId)
.setTask(new Task("generate_banner", Map.of("theme", req.getTheme())))
.setAuth(generateJWT()); // 简化JWT生成
// 发送A2A请求(异步)
CompletableFuture<String> future = a2aClient.sendAsync(message);
future.thenAccept(result -> {
// 存储结果到DB或缓存
System.out.println("Design result: " + result);
});
return ResponseEntity.accepted().body("Task submitted, convId: " + convId);
}
}
A2AClient.java(简化版)
java
@Service
public class A2AClient {
private final WebClient webClient = WebClient.builder().build();
public CompletableFuture<String> sendAsync(A2AMessage msg) {
return webClient.post()
.uri(msg.getTo())
.header("Content-Type", "application/ld+json")
.bodyValue(msg.toJsonLd()) // 序列化为JSON-LD
.retrieve()
.bodyToMono(String.class)
.toFuture();
}
}
4.2 前端(Vue 3 + Axios)
vue
<template>
<button @click="requestBanner">生成营销Banner</button>
<p v-if="result">{{ result }}</p>
</template>
<script setup>
import { ref } from 'vue'
import axios from 'axios'
const result = ref('')
const requestBanner = async () => {
const resp = await axios.post('/marketing-agent/a2a/request-design', {
theme: 'cyberpunk'
})
console.log('Task submitted:', resp.data)
// 可通过WebSocket监听结果,或轮询查询
}
</script>
4.3 通信流程图(Mermaid)
DesignAgent MarketingAgent Vue Frontend User DesignAgent MarketingAgent Vue Frontend User 通过WebSocket推送结果给用户 点击"生成Banner" POST /request-design A2A TaskRequest (JSON-LD) 返回图片URL 存储结果(异步)
5. Web开发者常见问题与避坑指南

Q1:Agent之间如何保持上下文不丢失?
方案 :每个A2A消息必须携带
conversationId,后端用Redis存储会话上下文(key:a2a:conv:{id})。
Q2:异步响应如何通知前端?
方案:前端建立WebSocket连接,后端在Agent任务完成后推送结果(类似SSE)。
Q3:如何防止恶意Agent冒充?
方案:使用JWT + 公钥验签。每个Agent注册时分配唯一公私钥对,消息签名后对方用公钥验证。
Q4:JSON-LD太复杂,能否用普通JSON?
不推荐 。JSON-LD支持
@context定义语义,便于不同厂商Agent互操作(如Google Agent 与 开源Agent 对话)。
Q5:A2A和Function Calling有什么区别?
Function Calling 是 LLM 调用工具,单向 ;A2A 是 Agent 间双向协商,支持多轮对话、拒绝请求、讨价还价等高级行为。
6. 总结与Web开发者AI学习路径建议

A2A协议标志着AI应用从"单体智能"走向"群体智能"。作为Web开发者,你已掌握70%的底层能力,只需补充以下知识:
🔜 推荐学习路径:
- 基础:理解LLM基本原理(Prompt Engineering、RAG)
- 进阶:学习LangChain/LlamaIndex中的Agent框架
- 协议 :研究 A2A Protocol Draft v0.3(开源草案)
- 实战:用Spring Boot + Vue 构建多Agent协作系统
- 部署:结合Docker/K8s部署Agent集群,用Nginx做负载均衡
📚 真实可靠资源:
- GitHub: langchain4j(Java原生Agent框架)
- 文档: OpenAI Assistants API v2(支持多Agent协作)
- 工具: Postman A2A Collection(模拟Agent通信)
🚀 行动建议:
从今天起,把你的下一个CRUD项目升级为"双Agent系统"------一个处理业务逻辑,一个提供AI增强。你离AI全栈工程师,只差一个A2A协议的距离。
作者 :一名从Web全栈转向AI工程的开发者
版权声明:本文首发于CSDN,转载请注明出处。