• 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 & .	mpmain.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 & . mpmain.exe来进行的,而 Linux 版是通过APP_ENV=dev APP_USER=air ./tmp/main来进行的。

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

     

  • 相关阅读:
    一失足千古恨在 WSL 中使用了 md 创建文件夹 (2020-04-26)
    开源中国 ThinkPHP 领奖
    投资投机脑图(2019-12-12)
    什么? 1XIN = 21BTC
    笔记:投机和投资 F4NNIU
    如何设置单个 Git 仓库的代理从而提高更新速度
    FastAdmin 使用 phpmail 出现 spl_autoload_register 错误
    plsql 引用型变量
    oracle 存储函数
    oracle存储过程(带参数的存储过程)
  • 原文地址:https://www.cnblogs.com/wt645631686/p/13405589.html
Copyright © 2020-2023  润新知