Go

Golang 服务优雅重启

published on
很多时候对于服务升级的做法简单粗暴, 就简单的杀进程启动新的进程. 还有的好一点就是多个相同的服务依次升级, 保证有服务可用. 但是公平的说这两种都会丢失请求中的连接. 鉴于这种情况, 在现实中我们可以使用优雅重启来搞定这个问题. Golang 实现优雅重启的原理也很简单: 监听 USR2 信号; 收到信号后将服务监听的文件描述符传递给新的子进程; 此时新老进程同时接收请求; 父进程停止接收新请求, 等待旧请求完成(或超时); 父进程退出. 对于上面的原理看似简单, 其实是分成了两个大的要点: 新老进程同时监听同一端口, 这个很简单, Go 很早旧支持; 如何等待旧的请求完成, 这个在 Go 1.8 (新增了Server.Shutdown) 之前是需要费一番功夫的. 我们搞定了上面的原理之后, 加上 Go 1.8 的完美等待旧请求的实现, 我实现了一个简单的优雅重启库: https://github.com/douglarek/zerodown. zerodown 完美兼容基于 Go 标准库 Server 监听服务. 对于标准库的使用, 我们可以象下面一样使用: package main import ( "fmt" "log" "net/http" "time" "github.com/douglarek/zerodown" ) func main() { http.HandleFunc("/", func(w http. Read More...

Gin-Gonic 框架中间件原理与应用

published on
在 Go 的世界里, web 框架简直多如牛毛. 前有自带电池的标准库(net/http), 后有简洁优雅的 Gin-Gonic(以下简称 Gin), 再有全栈开发一枝花 Beego, 等等不可胜数. 使用 Go 有一段时间了, web 开发一直用的 Gin. Gin 的思想和 Python 框架 Flask 有颇多相似之处, 可以称作 微框架 . Gin 包括以下几个主要的部分: 设计精巧的路由/中间件系统; 简单好用的核心上下文 Context; 附赠工具集(JSON/XML 响应, 数据绑定与校验等). 本文意在探究 Gin 中间件的执行原理. 我们先看如下的 Hello World 版 Gin 程序: package main import ( "log" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(http.StatusOK, "%s", "pong!") }) if err := r. Read More...