Appearance
小刘实验室更新日志
这里记录小刘实验室的重要更新,包括新增实验、文档完善、功能上线以及网站改进。最新内容排在最前面。
2026-09-11
✨ 新增
- 新增快捷入口 技术实践,集中提供遗留系统治理、渠道集成、测试、数据访问、容器网络与日志排查等工程实践文章的阅读入口。
2026-09-10
✨ 新增
- 新增 一个留学缴费遗留系统的治理:边界、验证与工程判断,记录一个低并发、高金额、长流程、多人工节点的 Java 遗留系统如何逐步治理重复代码、隐式依赖、技术栈叠加、渠道边界和测试缺失,并从影响范围、可逆性、可验证性、维护成本增速与实际收益等维度总结工程判断。
2026-09-07
✨ 新增
- 新增 如何编写可维护的上游渠道调用代码,从渠道边界、协议样本、UT/IT、加解密与签名、协议版本演进等方面,总结让上游渠道调用代码长期保持可维护、可理解、可验证和可演进的工程实践。
- 新增 别把所有测试都叫 Test:我如何用 UT、IT 和 SmokeIT 划分执行边界,介绍如何通过
*UT、*IT与独立 SmokeIT 工程划分测试执行边界,并结合 Maven Surefire、Failsafe 和明确的触发机制降低误执行风险。 - 新增 FTX-0003 A股深度回撤修复实验,记录在市场深度回撤发生前制定的真实资金实验预案,明确启动条件、资金分层、现货加仓、有限融资、小额期权与风险边界,并配套参数设计依据和执行记录。
2026-09-01
✨ 新增
- 新增 为什么我不再允许业务代码直接使用 MyBatis-Plus 的 insert 和 updateById,从一次 JPA 迁移到 MyBatis-Plus 时因
save()与insert()语义差异导致的真实踩坑出发,重新审视BaseMapper中通用写方法在复杂业务系统里的维护成本,重点分析updateById()在更新字段、业务前置条件、Entity 写入边界、并发旧值覆盖风险以及 IDE 调用定位等方面的问题,并在调研 MyBatis-Plus 官方源码和 GitHub 讨论后,放弃 Fork 框架和继承BaseMapper后 override 的方案,最终通过BizBaseMapper + BizSqlInjector对通用写能力做项目级裁剪,同时使用 H2 示例工程对保留方法进行逐项验证,并保留官方BaseMapper作为对照组。
2026-08-30
✨ 新增
- 新增 从 Spring Boot 迁移到 Quarkus:一份面向真实业务的基础能力验证清单,记录一次因 Spring Boot 启动速度和资源占用而展开的技术选型,在尝试多种轻量 Java Web 框架及 Go 后,最终选择在轻量化与业务基础能力之间更平衡的 Quarkus,并在迁移业务前系统验证数据访问、REST、Bean、配置、事务、校验、定时任务、异常处理、日志、监控、部署等能力,同时记录从 JPA/Panache 到继续使用 MyBatis-Plus 的数据访问演进。
- 新增 Java 8 Alpine 容器中 jstack 与 Arthas 失败:一次 JVM 诊断能力补齐,记录 Java 8 服务运行在 Alpine 镜像时,
jps可以看到进程但jstack与 Arthas 无法正常工作的排查过程,并通过切换 Debian JDK 镜像恢复 JVM 诊断能力。 - 新增 一次 Docker 基础镜像切换后的签名异常:从生产回滚到默认字符集,记录 Java 8 服务从 Alpine 切换到 Debian 后第三方接口签名异常的生产问题,以及通过最小复现和三组 Dockerfile 对照实验定位
String#getBytes()默认字符集风险的过程。 - 新增 Dockerfile 写了 LANG=en_US.UTF-8,真的代表 Locale 生效了吗?,从 Java 8 Docker 签名问题继续追查 Alpine Locale 行为,验证环境变量已设置并不等于对应 Locale 数据真实存在,并说明结论适用的版本与镜像边界。
2026-08-29
✨ 新增
- 新增 Windows 通过 SSH 隧道远程调试 Docker 中的 Spring Boot(JDWP),介绍如何从 Windows 开发机通过 SSH 隧道连接 Linux Docker 容器中的 Spring Boot JDWP 调试端口,在不改变服务公网入口、不重新发布服务的情况下保留现场并进行临时远程调试。
- 新增 一次 VPN 访问收紧导致支付回调中断的事故复盘,记录后台系统收紧 VPN 访问后第三方支付回调中断的生产事故,梳理网络边界误判与监控缺口,并总结 Internal / Public 接口边界、回调验签、限流及对账补偿等改进措施。
- 新增 Spring Boot 2.7 YAML 国际化:一次从查不到合适方案到源码扩展点的探索,记录 Spring Boot 2.7 项目实现 YAML 国际化语言包的探索过程,通过调试
MessageSource加载链路并追踪资源定位逻辑,最终基于ResourceBundleMessageSource#doGetBundle实现可缓存的 YAMLMessageSource,并提供可还原的最小示例。 - 新增 从 JPA + MyBatis 到 MyBatis-Plus:一次旧项目数据访问层的维护性收敛,记录 Spring Boot 2.2 旧项目从 JPA 与原生 MyBatis 混用逐步收敛到 MyBatis-Plus 的过程,梳理简单 CRUD 与业务语义 SQL 的职责边界,以及数据访问层在字段变更与长期维护中的取舍。
- 新增 从 log4jdbc 到 p6spy:后来才意识到,我需要的不只是单行 SQL,复盘一次从 SQL 多行日志触发的 JDBC 日志组件替换,说明 log4jdbc 的单行配置能力,并梳理 p6spy 在执行耗时、连接上下文、JDBC URL、日志过滤和自定义格式化方面形成的轻量级可观测能力。
2026-08-28
✨ 新增
- 新增 一次 User-Agent 解析引发的内存与登录性能问题:从 YAUAA 缓存怀疑到删除无用功能,记录旧项目 Heap 长时间维持高位与登录接口额外耗时约 1 秒的排查过程,通过 heap dump、缓存对照实验及源码分析定位历史遗留的 User-Agent 解析逻辑,并移除当前业务不再使用的相关代码与依赖。
- 新增 PageHelper 两种分页写法对比:一次泛型失真的排查与源码分析,对比
doSelectPageInfo与显式接收List<T>后构造PageInfo的分页写法,从源码关系解释泛型失真的原因,并给出让方法签名、Mapper 返回类型与实际数据保持一致的维护方式。 - 新增 Logback 的 debug.log 和 info.log 为什么几乎一样:一次旧项目多 root 配置排查,记录 Spring Boot 旧项目中两个日志文件内容近似的问题排查,解释多个
root与ThresholdFilter共同作用下的日志行为,并将配置统一收敛为单一root。 - 新增 Docker 旧服务端口配置失真:一次
--net=host环境下的排查与统一维护,记录旧 Docker 服务历史端口配置与 Java 实际监听不一致的排查过程,通过运行态反查、Dubbo QoS 识别和端口用途确认,重新建立可信的端口清单与统一维护方式。 - 新增 Docker 服务去除 --net=host:从 host 网络回到 bridge 的一次改造记录,记录生产环境 Java 服务从 Docker host 网络迁移回 bridge 网络的改造过程,说明端口显式化、服务网络边界收敛,以及 Nacos 注册地址与跨宿主机访问问题的处理方式。
- 新增 Quarkus 容器 RSS 持续增长:一次 JVM Heap 正常但 Native Memory 膨胀的问题排查,记录 Quarkus + JDK 21 服务在 Docker 中 RSS 持续增长的排查过程,并通过
MALLOC_ARENA_MAX=2的正向与反向实验,进一步确认问题与 glibc malloc arena / native allocator 行为高度相关。 - 新增 一个 4 年来从未生效的 JVM 参数:Docker 中 JAVA_OPTS 的误区,记录 Docker 环境中
JAVA_OPTS不会被 JVM 自动读取的问题排查过程,并介绍通过JAVA_TOOL_OPTIONS让 JVM 参数生效及验证的方法。
2026-08-27
✨ 新增
- 新增 Spring Boot 2.2 + Micrometer 中 JVM 指标消失:一次 MeterRegistry 提前初始化问题排查,记录自定义
AsyncConfigurer构造器依赖MeterRegistry引发 JVM 指标缺失的排查与规避过程,并梳理 Spring Bean 初始化时序对监控指标注册的影响。 - 新增 微服务访问报 No route to host:一次 firewalld 端口未放行问题排查,记录微服务跨节点访问失败的定位与修复过程,并说明为什么 firewalld 未放行端口也可能表现为
No route to host。
2026-08-25
✨ 新增
- 新增 HTTPS 证书申请失败排查:secondary validation DNS timeout,记录 1Panel 申请 HTTPS 证书时 DNS 查询超时的排查过程,包括现场保留、DNS 与 HTTP 链路验证、CA 对照实验及证据边界。
2026-08-24
✨ 新增
- 新增 ETF 的份额是怎么产生的?,从募集期认购与成立后的一级市场申购赎回出发,理解 ETF 最初的份额如何形成,以及基金总份额为什么还能继续增加或减少。
- 新增 我在证券账户里买 ETF,钱到底去了哪里?,从一次普通的 ETF 买入出发,区分二级市场买卖与基金申购,理解买入 ETF 时资金去了哪里,以及 ETF 份额发生了什么变化。
2026-08-14
✨ 新增
- 上线探索技术专题,新增 从“一屏多看几个依赖”开始:一次 Maven POM 简化设计的历史探索,从依赖声明过于冗长的使用痛点出发,梳理 Maven 社区关于 XML attributes、GAV identity、POM authoring 与模型演进的历史讨论和设计取舍。
🚀 改进
- 普通文章页新增字数与预计阅读时间提示,自动统计中英文正文并排除代码块,无需手工维护文章字数。
2026-08-11
✨ 新增
- 新增 同样跟踪一个指数的 ETF,为什么还会有区别?,从搜索沪深300 ETF 时出现多个结果的经历出发,认识基金规模、流动性、费用、跟踪效果、成立时间和单位价格等差异。
- 新增 ETF 为什么会出现折价和溢价?,从基金净值与市场价格的差异出发,理解 ETF 折溢价的形成,以及申购赎回和套利机制如何影响市场价格。
- 新增 从支付宝基金到 ETF,从场外基金的使用经历出发,探索证券账户和 ETF 带来的交易方式变化,理解基金净值、市场价格和成交机制之间的区别。
2026-08-07
✨ 新增
- 新增 支付宝里的基金,到底是什么?,从支付宝购买基金的经历出发,认识基金背后的资产组合、主动与被动投资、净值与成本、申购赎回及相关费用,以及场外基金的基本运行方式。
2026-08-06
✨ 新增
- 新增 风险与收益:为什么高收益伴随高波动?,从投资收益的不确定性出发,理解风险的本质,以及投资如何在收益、风险和个人目标之间寻找平衡。
- 新增 投资收益到底来自哪里?,从社会发展、企业价值创造和资产回报出发,探索长期投资收益形成背后的逻辑。
- 新增 普通投资者为什么需要了解投资?,从普通人的长期资金管理出发,重新认识投资的意义,以及资金、风险、收益和个人目标之间的关系。
- 新增 为什么账户余额增加,购买力却不一定同步增加?,从储蓄和购买力变化出发,重新观察账户余额、实际购买力与长期资金安排之间的关系。
- 新增 从收入支出开始,理解现金流与净资产,从一个月的收入与支出开始,重新观察个人财务中的现金流、现金结余与净资产,并理解消费、资产配置和负债选择如何影响未来财务状态。
2026-08-05
✨ 新增
- 新增 为什么不同市场状态,需要不同的历史统计?,介绍如何按趋势、波动和流动性拆分历史样本,比较不同市场状态下的价格触达分布,并检查状态定义的时间顺序、样本量和稳定性。
- 新增 历史上,价格通常能走多远?,介绍如何以昨日收盘价为起点,通过历史最高价和最低价构造价格波动样本,并利用触达比例、历史分布和百分位方法理解目标价格的历史出现频率。
- 新增 为什么有些东西看起来很值钱,却不一定是资产?,从价值与现金流两个视角重新理解资产,认识到同一个词在不同语境下,可能回答的是不同的问题。
2026-08-03
✨ 新增
- 新增 为什么我开始重新学习金钱?,记录从“会挣钱、会存钱”到主动理解金钱的认知变化,以及阅读如何让我开始不断追问那些每天都在接触、却从未认真思考过的问题。
2026-08-01
✨ 新增
- 新增 为什么余额宝既显示“每万份收益”,又显示“七日年化”?,从当天结果与近期水平两个时间尺度出发,理解每万份收益和七日年化分别回答什么问题,以及为什么不能互相替代。
- 新增 为什么余额宝里的钱能比较方便地转出?,从基金赎回、资产流动性和快速到账服务出发,理解转出便利背后依靠的是流动性管理,而不是资金一直停留在账户里。
- 新增 为什么余额宝会显示“七日年化”?,从最近七天的基金收益与年度折算方式出发,理解七日年化反映的是近期收益水平,而不是未来一年的收益承诺。
- 新增 为什么余额宝里的金额经常变化?,继续追问货币基金的投资结果如何反映到页面金额,理解基金收益经过计算、分配并通过红利再投资转成新的基金份额,最终体现为余额变化。
- 新增 为什么把钱放进余额宝后,它不会一直放在那里?,继续追问货币基金收到资金后会如何运作,理解余额宝页面金额背后的基金资产并不会静止存放,而是会按照规则参与金融市场运作。
- 新增 为什么把钱放进余额宝,不是把钱存进支付宝?,从一次看似普通的转入出发,理解为什么把钱转入余额宝,并不是把钱存进支付宝,而是持有了一份货币基金。
2026-07-31
✨ 新增
- 新增 为什么有探索金融?,记录从银行卡和第一笔存款开始,在解决真实问题的过程中逐步认识储蓄、现金管理、基金、ETF、融资、投资研究与全球资产的探索路线。
- 新增 为什么钱放在银行会有利息?,从储户与银行的不同视角出发,一步步理解银行为什么愿意支付利息,以及存款、借款与利息之间的关系。
2026-07-30
✨ 新增
- 新增 如何利用历史数据寻找交易机会?,介绍如何从市场现象发现研究方向,将交易想法转化为可验证假设,并通过明确规则、比较基准、收益风险分析和样本外验证寻找具有统计依据的交易机会。
- 新增 为什么技术指标需要历史验证?,介绍技术指标与交易信号之间的关系,以及如何通过交易规则、历史样本、比较基准和样本外验证判断指标是否具有研究价值。
2026-07-28
✨ 新增
- 新增 为什么历史数据不能直接给出交易答案?,介绍历史数据无法直接产生交易结论的原因,以及如何通过假设、统计分析、回测和持续验证建立交易判断。
- 新增 一个交易信号,什么样的统计结果才值得相信?,介绍如何通过统计口径、样本、基准比较、收益风险分析和样本外验证,判断一个交易想法是否具备持续研究的价值。
- 上线数据实验室,新增 为什么投资研究需要可靠的数据来源?,介绍投资研究中数据来源的重要性,以及如何从来源、完整性、统计口径、时间一致性和可复现性等方面建立可靠的数据基础。
2026-07-23
✨ 新增
- 新增 TdxQuant 前复权行情随查询结束日期变化的踩坑记录,分析前复权行情受查询结束日期影响的问题,提供最小复现代码,并给出保持前复权口径一致的工程实现方案。
2026-07-22
✨ 新增
- 新增 历史行情里究竟有哪些数据?,介绍交易研究中常见的五类数据,并说明不同数据分别能够回答什么问题。
2026-07-21
✨ 新增
- 新增 为什么历史行情值得研究?,介绍为什么交易研究需要从历史行情出发,并通过样本、统计和验证,将市场观察转化为可验证的交易假设。
2026-07-19
✨ 新增
- 新增 安装通达信金融终端与 Python 环境,介绍通达信终端版本选择、Python 环境、依赖库以及 Windows 虚拟机中的运行准备。
- 新增 使用 curl 和 Python 获取第一份行情数据,介绍如何通过本地 HTTP 接口和 Python API 验证 TdxQuant,并完成历史 K 线刷新与行情数据获取。
- 新增 封装内部行情服务,介绍如何为 TdxQuant 建立内部行情 API 边界,并梳理统一响应、数据转换、访问鉴权和长期运行等工程化问题。
2026-07-17
✨ 新增
- 新增 为什么会有“做T实验”?,介绍“做T实验”的建立初衷,以及如何通过数学、统计学、工程和资产配置,持续研究市场波动。
- 新增 什么样的标的才算适合做T?,介绍长期做T标的的选择标准,以及流动性、手续费、波动、长期价值和长期坚持等核心因素。
- 新增 为什么我最终选择了红利ETF?,介绍为什么红利ETF最符合小刘实验室的长期做T标准,以及做T与长期资产配置之间的关系。
2026-07-16
✨ 新增
- 新增 为什么一厘价差也能产生收益?——做T的数学基础,介绍做T收益背后的数学原理。
🚀 改进
- 新增全站更新日志页面,并在顶部导航中增加入口。
- “金融实验”导航重新整理,更方便查找相关实验。
- 在“做T实验”下增加“基础认知”文档目录。
2026-07-15
- 上线“金融实验”,增加金融基础、做T实验、金融实验和内容路线图。
- 将“做T专题”统一更名为“做T实验”,并重新整理相关链接与内容目录。
- 完善“微信支付”的页面说明、扩展阅读、常见问题和搜索引擎信息。
- 优化网站首页的实验室入口与页面样式。
- 网站正式启用 docs.xiaoliulab.com 独立域名。
2026-07-09
- 新增微信 JSAPI Pay 最小接入指南。
- 新增微信 H5 Pay 支持情况说明。
2026-07-08
- 完善微信 Native Pay 和 Code Pay 文档结构与示例说明。
- 增加公众号二维码等文档资源。
- 配置本地开发端口与允许访问的主机。
2026-07-07
- 上线基于 VitePress 的文档网站。
- 新增专题化首页及基础视觉样式。
- 网站支持自动发布和持续更新。
- 建立网站文档改造计划。
2026-07-06
- 创建小刘实验室文档。