feat: server 包新增 service 模式的加载函数 server.BindService
This commit is contained in:
parent
6bf9c5ef9a
commit
bdf4a237df
|
@ -97,18 +97,19 @@ type Server struct {
|
||||||
cancel context.CancelFunc // 停止上下文
|
cancel context.CancelFunc // 停止上下文
|
||||||
online *concurrent.BalanceMap[string, *Conn] // 在线连接
|
online *concurrent.BalanceMap[string, *Conn] // 在线连接
|
||||||
systemDispatcher *dispatcher // 系统消息分发器
|
systemDispatcher *dispatcher // 系统消息分发器
|
||||||
network Network // 网络类型
|
|
||||||
addr string // 侦听地址
|
|
||||||
systemSignal chan os.Signal // 系统信号
|
systemSignal chan os.Signal // 系统信号
|
||||||
closeChannel chan struct{} // 关闭信号
|
closeChannel chan struct{} // 关闭信号
|
||||||
multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误
|
multipleRuntimeErrorChan chan error // 多服务器模式下的运行时错误
|
||||||
dispatcherLock sync.RWMutex // 消息分发器锁
|
|
||||||
isShutdown atomic.Bool // 是否已关闭
|
|
||||||
messageCounter atomic.Int64 // 消息计数器
|
|
||||||
isRunning bool // 是否正在运行
|
|
||||||
dispatchers map[string]*dispatcher // 消息分发器集合
|
dispatchers map[string]*dispatcher // 消息分发器集合
|
||||||
dispatcherMember map[string]map[string]*Conn // 消息分发器包含的连接
|
dispatcherMember map[string]map[string]*Conn // 消息分发器包含的连接
|
||||||
currDispatcher map[string]*dispatcher // 当前连接所处消息分发器
|
currDispatcher map[string]*dispatcher // 当前连接所处消息分发器
|
||||||
|
dispatcherLock sync.RWMutex // 消息分发器锁
|
||||||
|
isShutdown atomic.Bool // 是否已关闭
|
||||||
|
messageCounter atomic.Int64 // 消息计数器
|
||||||
|
addr string // 侦听地址
|
||||||
|
network Network // 网络类型
|
||||||
|
isRunning bool // 是否正在运行
|
||||||
|
services []func() // 服务
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run 使用特定地址运行服务器
|
// Run 使用特定地址运行服务器
|
||||||
|
@ -130,6 +131,7 @@ func (slf *Server) Run(addr string) error {
|
||||||
if slf.event == nil {
|
if slf.event == nil {
|
||||||
return ErrConstructed
|
return ErrConstructed
|
||||||
}
|
}
|
||||||
|
onServicesInit(slf)
|
||||||
slf.event.check()
|
slf.event.check()
|
||||||
slf.addr = addr
|
slf.addr = addr
|
||||||
slf.startMessageStatistics()
|
slf.startMessageStatistics()
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kercylan98/minotaur/utils/log"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Service 兼容传统 service 设计模式的接口
|
||||||
|
type Service interface {
|
||||||
|
// OnInit 初始化服务,该方法将会在 Server 初始化时执行
|
||||||
|
// - 通常来说,该阶段发生任何错误都应该 panic 以阻止 Server 启动
|
||||||
|
OnInit(srv *Server)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BindService 绑定服务到特定 Server,被绑定的服务将会在 Server 初始化时执行 Service.OnInit 方法
|
||||||
|
func BindService(srv *Server, services ...Service) {
|
||||||
|
for _, service := range services {
|
||||||
|
srv.services = append(srv.services, func() {
|
||||||
|
name := reflect.TypeOf(service).String()
|
||||||
|
defer func(name string) {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
log.Error("Server", log.String("service", name), log.String("status", "initialization"), log.Any("err", err))
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}(name)
|
||||||
|
service.OnInit(srv)
|
||||||
|
log.Info("Server", log.String("service", name), log.String("status", "initialized"))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// onServicesInit 服务初始化
|
||||||
|
func onServicesInit(srv *Server) {
|
||||||
|
for _, service := range srv.services {
|
||||||
|
service()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package server_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kercylan98/minotaur/server"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestService struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ts *TestService) OnInit(srv *server.Server) {
|
||||||
|
srv.RegStartFinishEvent(func(srv *server.Server) {
|
||||||
|
println("Server started")
|
||||||
|
})
|
||||||
|
|
||||||
|
srv.RegStopEvent(func(srv *server.Server) {
|
||||||
|
println("Server stopped")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBindService(t *testing.T) {
|
||||||
|
srv := server.New(server.NetworkNone, server.WithLimitLife(time.Second))
|
||||||
|
|
||||||
|
server.BindService(srv, new(TestService))
|
||||||
|
|
||||||
|
if err := srv.RunNone(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue