Spring Cloud Gateway CORS 配置混乱:多服务重复定义跨域易冲突?网关统一拦截+动态响应头注入
   公司有 30 多个微服务,每个服务的后端开发都自己配了一份 CORS。结果前端调接口时,有的服务返回了 Access-Control-Allow-Origin,有的没返回,有的返回了 *,有的返回了具体域名。浏览器一看响应头不一致——有的 OPTIONS 预检过了,有的直接被 CORS 策略拦住,前端报了满屏的 blocked by CORS policy。查了半天才发现是服务 A 配了 allowedOrigins(*, example.com),服务 B ......
CORS配置   多服务重复定义   跨域   网关统一拦截   |  2026-06-28   0 评论   6 浏览

SpringBoot 微服务优雅停机失败:K8s 滚动更新丢请求?PreStop 钩子+连接排空机制实战
   公司 K8s 每次发版都有几个 502。查了监控,规律很明显——总是在旧 Pod 被 kill 的那几秒。原来是 K8s 滚动更新的时候,先发 SIGTERM 给旧 Pod,然后立刻把流量切到新 Pod。但旧 Pod 上还有正在处理的请求——SIGTERM 一来,进程直接退,请求半途而废。前端就 502 了。 Spring Boot 2.3 以后支持优雅停机,但光配 server.shutdown=graceful 还不够。K8s 的流量切换和 Pod 停 ......
SpringBoot   微服务   优雅停机   K8s   |  2026-06-28   0 评论   9 浏览

WebSocket连到65535条突然全断了,文件描述符耗尽不是Bug是物理极限
   我们做一个实时行情推送系统,WebSocket 长连接撑到 65535 条的时候突然全断。新连接报 Too many open files,老连接陆续被操作系统干掉,连 SSH 都登不上去了。 运维以为是 DDoS,查了半天发现攻击源是自己的业务流量——推送服务每一条 WebSocket 连接占用一个文件描述符(fd),65535 条连接刚好打满一台机器默认的 fd 上限。 Linux 里一切皆文件——Socket 是文件,管道是文件,连 tail -f 也 ......
WebSocket   连接数   系统瓶颈   文件描述符耗尽   |  2026-06-26   0 评论   12 浏览

消费者挂了半小时,RocketMQ里堆了800万条消息,恢复后消费了6个小时
   那天下午,库存服务一次 fullGC 把消费者线程全停了。GC 持续了 28 分钟,消费者一直没心跳,RocketMQ 以为它还活着就没触发重平衡。等 GC 结束消费者恢复,队列里已经堆了 800 万条订单消息。 按正常消费速度,一个消费者每秒 200 条,800 万条要 11 个小时才能消化完。下游的物流、短信、积分服务全在等这条消费者的结果——11 个小时的延迟等于业务停摆。 这不是"能不能消费完"的问题。这是"等你消费完,用户早就不关心了"的问题。 我 ......
消息积压   紧急扩容   消费端宕机   队列堆积   |  2026-06-26   1 评论   18 浏览

