grpc 的 server 端如何实现代码的热更新? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
flighter

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

  •  
  •   flighter 2019 年 5 月 6 日 5310 次点击
    这是一个创建于 2545 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    大概思路是:
    1.在主进程 fork 一个子进程,然后在子进程重新监听
    2.子进程执行初始化的一系列操作,然后开始接收新的连接
    3.子进程通知父进程停止接收新的连接,然后处理完正在处理的连接后停止
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1090 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 69ms UTC 18:23 PVG 02:23 LAX 11:23 JFK 14:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86