一键部署 Dify + MCP Server,高效开发 AI 智能体应用
<p>作者:黄刚(泽尘) |孙小涵(子照)|赵庆杰(卢令)|王霄霄(丛霄)</p><h1 id="前言">前言</h1>
<p><strong>全球 AI 开发者正在见证一场 “AI 智能体革命”。</strong></p>
<p>从 2024 年 Dify.ai 发布开源框架 Dify以来,到全球开发者基于其快速构建的智能客服、企业知识库、AI 营销助手等场景应用,GitHub 上已有超过 2.3 万个 AI 应用项目诞生。</p>
<p>如今,MCP 的协议也异军突起,大量基于 MCP 协议的 MCP Server 应用涌上市场,它解决了各个模块之间交互不统一的问题,让一切现有传统应用就像 USB 接口一样,随意在 AI 智能体上插拔使用。 那如何快速的基于 MCP Server 构建出一个 AI 应用?我们大胆的猜测,Dify + MCP Server 将是一个完美的结合,因为 Dify 有强大的编排能力,再加上 MCP Server 标准的接口协议,在 Dify 平台上,只需要进行简单的拖拽就可以快速的构建一个生产级别的 AI 智能体应用。</p>
<p>本次我们选择了阿里云 Serverless 应用引擎(下面简称 SAE)来部署 Dify、MCP 应用,并且期望通过 Dify 快速编排 MCP Server 应用快速智能体,实现一套“免运维、全托管,生产级”的 AI 智能体解决方案。</p>
<p>在我们的方案里,将致力于解决以下问题:</p>
<ol>
<li>低成本:面向算力收费,不额外收费其它费用,并且基于 SAE 自身提供的弹性能力,可以更从容的应对业务流量高峰。</li>
<li>高可用:通过多可用区部署,快弹等 SAE 自有的优势,帮助 Dify 从社区版应用快速升级为生产级别的应用。</li>
<li>全链路无侵入监控:基于 SAE 提供的免费无侵入监控方案,让业务低成本的全链路监控你的 AI 应用。</li>
<li>简单易用:1 分钟完成 Dify,MCP Server 的部署,5分钟基于Dify 编排 MCP 快速构建 AI 应用。</li>
<li>单租安全:可独立部署 Dify 应用到自己的 VPC 内,用户业务的数据不会流出 VPC,保证数据绝对安全。</li>
</ol>
<p>本文将着重介绍如何通过 SAE 快速搭建 Dify AI 研发平台,依托 Serverless 架构提供全托管、免运维的解决方案,高效开发 AI 智能体应用。</p>
<p><em>(PS:SAE 还支持</em>_<u>快速搭建 Manus AI、MCP Server 等 AI 场景应用</u>__,本文选取部署较为复杂的 Dify 应用来作为演示,有其他 AI 场景应用托管的需求可以联系 钉钉群:32874633)_</p>
<h1 id="在-sae-上快速部署-dify-ai-研发平台">在 SAE 上快速部署 Dify AI 研发平台</h1>
<h2 id="基于-saectl-模板一键部署">基于 saectl 模板一键部署</h2>
<p>下面以实际例子,演示如何使用 saectl 工具,通过一组 YAML模板在 SAE 上轻松部署 Dify。</p>
<h3 id="前置准备">前置准备</h3>
<h4 id="第一步saectl-工具安装">第一步:saectl 工具安装</h4>
<p>参考:如何安装与配置saectl工具_Serverless 应用引擎(SAE)-阿里云帮助中心,完成 saectl 工具安装</p>
<h4 id="第二步前置资源准备">第二步:前置资源准备</h4>
<p>通过模版创建应用前,请确保您拥有以下资源(Dify 部署依赖):</p>
<ul>
<li>数据库
<ul>
<li>Redis 数据库</li>
<li>Postgre SQL 数据库</li>
<li>向量数据库</li>
</ul>
</li>
<li>存储
<ul>
<li>NAS 文件存储</li>
</ul>
</li>
<li>网络
<ul>
<li>NAT 网关</li>
</ul>
</li>
</ul>
<h3 id="saectl-模版部署">saectl 模版部署</h3>
<h4 id="第一步准备-sae-dify-模板">第一步:准备 SAE Dify 模板</h4>
<p>下载 SAE Dify 模板仓库,仓库结构如下,包含所有 Dify 应用组件所需的 K8S 资源定义。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145704801-1006810349.png"></p>
<p>替换 YAML 模板中变量为您自己的资源,以 dify-credential 为例:</p>
<pre><code class="language-bash">apiVersion: v1
data:
DB_USERNAME: ${pg_database_username}# PGSQL 数据库用户名
DB_PASSWORD: ${pg_database_password}# PGSQL 数据库密码
PGVECTOR_USER: ${vector_database_username}# PGVector数据库用户名
PGVECTOR_PASSWORD: ${vector_database_password}# PGVector 数据库密码
REDIS_USERNAME: ${redis_database_username}# Redis 数据库用户名
REDIS_PASSWORD: ${redis_database_password}# Redis 数据库密码
kind: Secret
metadata:
name: dify-credentials
namespace: dify
type: Opaque
</code></pre>
<h4 id="第二步通过-saectl-工具一键部署-dify-至-sae">第二步:通过 saectl 工具一键部署 Dify 至 SAE</h4>
<p>YAML 文件变量替换完成后,执行 ./install.sh,脚本会自动部署并检查上述 K8S 资源,并打印 Dify 公网访问地址。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145705446-217775487.png"></p>
<p>登录 SAE 控制台,可以看到已创建的 Dify 应用组件。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145706577-2128270392.png"></p>
<h3 id="使用-dify-服务">使用 Dify 服务</h3>
<p>打开浏览器,在地址栏中输入上一步骤打印出的 ${EXTERNAL-IP}😒{PORT},即可访问在 SAE 上一键部署的 Dify 服务。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145708074-1415645072.png"></p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145710541-1847663156.png"></p>
<h2 id="基于-sae-应用中心一键部署">基于 SAE 应用中心一键部署</h2>
<p>SAE 应用中心为用户提供了 Dify 应用模板,您只需要在控制台填写表单,我们会为您自动创建并运行部署流水线,将 Dify 一键部署至 SAE。</p>
<h3 id="前置准备-1">前置准备</h3>
<p>同上,需要准备 Dify 应用依赖的数据库、存储、网络资源:</p>
<ul>
<li>数据库
<ul>
<li>Redis 数据库</li>
<li>Postgre SQL 数据库</li>
<li>向量数据库</li>
</ul>
</li>
<li>存储
<ul>
<li>NAS 文件存储</li>
</ul>
</li>
<li>网络
<ul>
<li>NAT 网关</li>
</ul>
</li>
</ul>
<h3 id="sae-应用中心部署">SAE 应用中心部署</h3>
<h4 id="第一步在-sae-应用中心选择-dify-社区版">第一步:在 SAE 应用中心选择 Dify 社区版</h4>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145712796-2078177218.png"></p>
<h4 id="第二步填写-dify-社区版部署的参数表单">第二步:填写 Dify 社区版部署的参数表单</h4>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145713756-1019718310.png"></p>
<h4 id="第三步提交表单等待部署完成">第三步:提交表单,等待部署完成</h4>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145715078-151082648.png"></p>
<h3 id="使用-dify-服务-1">使用 Dify 服务</h3>
<p>同「基于 saectl 模版一键部署」</p>
<blockquote>
<p>打开浏览器,在地址栏中输入控制台日志打印出的 ${EXTERNAL-IP}😒{PORT},即可访问在 SAE 应用中心一键部署的 Dify 服务。</p>
</blockquote>
<h1 id="使用-dify-编排-mcp-应用">使用 Dify 编排 MCP 应用</h1>
<h3 id="第一步--在-sae-上部署-mcp-server">第一步:在 SAE 上部署 MCP Server</h3>
<ul>
<li>基于 MCP 官方提供的 Python SDK 中的一个简单 SSE 协议的 MCP Server</li>
</ul>
<p>https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/servers/simple-tool/mcp_simple_tool/server.py</p>
<p>它实现了 SSE 远端协议的一个具备网页抓取工具的服务,其中 SseServerTransport 是 SDK 中封装了 SSE 的交互,请求路径 <code>/sse</code>完成连接建立,请求路径 <code>/messages</code>路径是客户端服务端消息推送。</p>
<pre><code class="language-python">if transport == "sse":
from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette
from starlette.routing import Mount, Route
sse = SseServerTransport("/messages/")
async def handle_sse(request):
async with sse.connect_sse(
request.scope, request.receive, request._send
) as streams:
await app.run(
streams, streams, app.create_initialization_options()
)
starlette_app = Starlette(
debug=True,
routes=[
Route("/sse", endpoint=handle_sse),
Mount("/messages/", app=sse.handle_post_message),
],
)
</code></pre>
<pre><code class="language-python"># 使用 app.call_tool() 装饰器定义 call_tool 工具调用的方法
@app.call_tool()
async def fetch_tool(
name: str, arguments: dict
) -> list:
if name != "fetch":
raise ValueError(f"Unknown tool: {name}")
if "url" not in arguments:
raise ValueError("Missing required argument 'url'")
return await fetch_website(arguments["url"])
# 使用 app.list_tools() 装饰器定义列出所有工具的方法
@app.list_tools()
async def list_tools() -> list:
return [
types.Tool(
name="fetch",
description="Fetches a website and returns its content",
inputSchema={
"type": "object",
"required": ["url"],
"properties": {
"url": {
"type": "string",
"description": "URL to fetch",
}
},
},
)
]
</code></pre>
<p>将上述MCP Server 打包为镜像,部署到SAE 上,可以直接用 saectl 一键部署,支持按照暴露 CLB 类型的 MCP Service 地址,SAE 平台内置了应用的监控、日志等,围绕应用提供了的全套运维体系,在 SAE 界面可以看到应用已经创建出来,并且处于 Running 状态,日志标准输出显示服务器运行中。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145717024-816454536.png"></p>
<h3 id="第二步--在-sae-dify-平台创建-agent-并使用-mcp-协议进行工具调用">第二步:在 SAE Dify 平台创建 Agent ,并使用 MCP 协议进行工具调用</h3>
<ul>
<li>在 Dify 的插件中,选择 “Agent 策略”,选择官方的“Dify Agent 部署” (注:Dify 暂时官方没有支持 MCP 协议,都是按照插件的形式由第三方开发者提供 )</li>
</ul>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145717732-778985478.png"></p>
<pre><code>- 创建一个工作流应用,添加 Agent 节点,并对 Agent 节点进行配置,选择 ReAct 的模式,并配置 MCP 工具方法。这是 Dify 内部封装了一层 MCP 服务的方法调用。
</code></pre>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145718566-1569037493.png"></p>
<p>在 Dify 工具市场中安装 MCP 工具,然后回到工作流界面,在 MCP 服务配置这里填写 SAE MCP Server 绑定的 CLB 地址,作为访问地址。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145719559-2003582286.png"></p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145720406-1630525791.png"></p>
<pre><code class="language-json">{
"mcp_server": {
"url": "http://8.135.243.229:80/sse",
"headers": {
},
"timeout": 5,
"sse_read_timeout": 300
}
}
</code></pre>
<h3 id="第三步-测试-agent">第三步: 测试 Agent</h3>
<p>点击运行, Dify 提供了调试功能,以可视化的形式看到 Agent 的思考运行过程:</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145722052-1044683449.png"></p>
<h3 id="第四步-查看-sae-mcp-server-应用输出日志">第四步: 查看 SAE MCP Server 应用输出日志</h3>
<p>可以看到 MCP 客户端和服务端交互了 List Tool 和 Call Tool 等方法。</p>
<p><img src="https://img2024.cnblogs.com/other/2123714/202504/2123714-20250411145723062-101369543.png"></p>
<h1 id="总结云上托管-dify-的核心挑战与-sae-解决方案">总结:云上托管 Dify 的核心挑战与 SAE 解决方案</h1>
<p>在企业级应用中,Dify 作为一款功能强大的 LLM 应用研发平台,其云上托管需要应对弹性伸缩、高可用性和快速迭代等核心挑战。阿里云 Serverless 应用引擎(SAE)凭借其原生 Serverless 架构和企业级服务能力,为这些问题提供了高效解决方案。</p>
<p><em><u>(如果您对于产品有更多建议或者对 Dify 云端托管有更多想法可以加入钉钉群(群号:32874633)与我们取得联系。)</u></em></p>
<h2 id="cicd-与快速迭代加速开发与交付效率">CI/CD 与快速迭代:加速开发与交付效率</h2>
<p><strong>挑战:</strong><br>
Dify 用户需频繁迭代模型、优化工作流或修复问题。传统 CI/CD 流程复杂,且部署环境一致性难以保证,导致迭代周期长、风险高。</p>
<p><strong>SAE 解决方案:</strong></p>
<ol>
<li><strong>深度集成 CI/CD 工具链</strong>
<ul>
<li>支持与主流 DevOps 工具(如 GitLab、GitHub、Jenkins、阿里云 CodePipeline)无缝对接,实现代码提交 → 构建 → 镜像推送 → 自动部署的全链路自动化。</li>
</ul>
</li>
<li><strong>一键部署与灰度发布</strong>
<ul>
<li>通过 SAE 控制台或 API 实现一键部署,结合 金丝雀发布(Canary Release) 功能,将新版本逐步推广至 10%、50%、100% 流量,降低上线风险。</li>
</ul>
</li>
<li><strong>滚动更新与无损升级</strong>
<ul>
<li>支持滚动部署策略,在更新过程中保持服务高可用,避免因版本切换导致的中断。</li>
</ul>
</li>
<li><strong>环境一致性与镜像管理</strong>
<ul>
<li>通过镜像仓库(如阿里云 ACR)统一管理应用版本,确保开发、测试、生产环境配置一致,减少“环境差异”导致的故障。</li>
</ul>
</li>
</ol>
<h2 id="弹性能力适配动态资源需求">弹性能力:适配动态资源需求</h2>
<p><strong>挑战:</strong><br>
Dify 平台需支持开发者高频次的应用测试及多场景部署,资源需求波动显著(如突发的模型推理任务或团队协作高峰期)。若资源固定分配,可能导致成本浪费或性能瓶颈。</p>
<p><strong>SAE 解决方案:</strong></p>
<ol>
<li><strong>自动弹性扩缩容</strong>
<ul>
<li>基于负载的自动伸缩:通过 HPA(Horizontal Pod Autoscaler)根据 CPU、内存或自定义指标(如 API 调用频率)动态调整 Dify 实例数量,应对突发流量或密集计算任务。</li>
</ul>
</li>
<li><strong>冷启动优化</strong>
<ul>
<li>SAE 的镜像预热与层共享技术,将容器启动时间缩短至秒级,加速开发环境初始化或突发请求响应。</li>
</ul>
</li>
<li><strong>按需付费模式</strong>
<ul>
<li>Serverless 架构按实际资源使用计费,避免为闲置资源付费,降低企业级 Dify 部署的长期成本。</li>
</ul>
</li>
</ol>
<h2 id="高可用保障平台稳定运行与数据安全">高可用:保障平台稳定运行与数据安全</h2>
<p><strong>挑战:</strong><br>
Dify 作为企业级 LLM 应用基础设施,需确保持续可用性。任何节点故障或区域级中断可能导致开发流程中断、模型训练数据丢失或 API 服务不可用。</p>
<p><strong>SAE 解决方案:</strong></p>
<ol>
<li><strong>多可用区容灾部署</strong>
<ul>
<li>自动将 Dify 实例分布于多个可用区(AZ),实现跨 AZ 的流量负载均衡与故障无缝切换,规避单点故障风险。</li>
</ul>
</li>
<li><strong>健康检查与自愈机制</strong>
<ul>
<li>实时监控 Dify 实例健康状态,自动重启异常容器并触发告警,确保服务高可用性。</li>
</ul>
</li>
<li><strong>数据持久化与备份</strong>
<ul>
<li>结合阿里云存储服务(如 OSS、NAS、RDS、Tair),确保模型数据、配置信息等内容的持久化存储与跨地域容灾,满足企业级数据安全要求</li>
</ul>
</li>
</ol>
<p>更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。</p><br><br>
来源:https://www.cnblogs.com/Serverless/p/18820614
頁:
[1]