Golang Gin、Beego框架簡單軟重啟服務(僅限於開發過程中繁瑣ctrl+c)


go語言和php不一樣,需要預編譯加載到內存,而每次改動代碼都需要重新編譯。先不說線上怎么能保證服務正常的運行(強制結束進程會讓正在訪問的客戶出現不必要的問題,體驗賊差),就咱們在開發過程中,每次的修改代碼ctrl+c的繁瑣也很dan疼。偶NO~

想要解決以上問題,大概要實現以下幾個目的

  1. 不關閉現有連接(正在運行中的程序)
  2. 新的進程啟動並替代舊進程
  3. 新的進程接管新的連接
  4. 連接要隨時響應用戶的請求,當用戶仍在請求舊進程時要保持連接,新用戶應請求新進程,不可以出現拒絕請求的情況

實現優雅的重起

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下載,目錄在本博文中沒有特定的限制。官方地址:https://github.com/cosmtrek/air   (里面有更詳細的說明)

下載完成之后,下面進行編譯安裝,我是在mac下的,這里如果非mac環境下,或者有更深度追求的朋友們可以參考官方或者其他博文。

 

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

 

在當前目錄下執行依次執行make ci,make instal

wangteng@wangtengdeMacBook-Pro air % make ci go get -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 go get -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.0 go: golang.org/x/xerrors upgrade => v0.0.0-20191204190536-9bdfabe68543 Install pre-commit hook wangteng@wangtengdeMacBook-Pro air % make install 1. Formatting code style 2. Linting Nice! Installing air..

執行完成之后進入gobin目錄,會發現多了一個文件:air,這個文件表示air的可執行程序,假如其他系統或許應該配置相應的環境變量。

然后進入你的project項目根目錄下,執行air命令,這樣會運行起你的go項目,當你在修改代碼的時候會發現重新編譯。

 

這里你可以同時觀察一下端口情況,發現PID進程號是隨之變化的,目的也就實現了。

補充:

上面執行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了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM