Files
wiki/智能体平台调研/报告/spring-ai-alibaba-deployment-guide.html
T
zdh 5167d9e36e
Deploy Wiki to Production / deploy (push) Has been cancelled
feat: 所有页面添加「← 返回知识库」导航链接
覆盖 27 个此前缺少返回链接的报告页和独立页面(共 50 个 HTML 页,index.html 首页除外)
- 标准报告页:header/header-bar 内插入 back-link
- 特殊页面:深国际、中医馆、YqBoot、交互式演示等单独适配
- 统一文案「← 返回知识库」,URL 按目录深度自动推算
2026-06-05 19:07:17 +08:00

1143 lines
56 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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 全功能部署指南 — 本地内网环境</title>
<style>
:root {
--color-primary: #1677FF; --color-primary-hover: #4096FF; --color-primary-active: #0958D9; --color-primary-bg: #E6F4FF;
--color-success: #52C41A; --color-success-bg: #F6FFED; --color-success-border: #B7EB8F;
--color-warning: #FAAD14; --color-warning-bg: #FFFBE6; --color-warning-border: #FFE58F;
--color-error: #FF4D4F; --color-error-bg: #FFF2F0; --color-error-border: #FFCCC7;
--bg: #F5F5F5; --bg-container: #FFFFFF; --bg-elevated: #FAFAFA;
--border: #D9D9D9; --border-light: #F0F0F0;
--text-primary: #141414; --text-secondary: #595959; --text-tertiary: #8C8C8C;
--radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.03), 0 1px 6px -1px rgba(0,0,0,0.02);
--shadow-md: 0 2px 4px rgba(0,0,0,0.04), 0 4px 12px -2px rgba(0,0,0,0.04);
--shadow-lg: 0 4px 8px rgba(0,0,0,0.06), 0 8px 24px -4px rgba(0,0,0,0.08);
--sidebar-w: 260px; --header-h: 64px;
}
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;background:var(--bg);color:var(--text-primary);line-height:1.57;font-size:14px;}
::-webkit-scrollbar{width:6px;height:6px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px;}
.header{position:fixed;top:0;left:0;right:0;height:var(--header-h);background:rgba(255,255,255,0.88);backdrop-filter:blur(12px);border-bottom:1px solid var(--border-light);display:flex;align-items:center;padding:0 2rem;z-index:100;}
.header h1{font-size:18px;font-weight:700;background:linear-gradient(135deg,var(--color-primary),#722ED1);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;}
.header .back-link{margin-right:16px;font-size:13px;color:var(--color-primary);text-decoration:none;flex-shrink:0;}
.header .back-link:hover{text-decoration:underline;}
.header .version{margin-left:auto;font-size:12px;color:var(--text-tertiary);font-family:'SF Mono',Monaco,monospace;}
.menu-btn{display:none;width:40px;height:40px;border:none;background:none;cursor:pointer;border-radius:var(--radius-sm);font-size:20px;margin-right:12px;flex-shrink:0;}
.menu-btn:hover{background:var(--bg-elevated);}
.drawer-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:200;opacity:0;transition:opacity .25s;}
.drawer-overlay.show{display:block;opacity:1;}
.sidebar{position:fixed;top:var(--header-h);left:0;bottom:0;width:var(--sidebar-w);background:var(--bg-container);border-right:1px solid var(--border);overflow-y:auto;padding:1.25rem 0;z-index:90;}
.sidebar .toc-label{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--text-tertiary);padding:0 1.25rem;margin-bottom:.75rem;font-weight:600;}
.sidebar .toc-part{font-size:12px;font-weight:700;color:var(--color-primary);padding:.6rem 1.25rem .2rem;margin-top:.4rem;}
.sidebar nav ol{list-style:none;counter-reset:toc;}
.sidebar nav li{counter-increment:toc;}
.sidebar nav a{display:block;padding:.4rem 1.25rem;color:var(--text-secondary);text-decoration:none;font-size:12px;line-height:1.4;border-left:2px solid transparent;transition:all .15s;}
.sidebar nav a:hover,.sidebar nav a.active{color:var(--color-primary);background:var(--color-primary-bg);}
.sidebar nav a.active{border-left-color:var(--color-primary);font-weight:600;}
.main{margin-left:var(--sidebar-w);margin-top:var(--header-h);padding:32px 40px 64px;min-height:calc(100vh - var(--header-h));max-width:1100px;}
section{margin:48px 0;scroll-margin-top:calc(var(--header-h) + 1rem);}
section h2{font-size:24px;line-height:32px;padding-bottom:8px;border-bottom:1px solid var(--border);margin-bottom:20px;color:var(--color-primary);}
section h3{font-size:20px;line-height:28px;margin:24px 0 12px;color:#722ED1;}
section h4{font-size:16px;line-height:24px;margin:16px 0 8px;color:var(--color-success);}
p{color:var(--text-secondary);font-size:14px;margin:10px 0;text-align:justify;}
blockquote{background:var(--color-primary-bg);border-left:4px solid var(--color-primary);margin:16px 0;padding:12px 20px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;}
blockquote p{text-indent:0;color:var(--text-primary);font-size:14px;}
strong{color:var(--text-primary);}
.box{border-radius:var(--radius-md);padding:20px 24px;margin:18px 0;}
.box-info{background:var(--color-primary-bg);border:1px solid #91CAFF;}
.box-idea{background:#F9F0FF;border:1px solid #D3ADF7;}
.box-good{background:var(--color-success-bg);border:1px solid var(--color-success-border);}
.box-warn{background:var(--color-warning-bg);border:1px solid var(--color-warning-border);}
.box-danger{background:var(--color-error-bg);border:1px solid var(--color-error-border);}
.box h4{margin:0 0 8px;font-size:14px;font-weight:700;}
.box-info h4{color:var(--color-primary);}.box-idea h4{color:#722ED1;}.box-good h4{color:var(--color-success);}.box-warn h4{color:var(--color-warning);}.box-danger h4{color:var(--color-error);}
.box p{font-size:14px;margin:4px 0;text-indent:0;}
.table-wrap{overflow-x:auto;margin:20px 0;}
.table-caption{font-size:13px;font-weight:700;color:var(--text-primary);margin-bottom:8px;}
table{width:100%;border-collapse:collapse;font-size:13px;}
th,td{padding:10px 14px;border:1px solid var(--border);text-align:left;vertical-align:top;}
th{background:var(--bg-elevated);font-weight:700;color:var(--text-primary);white-space:nowrap;}
td{background:var(--bg-container);color:var(--text-secondary);}
tbody tr:hover td{background:var(--color-primary-bg);}
.tag{display:inline-block;padding:2px 10px;border-radius:12px;font-size:11px;font-weight:600;margin-right:4px;}
.tag-green{background:var(--color-success-bg);color:var(--color-success);border:1px solid var(--color-success-border);}
.tag-blue{background:var(--color-primary-bg);color:var(--color-primary);border:1px solid #91CAFF;}
.tag-warn{background:var(--color-warning-bg);color:var(--color-warning);border:1px solid var(--color-warning-border);}
.tag-red{background:var(--color-error-bg);color:var(--color-error);border:1px solid var(--color-error-border);}
.tag-purple{background:#F9F0FF;color:#722ED1;border:1px solid #D3ADF7;}
.kpi-row{display:flex;flex-wrap:wrap;gap:12px;margin:16px 0;}
.kpi{flex:1;min-width:110px;background:var(--color-primary-bg);border-radius:var(--radius-md);padding:14px 12px;text-align:center;}
.kpi .num{font-size:20px;font-weight:800;color:var(--color-primary);line-height:1.2;}
.kpi .label{font-size:10px;color:var(--text-tertiary);margin-top:4px;}
.kpi.warn{background:var(--color-warning-bg);}.kpi.warn .num{color:#D48806;}
.kpi.good{background:var(--color-success-bg);}.kpi.good .num{color:var(--color-success);}
.kpi.danger{background:var(--color-error-bg);}.kpi.danger .num{color:var(--color-error);}
.kpi.purple{background:#F9F0FF;}.kpi.purple .num{color:#722ED1;}
ul,ol{margin:8px 0 8px 20px;}
li{margin:4px 0;color:var(--text-secondary);font-size:14px;}
.pros-cons{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:12px 0;}
.pros{background:var(--color-success-bg);border:1px solid var(--color-success-border);border-radius:var(--radius-md);padding:16px 20px;}
.cons{background:var(--color-error-bg);border:1px solid var(--color-error-border);border-radius:var(--radius-md);padding:16px 20px;}
.pros h4{color:var(--color-success);margin:0 0 8px;}
.cons h4{color:var(--color-error);margin:0 0 8px;}
.pros ul,.cons ul{padding-left:18px;font-size:13px;}
.pros li,.cons li{margin-bottom:2px;}
.code-block{background:#1E1E1E;color:#D4D4D4;border-radius:var(--radius-md);padding:16px 20px;margin:12px 0;overflow-x:auto;font-family:'SF Mono',Monaco,'Cascadia Code',Consolas,monospace;font-size:12px;line-height:1.6;}
.code-block .kw{color:#569CD6;}.code-block .str{color:#CE9178;}.code-block .cm{color:#6A9955;}.code-block .fn{color:#DCDCAA;}.code-block .num{color:#B5CEA8;}
.step{display:flex;align-items:flex-start;gap:12px;margin:12px 0;padding:14px 18px;background:var(--bg-container);border:1px solid var(--border);border-radius:var(--radius-md);}
.step-num{flex-shrink:0;width:28px;height:28px;border-radius:50%;background:var(--color-primary);color:#fff;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;}
.step-body{flex:1;font-size:14px;color:var(--text-secondary);}
.step-body strong{display:block;color:var(--text-primary);margin-bottom:2px;}
.footer{text-align:center;padding:28px 0;color:var(--text-tertiary);font-size:13px;border-top:1px solid var(--border-light);margin-top:40px;}
.back-to-top{display:none;position:fixed;bottom:24px;right:24px;width:48px;height:48px;border-radius:50%;background:var(--color-primary);color:#fff;border:none;cursor:pointer;font-size:20px;box-shadow:var(--shadow-md);z-index:80;}
.back-to-top:hover{transform:scale(1.1);}
.back-to-top.show{display:flex;align-items:center;justify-content:center;}
@media(max-width:992px){:root{--sidebar-w:220px;}.main{padding:24px 20px 48px;}}
@media(max-width:768px){
.menu-btn{display:flex;align-items:center;justify-content:center;}
.sidebar{display:block;position:fixed;top:0;left:0;bottom:0;width:280px;max-width:85vw;transform:translateX(-100%);transition:transform .25s ease;z-index:201;padding-top:60px;}
.drawer-overlay.show ~ .sidebar,.drawer-overlay.show .sidebar,.sidebar.show{transform:translateX(0);}
.main{margin-left:0;padding:20px 16px 40px;}
.header h1{font-size:15px;}
.pros-cons{grid-template-columns:1fr;}
}
</style>
</head>
<body>
<div class="drawer-overlay" id="drawerOverlay"></div>
<header class="header">
<button class="menu-btn" id="menuBtn" aria-label="打开目录"></button>
<a href="../../index.html" class="back-link">← 返回知识库</a>
<h1>Spring AI Alibaba 全功能部署指南</h1>
<span class="version">V1.0 · 2026-06-05</span>
</header>
<aside class="sidebar">
<div class="toc-label">部署指南目录</div>
<nav>
<div class="toc-part">第一部分:环境准备</div>
<ol>
<li><a href="#s1">环境评估与缺口分析</a></li>
<li><a href="#s2">WSL2 环境准备</a></li>
</ol>
<div class="toc-part">第二部分:中间件部署</div>
<ol>
<li><a href="#s3">中间件总览</a></li>
<li><a href="#s4">PostgreSQL 16 安装</a></li>
<li><a href="#s5">Nacos 3.x 安装</a></li>
<li><a href="#s6">MinIO 安装</a></li>
</ol>
<div class="toc-part">第三部分:平台部署</div>
<ol>
<li><a href="#s7">项目骨架搭建</a></li>
<li><a href="#s8">核心配置详解</a></li>
<li><a href="#s9">全功能模块激活</a></li>
</ol>
<div class="toc-part">第四部分:内网与运维</div>
<ol>
<li><a href="#s10">内网访问配置</a></li>
<li><a href="#s11">运维手册</a></li>
<li><a href="#s12">故障排查</a></li>
</ol>
</nav>
</aside>
<main class="main">
<!-- ============================================================ -->
<!-- S1: 环境评估 -->
<!-- ============================================================ -->
<section id="s1">
<h2>环境评估与缺口分析</h2>
<blockquote><p>部署目标:本地 WSL2(Debian 13)内网环境,全功能 Spring AI Alibaba 平台。模型 API 走外网(阿里云百炼),中间件全部本地部署。</p></blockquote>
<div class="table-wrap">
<div class="table-caption">表:当前环境检测结果</div>
<table>
<thead><tr><th style="width:20%">检测项</th><th style="width:15%">当前值</th><th style="width:12%">状态</th><th>说明</th></tr></thead>
<tbody>
<tr><td>操作系统</td><td>Debian 13 (trixie) WSL2</td><td><span class="tag tag-green">OK</span></td><td>x86_64 架构,systemd 已启用</td></tr>
<tr><td>内存</td><td>15GB 总 / ~9.7GB 可用</td><td><span class="tag tag-green">OK</span></td><td>满足全套部署(建议 ≥8GB</td></tr>
<tr><td>磁盘</td><td>/mnt/d 289GB 空闲</td><td><span class="tag tag-green">OK</span></td><td>建议路径 /mnt/d/wiki/ 下创建子目录</td></tr>
<tr><td>JDK</td><td>OpenJDK 21.0.11</td><td><span class="tag tag-green">OK</span></td><td>满足要求(≥17</td></tr>
<tr><td>Maven</td><td>3.9.9</td><td><span class="tag tag-green">OK</span></td><td>满足要求(≥3.8</td></tr>
<tr><td>Node.js</td><td>v24.15.0</td><td><span class="tag tag-green">OK</span></td><td>满足要求(≥20.12</td></tr>
<tr><td>pnpm</td><td>已安装</td><td><span class="tag tag-green">OK</span></td><td>前端 Admin UI 构建需要</td></tr>
<tr><td>Docker</td><td><span class="tag tag-red">未安装</span></td><td><span class="tag tag-red">缺失</span></td><td>需安装 Docker 或改用原生安装方案</td></tr>
<tr><td>WSL2 网络</td><td>NAT 模式 172.18.79.x</td><td><span class="tag tag-warn">需配置</span></td><td>需端口转发或切换到 mirrored 模式</td></tr>
</tbody>
</table>
</div>
<div class="box box-warn">
<h4>⚠️ 关键缺口</h4>
<p>1. <strong>Docker 未安装</strong> — 中间件(PostgreSQL/Nacos/MinIO)建议用 Docker 部署,也可原生安装</p>
<p>2. <strong>WSL2 NAT 网络</strong> — 默认 NAT 模式外部无法直接访问,需配置端口转发或 mirrored 模式</p>
</div>
<h3>部署架构总览</h3>
<div class="table-wrap">
<div class="table-caption">图:全功能平台部署架构(本地内网版)</div>
<table>
<thead><tr><th style="width:8%">层级</th><th style="width:16%">组件</th><th style="width:10%">端口</th><th>职责</th><th>部署方式</th></tr></thead>
<tbody>
<tr><td><strong>L5 前端</strong></td><td>Admin Studio (React)</td><td>8080</td><td>可视化编排 + 评测管理 + Agent 监控</td><td>Spring Boot 内嵌</td></tr>
<tr><td><strong>L4 应用</strong></td><td>Spring AI Alibaba</td><td>8080</td><td>Agent 框架 + Graph 引擎 + MCP/A2A</td><td>裸进程 (java -jar)</td></tr>
<tr><td><strong>L3 注册中心</strong></td><td>Nacos 3.x</td><td>8848/9848</td><td>服务注册发现 + 动态配置 + MCP 调度</td><td>Docker / 原生</td></tr>
<tr><td><strong>L2 数据层</strong></td><td>PostgreSQL 16 + pgvector</td><td>5432</td><td>Agent 状态 + 数据集 + 向量检索</td><td>Docker / 原生</td></tr>
<tr><td><strong>L1 对象存储</strong></td><td>MinIO</td><td>9000/9001</td><td>文件存储 + Agent 记忆持久化</td><td>Docker / 原生</td></tr>
<tr><td><strong>L0 模型</strong></td><td>阿里云百炼 DashScope</td><td>外网 443</td><td>LLM 推理(通义千问系列)</td><td>SaaS(无需部署)</td></tr>
</tbody>
</table>
</div>
<div class="kpi-row">
<div class="kpi"><div class="num">5</div><div class="label">本地组件</div></div>
<div class="kpi good"><div class="num">1</div><div class="label">外网服务</div></div>
<div class="kpi warn"><div class="num">~2GB</div><div class="label">内存占用</div></div>
<div class="kpi purple"><div class="num">~30min</div><div class="label">预计耗时</div></div>
</div>
</section>
<!-- ============================================================ -->
<!-- S2: WSL2 环境准备 -->
<!-- ============================================================ -->
<section id="s2">
<h2>WSL2 环境准备</h2>
<h3>选项 A:安装 Docker(推荐)</h3>
<blockquote><p>中间件(PostgreSQL/Nacos/MinIO)使用 Docker 部署,一行命令启动,运维最简单。</p></blockquote>
<div class="code-block"><span class="cm"># 1. 安装 DockerDebian</span>
sudo apt update && sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo tee /etc/apt/keyrings/docker.asc
<span class="kw">echo</span> <span class="str">"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian trixie stable"</span> | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
<span class="cm"># 重新登录 WSL2 使 docker 组生效</span></div>
<div class="box box-idea">
<h4>💡 Docker 不工作时</h4>
<p>WSL2 中 Docker daemon 需要手动启动:<code>sudo dockerd &</code><code>sudo service docker start</code>。如果使用 Docker Desktop for Windows,在 Docker Desktop 设置中启用 WSL2 集成即可自动管理。</p>
</div>
<div class="code-block"><span class="cm"># 2. 验证 Docker</span>
docker --version
docker compose version</div>
<h3>选项 B:原生安装(不依赖 Docker)</h3>
<blockquote><p>如果不想安装 Docker,所有中间件均可在 WSL2 内原生安装。PostgreSQL 和 MinIO 通过 apt 安装,Nacos 下载二进制包直接运行。</p></blockquote>
<div class="box box-info">
<h4>️ 原生 vs Docker 对比</h4>
<p><strong>Docker</strong>:统一管理、数据隔离、升级方便、端口统一映射。推荐。</p>
<p><strong>原生</strong>:不依赖 Docker daemon、资源占用略低、但每个组件需单独管理。</p>
<p>下文同时提供两种方式的具体步骤。</p>
</div>
<h3>WSL2 系统优化</h3>
<div class="code-block"><span class="cm"># 编辑 /etc/wsl.conf,添加以下内容(如已有则合并)</span>
<span class="kw">sudo tee -a /etc/wsl.conf</span> &lt;&lt;EOF
[boot]
systemd=true
[network]
hostname=wsl2-dev
generateResolvConf=true
EOF
<span class="cm"># 创建项目目录</span>
mkdir -p /mnt/d/wiki/智能体平台调研/代码/spring-ai-alibaba-platform
<span class="kw">cd</span> /mnt/d/wiki/智能体平台调研/代码/</div>
</section>
<!-- ============================================================ -->
<!-- S3: 中间件总览 -->
<!-- ============================================================ -->
<section id="s3">
<h2>中间件部署总览</h2>
<div class="table-wrap">
<div class="table-caption">表:三个中间件的资源配置</div>
<table>
<thead><tr><th>组件</th><th>版本</th><th>端口</th><th>内存建议</th><th>磁盘建议</th><th>凭证(开发环境)</th></tr></thead>
<tbody>
<tr><td><strong>PostgreSQL</strong></td><td>16</td><td>5432</td><td>256MB</td><td>2GB</td><td>sa_agent / agent_2026</td></tr>
<tr><td><strong>Nacos</strong></td><td>3.1.0</td><td>8848 (HTTP), 9848 (gRPC)</td><td>512MB</td><td>1GB</td><td>nacos / nacos</td></tr>
<tr><td><strong>MinIO</strong></td><td>latest</td><td>9000 (API), 9001 (Console)</td><td>256MB</td><td>5GB</td><td>minioadmin / minioadmin</td></tr>
</tbody>
</table>
</div>
<div class="box box-warn">
<h4>⚠️ 安全提醒</h4>
<p>以上为<strong>开发环境</strong>默认凭证。部署到生产内网后,务必修改所有默认密码。Nacos 尤其需要关注——<strong>不要将 Nacos 暴露到公网</strong>(默认鉴权较简单),当前内网使用可接受。</p>
</div>
</section>
<!-- ============================================================ -->
<!-- S4: PostgreSQL -->
<!-- ============================================================ -->
<section id="s4">
<h2>PostgreSQL 16 + pgvector 安装</h2>
<h3>方式一:Docker(推荐)</h3>
<div class="code-block"><span class="cm"># docker-compose.yml 片段(完整文件见附录)</span>
services:
postgres:
image: pgvector/pgvector:pg16
container_name: sa-pg
restart: unless-stopped
environment:
POSTGRES_DB: spring_ai_agent
POSTGRES_USER: sa_agent
POSTGRES_PASSWORD: agent_2026
ports:
- <span class="str">"5432:5432"</span>
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: [<span class="str">"CMD-SHELL"</span>, <span class="str">"pg_isready -U sa_agent"</span>]
interval: 10s
timeout: 5s
retries: 5</div>
<p><strong>关键点</strong>:使用 <code>pgvector/pgvector:pg16</code> 镜像而非官方 postgres,因为它内置了向量扩展。如果你已有官方 PostgreSQL,可以手动安装 pgvector 扩展。</p>
<h3>方式二:原生 apt 安装</h3>
<div class="code-block"><span class="cm"># 安装 PostgreSQL 16</span>
sudo apt update && sudo apt install -y postgresql-16 postgresql-client-16
<span class="cm"># 安装 pgvector 扩展(从源码编译)</span>
sudo apt install -y postgresql-server-dev-16 build-essential git
git clone https://github.com/pgvector/pgvector.git
<span class="kw">cd</span> pgvector && make && sudo make install
<span class="cm"># 创建数据库和用户</span>
sudo -u postgres psql &lt;&lt;SQL
CREATE USER sa_agent WITH PASSWORD <span class="str">'agent_2026'</span>;
CREATE DATABASE spring_ai_agent OWNER sa_agent;
\c spring_ai_agent
CREATE EXTENSION vector;
SQL
<span class="cm"># 配置远程访问(内网其他机器连接)</span>
<span class="kw">echo</span> <span class="str">"listen_addresses = '*'"</span> | sudo tee -a /etc/postgresql/16/main/postgresql.conf
<span class="kw">echo</span> <span class="str">"host all sa_agent 0.0.0.0/0 md5"</span> | sudo tee -a /etc/postgresql/16/main/pg_hba.conf
sudo systemctl restart postgresql</div>
</section>
<!-- ============================================================ -->
<!-- S5: Nacos -->
<!-- ============================================================ -->
<section id="s5">
<h2>Nacos 3.x 安装</h2>
<h3>方式一:Docker(推荐)</h3>
<div class="code-block"><span class="cm"># docker-compose.yml 片段</span>
services:
nacos:
image: nacos/nacos-server:v3.1.0
container_name: sa-nacos
restart: unless-stopped
environment:
MODE: standalone
NACOS_AUTH_ENABLE: <span class="str">"true"</span>
NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789
NACOS_AUTH_IDENTITY_KEY: sa-nacos-identity
NACOS_AUTH_IDENTITY_VALUE: sa-nacos-secret
ports:
- <span class="str">"8848:8848"</span>
- <span class="str">"9848:9848"</span>
volumes:
- nacos_data:/home/nacos/data</div>
<p>Nacos 控制台:<code>http://localhost:8848/nacos</code>,默认用户名密码 <code>nacos/nacos</code></p>
<h3>方式二:原生二进制</h3>
<div class="code-block"><span class="cm"># 下载并启动 Nacos</span>
wget https://github.com/alibaba/nacos/releases/download/3.1.0/nacos-server-3.1.0.tar.gz
tar -xzf nacos-server-3.1.0.tar.gz
<span class="kw">cd</span> nacos/bin
<span class="cm"># Standalone 模式启动(内网够用)</span>
bash startup.sh -m standalone</div>
<div class="box box-info">
<h4>️ Nacos 命名空间规划</h4>
<p>启动后登录 Nacos 控制台(8848),创建以下命名空间:</p>
<p>1. <strong>sa-agent-mcp</strong> — MCP Server/Client 注册发现</p>
<p>2. <strong>sa-agent-config</strong> — 动态配置(Prompt 模板、模型参数)</p>
<p>3. <strong>sa-agent-a2a</strong> — 多 Agent A2A 通信(可选)</p>
</div>
</section>
<!-- ============================================================ -->
<!-- S6: MinIO -->
<!-- ============================================================ -->
<section id="s6">
<h2>MinIO 对象存储安装</h2>
<h3>方式一:Docker(推荐)</h3>
<div class="code-block"><span class="cm"># docker-compose.yml 片段</span>
services:
minio:
image: minio/minio:latest
container_name: sa-minio
restart: unless-stopped
command: server /data --console-address <span class="str">":9001"</span>
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- <span class="str">"9000:9000"</span>
- <span class="str">"9001:9001"</span>
volumes:
- minio_data:/data
healthcheck:
test: [<span class="str">"CMD"</span>, <span class="str">"curl"</span>, <span class="str">"-f"</span>, <span class="str">"http://localhost:9000/minio/health/live"</span>]
interval: 10s
timeout: 5s
retries: 5</div>
<h3>方式二:原生安装</h3>
<div class="code-block"><span class="cm"># 下载 MinIO 二进制</span>
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
<span class="cm"># 创建数据目录并启动</span>
mkdir -p /mnt/d/minio-data
MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin \
minio server /mnt/d/minio-data --console-address <span class="str">":9001"</span> &</div>
<h3>创建 Spring AI Alibaba 专用 Bucket</h3>
<p>MinIO 启动后,访问 <code>http://localhost:9001</code> 登录控制台,创建 Bucket</p>
<div class="table-wrap">
<table>
<thead><tr><th>Bucket 名称</th><th>用途</th></tr></thead>
<tbody>
<tr><td><strong>sa-agent-memory</strong></td><td>Agent 记忆文件持久化(MEMORY.md / 快照 / 知识图谱)</td></tr>
<tr><td><strong>sa-agent-datasets</strong></td><td>评测数据集存储</td></tr>
<tr><td><strong>sa-agent-skills</strong></td><td>自定义 Skill 文件存储</td></tr>
</tbody>
</table>
</div>
</section>
<!-- ============================================================ -->
<!-- S7: 项目骨架搭建 -->
<!-- ============================================================ -->
<section id="s7">
<h2>Spring AI Alibaba 项目骨架搭建</h2>
<blockquote><p>采用 Spring Boot 3.5.x + Spring AI Alibaba 1.1.2.3。推荐使用 <a href="https://start.spring.io" target="_blank">Spring Initializr</a> 生成骨架,或直接克隆官方示例仓库。</p></blockquote>
<h3>方式一:Spring Initializr 生成(推荐新项目)</h3>
<div class="code-block"><span class="cm"># 用 curl 调 Spring Initializr API 生成项目(也可手动在 start.spring.io 操作)</span>
curl -s https://start.spring.io/starter.zip \
-d type=maven-project \
-d language=java \
-d bootVersion=3.5.3 \
-d baseDir=spring-ai-alibaba-platform \
-d groupId=com.demo \
-d artifactId=agent-platform \
-d name=AgentPlatform \
-d packageName=com.demo.agent \
-d javaVersion=21 \
-d dependencies=web,actuator,lombok \
-o spring-ai-alibaba-platform.zip
unzip spring-ai-alibaba-platform.zip</div>
<h3>方式二:克隆官方示例(推荐快速验证)</h3>
<div class="code-block">git clone https://github.com/alibaba/spring-ai-alibaba.git
<span class="kw">cd</span> spring-ai-alibaba
<span class="cm"># 官方示例在 spring-ai-alibaba-examples/ 目录下</span></div>
<h3>方式三:从零搭建 Maven 项目</h3>
<p>最小 <code>pom.xml</code> 如下(完整版见附录):</p>
<div class="code-block"><span class="cm">&lt;!-- 版本锁定 --&gt;</span>
&lt;properties&gt;
&lt;spring-boot.version&gt;3.5.3&lt;/spring-boot.version&gt;
&lt;spring-ai.version&gt;1.1.2&lt;/spring-ai.version&gt;
&lt;spring-ai-alibaba.version&gt;1.1.2.3&lt;/spring-ai-alibaba.version&gt;
&lt;/properties&gt;
&lt;dependencyManagement&gt;
&lt;dependencies&gt;
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-dependencies&lt;/artifactId&gt;
&lt;version&gt;${spring-boot.version}&lt;/version&gt;
&lt;type&gt;pom&lt;/type&gt;&lt;scope&gt;import&lt;/scope&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;org.springframework.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-bom&lt;/artifactId&gt;
&lt;version&gt;${spring-ai.version}&lt;/version&gt;
&lt;type&gt;pom&lt;/type&gt;&lt;scope&gt;import&lt;/scope&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-bom&lt;/artifactId&gt;
&lt;version&gt;${spring-ai-alibaba.version}&lt;/version&gt;
&lt;type&gt;pom&lt;/type&gt;&lt;scope&gt;import&lt;/scope&gt;
<span class="kw">&lt;/dependency&gt;</span>
&lt;/dependencies&gt;
&lt;/dependencyManagement&gt;
<span class="cm">&lt;!-- 核心依赖(详见下一节) --&gt;</span></div>
</section>
<!-- ============================================================ -->
<!-- S8: 核心配置详解 -->
<!-- ============================================================ -->
<section id="s8">
<h2>核心配置详解</h2>
<h3>application.yml — 全功能配置</h3>
<blockquote><p>以下为<strong>本地内网全功能</strong>配置,覆盖五大功能模块。放在 <code>src/main/resources/application.yml</code></p></blockquote>
<div class="code-block"><span class="cm"># ===========================================</span>
<span class="cm"># Spring AI Alibaba 全功能内网配置</span>
<span class="cm"># ===========================================</span>
<span class="cm"># --- 基础配置 ---</span>
<span class="kw">server:</span>
port: 8080
address: 0.0.0.0 <span class="cm"># 绑定所有网卡,允许内网访问</span>
<span class="kw">spring:</span>
application:
name: agent-platform
<span class="cm"># --- 数据源 ---</span>
datasource:
url: jdbc:postgresql://localhost:5432/spring_ai_agent
username: sa_agent
password: agent_2026
driver-class-name: org.postgresql.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 2
<span class="cm"># --- AI 模型配置(外网) ---</span>
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY} <span class="cm"># 环境变量注入</span>
chat:
options:
model: qwen-plus
temperature: 0.7
<span class="cm"># --- Nacos 配置中心 ---</span>
alibaba:
nacos:
config:
server-addr: localhost:8848
namespace: ${NACOS_CONFIG_NAMESPACE:sa-agent-config}
<span class="cm"># --- Nacos MCP 注册发现 ---</span>
mcp:
nacos:
enabled: true
server-addr: localhost:8848
username: nacos
password: nacos
registry:
service-namespace: ${NACOS_MCP_NAMESPACE:sa-agent-mcp}
enabled: true
<span class="cm"># --- 对象存储(MinIO---</span>
cloud:
aws:
s3:
endpoint: http://localhost:9000
region: us-east-1
path-style-access-enabled: true
credentials:
access-key: minioadmin
secret-key: minioadmin
<span class="cm"># --- Spring AI Alibaba Admin Studio ---</span>
<span class="kw">spring.ai.alibaba:</span>
studio:
enabled: true
path: /chatui <span class="cm"># Studio UI 路径</span>
<span class="cm"># --- Graph 工作流 ---</span>
<span class="kw">spring.ai.alibaba.graph:</span>
observation:
enabled: true <span class="cm"># OpenTelemetry 追踪</span>
<span class="cm"># --- Actuator 健康检查 ---</span>
<span class="kw">management:</span>
endpoints:
web:
exposure:
include: health,info,metrics,env
endpoint:
health:
show-details: when-authorized</div>
<h3>环境变量配置</h3>
<div class="code-block"><span class="cm"># 在 ~/.bashrc 或项目 .env 文件中配置</span>
<span class="kw">export</span> DASHSCOPE_API_KEY=sk-your-dashscope-api-key
<span class="kw">export</span> NACOS_CONFIG_NAMESPACE=sa-agent-config
<span class="kw">export</span> NACOS_MCP_NAMESPACE=sa-agent-mcp
<span class="kw">export</span> JINA_API_KEY=jina-your-key <span class="cm"># 可选:深度搜索功能</span></div>
<div class="box box-warn">
<h4>⚠️ DashScope API Key 获取</h4>
<p>1. 访问 <a href="https://dashscope.console.aliyun.com/" target="_blank">阿里云百炼控制台</a></p>
<p>2. 注册/登录 → API-KEY 管理 → 创建 API Key</p>
<p>3. 新用户有大量免费额度(通义千问 Plus 100万 Token/月)</p>
<p>4. <strong>内网部署 + 外网模型</strong>:确保 WSL2 可以访问 api dashscope.aliyuncs.com</p>
</div>
<h3>完整 pom.xml 依赖清单</h3>
<div class="code-block"><span class="cm">&lt;!-- ============================================ --&gt;</span>
<span class="cm">&lt;!-- Spring AI Alibaba 全功能依赖清单 --&gt;</span>
<span class="cm">&lt;!-- ============================================ --&gt;</span>
<span class="cm">&lt;!-- 1. 核心 DashScope AI Starter(必选)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 2. Agent 框架(必选:多 Agent 编排 + Graph--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-agent-framework&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 3. Admin Studio UI(必选:可视化编排 + 评测)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-studio&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 4. Nacos MCP Server(必选:MCP 分布式)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-starter-nacos-mcp-server&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 5. Nacos MCP Client(必选:发现 MCP 服务)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-starter-nacos-mcp-client&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 6. Nacos 配置中心(推荐:动态 Prompt + 参数热更新)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-starter-config-nacos&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 7. Graph 可观测性(推荐:OTel 追踪)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;com.alibaba.cloud.ai&lt;/groupId&gt;
&lt;artifactId&gt;spring-ai-alibaba-starter-graph-observation&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 8. PostgreSQL(必选:数据持久化)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;org.postgresql&lt;/groupId&gt;
&lt;artifactId&gt;postgresql&lt;/artifactId&gt;
&lt;scope&gt;runtime&lt;/scope&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 9. MinIO S3 兼容客户端(必选:对象存储)--&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;io.awspring.cloud&lt;/groupId&gt;
&lt;artifactId&gt;spring-cloud-aws-starter-s3&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span>
<span class="cm">&lt;!-- 10. Actuator(推荐:健康检查 + 指标 --&gt;</span>
<span class="kw">&lt;dependency&gt;</span>
&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
&lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;
<span class="kw">&lt;/dependency&gt;</span></div>
</section>
<!-- ============================================================ -->
<!-- S9: 全功能模块激活 -->
<!-- ============================================================ -->
<section id="s9">
<h2>全功能模块激活指南</h2>
<blockquote><p>Spring AI Alibaba 五项核心功能中,四项在开源版完整提供。以下是逐模块激活步骤。</p></blockquote>
<h3>模块 1:多智能体平面 <span class="tag tag-green">⭐⭐⭐⭐⭐</span></h3>
<p>Spring AI Alibaba 的 <strong>Graph 引擎</strong> 原生支持 6 种 Agent 编排模式。无需额外配置,引入 <code>agent-framework</code> 依赖即生效。</p>
<div class="code-block"><span class="cm">// 6 种编排模式示例入口</span>
<span class="kw">@RestController</span>
<span class="kw">public class</span> AgentOrchestrationController {
<span class="cm">// 1. Sequential — 顺序执行</span>
<span class="kw">@GetMapping</span>(<span class="str">"/agent/sequential"</span>)
<span class="kw">public</span> String sequential() {
<span class="kw">var</span> graph = <span class="kw">new</span> SequentialAgentGraph()
.addAgent(<span class="str">"researcher"</span>, researchAgent)
.addAgent(<span class="str">"writer"</span>, writerAgent);
<span class="kw">return</span> graph.execute(input);
}
<span class="cm">// 2. Parallel — 并行执行</span>
<span class="cm">// 3. Routing — 条件路由</span>
<span class="cm">// 4. Loop — 循环迭代</span>
<span class="cm">// 5. Supervisor — 监督模式</span>
<span class="cm">// 6. Handoff — Agent 间交接</span>
}</div>
<div class="box box-idea">
<h4>💡 多 Agent 分布式(A2A 协议)</h4>
<p>如果多个 Agent 部署在不同微服务中,通过 <strong>Nacos + A2A 协议</strong> 实现跨服务通信。每个 Agent 应用引入 Nacos MCP 依赖后,自动注册到 Nacos,其他 Agent 通过服务名发现并调用。无需硬编码 IP:Port。</p>
</div>
<h3>模块 2:低代码编排 <span class="tag tag-blue">⭐⭐⭐⭐</span></h3>
<p>Admin Studio 提供了可视化 Graph 编排能力。引入 <code>spring-ai-alibaba-studio</code> 依赖后:</p>
<div class="step">
<div class="step-num">1</div>
<div class="step-body">
<strong>启动应用</strong>
<code>mvn spring-boot:run</code>(或 java -jar),访问 <code>http://localhost:8080/chatui</code>
</div>
</div>
<div class="step">
<div class="step-num">2</div>
<div class="step-body">
<strong>进入 Graph 编排视图</strong>
左侧导航 → Agent Graph → 拖拽节点 → 连线 → 配置每个节点的 Agent/工具/条件
</div>
</div>
<div class="step">
<div class="step-num">3</div>
<div class="step-body">
<strong>导出/导入</strong>
支持 PlantUML / Mermaid 导出,便于文档化;支持 JSON 导入复用工作流
</div>
</div>
<h3>模块 3Harness 基建 <span class="tag tag-blue">⭐⭐⭐⭐</span></h3>
<p>Harness 含上下文管理、人工审核、Skill 管理、安全沙箱四大子模块:</p>
<div class="table-wrap">
<table>
<thead><tr><th>子模块</th><th>激活方式</th><th>说明</th></tr></thead>
<tbody>
<tr><td><strong>上下文压缩</strong></td><td>框架内置,自动启用</td><td>超长对话自动摘要+压缩,节省 Token。阈值可在 Nacos 动态配置</td></tr>
<tr><td><strong>上下文持久化</strong></td><td>配置 PostgreSQL 后自动启用</td><td>Agent 会话状态持久化到 DB,重启不丢失</td></tr>
<tr><td><strong>Human-in-the-Loop</strong></td><td>代码配置 <code>.humanApproval()</code></td><td>敏感操作(发邮件/删除文件)需人工审批</td></tr>
<tr><td><strong>Agent Skills</strong></td><td><code>spring-ai-alibaba-starter-skills</code></td><td>渐进式披露 + 按需加载,大幅降低 Token 消耗</td></tr>
<tr><td><strong>安全沙箱</strong></td><td>框架内置</td><td>代码执行隔离,工具调用权限检查</td></tr>
</tbody>
</table>
</div>
<h3>模块 4:技能市场 <span class="tag tag-warn">⭐⭐⭐</span></h3>
<p>Spring AI Alibaba 的 "技能市场" 基于 Agent Skills 机制(v1.1.2.0 新增),与 OpenClaw 的 ClawHub 不同,<strong>没有公开社区市场</strong>。技能以本地文件/代码形式管理:</p>
<div class="code-block"><span class="cm">// 定义 Agent Skill</span>
<span class="kw">@Component</span>
<span class="kw">public class</span> WeatherSkill <span class="kw">implements</span> AgentSkill {
<span class="kw">public</span> String getName() { <span class="kw">return</span> <span class="str">"weather-query"</span>; }
<span class="kw">public</span> String getDescription() { <span class="kw">return</span> <span class="str">"查询指定城市的天气"</span>; }
<span class="kw">public</span> SkillResult execute(SkillContext ctx) { <span class="cm">/*...*/</span> }
}
<span class="cm">// Agent 声明可用 Skills(渐进式披露——只发描述不发实现)</span>
<span class="kw">@Agent</span>(skills={<span class="str">"weather-query"</span>, <span class="str">"stock-price"</span>, <span class="str">"file-search"</span>})
<span class="kw">public class</span> AssistantAgent { }</div>
<p>内网小团队场景下,可以自建内部 Skill 仓库(Git 仓库 + MinIO 存储),通过 <code>Agent Skills</code> 机制加载。</p>
<h3>模块 5:评测服务 <span class="tag tag-blue">⭐⭐⭐⭐</span></h3>
<p>Admin Studio 内置评测平台,无需额外部署!</p>
<div class="step">
<div class="step-num">1</div>
<div class="step-body">
<strong>创建数据集</strong>
Admin → 数据集管理 → 新建 → 上传 JSONL/CSV(问答对格式)
</div>
</div>
<div class="step">
<div class="step-num">2</div>
<div class="step-body">
<strong>配置评估器</strong>
选择评估维度:准确性 / 相关性 / 完整性 / 安全性 / 延迟
</div>
</div>
<div class="step">
<div class="step-num">3</div>
<div class="step-body">
<strong>创建实验</strong>
指定 Agent + 数据集 + 评估器 → 运行实验 → 查看结果面板
</div>
</div>
<div class="box box-good">
<h4>✅ 评测功能总结</h4>
<p>Spring AI Alibaba 的评测模块在 10 个平台中排名前列。优势是 <strong>评测内置在 Admin 平台</strong>,无需像其他平台那样单独部署评测工具(如 Future AGI / EvalMonkey)。开发→编排→评估→优化的闭环全部在一个 Admin 界面内完成。</p>
</div>
</section>
<!-- ============================================================ -->
<!-- S10: 内网访问 -->
<!-- ============================================================ -->
<section id="s10">
<h2>内网访问配置</h2>
<blockquote><p>WSL2 默认 NAT 模式下,局域网其他设备无法直接访问 WSL2 内服务。有三种解决方案,按推荐度排序。</p></blockquote>
<h3>方案 AWSL2 Mirrored 模式(最推荐 — Windows 11 24H2+</h3>
<div class="code-block"><span class="cm"># 在 Windows 用户目录创建 %USERPROFILE%\.wslconfig</span>
<span class="cm"># 或编辑 /mnt/c/Users/&lt;你的用户名&gt;/.wslconfig</span>
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=false
autoProxy=true
<span class="cm"># 保存后在 PowerShell 中执行:</span>
<span class="cm"># wsl --shutdown</span>
<span class="cm"># wsl</span></div>
<div class="box box-good">
<h4>✅ Mirrored 模式优点</h4>
<p>WSL2 与 Windows 共享 IP 地址,局域网设备直接通过 <strong>Windows 的局域网 IP</strong> 访问 WSL2 内服务。无需端口转发,无需 netsh 配置。</p>
</div>
<h3>方案 BNAT + 端口转发(Windows 10 / 不支持 Mirrored 时)</h3>
<div class="code-block"><span class="cm"># 1. 在 WSL2 中查看 IP</span>
ip addr show eth0 | grep inet
<span class="cm"># 假设得到 172.18.79.129</span>
<span class="cm"># 2. 在 Windows PowerShell(管理员)中添加端口转发</span>
<span class="cm"># 将 Windows 宿主机端口 → 转发到 WSL2 端口</span>
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=172.18.79.129
netsh interface portproxy add v4tov4 listenport=8848 listenaddress=0.0.0.0 connectport=8848 connectaddress=172.18.79.129
netsh interface portproxy add v4tov4 listenport=9001 listenaddress=0.0.0.0 connectport=9001 connectaddress=172.18.79.129
<span class="cm"># 3. 放行 Windows 防火墙</span>
New-NetFirewallRule -DisplayName <span class="str">"WSL2 Agent Platform 8080"</span> -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName <span class="str">"WSL2 Nacos 8848"</span> -Direction Inbound -LocalPort 8848 -Protocol TCP -Action Allow
<span class="cm"># 4. 查看已配置的转发规则</span>
netsh interface portproxy show all
<span class="cm"># 5. 删除转发规则(如果需要)</span>
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0</div>
<div class="box box-warn">
<h4>⚠️ NAT 端口转发注意事项</h4>
<p>WSL2 重启后 IP 会变化,端口转发规则会失效。需要重新执行 step 2。建议写一个 PowerShell 脚本自动化此过程。</p>
</div>
<h3>方案 C:nginx 反向代理(灵活但复杂)</h3>
<p>在 Windows 宿主机安装 nginx,反向代理到 WSL2 内的服务。适合需要统一入口 + SSL + 认证的场景。</p>
<h3>验证内网可达性</h3>
<div class="code-block"><span class="cm"># 在 WSL2 内确认服务监听 0.0.0.0</span>
ss -tlnp | grep -E <span class="str">"8080|8848|5432|9000"</span>
<span class="cm"># 在局域网另一台设备(手机/笔记本)浏览器访问:</span>
<span class="cm"># http://&lt;Windows局域网IP&gt;:8080/chatui → Admin Studio</span>
<span class="cm"># http://&lt;Windows局域网IP&gt;:8848/nacos → Nacos 控制台</span>
<span class="cm"># http://&lt;Windows局域网IP&gt;:9001 → MinIO 控制台</span></div>
<div class="table-wrap">
<div class="table-caption">表:内网访问地址速查</div>
<table>
<thead><tr><th>服务</th><th>WSL2 内访问</th><th>局域网访问(Mirrored 模式)</th></tr></thead>
<tbody>
<tr><td>Admin Studio</td><td>http://localhost:8080/chatui</td><td>http://&lt;Windows-IP&gt;:8080/chatui</td></tr>
<tr><td>Nacos 控制台</td><td>http://localhost:8848/nacos</td><td>http://&lt;Windows-IP&gt;:8848/nacos</td></tr>
<tr><td>MinIO 控制台</td><td>http://localhost:9001</td><td>http://&lt;Windows-IP&gt;:9001</td></tr>
<tr><td>PostgreSQL</td><td>localhost:5432</td><td>&lt;Windows-IP&gt;:5432</td></tr>
<tr><td>MinIO API</td><td>localhost:9000</td><td>&lt;Windows-IP&gt;:9000</td></tr>
</tbody>
</table>
</div>
</section>
<!-- ============================================================ -->
<!-- S11: 运维手册 -->
<!-- ============================================================ -->
<section id="s11">
<h2>运维手册</h2>
<h3>服务自启动</h3>
<h4>Docker 中间件自启动</h4>
<p>Docker Compose 中已设置 <code>restart: unless-stopped</code>WSL2 启动后 Docker daemon 运行即自动拉起中间件。</p>
<h4>Spring Boot 应用自启动(systemd</h4>
<div class="code-block"><span class="cm"># 创建 systemd service 文件</span>
sudo tee /etc/systemd/system/agent-platform.service &lt;&lt;'UNIT'
[Unit]
Description=Spring AI Alibaba Agent Platform
After=network.target docker.service
Wants=docker.service
[Service]
Type=simple
User=zdh
WorkingDirectory=/mnt/d/wiki/智能体平台调研/代码/spring-ai-alibaba-platform
Environment=<span class="str">"DASHSCOPE_API_KEY=sk-your-key"</span>
Environment=<span class="str">"NACOS_CONFIG_NAMESPACE=sa-agent-config"</span>
Environment=<span class="str">"NACOS_MCP_NAMESPACE=sa-agent-mcp"</span>
ExecStart=/usr/bin/java -jar -Xms512m -Xmx2g target/agent-platform-1.0.0.jar
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable agent-platform
sudo systemctl start agent-platform</div>
<h3>日志管理</h3>
<div class="code-block"><span class="cm"># 查看应用日志(systemd 方式)</span>
journalctl -u agent-platform -f -n 100
<span class="cm"># 查看应用日志(直接运行方式)</span>
tail -f logs/agent-platform.log
<span class="cm"># Docker 中间件日志</span>
docker compose logs -f postgres
docker compose logs -f nacos</div>
<h3>数据备份</h3>
<div class="code-block"><span class="cm">#!/bin/bash</span>
<span class="cm"># backup-agent-platform.sh — 每日备份脚本</span>
BACKUP_DIR=/mnt/d/backups/agent-platform/$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
<span class="cm"># 1. PostgreSQL 备份</span>
docker compose <span class="kw">exec</span> -T postgres pg_dump -U sa_agent spring_ai_agent &gt; $BACKUP_DIR/pg_dump.sql
<span class="cm"># 2. MinIO 数据备份</span>
rsync -av /mnt/d/minio-data/ $BACKUP_DIR/minio-data/
<span class="cm"># 3. Nacos 配置导出</span>
curl -X GET <span class="str">"http://localhost:8848/nacos/v1/cs/configs?dataId=&group=&tenant=sa-agent-config&pageNo=1&pageSize=100"</span> &gt; $BACKUP_DIR/nacos-config.json
<span class="kw">echo</span> <span class="str">"Backup complete: $BACKUP_DIR"</span></div>
<h3>版本升级</h3>
<div class="code-block"><span class="cm"># 1. 检查当前版本</span>
curl -s http://localhost:8080/actuator/info
<span class="cm"># 2. 更新 pom.xml 中的版本号</span>
<span class="cm"># spring-ai-alibaba.version → 新版本</span>
<span class="cm"># 3. 重建并重启</span>
mvn clean package -DskipTests
sudo systemctl restart agent-platform
<span class="cm"># 4. 验证</span>
curl -s http://localhost:8080/actuator/health</div>
</section>
<!-- ============================================================ -->
<!-- S12: 故障排查 -->
<!-- ============================================================ -->
<section id="s12">
<h2>故障排查</h2>
<div class="table-wrap">
<div class="table-caption">表:常见问题与解决方案</div>
<table>
<thead><tr><th style="width:25%">症状</th><th style="width:20%">可能原因</th><th>解决步骤</th></tr></thead>
<tbody>
<tr>
<td><strong>Nacos 连接超时</strong></td>
<td>Nacos 未启动 / 端口冲突</td>
<td>1. <code>docker compose ps nacos</code> 检查容器状态<br>2. <code>ss -tlnp | grep 8848</code> 检查端口<br>3. 检查 Nacos 日志 <code>docker compose logs nacos</code></td>
</tr>
<tr>
<td><strong>DashScope API 调用失败</strong></td>
<td>API Key 无效 / 网络不通</td>
<td>1. <code>curl -H "Authorization: Bearer $DASHSCOPE_API_KEY" https://dashscope.aliyuncs.com/api/v1/models</code> 测试<br>2. 检查 WSL2 外网连通性 <code>ping dashscope.aliyuncs.com</code><br>3. 检查环境变量是否注入 <code>echo $DASHSCOPE_API_KEY</code></td>
</tr>
<tr>
<td><strong>PostgreSQL 连接拒绝</strong></td>
<td>PG 未启动 / 认证失败</td>
<td>1. <code>docker compose ps postgres</code> 检查容器<br>2. 手动测试 <code>psql -h localhost -U sa_agent -d spring_ai_agent</code><br>3. 检查 pg_hba.conf 远程访问配置</td>
</tr>
<tr>
<td><strong>Admin Studio 白屏</strong></td>
<td>前端资源未构建 / 路径不对</td>
<td>1. 确认依赖包含 <code>spring-ai-alibaba-studio</code><br>2. 访问 <code>http://localhost:8080/chatui/index.html</code><br>3. 检查浏览器控制台 Network 错误</td>
</tr>
<tr>
<td><strong>MCP Server 注册不到 Nacos</strong></td>
<td>Nacos 命名空间不存在</td>
<td>1. 登录 Nacos 控制台检查 <code>sa-agent-mcp</code> 命名空间是否存在<br>2. 检查 application.yml 中 mcp.nacos.registry 配置<br>3. 查看应用日志 <code>grep "MCP" logs/*.log</code></td>
</tr>
<tr>
<td><strong>内网设备无法访问</strong></td>
<td>WSL2 NAT 网络隔离</td>
<td>1. 确认 <code>server.address=0.0.0.0</code><br>2. 试用 Mirrored 模式或端口转发(详见 S10)<br>3. <code>ss -tlnp | grep 8080</code> 确认监听 0.0.0.0 而非 127.0.0.1</td>
</tr>
<tr>
<td><strong>内存不足(OOM</strong></td>
<td>JVM 内存占用过大</td>
<td>1. 降低 JVM 参数 <code>-Xmx1g</code><code>-Xmx512m</code><br>2. 减少 Nacos JVM:修改 nacos/bin/startup.sh 中的 <code>-Xms</code>/<code>-Xmx</code><br>3. 检查是否有内存泄漏 <code>jmap -heap &lt;pid&gt;</code></td>
</tr>
<tr>
<td><strong>WSL2 重启后 IP 变化</strong></td>
<td>WSL2 默认 DHCP</td>
<td>使用 Mirrored 模式(方案 A)彻底解决,或编写端口转发自动修复脚本</td>
</tr>
</tbody>
</table>
</div>
<h3>快速健康检查脚本</h3>
<div class="code-block"><span class="cm">#!/bin/bash</span>
<span class="cm"># health-check.sh — 一键检测全平台状态</span>
<span class="kw">echo</span> <span class="str">"=== Spring AI Alibaba 全平台健康检查 ==="</span>
<span class="cm"># 中间件</span>
<span class="kw">echo</span> -n <span class="str">"[PostgreSQL] "</span>; psql -h localhost -U sa_agent -d spring_ai_agent -c <span class="str">"SELECT 1"</span> &gt;/dev/null <span class="num">2</span>&gt;&amp;<span class="num">1</span> && <span class="kw">echo</span> <span class="str">"✅ OK"</span> || <span class="kw">echo</span> <span class="str">"❌ FAIL"</span>
<span class="kw">echo</span> -n <span class="str">"[Nacos] "</span>; curl -s http://localhost:8848/nacos/v1/console/health/readiness &gt;/dev/null && <span class="kw">echo</span> <span class="str">"✅ OK"</span> || <span class="kw">echo</span> <span class="str">"❌ FAIL"</span>
<span class="kw">echo</span> -n <span class="str">"[MinIO] "</span>; curl -s http://localhost:9000/minio/health/live &gt;/dev/null && <span class="kw">echo</span> <span class="str">"✅ OK"</span> || <span class="kw">echo</span> <span class="str">"❌ FAIL"</span>
<span class="cm"># 应用</span>
<span class="kw">echo</span> -n <span class="str">"[Agent Platform] "</span>; curl -s http://localhost:8080/actuator/health &gt;/dev/null && <span class="kw">echo</span> <span class="str">"✅ OK"</span> || <span class="kw">echo</span> <span class="str">"❌ FAIL"</span>
<span class="kw">echo</span> -n <span class="str">"[Admin Studio] "</span>; curl -s -o /dev/null -w <span class="str">"%{http_code}"</span> http://localhost:8080/chatui/index.html | grep <span class="str">"200"</span> &gt;/dev/null && <span class="kw">echo</span> <span class="str">"✅ OK"</span> || <span class="kw">echo</span> <span class="str">"❌ FAIL"</span>
<span class="cm"># 外网模型</span>
<span class="kw">echo</span> -n <span class="str">"[DashScope API] "</span>; curl -s -o /dev/null -w <span class="str">"%{http_code}"</span> https://dashscope.aliyuncs.com/api/v1/models -H <span class="str">"Authorization: Bearer $DASHSCOPE_API_KEY"</span> | grep <span class="str">"200"</span> &gt;/dev/null && <span class="kw">echo</span> <span class="str">"✅ OK"</span> || <span class="kw">echo</span> <span class="str">"❌ FAIL"</span></div>
</section>
<footer class="footer">
<p>Spring AI Alibaba 全功能部署指南 · V1.0 · 2026-06-05</p>
<p style="margin-top:4px;">目标环境:WSL2 Debian 13 · 本地内网 · Java 21 · Nacos 3.x · PostgreSQL 16 · MinIO · DashScope</p>
</footer>
</main>
<button class="back-to-top" id="backToTop" aria-label="回到顶部"></button>
<script>
(function(){
var menuBtn = document.getElementById('menuBtn');
var overlay = document.getElementById('drawerOverlay');
var sidebar = document.querySelector('.sidebar');
var open = false;
function toggle(){ open ? close() : show(); }
function show(){ overlay.classList.add('show'); sidebar.classList.add('show'); open = true; document.body.style.overflow='hidden'; }
function close(){ overlay.classList.remove('show'); sidebar.classList.remove('show'); open = false; document.body.style.overflow=''; }
if(menuBtn) menuBtn.addEventListener('click', toggle);
if(overlay) overlay.addEventListener('click', close);
var sidebarLinks = document.querySelectorAll('.sidebar nav a');
sidebarLinks.forEach(function(a){
a.addEventListener('click', function(){
if(window.innerWidth <= 768) close();
});
});
var sections = document.querySelectorAll('section[id]');
var navLinks = document.querySelectorAll('.sidebar nav a');
function onScroll(){
var current = '';
sections.forEach(function(sec){
if(window.scrollY >= sec.offsetTop - 100) current = sec.id;
});
navLinks.forEach(function(a){
a.classList.toggle('active', a.getAttribute('href') === '#' + current);
});
}
window.addEventListener('scroll', onScroll, {passive:true});
var btt = document.getElementById('backToTop');
function toggleBTT(){ btt.classList.toggle('show', window.scrollY > 400); }
window.addEventListener('scroll', toggleBTT, {passive:true});
if(btt) btt.addEventListener('click', function(){ window.scrollTo({top:0,behavior:'smooth'}); });
})();
</script>
</body>
</html>