vRp.CD2g_test/server/multiple.go

69 lines
1.8 KiB
Go

package server
import (
"go.uber.org/zap"
"minotaur/utils/log"
"os"
"os/signal"
"syscall"
"time"
)
func NewMultipleServer(serverHandle ...func() (addr string, srv *Server)) *MultipleServer {
ms := &MultipleServer{
servers: make([]*Server, len(serverHandle), len(serverHandle)),
addresses: make([]string, len(serverHandle), len(serverHandle)),
}
for i := 0; i < len(serverHandle); i++ {
ms.addresses[i], ms.servers[i] = serverHandle[i]()
}
return ms
}
type MultipleServer struct {
servers []*Server
addresses []string
}
func (slf *MultipleServer) Run() {
var exceptionChannel = make(chan error, 1)
defer close(exceptionChannel)
var running = make([]*Server, 0, len(slf.servers))
for i := 0; i < len(slf.servers); i++ {
go func(address string, server *Server) {
server.multiple = true
if err := server.Run(address); err != nil {
exceptionChannel <- err
} else {
running = append(running, server)
}
}(slf.addresses[i], slf.servers[i])
}
time.Sleep(500 * time.Millisecond)
log.Info("Server", zap.String("Minotaur Multiple Server", "===================================================================="))
for _, server := range slf.servers {
log.Info("Server", zap.String("Minotaur Multiple Server", "RunningInfo"),
zap.Any("network", server.network),
zap.String("listen", server.addr),
)
}
log.Info("Server", zap.String("Minotaur Multiple Server", "===================================================================="))
systemSignal := make(chan os.Signal, 1)
signal.Notify(systemSignal, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
select {
case err := <-exceptionChannel:
for _, server := range slf.servers {
server.Shutdown(err)
}
return
case <-systemSignal:
for _, server := range slf.servers {
server.Shutdown(nil)
}
return
}
}