optimize service initial logic

pull/196/head
Michael Li 3 years ago
parent fdcacec235
commit b164adec6b
No known key found for this signature in database

@ -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 package mobile
import ( import (

@ -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 package mobile
import ( import (

@ -74,9 +74,10 @@ func newAdminEngine() *gin.Engine {
func newAdminService() Service { func newAdminService() Service {
addr := conf.AdminServerSetting.HttpIp + ":" + conf.AdminServerSetting.HttpPort addr := conf.AdminServerSetting.HttpIp + ":" + conf.AdminServerSetting.HttpPort
server := httpServerFrom(addr, func() *httpServer { server := httpServers.from(addr, func() *httpServer {
engine := newAdminEngine() engine := newAdminEngine()
return &httpServer{ return &httpServer{
baseServer: newBaseServe(),
e: engine, e: engine,
server: &http.Server{ server: &http.Server{
Addr: addr, Addr: addr,

@ -74,9 +74,10 @@ func newBotEngine() *gin.Engine {
func newBotService() Service { func newBotService() Service {
addr := conf.BotServerSetting.HttpIp + ":" + conf.BotServerSetting.HttpPort addr := conf.BotServerSetting.HttpIp + ":" + conf.BotServerSetting.HttpPort
server := httpServerFrom(addr, func() *httpServer { server := httpServers.from(addr, func() *httpServer {
engine := newBotEngine() engine := newBotEngine()
return &httpServer{ return &httpServer{
baseServer: newBaseServe(),
e: engine, e: engine,
server: &http.Server{ server: &http.Server{
Addr: addr, Addr: addr,

@ -6,25 +6,20 @@ package service
import ( import (
"net" "net"
"sync"
"google.golang.org/grpc" "google.golang.org/grpc"
) )
var (
_ server = (*grpcServer)(nil)
)
// grpcServer wraper for grpc.Server // grpcServer wraper for grpc.Server
type grpcServer struct { type grpcServer struct {
sync.RWMutex *baseServer
listener net.Listener listener net.Listener
server *grpc.Server server *grpc.Server
serverStatus uint8
}
func (s *grpcServer) status() uint8 {
s.RLock()
defer s.RUnlock()
return s.serverStatus
} }
func (s *grpcServer) start() error { func (s *grpcServer) start() error {

@ -7,25 +7,20 @@ package service
import ( import (
"context" "context"
"net/http" "net/http"
"sync"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
var (
_ server = (*httpServer)(nil)
)
// httpServer wraper for gin.engine and http.Server // httpServer wraper for gin.engine and http.Server
type httpServer struct { type httpServer struct {
sync.RWMutex *baseServer
e *gin.Engine e *gin.Engine
server *http.Server server *http.Server
serverStatus uint8
}
func (s *httpServer) status() uint8 {
s.RLock()
defer s.RUnlock()
return s.serverStatus
} }
func (s *httpServer) start() error { func (s *httpServer) start() error {

@ -49,9 +49,10 @@ func newLocalossEngine() *gin.Engine {
func newLocalossService() Service { func newLocalossService() Service {
addr := conf.LocalossServerSetting.HttpIp + ":" + conf.LocalossServerSetting.HttpPort addr := conf.LocalossServerSetting.HttpIp + ":" + conf.LocalossServerSetting.HttpPort
server := httpServerFrom(addr, func() *httpServer { server := httpServers.from(addr, func() *httpServer {
engine := newLocalossEngine() engine := newLocalossEngine()
return &httpServer{ return &httpServer{
baseServer: newBaseServe(),
e: engine, e: engine,
server: &http.Server{ server: &http.Server{
Addr: addr, Addr: addr,

@ -43,7 +43,7 @@ func (s *mobileService) String() string {
func newMobileService() Service { func newMobileService() Service {
addr := conf.MobileServerSetting.Host + ":" + conf.MobileServerSetting.Port addr := conf.MobileServerSetting.Host + ":" + conf.MobileServerSetting.Port
server := grpcServerFrom(addr, func() *grpcServer { server := grpcServers.from(addr, func() *grpcServer {
l, err := net.Listen("tcp", addr) l, err := net.Listen("tcp", addr)
if err != nil { if err != nil {
// TODO: optimize error process // TODO: optimize error process
@ -54,6 +54,7 @@ func newMobileService() Service {
s := grpc.NewServer() s := grpc.NewServer()
return &grpcServer{ return &grpcServer{
baseServer: newBaseServe(),
listener: l, listener: l,
server: s, server: s,
} }

@ -4,35 +4,70 @@
package service package service
import "sync"
var ( var (
httpServers = make(map[string]*httpServer) httpServers = newServerPool[*httpServer]()
grpcServers = make(map[string]*grpcServer) grpcServers = newServerPool[*grpcServer]()
) )
const ( const (
_statusServerInitilized uint8 = iota + 1 _statusServerUnknow uint8 = iota
_statusServerInitilized
_statusServerStarted _statusServerStarted
_statusServerStoped _statusServerStoped
) )
func httpServerFrom(addr string, newServer func() *httpServer) *httpServer { type server interface {
s, exist := httpServers[addr] 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 { if exist {
return s return s
} }
s = newServer() s = newServer()
s.serverStatus = _statusServerInitilized s.setStatus(_statusServerInitilized)
httpServers[addr] = s p.servers[addr] = s
return s return s
} }
func grpcServerFrom(addr string, newServer func() *grpcServer) *grpcServer { func (s *baseServer) setStatus(status uint8) {
s, exist := grpcServers[addr] s.RLock()
if exist { defer s.RUnlock()
return s
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
} }

@ -74,9 +74,10 @@ func newSpaceXEngine() *gin.Engine {
func newSpaceXService() Service { func newSpaceXService() Service {
addr := conf.SpaceXServerSetting.HttpIp + ":" + conf.SpaceXServerSetting.HttpPort addr := conf.SpaceXServerSetting.HttpIp + ":" + conf.SpaceXServerSetting.HttpPort
server := httpServerFrom(addr, func() *httpServer { server := httpServers.from(addr, func() *httpServer {
engine := newSpaceXEngine() engine := newSpaceXEngine()
return &httpServer{ return &httpServer{
baseServer: newBaseServe(),
e: engine, e: engine,
server: &http.Server{ server: &http.Server{
Addr: addr, Addr: addr,

@ -74,9 +74,10 @@ func newWebEngine() *gin.Engine {
func newWebService() Service { func newWebService() Service {
addr := conf.WebServerSetting.HttpIp + ":" + conf.WebServerSetting.HttpPort addr := conf.WebServerSetting.HttpIp + ":" + conf.WebServerSetting.HttpPort
server := httpServerFrom(addr, func() *httpServer { server := httpServers.from(addr, func() *httpServer {
engine := newWebEngine() engine := newWebEngine()
return &httpServer{ return &httpServer{
baseServer: newBaseServe(),
e: engine, e: engine,
server: &http.Server{ server: &http.Server{
Addr: addr, Addr: addr,

@ -41,9 +41,10 @@ func (s *oldWebService) String() string {
func newOldWebService() Service { func newOldWebService() Service {
addr := conf.ServerSetting.HttpIp + ":" + conf.ServerSetting.HttpPort addr := conf.ServerSetting.HttpIp + ":" + conf.ServerSetting.HttpPort
server := httpServerFrom(addr, func() *httpServer { server := httpServers.from(addr, func() *httpServer {
engine := newWebEngine() engine := newWebEngine()
return &httpServer{ return &httpServer{
baseServer: newBaseServe(),
e: engine, e: engine,
server: &http.Server{ server: &http.Server{
Addr: addr, Addr: addr,

Loading…
Cancel
Save