1. TongRDS不是数据库而是数据库“管家”——先破一个常见误解刚接触TongRDS时我翻遍了所有公开文档第一反应是这不就是个封装好的MySQL或PostgreSQL安装包吗直到在某次模拟项目X的压测中数据库连接池突然在凌晨三点集体超时监控面板上QPS断崖式下跌而底层MySQL进程本身CPU和内存都正常——那一刻我才真正意识到TongRDS根本不是数据库本体它是一套运行在数据库之上的轻量级服务治理中间件。它的核心价值从来不在“存数据”而在“管数据怎么被安全、稳定、可控地访问”。这个认知偏差直接导致很多团队在部署初期就踩进深坑有人把它当纯软件装完就跑结果上线后发现慢查询没拦截、连接数没限流、SQL注入风险敞口大开也有人过度依赖它的自动配置把所有策略都设成“宽松模式”结果一次误操作SQL就把主库拖垮。TongRDS真正的定位是数据库与业务应用之间的“交通协管员”——它不替你开车执行SQL但会严格检查你的驾照权限、限速QPS/TPS、查酒驾SQL白名单、甚至帮你规划最优路线读写分离路由。关键词里虽然没写但实际部署中“权限收敛”“流量整形”“SQL审计”这三个词才是贯穿整个安装部署过程的隐形主线。它不替换MySQL也不替代DBA而是让DBA从“救火队员”变成“规则制定者”。比如你可以在TongRDS配置里定义“所有来自订单服务的SELECT语句最大执行时间不能超过500msUPDATE语句必须带WHERE条件且WHERE字段必须是主键或唯一索引列”。这种策略级控制是原生数据库靠参数调优永远做不到的。所以本文讲的“安装部署”本质是一套服务治理能力的初始化过程——不是装一个软件而是为你的数据库访问建立第一道结构化防线。如果你正准备在测试环境搭一套用于灰度验证的TongRDS或者刚接手一个已上线但策略混乱的旧集群这篇文章里的每一步配置、每一个参数背后的取舍逻辑都是我在三个不同规模项目中反复验证过的实操路径。2. 安装前必须亲手验的三件事环境、权限、网络拓扑很多人以为TongRDS安装就是解压、改配置、启动服务三步走结果卡在第一步——启动失败日志里只有一行Failed to bind port 8080。其实问题根本不在这儿。TongRDS对运行环境有非常具体的隐性要求这些要求不会在官方安装手册里用加粗标出但会直接决定你能否跨过“能跑”到“稳跑”的门槛。我把它拆成三个必须亲手验证的硬性条件缺一不可。2.1 操作系统内核参数不是“可选优化”而是启动前提TongRDS默认启用epoll I/O多路复用并大量使用socket选项如SO_REUSEPORT和TCP_FASTOPEN。这意味着它对Linux内核版本和参数极其敏感。我们曾在一个CentOS 7.6内核3.10.0-957环境上部署所有步骤完全照文档但服务始终无法监听管理端口。排查三天后发现该内核版本对net.ipv4.tcp_fastopen的支持存在已知bug开启后会导致socket绑定失败。解决方案不是升级内核生产环境不允许而是修改TongRDS启动参数强制禁用FASTOPEN# 修改 bin/start.sh 中的 JVM 参数 JAVA_OPTS$JAVA_OPTS -Dtongrds.net.tcpfastopenfalse更关键的是net.core.somaxconn和net.core.netdev_max_backlog这两个参数。TongRDS的连接队列深度默认设为1024如果系统somaxconn值小于这个数新连接就会被内核直接丢弃表现为客户端连接超时而TongRDS自身日志毫无异常。实测下来生产环境建议值如下参数名推荐值验证命令不达标后果net.core.somaxconn65535sysctl net.core.somaxconn新连接随机拒绝无日志记录net.core.netdev_max_backlog5000sysctl net.core.netdev_max_backlog网络中断时连接堆积触发熔断fs.file-max2097152sysctl fs.file-max启动报错“Too many open files”提示这些参数修改后需执行sysctl -p生效且要写入/etc/sysctl.conf防止重启丢失。别信“临时改一下就行”TongRDS的连接模型决定了它对系统资源的消耗是持续且刚性的。2.2 用户权限不是“root or nothing”而是最小化原则的精确切割TongRDS安装包里自带一个install.sh脚本它会创建tongrds用户并赋予/opt/tongrds目录所有权。但很多人忽略了一个致命细节这个用户不仅需要运行服务还需要以特定身份连接后端数据库。TongRDS本身不存储用户密码所有数据库认证信息都由管理员在配置文件中明文填写如db.usernameroot。如果这里填的是数据库超级用户那TongRDS一旦被攻破攻击者就等于拿到了数据库最高权限。正确的做法是在安装前先登录目标MySQL实例创建专用账号并严格限制其权限范围。例如针对一个只读分析场景应执行-- 创建专用账号密码强度必须符合数据库密码策略 CREATE USER tongrds_ro% IDENTIFIED BY StrongPass!2024; -- 只授予SELECT权限且限定到具体库表 GRANT SELECT ON analytics.* TO tongrds_ro%; -- 刷新权限 FLUSH PRIVILEGES;然后在TongRDS的conf/application.yml中填写spring: datasource: username: tongrds_ro password: StrongPass!2024注意这个账号的host必须是%或明确指定TongRDS服务器IP不能是localhostMySQL的localhost有特殊解析逻辑会导致连接失败。我见过太多团队因为填了localhost反复重装三次才意识到是这个小写字母的问题。2.3 网络拓扑不是“通就行”而是分层隔离的显性设计TongRDS部署位置直接决定它的防护效力。它绝不能和应用服务部署在同一台机器上——这不是性能考虑而是安全边界问题。理想拓扑是三层结构应用层Web/App Server → TongRDS代理层独立VM/容器 → 数据库层MySQL/PG Master-Slave其中TongRDS层必须有双向网络策略入向只允许应用层IP段访问其8080管理端口和3306代理端口出向只允许访问数据库层IP段的3306端口我们曾在一个金融类项目中因运维同事图省事把TongRDS和应用打包进同一个Docker Compose结果一次应用漏洞导致TongRDS配置被读取攻击者直接获取了数据库账号密码。后来整改时强制将TongRDS剥离为独立Service并在K8s NetworkPolicy中精确声明apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: tongrds-egress spec: podSelector: matchLabels: app: tongrds policyTypes: - Egress egress: - to: - ipBlock: cidr: 10.20.30.0/24 # 数据库网段 ports: - protocol: TCP port: 3306这个策略看似繁琐但它把“数据库凭据泄露”这个高危风险从“必然发生”降级为“需要突破两层网络隔离”安全水位提升了一个数量级。3. 配置文件不是填空题而是策略蓝图的首次落笔TongRDS的核心配置集中在conf/application.yml但这份文件绝不是简单的参数填空。它本质上是一份数据库访问策略的蓝图声明每一项配置都在回答一个关键问题“我要如何约束这次数据库访问行为”很多团队部署后策略失效根源往往在于对配置项背后意图的理解偏差。下面我按实际部署顺序逐项拆解最关键的五个配置块。3.1 数据源配置连接池不是越大越好而是要匹配业务脉搏spring.datasource.hikari下的参数表面看是数据库连接池设置实则暗含业务流量特征。以maximum-pool-size为例文档建议设为20但这是基于单机16核CPU、QPS 500的基准场景。真实业务中你需要根据应用实例数和单实例并发量反推假设你有5台应用服务器每台平均并发请求为30那么理论最大连接数 5 × 30 150。但TongRDS作为中间层会引入额外连接开销如连接复用、心跳检测所以最终maximum-pool-size应设为180~200。如果盲目设成500反而会导致数据库侧连接数爆炸触发MySQL的max_connections限制。更关键的是connection-timeout和validation-timeout。前者是应用等待连接的超时后者是TongRDS校验连接有效性的超时。我们曾在线上遇到一种诡异现象应用报“获取连接超时”但数据库show processlist显示连接数远未达上限。最终定位到是validation-timeout设得太短1秒而数据库偶尔出现毫秒级抖动导致TongRDS频繁误判连接失效不断新建连接又销毁形成连接风暴。解决方案是将validation-timeout设为connection-timeout的1/3且不低于3秒spring: datasource: hikari: connection-timeout: 30000 # 30秒 validation-timeout: 10000 # 10秒满足1/3且3秒3.2 SQL审计策略不是全量记录而是精准捕获高危行为audit.sql配置块控制SQL审计行为。新手常犯的错误是开启enabled: true后发现磁盘空间几天就被打满。这是因为默认审计级别是ALL会记录每一条SQL的完整文本、执行时间、客户端IP。生产环境必须做分级审计级别触发条件日志量预估适用场景CRITICAL执行时间5s 或 返回行数10000极低核心生产环境WARNING执行时间1s 或 使用LIKE无索引中等灰度/预发环境ALL所有SQL极高仅限故障复现期我们在线上采用CRITICAL级别并配合audit.sql.slow-threshold: 30003秒阈值同时关闭audit.sql.log-sql-text: false不记录SQL文本只记录摘要哈希使日志体积降低90%。但关键信息不丢日志中仍包含SQL_HASH: a1b2c3d4,EXEC_TIME_MS: 3240,CLIENT_IP: 10.1.2.3足够DBA快速定位慢查询源头。注意SQL哈希值是MD5(规范化SQL)如SELECT * FROM users WHERE id ?和SELECT * FROM users WHERE id 123哈希值相同。这既保护了敏感数据又保证了统计准确性。3.3 流量控制QPS不是数字而是业务SLA的具象化表达rate-limit配置是TongRDS最强大的能力之一但也是最容易配错的部分。qps参数不是随便填个数字它必须对应业务的实际SLA承诺。例如订单创建接口承诺99.9%响应时间200ms那么它的QPS上限就应基于历史峰值流量设定查看过去7天监控订单创建接口最高QPS为1200考虑促销活动可能带来2倍流量预留50%缓冲最终qps: 36001200×2×1.5如果填成qps: 10000等于放弃限流意义如果填成qps: 500则日常就触发熔断。更精妙的是burst-capacity突发容量参数。它允许短时流量尖峰通过避免秒杀场景下瞬间打垮数据库。我们实测发现将burst-capacity设为qps的3倍配合refill-rate: qps/10每100ms补充1个令牌能在保障稳定性的同时吸收95%的业务突发流量。3.4 权限白名单不是功能开关而是最小权限的动态执行器security.whitelist配置块表面是SQL语法白名单实则是运行时权限引擎。它支持两种模式mode: STRICT严格模式任何不在白名单中的SQL类型如DROP、TRUNCATE一律拒绝返回明确错误码mode: LOOSE宽松模式只记录告警不阻断执行生产环境必须用STRICT。但白名单内容不能简单复制粘贴。例如INSERT语句必须限定到具体表security: whitelist: mode: STRICT rules: - type: INSERT tables: [orders, order_items] # 只允许向这两张表插入 - type: UPDATE tables: [orders] # 只允许更新orders表 where-required: true # UPDATE必须带WHERE这个配置意味着即使数据库账号有UPDATE ANY TABLE权限TongRDS也会在SQL解析阶段就拦截UPDATE users SET status1这样的语句。这才是真正的权限收敛——不依赖数据库层的粗粒度授权而是在应用入口处做细粒度拦截。3.5 管理端口安全不是开放即用而是主动收缩的防御姿态management.server.port默认是8080这是最大的安全隐患。TongRDS管理端口暴露在外网等于把数据库的“控制台”直接交给所有人。正确做法是将management.server.port改为一个高位端口如18080在application.yml中添加IP白名单management: endpoints: web: exposure: include: health,metrics,threaddump,loggers endpoint: health: show-details: when_authorized server: port: 18080 security: ip-whitelist: 127.0.0.1,10.1.2.0/24 # 只允许本地和运维网段然后通过Nginx反向代理将/actuator/路径映射到内网域名并启用Basic Authlocation /actuator/ { proxy_pass http://127.0.0.1:18080/actuator/; auth_basic TongRDS Admin; auth_basic_user_file /etc/nginx/.htpasswd; }这样运维人员通过https://tongrds-admin.internal/actuator/health访问而外部攻击者连端口扫描都扫不到管理接口。安全不是加功能而是做减法——把所有不必要的暴露面主动收窄到最小。4. 启动后的三重验证从“绿灯”到“稳态”的必经之路服务进程起来控制台输出Started TongRDSApplication in X seconds这只是万里长征第一步。真正的部署完成必须通过三重验证连通性验证、策略有效性验证、压力承载验证。跳过任何一环都可能在上线后付出十倍代价。4.1 连通性验证不只是ping通而是端到端链路穿透很多人用telnet tongrds-host 3306看到Connected就认为成功。这是危险的幻觉。TongRDS的3306端口是代理端口它需要完成“客户端→TongRDS→后端数据库”的完整握手。必须用真实MySQL客户端验证# 从应用服务器执行不能在TongRDS本机 mysql -h tongrds-host -P 3306 -u tongrds_ro -pStrongPass!2024 -e SELECT VERSION();如果返回MySQL版本号说明链路通畅。但还不够——要验证TongRDS是否真的在工作而非直连数据库。此时查看TongRDS日志tail -f logs/tongrds.log | grep ProxyConnection正常应看到类似[INFO] ProxyConnection created for client 10.1.2.3:54321 to db 10.20.30.10:3306的日志。如果没有这条日志说明客户端绕过了TongRDS直连了数据库IP。常见原因是应用配置里数据库地址写错了或者DNS缓存了旧IP。提示在K8s环境中务必检查Service的Endpoint是否正确指向TongRDS Pod。我们曾因ConfigMap未热更新导致应用Pod读取了旧的Service IP绕过代理长达2小时。4.2 策略有效性验证用“故意犯错”来证明防护生效策略配置是否生效不能靠“应该会生效”来假设必须用受控的错误操作来触发并观察。这是最高效的验证方式。我们建立了一套标准验证用例验证目标故意执行的SQL预期结果验证方法SQL白名单DROP TABLE test;返回错误SQL not allowed by whitelist查看客户端错误和TongRDS日志慢查询拦截SELECT SLEEP(4);连接被强制关闭客户端报Lost connectiontcpdump -i any port 3306抓包确认RST包连接数限制启动100个并发连接脚本第51个连接开始超时ss -tnp | grep :3306 | wc -l实时监控其中慢查询拦截的验证最易出错。因为SELECT SLEEP(4)在MySQL中是合法SQL但TongRDS会在执行前解析并判断预计耗时。如果配置了slow-threshold: 3000它就会在SQL进入执行队列前就拒绝。这证明TongRDS的拦截是前置的、非侵入的而不是等SQL执行完再杀进程。4.3 压力承载验证不是跑满CPU而是观测策略临界点最后一步是压力测试但目的不是看TongRDS能扛多少QPS而是观察它在策略临界点的行为是否符合预期。我们用JMeter配置一个线程组线程数200模拟200并发Ramp-up60秒每秒增加3.3个线程请求SELECT COUNT(*) FROM orders WHERE create_time DATE_SUB(NOW(), INTERVAL 7 DAY);重点监控三个指标TongRDS的rate_limit_rejected_count被限流拒绝数应在QPS达到配置值时开始上升且增长曲线平滑MySQL的Threads_connected连接数应稳定在maximum-pool-size附近不持续攀升应用端的avg_response_time平均响应时间在限流触发后应保持在100ms内而非飙升到秒级如果发现Threads_connected持续上涨超过配置值说明Hikari连接池配置与TongRDS策略不匹配如果avg_response_time在限流后仍飙升说明应用未正确处理限流异常如重试逻辑导致雪崩。这些都不是TongRDS的Bug而是策略协同的缺失。5. 部署后必须立即做的四件事从“可用”到“可信”的加固闭环服务跑起来了策略验证通过了但这只是部署的终点却是稳定运行的起点。TongRDS不是一劳永逸的“银弹”它需要持续的运营和加固。根据我们在多个项目中的经验上线后头24小时内必须完成以下四件事否则大概率在一周内遭遇意外故障。5.1 日志轮转策略必须当天配置否则磁盘告警半夜响起TongRDS默认日志不轮转logs/tongrds.log会无限追加。在QPS 1000的业务下单日日志量轻松突破2GB。我们曾有个项目上线第三天凌晨磁盘100%所有服务因无法写日志而假死。根因就是忘了配Logback的滚动策略。解决方案是修改conf/logback-spring.xml添加TimeBasedRollingPolicyappender nameFILE classch.qos.logback.core.rolling.RollingFileAppender filelogs/tongrds.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePatternlogs/tongrds.%d{yyyy-MM-dd}.%i.log/fileNamePattern timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize100MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy maxHistory30/maxHistory !-- 保留30天 -- /rollingPolicy /appender关键是maxFileSize必须设为100MB而非1GB——因为TongRDS日志包含大量SQL摘要单条日志可能长达2KB1GB文件在高并发下几小时就写满。100MB30天的组合既能保证排查问题时有足够历史又不会挤爆磁盘。5.2 健康检查端点必须集成到运维体系否则故障发现延迟30分钟/actuator/health端点返回{status:UP}只是进程存活不代表策略生效。真正的健康检查必须包含策略维度。我们在conf/application.yml中扩展了自定义健康指示器management: endpoint: health: show-details: when_authorized endpoints: web: exposure: include: health,metrics,threaddump,loggers,tongrds tongrds: health: check-db-connection: true # 检查到数据库的连通性 check-whitelist: true # 检查白名单规则加载状态 check-rate-limit: true # 检查限流器初始化状态然后在Zabbix中配置HTTP检查不仅监控statusUP还解析JSON响应中的components.tongrds.status。如果这个值是DOWN说明白名单规则加载失败如YAML格式错误立即触发告警。这种细粒度健康检查能把策略配置错误的发现时间从“用户投诉”缩短到“2分钟内”。5.3 监控埋点必须覆盖策略执行路径否则问题定位靠猜TongRDS内置Micrometer指标但默认只暴露基础JVM指标。要真正看清策略效果必须开启策略相关埋点。在conf/application.yml中添加management: metrics: export: prometheus: enabled: true enable: - jvm.* - system.* - tongrds.rate-limit.* # 限流指标 - tongrds.audit.* # 审计指标 - tongrds.connection.* # 连接池指标关键指标包括tongrds.rate-limit.rejected.total被限流拒绝总数tongrds.audit.slow-query.count慢查询触发次数tongrds.connection.active.max连接池活跃连接峰值我们将这些指标接入Grafana创建一个“TongRDS策略看板”当rejected.total突增时结合slow-query.count判断是业务流量突增还是SQL质量恶化——这是DBA做容量规划的核心依据而不是靠拍脑袋估算。5.4 回滚方案必须提前验证否则故障恢复耗时翻倍最后也是最重要的一点准备好一键回滚到直连数据库的方案并验证其有效性。TongRDS再稳定也无法100%规避兼容性问题如某些ORM框架的特殊SQL语法。回滚方案不是“删掉TongRDS”而是“切换流量”。我们在Nginx中配置了两个upstreamupstream tongrds_backend { server tongrds-host:3306; } upstream direct_mysql_backend { server mysql-master-host:3306; } server { listen 3307; location / { # 默认走TongRDS proxy_pass http://tongrds_backend; } } # 紧急回滚入口 server { listen 3308; location / { # 直连MySQL proxy_pass http://direct_mysql_backend; } }应用配置中数据库地址设为127.0.0.1:3307故障时只需将应用配置改为127.0.0.1:3308并reload Nginx30秒内完成流量切换。这个方案经过三次线上演练平均切换时间12秒。没有预案的团队在真正故障时花2小时手动改配置、重启服务代价远高于提前1小时做这个准备。部署TongRDS本质上是在数据库访问链路上植入一个可控的“策略执行点”。它不改变数据库本身却重塑了应用与数据库的交互规则。从环境校验的苛刻要求到配置文件的策略深意再到启动后的层层验证每一步都在强化一个事实真正的稳定性源于对每个细节的敬畏而非对工具的盲目信任。我在模拟项目X中第一次部署TongRDS时花了整整三天才跑通全流程但后续维护的六个月里数据库层零重大故障。这种前期投入带来的长期确定性正是所有技术决策中最值得的投资。
企业数字化 ERP 产品动态
相关推荐
动态规划与数学优化解LeetCode完全平方数问题 1. 问题理解与解法概述LeetCode 279题"完全平方数"是一个经典的动态规划问题,题目要求我们找到组成给定整数n所需的最少数量的完全平方数。完全平方数指的是1, 4, 9, 16...这类可以表示为某个整数平方的数字。这个问题看似简单,但蕴含着深刻的… · 2026/11/2 16:53:37
Agent运行机制拆解:上下文、检查点、任务恢复与资源管控 1. 从一次线上事故说起:Agent 为什么需要“运行机制”凌晨两点,监控告警响了。一个跑了四十多分钟的 Agent 任务在调用某个外部接口时超时,进程直接挂掉。重启之后,它从第一步重新开始,把前面已经完成的十几个工具调用… · 2026/11/2 16:53:37
哈利波特同人项目开发与版本控制实践 1. 项目背景与核心价值"harrypotter16-1"这个看似简单的项目命名背后,实际上蕴含着丰富的创意可能性。作为一个资深内容创作者,我第一眼看到这个标题时,脑海中立即浮现出几个关键方向:这可能是某个粉丝创作项目、同人作… · 2026/11/2 16:53:37
React中后台组件库选型:Material-UI实战与避坑指南 React 生态里做中后台项目,绕不开的一个东西就是组件库选型。我这些年接手过的项目里,十有八九在起步阶段都会碰到同一个问题:到底是用一套现成的 UI 框架,还是自己从零撸一套设计系统。选 Material-UI(现在官方叫 MUI… · 2026/11/3 4:24:48
Git误操作恢复指南:提交回退、分支修复与仓库拯救 1. Git误操作拯救手册:为什么你需要这份指南作为一名在代码版本控制领域摸爬滚打多年的开发者,我见过太多因为Git误操作导致的"血案"——有人误删了半年心血的分支,有人把生产环境代码覆盖了本地修改,更有人因为强制推送… · 2026/11/3 4:24:47
PHP数据库Schema版本管理实践与工具选型 1. 为什么PHP项目需要数据库Schema版本管理在PHP开发中,数据库Schema(结构)的变更管理一直是个痛点问题。我经历过太多这样的场景:开发环境修改了表结构但忘记同步到测试环境,线上数据库因为手动执行SQL导致字段丢失&a… · 2026/11/3 4:24:47
AI工程从零入门:Python到模型部署的完整实战路线 “AI engineering from scratch”,这个话题我被人问过太多次了。每次都有新人拿着这个词来问我:到底什么叫AI工程?不读研究生能不能入行?是不是得先把高数啃完才能动手?今天我不讲虚的,直接把这条从零到能干… · 2026/11/3 4:24:47
Model-Optimizer:模型压缩与推理加速的完整优化实践 Model-Optimizer 这个名字看着简单,但它解决的是我们做模型落地时最头疼的一类问题——训练好的模型塞不进生产环境。我这几年一直在做模型部署相关的工作,频繁碰到部署工程师抱怨模型太大、推理太慢、内存爆掉,TRT 报错、量化掉点、剪枝后网… · 2026/11/3 4:24:47
智慧高速公路技术架构与实施要点解析 1. 智慧高速公路解决方案概述在交通强国战略背景下,智慧高速公路建设已成为新基建的重要方向。这份76页的PPT解决方案系统性地呈现了从路侧设备到云端管理的完整技术架构,为行业提供了可落地的实施路径。不同于传统高速公路的信息化改造,该方… · 2026/11/3 4:23:47
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18