「深度拆解」Spring Boot如何用DeepSeek重构MCP通信层?从线程模型到分布式推理的架构进化
什么是MCP?
MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源、工具及系统提供统一的交互接口,被称为 “AI领域的USB-C接口”158。其核心目标是解决AI模型与外部世界交互的碎片化问题,推动AI从“被动应答”向“主动执行”跃迁。
- 解决了什么问题?
解决了AI大模型因数据孤岛限制无法发挥潜力的难题。举个例子,以前我们想要AI大模型使用我们的数据,要么自己复制粘贴,要么上传下载,其中都需要人参与,MCP就是AI大模型与数据资源中间的一座桥梁,通过MCP服务和MCP客户端,只要遵循这套协议,就能实现万物互联;
- MCP核心架构
MCP遵循CS架构(客户端-服务端),有三个核心概念: MCP HOST:发起请求的LLM应用程序,可以理解为用户请求入口; MCP Client:在应用程序内部,专门与MCP Server进行交互的工具,类似HttpClient的作用,提供调用本地MCP Server和远程MCP Server的能力; MCP Server:为MCP Client提供各类服务,比如文件操作,数据库操作等资源服务,可本地部署,也可远程部署;
- MCP Client 从上述架构图中可以了解到,MCP Client充当了LLM大模型和MCP Server之间的桥梁,为LLM大模型很好的运用本地和远程数据资源提供了最基本的保障。 MCP Client的基本工作流程如下:
- 当HOST项目初始化的时候,也会触发MCP Client初始化;
- MCP Client首先会先与所有的MCP Server建立连接,并从MCP Server获取可以使用的工具列表(每个MCP Server都会告诉MCP Client自己具备的能力);
- 当用户请求进来后,LLM大模型会根据用户的具体请求分析是否可以使用工具来解决用户的问题,并最终决定使用哪些工具来处理;
- 如果需要使用工具,那么LLM大模型会通过MCP Client来调用MCP Server处理;
- 最终调用工具的结果会经过LLM大模型处理后返回给用户;
- MCP Server
MCP Server主要提供三种类型的功能:- 资源(Resources):比如文件,数据库等,可以被客户端读取;
- 工具(Tools):比如地图定位服务,实时公交查询等;
- 提示(Prompts):比如如果需要 AI 定制化地返回某些格式化内容时,可以提供自定义的 prompts;
以上功能可以为AI应用提供丰富的上下文信息和操作能力,从而增强LLM大模型的实用性和灵活性。
目前已经出现了很多好玩的MCP Server,有兴趣的小伙伴可以访问官方MCP Server列表、MCP.so、阿里云MCP或者Awesome MCP Server。
- 通信机制
MCP Client与MCP Server通信采用以下两种方式,并且都是使用JSON-RPC 2.0数据格式进行消息通信:- 本地通信:通过操作系统标准输入输出stdio传输,适用于MCP Client和MCP Server部署在同一台机器上进行通信;
- 远程通信:使用SSE(Server-Sent Events)与Http结合,实现跨网络的数据传输,适用于需要访问远程资源或分布式部署的场景;
如何使用MCP
目前市面上有很多工具可以支持调用MCP Server,比如Cursor,Cline等,大家有兴趣的可以去了解一下:
Spring Boot集成DeepSeek+MCP Client调用MCP Server
- 前置工作
安装nodejs环境:请安装nodejs 18+以上版本,并保证以下命令生效:
node -v npm -v npx -v
安装python环境:建议安装python-3 11或以上版本 ;
说明:目前MCP Server基本都是使用Nodejs或者Python编写的,想要使用官方或者第三方的MCP Server需要保障本地有对应的运行环境;
接下里开始创建SpringBoot项目 - maven依赖
pom.xml:
<dependencies> <!-- 对外提供restful api --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 使用openai接入LLM大模型,咱们使用的deepseek兼容opanai接口,所以可以使用这个依赖,如果使用其他大模型可以更换这个依赖 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency> <!-- mcp客户端依赖,实现了与LLM大模型交互逻辑,且通过MCP协议调用MCP Server --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> - 配置LLM大模型
application.yml:
spring: ai: openai: chat: options: model: "deepseek-chat" # 需要替换为自己的api-key api-key: "xxxxxxxxxxxxxxxxxxxxxxxx" base-url: "https://api.deepseek.com"
上面的api-key需要去deepseek官网获取,创建api-key后需要充值,否则调用的时候会返回余额不足,影响使用效果; - 配置调用的MCP Server
目前我在demo中接了两款MCP Server,且都在本地运行。- filesystem:用于管理文件系统,可以执行文件的增删查改等操作。
- mysql:用于mysql数据库的数据查询和分析操作。
执行以下命令安装对应的MCP Server到机器上:
npm install mysql-mcp-server npm install @modelcontextprotocol/server-filesystem
application.yml相关配置如下:
spring: ai: mcp: client: stdio: connections: mysql: # Windows操作系统使用npx.cmd,Linux和MacOS使用npx command: "npx.cmd" args: # mcp server名称 - "mysql-mcp-server" env: # 数据库ip "MYSQL_HOST": "127.0.0.1" # 数据库服务端口 "MYSQL_PORT": "3306" # 数据库用户名 "MYSQL_USER": "xxxx" # 数据库密码 "MYSQL_PASSWORD": "xxxx" # 数据库名称 "MYSQL_DATABASE": "xxxx" filesystem: # Windows操作系统使用npx.cmd,Linux和MacOS使用npx command: "npx.cmd" args: - "-y" - "@modelcontextprotocol/server-filesystem" # 在此文件夹内进行文件操作,需根据具体需求调整目标文件夹 - "E:\\mcp_test"
- Java Bean配置
import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @ClassName McpClientConfiguration * @Description * @Author weizou.zou * @Date 2025/4/9 0:41 * @Version $ */ @Configuration public class McpClientConfiguration { /** * 注入ChatClient * @param chatModel * @param toolCallbackProvider 报红不用管,没有任何问题 * @return */ @Bean ChatClient chatClient(ChatModel chatModel, SyncMcpToolCallbackProvider toolCallbackProvider) { return ChatClient .builder(chatModel) .defaultTools(toolCallbackProvider.getToolCallbacks()) .build(); } } - McpClientController实现与用户交互
import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/mcp") public class McpClientController { @Resource private ChatClient chatClient; @GetMapping("/ai") String generation(String userInput) { return this.chatClient.prompt() .user(userInput) .call() .content(); } }
至此我们的demo项目就搞定了,下面咱们来看看效果如何:
http://127.0.0.1:8081/api/mcp/ai?userInput=请帮我创建一个ai.txt,并在里面写入hello ai!
http://127.0.0.1:8081/api/mcp/ai?userInput=帮我查一下courier.user表中有多少条数据
遇到的问题
- maven依赖难找
虽然现在有很多文章聊MCP的,但是大多数都是科普文,即使是实战的,也很少有java或者spring相关的。另一个就是spring ai目前还没有release版本的mcp jar包,很多LLM实现上没有完全支持mcp,导致想要找到合适的maven比较困难。 - 配置MCP Server报错
一开始按照网上资料在application.yml中配置MCP Server,一启动项目就报错:
其实是因为Windows环境下npx命令需要有后缀cmd:npx.cmd
,不能完全参照网上资料直接写npx
。也就是说,调用命令需要根据操作系统环境进行调整。
- 如何转换MCP Server配置为yml配置
一般在网上找到的MCP Server配置如下,以百度地图MCP Server为例:
{ "mcpServers": { "baidu-maps": { "command": "python", "args": [ "-m", "mcp_server_baidu_maps" ], "env": { "BAIDU_MAPS_API_KEY": "<YOUR_API_KEY>" } } } }
或者
{ "mcpServers": { "baidu-map": { "command": "npx", "args": [ "-y", "@baidumap/mcp-server-baidu-map" ], "env": { "BAIDU_MAP_API_KEY": "{您的AK}" } } } }
如果是python环境的话,根据文档,需要先安装MCP Server:
pip install mcp-server-baidu-maps
上面的两类配置最终转换为application.yml如下:
Python版本
spring: ai: mcp: client: stdio: connections: baidu-maps: command: "python.cmd" args: - "-m" - "mcp_server_baidu_maps" env: "BAIDU_MAPS_API_KEY": "<YOUR_API_KEY>"
Nodejs版本
spring: ai: mcp: client: stdio: connections: baidu-maps: command: "npx.cmd" args: - "-y" - "@baidumap/mcp-server-baidu-map" env: "BAIDU_MAP_API_KEY": "<YOUR_API_KEY>"
- 多轮对话上下文丢失问题
第一轮对话:请帮我生成查询user表总共有多少条的sql语句
返回结果:select count(*) from user; 需要我帮你执行嘛?
第二轮对话:是的,请帮我执行这条查询语句
返回结果:请告诉我你需要执行哪条语句?
上面的示例就是多轮对话上下文丢失的问题,这个问题的处理结果很快在deepseek官方文档找到了解决方案:
也就是说,如果需要保持上下文不丢失,那么需要把所有的历史问答全部发给deepseek大模型,这样将带来两个明显的问题:
-
- 过长的对话会导致token使用量上涨很快;
- 应用程序需要自己保存历史问答数据;
结语
未来,MCP 有望成为企业数字化转型的核心枢纽——从“数据搬运工”进化为“智能决策大脑”。期待这一技术组合持续迭代,为开发者带来更极致的体验,为行业树立高可用、高智能的集成范式标杆。
相关文章:

