遇到可能假死的 Spring Cloud 应用, Nginx 的负载均衡应该怎么做?

2020 年 7 月 6 日
 saytesnake

不是开发人员,情况是这样的,

一个 Spring Cloud 应用配置了 nginx upstream,

upstream favresin{
      ip_hash;
      server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
      server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
      server 10.0.0.3:8080 backup;
}

遇到一个问题是,10.0.0.1:8080 假死了,但端口还是通的,而 Nginx 不知道它挂了,后端飘到 10.0.0.1:8080 后,系统也理所当然挂了。

谷歌也可以查到一些关于 Spring Cloud 健康检查的一些内容,不过我好奇,如果纯粹以运维的角度,在不修改代码的情况下,能否做到更好的负载均衡?

在 Nginx Plus 似乎看到一些相关的,不知道是否有用。

2971 次点击
所在节点    程序员
10 条回复
myCupOfTea
2020 年 7 月 6 日
额,spring cloud 不是有 gateway 吗,加上熔断把经常调用失败的服务给熔断掉
joesonw
2020 年 7 月 6 日
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check 可以不侵入业务代码, 只要有 http 接口可以被访问即可, 返回 4xx 也可以, 可以指定接受的 status 范围
miao1007
2020 年 7 月 6 日
用 consul sidecar 来规避
StevenTong
2020 年 7 月 6 日
既然不能修改代码增加 actuator health,那么把 nginx healthcheck 指定到某个简单的业务接口?
stefanaka
2020 年 7 月 6 日
有第三方的 nginx 模块
wupher
2020 年 7 月 6 日
可以通过第三方模块或者 actuator health check 来判活。偷懒点,定时重启服务也是可以的。

不过,讲真应该通过 GC log,heap dump 等工具查明为什么会出现假死,解决假死才是第一位吧。
Oktfolio
2020 年 7 月 7 日
nginx -> gateway -> api,降级、熔断
saytesnake
2020 年 7 月 7 日
@joesonw
@StevenTong

这个是 Nginx Plus 的功能吧,不过看楼下似乎是有个第三方模块。
saytesnake
2020 年 7 月 7 日
joesonw
2020 年 7 月 7 日
@saytesnake This article describes how to configure and use HTTP health checks in NGINX Plus and NGINX Open Source.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/687655

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX