51 lines
1.8 KiB
Go
51 lines
1.8 KiB
Go
package server
|
|
|
|
import (
|
|
"github.com/kercylan98/minotaur/utils/log"
|
|
"reflect"
|
|
)
|
|
|
|
// MultipleService 兼容传统 service 设计模式的接口,通过该接口可以实现更简洁、更具有可读性的服务绑定
|
|
type MultipleService interface {
|
|
// OnInit 初始化服务,该方法将会在 Server 初始化时执行
|
|
// - 通常来说,该阶段发生任何错误都应该 panic 以阻止 Server 启动
|
|
OnInit(srv *MultipleServer)
|
|
// OnPreloading 预加载阶段,该方法将会在所有服务的 OnInit 函数执行完毕后执行
|
|
// - 通常来说,该阶段发生任何错误都应该 panic 以阻止 Server 启动
|
|
OnPreloading(srv *MultipleServer)
|
|
}
|
|
|
|
// BindServiceToMultipleServer 绑定服务到多个 MultipleServer
|
|
func BindServiceToMultipleServer(server *MultipleServer, services ...MultipleService) {
|
|
for i := 0; i < len(services); i++ {
|
|
service := services[i]
|
|
server.preload = append(server.preload, func() {
|
|
name := reflect.TypeOf(service).String()
|
|
defer func(name string) {
|
|
if err := recover(); err != nil {
|
|
log.Error("MultipleServer", log.String("service", name), log.String("status", "preloading"), log.Any("err", err))
|
|
panic(err)
|
|
}
|
|
}(name)
|
|
service.OnPreloading(server)
|
|
log.Info("MultipleServer", log.String("service", name), log.String("status", "preloaded"))
|
|
})
|
|
}
|
|
|
|
for i := 0; i < len(services); i++ {
|
|
service := services[i]
|
|
server.services = append(server.services, func() {
|
|
name := reflect.TypeOf(service).String()
|
|
defer func(name string) {
|
|
if err := recover(); err != nil {
|
|
log.Error("MultipleServer", log.String("service", name), log.String("status", "initialization"), log.Any("err", err))
|
|
panic(err)
|
|
}
|
|
}(name)
|
|
service.OnInit(server)
|
|
log.Info("MultipleServer", log.String("service", name), log.String("status", "initialized"))
|
|
})
|
|
}
|
|
|
|
}
|