V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flighter
V2EX  ›  程序员

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

  •  
  •   flighter · 2019-05-06 14:24:39 +08:00 · 4548 次点击
    这是一个创建于 2030 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    还有一个就是用 python 中的__import__()替换 那些能够热更新的 web 框架应该都会有类似的机制吧
    doublleft
        4
    doublleft  
       2019-05-06 19:46:21 +08:00
    @gz911122 grpc 不是会维持长连接吗,nginx reload 不会导致连接断开么 。应用级的热更新好一点吧 endless graceful 这种
    index90
        5
    index90  
       2019-05-06 21:31:35 +08:00
    go 是为微服务而生的,巨石应用那套热更新方案不适用了。
    蓝绿部署(如一楼所说),金丝雀发布了解一下。
    SlipStupig
        6
    SlipStupig  
       2019-05-06 21:37:19 +08:00
    ingress 了解一下
    petelin
        7
    petelin  
       2019-05-06 21:41:22 +08:00 via iPhone
    @doublleft 长链接底下也是一来一回 告诉上面不要在发请求过来了不就可以断掉了吗
    index90
        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。
    jimrok
        9
    jimrok  
       2019-05-06 21:48:27 +08:00
    server 把 client 踢下去,client 重新查询注册库,找到新的服务,重新连上去。
    wweir
        10
    wweir  
       2019-05-07 06:34:00 +08:00 via Android
    用 grace net 的库
    seeusoon
        11
    seeusoon  
       2019-05-07 10:41:24 +08:00
    微服务中的 服务注册与发现 这个概念了解一下
    joyme
        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.子进程通知父进程停止接收新的连接,然后处理完正在处理的连接后停止
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5923 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:24 · PVG 10:24 · LAX 18:24 · JFK 21:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.