简介

Go语言是一门编译型语言,Go包自带编译器功能(支持交叉编译),编译成可执行二进度文件。

编译

框架自带了一个建议的编译脚本,执行后生成可执行二进制文件,文件默认路径 build/bin/snow

自带编译脚本

  1. sh build/shell/build.sh

交叉编译

交叉编译,顾名思义,就是在某个系统编译出在另外一个系统架构的可执行二进制文件。

  1. GOOS={$os} GOARCH={$arch} go build -o {$target} main.go

服务启动

  1. build/bin/snow -a api #启动Api服务
  2. build/bin/snow -a cron #启动Cron任务调度服务
  3. build/bin/snow -a job #启动队列调度服务

启动参数

  1. -a 启动的应用类型,api表示HTTP服务,job表示队列服务,cron表示Crontab任务调取服务,不传使用默认值api
  2. -v 启动版本号
  3. -c 配置文件路径,默认读取当前执行用户所在目录下的.env
  4. -p 启动服务的进程号存放目录,注意是目录,如-a传的是api,则进程号的路径是:目录+api.pid
  5. -queue 当-ajob时有用,表示启用消费的topic,多个使用逗号分隔,主要是为了将队列拆分多机部署。

服务关闭

给进程号发送SIGTERM信号,服务进行平滑关闭。

备注:在启动服务时,会将进程号写入文件,执行关闭命令会通过文件路径找到进程号。

  1. build/bin/snow -c stop #通过-a参数指定关闭的模式类型 http/队列/任务调度

服务重启

给进程号发送SIGHUP信号,目前只有HTTP服务才有实现了平滑重启。

  1. build/bin/snow -c restart

信号量处理

HTTP服务监听处理的信号量:

  • SIGTERM:等待请求中的连接结束后,平滑关闭
  • SIGINT:等待请求中的连接结束后,平滑关闭
  • SIGHUP:平滑重启
    • fork子进程(使用相同的启动命令),将服务监听的socket文件描述符传递给子进程
    • 子进程监听父进程的socket,这个时候父进程和子进程都可以接收请求
    • 子进程启动成功之后,父进程停止接收新的连接,等待旧连接处理完成(或超时)
    • 父进程退出,重启完成
  • SIGUSR2:will trigger hammerTime 快捷链接

队列调度服务监听处理的信号量:

  • SIGTERM:将服务设为关闭状态,等待旧任务结束后再退出(或超时)
  • SIGINT:将服务设为关闭状态,等待旧任务结束后再退出(或超时)
  • 配合supervisor使用,重启时默认发送SIGTERM信号量关闭进程,在重新启动新进程。

任务调度服务监听处理的信号量:

  • SIGTERM:将服务设为关闭状态,再等待若干秒再退出
  • SIGINT:将服务设为关闭状态,再等待若干秒再退出
  • 配合supervisor使用,重启时默认发送SIGTERM信号量关闭进程,在重新启动新进程。