gin实现文件服务器拒绝了连接,Golang Gin、Beego框架简单软重启服务(仅限于开发过程中繁琐ctrl+c)...

go语言和php不一样,需要预编译加载到内存,而每次改动代码都需要重新编译。先不说线上怎么能保证服务正常的运行(强制结束进程会让正在访问的客户出现不必要的问题,体验贼差),就咱们在开发过程中,每次的修改代码ctrl+c的繁琐也很dan疼。偶NO~

想要解决以上问题,大概要实现以下几个目的

不关闭现有连接(正在运行中的程序)

新的进程启动并替代旧进程

新的进程接管新的连接

连接要随时响应用户的请求,当用户仍在请求旧进程时要保持连接,新用户应请求新进程,不可以出现拒绝请求的情况

实现优雅的重起

Air 是一款能够自动监控代码并进行热编译 Golang 项目的工具,并不局限于 Gin 项目,这里拿Gin项目来做实验。

官方文档推荐了几种下载方式:

Go

go get -u github.com/cosmtrek/air

macOS

curl -fLo air https://git.io/darwin_air

Linux

curl -fLo air https://git.io/linux_air

Windows

curl -fLo air.exe https://git.io/windows_air

当然除了以上还可以去官方的github下载,目录在本博文中没有特定的限制。

下载完成之后,下面进行编译安装,我是在mac下的,这里如果非mac环境下,或者有更深度追求的朋友们可以参考官方或者其他博文。

wangteng@wangtengdeMacBook-Pro air %pwd/Users/wangteng/go/src/github.com/cosmtrek/air. //当前目录

b65b934830e2a4726e9553e9016702d5.png

在当前目录下执行依次执行make ci,make instal

wangteng@wangtengdeMacBook-Pro air %make ci

goget -u golang.org/x/lint/golint

go: found golang.org/x/lint/golint in golang.org/x/lint v0.0.0-20200302205851-738671d3881b

go: golang.org/x/tools upgrade => v0.0.0-20200729194436-6467de6f59a7

goget -u golang.org/x/tools/cmd/goimports

go: found golang.org/x/tools/cmd/goimports in golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7

go: golang.org/x/mod upgrade => v0.3.0go: golang.org/x/xerrors upgrade => v0.0.0-20191204190536-9bdfabe68543

Install pre-commit hook

wangteng@wangtengdeMacBook-Pro air %make install1. Formatting code style2. Linting

Nice!Installing air..

113ed3fa2a1b4ac7ace20506aae430a2.png

执行完成之后进入gobin目录,会发现多了一个文件:air,这个文件表示air的可执行程序,假如其他系统或许应该配置相应的环境变量。

5d4bb7d084fbfa77d84dbb5f04cba1eb.png

然后进入你的project项目根目录下,执行air命令,这样会运行起你的go项目,当你在修改代码的时候会发现重新编译。

e322178b49598aee58b27e753cd7c196.png

这里你可以同时观察一下端口情况,发现PID进程号是随之变化的,目的也就实现了。

3e25df900d6d8dfa3cd6af4b8311fe36.png

补充:

上面执行air命令是使用的默认配置文件/Users/wangteng/go/src/github.com/cosmtrek/air/air_example.conf.

想要使用指定的air配置文件可以在项目根目录下touch一个.ari.conf文件,然后复制默认配置到当前文件中;或者干脆直接把默认配置文件复制并重命名为.ari.conf到根目录下,然后执行以下命令就是表示指定文件运行了

air -c .air.conf

Windows版

# [Air](https://github.com/cosmtrek/air) TOML 格式的配置文件

# 工作目录

# 使用 . 或绝对路径,请注意 `tmp_dir` 目录必须在 `root` 目录下

root= "."tmp_dir= "tmp"[build]

# 只需要写你平常编译使用的shell命令。你也可以使用 `make`

cmd= "go build -o ./tmp/main.exe ."# 由`cmd`命令得到的二进制文件名

bin= "tmp/main.exe"# 自定义的二进制,可以添加额外的编译标识例如添加 GIN_MODE=release

full_bin= "SET APP_ENV=dev & SET APP_USER=air & .\tmp\main.exe"# 监听以下文件扩展名的文件.

include_ext= ["go", "tpl", "tmpl", "html"]

# 忽略这些文件扩展名或目录

exclude_dir= ["assets", "tmp", "vendor", "frontend/node_modules"]

# 监听以下指定目录的文件

include_dir=[]

# 排除以下文件

exclude_file=[]

# 如果文件更改过于频繁,则没有必要在每次更改时都触发构建。可以设置触发构建的延迟时间

delay= 1000# ms

# 发生构建错误时,停止运行旧的二进制文件。

stop_on_error= true# air的日志文件名,该日志文件放置在你的`tmp_dir`中

log= "air_errors.log"[log]

# 显示日志时间

time= true[color]

# 自定义每个部分显示的颜色。如果找不到颜色,使用原始的应用程序日志。

main= "magenta"watcher= "cyan"build= "yellow"runner= "green"[misc]

# 退出时删除tmp目录

clean_on_exit= true

Mac、Linux版

# [Air](https://github.com/cosmtrek/air) TOML 格式的配置文件

# 工作目录

# 使用 . 或绝对路径,请注意 `tmp_dir` 目录必须在 `root` 目录下

root= "."tmp_dir= "tmp"[build]

# 只需要写你平常编译使用的shell命令。你也可以使用 `make`

cmd= "go build -o ./tmp/main ."# 由`cmd`命令得到的二进制文件名

bin= "tmp/main"# 自定义的二进制,可以添加额外的编译标识例如添加 GIN_MODE=release

full_bin= "APP_ENV=dev APP_USER=air ./tmp/main"# 监听以下文件扩展名的文件.

include_ext= ["go", "tpl", "tmpl", "html"]

# 忽略这些文件扩展名或目录

exclude_dir= ["assets", "tmp", "vendor", "frontend/node_modules"]

# 监听以下指定目录的文件

include_dir=[]

# 排除以下文件

exclude_file=[]

# 如果文件更改过于频繁,则没有必要在每次更改时都触发构建。可以设置触发构建的延迟时间

delay= 1000# ms

# 发生构建错误时,停止运行旧的二进制文件。

stop_on_error= true# air的日志文件名,该日志文件放置在你的`tmp_dir`中

log= "air_errors.log"[log]

# 显示日志时间

time= true[color]

# 自定义每个部分显示的颜色。如果找不到颜色,使用原始的应用程序日志。

main= "magenta"watcher= "cyan"build= "yellow"runner= "green"[misc]

# 退出时删除tmp目录

clean_on_exit= true

2 个版本最主要的差别就是 cmd、bin、full_bin 中的内容,Windows 版生成的目标文件是带.exe后缀的,Linux 版不带;full_bin 中的内容,Windows 版设置环境变量并运行是通过SET APP_ENV=dev & SET APP_USER=air & .\tmp\main.exe来进行的,而 Linux 版是通过APP_ENV=dev APP_USER=air ./tmp/main来进行的。

好了,暂时的目标达到,开发中起码不需要每次ctrl+c了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值