公司微服务上了 Spring Cloud Gateway,一切正常直到有一天运维发现某个下游服务挂了,Gateway 还是把流量往那台死掉的实例上发,前端一阵 502。查了注册中心,Nacos 上那台实例的状态还是 UP。原来是服务进程虽然活着,但业务线程池被耗尽了,所有请求都在排队超时。Nacos 的心跳包是单独的线程处理的,业务线程池死了不影���心跳,所以注册中心一直认为它是健康的。 这就是"假在线"——健康检查过了不代表服务能用。今天聊聊怎么在 Gateway 层做主动业务探测,把假在线的节点从路由表里动态踢出去。 注册中心健康检查的盲区 Nacos、Eureka 这些注册中心判断服务是否健康,靠的是心跳。客户端定期发一个心跳包给注册中心,注册中心收到了就认为服务活着。 但心跳包只能证明网络没断、进程没死。以下场景心跳都是正常的: 业务线程池打满,所有请求都在排队超时 数据库连接池耗尽,每次数据库查询都失败 依赖的下游全挂了,返回的全是 500 死锁,只有心跳线程还在工作 这些情况下,注册中心说服务是 UP,Gateway 就把流量发过去,结果全是 502 或 500。 ....
