关于 Golang Go语言 gin 程序如何热更新的问题
大家好,请教一下 我准备使用 gin 来做后端 api 接口 但是在部署和热更新方案上比较困惑 应该怎样来实现 gin 程序的热更新呢 (还望大家不吝赐教)
关于 Golang Go语言 gin 程序如何热更新的问题
不是有负载均衡吗,逐个重启更新节点,服务不会中断的.
更多关于关于 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 := &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 ?
endless 足够
reuseport 起新进程然后 kill 老服务
小产品,不足以引入 k8s😂
好嘞,感谢,也是准备试试这个方案。
单机器的话, 写个脚本部署自动部署到不同的端口, 然后 nginx -s reload 监听新端口, 停止旧服务
多机器的话, 滚动更新就好了
官网有方案,写了用go<br> routes.RegisterRoutes(engine)<br><br> srv := &http.Server{<br> Addr: ":" + port,<br> Handler: engine,<br> ReadTimeout: 10 * time.Second,<br> WriteTimeout: 10 * time.Second,<br> MaxHeaderBytes: 1 << 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 && 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> _ = <-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 ,这样最终完成所有后端服务的版本更新。但如果你后端是单机在跑的话就不太适合。
试下这个吧 reuseport+gracefulShutdown: https://github.com/jensneuse/GoGracefulReusePort
关于Golang中Gin程序如何实现热更新的问题,以下是一些专业建议:
Gin是一个高性能的Go语言Web框架,它自带热更新功能。要实现Gin程序的热更新,你可以考虑以下方法:
-
使用Gin框架自带的热更新功能:
- Gin框架支持在不重启服务器的情况下,通过修改代码并重新编译来更新应用程序。这通常需要借助一些文件监控工具或库,如fsnotify,来检测代码文件的变化,并在检测到变化时自动重新编译和重启应用程序。
-
利用第三方库:
- 可以使用如fresh这样的第三方库来帮助实现热更新。fresh是一个简单的Go语言工具,它可以在代码发生变化时自动重新构建和重启应用程序。
-
配置管理:
- 在Gin框架中,可以使用Viper等配置管理库来管理应用程序的配置,并支持动态更新配置。这有助于在不重启应用程序的情况下,通过修改配置文件来调整应用程序的行为。
-
注意事项:
- 在实施热更新时,需要确保线程安全和资源释放,避免因为代码更新而导致的数据不一致或资源泄漏问题。
- 同时,建议在生产环境中实施热更新前进行充分的测试和验证,以确保新代码的稳定性和可靠性。
综上所述,Gin程序的热更新可以通过多种方法实现,选择合适的方法取决于你的具体需求和环境。