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

news/2024/9/30 9:28:48

gin使用fvbock/endless

gin 正常使用注册路由时:

package mainimport "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 mainimport ("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 mainimport ("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 endless501 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 endless501 84638     1   0  8:09PM ttys004    0:00.01 ./endless

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

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

  1. 老的进程收到信号
  2. 启动了一个新的进程,端口号还是8000,但是进程号变了
  3. 老进程不会处理新的连接了,但是会依然处理还没有处理完的老连接,直到所有老的连接都处理完,进程就会默默离开了
  4. 新的进程会处理新的连接,整个服务正常运行

信号

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

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

$ kill -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/45232.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

typroa图片上传脚本

typroa的图片上传脚本,针对Telegraph-Image项目,适用于macOS和Linux系统。安装json处理器macOSbrew install jqLinux:# Debian/Ubuntu apt install jq -y​ 脚本配置 编辑脚本,在以下位置填入你的图床url: # 自定义URL部分 base_url=""注意:网址url后不需要加 …

HTML中的文本居中

本文将详细介绍如何在HTML中实现文本居中,包括使用不同的HTML标签和CSS属性来达到这一目的。HTML中的文本居中 参考:html center text 在网页设计中,文本居中是一种常见的布局需求,用于提高页面的美观性和用户体验。HTML(HyperText Markup Language)作为构建网页内容的标…

HbuilderX 4.15版本 text标签不能用v-html渲染,会失效

如题,注意uni-notice-bar组件,里面用了标签v-html渲染,所以4.15版本的uni-notice-bar组件不要用,坑

论文阅读:UniMS-RAG: Unified Multi-Source RAG for Personalised Dialogue

UniMS-RAG: Unified Multi-Source RAG for Personalised Dialogue(https://arxiv.org/abs/2401.13256) https://github.com/jiangnanboy/paper_read_note一.概述本研究探讨如何分解RAG过程,加入多文件检索、记忆和个人信息等元素。大型语言模型(llm)在自然语言任务中表现出色…

Windows defender:威胁服务已经停止

前言 最近遇到了一件棘手的事情,Windows defender无法启动,Windows更新失败。 我是发现电脑的好多文件被劫持,图片,excel表格,pdf文档,好多文件后缀被改为.locked,想解锁得花费0.1bit,大概5万元。 网上的操作挺多的,又是命令行又是搞注册表的,没啥卵用。 环境 版本:…

学习记录

1. 用户注册用户可以通过注册功能创建自己的账户。注册信息包括以下内容: - 用户ID(学号) - 用户名(姓名) - 手机号码 - 用户单位(班级)首次注册后,用户的姓名将被记录,无需每次输入。2. 设定每周学习目标每周一,用户可以设定学习目标,包括具体的任务目标,如完成数…

redis——P2:对P1的思考

到P1结束,redis都已经是一个不错的服务了,具体体现在缓存应用程序需要的数据,甚至在内存爆满的条件下还可以提供服务,似乎目的已经达成。但是实际上可能会遇到一些极端的情况,比如宕机。如果redis宕机了怎么办?目前所有的数据都存储在内存当中,宕机意为着失去所有缓存的…

会议预约管理信息系统

1、项目背景: 会议是企业进行决策、协商的重要组织形式,是企业日常办公处理事务的重要手段,是办公流程中不可缺少的重要环节,作为企业,如何有效的进行会议组织,管理各种会议文档和会议资源,是关系到企业领导进行日常企业运作处理的大事。提高会议效率、发挥会议功能、规…