golang grpc 如何进行热重启 graceful

问题描述

想使用php调用golang的grpc服务进行通信,但是怕在上线后 进行程序的修改,想在不停机的情况下进行修改程序,想知道golang的grpc服务如何进行热重启

阅读 8.7k
4 个回答
新手上路,请多包涵

其实你是担心直接重启服务, 会有处理到一半的请求被中断了, 导致尴尬的局面.
你要的并不是热重启, 而是优雅关闭.
grpc框架支持优雅关闭的.
基本原理是, 你监听一个信号, 收到信号时调用grpc的GracefulStop接口, 这时grpc会首先关闭对外监听的fd, 这时就不会有新的请求进来. 而已经在处理的请求则会继续处理完, 然后再关闭服务.
在grpc关闭对外监听的fd后的那个瞬间, 你其实可以启动你的新程序了, 所以基本上中断时间很短, 而原来处理着的请求并不会有问题.

一般后端服务会有冗余部署,前端通过 elb 中间层访问,或者使用 consul 之类的服务注册发现机制,串行重启或者分批次重启,可以做到不停服

热重启这种基本上没有吧,但是可以不重启,把把变化的项做成配置文件,热加载配置文件是可行的

这个库应该可以帮到你,使用这个库可以实现Go应用的平滑重启,自动更新

https://github.com/jpillora/overseer

新手上路,请多包涵

热重启原理,基本就是 弄个类似runtime的全局的变量组,把平时运行时的常量、加载的东西全部挂到这个上面,然后重启时候收到信号,对这个变量组的值,进行克隆,旧的上面关,新的上面开。该关闭重开的重开,该重新加载的加载。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题