littleboss

littleboss: supervisor construction kit

Github星跟蹤圖

littleboss: self-supervising Go binaries

A Go package, littleboss lets you turn your program into a
a self-supervising binary.
It starts itself as a child process, monitors its life cycle,
reloads it if it exits, and can be instructed to replace it with
a new binary.

The supervisor can open sockets for you and share them across
reloads of your program, ensuring no connections are dropped.

You can install it with:

go get crawshaw.io/littleboss

Make a program use littleboss by modifying the main function:

func main() {
	lb := littleboss.New("service-name")
	lb.Run(func(ctx context.Context) {
		// main goes here, exit when <-ctx.Done()
	})
}

The service name is used to identify which program the supervisor will control.

Usage

By default the supervisor is bypassed and the program executes directly.
A flag, -littleboss, is added to the binary.
It can be used to start a supervised binary and manage it:

$ mybin &                     # binary runs directly, no child process
$ mybin -littleboss=start &   # supervisor is created
$ mybin2 -littleboss=reload   # child is replaced by new mybin2 process
$ mybin -littleboss=stop      # supervisor and child are shut down

Configuration

Supervisor options are baked into the binary.
The littleboss struct type contains fields that can be set before calling
the Run method to configure the supervisor.
Options include reloading the previous binary if a reload fails,
controlling how long an exiting program has to turn down its connections,
and specifying exactly what flags control and are passed by littleboss.

An HTTP server example

func main() {
	lb := littleboss.New("myblog")
	flagHTTPS := lb.Listener("https", "tcp", ":443", "address")
	lb.Run(func(ctx context.Context) {
		httpMain(ctx, flagHTTPS.Listener())
	})
}

func httpMain(ctx context.Context, ln net.Listener) {
	srv := &http.Server{
		ReadTimeout:  10 * time.Second,
		WriteTimeout: 10 * time.Second,
		IdleTimeout:  60 * time.Second,
		Handler:      blogHandler,
	}
	go func() {
		if err := srv.ServeTLS(ln, "certfile", "keyfile"); err != nil {
			if err == http.ErrServerClosed {
				return
			}
			log.Fatal(err)
		}
	}()

	<-ctx.Done()
	srv.Shutdown(ctx)
}

主要指標

概覽
名稱與所有者crawshaw/littleboss
主編程語言Go
編程語言Go (語言數: 1)
平台
許可證ISC License
所有者活动
創建於2018-05-14 14:01:52
推送於2019-03-17 18:56:09
最后一次提交2019-03-17 14:56:02
發布數0
用户参与
星數638
關注者數14
派生數16
提交數45
已啟用問題?
問題數7
打開的問題數3
拉請求數5
打開的拉請求數0
關閉的拉請求數0
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?