一个 if-else 写了 800 行,产品让我加一个条件我加了三天
   新来的同事第一次接手营销规则模块,打开 CouponStrategy.java 沉默了五分钟。 800 行,全是 if-else。 if ("FULL_REDUCTION".equals(couponType)) { if (orderAmount >= 100) { if ("VIP".equals(userLevel)) { if (isFirstOrder) { discount = orderAmount * 0.7; } else { dis ......
复杂决策树   扁平化优化   规则引擎   自动解析   |  2026-06-25   0 评论   13 浏览

Kafka消费者重启后重复处理了80万条消息,库存直接扣成负数
   凌晨一点,库存服务报警:有 30 个商品库存变成了负数。扣成了 -500、-1200,离谱的是这些商品白天就卖完了。 查了半小时,线索指向凌晨零点的一次容器滚动发布。新 Pod 启动后重新消费,从上次提交的 offset 开始读。但问题出在——上次提交的 offset 是 3 小时前的。 日志里拉出一条关键记录: 2026-06-21 00:16:23.456 WARN o.a.k.c.c.i.ConsumerCoordinator - Auto offse ......
KafkaOffset   提交失败重试   网络抖动   消息重复消费   |  2026-06-25   0 评论   18 浏览

两个运营同时改了同一个规则,后保存的把先保存的覆盖了
   有次运营跑过来问我:"我昨天配的满减规则怎么没了?活动已经上线了,用户下单也没用券。" 查了一下操作日志,真相很简单:下午 3 点,运营 A 打开了规则编辑页,改了满减门槛从 100 降到 80。改完她没立刻保存,先去开会了。下午 3:15,运营 B 也打开同一个规则,把适用商品从"全场"改成了"指定分类",保存。 下午 4 点,运营 A 开完会回来点了保存——她手里还是下午 3 点的旧版本,里面"适用商品"还是"全场"。她一保存,运营 B 改的"指定分类" ......
QLExpress.规则并发   |  2026-06-24   0 评论   13 浏览

规则引擎每改一次就加载一次类,Metaspace默默涨到1G把服务打挂了
   凌晨四点,一台订单服务的 Pod 重启了三次。 不是 OOM killer,是老年代也正常,JVM 挂的时候堆才用了 2G(最大 4G)。诡异的是 Metaspace 占了 1.2G,而且每次重启后不到两小时又回到 1.2G。 翻 Metaspace 的内存分布,Class Count 已经飙到 15 万。正常一个 Spring Boot 服务也就 1-2 万个类。这多出来的十几万个类哪来的? 顺着加载的类名找过去——全部是 com.alibaba.qlex ......
动态脚本引擎   MetaspaceOOM   热加载   内存泄漏   |  2026-06-24   0 评论   34 浏览

一个导出接口把整台机器CPU打满,查了半天是JSON序列化
   有次运维群里收到报警:一台 8 核 16G 的服务 CPU 突然飙到 100%,持续 3 分钟没下来。 上去 top -H 一看,GC 线程没跑,业务线程没打满。占了 700% CPU 的是 tomcat 的 http-nio-8080-exec——就一个线程。 这就邪门了。一个请求,一个线程,吃的 CPU 顶得上 7 个核。 顺着线程 dump 看下去,热方法不是业务逻辑,不是数据库查询,是 com.fasterxml.jackson.core.json. ......
导出   JSON   序列化   |  2026-06-23   0 评论   31 浏览

线程池用了LinkedBlockingQueue没设容量,把整台机器搞OOM了
   凌晨运维群炸了,一条告警:订单服务响应超时率飙到 80%,紧接着 JVM 挂掉,Pod 重启。 上去一看,OOM 前老年代被打满了。heap dump 里最大的对象是一个 LinkedBlockingQueue,里面堆了 300 多万个任务对象,光队列就占了将近 2G。 翻代码,线程池是这么配的: ExecutorService executor = new ThreadPoolExecutor( 10, // corePoolSize 20, // max ......
OOM   线程池   容量   |  2026-06-23   0 评论   32 浏览

100个微服务100种日志格式:排一次故障要开10个面板,直到统一了
   去年我们团队跑了差不多半年微服务,拆分得挺爽——订单、支付、库存、物流、用户中心,每个服务独立开发独立部署。架构图上画得漂漂亮亮。 直到有一次线上故障,把我整破防了。 一个下单请求超时,从网关一路追下去:Gateway → 订单服务 → 库存服务 → 支付服务 → 回调通知。五个服务,五个开发者写的日志,五种不同的格式。 订单服务的日志长这样: 2026-06-15 14:23:11.456 [http-nio-8080-exec-3] INFO c.o.s ......
微服务   日志格式   统一格式   |  2026-06-22   0 评论   44 浏览

秒杀开始3秒,数据库连接池就被打满了,100万用户在页面上干等
   去年我们搞了一次周年庆秒杀。活动页面提前一周预热,到点那一刻,后台监控直接变成一片红。 不是 QPS 被打爆——网关和应用层都扛住了。是数据库连接池,三秒之内从 0 飙到 200(最大连接数),然后所有请求开始报 Cannot get JDBC Connection。 最离谱的是,库存表一行没动。 因为所有请求刚到数据库门口,就被连接池耗尽的异常挡回去了。秒杀还没开始,数据库先倒下了。 一、连接池为什么瞬间被榨干 常规架构下,每次请求处理到数据库这一步才会 ......
秒杀   数据库连接池   |  2026-06-22   0 评论   35 浏览

慢SQL日志一天吞65G磁盘?加了动态采样率降到1.2G
   凌晨两点,报警群里炸了。 "订单服务三台机器磁盘使用率全部超过 95%,其中一台已经 99%。下单接口开始超时,用户付不了款了。" 我迷迷糊糊掏出手机看了一眼,心头一紧。这是线上大促前夕,每秒几千单的交易量,磁盘满了意味着日志写不进去、服务随时可能挂掉。 赶紧登上服务器一看,/data/logs 目录占了整整 230G。顺着 du 一层层摸下去: /data/logs/slow-sql/ ├── 2026-06-20.log 68G ├── 2026-06- ......
慢SQL日志   动态采样   |  2026-06-21   0 评论   32 浏览

服务一直返回200,K8s却说它活着,直到业务全挂了
   去年双十一前一天,凌晨3点,被叫起来复盘一次诡异的事故。 事故的表现很魔幻:K8s 集群里所有 Pod 状态都是 Running,健康检查全部通过,Grafana 大盘一片绿。但用户反馈说下单按钮点不动,支付页面转圈圈,客诉量每分钟十几条。 运维同学第一个反应是"网络问题"。查了半小时,网络一切正常。第二个反应是"数据库挂了",DBA 看了一眼连接池——没问题。 最后顺着日志一层层摸,发现 Redis Cluster 里有一个分片的 Master 选举失败, ......
服务监控   |  2026-06-21   0 评论   34 浏览

对象存储生命周期自动化:闲置文件自动转冷存储,云存储成本直降 50%
   公司用阿里云 OSS 存用户上传的文件,标准存储每月 0.12 元/GB。半年后发现月账单从几百涨到了两万——文件总量从 1TB 涨到了 20TB,其中 80% 是三个月前上传的、再也没人访问过的文件和日志备份。这些文件一直按标准存储计费,实际上低频存储的价格只要标准存储的三分之一。 云存储的价格差异很大——标准存储最贵,低频存储便宜一半,归档存储几乎不要钱(但取回要等几小时)。问题是很多公司的文件从上传第一天就放在标准存储里,从来没动过,也从来没降级。 ......
对象存储   闲置文件   自动转冷存储   云存储成本直降   |  2026-06-20   0 评论   51 浏览