「深度拆解」Spring Boot如何用DeepSeek重构MCP通信层?从线程模型到分布式推理的架构进化
什么是MCP? MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源、工具及系统提供统一的交互接口,被…...
如何避免在前端项目中出现重复的第三方依赖包?
在现代前端开发中,**重复的第三方依赖包(Duplicate Dependencies)**是导致项目体积膨胀、加载速度变慢、构建时间延长的常见问题。尤其在使用模块打包工具(如 Webpack、Vite、Rollup)时,若项目或其依赖的库…...
Java开发中复用公共SQL的方法
在一次Java后端开发的面试中,面试官问了我一个问题:“你在写代码时会复用公共SQL吗?如果会的话,能详细介绍一下你是如何实现的吗?”这个问题让我眼前一亮,因为在实际项目中,SQL复用确实是一个非…...

【西门子杯工业嵌入式-2-点亮一颗LED】
西门子杯工业嵌入式-2-点亮一颗LED 一、课程回顾与目标1.上节课内容回顾2.本节课目标 二、硬件连接与原理1. 硬件连接方式2. 连接实例 三、GPIO原理知识1. GPIO结构2. 推挽输出模式原理 四、软件实现步骤1. 项目结构设置2. 函数定义3. led.c 文件编写初始化函数 led_init交替闪…...

