首页 / 作者AUTHOR / SPRINGFORALL

hello

记录技术探索,分享实践心得。

共 1900 篇文章

一个程序员独自维护 Healthchecks.io 11 年,定时任务监控做到月收入 2.6 万美元

定时任务监控服务 Healthchecks.io 从 2015 年上线起只有创始人 Pēteris Caune 一个人,官网 2026 年 10 月公布 MRR 2.6 万美元、付费账户 1236 个。按他的博客复盘从 5 美元 MRR 起步、不招人不追大客户的做法和四档定价,并用 Spring Boot 定时任务接上自建的开源版实际跑了一遍。

Java 采样分析器 async-profiler 4.6 直推 OTLP,不加 -t 就收不到线程名

async-profiler 4.6 能把 profile 以 OTLP 格式直接 POST 到 HTTP 端点,wall clock 的线程过滤改为按线程名,内置 HTTP 服务器被删掉。在 Spring Boot 4.1.1 应用上接本地接收端实测:默认路径是 /v1development/profiles,不加 -t 时请求体里没有线程名,端点不通时 asprof 退出码为 200。

把 Spring Boot 3.5 项目升到 4.1,classic starter 带进的 gRPC 会让 Security 应用起不来

把一个 Web、JPA、Security、Actuator、Validation 的 Spring Boot 3.5.16 项目升到 4.1.1,每步一个 git 提交:主代码不用改,测试切片和 TestRestTemplate 换了包,@MockBean 已删。4.1.1 的 spring-boot-starter-classic 会带进 spring-boot-grpc-server 却不带 Spring gRPC,CSRF 没关的 Security 应用启动即报 NoClassDefFoundError,4.0.8 没有这个问题,排除该模块即可。换成模块化 starter 时,只引 spring-security-test 会让 @WebMvcTest 里没有 HttpSecurity。

Java 的 Stream Gatherers 按金额切批、按字段去重,漏写 finisher 最后一批会丢

Stream Gatherers 在 JDK 24 由 JEP 485 定稿。这里用 JDK 27 和 Spring Boot 4.1 跑了 windowFixed、windowSliding、scan 三个内置 gatherer,再用 Gatherer.ofSequential 写了按字段去重和按累计金额切批两个自定义操作,顺带讲清 push 的返回值怎么让流短路、finisher 怎么在流末收尾。

开源博客平台 Ghost 没有投资人,创始人也不持股,年化营收 1115 万美元

开源发布平台 Ghost 由非营利基金会运营,没有投资人,两位创始人也不持股。截至 2026 年 10 月 19 日,官网显示年化营收 1115 万美元。按官网数据和创始人 John O'Nolan 的自述,看它怎么靠 Kickstarter 起步,用开源免费加托管收费养活全职团队(2024 年时 30 多人),以及现在的四档定价。

Spring Boot 4.1 接 NullAway 的 JSpecify 模式,漏报的空指针全在 JDK 和 Jackson 上

在 Spring Boot 4.1.1 项目里写了 17 处不判空的调用,接上 Error Prone 2.50.0 和 NullAway 0.14.2 实测:JSpecify 模式报 12 个错误,Spring API 上直接标 @Nullable 的返回值全部拦下;List.get、System.getProperty、HashMap.put 和 RowMapper 里的 ResultSet.getString 要加 JSpecifyExperimental 才报,Jackson 的 JsonNode.get 始终漏网。JDK 21 上要配 .mvn/jvm.config 和 -XDaddTypeAnnotationsToSymbol=true,编译耗时中位数从 2248 ms 到 4139 ms。