Loading...
正在加载...
请稍候

Spring AI Alibaba 支持A2A协议:从入门到精通

✨步子哥 (steper) 2025年10月20日 12:15
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Spring AI Alibaba 支持A2A协议:从入门到精通</title> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&display=swap" rel="stylesheet"> <style> /* 全局样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Noto Sans SC', sans-serif; background-color: #f5f7fa; color: #333; line-height: 1.6; } /* 海报容器 */ .poster-container { width: 960px; min-height: 1600px; margin: 0 auto; padding: 40px; background: linear-gradient(135deg, #f5f7fa 0%, #e4e8f0 100%); position: relative; overflow: visible; } /* 标题样式 */ .poster-title { text-align: center; margin-bottom: 40px; color: #1a365d; position: relative; } .poster-title h1 { font-size: 42px; font-weight: 700; margin-bottom: 10px; position: relative; display: inline-block; } .poster-title h1::after { content: ''; position: absolute; bottom: -10px; left: 10%; width: 80%; height: 4px; background: linear-gradient(90deg, #4299e1, #3182ce); border-radius: 2px; } .poster-title p { font-size: 18px; color: #4a5568; margin-top: 20px; } /* 章节样式 */ .section { margin-bottom: 40px; background-color: white; border-radius: 12px; padding: 30px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); position: relative; overflow: hidden; } .section::before { content: ''; position: absolute; top: 0; left: 0; width: 6px; height: 100%; background: linear-gradient(180deg, #4299e1, #3182ce); border-radius: 3px 0 0 3px; } .section-title { font-size: 28px; font-weight: 700; color: #2c5282; margin-bottom: 20px; display: flex; align-items: center; } .section-title .material-icons { margin-right: 10px; color: #3182ce; } .section-content { font-size: 16px; color: #4a5568; } .section-content p { margin-bottom: 15px; } .section-content ul { margin-left: 25px; margin-bottom: 15px; } .section-content li { margin-bottom: 8px; } /* 代码块样式 */ .code-block { background-color: #2d3748; color: #e2e8f0; padding: 20px; border-radius: 8px; overflow-x: auto; margin: 20px 0; font-family: 'Courier New', monospace; font-size: 14px; line-height: 1.5; } .code-block pre { margin: 0; white-space: pre-wrap; } .code-comment { color: #718096; } .code-keyword { color: #f687b3; } .code-string { color: #9ae6b4; } .code-function { color: #63b3ed; } .code-variable { color: #fbd38d; } /* 强调文本 */ .highlight { background-color: #ebf8ff; padding: 2px 5px; border-radius: 4px; color: #2b6cb0; font-weight: 500; } /* 子标题 */ .sub-title { font-size: 20px; font-weight: 600; color: #2d3748; margin: 25px 0 15px; display: flex; align-items: center; } .sub-title .material-icons { font-size: 20px; margin-right: 8px; color: #4299e1; } /* 表格样式 */ .table-container { overflow-x: auto; margin: 20px 0; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } th, td { padding: 12px 15px; text-align: left; border-bottom: 1px solid #e2e8f0; } th { background-color: #edf2f7; color: #2d3748; font-weight: 600; } tr:hover { background-color: #f7fafc; } /* 引用块 */ .quote-block { border-left: 4px solid #4299e1; padding-left: 20px; margin: 20px 0; font-style: italic; color: #4a5568; } /* 步骤列表 */ .step-list { counter-reset: step-counter; list-style-type: none; padding-left: 0; } .step-list li { position: relative; padding-left: 40px; margin-bottom: 20px; } .step-list li::before { counter-increment: step-counter; content: counter(step-counter); position: absolute; left: 0; top: 0; width: 30px; height: 30px; background-color: #4299e1; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; } /* 装饰元素 */ .decoration-circle { position: absolute; border-radius: 50%; opacity: 0.1; z-index: 0; } .circle-1 { width: 200px; height: 200px; background: linear-gradient(135deg, #4299e1, #3182ce); top: -50px; right: -50px; } .circle-2 { width: 150px; height: 150px; background: linear-gradient(135deg, #805ad5, #6b46c1); bottom: 100px; left: -50px; } /* 响应式调整 */ <span class="mention-invalid">@media</span> (max-width: 960px) { .poster-container { width: 100%; padding: 20px; } } </style> </head> <body> <div class="poster-container"> <!-- 装饰元素 --> <div class="decoration-circle circle-1"></div> <div class="decoration-circle circle-2"></div> <!-- 标题部分 --> <div class="poster-title"> <h1>Spring AI Alibaba 支持A2A协议:从入门到精通</h1> <p>探索Spring AI Alibaba框架如何实现Agent-to-Agent协议,构建多智能体协作系统</p> </div> <!-- 第一部分:Spring AI Alibaba概述 --> <div class="section"> <h2 class="section-title"> <i class="material-icons">integration_instructions</i> Spring AI Alibaba概述 </h2> <div class="section-content"> <p>Spring AI Alibaba是基于Spring AI构建的AI应用开发框架,专为Java开发者设计,旨在简化AI应用的开发流程。它与阿里云通义系列模型深度集成,提供高层次的AI API抽象与云原生基础设施集成方案。</p> <h3 class="sub-title"> <i class="material-icons">stars</i> 核心特性 </h3> <ul> <li><span class="highlight">API抽象</span>:提供标准化的API接口,简化AI模型服务的接入与使用</li> <li><span class="highlight">多模型支持</span>:支持多种大模型服务对接能力,包括聊天、文生图、音频转录、文生语音等</li> <li><span class="highlight">灵活调用</span>:支持同步和流式API,在保持应用层API不变的情况下支持灵活切换底层模型服务</li> <li><span class="highlight">企业级特性</span>:提供可观测、网关、消息队列、配置中心等开源配套</li> <li><span class="highlight">智能体框架</span>:内置Graph多智能体框架,支持工作流和多智能体应用开发</li> </ul> <h3 class="sub-title"> <i class="material-icons">architecture</i> 架构设计 </h3> <p>Spring AI Alibaba的架构设计充分考虑了AI应用的特点和需求,主要包括以下组件:</p> <ul> <li><span class="highlight">模型抽象层</span>:统一不同模态模型的访问接口</li> <li><span class="highlight">服务适配层</span>:深度对接通义系列大模型</li> <li><span class="highlight">生产就绪特性</span>:自动配置、健康检查、监控指标</li> <li><span class="highlight">企业级扩展</span>:支持私有化部署和混合云架构</li> </ul> </div> </div> <!-- 第二部分:A2A协议详解 --> <div class="section"> <h2 class="section-title"> <i class="material-icons">hub</i> A2A协议详解 </h2> <div class="section-content"> <p>Agent-to-Agent(A2A)协议是由Google在2025年4月正式推出的开放标准通信协议,旨在解决不同AI智能体之间的互操作性问题。该协议为异构AI系统提供了一套统一的交互规范,使来自不同平台、不同供应商的智能体能够像人类团队一样进行有效协作。</p> <h3 class="sub-title"> <i class="material-icons">settings</i> 核心组件 </h3> <p>A2A协议包含以下核心组件,共同构成智能体间协作的基础设施:</p> <ul> <li><span class="highlight">AgentCard</span>:服务发现机制,用于智能体声明自身能力和接口</li> <li><span class="highlight">Task</span>:工作单元,定义智能体需要完成的任务</li> <li><span class="highlight">Message</span>:通信载体,承载智能体间的交互信息</li> <li><span class="highlight">Artifact</span>:输出结果,表示任务执行产生的数据或对象</li> </ul> <h3 class="sub-title"> <i class="material-icons">design_services</i> 设计原则 </h3> <p>A2A协议的设计遵循以下核心原则,确保协议的灵活性和可靠性:</p> <ul> <li><span class="highlight">不透明执行原则</span>:智能体之间仅交换完成任务所必需的上下文、状态、指令和原生模态数据,而不暴露其内部工作机制</li> <li><span class="highlight">开放标准原则</span>:基于HTTP、SSE和JSON-RPC等成熟Web标准构建,大幅降低实现和集成门槛</li> <li><span class="highlight">默认安全原则</span>:内置身份验证、数据加密、隐私保护和监控功能</li> <li><span class="highlight">异步优先原则</span>:原生支持长时间运行的任务和实时状态更新机制</li> </ul> <h3 class="sub-title"> <i class="material-icons">sync_alt</i> 通信机制 </h3> <p>A2A协议采用HTTP/HTTPS传输层和JSON-RPC2.0消息格式,支持多种通信模式:</p> <ul> <li><span class="highlight">同步通信</span>:适用于快速响应场景,客户端发送请求后等待服务器响应</li> <li><span class="highlight">流式通信</span>:基于Server-Sent Events(SSE)实现,适用于实时数据推送</li> <li><span class="highlight">异步通信</span>:通过Webhook机制实现,适用于长时间运行的任务</li> </ul> <div class="quote-block"> A2A协议的出现标志着AI技术发展进入了一个新阶段——从单一智能体的能力提升转向多智能体系统的协同增效。 </div> </div> </div> <!-- 第三部分:Spring AI Alibaba对A2A协议的支持 --> <div class="section"> <h2 class="section-title"> <i class="material-icons">handshake</i> Spring AI Alibaba对A2A协议的支持 </h2> <div class="section-content"> <p>Spring AI Alibaba通过其多智能体框架Graph和企业级AI代理解决方案,全面支持A2A协议的实现,为开发者提供了构建多智能体协作系统的强大工具。</p> <h3 class="sub-title"> <i class="material-icons">account_tree</i> 多智能体框架Graph </h3> <p>Graph是Spring AI Alibaba社区核心实现之一,基于图的多智能体框架,使开发者能够轻松构建工作流和多智能体应用。其设计理念借鉴LangGraph,可以理解为Java版的LangGraph实现。</p> <p>Graph的核心能力包括:</p> <ul> <li><span class="highlight">Multi-agent支持</span>:内置ReAct Agent、Supervisor等常规智能体模式</li> <li><span class="highlight">工作流支持</span>:内置工作流节点,支持复杂业务流程编排</li> <li><span class="highlight">状态管理</span>:简化State定义过程,支持智能体间状态共享</li> <li><span class="highlight">低代码集成</span>:提供预置Node,降低开发门槛</li> </ul> <h3 class="sub-title"> <i class="material-icons">business</i> 企业级AI代理解决方案 </h3> <p>Spring AI Alibaba提供了一系列企业级AI代理解决方案,支持A2A协议在企业环境中的落地:</p> <ul> <li><span class="highlight">Nacos MCP注册表</span>:实现智能体的分布式注册与发现</li> <li><span class="highlight">分布式MCP发现和负载均衡</span>:确保智能体服务的高可用性</li> <li><span class="highlight">动态API到MCP代理</span>:实现传统API与智能体服务的无缝转换</li> <li><span class="highlight">NL2SQL</span>:将自然语言查询转换为SQL语句,扩展智能体数据处理能力</li> <li><span class="highlight">可观测性</span>:提供全面的监控和日志记录能力</li> </ul> <h3 class="sub-title"> <i class="material-icons">compare_arrows</i> 与MCP协议的互补 </h3> <p>Spring AI Alibaba同时支持A2A协议和MCP协议(Model Context Protocol),两者形成互补关系:</p> <ul> <li><span class="highlight">MCP协议</span>:主要处理智能体与外部工具和数据源之间的垂直连接</li> <li><span class="highlight">A2A协议</span>:专注于智能体之间的任务分配与协作</li> </ul> <div class="quote-block"> 用形象的比喻来说:"MCP如'USB-C接口',连接agent与其资源;A2A如'网线',连接agent与agent"。这两种协议共同构成了AI智能体与外界交互的完整技术栈。 </div> </div> </div> <!-- 第四部分:实现原理与架构 --> <div class="section"> <h2 class="section-title"> <i class="material-icons">schema</i> 实现原理与架构 </h2> <div class="section-content"> <p>深入理解Spring AI Alibaba对A2A协议支持的实现原理与架构,有助于开发者更好地构建多智能体协作系统。</p> <h3 class="sub-title"> <i class="material-icons">layers</i> Spring AI Alibaba架构设计 </h3> <p>Spring AI Alibaba的架构设计遵循分层原则,确保各组件之间的松耦合和高内聚:</p> <div class="table-container"> <table> <thead> <tr> <th>架构层</th> <th>组件</th> <th>功能</th> </tr> </thead> <tbody> <tr> <td>应用层</td> <td>ChatClient、Graph API</td> <td>提供高级API,简化应用开发</td> </tr> <tr> <td>抽象层</td> <td>ChatModel、Prompt、Tool</td> <td>定义AI应用的核心抽象概念</td> </tr> <tr> <td>适配层</td> <td>DashScopeAdapter、MCPAdapter</td> <td>实现与底层服务的适配</td> </tr> <tr> <td>基础设施层</td> <td>Nacos、RocketMQ、ARMS</td> <td>提供云原生基础设施支持</td> </tr> </tbody> </table> </div> <h3 class="sub-title"> <i class="material-icons">route</i> A2A协议通信流程 </h3> <p>基于Spring AI Alibaba实现的A2A协议通信流程主要包括以下步骤:</p> <ol class="step-list"> <li> <strong>服务发现</strong>:智能体通过AgentCard声明自身能力,注册到Nacos MCP注册中心 </li> <li> <strong>任务创建</strong>:客户端智能体根据任务需求,通过MCP发现合适的远程智能体 </li> <li> <strong>任务执行</strong>:客户端智能体创建Task,通过Message传递给远程智能体 </li> <li> <strong>结果返回</strong>:远程智能体执行任务,生成Artifact并返回给客户端智能体 </li> </ol> <h3 class="sub-title"> <i class="material-icons">security</i> 安全机制 </h3> <p>Spring AI Alibaba内置了全面的安全机制,确保A2A协议通信的安全性:</p> <ul> <li><span class="highlight">身份认证</span>:支持OAuth/JWT等标准机制,确保只有经过授权的智能体才能参与协作</li> <li><span class="highlight">数据加密</span>:强制使用TLS加密,防止敏感信息在通信过程中被窃取或篡改</li> <li><span class="highlight">权限控制</span>:通过"Agent Card"明确声明服务权限,实现最小特权原则</li> <li><span class="highlight">审计日志</span>:记录所有智能体间的交互,支持安全审计和问题追踪</li> </ul> </div> </div> <!-- 第五部分:Demo示例 --> <div class="section"> <h2 class="section-title"> <i class="material-icons">code</i> Demo示例 </h2> <div class="section-content"> <p>以下示例展示了如何使用Spring AI Alibaba实现基于A2A协议的多智能体协作系统。</p> <h3 class="sub-title"> <i class="material-icons">integration_instructions</i> 基础配置 </h3> <p>首先,需要在项目中添加Spring AI Alibaba依赖:</p> <div class="code-block"> <pre><code><span class="code-comment">&lt;!-- pom.xml --&gt;</span> <span class="code-keyword">&lt;dependency&gt;</span> <span class="code-keyword">&lt;groupId&gt;</span>com.alibaba.cloud.ai<span class="code-keyword">&lt;/groupId&gt;</span> <span class="code-keyword">&lt;artifactId&gt;</span>spring-ai-alibaba-starter<span class="code-keyword">&lt;/artifactId&gt;</span> <span class="code-keyword">&lt;version&gt;</span>1.0.0.2<span class="code-keyword">&lt;/version&gt;</span> <span class="code-keyword">&lt;/dependency&gt;</span></code></pre> </div> <p>然后,在application.yml中配置A2A协议相关参数:</p> <div class="code-block"> <pre><code><span class="code-comment"># application.yml</span> <span class="code-keyword">spring:</span> <span class="code-keyword">ai:</span> <span class="code-keyword">alibaba:</span> <span class="code-keyword">dashscope:</span> <span class="code-variable">api-key</span>: ${<span class="code-variable">DASHSCOPE_API_KEY</span>} <span class="code-keyword">a2a:</span> <span class="code-variable">enabled</span>: <span class="code-keyword">true</span> <span class="code-variable">agent-id</span>: <span class="code-string">"customer-service-agent"</span> <span class="code-variable">registry</span>: <span class="code-variable">type</span>: <span class="code-string">"nacos"</span> <span class="code-variable">server-addr</span>: <span class="code-string">"localhost:8848"</span></code></pre> </div> <h3 class="sub-title"> <i class="material-icons">smart_toy</i> 创建智能体 </h3> <p>以下代码展示了如何创建一个支持A2A协议的智能体:</p> <div class="code-block"> <pre><code><span class="code-keyword">@Component</span> <span class="code-keyword">public class</span> <span class="code-function">CustomerServiceAgent</span> { <span class="code-keyword">private final</span> ChatModel chatModel; <span class="code-keyword">private final</span> A2AClient a2aClient; <span class="code-keyword">public</span> <span class="code-function">CustomerServiceAgent</span>(ChatModel chatModel, A2AClient a2aClient) { <span class="code-keyword">this</span>.chatModel = chatModel; <span class="code-keyword">this</span>.a2aClient = a2aClient; } <span class="code-comment">// 定义智能体能力</span> <span class="code-keyword">@PostConstruct</span> <span class="code-keyword">public void</span> <span class="code-function">registerAgent</span>() { AgentCard agentCard = AgentCard.builder() .agentId(<span class="code-string">"customer-service-agent"</span>) .name(<span class="code-string">"客户服务智能体"</span>) .description(<span class="code-string">"处理客户咨询和投诉"</span>) .capabilities(List.of( Capability.builder() .name(<span class="code-string">"handle_inquiry"</span>) .description(<span class="code-string">"处理客户咨询"</span>) .inputSchema(<span class="code-string">"{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\"}}}"</span>) .outputSchema(<span class="code-string">"{\"type\":\"object\",\"properties\":{\"response\":{\"type\":\"string\"}}}"</span>) .build() )) .build(); a2aClient.registerAgent(agentCard); } <span class="code-comment">// 处理A2A任务</span> <span class="code-keyword">@A2ATaskHandler</span>(<span class="code-string">"handle_inquiry"</span>) <span class="code-keyword">public</span> TaskResult <span class="code-function">handleInquiry</span>(Task task) { String query = (String) task.getInput().get(<span class="code-string">"query"</span>); <span class="code-comment">// 使用大模型处理客户咨询</span> Prompt prompt = <span class="code-keyword">new</span> Prompt(<span class="code-string">"作为客户服务代表,请回答以下问题:"</span> + query); ChatResponse response = chatModel.call(prompt); <span class="code-comment">// 返回处理结果</span> Map&lt;String, Object&gt; output = <span class="code-keyword">new</span> HashMap&lt;&gt;(); output.put(<span class="code-string">"response"</span>, response.getResult().getOutput().getContent()); <span class="code-keyword">return</span> TaskResult.builder() .taskId(task.getTaskId()) .status(TaskStatus.COMPLETED) .output(output) .build(); } }</code></pre> </div> <h3 class="sub-title"> <i class="material-icons">swap_horiz</i> 智能体协作 </h3> <p>以下代码展示了如何实现智能体间的协作:</p> <div class="code-block"> <pre><code><span class="code-keyword">@Service</span> <span class="code-keyword">public class</span> <span class="code-function">OrderProcessingService</span> { <span class="code-keyword">private final</span> A2AClient a2aClient; <span class="code-keyword">private final</span> ChatModel chatModel; <span class="code-keyword">public</span> <span class="code-function">OrderProcessingService</span>(A2AClient a2aClient, ChatModel chatModel) { <span class="code-keyword">this</span>.a2aClient = a2aClient; <span class="code-keyword">this</span>.chatModel = chatModel; } <span class="code-keyword">public</span> OrderResult <span class="code-function">processOrder</span>(OrderRequest orderRequest) { <span class="code-comment">// 1. 使用库存智能体检查库存</span> Task inventoryTask = Task.builder() .taskType(<span class="code-string">"check_inventory"</span>) .input(Map.of( <span class="code-string">"productId"</span>, orderRequest.getProductId(), <span class="code-string">"quantity"</span>, orderRequest.getQuantity() )) .build(); TaskResult inventoryResult = a2aClient.invokeAgent(<span class="code-string">"inventory-agent"</span>, inventoryTask); <span class="code-keyword">if</span> (!inventoryResult.getStatus().equals(TaskStatus.COMPLETED)) { <span class="code-keyword">return</span> OrderResult.failure(<span class="code-string">"库存检查失败"</span>); } Boolean inStock = (Boolean) inventoryResult.getOutput().get(<span class="code-string">"inStock"</span>); <span class="code-keyword">if</span> (!inStock) { <span class="code-comment">// 2. 如果库存不足,使用采购智能体发起采购</span> Task purchaseTask = Task.builder() .taskType(<span class="code-string">"request_purchase"</span>) .input(Map.of( <span class="code-string">"productId"</span>, orderRequest.getProductId(), <span class="code-string">"quantity"</span>, orderRequest.getQuantity() )) .build(); TaskResult purchaseResult = a2aClient.invokeAgent(<span class="code-string">"purchase-agent"</span>, purchaseTask); <span class="code-keyword">if</span> (!purchaseResult.getStatus().equals(TaskStatus.COMPLETED)) { <span class="code-keyword">return</span> OrderResult.failure(<span class="code-string">"采购请求失败"</span>); } } <span class="code-comment">// 3. 使用物流智能体安排配送</span> Task logisticsTask = Task.builder() .taskType(<span class="code-string">"arrange_delivery"</span>) .input(Map.of( <span class="code-string">"productId"</span>, orderRequest.getProductId(), <span class="code-string">"quantity"</span>, orderRequest.getQuantity(), <span class="code-string">"address"</span>, orderRequest.getDeliveryAddress() )) .build(); TaskResult logisticsResult = a2aClient.invokeAgent(<span class="code-string">"logistics-agent"</span>, logisticsTask); <span class="code-keyword">if</span> (!logisticsResult.getStatus().equals(TaskStatus.COMPLETED)) { <span class="code-keyword">return</span> OrderResult.failure(<span class="code-string">"配送安排失败"</span>); } String trackingNumber = (String) logisticsResult.getOutput().get(<span class="code-string">"trackingNumber"</span>); <span class="code-comment">// 4. 使用客户服务智能体发送确认通知</span> Task notificationTask = Task.builder() .taskType(<span class="code-string">"send_notification"</span>) .input(Map.of( <span class="code-string">"customerId"</span>, orderRequest.getCustomerId(), <span class="code-string">"message"</span>, <span class="code-string">"您的订单已处理,物流单号:"</span> + trackingNumber )) .build(); a2aClient.invokeAgent(<span class="code-string">"customer-service-agent"</span>, notificationTask); <span class="code-keyword">return</span> OrderResult.success(trackingNumber); } }</code></pre> </div> <h3 class="sub-title"> <i class="material-icons">account_tree</i> 使用Graph构建工作流 </h3> <p>以下代码展示了如何使用Spring AI Alibaba的Graph框架构建多智能体工作流:</p> <div class="code-block"> <pre><code><span class="code-keyword">@Configuration</span> <span class="code-keyword">public class</span> <span class="code-function">OrderProcessingWorkflow</span> { <span class="code-keyword">@Bean</span> <span class="code-keyword">public</span> Graph <span class="code-function">orderProcessingGraph</span>(A2AClient a2aClient) { <span class="code-keyword">return</span> Graph.builder() .id(<span class="code-string">"order-processing-workflow"</span>) .nodes( <span class="code-comment">// 检查库存节点</span> Node.builder() .id(<span class="code-string">"check-inventory"</span>) .type(NodeType.AGENT) .agentId(<span class="code-string">"inventory-agent"</span>) .taskType(<span class="code-string">"check_inventory"</span>) .build(), <span class="code-comment">// 采购节点</span> Node.builder() .id(<span class="code-string">"request-purchase"</span>) .type(NodeType.AGENT) .agentId(<span class="code-string">"purchase-agent"</span>) .taskType(<span class="code-string">"request_purchase"</span>) .build(), <span class="code-comment">// 安排配送节点</span> Node.builder() .id(<span class="code-string">"arrange-delivery"</span>) .type(NodeType.AGENT) .agentId(<span class="code-string">"logistics-agent"</span>) .taskType(<span class="code-string">"arrange_delivery"</span>) .build(), <span class="code-comment">// 发送通知节点</span> Node.builder() .id(<span class="code-string">"send-notification"</span>) .type(NodeType.AGENT) .agentId(<span class="code-string">"customer-service-agent"</span>) .taskType(<span class="code-string">"send_notification"</span>) .build(), <span class="code-comment">// 条件判断节点</span> Node.builder() .id(<span class="code-string">"check-stock-condition"</span>) .type(NodeType.CONDITION) .conditionFunction(state -&gt; { Boolean inStock = (Boolean) state.get(<span class="code-string">"inStock"</span>); <span class="code-keyword">return</span> inStock ? <span class="code-string">"arrange-delivery"</span> : <span class="code-string">"request-purchase"</span>; }) .build() ) .edges( Edge.builder() .source(<span class="code-string">"check-inventory"</span>) .target(<span class="code-string">"check-stock-condition"</span>) .build(), Edge.builder() .source(<span class="code-string">"check-stock-condition"</span>) .target(<span class="code-string">"arrange-delivery"</span>) .condition(<span class="code-string">"arrange-delivery"</span>) .build(), Edge.builder() .source(<span class="code-string">"check-stock-condition"</span>) .target(<span class="code-string">"request-purchase"</span>) .condition(<span class="code-string">"request-purchase"</span>) .build(), Edge.builder() .source(<span class="code-string">"request-purchase"</span>) .target(<span class="code-string">"arrange-delivery"</span>) .build(), Edge.builder() .source(<span class="code-string">"arrange-delivery"</span>) .target(<span class="code-string">"send-notification"</span>) .build() ) .build(); } <span class="code-keyword">@Service</span> <span class="code-keyword">public class</span> <span class="code-function">OrderProcessingService</span> { <span class="code-keyword">private final</span> Graph orderProcessingGraph; <span class="code-keyword">public</span> <span class="code-function">OrderProcessingService</span>(Graph orderProcessingGraph) { <span class="code-keyword">this</span>.orderProcessingGraph = orderProcessingGraph; } <span class="code-keyword">public</span> OrderResult <span class="code-function">processOrder</span>(OrderRequest orderRequest) { <span class="code-comment">// 初始化工作流状态</span> Map&lt;String, Object&gt; initialState = <span class="code-keyword">new</span> HashMap&lt;&gt;(); initialState.put(<span class="code-string">"productId"</span>, orderRequest.getProductId()); initialState.put(<span class="code-string">"quantity"</span>, orderRequest.getQuantity()); initialState.put(<span class="code-string">"address"</span>, orderRequest.getDeliveryAddress()); initialState.put(<span class="code-string">"customerId"</span>, orderRequest.getCustomerId()); <span class="code-comment">// 执行工作流</span> GraphExecutionResult result = orderProcessingGraph.execute(initialState); <span class="code-keyword">if</span> (result.getStatus() == ExecutionStatus.COMPLETED) { String trackingNumber = (String) result.getFinalState().get(<span class="code-string">"trackingNumber"</span>); <span class="code-keyword">return</span> OrderResult.success(trackingNumber); } <span class="code-keyword">else</span> { <span class="code-keyword">return</span> OrderResult.failure(result.getErrorMessage()); } } } }</code></pre> </div> <h3 class="sub-title"> <i class="material-icons">tips_and_updates</i> 最佳实践 </h3> <p>在使用Spring AI Alibaba实现A2A协议时,建议遵循以下最佳实践:</p> <ul> <li><span class="highlight">合理设计智能体边界</span>:确保每个智能体职责单一,避免功能重叠</li> <li><span class="highlight">实现幂等性</span>:确保智能体处理的任务具有幂等性,便于重试和错误恢复</li> <li><span class="highlight">添加超时机制</span>:为智能体间的通信设置合理的超时时间,防止系统阻塞</li> <li><span class="highlight">实现断路器模式</span>:当某个智能体不可用时,快速失败并提供降级方案</li> <li><span class="highlight">记录详细日志</span>:记录智能体间的交互日志,便于问题排查和系统优化</li> </ul> </div> </div> <!-- 结论部分 --> <div class="section"> <h2 class="section-title"> <i class="material-icons">summarize</i> 总结 </h2> <div class="section-content"> <p>Spring AI Alibaba通过其多智能体框架Graph和企业级AI代理解决方案,为开发者提供了强大的工具来实现A2A协议。通过标准化的通信机制和灵活的架构设计,Spring AI Alibaba使开发者能够轻松构建多智能体协作系统,实现智能体间的无缝协同。</p> <p>随着AI技术的不断发展,多智能体协作将成为AI应用的重要形态。Spring AI Alibaba对A2A协议的支持,为Java开发者在这一领域的探索提供了坚实的基础,助力企业构建更加智能、高效的AI应用系统。</p> <div class="quote-block"> 未来已来,Spring AI Alibaba与A2A协议的结合,将开启AI智能体协作的新纪元,为数字化转型注入强大动力。 </div> </div> </div> </div> </body> </html>

