关于 Golang Go语言 gin 程序如何热更新的问题

发布于 1周前 作者 phonegap100 来自 Go语言

大家好,请教一下 我准备使用 gin 来做后端 api 接口 但是在部署和热更新方案上比较困惑 应该怎样来实现 gin 程序的热更新呢 (还望大家不吝赐教)


关于 Golang Go语言 gin 程序如何热更新的问题
17 回复

不是有负载均衡吗,逐个重启更新节点,服务不会中断的.

更多关于关于 Golang Go语言 gin 程序如何热更新的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


gin 直接打包到服务器运行的,怎么重启不会导致服务重点呢?

https://github.com/fvbock/endless 优雅重启
https://github.com/cosmtrek/air 外部工具,监控文件变动,重新编译

需要配合使用

golang<br>func runServer(addr string, engine *gin.Engine) error {<br> server := &amp;http.Server{<br> Addr: addr,<br> Handler: engine,<br> WriteTimeout: 60 * time.Second,<br> ReadTimeout: 60 * time.Second,<br> }<br><br> // 平滑关闭<br> // 下面的 notify 是基于 signal.Notify 封装的,当监听到 kill ,会将 server shutdown<br> notify.Subscribe(func() {<br> timeoutCtx, cancel := context.WithTimeout(context.Background(), 2*time.Second)<br> defer cancel()<br> server.Shutdown(timeoutCtx)<br> })<br><br> return server.ListenAndServe()<br>}<br>

上面的代码会监听 kill notify ,然后触发 shutdown ,shutdown 里面会停掉 listeners ,然后处理完所有已经连接的 socket 。

理论上可以在启动新进程的时候,来给旧进程发送 kill ,旧进程挂掉,新进程启动监听端口就好啦

air 工具的文档上提示了:NOTE: This tool has nothing to do with hot-deploy for production.,不能用于生产环境

负载均衡加 k8s 的滚动部署策略

引入 k8s ?

reuseport 起新进程然后 kill 老服务

小产品,不足以引入 k8s😂

好嘞,感谢,也是准备试试这个方案。


单机器的话, 写个脚本部署自动部署到不同的端口, 然后 nginx -s reload 监听新端口, 停止旧服务
多机器的话, 滚动更新就好了

官网有方案,写了用
go<br> routes.RegisterRoutes(engine)<br><br> srv := &amp;http.Server{<br> Addr: ":" + port,<br> Handler: engine,<br> ReadTimeout: 10 * time.Second,<br> WriteTimeout: 10 * time.Second,<br> MaxHeaderBytes: 1 &lt;&lt; 20,<br> }<br> <a target="_blank" href="http://logger.Info" rel="nofollow noopener">logger.Info</a>("Thousand-hand:listen " + port)<br> fmt.Printf("use http://localhost:%s\n", port)<br><br> go func() {<br> if err := srv.ListenAndServe(); err != nil &amp;&amp; err != http.ErrServerClosed {<br> log.Fatalf("listen: %s\n", err)<br> }<br> }()<br><br> quit := make(chan os.Signal)<br> signal.Notify(quit, os.Interrupt)<br> _ = &lt;-quit<br>


其实就是用一下 quit := make(chan os.Signal) 这个监听信号量 endless 这个有点老了,已经好多年都不更新了,官网也写了
<a target="_blank" href="https://gin-gonic.com/zh-cn/docs/examples/graceful-restart-or-stop/" rel="nofollow noopener">https://gin-gonic.com/zh-cn/docs/examples/graceful-restart-or-stop/</a>,而且如果你用的 1.8 以上,注意 1.8 不是 1.18 只要你用的版本不是很老很老的版本,你用信号量处理就好。这个是防止请求过程中出现重启的情况。

#2 ,1 楼的意思是用了负载均衡的情况下,就是你后端启用了 2 个以上的服务。你在更新 A 的时候 B 依然可以提供服务,当 A 更新完毕后再更新 B ,这样最终完成所有后端服务的版本更新。但如果你后端是单机在跑的话就不太适合。

关于Golang中Gin程序如何实现热更新的问题,以下是一些专业建议:

Gin是一个高性能的Go语言Web框架,它自带热更新功能。要实现Gin程序的热更新,你可以考虑以下方法:

  1. 使用Gin框架自带的热更新功能

    • Gin框架支持在不重启服务器的情况下,通过修改代码并重新编译来更新应用程序。这通常需要借助一些文件监控工具或库,如fsnotify,来检测代码文件的变化,并在检测到变化时自动重新编译和重启应用程序。
  2. 利用第三方库

    • 可以使用如fresh这样的第三方库来帮助实现热更新。fresh是一个简单的Go语言工具,它可以在代码发生变化时自动重新构建和重启应用程序。
  3. 配置管理

    • 在Gin框架中,可以使用Viper等配置管理库来管理应用程序的配置,并支持动态更新配置。这有助于在不重启应用程序的情况下,通过修改配置文件来调整应用程序的行为。
  4. 注意事项

    • 在实施热更新时,需要确保线程安全和资源释放,避免因为代码更新而导致的数据不一致或资源泄漏问题。
    • 同时,建议在生产环境中实施热更新前进行充分的测试和验证,以确保新代码的稳定性和可靠性。

综上所述,Gin程序的热更新可以通过多种方法实现,选择合适的方法取决于你的具体需求和环境。

回到顶部