[coding] # _

Recent Posts

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...

PostgreSQL 10 JSON 全文检索(译)

published on
译文版权@归原文所有. 这是对 JSON 数据的又一个很酷的补充. 现在我们可以轻松地添加 json 值的全文搜索. 一个它如何运作的快速例子: $ select id, jsonb_pretty(payload) from test; id | jsonb_pretty ----+------------------------------------------------------------------------------------------------------------- 1 | { + | "glossary": { + | "title": "example glossary", + | "GlossDiv": { + | "title": "S", + | "GlossList": { + | "GlossEntry": { + | "ID": "SGML", + | "Abbrev": "ISO 8879:1986", + | "SortAs": "SGML", + | "Acronym": "SGML", + | "GlossDef": { + | "para": "A meta-markup language, used to create markup languages such as DocBook. Read More...

Categories

Note (1)

Tech (5)

Tags

2016 (1) database (2) editor (1) emacs (1) gin (1) go (2) graceful (1) http (1) json (1) note (1) postgres (2) sql (1) web (1)