讨论回复

1 条回复
✨步子哥 (steper) #1
10-20 12:23
# 智能体的星际联盟:Spring AI Alibaba如何借A2A协议开启AI协作的新纪元 🌟 **序曲:从孤岛到星系的AI觉醒** 想象一下,你是一位太空探险家,驾驶着一艘孤单的飞船在茫茫宇宙中漂流。突然,一个神秘的信号传来,它连接了无数其他飞船,形成了一个庞大的舰队,大家共享资源、协同作战。这就是A2A协议在AI世界中的角色——它将原本孤立的智能体联结成一个动态的“星际联盟”。在2025年的AI景观中,Spring AI Alibaba框架如同一艘先进的母舰,率先搭载了这一协议的支持,让Java开发者能够轻松构建跨服务的多智能体系统。今天,我们将一同踏上这场旅程,探索如何从进程内的简单交互,跃升到分布式协作的宏大叙事。基于阿里云的开源力量,这个框架不只是工具,更是AI民主化的桥梁,帮助企业打破系统孤岛,实现无缝协作。 > A2A协议的全称是Agent-to-Agent协议,它是一种开放标准,允许不同AI智能体之间自主沟通,就像人类团队分工合作一样。这种协议解决了传统AI应用中“各自为政”的问题,确保智能体能安全、有效地交换任务和数据,而无需担心兼容性障碍。通过这个注解,我们可以看到A2A不仅仅是技术规范,更是AI生态演化的关键一步,它促进了从单一模型到多代理系统的转变。 基于参考文献的详实描述,Spring AI Alibaba自2025年6月的1.0 GA发布以来,已成为Java开发者构建ChatBot、工作流和多智能体系统的首选。它深度集成阿里云百炼平台,支持大型语言模型(LLMs)、检索增强生成(RAG)以及NL2SQL等功能。更重要的是,通过spring-ai-alibaba-graph-core模块,它引入了A2A客户端,实现远程分布式智能体架构。这不仅仅是技术升级,更是企业级AI应用的革命,帮助解决系统孤岛问题。当然,实施时需注意安全性和兼容性,正如在太空联盟中,每艘飞船都需要验证身份以防入侵者。 🛡️ **守护联盟的安全大门:A2A协议的起源与设计原则** 让我们把时间倒回2024年,谷歌DeepMind团队如科幻小说中的先知,提出了A2A协议这个开放标准。它旨在实现AI智能体之间的自主交互,打破企业环境中常见的孤岛现象。想想看,就好像一群超级英雄各自有独特能力,但过去他们只能独来独往;现在,通过A2A,他们能组队对抗复杂任务。协议使用“Agent Cards”——一种JSON格式的描述卡片,来宣告每个智能体的能力、输入输出规范,就像名片上写着“我能做什么,怎么找我合作”。 在Spring AI Alibaba中,这个协议被巧妙融入,允许智能体通过HTTP、JSON-RPC和OpenAPI认证进行无状态、安全通信。它支持多模态交互,包括文本、音频和视频,甚至能处理长时间任务,提供实时反馈。举个例子,想象你是一家电商平台的AI客服智能体,当遇到复杂查询时,你可以委托给远程的库存管理智能体,而不需要自己从头计算——这节省了时间,提升了效率。研究显示,这种支持有助于企业级AI应用的可扩展性和互操作性,但远程调用可能带来网络延迟的挑战,就像太空通信偶尔会受太阳风干扰。 > 无状态通信是指每个交互不依赖前一次的状态,这使得系统更健壮,因为如果一个智能体崩溃,其他的不会受连累。这种设计类似于互联网的HTTP协议,确保了A2A在分布式环境中的可靠性。通过这个机制,Spring AI Alibaba能让开发者在不改变本地API的情况下,扩展到跨服务协作,进一步降低了学习曲线。 从参考资料来看,A2A与阿里巴巴的MCP(模型上下文协议)形成互补:MCP聚焦于模型与外部API的安全上下文交换,而A2A则强调智能体间的任务委托。未来,“MCP+A2A”可能成为AI生态的标准组合,就像双剑合璧,攻克更复杂的场景。在Spring AI Alibaba的1.0 GA发布后,这一支持于2025年9月通过spring-ai-alibaba-a2a-common模块稳定可用,至1.0.0.4版本。它利用A2A SDK的依赖,实现无缝通信,保持与本地智能体的API一致性。 🚀 **起航分布式之旅:Spring AI Alibaba的框架概述与核心能力** 现在,让我们像探险家检视地图一样,深入Spring AI Alibaba的架构。这个框架基于Spring AI构建,专为Java开发者量身定制,提供高层次的AI API抽象与云原生基础设施集成。它的核心是基于图的编排,通过Spring AI Alibaba Graph允许声明式定义节点、边和状态,用于复杂AI流程。想象一下,你在画一张思维导图,每一个节点是一个智能体,边是他们的交互路径——这就是Graph的魅力。 参考文献强调,它与阿里云百炼平台深度集成,支持通义千问模型、RAG用于知识检索,以及ARMS用于可观测性。开发者可以利用预构建节点,如LlmNode用于模型调用、ToolNode用于函数执行,甚至将工作流导出为PlantUML或Mermaid格式,便于可视化调试。2025年6月的1.0 GA发布标志着一个里程碑,引入生产就绪特征,如流式支持、人机交互干预和持久内存存储。这让AI应用从简单聊天机器人,演变为多步工作流系统。 举个生动例子:假如你正在开发一个医疗诊断AI,Spring AI Alibaba能让本地智能体调用远程的图像分析智能体,通过A2A协议共享患者数据(当然是加密的),从而得出更准确的诊断。证据显示,这种集成促进了跨进程和跨服务智能体交互,超越了进程内限制。但在企业环境中,可能需要额外配置Nacos作为注册中心,确保服务发现和路由的顺畅。 > 云原生基础设施是指框架能无缝运行在云环境中,支持自动缩放和容错。这在Spring AI Alibaba中通过Nacos和RocketMQ实现,帮助开发者避免从零构建分布式系统。通过这种集成,企业可以快速部署AI应用,而不担心底层复杂性,进一步加速了AI的落地。 从关键点来看,支持状态已稳定,但对于特定环境需权衡协议共建中的兼容性问题。Spring AI Alibaba的Graph模块在2025年8月的更新中,添加了A2A客户端适配,通过pull request #2254合并,确保远程调用与本地一致。 🤝 **联手共进的艺术:A2A在Spring AI Alibaba中的集成与使用** 过渡到实际应用,让我们讲述一个故事:一位Java开发者小明,正为公司构建分布式AI系统。过去,他的智能体像孤立的岛屿,只能本地协作;现在,通过Spring AI Alibaba的A2A支持,他能让它们跨服务“握手”。集成通过A2aRemoteAgent和A2aNode类实现,这些类处理基于URL的AgentCard解析、请求格式化和响应集成到整体状态。 例如,使用简单构建器模式配置远程writer智能体:开发者只需定义URL,框架自动解析卡片,执行任务。这特别适用于结合Nacos的分布式设置,用于注册和路由。社区贡献,如2025年8月的pull request,确保了持续增强。小明在Maven pom.xml中添加starter依赖,配置API密钥,然后用A2aRemoteAgent.builder()定义远程智能体——一切如丝般顺滑。 在实践中,这使能企业级分布式AI应用,如远程多智能体工作流,具有自动请求处理和状态同步特征。想想看,就好像一个厨师团队:主厨委托给助手切菜,而助手通过A2A“报告”进度,主厨实时调整菜谱。参考资料提供了一个表格,总结关键发布和特征,让我们将其转化为Markdown格式插入: | 版本/组件 | 发布日期 | 关键 A2A 特征 | 相关依赖/模块 | |-----------|----------|--------------|--------------| | 1.0 GA (核心框架) | 2025 年 6 月 | 计划参与 A2A 协议共建;尚未直接实现 | spring-ai-alibaba-graph-core (初始多智能体支持) | | Pull Request #2254 (Graph-Core 更新) | 2025 年 8 月 (合并) | 添加 A2A 客户端用于远程智能体交互;AgentCard 解析、远程调用 | a2a-java-sdk-client, a2a-java-sdk-server-common | | Nacos 3.1.0 (注册中心支持) | 2025 年 9 月 | 引入 A2A 注册中心,支持 Agent 服务注册与发现 | Nacos MCP Registry 与 Router | | Spring AI Alibaba Graph 更新 | 2025 年 8 月 | 支持调用 A2A 远程智能体;与 Nacos 集成自动注册 | spring-ai-alibaba-graph-core | 这个表格如航海图,指引开发者避开兼容性礁石。A2A的设计原则强调安全性、多模态交互和异步优先,确保长时间任务的处理。举例,在DeepResearch研究智能体中,多智能体协作通过A2A分布工具,如web爬取和Python脚本,提升了系统的复杂性。 > 异步优先原则意味着协议支持不阻塞的通信,就像发短信而非打电话等回复。这在企业AI中至关重要,因为任务可能耗时数小时,通过Webhook机制,智能体能实时更新状态,避免系统卡顿。通过这个设计,Spring AI Alibaba能处理实时反馈需求,进一步增强了用户体验。 从海报文档来看,Spring AI Alibaba的架构分层清晰:应用层提供ChatClient和Graph API,抽象层定义ChatModel和Tool,适配层对接DashScope和MCP,基础设施层依赖Nacos等。这确保了松耦合和高内聚。 🔍 **深入协议的内核:A2A的核心组件与通信机制** 继续我们的探险,让我们潜入A2A协议的“引擎室”。核心组件包括AgentCard(服务发现)、Task(工作单元)、Message(通信载体)和Artifact(输出结果)。这些如乐高积木,拼搭出智能体协作的框架。AgentCard是JSON清单,描述能力、输入输出,就像简历展示技能。 通信机制基于HTTP/HTTPS和JSON-RPC2.0,支持同步、流式(SSE)和异步(Webhook)模式。同步适用于快速响应,如简单查询;流式用于实时推送,如聊天流;异步处理长时间任务,如复杂计算。默认安全原则内置认证、加密和隐私保护,确保“不透明执行”——智能体只交换必需数据,不暴露内部机制。 在Spring AI Alibaba中,这些通过Graph框架实现,支持Multi-agent模式如ReAct Agent和Supervisor。企业级特性包括Nacos MCP注册表、分布式发现和负载均衡、动态API到MCP代理,以及NL2SQL扩展数据处理。比喻来说,MCP如“USB-C接口”连接资源,A2A如“网线”连接智能体,二者合璧构成完整栈。 > 不透明执行原则保护了智能体的“隐私”,防止恶意窥探内部逻辑。这类似于黑匣子测试,只关心输入输出。通过这个原则,A2A提升了系统的安全性,尤其在企业环境中,避免了敏感信息泄露的风险,进一步促进了跨平台互操作。 参考文献中的海报强调,A2A标志着AI从单一能力向多智能体协同的转变。Spring AI Alibaba的多智能体框架Graph借鉴LangGraph,是Java版的实现,提供预置Node降低门槛。 🛠️ **实战演练:从配置到协作的代码之旅** 现在,想象你是一位AI建筑师,正在搭建一座智能体大厦。让我们跟随参考资料的Demo示例,一步步构建。首先,添加依赖: 在pom.xml中: ```xml <!-- pom.xml --> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> <version>1.0.0.2</version> </dependency> ``` 然后,配置application.yml: ```yaml # application.yml spring: ai: alibaba: dashscope: api-key: ${DASHSCOPE_API_KEY} a2a: enabled: true agent-id: "customer-service-agent" registry: type: "nacos" server-addr: "localhost:8848" ``` 创建CustomerServiceAgent类,注册AgentCard并处理任务: ```java @Component public class CustomerServiceAgent { private final ChatModel chatModel; private final A2AClient a2aClient; public CustomerServiceAgent(ChatModel chatModel, A2AClient a2aClient) { this.chatModel = chatModel; this.a2aClient = a2aClient; } // 定义智能体能力 @PostConstruct public void registerAgent() { AgentCard agentCard = AgentCard.builder() .agentId("customer-service-agent") .name("客户服务智能体") .description("处理客户咨询和投诉") .capabilities(List.of( Capability.builder() .name("handle_inquiry") .description("处理客户咨询") .inputSchema("{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\"}}}") .outputSchema("{\"type\":\"object\",\"properties\":{\"response\":{\"type\":\"string\"}}}") .build() )) .build(); a2aClient.registerAgent(agentCard); } // 处理A2A任务 @A2ATaskHandler("handle_inquiry") public TaskResult handleInquiry(Task task) { String query = (String) task.getInput().get("query"); // 使用大模型处理客户咨询 Prompt prompt = new Prompt("作为客户服务代表,请回答以下问题:" + query); ChatResponse response = chatModel.call(prompt); // 返回处理结果 Map<String, Object> output = new HashMap<>(); output.put("response", response.getResult().getOutput().getContent()); return TaskResult.builder() .taskId(task.getTaskId()) .status(TaskStatus.COMPLETED) .output(output) .build(); } } ``` 这个例子如搭建积木,展示了如何注册和处理。进一步,实现OrderProcessingService进行协作: ```java @Service public class OrderProcessingService { private final A2AClient a2aClient; private final ChatModel chatModel; public OrderProcessingService(A2AClient a2aClient, ChatModel chatModel) { this.a2aClient = a2aClient; this.chatModel = chatModel; } public OrderResult processOrder(OrderRequest orderRequest) { // 1. 使用库存智能体检查库存 Task inventoryTask = Task.builder() .taskType("check_inventory") .input(Map.of( "productId", orderRequest.getProductId(), "quantity", orderRequest.getQuantity() )) .build(); TaskResult inventoryResult = a2aClient.invokeAgent("inventory-agent", inventoryTask); if (!inventoryResult.getStatus().equals(TaskStatus.COMPLETED)) { return OrderResult.failure("库存检查失败"); } Boolean inStock = (Boolean) inventoryResult.getOutput().get("inStock"); if (!inStock) { // 2. 如果库存不足,使用采购智能体发起采购 Task purchaseTask = Task.builder() .taskType("request_purchase") .input(Map.of( "productId", orderRequest.getProductId(), "quantity", orderRequest.getQuantity() )) .build(); TaskResult purchaseResult = a2aClient.invokeAgent("purchase-agent", purchaseTask); if (!purchaseResult.getStatus().equals(TaskStatus.COMPLETED)) { return OrderResult.failure("采购请求失败"); } } // 3. 使用物流智能体安排配送 Task logisticsTask = Task.builder() .taskType("arrange_delivery") .input(Map.of( "productId", orderRequest.getProductId(), "quantity", orderRequest.getQuantity(), "address", orderRequest.getDeliveryAddress() )) .build(); TaskResult logisticsResult = a2aClient.invokeAgent("logistics-agent", logisticsTask); if (!logisticsResult.getStatus().equals(TaskStatus.COMPLETED)) { return OrderResult.failure("配送安排失败"); } String trackingNumber = (String) logisticsResult.getOutput().get("trackingNumber"); // 4. 使用客户服务智能体发送确认通知 Task notificationTask = Task.builder() .taskType("send_notification") .input(Map.of( "customerId", orderRequest.getCustomerId(), "message", "您的订单已处理,物流单号:" + trackingNumber )) .build(); a2aClient.invokeAgent("customer-service-agent", notificationTask); return OrderResult.success(trackingNumber); } } ``` 使用Graph构建工作流: ```java @Configuration public class OrderProcessingWorkflow { @Bean public Graph orderProcessingGraph(A2AClient a2aClient) { return Graph.builder() .id("order-processing-workflow") .nodes( // 检查库存节点 Node.builder() .id("check-inventory") .type(NodeType.AGENT) .agentId("inventory-agent") .taskType("check_inventory") .build(), // 采购节点 Node.builder() .id("request-purchase") .type(NodeType.AGENT) .agentId("purchase-agent") .taskType("request_purchase") .build(), // 安排配送节点 Node.builder() .id("arrange-delivery") .type(NodeType.AGENT) .agentId("logistics-agent") .taskType("arrange_delivery") .build(), // 发送通知节点 Node.builder() .id("send-notification") .type(NodeType.AGENT) .agentId("customer-service-agent") .taskType("send_notification") .build(), // 条件判断节点 Node.builder() .id("check-stock-condition") .type(NodeType.CONDITION) .conditionFunction(state -> { Boolean inStock = (Boolean) state.get("inStock"); return inStock ? "arrange-delivery" : "request-purchase"; }) .build() ) .edges( Edge.builder() .source("check-inventory") .target("check-stock-condition") .build(), Edge.builder() .source("check-stock-condition") .target("arrange-delivery") .condition("arrange-delivery") .build(), Edge.builder() .source("check-stock-condition") .target("request-purchase") .condition("request-purchase") .build(), Edge.builder() .source("request-purchase") .target("arrange-delivery") .build(), Edge.builder() .source("arrange-delivery") .target("send-notification") .build() ) .build(); } @Service public class OrderProcessingService { private final Graph orderProcessingGraph; public OrderProcessingService(Graph orderProcessingGraph) { this.orderProcessingGraph = orderProcessingGraph; } public OrderResult processOrder(OrderRequest orderRequest) { // 初始化工作流状态 Map<String, Object> initialState = new HashMap<>(); initialState.put("productId", orderRequest.getProductId()); initialState.put("quantity", orderRequest.getQuantity()); initialState.put("address", orderRequest.getDeliveryAddress()); initialState.put("customerId", orderRequest.getCustomerId()); // 执行工作流 GraphExecutionResult result = orderProcessingGraph.execute(initialState); if (result.getStatus() == ExecutionStatus.COMPLETED) { String trackingNumber = (String) result.getFinalState().get("trackingNumber"); return OrderResult.success(trackingNumber); } else { return OrderResult.failure(result.getErrorMessage()); } } } } ``` 这些代码如蓝图,指导开发者从基础配置到复杂协作。最佳实践包括设计智能体边界、实现幂等性、添加超时、断路器模式和详细日志,确保系统稳健。 > 幂等性是指重复执行同一操作不会改变结果,就像按电梯按钮多次只上一次楼。这在A2A中防止了任务重复执行的混乱。通过这个实践,Spring AI Alibaba的分布式系统更可靠,尤其在网络不稳时。 🌈 **展望未来的星辰大海:A2A与Spring AI Alibaba的发展路线** 基于此,我们进一步探索未来。参考文献指出,虽然A2A在1.0 GA后聚焦客户端适配,但社区努力包括与MCP和AG-UI协议共建,旨在实现零代码智能体开发平台。路线图涵盖更深入集成、可视调试工具,以及Spring AI Alibaba Studio用于评估和部署。 社区产品如JManus用于计划-行动智能体、AgentScope用于作用域,展示真实应用。总体,Spring AI Alibaba的A2A支持将其定位为构建可扩展、互操作AI系统的强劲选择,与阿里巴巴生态紧密结合,确保企业可靠性。 想象一下,未来的AI如一个活的生态系统,智能体们自由协作,解决从医疗到电商的难题。这不仅仅是技术进步,更是人类智慧的延伸。用户建议检查Maven上的最新发布,如https://mvnrepository.com/artifact/com.alibaba.cloud.ai/spring-ai-alibaba-a2a-common。 > 零代码开发平台意味着开发者无需写代码,就能拖拽构建智能体,就像用乐高搭城堡。这将 democratize AI,让非专业人士也能参与,进一步加速创新步伐。 在海报的总结中,A2A协议的出现标志着多智能体协同的新阶段。Spring AI Alibaba通过Graph和企业解决方案,提供强大工具,实现无缝协同。未来,“MCP+A2A”将开启AI协作新纪元,为数字化转型注入动力。 通过这个旅程,我们看到了从孤岛到联盟的转变。Spring AI Alibaba不只是框架,更是AI未来的钥匙。 ## 参考文献 1. [Spring AI Alibaba 1.0 GA 正式发布,开启Java 智能体开发新时代!](https://java2ai.com/blog/spring-ai-alibaba-10-ga-release/) 2. [谷歌发布Agent2Agent (A2A) 协议,未来"MCP+A2A" 成标配?](https://java2ai.com/blog/google-a2a-protocol/) 3. [Spring AI Alibaba 发布企业级MCP 分布式部署方案](https://www.cnblogs.com/alisystemsoftware/p/18900511) 4. [阿里云开源AI 应用开发框架:Spring AI Alibaba](https://www.cnblogs.com/alisystemsoftware/p/18506747) 5. [【Feature】Add A2A Protocol Client Adaptation to spring-ai-alibaba ...](https://github.com/alibaba/spring-ai-alibaba/pull/2254)