代码随想录算法训练营第60期第五十五天打卡
大家好,我们今天继续我们图论的部分,其实我们昨天是主要讲解了深搜与广搜的理论基础,我们大体上了解了两种算法的差异与适用情景,今天我们就继续我们的图论的章节,以后几天的题目是图论中比较有名的问题叫做岛屿问题&a…...

重磅更新! 基于Gemini 2.5 Pro打造的AI智能体PlantUML-X上线!
目录 图表绘制AI智能体PlantUML-X上线通过简单的提示词创建各种UML图:轻松搞定其它类型的技术图表: AI智能体PlantUML-X功能实测画一个在Java中的一个简单的用户登录功能的时序图效果展示:根据详细内容生成系统架构图效果展示:效果…...

[5-02-04].第01节:Jmeter环境搭建:
JMeter笔记大纲 Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量 一、JMeter概述: 1.1.JMeter是什么: JMeter是Appache组织使用java开发的一款测试工具 可以用于对服务器、网络或对象模拟巨大的负载…...

AI智能推荐实战之RunnableParallel并行链
导读:在现代AI应用开发中,如何高效处理多维度数据分析始终是开发者面临的核心挑战。当您需要同时进行情感分析、关键词提取和实体识别,或者要对比多个AI模型的输出结果时,传统的串行处理方式往往效率低下。 本文将深入解析LangCha…...
windows server2019 不成功的部署docker经历
由于现场网络限制,需要将docker 容器部署到windows-server 2019上 1.在windows server 2019上安装 docker-desktop,貌似内核版本太低,无法安装,g 然后曲线救国,window server 2019安装docker,折腾了半天,貌…...

