grpc 的 server 端如何实现代码的热更新?

2019-05-06 14:24:39 +08:00
 flighter

如果只有一台服务器作为服务端,以提供给客户端进行连接,如果更新 grpc 服务端的代码,怎么在不影响连接用户的情况下,进行平稳更新?

4304 次点击
所在节点    程序员
12 条回复
gz911122
2019-05-06 14:41:47 +08:00
....
1 启动一个新的 rpc 服务..
2 验证是否正确无误
3Nginx 指向新的 rpc 服务,
4 确认没问题后关闭旧的 rpc 服务
opengg
2019-05-06 14:55:26 +08:00
微服务、去中心、优雅退出、分流、摘除节点。
www5070504
2019-05-06 19:42:31 +08:00
之前有过类似的想法 想到两个方法不知道对不对 抛砖引玉一下

一个是有另外一个服务负责像#1 说的 切换服务和关闭旧的服务

还有一个就是用 python 中的__import__()替换 那些能够热更新的 web 框架应该都会有类似的机制吧
doublleft
2019-05-06 19:46:21 +08:00
@gz911122 grpc 不是会维持长连接吗,nginx reload 不会导致连接断开么 。应用级的热更新好一点吧 endless graceful 这种
index90
2019-05-06 21:31:35 +08:00
go 是为微服务而生的,巨石应用那套热更新方案不适用了。
蓝绿部署(如一楼所说),金丝雀发布了解一下。
SlipStupig
2019-05-06 21:37:19 +08:00
ingress 了解一下
petelin
2019-05-06 21:41:22 +08:00
@doublleft 长链接底下也是一来一回 告诉上面不要在发请求过来了不就可以断掉了吗
index90
2019-05-06 21:41:33 +08:00
@doublleft 正常业务情况下,server 只是持有连接,至于连接断不断开由 client 控制。grpc client 通过 resolver (例如 DNS )来获取最新的 IP 列表,从而更新自己的长连接。

如果你是接入层应用的 server,你可以其前面增加一个 gateway,gateway 上有 grpc client,该 client 根据名字服务来更新自己的连接。你可以在修改完名字服务后,等待 client 都切换好连接后更新你的接入层应用 server。
jimrok
2019-05-06 21:48:27 +08:00
server 把 client 踢下去,client 重新查询注册库,找到新的服务,重新连上去。
wweir
2019-05-07 06:34:00 +08:00
用 grace net 的库
seeusoon
2019-05-07 10:41:24 +08:00
微服务中的 服务注册与发现 这个概念了解一下
joyme
2019-05-07 13:09:05 +08:00
我最近也在做相关的工作,一些可以参考的文献:
https://grisha.org/blog/2014/06/03/graceful-restart-in-golang/
https://github.com/fvbock/endless

大概思路是:
1.在主进程 fork 一个子进程,然后在子进程重新监听
2.子进程执行初始化的一系列操作,然后开始接收新的连接
3.子进程通知父进程停止接收新的连接,然后处理完正在处理的连接后停止

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

https://www.v2ex.com/t/561470

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

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

© 2021 V2EX