帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:监视器  REST  graceful  Binaries  Monit  SELF  BIN  restarting  
Monitorable, gracefully restarting, self-upgrading binaries in Go (golang)

  • 源代码名称:overseer
  • 源代码网址:http://www.github.com/jpillora/overseer
  • overseer源代码文档
  • overseer源代码下载
  • Git URL:
    git://www.github.com/jpillora/overseer.git
  • Git Clone代码到本地:
    git clone http://www.github.com/jpillora/overseer
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/jpillora/overseer
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • overseer

    GoDoc

    overseer 是一个用于创建monitorable的软件包,它可以正常地重新启动,在 go ( golang ) in自动升级二进制文件。 本项目的主要目标是使自己的升级二进制文件与标准流程管理器一起创建。

    overseer diagram

    通常,正常的重启由活动进程( 深蓝色 ) 执行,关闭它的监听器并将这些匹配侦听套接字文件传递到新的启动进程。 这里重新启动导致任何收费的前台进程监视错误检测程序崩溃。 overseer 试图通过使用一个小进程执行这个套接字文件交换和代理信号,并从活动进程中退出代码来解决这个问题。

    特性

    • 简单
    • 流程经理( systemd。upstart。主管等) 一起工作
    • 优雅,零停止时间重新启动
    • 轻松自我升级二进制文件

    安装

    go get github.com/jpillora/overseer

    快速示例

    这个程序与流程管理器一起工作,支持优雅。零停机时间重启和自己升级自己的二进制程序。

    package mainimport (
     "fmt""log""net/http""time""github.com/jpillora/overseer""github.com/jpillora/overseer/fetcher")//create another main() to run the overseer process//and then convert your old main() into a 'prog(state)'funcmain() {
     overseer.Run(overseer.Config{
     Program: prog,
     Address: ":3000",
     Fetcher: &fetcher.HTTP{
     URL: "http://localhost:4000/binaries/myapp",
     Interval: 1 * time.Second,
     },
     })
    }//prog(state) runs in a child processfuncprog(stateoverseer.State) {
     log.Printf("app (%s) listening...", state.ID)
     http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
     fmt.Fprintf(w, "app (%s) says hellon", state.ID)
     }))
     http.Serve(state.Listener, nil)
    }

    工作方式:

    • overseer 使用主进程检查并安装升级和子进程以运行 Program
    • 主进程检索由 Address/es 描述的侦听器的文件。
    • 子进程提供了这些文件,这些文件被转换为 Listener/s,供 Program 使用。
    • 所有子进程管道都连接到主进程。
    • 在主进程上接收的所有信号都被转发到子进程。
    • Fetcher 在一个goroutine中运行,并在预先配置的时间间隔检查更新。 当 Fetcher 返回有效的二进制流( io.Reader ) 时,主进程将它的保存到临时位置,验证它,替换当前二进制文件并启动一个正常的。
    • fetcher.HTTP 接受 URL,它用头部请求轮询这个 URL,直到它检测到一个变化。 在改变时,我们 GETURL 并将它的返回到 overseer。 另请参阅 fetcher.S3
    • 收到二进制文件后,它使用简单的echo 令牌运行,以确认它是 overseer 二进制文件。
    • 在预定的子进程退出后,退出的子进程将导致主进程以相同的代码退出。 因此,overseer 不是流程管理器

    请参见这里的配置 uration选项和运行时状态可以在这里使用。

    更多示例

    查看示例/ 目录并运行 example.sh,你将看到以下输出:

    $ cd example/
    $ sh example.sh
    BUILT APP (1)
    RUNNING APP
    app#1 (031c802ee74f00b2a5c52f2fe647523973c09441) listening...
    app#1 (031c802ee74f00b2a5c52f2fe647523973c09441) says hello
    app#1 (031c802ee74f00b2a5c52f2fe647523973c09441) says hello
    BUILT APP (2)
    app#2 (25d19f139f50f39fadbd066b438ebdc28d818eb1) listening...
    app#2 (25d19f139f50f39fadbd066b438ebdc28d818eb1) says hello
    app#2 (25d19f139f50f39fadbd066b438ebdc28d818eb1) says hello
    app#1 (031c802ee74f00b2a5c52f2fe647523973c09441) says hello
    app#1 (031c802ee74f00b2a5c52f2fe647523973c09441) exiting...
    BUILT APP (3)
    app#3 (5ed8170e5bbd6947cc514c87ac29e7acfba5cffc) listening...
    app#3 (5ed8170e5bbd6947cc514c87ac29e7acfba5cffc) says hello
    app#3 (5ed8170e5bbd6947cc514c87ac29e7acfba5cffc) says hello
    app#2 (25d19f139f50f39fadbd066b438ebdc28d818eb1) says hello
    app#2 (25d19f139f50f39fadbd066b438ebdc28d818eb1) exiting...
    app#3 (5ed8170e5bbd6947cc514c87ac29e7acfba5cffc) says hello

    注意:app#1 在上次请求关闭之前一直运行。

    只使用优美的重启
    funcmain() {
     overseer.Run(overseer.Config{
     Program: prog,
     Address: ":3000",
     })
    }

    发送 mainSIGUSR2 ( Config.RestartSignal ) 以手动触发重新启动

    只使用自动升级,不重新启动
    funcmain() {
     overseer.Run(overseer.Config{
     Program: prog,
     NoRestart: true,
     Fetcher: &fetcher.HTTP{
     URL: "http://localhost:4000/binaries/myapp",
     Interval: 1 * time.Second,
     },
     })
    }

    尽管它将需要手动重新启动,但是适用于创建自我升级命令行应用程序。

    使用动态获取 URL的多平台二进制文件
    funcmain() {
     overseer.Run(overseer.Config{
     Program: prog,
     Fetcher: &fetcher.HTTP{
     URL: "http://localhost:4000/binaries/app-"+runtime.GOOS+"-"+runtime.GOARCH,
     //e.g.http://localhost:4000/binaries/app-linux-amd64 },
     })
    }

    已知问题

    • 无法通过升级更改进程的主 overseer.Config,必须重新启动主进程。
      • 因此,Addresses 只能通过重新启动主进程来更改。
    • 当前的mv 移动文件,因为 mv 处理的分区与 os.Rename 不同。
    • 仅在darwin和linux上支持。
    • 在启动过程中,包 init() 函数将运行两次,一次在主进程中运行,一次在子进程中运行。

    更多文档

    第三方 Fetchers

    Docker

    将你的overseerapp 编译为 /path/on/docker/host/dir/app

    然后运行它:

    #run the app inside a standard Debian containerdocker run -d -v/path/on/docker/host/dir/:/home/-w/home/debian/home/app

    对于测试,在 --rm -it ( 退出。输入。终端remove删除 -d ( 守护进程) )

    为了将最新的二进制文件存储在主机上,app 应该将它的父目录装载为卷

    如果操作系统未附带TLS证书,则可以通过主机将它们挂载到 -v/etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt

    请参见 CONTRIBUTING.md



    文章标签:REST  BIN  监视器  Monit  golang  SELF  Binaries  graceful  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语