Apache ShardingSphere 数据分片实战:从核心原理到避坑指南
1. 项目概述与核心价值最近几年数据分片Sharding和分布式数据库中间件成了不少中大型项目绕不开的话题。我自己在几个从零到一的项目里深度用了一段时间 Apache ShardingSphere从最初的选型调研、到核心业务的数据分片落地、再到后期遇到的各种“惊喜”积累了一手还算热乎的经验和教训。这个系列笔记我就打算把这些实战中摸爬滚打出来的东西掰开揉碎了讲讲重点不是复述官方文档而是文档里不会写、或者一笔带过但实际能让你少加几天班的关键细节。ShardingSphere 本质上是一个生态它提供了数据分片、分布式事务、数据库治理等能力。对于大多数开发者而言最先接触和最核心的肯定是它的数据分片功能。简单说就是帮你把一张逻辑上的大表按照你设定的规则比如按用户ID取模透明地分散到后端的多个物理数据库或表中去应用程序像操作单表一样写SQL中间件帮你搞定路由、改写、归并这些脏活累活。听起来很美对吧但“透明”这两个字背后藏着无数的配置项、边界条件和性能陷阱。我这第一篇笔记就先从宏观的经验和那些让我踩到坑里的地方说起希望能帮你建立一个更立体的认知知道在什么场景下该用、怎么用、以及用的时候眼睛得盯着哪儿。2. 核心设计思路与选型考量2.1 为什么是 ShardingSphere场景驱动下的技术选型技术选型从来不是看哪个名气大就用哪个而是要看它是否匹配你的业务场景和技术栈。ShardingSphere 有两个主要的接入形态ShardingSphere-JDBC和ShardingSphere-Proxy。这俩的区别直接决定了你的架构模式和运维复杂度。ShardingSphere-JDBC定位是一个轻量级的 Java 框架它通过重写 JDBC 驱动在应用层直接完成 SQL 的解析、改写、路由和执行结果归并。它的优势是性能损耗极低因为网络开销只存在于应用与真实数据库之间没有额外的代理跳转。但代价是它对应用有侵入性需要引入特定依赖并且分片逻辑的配置是跟随应用的一旦修改通常需要重启应用。如果你的团队以 Java 技术栈为主对性能要求苛刻且能接受配置与应用绑定那么 JDBC 模式是首选。ShardingSphere-Proxy则是一个独立部署的数据库代理服务它对外伪装成 MySQL/PostgreSQL 等数据库应用像连接普通数据库一样连接它。它的最大优势在于对应用透明任何支持标准数据库协议的应用无论什么语言都可以直接使用。同时分片规则、数据源管理等配置可以在 Proxy 端独立运维和动态更新不影响应用。但缺点也很明显多了一层网络转发性能会有一定损耗同时你需要额外维护一个高可用的 Proxy 集群增加了运维成本。我的经验对于全新的、以 Java 为核心的微服务项目我倾向于直接用 ShardingSphere-JDBC。它的性能优势在数据量增长后非常明显而且与 Spring Boot 等框架集成非常丝滑。而对于历史遗留系统改造或者技术栈异构比如同时有 Java, Go, PHP 应用要访问同一个分片库的场景ShardingSphere-Proxy 提供的“数据库协议兼容性”是无可替代的价值哪怕牺牲一点性能。2.2 分片键设计一切故事的起点决定使用分片后第一个也是最关键的设计决策就是用什么字段作为分片键Sharding Key。这个选择几乎决定了整个分片方案的成败。一个理想的分片键需要满足几个条件数据分布均匀、查询携带率高、值相对稳定。最常见的候选是业务主键比如用户IDuser_id、订单IDorder_id。以user_id为例按它取模分片可以保证用户数据基本均匀分布并且绝大多数围绕用户的查询查某个用户的信息、订单都能精准定位到一个分片避免全库扫描。但这里有一个巨大的坑多维度查询。比如你的业务不仅要按user_id查运营还需要按商户IDmerchant_id来查账。如果你只按user_id分片那么按merchant_id的查询就会变成广播查询在所有分片上执行性能灾难。解决方案通常有几种冗余表建立以merchant_id为分片键的商户维度表数据通过 Binlog 同步等方式冗余一份。基因法在生成 ID 时将一部分分片信息如商户ID的哈希值嵌入到主键中但实现复杂。使用复合分片键ShardingSphere 支持基于多个字段进行分片路由但这通常需要自定义复杂的分片算法。踩坑实录我们有一个订单表最初天真地只按order_id雪花算法生成取模分片。后来做促销活动分析需要频繁按activity_id查询订单直接导致数据库 CPU 飙升。最后是通过“异步双写”到另一个按activity_id分片的 ES 索引中来解决的。教训就是分片键设计必须与核心查询模式对齐在项目初期就要和业务、产品充分沟通未来的数据使用方式。2.3 分片算法选择不仅仅是取模选定分片键后就要决定数据怎么分布这就是分片算法。很多人第一反应就是分片键 % 分片总数。这个算法简单有效但有两个致命弱点扩容麻烦和数据倾斜。扩容麻烦一旦增加分片数量取模结果全变需要做全量数据迁移这在生产环境几乎是不可接受的。数据倾斜如果分片键本身分布不均匀比如某些用户是超级用户产生海量数据取模也无法解决分布不均的问题。因此在实际生产中更推荐使用一致性哈希算法或者 ShardingSphere 内置的COSID_MOD、HASH_MOD等算法。以一致性哈希为例它构建一个哈希环节点分片和数据都映射到环上数据顺时针找到的第一个节点即为其归属。这样在扩容时只有环上相邻部分的数据需要迁移大大减少了数据移动量。# 示例使用行表达式 取模算法简单场景 shardingAlgorithms: table-inline-mod: type: INLINE props: algorithm-expression: t_order_${order_id % 4} # 分4张表# 示例使用COSID_MOD算法推荐易于扩容 shardingAlgorithms: table-cosid-mod: type: COSID_MOD props: mod: 16 # 分片数 logic-name-prefix: t_order_注意事项算法选择不是一劳永逸的。即使使用了一致性哈希也要监控每个分片的数据量和访问量。我们曾遇到因为某个分片键范围某个时间段的注册用户特别活跃导致单个分片负载远高于其他分片。这时就需要结合业务考虑是否引入“热点分片”的特殊处理或者调整分片键例如引入时间维度组成复合分片键。3. 配置详解与核心功能实战3.1 数据源与规则配置YAML 里的魔鬼细节ShardingSphere 的配置核心在 YAML 文件里这里每一步都关乎稳定性和性能。我以最常用的 ShardingSphere-JDBC Spring Boot 为例。首先数据源配置。你需要定义真实的数据源actualDataSources并配置连接池参数。这里最容易忽略的是连接池的配置要与分片场景匹配。因为一个逻辑数据源背后对应多个物理库如果连接池设置过小在高并发下很容易耗尽。spring: shardingsphere: datasource: names: ds0, ds1 # 逻辑数据源名称 ds0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://db-host-0:3306/db0?useSSLfalseserverTimezoneUTC username: root password: 123456 # 关键连接池配置需要放大 hikari: maximum-pool-size: 20 # 每个物理库的连接池大小 minimum-idle: 10 connection-timeout: 30000 ds1: # ... 类似配置 rules: sharding: tables: t_order: # 逻辑表名 actualDataNodes: ds${0..1}.t_order_${0..3} # 真实节点两个库每个库4张表 databaseStrategy: # 库分片策略 standard: shardingColumn: user_id shardingAlgorithmName: database-inline-hash tableStrategy: # 表分片策略 standard: shardingColumn: order_id shardingAlgorithmName: table-cosid-mod shardingAlgorithms: database-inline-hash: type: HASH_MOD props: sharding-count: 2 # 分2个库 table-cosid-mod: type: COSID_MOD props: mod: 4 # 每个库分4张表 logic-name-prefix: t_order_关键点解析actualDataNodes: 这是定义物理位置的表达式。ds${0..1}.t_order_${0..3}表示数据分布在ds0和ds1两个库每个库下有t_order_0到t_order_3共四张表。这个表达式必须和你的分片算法结果严格对应。分片策略分离databaseStrategy和tableStrategy是分开配置的这允许你先按库分再在库内按表分实现两级分片。这对于超大规模数据非常有用。广播表与绑定表配置里没体现但极其重要。像字典表、配置表这种需要所有分片都有一份完整数据的小表应该配置为broadcast-table。而像订单表(t_order)和订单明细表(t_order_item)如果它们总是以相同的条件如order_id进行关联查询就必须配置为binding-tables这样关联查询时ShardingSphere 才能将 SQL 正确路由到同一个分片子集上执行避免笛卡尔积关联带来的性能灾难。3.2 SQL 支持度与方言适配那些“不支持”的语句ShardingSphere 并非支持所有 SQL 语句。它在解析 SQL 后需要将其改写为能在真实分片上执行的语句这限制了一些复杂语法的使用。常见的不支持或有限支持场景跨库关联查询如果关联的表不是绑定表且关联键不是分片键那么查询会退化为笛卡尔积查询每个分片都和另一个表的所有分片关联性能极差。官方通常建议避免这种操作或通过业务冗余、分布式查询引擎如 Presto来解决。子查询部分复杂的子查询特别是关联子查询可能无法正确解析和改写。尽量在应用层拆解为多次查询或者使用 JOIN 重写。分布式事务涉及多个物理数据库的写操作需要开启分布式事务。ShardingSphere 支持 XA如 Atomikos和 BASESeata两种模式。XA 保证强一致但性能差BASE 性能好但最终一致。选择哪种取决于你的业务对一致性的要求。分页排序LIMIT 100, 10这种分页在分片场景下并不是简单的每个分片取10条然后合并。ShardingSphere 需要从每个分片获取100 10条数据在内存中排序后再取出正确的10条。当偏移量 (offset) 非常大时内存消耗和性能会急剧下降。对于深度分页建议使用WHERE id ? LIMIT 10这类“上一页最大值”的条件查询来优化。实操心得在上线前一定要用你的业务 SQL 全集做一轮完整的测试。我们曾经因为一个报表系统中使用了WITH RECURSIVE(CTE) 语句而踩坑ShardingSphere 当时不支持导致整个报表查询失败。最后是通过将这个复杂查询下推到某个特定的不分片数据库通过 Hint 强制路由来临时解决的。所以制作一个 SQL 兼容性检查清单是上线前必不可少的一步。3.3 分布式主键与数据迁移方案分片后数据库自增主键就不可用了因为每个分片都会自己生成必然冲突。ShardingSphere 提供了分布式主键生成器默认是雪花算法Snowflake。你需要关注几点机器ID配置确保每个应用实例的worker-id不同否则会生成重复ID。在生产环境通常通过中心化的配置服务如 ZooKeeper, Nacos或利用机器IP来分配。时钟回拨问题雪花算法严重依赖系统时钟。如果服务器时钟发生回拨可能导致 ID 重复。ShardingSphere 的雪花算法提供了一定的容忍策略但最根本的还是要保证服务器时间的同步使用 NTP。当分片数量需要增加时扩容就涉及到数据迁移。这是一个严肃的运维操作。常见的方案有停机迁移简单粗暴在业务低峰期停机用数据同步工具如 mysqldump 同步或 ShardingSphere-Scaling将数据重新分布到新的分片结构中然后修改应用配置并重启。适用于可接受短暂停机的业务。双写迁移在迁移期间所有写操作同时写入旧分片和新分片。通过一个迁移程序逐步将历史数据从旧分片同步到新分片并校验一致性。待数据完全同步且追平后将读操作切到新分片观察无误后停止旧分片写入。这是目前最主流的平滑迁移方案但对应用改造有一定要求。4. 性能调优与监控告警4.1 连接池与线程池配置如前所述分片后一个逻辑连接背后对应多个物理连接。假设你配置了2库4表那么一次查询最多可能同时打开 2 * 4 8 个物理连接。因此必须调大应用连接池的最大连接数。公式可以粗略估算为最大连接数 ≈ (物理库数量 * 每个库下最大可能并行访问的表数量) * 并发系数。同时也要关注数据库服务器本身的max_connections参数是否足够。ShardingSphere 内部也有执行引擎会使用线程池来并行执行分发到各分片的 SQL。在sql-show: true的配置下你可以看到它是否真正并行执行了。如果发现复杂查询变慢可以尝试调整executor-size参数默认为 CPU 核数但不宜设置过大避免线程上下文切换开销。4.2 慢查询与全路由查询监控这是运维的重中之重。你需要密切关注两种类型的 SQL逻辑慢查询即使每个分片上的 SQL 执行都快但归并过程尤其是内存排序、聚合可能很慢。需要通过 ShardingSphere 的sql-show和慢查询日志来抓取。全路由查询即那些因为缺少分片键或者分片键值为 IN 列表过长等原因导致需要广播到所有分片执行的查询。这类查询是性能杀手。必须通过日志或监控系统将其识别出来推动业务改造或增加缓存。建议的监控项每个逻辑数据源的 QPS、平均响应时间、错误率。慢 SQL 日志记录逻辑 SQL 和执行时间。全路由 SQL 的频次和影响。连接池活跃连接数、空闲连接数、等待连接数。4.3 常见问题排查清单下表整理了一些典型问题现象和排查思路现象可能原因排查步骤插入/更新数据失败提示主键冲突1. 分布式主键生成器配置错误如worker-id重复2. 时钟回拨导致雪花ID重复3. 业务代码自己设置了主键与生成器冲突1. 检查应用实例的spring.shardingsphere.rules.sharding.key-generators配置。2. 检查服务器时间同步状态。3. 检查插入的SQL或Entity是否手动设置了ID。查询结果不正确多数据或少数据1. 分片算法配置错误导致数据路由到错误分片。2. 绑定表配置缺失导致关联查询产生笛卡尔积。3. 分页查询偏移量大内存归并出错。1. 开启sql-show: true查看SQL实际被路由到了哪些真实数据节点。2. 检查关联查询涉及的表是否配置为binding-tables。3. 检查分页查询逻辑考虑用其他方式优化深度分页。查询性能突然下降1. 产生了全路由查询如不带分片键的查询。2. 某个分片成为热点负载过高。3. 数据库连接池耗尽。1. 分析慢查询日志找到具体的慢SQL。2. 监控各个物理数据库的CPU、IO、连接数。3. 检查应用和数据库的连接池配置。应用启动失败报数据源或规则配置错误1. YAML配置文件语法错误。2. 实际数据库或表不存在。3. 依赖的JDBC驱动版本不兼容。1. 使用YAML校验工具检查配置文件。2. 确认actualDataNodes指向的数据库和表都已创建。3. 检查pom.xml或build.gradle中 ShardingSphere 和数据库驱动的版本兼容性。5. 进阶话题与未来演进思考5.1 读写分离与数据加密整合ShardingSphere 不仅能分片还能轻松集成读写分离。你可以配置一个主库写库和多个从库读库由中间件自动将写操作路由到主库读操作根据负载均衡策略如轮询、随机路由到从库。这在高读低写的场景下能有效提升吞吐。配置时需要注意主从同步延迟带来的“脏读”问题对于一致性要求高的读操作可以通过 Hint 强制走主库。另外数据安全越来越受重视ShardingSphere 提供了数据加密功能。可以对敏感字段如手机号、身份证号进行加密存储在查询时自动加解密。配置加密规则时要特别注意模糊查询LIKE和范围查询BETWEEN在加密后将无法正常进行需要业务侧权衡或采用特殊的算法如保留格式加密 FPE。5.2 与云原生和可观测性体系的融合随着云原生和 Kubernetes 的普及将 ShardingSphere-Proxy 作为有状态服务部署在 K8s 中并利用 Operator 进行生命周期管理是一个趋势。这涉及到配置的 ConfigMap 管理、Pod 的持久化存储、以及水平扩缩容的自动化。在可观测性方面除了基础的日志更重要的是将 ShardingSphere 的运行指标如路由次数、合并耗时、错误类型接入到统一的监控平台如 Prometheus Grafana并设置合理的告警规则。同时全链路追踪如 SkyWalking, Jaeger也需要能够穿透 ShardingSphere将一次逻辑SQL调用背后对多个物理数据库的访问串联起来这样才能在出现问题时快速定位瓶颈所在。5.3 从中间件到分布式数据库的思维转变最后也是最重要的一点引入 ShardingSphere 后开发团队需要从“使用单一数据库”的思维向“设计分布式数据系统”的思维转变。这意味着数据库DDL变更不再是简单的ALTER TABLE你需要考虑变更如何在所有分片上平滑执行可能需要工具辅助。备份恢复策略变得复杂你需要备份所有物理分片并确保它们的时间点一致。SQL质量要求更高一条糟糕的SQL在分片环境下会被放大其破坏力。团队需要具备一定的分布式系统知识理解数据一致性、CAP定理、最终一致性等概念在具体业务中的取舍。ShardingSphere 是一个强大的工具它降低了分布式数据库的使用门槛但并没有消除分布式本身带来的复杂性。它把一部分数据库的复杂度转移到了应用配置和运维上。因此成功的关键在于清晰的架构设计、严谨的配置管理、完善的监控告警、以及团队技术能力的同步提升。它不是银弹而是需要精心驾驭的利器。

