Add ability to have several servers
diff --git a/core/kg/cmd/commands/root.go b/core/kg/cmd/commands/root.go
index 812cdf1..b5c92e2 100644
--- a/core/kg/cmd/commands/root.go
+++ b/core/kg/cmd/commands/root.go
@@ -33,17 +33,10 @@
FileLocation: "server.log",
}
logger := log.NewLogger(config)
- srv, err := server.NewServer(logger)
- if err != nil {
- logger.Error(err.Error())
- return err
- }
- defer srv.Shutdown()
+ grpcServer := server.NewGRPCServer(logger)
+ servers := server.New(logger)
+ servers.AddServers(grpcServer)
+ servers.Run()
- serverErr := srv.Start()
- if serverErr != nil {
- logger.Error(err.Error())
- return serverErr
- }
return nil
}
diff --git a/core/kg/go.mod b/core/kg/go.mod
index 5efcf10..5b1e996 100644
--- a/core/kg/go.mod
+++ b/core/kg/go.mod
@@ -7,6 +7,7 @@
github.com/jmoiron/sqlx v1.3.1
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.1.3
+ github.com/vardius/shutdown v1.0.2
go.uber.org/zap v1.16.0
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 // indirect
golang.org/x/tools v0.0.0-20200313205530-4303120df7d8 // indirect
diff --git a/core/kg/go.sum b/core/kg/go.sum
index 114f18a..04cc7b0 100644
--- a/core/kg/go.sum
+++ b/core/kg/go.sum
@@ -229,6 +229,8 @@
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/vardius/shutdown v1.0.2 h1:wNHRpdYc+KvJ3Q9KmkwKiqsnaW5LfkcP9ElXXv0OpC4=
+github.com/vardius/shutdown v1.0.2/go.mod h1:rvvQd32kv5NJycU1l4VJtqrJKY0Gg0IoQpVxZJeL44M=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
diff --git a/core/kg/server/grpc_server.go b/core/kg/server/grpc_server.go
new file mode 100644
index 0000000..c36c7d2
--- /dev/null
+++ b/core/kg/server/grpc_server.go
@@ -0,0 +1,62 @@
+package server
+
+import (
+ "net"
+ "os"
+
+ "github.com/giolekva/pcloud/core/kg/log"
+ "github.com/giolekva/pcloud/core/kg/store"
+ "google.golang.org/grpc"
+)
+
+const listenerPort = ":9081"
+
+// GRPCServerImpl grpc server implementation
+type GRPCServerImpl struct {
+ Log *log.Logger
+ srv *grpc.Server
+ store store.Store
+}
+
+var _ Server = &GRPCServerImpl{}
+
+// NewGRPCServer creates new GRPC Server
+func NewGRPCServer(logger *log.Logger) Server {
+ a := &GRPCServerImpl{
+ Log: logger,
+ }
+
+ pwd, _ := os.Getwd()
+ a.Log.Info("GRPC server current working", log.String("directory", pwd))
+ return a
+}
+
+// Start method starts an app
+func (a *GRPCServerImpl) Start() error {
+ a.Log.Info("Starting GRPC Server...")
+
+ // settings := model.NewConfig().SqlSettings
+ // a.store = sqlstore.New(settings)
+
+ lis, err := net.Listen("tcp", listenerPort)
+ if err != nil {
+ a.Log.Error("failed to listen: %v", log.Err(err))
+ return err
+ }
+
+ a.srv = grpc.NewServer()
+
+ a.Log.Info("GRPC Server is listening on", log.String("port", listenerPort))
+ if err := a.srv.Serve(lis); err != nil {
+ a.Log.Error("failed to serve: %v", log.Err(err))
+ return err
+ }
+ return nil
+}
+
+// Shutdown method shuts server down
+func (a *GRPCServerImpl) Shutdown() error {
+ a.Log.Info("Stopping GRPC Server...")
+ a.srv.GracefulStop()
+ return nil
+}
diff --git a/core/kg/server/server.go b/core/kg/server/server.go
deleted file mode 100644
index 12c2905..0000000
--- a/core/kg/server/server.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package server
-
-import (
- "net"
- "os"
-
- "github.com/giolekva/pcloud/core/kg/log"
- "github.com/giolekva/pcloud/core/kg/store"
- "google.golang.org/grpc"
-)
-
-const listenerPort = ":9081"
-
-// Server type defines application global state
-type Server struct {
- Log *log.Logger
- srv *grpc.Server
- store store.Store
-}
-
-// NewServer creates new Server
-func NewServer(logger *log.Logger) (*Server, error) {
- a := &Server{
- Log: logger,
- }
-
- pwd, _ := os.Getwd()
- a.Log.Info("Current working", log.String("directory", pwd))
- return a, nil
-}
-
-// Start method starts an app
-func (a *Server) Start() error {
- // settings := model.NewConfig().SqlSettings
- // a.store = sqlstore.New(settings)
-
- lis, err := net.Listen("tcp", listenerPort)
- if err != nil {
- a.Log.Error("failed to listen: %v", log.Err(err))
- return err
- }
-
- a.srv = grpc.NewServer()
-
- a.Log.Info("Server is listening on", log.String("port", listenerPort))
- if err := a.srv.Serve(lis); err != nil {
- a.Log.Error("failed to serve: %v", log.Err(err))
- return err
- }
- a.Log.Info("Server stopped")
- return nil
-}
-
-// Shutdown method shuts server down
-func (a *Server) Shutdown() {
- a.Log.Info("Stopping Server...")
- a.srv.GracefulStop()
-}
diff --git a/core/kg/server/servers.go b/core/kg/server/servers.go
new file mode 100644
index 0000000..d197666
--- /dev/null
+++ b/core/kg/server/servers.go
@@ -0,0 +1,69 @@
+package server
+
+import (
+ "os"
+
+ "github.com/giolekva/pcloud/core/kg/log"
+ "github.com/vardius/shutdown"
+)
+
+// Server interface
+type Server interface {
+ Start() error
+ Shutdown() error
+}
+
+// Servers represents different server services
+type Servers struct {
+ servers []Server
+ logger *log.Logger
+}
+
+// New provides new service application
+func New(logger *log.Logger) *Servers {
+ return &Servers{
+ logger: logger,
+ }
+}
+
+// AddServers adds servers to service
+func (ss *Servers) AddServers(servers ...Server) {
+ ss.servers = append(ss.servers, servers...)
+}
+
+// Run runs the service application
+func (ss *Servers) Run() {
+ for _, server := range ss.servers {
+ go func(server Server) {
+ if err := server.Start(); err != nil {
+ ss.logger.Error("can't start server", log.Err(err))
+ os.Exit(1)
+ }
+ }(server)
+ }
+ shutdown.GracefulStop(func() { ss.shutdown() })
+}
+
+func (ss *Servers) shutdown() {
+ ss.logger.Info("shutting down...")
+
+ errCh := make(chan error, len(ss.servers))
+
+ for _, server := range ss.servers {
+ go func(server Server) {
+ errCh <- server.Shutdown()
+ }(server)
+ }
+
+ for i := 0; i < len(ss.servers); i++ {
+ if err := <-errCh; err != nil {
+ go func(err error) {
+ ss.logger.Error("shutdown error", log.Err(err))
+ os.Exit(1)
+ }(err)
+ return
+ }
+ }
+
+ ss.logger.Info("gracefully stopped")
+}