后端架构师正淘汰这3种过时微服务治理模式
|
去年春天,我在测试机型号是 Dell OptiPlex 7080 的那台机器上,蹲守了整整三天——就为复现那个“服务注册失败但健康检查却通过”的问题。白板没擦干净,上面还留着上周画的链路图,墨迹糊了一块,像一摊干掉的咖啡渍。有人端着杯子站了很久,在工位旁听我们争论,杯底在空调出风口下结了层薄霜。
文章配图,仅供参考 不是服务挂了,是它活得比你还精神:/actuator/health 返回 UP,/eureka/apps 列表里名字亮得晃眼,可一查日志,ConfigServer 拉配置超时、Feign 调用卡在 CONNECTING、下游接口压根没收到请求头里的 traceId。控制台报错里夹着一行 WARN:`Could not resolve placeholder 'spring.cloud.config.uri' in value "${spring.cloud.config.uri}"`——这行字我熟得能默写,因为去年六月它出现在我们灰度环境里,前天又蹦进预发环境构建日志第 1423 行。 第一种过时模式:硬编码 Eureka Server 地址 + 启动时拉全量服务列表 + 压根不监听实例变更事件。他们还在用 @Value("${eureka.client.service-url.defaultZone}") 注入地址,而不是用 DiscoveryClient 接口动态发现;注册用的是 application.yml 里写死的 IP:port,不是容器注入的 SERVICE_HOST/SERVICE_PORT;更绝的是,心跳检测开着,但 onApplicationEvent 监听 ServiceInstanceRegisteredEvent 的那段代码,被注释掉了——注释人是谁?Git 提交记录里写的是“暂时屏蔽,等二期再处理”,时间戳是 2021 年 9 月 17 日,作者是后端架构师本人。他现在改推 Nacos 了,但旧集群还在跑,没人敢动注册中心那套 bootstrap.yml 逻辑。 第二种:OpenFeign + Ribbon 手写 fallbackFactory,每个接口都自己 new HystrixCommand,熔断阈值写在 @HystrixCommand(fallbackMethod = "fallback") 里,fallback 方法里又手动 new FeignBuilder() 构建降级 client。我翻过他们测试机上的 /tmp/feign-log-202404.log,全是重复打印 `Failed to decode response body with content-type=application/json;charset=UTF-8`——根本不是格式问题,是 fallback 返回了个空对象,而调用方的 DTO 层没加 @JsonInclude(JsonInclude.Include.NON_NULL),反序列化直接抛 JsonMappingException,然后 fallback 又兜回来重试,线程池撑爆。键盘上有个键掉了,是 R 键,我敲 rerun 的时候总得用 Caps Lock + r 凑合。 第三种最要命:用 Spring Cloud Gateway 当胶水层,路由规则全写 yml 里,每加一个新服务就要改三处——predicates 里加 path,filters 里配 rewritePath,uri 写死 http://xxx-service:8080。结果某天凌晨,运维在 K8s 上把 xxx-service 的 Deployment 改了 replica 从 2→5,Gateway 的 service discovery 缓存没刷新,流量只打到前两个 Pod,后三个一直吃不到请求,监控看 QPS 飙升但错误率纹丝不动,直到有人翻出网关日志里那行 `Cached instances for xxx-service: [xxx-service-7b8d6c4f8f-qw2r9, xxx-service-7b8d6c4f8f-t9k8m]`——缓存过期时间写的是 30 分钟,可没人记得改。谁在背后走过碰了椅子,那把转椅发出咔哒一声脆响,我抬头看见隔壁工位显示器是竖着的,正打开 Grafana 看 gateway_upstream_response_time_p95。 不是说它们不能用,是当团队规模过了三十人、日均调用量跨过百万级、CI 流水线每次构建都要重新解压 fat jar 再塞进镜像时,这些模式就不是“够用”,而是“埋雷”。我亲眼看着产品临时加需求——要在登录页嵌一个风控弹窗,后端硬生生往 gateway-routes.yml 里加了第七个 /login/ 规则,结果把原有的 /login/callback 路由盖住了;设计给的图没有标注按钮禁用态交互,后端顺手把 `/api/v1/user/info` 的熔断 timeout 从 800ms 改成 3s 应对慢查询,结果整个用户中心首页首屏转圈、按钮点了没反应、控制台一片红,还不是一处红,是三处:gateway 日志、feign 日志、还有业务服务自己的 access.log,三地 timestamp 差着 2 秒,你猜是哪个环节在 mock 数据? 外卖到了没人去拿,袋子在茶水间门口堆成小山。我不着急修,先盯着性能面板的一行:`http_client_requests_seconds_count{method="POST",status="500",uri="/login"} 1872`——这是过去五分钟的累积值。数字本身没吓我,吓我的是它的增长曲线平得像尺子画出来的。说明问题不在突增,而在恒定泄漏。就像去年三月那个周五下午,也是这样,没人喊停,大家等着“下个迭代”解决,结果下个迭代来了,它还在,再下个迭代,它开始咬下游,咬 Kafka,咬 DB 连接池,最后咬到 CI 流水线超时——那次构建日志最后一行是 `Build timed out after 30 minutes`,后面没跟任何栈,只有 Jenkins 自动 kill 的信号:`SIGTERM`。 我今晚打算把测试机上那个 docker ps -a 里挂着的 eureka-server:v2.2.5 容器删了,不管它有没有被依赖。删之前会 curl 一下 /eureka/apps,确认它底下只剩自己一个 instance。如果还有别的,我就得去翻 Git 历史——找那个 2021 年注释掉事件监听的人,问他当时屏蔽的到底是什么事件,以及,他是不是还保留着那份没提交的本地 patch。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


后端架构师亲授:网站视觉与性能协同优化12要点
后端架构师三步调优,服务器吞吐量翻倍
