使用 Go 语言实现优雅的服务器重启
2023-09-11 14:16:09 时间
跳出这个循环的最简单方式是在socket监听器上设置一个超时,当调用listener.SetTimeout(time.Now())后,listener.Accept()会立即返回一个timeout err,你可以捕获并处理:
注意这个操作与关闭listener有所不同。这样进程仍在监听服务器端口,但连接请求会被操作系统的网络栈排队,等待一个进程接受它们。
启动新进程Go提供了一个原始类型ForkExec来产生新进程.你可以与这个新进程共享某些消息,例如文件描述符或环境参数。
execSpec := syscall.ProcAttr{
Env: os.Environ(),
Files: []uintptr{os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
}
fork, err := syscall.ForkExec(os.Args[0], os.Args, execSpec)
[…]
你会发现这个进程使用完全相同的参数os.Args启动了一个新进程。
发送socket到子进程并恢复它正如你先前看到的,你可以将文件描述符传递到新进程,这需要一些UNIX魔法(一切都是文件),我们可以把socket发送到新进程中,这样新进程就能够使用它并接收及等待新的连接。
但fork-execed进程需要知道它必须从文件中得到socket而不是新建一个(有些兴许已经在使用了,因为我们还没断开已有的监听)。你可以按任何你希望的方法来,最常见的是通过环境变量或命令行标志。
文件描述没有被随机的选择为3,这是因为uintptr的切片已经发送了fork,监听获取了索引3。留意隐式声明问题。
最后一步,等待旧服务连接停止到此为止,就这样,我们已经将其传到另一个正在正确运行的进程,对于旧服务器的最后操作是等其连接关闭。由于标准库里提供了sync.WaitGroup结构体,用go实现这个功能很简单。
每次接收一个连接,在WaitGroup上加1,然后,我们在它完成时将计数器减一:
Go打包 部署 优雅的把Go项目部署到Linux服务器 go项目运行之后,修改.env文件不会立即生效,需要重启go服务才会生效;go项目运行之后,修改config.ini配置文件会立即生效,无需重启go服务
使用Go代替Ruby,将服务器数量从30降到2 使用另一种语言去重写一个服务,听起来是不是很折腾?然而云服务供应商Iron.io就这么做了,并成功的将服务器从30台降至了2台。Iron.io在其官方博客上公布了整个事件的始末,下面来了解一下:
Go 开发关键技术指南 | 带着服务器编程金刚经走进 2020 年(内含超全知识大图) 从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 3 篇。
用go-module作为包管理器搭建go的web服务器 本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器。并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档。
go之道--搭建高性能服务器 搭建一个后台服务器, 有很种方法与模式,c/c++使用epoll, nodejs的V8等都能实现。 今天我们来看看go server的模式。 同以往其他语言底层采用epoll模式略有不同,golang采用了goroutine(协程)+channel的模式。 ![image.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/
相关文章
- Go语言阅读小笔记,来自知呼达达关于unsafe.Pointer的分享.
- Golang 用go-sql-driver 调用MySQL存储过程时的问题排查
- GO:格式化代码
- Go container 容器数据类型:heap、list 、ring
- go tls实现TLS 服务器和客户端通讯
- go github.com/gin-gonic/gin详解
- Go: go module
- Go: go-redis
- go版本升级
- Go-MySQL-Driver,让Go语言拥抱MySQL
- idea配置go依赖下载
- 编译delve时报错"../../pkg/proc/native/proc_linux.go:170:16: undefined: strings.ReplaceAll"如何处理?
- 优秀的 Go 存储开源项目和库
- 华为开发者联盟生态市场企业特惠GO第1期—应用软件专题
- Go语言学习笔记(一) : 搭建Windows下的Go开发环境
- GO语言练习:第一个Go语言工程--排序
- protoc-gen-go: unable to determine Go import path for "xxx.proto"
- Go开发中配置一个Logger日志的功能实现(结合zap日志库)
- go打包 部署 优雅的把go项目部署到Linux服务器
- 【历史上的今天】11 月 10 日:初代 Windows 诞生;Word 之父出生;Go 语言发布
- Pokemon Go覆盖全球26个国家 玩家涌入导致服务器宕机