相关新闻

纳米Work,企业AI落地新范式

纳米Work,企业AI落地新范式

哈喽,前两天我去了纳米Work发布会现场整体看下来,印象最深的就是三个转变。今天我们来详细聊聊,我为什么会对这个产品转变印象——这还真不是广,广在小红书上你们可以看小红书明天发(bushi。第一,纳米Work真…

2026/8/2 6:49:04 阅读更多 →
伏格尔法求解指派问题:原理、步骤与Python实现

伏格尔法求解指派问题:原理、步骤与Python实现

1. 项目概述:从“付格尔法”到“指派问题”的实战求解最近在整理一些历史项目资料时,翻到了一个挺有意思的案例,核心是如何把一堆任务合理地分配给一队人手,让总成本或总时间降到最低。这听起来像是管理问题,但本质上是…

2026/8/2 6:49:04 阅读更多 →
树莓派HQ相机电动变焦镜头集成指南:从硬件连接到Python控制

树莓派HQ相机电动变焦镜头集成指南:从硬件连接到Python控制

1. 项目缘起:为什么需要为树莓派配一支变焦镜头? 最近在折腾树莓派HQ相机(Raspberry Pi HQ Camera)做项目,发现一个挺普遍的需求:很多朋友想用它来做一些需要灵活取景的应用,比如监控一个范围变…

2026/8/2 6:49:04 阅读更多 →

最新新闻

告别F12!session-capture:一键抓取网站完整认证会话

告别F12!session-capture:一键抓取网站完整认证会话

session-capture:告别 F12,一键抓取网站完整认证会话全解一、工具简介session-capture 是开源工具(Chrome 插件 Python CLI),解决传统手动抓会话的繁琐流程:F12→Application 复制 Cookie、LocalStorage→…

2026/8/2 7:41:24 阅读更多 →
Unity游戏多语言自动化实战:XUnity.AutoTranslator配置与优化全指南

Unity游戏多语言自动化实战:XUnity.AutoTranslator配置与优化全指南

1. 项目概述:为什么Unity游戏翻译值得投入精力? 如果你是一名独立游戏开发者,或者是一个小型游戏工作室的成员,可能都遇到过这样的场景:你的游戏在本地市场反响不错,但当你想要推向全球,面对英语…

2026/8/2 7:41:24 阅读更多 →
用C语言设计扫雷游戏的核心逻辑与实现步骤

用C语言设计扫雷游戏的核心逻辑与实现步骤

扫雷是一个经典的逻辑推理游戏,适合用来练习程序设计。这次我们选择在命令行下用C语言实现它,重点在于数据结构的规划、递归算法的应用以及用户交互的处理。下面我将不提供任何一行代码,只用文字详细描述整个游戏是如何设计的,每个…

2026/8/2 7:41:24 阅读更多 →
Feign文件下载内存溢出解决方案:流式处理与配置优化实践

Feign文件下载内存溢出解决方案:流式处理与配置优化实践

1. 从一次线上故障说起:为什么Feign文件下载不是小事那天下午,系统监控突然告警,一个核心服务的接口响应时间从平时的几十毫秒飙升到了十几秒,紧接着就是内存使用率报警。我们紧急排查,发现流量并没有激增,…

2026/8/2 7:41:24 阅读更多 →
基于深信服AF防火墙的SQL注入与XSS攻击防御实战实验

基于深信服AF防火墙的SQL注入与XSS攻击防御实战实验

1. 项目概述:为什么要在防火墙下模拟攻击? 很多刚入行安全或者运维的朋友,一听到“防火墙”就觉得它是个黑盒子,配置复杂,效果神秘。而“SQL注入”、“XSS攻击”这些名词,又常常出现在各种安全报告和新闻里…

2026/8/2 7:41:24 阅读更多 →
CH343 USB转串口桥接板:硬件拆解、驱动安装与高级应用指南

CH343 USB转串口桥接板:硬件拆解、驱动安装与高级应用指南

1. 从USB到串口:为什么我们还需要一块“桥接板”?如果你玩过单片机、树莓派或者任何嵌入式开发板,对“串口”这个词一定不陌生。它就像设备与电脑之间最古老、最可靠的那条“电话线”,负责传输最基础的调试信息、程序代码或者控制…

2026/8/2 7:40:23 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →