@@ 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.")
}