Gemini开源项目DeepResearch:基于LangGraph的智能研究代理技术原理与实现
引言 在人工智能快速发展的今天,如何构建一个能够进行深度研究、自主学习和迭代优化的AI系统成为了技术前沿的重要课题。Gemini开源的DeepResearch一周收获7.9k Star,Google的开源项目Gemini DeepResearch技术通过结合LangGraph框架和Gemini大语言模型&…...
React状态管理Context API + useReducer
在 React 中,Context API useReducer 是一种轻量级的状态管理方案,适合中小型应用或需要跨组件共享复杂状态的场景。它避免了 Redux 的繁琐配置,同时提供了清晰的状态更新逻辑。 1. 基本使用步骤 (1) 定义 Reducer 类似于 Redux 的 reduce…...
【无标题】路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华
路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华 一、以色列路径着色模型的根本局限 mermaid graph TB A[以色列路径着色模型] --> B[强连通约束] A --> C[仅实边三角剖分] A --> D[静态色彩分配] B --> E[无法描述非相邻关系] C --> F[忽…...

Doris Catalog 联邦分析查询性能优化:从排查到优化的完整指南
在大数据分析中,Doris 的 Catalog 联邦分析功能为整合多源数据提供了有力支持。然而,在实际应用中,可能会遇到各种问题影响其正常运行。本文将详细剖析这些问题并提供解决方案。 一、联邦分析查询慢:内外表通用排查逻辑 当遇到 …...

01 Deep learning神经网络的编程基础 二分类--吴恩达
二分类 1. 核心定义 二分类任务是监督学习中最基础的问题类型,其目标是将样本划分为两个互斥类别。设样本特征空间为 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn,输出空间为 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1},学习目标为…...

视频自动化分割方案:支持按时间与段数拆分
在日常视频处理任务中,如何快速将一个较长的视频文件按照指定规则拆分为多个片段,是许多用户都会遇到的问题。尤其对于需要批量处理视频的开发者、自媒体运营者或内容创作者来说,手动剪辑不仅效率低下,还容易出错。这是一款绿色免…...
Open SSL 3.0相关知识以及源码流程分析
Open SSL 3.0相关知识以及源码流程分析 编译 windows环境编译1、工具安装 安装安装perl脚本解释器、安装nasm汇编器(添加到环境变量)、Visual Studio编译工具 安装dmake ppm install dmake # 需要过墙2、开始编译 # 1、找到Visual Studio命令行编译工具目录 或者菜单栏直接…...

股指期货合约价值怎么算?
股指期货合约价值就是你买一手股指期货合约,理论上值多少钱。这个价值是根据期货的价格和合约乘数来计算的。就好比你买了一斤苹果,价格是5块钱一斤,那你买一斤就得付5块钱。股指期货也是一样,只不过它的计算稍微复杂一点点。 一…...

【QT】使用QT帮助手册找控件样式
选择帮助—》输入stylesheet(小写)—》选择stylesheet—》右侧选择Qt Style Sheets Reference 2.使用CtrlF—》输入要搜索的控件—》点击Customizing QScrollBar 3.显示参考样式表–》即可放入QT-designer的样式表中...

