MCP Server多节点滚动升级一致性治理
飞书云文档原链接地址:https://ik3te1knhq.feishu.cn/wiki/W8ctwG2sAiPkrXkpl7ocP0g0njf
[!TIP]
MCP Server 多节点部署时,滚动发布,MCP Client 侧使用的 Client 连接保证使用的是最新的工具配置信息
- 后续推进:按比例使用旧、新实例
给社区贡献代码:https://github.com/alibaba/spring-ai-alibaba/pull/837
example 示例贡献代码:https://github.com/springaialibaba/spring-ai-alibaba-examples/pull/185
Nacos 新增命名空间
- 命名空间名称:nacos-default-mcp
- 命名空格 ID:9ba5f1aa-b37d-493b-9057-72918a40ef35
Mcp server 端 yml
spring:_ _ai:mcp:server:name: mcp-server-providerversion: 1.0.1
_ sse-message-endpoint: /mcp/messages_
_ _type: _SYNC_
_ _alibaba:mcp:nacos:enabled: trueservice-namespace: 9ba5f1aa-b37d-493b-9057-72918a40ef35server-addr: 127.0.0.1:8848username: nacospassword: nacos
上面主要关注两个配置:
- 服务名称:mcp-server-provider
- 服务的命名空间:注意是填写命名空间 ID,9ba5f1aa-b37d-493b-9057-72918a40ef35
Mcp Server 端侧实际工作
- 服务名称修改:MCP Server 服务名称 +“-mcp-service”
- 推送配置管理
Data Id | Group | 配置内容 | |
工具 | 服务名称 + “-mcp-tools.json” | mcp-tools | { "tools" : [ { "name" : "getCiteTimeMethod", "description" : "获取指定时区的时间", "inputSchema" : { "type" : "object", "properties" : { "timeZoneId" : { "type" : "string", "description" : "ime zone id, such as Asia/Shanghai" } }, "required" : [ "timeZoneId" ], "additionalProperties" : false } } ], "toolsMeta" : { "getCiteTimeMethod" : { "enabled" : true } } } |
Mcp Server | 服务名称 + “-mcp-server.json” | mcp-server | { "protocol" : "mcp-sse", "name" : "mcp-server-provider", "description" : "mcp-server-provider", "version" : "1.0.1", "enabled" : true, "remoteServerConfig" : { "serviceRef" : { "namespaceId" : "9ba5f1aa-b37d-493b-9057-72918a40ef35", "groupName" : "mcp-server", "serviceName" : "mcp-server-provider-mcp-service" }, "exportPath" : "/sse" }, "toolsDescriptionRef" : "mcp-server-provider-mcp-tools.json" } |
- 注册 Mcp Server 实例到 Nacos 中,元数据新增字段 server.md5、tools.names
- server.md5:当前实例配置管理的 md5 值
- tools.names:当前实例所配置的工具名称
Mcp Client 侧 yml 文件
spring:
_ _ai:alibaba:mcp:nacos:enabled: trueservice-namespace: 9ba5f1aa-b37d-493b-9057-72918a40ef35server-addr: 127.0.0.1:8848username: nacospassword: nacosclient:sse:connections:server1: mcp-server-provider
上面主要关注配置:
-
命名空间:注意填写 9ba5f1aa-b37d-493b-9057-72918a40ef35,需要在该命名空间中发现 Mcp Server
-
MCP Server 服务名称:mcp-server-provider
-
根据命名规则,自动从 nacos 中获取相关配置
- 服务名称:Mcp Server 服务名称 +“-mcp-service”
- 服务配置管理:Mcp Server 服务名称 + “-mcp-server.json”
- 服务分组:mcp-server
- 工具配置管理:Mcp Server 服务名称 + “-mcp-tool.json”
- 工具分组:mcp-tools
Mcp Client 端侧实际工作
新增三个字段
Map<String, List<String>> md5ToToolsMap
:server.md5 到工具名称列表的映射Map<String, List<McpAsyncClient>> md5ToClientMap
:server.md5 到 Client 到映射Map<String, Integer> client2CountMap
:存储每个 Client 的调用次数
listTools 动作
直接获取 Nacos 中配置文件里的工具信息
nacosConfigService.getConfig(this.serviceName + McpNacosConstant._TOOLS_CONFIG_SUFFIX_, McpNacosConstant._TOOLS_GROUP_, TIME_OUT_MS);
callTool 动作
- 根据工具名称找到对应的 server.md5,判断哪些节点提供该工具
- 由 server.md5 得到对应的 client
- 通过
client2CountMap
选择调用次数最少的 client 发起 callTool 动作
public Mono<McpSchema.CallToolResult> callTool(McpSchema.CallToolRequest callToolRequest) {String toolName = callToolRequest.name();List<McpAsyncClient> aysnClients = new ArrayList<>();md5ToToolsMap.forEach((md5, tools) -> {if (tools.contains(toolName)) {aysnClients.addAll(md5ToClientMap.get(md5));}});Set<String> clientInfos = aysnClients.stream().map(client -> client.getClientInfo().name()).collect(Collectors._toSet_());String minClientInfoName = clientInfos.stream().min(Comparator._comparingInt_(clientInfo ->client2CountMap.getOrDefault(clientInfo, 0))).get();client2CountMap.put(minClientInfoName, client2CountMap.get(minClientInfoName) + 1);McpAsyncClient mcpAsyncClient = aysnClients.stream().filter(aysnClient -> aysnClient.getClientInfo().name().equals(minClientInfoName)).findFirst().get();return mcpAsyncClient.callTool(callToolRequest);
}
动态监听节点上下线
获取其中一个 client 端逻辑
public McpAsyncClient getMcpAsyncClient() {List<McpAsyncClient> aysnClients = getMcpAsyncClientList();if (aysnClients.isEmpty()) {throw new IllegalStateException("No McpAsyncClient available");}// 从client2CountMap中挑选value最小的键是哪个String clientInfoName = client2CountMap.entrySet().stream().min(Map.Entry._comparingByValue_()).map(Map.Entry::getKey).get();client2CountMap.put(clientInfoName, client2CountMap.get(clientInfoName) + 1);// 从clients中找到clientInfoName对应的clientreturn aysnClients.stream().filter(aysnClient -> aysnClient.getClientInfo().name().equals(clientInfoName)).findFirst().get();
}public List<McpAsyncClient> getMcpAsyncClientList() {return md5ToClientMap.values().stream().flatMap(List::stream).toList();
}
效果演示
在 nacos 中注册新的 nacos-default-mcp 命名空间
Mcp Server 端注册注册实例
配置管理的工具、Mcp Server 信息
触发工具
打包 mavn 包
相关文章:
MCP Server多节点滚动升级一致性治理
飞书云文档原链接地址:https://ik3te1knhq.feishu.cn/wiki/W8ctwG2sAiPkrXkpl7ocP0g0njf [!TIP] MCP Server 多节点部署时,滚动发布,MCP Client 侧使用的 Client 连接保证使用的是最新的工具配置信息 后续推进:按比例使用旧、新实…...
多线程(二)
今天先来了解一个上一期的遗留概念 —— 前台线程与后台线程 一 . 前台线程与后台线程 大家应该多多少少都听过酒桌文化,咱们平常吃饭,座位次序是没有那么多讲究的,但是在跟领导吃饭,或者出席宴会和一些重要场所的饭局时&#…...
2025年,大模型LLM还有哪些可研究的方向?
近两年LLM在学术界与工业界的发展大家都有目共睹。到了今年,以预训练LLM为代表的大模型PK上半场已然结束,接下来就要进入下半场大模型2.0时代了。 那么在这新赛道,关于大模型我们还有什么可做的创新?要知道,如今的大模…...
VS打断点调试,无法命中断点或断点失效,解决方法
1.打开需要打断点的模块,点击属性,将C/C常规的调试信息格式改为程序数据库(/Zi) 2.将C/C的优化禁用(/Od) 3.将链接器中的生成调试信息改为生成调试信息(/DEBUG) 注:如果需…...
ELF文件详解
ELF 文件不仅仅是一个格式,它是 Linux 世界中程序的"灵魂容器",承载着程序从编译到执行的整个生命周期。 今天咱们来聊一个看起来高深,实际上理解起来其实挺简单的话题—— ELF 文件。 不知道你有没有想过:我们敲下./…...
【学习笔记】Shell编程---流程控制语句
最近学了好多个流程控制语句,都有点混乱了,赶紧先把各种用法记录下来! if 语句 语法格式: if 条件测试命令串 then 条件为真时执行的命令 else 条件为假时执行的命令 fi 以关键字if开头,后跟条件测试表达式&…...
TensorFlow 常见使用场景及开源项目实例
TensorFlow 常见使用场景及开源项目实例 摘要 本文详细介绍了 TensorFlow 在多个领域的典型应用及其对应的开源项目案例。涵盖了图像处理、自然语言处理、语音音频处理、推荐系统与时间序列预测、移动端与边缘计算以及生成式模型与创意应用等多方面内容,列举了大量…...
王炸组合!STL-VMD二次分解 + Informer-LSTM 并行预测模型
往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…...
OpenCV进阶操作:风格迁移以及DNN模块解析
文章目录 前言一、风格迁移1、风格迁移是什么?2、步骤1)训练2)迁移 二、DNN模块1、什么是DNN模块2、DNN模块特点3、流程图4、图像预处理功能 三、案例实现1、数据预处理2、加载模型 总结 前言 风格迁移(Style Transfer࿰…...
使用bitNet架构
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置二、报错总结 前言 大型语言模型(LLM)面临的挑战:高能耗、高内存需求、部署门槛高。 微软提出 BitNet 架构&#x…...
OpenCV中的光流估计方法详解
文章目录 一、引言二、核心算法原理1. 光流法基本概念2. 算法实现步骤 三、代码实现详解1. 初始化设置2. 特征点检测3. 光流计算与轨迹绘制 四、实际应用效果五、优化方向六、结语 一、引言 在计算机视觉领域,运动目标跟踪是一个重要的研究方向,广泛应用…...
Java集合框架详解与使用场景示例
Java集合框架是Java标准库中一组用于存储和操作数据的接口和类。它提供了多种数据结构,每种数据结构都有其特定的用途和性能特点。在本文中,我们将详细介绍Java集合框架的主要组成部分:List、Set和Queue,并通过代码示例展示它们的…...
多模态融合【十九】——MRFS: Mutually Reinforcing Image Fusion and Segmentation
目录 一.摘要 二.Introduction 三. 背景与动机 四.方法 4.1. 概述 4.2. IGM-Att模块 4.3. PC-Att模块 4.4. 任务头 五.实验 5.1. 数据集与实现细节 5.2. 语义分割 5.3. 图像融合 5.4. 消融研究 5.5. IGM-Att和PC-Att的应用增益 5.6. 复杂度讨论 5.7. 目标检测的…...
音频转文字-在线工具包及使用记录
资料来源:https://zhuanlan.zhihu.com/p/269603431(多种方案) 视频教程:https://www.youtube.com/watch?vL1H5ov4WTBg https://github.com/openai/whisper // 创建虚拟环境 python -m venv myvnev// 激活虚拟环境 source myvne…...
集合-进阶
Collection collection的遍历方式 迭代器遍历 不依赖索引 import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class mycollection {public static void main(String[] args) {//1.创建集合并添加元素Collection<String> co…...
【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法
零、前言 目前正在使用的Ubuntu服务器中,仅阿里云(不止一台)出现了这个问题,因此我判定是阿里云服务器独有的问题。如果你的服务器提供商不是阿里云,那么这篇文章可能对你没有帮助。 如果已经因为升级错误导致依赖冲突…...
wpf DataGrid 行选择 命令绑定
在WPF中实现DataGrid行选择与命令绑定的MVVM模式,可通过以下方式结合代码示例实现: 1. 基础绑定与命令触发(SelectionChanged事件绑定) 通过Interaction.Triggers捕获SelectionChanged事件,并绑定到ViewModel中的命令: <DataGrid ItemsSource="{Binding I…...
【认知思维】验证性偏差:认知陷阱的识别与克服
什么是验证性偏差 验证性偏差(Confirmation Bias)是人类认知中最普遍、最根深蒂固的心理现象之一,指的是人们倾向于寻找、解释、偏爱和回忆那些能够确认自己已有信念或假设的信息,同时忽视或贬低与之相矛盾的证据。这种认知偏差影…...
大容量存储的高性能 T-BOX 方案对智能网联汽车的支撑
在智能网联汽车快速发展的当下,车载 T-BOX(Telematics Box)作为车辆与云端互联的核心枢纽,其性能和可靠性直接决定了用户体验的上限。米客方德(MK)推出的基于 STM32H7RX 主控芯片与 MKDV4GIL-AST࿰…...
Linux 内核网络协议栈:从 Socket 类型到协议注册的深度解析
Linux 内核的网络协议栈是一个复杂而高效的体系,涉及多层次的协议处理与数据流转。本文通过分析核心数据结构(如 inetsw 数组、sock_type 枚举)和关键函数(如 inet_add_protocol),深入探讨其工作原理与设计哲学。 一、Socket 类型与 sock_type 枚举 1.1 Socket 类型的定…...
vim,gcc/g++,makefile,cmake
一、vim:你的小帮手——文本编辑器 它是干嘛的? 想象你的代码就像是写在一本“程序的笔记本”里,vim就是一个超级厉害的“数字笔记本”或“文字编辑器”。 它有什么用? 编写代码:编辑、修改你的源代码代码高亮&…...
解决 CentOS 7 镜像源无法访问的问题
在国内使用 CentOS 系统时,经常会遇到镜像源无法访问或者下载速度慢的问题。尤其是默认的 CentOS 镜像源通常是国外的,如果你的网络环境无法直接访问国外服务器,就会出现无法下载包的情况。本文将介绍如何修改 CentOS 7 的镜像源为国内镜像源…...
“傅里叶变换算法”来检测货物外形损坏
“傅里叶变换算法”来检测货物外形损坏 要使用傅里叶变换算法来检测货物外形损坏,首先需要理解基本概念。傅里叶变换是一种数学变换,用于将信号从时域(或空间域)转换到频域。在图像处理中,二维傅里叶变换可以用来分析…...
python打卡day24
可迭代对象、OS模块 知识点回顾: 元组可迭代对象os模块 作业:对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径 1.元组 在day3的打卡内容中就介绍了元组,跟列表比起来就是用了圆括号,有序可以重复&#x…...
MapReduce 入门实战:WordCount 程序
一、引言 在大数据处理领域,MapReduce 是一种开创性的编程模型和处理框架,它使得我们能够高效地在大规模分布式系统上处理海量数据。而 WordCount 程序作为 MapReduce 的经典入门案例,堪称大数据领域的 “Hello World”,帮助无数…...
深度剖析:Vue2 项目兼容第三方库模块格式的终极解决方案
当我们为 Vue2 项目引入某些现代 JavaScript 库时,常常会遇到这样的报错: error in ./node_modules/some-lib/lib/index.mjs Cant import the named export xxx from non EcmaScript module这类问题的本质是模块格式的世纪之争 —— ES Moduleÿ…...
5.11作业
拓扑图: 需求分析: 要求五台路由器的环回地址均可以相互访问 配置: r1 int g 0/0/0 i…...
MyBatis 批量新增与删除功能完整教程
一、功能概述 通过 MyBatis 动态 SQL 实现以下功能: 批量新增:一次性插入多条员工记录,支持自增主键回填。批量删除:根据 ID 数组一次性删除多条记录。二、代码逐行解析 1. Mapper 接口定义 // 批量新增:传入员工对象集合 void insertAll(List<Emp> empList);// …...
Spark,RDD中的行动算子
RDD中的行动算子 collect算子 格式:def collect(): Array[T] 参数说明:该算子没有参数。 并以数组的形式返回 统计个数 reduce算子 格式:def reduce(func: (T, T) > T): T 返回值:返回一个单一的值,其类型与…...
Linux:进程控制2
一:进程程序替换 1. 一旦程序替换成功,就去执行新代码了,原始代码的后半部分已经不存在了 2. exec*系列的函数,没有成功返回值,只有失败返回值-1 在程序替换的过程中,并没有创建新的进程,只是…...
Java jar包程序 启动停止脚本 shell bash
启动 启动时 可指定前缀(名称) start.sh #!/bin/bash # 使用时直接运行# 寻找当前目录下后缀为 .jar 的文件 #options($(find . -maxdepth 1 -type f -name "*.jar")) # 寻找当前目录下后缀为 .jar 的文件,并按时间倒序排序 opt…...
【Linux】进程通信 管道
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、👑进程间通信分类 二、👑管道 🌟什么是管道? 🌟匿名管道 🎉原理: 🔥站在文件描述…...
基于智能家居项目 解析DHT11温湿度传感器
一、模块简介 DHT11 是一款数字式温湿度传感器,内部集成了温度传感元件、湿度传感元件以及一个 8 位单片机芯片,用于采集数据和通信。。 测量范围:湿度 20%~90% RH,温度 0~50℃ 精度:湿度 5% …...
3.1 泰勒公式出发点
第一步:引入背景与动机 首先,泰勒公式(Taylor Series)是数学分析中的一个重要工具,它允许我们将复杂的函数近似为多项式形式。这不仅简化了计算,还帮助我们更好地理解函数的行为。那么为什么我们需要这样一…...
裸机开发的核心技术:轮询、中断与DMA
一、裸机开发的核心技术:轮询、中断与DMA 1. 轮询(Polling) 定义:程序主动、周期性地检查硬件状态或数据。应用场景:适用于简单、实时性要求不高的任务。示例: C while (1) { if (GPIO_ReadPin(SENSOR_P…...
从零开始:使用 Vue-ECharts 实现数据可视化图表功能
目录 前言为什么选择 Vue-ECharts案例:Vue-Echart开发一个分组柱状图 安装依赖 引入 全局引入 按需引入编写组件总结 前言 你好,小二!很高兴你愿意分享关于 Vue-ECharts 的使用经验。 📊 Vue-ECharts:让你在 Vue 项…...
Antd中Form详解:
1.获取Form表单值的方式: ① 使用Form.useForm()钩子(推荐方式) const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...
(2)python开发经验
文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 pyside6加载ui文件 方法1: 直接加载ui文件 from PySide6.QtWidgets import QAp…...
Landsat 5介绍
USGS Landsat 5 Level 2, Collection 2, Tier 1 数据集可用性:1984-03-16T16:18:01Z–2012-05-05T17:54:06Z 数据集提供程序 USGS Earth Engine 代码段 ee.ImageCollection("LANDSAT/LT05/C02/T1_L2") open_in_new 重新访问间隔:16 天 说…...
PowerShell 实现 conda 懒加载
问题 执行命令conda init powershell会在 profile.ps1中添加conda初始化的命令。 即使用户不需要用到conda,也会初始化conda环境,拖慢PowerShell的启动速度。 解决方案 本文展示了如何实现conda的懒加载,默认不加载conda环境,只…...
解锁ozon运营新路径:自养号测评技术如何实现降本增效
OZON测评自养号技术在跨境电商运营中具有显著的技术优势,主要体现在环境安全、账号控制、成本效率及风险规避等方面。以下是具体分析: 一:安全可控的测评环境搭建通过模拟俄罗斯本地物理环境和家庭住宅IP,自养号测评可规避平台风…...
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
654. 最大二叉树 题目 思路与解法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def constructMaximumB…...
Spring Boot 的自动配置为 Spring MVC 做了哪些事情?
Spring Boot 的自动配置为 Spring MVC 做了大量的工作,极大的简化了我们开发时的配置负担,我们可以快速启动并运行一个基于 Spring MVC 的 Web 应用。以下是 Spring Boot 自动配置为 Spring MVC 所做的主要事情: DispatcherServlet 的自动注册…...
【python】—conda新建python3.11的环境报错
1.报错 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…...
桑德拉精神与开源链动2+1模式AI智能名片S2B2C商城小程序的协同价值研究
摘要:本文深入剖析桑德拉无私奉献精神在商业领域的映射价值,结合开源链动21模式、AI智能名片及S2B2C商城小程序的技术特性,系统探讨其在用户赋能、资源协同与价值共创中的协同效应。研究表明,该技术组合通过去中心化激励、智能需求…...
JavaEE--初识网络
目录 一、IP地址 二、端口号 三、认识协议 四、五元组 五、协议分层 1. OSI七层模型 2. TCP/IP五层(或四层)模型 3. 网络设备所在分层 4. 封装和分用 一、IP地址 IP地址(Internet Protocol Address)是用于标识设备在网络…...
2.7/Q2,Charls最新文章解读
文章题目:Climate risks, multi-tier medical insurance systems, and health inequality: evidence from Chinas middle-aged and elderly populations DOI:10.1186/s12913-025-12648-2 中文标题:气候风险、多层次医疗保险制度和健康不平等—…...
Mac显卡的工作原理及特殊之处
目录 🧠 一、显卡的基本工作原理(适用于所有平台) 🍏 二、Mac 显卡的工作机制 1. Mac 使用的显卡类型 Intel 架构时代(Intel CPU Intel/AMD 显卡) Apple Silicon 时代(M1/M2/M3 芯片&…...
MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置
视频讲解: MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核,脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning ,有需要可以自行clon…...
flink的TaskManager 内存模型
Flink TaskManager 的内存模型是一个多层管理体系,从 JVM 进程到具体任务的内存分配均有明确的逻辑划分和配置策略。以下是其核心构成及运行机制: 一、内存模型总览 TaskManager 内存整体分为 JVM 特有内存 和 Flink 管理内存 两大层级&…...