首页 > 其他分享 >go gin web服务器使用fvbock/endless优雅地重启或停止

go gin web服务器使用fvbock/endless优雅地重启或停止

时间:2024-06-18 20:23:20浏览次数:27  
标签:web main SIGRTMAX fvbock 进程 go gin SIGRTMIN endless

gin使用fvbock/endless

gin 正常使用注册路由时:

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

使用 fvbock/endless

package main

import (
    "github.com/fvbock/endless"
    "github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
    endless.ListenAndServe(":8000", r)   // 注意这一行要使用endless
}

编译

$ go build -o endless test.go  
$ ./endless   
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
2024/06/18 20:00:29 83605 :8000
[GIN] 2024/06/18 - 20:02:06 | 200 |      34.249µs |       127.0.0.1 | GET      "/ping"

控制台也有相应的响应:[GIN] 2024/06/18 - 20:02:06 | 200 | 34.249µs | 127.0.0.1 | GET "/ping"

修改源码,重新编译

注意之前的服务不要动,重新开新的窗口

修改源码,重新编译

package main

import (
    "github.com/fvbock/endless"
    "github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong111", // 这行被修改了
		})
	})
    endless.ListenAndServe(":8000", r)   // 注意这一行要使用endless
}

此时新编译的包,会覆盖当前的旧包

go build -o endless test.go

查看进程

$ ps -ef | grep endless
  501 83605 82947   0  8:00PM ttys004    0:00.02 ./endless

使用kill命令向老进程发送信号,这里是关键

kill -1 83605

这时第一个窗口就会有如下输出:

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
2024/06/18 20:09:16 84638 :8000
2024/06/18 20:09:16 83605 Received SIGTERM.
2024/06/18 20:09:16 83605 [::]:8000 Listener closed.
2024/06/18 20:09:16 83605 Waiting for connections to finish...
2024/06/18 20:09:16 83605 Serve() returning...

再次查看进程,发送请求

$ ps -ef | grep endless
  501 84638     1   0  8:09PM ttys004    0:00.01 ./endless

endless进程还在,可进程号变了,内容也变了

这里发生了变化,流程如下:

  1. 老的进程收到SIGHUP信号,拒绝新连接请求旧进程,但要保证已有连接正常
  2. 启动了一个新的子进程,端口号还是8000
  3. 新的子进程开始 Acce,系统将新的请求转交新的子进程,老进程不会处理新的连接了,但是会依然处理还没有处理完的老连接,直到所有老的连接都处理完
  4. 旧进程处理完所有旧连接后正常结束,新的进程会处理新的连接,整个服务正常运行

信号

信号是 Unix 、类 Unix 以及其他 POSIX 兼容的操作系统中进程间通讯的一种有限制的方式

它是一种异步的通知机制,用来提醒进程一个事件(硬件异常、程序执行异常、外部发出信号)已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程。此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

endless server 监听以下几种信号量:

  • syscall.SIGHUP:触发 fork 子进程和重新启动
  • syscall.SIGUSR1/syscall.SIGTSTP:被监听,但不会触发任何动作
  • syscall.SIGUSR2:触发 hammerTime
  • syscall.SIGINT/syscall.SIGTERM:触发服务器关闭(会完成正在运行的请求)

endless 正正是依靠监听这些信号量,完成管控的一系列动作

标签:web,main,SIGRTMAX,fvbock,进程,go,gin,SIGRTMIN,endless
From: https://www.cnblogs.com/niuben/p/18255013

相关文章

  • 一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)
    一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)rotatelogsrotatelogs是一个用于管理日志文件的Go语言库,它提供了自动轮换、压缩和删除旧日志文件的功能。这个库可以帮助你更好地管理和维护你的应用程序日志。要使用rotatelogs,你需要先安装它:goget......
  • Django框架入门必会三板斧,Django静态文件 static,Django有两种静态文件, Django框架
    ⅠDjango框架入门必会三板斧【一】Django项目如何添加新功能启动django项目之后如何添加更多的功能回想自己编写的web框架如果要添加功能就去urls.py和views.py【1】添加URL映射在项目的urls.py文件中,通过导入相应的应用(app)及其视图函数,并使用path()或include()......
  • 视频监控汇聚平台Liveweb安防监控平台实现接入监控视频集中管理方案
    随着各行业数字化转型的不断推进,视频监控技术在行业内的安防应用及管理支撑日益增多。然而,由于前期规划不清晰、管理不到位等问题,视频监管系统普遍存在以下问题:1.各部门单位在视频平台建设中以所属领域为单位,导致系统孤立分散、统筹性差,未进行统一规划、统一部署,导致各平台之......
  • 视频监控集中管理方案设计:Liveweb视频智能监管系统方案技术特点与应用
    随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。为了解决这些问题,深圳好游科技推出的视频汇聚管理Liveweb视频监控平......
  • 如何利用 Perl 高效地构建和维护复杂的 Web 应用程序,以及与当前主流的 Web 框架和技术
    Perl是一种通用的脚本语言,可用于构建和维护复杂的Web应用程序。以下是利用Perl高效构建和维护复杂的Web应用程序的一些建议:使用现代化的Web框架:Perl有一些流行的Web框架,例如Dancer、Mojolicious和Catalyst。这些框架提供了丰富的功能和工具,可以快速开发和......
  • Golang与设计模式
    单例模式因为之前研究Java比较多,所以当我试着使用go来实现一些设计模式的时候,首先想到的就是照搬Java中的思路,后面对go了解加深之后又增加了一些新的思路。在Java中实现的单例模式的思路有很多,但是比较好的两个思路是利用类加载机制生成单例对象,check-lock-check机制避免并发问......
  • 查看mongo的bson数据文件
    转载请注明出处:BSON(BinarySerializedDocumentFormat)是MongoDB中用于存储和传输数据的一种二进制形式的存储格式,它基于JSON格式,但比JSON更松散,支持更多的数据类型。MongoDB使用BSON作为其文档的存储格式,这意味着当驱动程序使用文档进行插入、查询或其他操作时,会先将文档编......
  • go使用opentelemetry+jaeger---grpc
    clientpackagemainimport( "context" "fmt" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.op......
  • go使用opentelemetry+jaeger---gin+gprc
    api-1packagemainimport( "context" "fmt" "github.com/gin-gonic/gin" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" "go.opentelemetry.io/otel" "go.opentelemetr......
  • MongoDB 的集群架构与设计
    本文涉及的产品云数据库MongoDB,通用型2核4GB推荐场景:五天玩转MongoDB训练营  简介:MongoDB的集群架构与设计一、前言MongoDB有三种集群架构模式,分别为主从复制(Master-Slaver)、副本集(ReplicaSet)和分片(Sharding)模式。Master-Slaver是一种......