~bigbes/core-go

bbb9e45c5d637da2c4df9e5d423e234f570222c6 — Conrad Hoffmann 4 months ago 0c56cc1
server: support multiple bind addresses
1 files changed, 21 insertions(+), 10 deletions(-)

M server/server.go
M server/server.go => server/server.go +21 -10
@@ 66,7 66,7 @@ var (
type Server struct {
	Schema graphql.ExecutableSchema

	addr        string
	addr        []string
	metricsAddr string
	pprofAddr   string
	conf        ini.File


@@ 85,7 85,7 @@ type Server struct {
// parses command line arguments and uses the provided configuration for setting
// up the server and initializing the [crypto] subsystem.
func New(service, defaultAddr string, conf ini.File, args []string) *Server {
	addr := defaultAddr
	var addr []string
	metricsAddr := ":0"
	pprofAddr := "localhost:0"



@@ 97,7 97,7 @@ func New(service, defaultAddr string, conf ini.File, args []string) *Server {
	for _, opt := range opts {
		switch opt.Option {
		case 'b':
			addr = opt.Value
			addr = append(addr, opt.Value)
		case 'd':
			debug = true
		case 'm':


@@ 106,6 106,9 @@ func New(service, defaultAddr string, conf ini.File, args []string) *Server {
			pprofAddr = opt.Value
		}
	}
	if len(addr) == 0 {
		addr = append(addr, defaultAddr)
	}

	crypto.InitCrypto(conf)



@@ 365,13 368,17 @@ func (server *Server) WithQueues(queues ...*work.Queue) *Server {

// Run the server. Blocks until SIGINT is received.
func (server *Server) Run() {
	qlisten, err := reuseport.Listen("tcp", server.addr)
	if err != nil {
		panic(err)
	var qservers []*http.Server
	for _, addr := range server.addr {
		qlisten, err := reuseport.Listen("tcp", addr)
		if err != nil {
			panic(err)
		}
		qserver := &http.Server{Handler: server.root}
		qservers = append(qservers, qserver)
		go qserver.Serve(qlisten)
	}
	log.Printf("Running on %s", server.addr)
	qserver := &http.Server{Handler: server.root}
	go qserver.Serve(qlisten)

	mux := &http.ServeMux{}
	mux.Handle("/metrics", promhttp.Handler())


@@ 400,13 407,17 @@ func (server *Server) Run() {
	log.Println("Terminating server...")
	ctx, cancel := context.WithDeadline(context.Background(),
		time.Now().Add(30*time.Second))
	qserver.Shutdown(ctx)
	for _, qserver := range qservers {
		qserver.Shutdown(ctx)
	}
	cancel()

	log.Println("Terminating work queues...")
	log.Printf("Progress available via Prometheus stats on port %d",
		plisten.Addr().(*net.TCPAddr).Port)
	work.Join(server.queues...)
	qserver.Close()
	for _, qserver := range qservers {
		qserver.Close()
	}
	log.Println("Server terminated.")
}