计算机网络(5)——数据链路层
1.概述 数据链路层负责一套链路上从一个节点向另一个物理链路直接相连的相邻节点传输数据报。换言之,主要解决相邻节点间的可靠数据传输 节点(nodes):路由器和主机 链路(links):连接相邻节点的通信信道 2.数据链路层服务 2.1 组帧 组帧(fra…...

VuePress完美整合Toast消息提示
VuePress 整合 Vue-Toastification 插件笔记 记录如何在 VuePress 项目中整合使用 vue-toastification 插件,实现优雅的消息提示。 一、安装依赖 npm install vue-toastification或者使用 yarn: yarn add vue-toastification二、配置 VuePress 客户端增…...
JVM 调优参数详解与实践
JVM 是 Java 程序性能的关键,合理的调优可以显著提升系统稳定性和吞吐量。本文将从基础参数出发,结合线上生产实践,对常用调优参数进行深入剖析与实战分享。 一、JVM内存结构概览 在进行JVM参数调优前,了解JVM内存结构非常关键 堆内存(Heap):用于存储对象,是GC主要处理…...

adb 连不上真机设备问题汇总
问题一、无法弹出 adb 调试授权弹窗 详细描述: 开发者选项中已打开 usb 调试,仅充电模式下 usb 调试也已打开,电脑通过 usb 连上手机后,一直弹出 adb 调试授权弹窗,尝试取消授权再次连接,还是无法弹出问题…...

[yolov11改进系列]基于yolov11引入注意力机制SENetV1或者SENetV2的python源码+训练源码
本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型Q,而是一个可以和现有的任何一个模型相结合的模块(可以看作是一种…...

鸿蒙仓颉语言开发实战教程:商城搜索页
大家好,今天要分享的是仓颉语言商城应用的搜索页。 搜索页的内容比较多,都有点密集恐惧症了,不过我们可以从上至下将它拆分开来,逐一击破。 导航栏 搜索页的的最顶部是导航栏,由返回按钮和搜索框两部分组成,比较简单…...
上门服务小程序会员系统框架设计
逻辑分析 会员注册与登录:用户需要能够通过小程序进行会员注册,提供必要信息如手机号码、密码等,注册成功后可登录系统。会员信息管理:包括会员基本信息(姓名、联系方式等)的修改、查看,同时可能…...

图像去雾数据集总汇
自然去雾数据集 部分的数据清洗可以看这里:图像去雾数据集的下载和预处理操作 RESIDE-IN 将ITS作为训练集,SOTSindoor作为测试集。训练集13990对,验证集500对。 目前室内sota常用,最高已经卷到PSNR-42.72 最初应该是dehazefo…...
小程序引入deepseek
首先需要申请key: 地址 deepseek文档地址 使用wx.request获取数据 const task wx.request({url: https://api.deepseek.com/chat/completions,method: POST,responseType: text,headers: {Content-Type: application/json,Authorization: Bearer YOUR_API_KEY},dataType: te…...

网络攻防技术十四:入侵检测与网络欺骗
文章目录 一、入侵检测概述二、入侵系统的分类三、入侵检测的分析方法1、特征检测(滥用检测、误用检测)2、异常检测 四、Snort入侵检测系统五、网络欺诈技术1、蜜罐2、蜜网3、网络欺骗防御 六、简答题1. 入侵检测系统对防火墙的安全弥补作用主要体现在哪…...

C++笔记-C++11(一)
1.C11的发展历史 C11 是 C 的第⼆个主要版本,并且是从 C98 起的最重要更新。它引⼊了⼤量更改,标准化了既有实践,并改进了对 C 程序员可⽤的抽象。在它最终由 ISO 在 2011 年 8 ⽉ 12 ⽇采纳前,⼈们曾使⽤名称“C0x”,…...

JVM 类初始化和类加载 详解
类初始化和类加载 类加载的时机 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始(懒解析)&am…...