2022年9月13号那天,我在项目里用Swagger2测试接口,参数传着传着就报了个NumberFormatException。调了半天,发现是类型对不上。问题不大,但我顺手把排查过程写了下来,发到了CSDN上。
当时没想太多,就是觉得记一下,以后再遇到不用重新想。这篇博客就是我的第一篇。
现在回头看,这个起点特别"后端开发"——没有宏大的选题计划,没有什么技术布道的野心,就是一个写代码的人,踩了个坑,然后把它记下来了。
我的博客到底写了什么
说实话,我写的东西基本都围绕一件事:在互联网医院项目里做后端开发,遇到的问题和解决方案。
这不是一个很感性的定位,但它是真实的。我的工作就是做互联网医院系统,每天处理的就是接口怎么设计、事务怎么控制、消息怎么不丢、加密怎么搞、支付怎么对接这些事。博客里的内容,就是这些工作的直接产物。
如果硬要分类的话,大概是这么几块:
分布式事务:写了三篇才觉得讲清楚了
这是我花心思比较多的一块。最开始写了一篇《分布式事务到底是什么?本地事务、TCC、Seata、XA一次讲明白》,从CAP/BASE理论讲到2PC/XA、TCC、Saga、消息表各种方案的优劣,还介绍了Seata框架。写完觉得太理论了,又补了一篇《同一个库、不同服务,还会有分布式事务问题吗?》,专门聊"同库不同服务经Feign调用会切换线程与连接"这种实际场景。
最后来了个反向思考——《最好的分布式事务,是没有分布式事务》。提出六种"绕开"分布式事务的设计手法:合并事务边界、冗余快照字段、状态机+超时任务、接受最终一致、对账兜底、利用同库简化。核心思想就一句话:通过边界划分与数据建模,将一致性难度降级为本地事务+补偿。
写这三篇的过程,其实也是我自己理解不断加深的过程。
腾讯IM对接:从零到能用的完整记录
这个系列是我踩坑最密集的一段。项目用腾讯IM做医患聊天,我自己对im这个比较好奇,就研究了一下
前端那篇写的是医患一对一聊天怎么实现,包括自定义报告卡片的消息类型。后端那篇记录了UserSig的生成(JSON→HMAC→压缩→URL安全Base64)、用户注册(registryUser)、群组创建(createGroup)这些核心流程。
然后还写了一篇架构演进复盘——《腾讯 IM 后端重构小白教程:一次真实的架构演进复盘》,把从老系统迁移到新系统的整个过程捋了一遍。标题虽然写"小白教程",但其实有不少是重构过程中的真实纠结。
最后是TRTC联动的混流录制方案。这个比较特殊,因为涉及"让云端替你把多人画面合成一屏",产物是VOD文件,不在TRTC里,取文件要走"异步",要么轮询要么事件通知——光这一个点就踩了不少坑。
密码学系列:被医保接口逼出来的
这个系列写得最"痛苦"。原因很简单:做互联网医院,必须对接医保接口,医保接口要求用国密算法。
最开始写了一篇《密码学实战:明明都是调医保接口,为什么授权码用数字信封、查单只用SM4?》,把数字信封的原理(对称密钥加密数据+对方公钥加密这把密钥)讲了一遍。后来觉得光讲这个不够,又写了《关于密码学,国际算法和国密算法到底有啥区别?》、《SM3摘要到底是干嘛的?加密和签名能是一回事吗?》、《BJCA数字信封和BouncyCastle签名格式是个啥?》、《公钥加密,私钥解密?私钥加密,公钥解密?哪个对?》。
五篇写下来,密码学这块我算是从"完全不懂"到"能上手对接"了。最深的感受是:很多概念在书上看是一回事,真正要写代码对接的时候又是另一回事。
AI医疗分诊助手:最近最投入的一个项目
这是我现在还在做的一个项目,也是写得最多的一个系列,至少六篇。
起因是互联网医院的挂号流程有痛点——患者不知道该挂什么科,医生回答重复性问题也很烦。我就想做一个AI分诊助手,用Agent的方式来模拟分诊流程。
第一篇写了项目背景和整体规划。第二篇从零搭建SpringBoot+SpringAI+Ollama+Vue3的对话系统,重点分析了SSE流式通信的全链路原理。第三篇聊了Agent到底是什么——我的理解是Agent是架构模式,不是基础设施,三个Agent共用一个模型也能工作,关键是职责划分和编排逻辑。
然后遇到了最头疼的问题:AI输出不可控。于是第四篇写了结构化分诊与安全规则,设计了包含12个核心字段的TriageResponse结构体来约束AI输出。第五、六篇搞RAG,用PostgreSQL+pgvector做知识库,给AI分诊助手加上了"知识库大脑"。
这个系列写到第四篇的时候,我的体会是:永远不要完全相信AI输出。结构化约束不是可选项,是必须的。
运维踩坑:每一篇都是真金白银的教训
这类文章不好写,因为每一篇背后都是一次线上事故。
HikariCP那次最惨烈。2026年7月27日早高峰,医疗系统大面积接口超时。排查下来,核心服务HikariCP连接池默认配置只有10个连接,高峰并发一下就打满了。更要命的是V1版本的物流同步接口在事务内同步调用了外部顺丰API。写了两篇,一篇是问题概览,一篇是完整排查报告,从MySQL的"Lock wait timeout"异常一路追到连接池配置和事务内远程调用。
K8s 502那次也很有教育意义。《测试环境 K8s 502 故障复盘:被 ClusterIP 表象误导,最终定位 kube-proxy 规则缺失》——kube-proxy没能为service生成iptables/IPVS转发规则,导致ClusterIP成了网络黑洞。Nginx日志显示upstream连接失败,表现为"无路由到…""。
还有一次线上主键冲突事故,让我彻底搞懂了Spring事务的边界问题。处方订单接口偶发性报错,同一请求有时成功有时失败,并发或锁失效都不是,根因是事务边界划分不当导致的数据脏进。
Redis和缓存:从原理到实战
写了Redis延时队列的内部实现(Redisson的Hash+ZSet双结构),写了Redis持久化方式(RDB、AOF、混合持久化),写了Spring Cache+Redis的集成方案(@Cacheable和@CacheEvict注解的详细使用),还写了本地缓存方案选型(volatile、ConcurrentHashMap、Caffeine)。
比较有意思的是那篇《订单超时场景,用Redis延时队列还是MQ?》,结论是:选型看基建,超时场景的事实源在数据库,Redis和MQ只是消息质量之分——有RocketMQ用RocketMQ,有RabbitMQ用RabbitMQ,谁都没有Redis,谁都别忘了配兜底兜底。
MySQL和JVM:底层知识补课
这部分写了不少基础但重要的内容。MySQL方面有事务关系及MVCC通俗解析、MVCC进阶(快照读vs当前读、幻读与Next-Key Lock)、间隙锁原理、Doris超时时间调整。JVM方面有直接内存、Minor/Major/Full GC的区别、JDK21虚拟线程。
写JDK21虚拟线程的时候我特别认真,前后写了三篇——从入门介绍到进阶实战再到"钉住"问题的危害分析。结论是虚拟线程是一把"极其锋利的屠龙刀",理解了载体线程的珍贵,才能真正享受鱼与熊掌兼得的快乐。
OpenClaw:一个意外的爆款
这系列五篇是我阅读量最高的文章之一。起因就是OpenClaw那段时间比较火,自己比较感兴趣,我就从头写了一遍——从Linux云端部署到Windows安装踩坑笔记,从SSH方式控制本地浏览器到Tailscale内网穿透方案,最后做了一个全方案对比。
最火的是第一篇保姆级教程,3385阅读,21点赞,17收藏。说明很多人和我一样,装这东西的时候踩了不少坑。
Spring WebFlux:被逼出来的响应式学习
写了四篇,从零基础入门到进阶实战,再到和Java传统异步的对比辨析。之所以写这个,是因为项目里有些场景确实需要非阻塞IO,而虚拟线程在某些场景下又不能完全替代WebFlux。
其他零散内容
软件设计师备考的错题整理和数据结构笔记(备考过程中顺便记录的)。Java常见工作流引擎对比选型(Camunda、Flowable、Activiti、JBPM、Warm-flow)。互联网医院游客模式的设计与落地。网关灰度方案和负载均衡权重算法的分析。还有《Java日志打印:别再log.info("dto:{}", dto)了,可能比你想的更坑》——这篇是被一个线上日志性能问题逼出来的,Jackson的toJsonPrettyStr会触发反射序列化、内存分配、磁盘IO和日志传输压力。
我的写作习惯
回头看这1460天,我发现自己的写作有几个明显的特征:
第一,系列化输出。 分布式事务3篇、腾讯IM 4篇、密码学5篇、AI分诊助手6篇、OpenClaw 5篇、WebFlux 4篇——基本上碰到一个复杂的技术点,一篇写不完,就会连续写几篇。不是刻意规划的,是因为一个问题搞明白了,会衍生出更多问题。
第二,标题里带"小白"二字。 很多标题都写了"小白也能看懂""一次讲明白""小白友好版"。这不是谦虚,是因为我自己就是从不懂开始学的,写的时候会不自觉地站在"刚开始接触这个东西"的角度来讲。
第三,案例驱动。 大部分文章不是"我想讲一个知识点",而是"我遇到了一个问题,搞清楚了,记录下来"。HikariCP雪崩、K8s 502、主键冲突、Doris超时、物流同步Bug——每一篇踩坑记录背后都是一次真实的线上事故。
第四,业务场景很集中。 几乎所有文章都和互联网医院这个业务有关。密码学是因为医保接口,IM是因为医患聊天,AI分诊是因为挂号流程,支付是因为处方结算。技术不是孤立存在的,它总是为业务服务的。
一些真实感受
写博客这件事,最开始真的是为了"记住"。项目里踩的坑太多了,不写下来过两个月就忘了,下次还得重新踩。
但写到后面,发现博客的价值不只是"给自己看"。有些文章的阅读量确实不高,但偶尔有人留言说"这个问题我也遇到了,你的文章帮了大忙"——这种时候会觉得,花时间写这些东西是值得的。
最让我意外的是OpenClaw那个系列。本来就是自己个人安装与踩坑记录,没想到阅读量反而最高。后来想想也合理——越是文档不够完善的东西,越是有人需要有人写。
还有一个感受:写博客最大的受益者其实是自己。 很多东西以为自己懂了,等写下来的时候才发现逻辑链条有漏洞。每次写文章都是一次深度学习的过程。比如写分布式事务那三篇,写完之后对CAP、对Saga、对状态机的理解比写之前深了好几个层次。
接下来打算写什么
AI医疗分诊助手那个系列还没写完,RAG这块还有不少可以深入的——比如向量检索的效果调优、知识库更新策略、多轮对话的记忆管理、怎么做质控回检?
另外,JDK21虚拟线程在生产环境的实际使用经验也想再写几篇。目前更多是原理分析,等跑了一段时间的生产环境之后,应该会有更多实战数据可以分享。
最后一个小目标:把互联网医院这个项目里积累的架构经验——网关设计、灰度发布、游客模式、支付对接——系统地整理一遍。这些经验太散了,是时候串起来了。
写于成为创作者的第1460天。第一篇博客解决的是一个NumberFormatException,现在回头看,这个起点再普通不过了。但正是这些普通的技术问题,堆出了这一千多天的创作。


