From b164adec6b1b468ea526df492c547b1a27bb822b Mon Sep 17 00:00:00 2001 From: Michael Li Date: Tue, 20 Dec 2022 12:13:16 +0800 Subject: [PATCH] optimize service initial logic --- internal/servants/mobile/auth.go | 4 ++ internal/servants/mobile/mobile.go | 4 ++ internal/service/admin.go | 5 ++- internal/service/bot.go | 5 ++- internal/service/grpc_server.go | 19 ++++----- internal/service/http_server.go | 19 ++++----- internal/service/localoss.go | 5 ++- internal/service/mobile.go | 7 ++-- internal/service/server.go | 65 +++++++++++++++++++++++------- internal/service/space.go | 5 ++- internal/service/web.go | 5 ++- internal/service/web_old.go | 5 ++- 12 files changed, 94 insertions(+), 54 deletions(-) diff --git a/internal/servants/mobile/auth.go b/internal/servants/mobile/auth.go index 00a9b747..7b66794c 100644 --- a/internal/servants/mobile/auth.go +++ b/internal/servants/mobile/auth.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package mobile import ( diff --git a/internal/servants/mobile/mobile.go b/internal/servants/mobile/mobile.go index 425b71c1..5f9ed52c 100644 --- a/internal/servants/mobile/mobile.go +++ b/internal/servants/mobile/mobile.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package mobile import ( diff --git a/internal/service/admin.go b/internal/service/admin.go index e91b68f5..52bd120b 100644 --- a/internal/service/admin.go +++ b/internal/service/admin.go @@ -74,10 +74,11 @@ func newAdminEngine() *gin.Engine { func newAdminService() Service { addr := conf.AdminServerSetting.HttpIp + ":" + conf.AdminServerSetting.HttpPort - server := httpServerFrom(addr, func() *httpServer { + server := httpServers.from(addr, func() *httpServer { engine := newAdminEngine() return &httpServer{ - e: engine, + baseServer: newBaseServe(), + e: engine, server: &http.Server{ Addr: addr, Handler: engine, diff --git a/internal/service/bot.go b/internal/service/bot.go index 2b9eef20..d1cb4ea7 100644 --- a/internal/service/bot.go +++ b/internal/service/bot.go @@ -74,10 +74,11 @@ func newBotEngine() *gin.Engine { func newBotService() Service { addr := conf.BotServerSetting.HttpIp + ":" + conf.BotServerSetting.HttpPort - server := httpServerFrom(addr, func() *httpServer { + server := httpServers.from(addr, func() *httpServer { engine := newBotEngine() return &httpServer{ - e: engine, + baseServer: newBaseServe(), + e: engine, server: &http.Server{ Addr: addr, Handler: engine, diff --git a/internal/service/grpc_server.go b/internal/service/grpc_server.go index 3f0a3b94..47e870c9 100644 --- a/internal/service/grpc_server.go +++ b/internal/service/grpc_server.go @@ -6,25 +6,20 @@ package service import ( "net" - "sync" "google.golang.org/grpc" ) +var ( + _ server = (*grpcServer)(nil) +) + // grpcServer wraper for grpc.Server type grpcServer struct { - sync.RWMutex - - listener net.Listener - server *grpc.Server - serverStatus uint8 -} - -func (s *grpcServer) status() uint8 { - s.RLock() - defer s.RUnlock() + *baseServer - return s.serverStatus + listener net.Listener + server *grpc.Server } func (s *grpcServer) start() error { diff --git a/internal/service/http_server.go b/internal/service/http_server.go index a7ca3879..105df1a2 100644 --- a/internal/service/http_server.go +++ b/internal/service/http_server.go @@ -7,25 +7,20 @@ package service import ( "context" "net/http" - "sync" "github.com/gin-gonic/gin" ) +var ( + _ server = (*httpServer)(nil) +) + // httpServer wraper for gin.engine and http.Server type httpServer struct { - sync.RWMutex - - e *gin.Engine - server *http.Server - serverStatus uint8 -} - -func (s *httpServer) status() uint8 { - s.RLock() - defer s.RUnlock() + *baseServer - return s.serverStatus + e *gin.Engine + server *http.Server } func (s *httpServer) start() error { diff --git a/internal/service/localoss.go b/internal/service/localoss.go index 3f33e7ef..7d70291d 100644 --- a/internal/service/localoss.go +++ b/internal/service/localoss.go @@ -49,10 +49,11 @@ func newLocalossEngine() *gin.Engine { func newLocalossService() Service { addr := conf.LocalossServerSetting.HttpIp + ":" + conf.LocalossServerSetting.HttpPort - server := httpServerFrom(addr, func() *httpServer { + server := httpServers.from(addr, func() *httpServer { engine := newLocalossEngine() return &httpServer{ - e: engine, + baseServer: newBaseServe(), + e: engine, server: &http.Server{ Addr: addr, Handler: engine, diff --git a/internal/service/mobile.go b/internal/service/mobile.go index 262d35af..9fa3cb64 100644 --- a/internal/service/mobile.go +++ b/internal/service/mobile.go @@ -43,7 +43,7 @@ func (s *mobileService) String() string { func newMobileService() Service { addr := conf.MobileServerSetting.Host + ":" + conf.MobileServerSetting.Port - server := grpcServerFrom(addr, func() *grpcServer { + server := grpcServers.from(addr, func() *grpcServer { l, err := net.Listen("tcp", addr) if err != nil { // TODO: optimize error process @@ -54,8 +54,9 @@ func newMobileService() Service { s := grpc.NewServer() return &grpcServer{ - listener: l, - server: s, + baseServer: newBaseServe(), + listener: l, + server: s, } }) return &mobileService{ diff --git a/internal/service/server.go b/internal/service/server.go index f2439777..336e96af 100644 --- a/internal/service/server.go +++ b/internal/service/server.go @@ -4,35 +4,70 @@ package service +import "sync" + var ( - httpServers = make(map[string]*httpServer) - grpcServers = make(map[string]*grpcServer) + httpServers = newServerPool[*httpServer]() + grpcServers = newServerPool[*grpcServer]() ) const ( - _statusServerInitilized uint8 = iota + 1 + _statusServerUnknow uint8 = iota + _statusServerInitilized _statusServerStarted _statusServerStoped ) -func httpServerFrom(addr string, newServer func() *httpServer) *httpServer { - s, exist := httpServers[addr] +type server interface { + status() uint8 + setStatus(uint8) + start() error + stop() error +} + +type serverPool[T server] struct { + servers map[string]T +} + +type baseServer struct { + sync.RWMutex + serverStatus uint8 +} + +func (p *serverPool[T]) from(addr string, newServer func() T) T { + s, exist := p.servers[addr] if exist { return s } s = newServer() - s.serverStatus = _statusServerInitilized - httpServers[addr] = s + s.setStatus(_statusServerInitilized) + p.servers[addr] = s return s } -func grpcServerFrom(addr string, newServer func() *grpcServer) *grpcServer { - s, exist := grpcServers[addr] - if exist { - return s +func (s *baseServer) setStatus(status uint8) { + s.RLock() + defer s.RUnlock() + + s.serverStatus = status +} + +func (s *baseServer) status() uint8 { + s.RLock() + defer s.RUnlock() + + return s.serverStatus +} + +func newServerPool[T server]() *serverPool[T] { + return &serverPool[T]{ + servers: make(map[string]T), + } +} + +func newBaseServe() *baseServer { + return &baseServer{ + RWMutex: sync.RWMutex{}, + serverStatus: _statusServerUnknow, } - s = newServer() - s.serverStatus = _statusServerInitilized - grpcServers[addr] = s - return s } diff --git a/internal/service/space.go b/internal/service/space.go index fd6ee217..2d5ff1ff 100644 --- a/internal/service/space.go +++ b/internal/service/space.go @@ -74,10 +74,11 @@ func newSpaceXEngine() *gin.Engine { func newSpaceXService() Service { addr := conf.SpaceXServerSetting.HttpIp + ":" + conf.SpaceXServerSetting.HttpPort - server := httpServerFrom(addr, func() *httpServer { + server := httpServers.from(addr, func() *httpServer { engine := newSpaceXEngine() return &httpServer{ - e: engine, + baseServer: newBaseServe(), + e: engine, server: &http.Server{ Addr: addr, Handler: engine, diff --git a/internal/service/web.go b/internal/service/web.go index 56b8ef3b..0d1b9f12 100644 --- a/internal/service/web.go +++ b/internal/service/web.go @@ -74,10 +74,11 @@ func newWebEngine() *gin.Engine { func newWebService() Service { addr := conf.WebServerSetting.HttpIp + ":" + conf.WebServerSetting.HttpPort - server := httpServerFrom(addr, func() *httpServer { + server := httpServers.from(addr, func() *httpServer { engine := newWebEngine() return &httpServer{ - e: engine, + baseServer: newBaseServe(), + e: engine, server: &http.Server{ Addr: addr, Handler: engine, diff --git a/internal/service/web_old.go b/internal/service/web_old.go index 70e7ec37..bcef11cd 100644 --- a/internal/service/web_old.go +++ b/internal/service/web_old.go @@ -41,10 +41,11 @@ func (s *oldWebService) String() string { func newOldWebService() Service { addr := conf.ServerSetting.HttpIp + ":" + conf.ServerSetting.HttpPort - server := httpServerFrom(addr, func() *httpServer { + server := httpServers.from(addr, func() *httpServer { engine := newWebEngine() return &httpServer{ - e: engine, + baseServer: newBaseServe(), + e: engine, server: &http.Server{ Addr: addr, Handler: engine,