Files
crawlab/core/apps/server.go
2024-06-14 15:42:50 +08:00

150 lines
2.5 KiB
Go

package apps
import (
"fmt"
"github.com/apex/log"
"github.com/crawlab-team/crawlab/core/config"
"github.com/crawlab-team/crawlab/core/controllers"
"github.com/crawlab-team/crawlab/core/interfaces"
"github.com/crawlab-team/crawlab/core/node/service"
"github.com/crawlab-team/crawlab/core/utils"
"github.com/spf13/viper"
"net/http"
_ "net/http/pprof"
)
func init() {
injectModules()
}
type Server struct {
// settings
grpcAddress interfaces.Address
// dependencies
interfaces.WithConfigPath
nodeSvc interfaces.NodeService
// modules
api *Api
dck *Docker
// internals
quit chan int
}
func (app *Server) SetGrpcAddress(address interfaces.Address) {
app.grpcAddress = address
}
func (app *Server) GetApi() (api ApiApp) {
return app.api
}
func (app *Server) GetNodeService() (svc interfaces.NodeService) {
return app.nodeSvc
}
func (app *Server) Init() {
// log node info
app.logNodeInfo()
if utils.IsMaster() {
// initialize controllers
if err := controllers.InitControllers(); err != nil {
panic(err)
}
}
// pprof
app.initPprof()
}
func (app *Server) Start() {
if utils.IsMaster() {
// start docker app
if utils.IsDocker() {
go app.dck.Start()
}
// start api
go app.api.Start()
}
// start node service
go app.nodeSvc.Start()
}
func (app *Server) Wait() {
<-app.quit
}
func (app *Server) Stop() {
app.api.Stop()
app.quit <- 1
}
func (app *Server) logNodeInfo() {
log.Infof("current node type: %s", utils.GetNodeType())
if utils.IsDocker() {
log.Infof("running in docker container")
}
}
func (app *Server) initPprof() {
if viper.GetBool("pprof") {
go func() {
fmt.Println(http.ListenAndServe("0.0.0.0:6060", nil))
}()
}
}
func NewServer() (app NodeApp) {
// server
svr := &Server{
WithConfigPath: config.NewConfigPathService(),
quit: make(chan int, 1),
}
// service options
var svcOpts []service.Option
if svr.grpcAddress != nil {
svcOpts = append(svcOpts, service.WithAddress(svr.grpcAddress))
}
// master modules
if utils.IsMaster() {
// api
svr.api = GetApi()
// docker
if utils.IsDocker() {
svr.dck = GetDocker(svr)
}
}
// node service
var err error
if utils.IsMaster() {
svr.nodeSvc, err = service.NewMasterService(svcOpts...)
} else {
svr.nodeSvc, err = service.NewWorkerService(svcOpts...)
}
if err != nil {
panic(err)
}
return svr
}
var server NodeApp
func GetServer() NodeApp {
if server != nil {
return server
}
server = NewServer()
return server
}