如果只有一台服务器作为服务端,以提供给客户端进行连接,如果更新 grpc 服务端的代码,怎么在不影响连接用户的情况下,进行平稳更新?
1
gz911122 2019-05-06 14:41:47 +08:00
....
1 启动一个新的 rpc 服务.. 2 验证是否正确无误 3Nginx 指向新的 rpc 服务, 4 确认没问题后关闭旧的 rpc 服务 |
2
opengg 2019-05-06 14:55:26 +08:00
微服务、去中心、优雅退出、分流、摘除节点。
|
3
www5070504 2019-05-06 19:42:31 +08:00
之前有过类似的想法 想到两个方法不知道对不对 抛砖引玉一下
一个是有另外一个服务负责像#1 说的 切换服务和关闭旧的服务 还有一个就是用 python 中的__import__()替换 那些能够热更新的 web 框架应该都会有类似的机制吧 |
4
doublleft 2019-05-06 19:46:21 +08:00
@gz911122 grpc 不是会维持长连接吗,nginx reload 不会导致连接断开么 。应用级的热更新好一点吧 endless graceful 这种
|
5
index90 2019-05-06 21:31:35 +08:00
go 是为微服务而生的,巨石应用那套热更新方案不适用了。
蓝绿部署(如一楼所说),金丝雀发布了解一下。 |
6
SlipStupig 2019-05-06 21:37:19 +08:00
ingress 了解一下
|
8
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。 |
9
jimrok 2019-05-06 21:48:27 +08:00
server 把 client 踢下去,client 重新查询注册库,找到新的服务,重新连上去。
|
10
wweir 2019-05-07 06:34:00 +08:00 via Android
用 grace net 的库
|
11
seeusoon 2019-05-07 10:41:24 +08:00
微服务中的 服务注册与发现 这个概念了解一下
|
12
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.子进程通知父进程停止接收新的连接,然后处理完正在处理的连接后停止 |