mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
176 lines
3.8 KiB
Go
176 lines
3.8 KiB
Go
package originnode
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/duanhf2012/origin/util"
|
|
|
|
"net/http"
|
|
_ "net/http/pprof"
|
|
"os"
|
|
"os/signal"
|
|
"sync"
|
|
"syscall"
|
|
|
|
"github.com/duanhf2012/origin/cluster"
|
|
"github.com/duanhf2012/origin/service"
|
|
"github.com/duanhf2012/origin/sysmodule"
|
|
"github.com/duanhf2012/origin/sysservice"
|
|
)
|
|
|
|
type CExitCtl struct {
|
|
exitChan chan bool
|
|
waitGroup *sync.WaitGroup
|
|
}
|
|
|
|
type COriginNode struct {
|
|
CExitCtl
|
|
serviceManager service.IServiceManager
|
|
sigs chan os.Signal
|
|
debugListenAddress string
|
|
}
|
|
|
|
var initservicelist []service.IService
|
|
|
|
func InitService(iservice service.IService) {
|
|
initservicelist = append(initservicelist, iservice)
|
|
}
|
|
|
|
func (s *COriginNode) Init() {
|
|
|
|
s.SetupService(initservicelist...)
|
|
|
|
//初始化全局模块
|
|
logger := service.InstanceServiceMgr().FindService("syslog").(service.ILogger)
|
|
ret := service.InstanceServiceMgr().Init(logger, s.exitChan, s.waitGroup)
|
|
if ret == false {
|
|
os.Exit(-1)
|
|
}
|
|
|
|
util.Log = logger.Printf
|
|
s.sigs = make(chan os.Signal, 1)
|
|
signal.Notify(s.sigs, syscall.SIGINT, syscall.SIGTERM)
|
|
}
|
|
|
|
// OpenDebugCheck ("localhost:6060")...http://localhost:6060/
|
|
func (s *COriginNode) OpenDebugCheck(listenAddress string) {
|
|
s.debugListenAddress = listenAddress
|
|
}
|
|
|
|
func (s *COriginNode) SetupService(services ...service.IService) {
|
|
ppService := &sysservice.PProfService{}
|
|
services = append(services, ppService)
|
|
cluster.InstanceClusterMgr().AddLocalService(ppService)
|
|
for i := 0; i < len(services); i++ {
|
|
services[i].Init(services[i])
|
|
|
|
if cluster.InstanceClusterMgr().HasLocalService(services[i].GetServiceName()) == true {
|
|
service.InstanceServiceMgr().Setup(services[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *COriginNode) Start() {
|
|
if s.debugListenAddress != "" {
|
|
go func() {
|
|
log.Println(http.ListenAndServe(s.debugListenAddress, nil))
|
|
}()
|
|
}
|
|
|
|
//开始运行集群
|
|
cluster.InstanceClusterMgr().Start()
|
|
|
|
//开启所有服务
|
|
service.InstanceServiceMgr().Start()
|
|
|
|
//监听退出信号
|
|
select {
|
|
case <-s.sigs:
|
|
service.GetLogger().Printf(sysmodule.LEVER_WARN, "Recv stop sig")
|
|
fmt.Printf("Recv stop sig")
|
|
}
|
|
|
|
//停止运行程序
|
|
s.Stop()
|
|
service.GetLogger().Printf(sysmodule.LEVER_INFO, "Node stop run...")
|
|
}
|
|
|
|
func (s *COriginNode) Stop() {
|
|
close(s.exitChan)
|
|
s.waitGroup.Wait()
|
|
}
|
|
|
|
func GetCmdParamNodeId() int {
|
|
if len(os.Args) < 2 {
|
|
return 0
|
|
//return fmt.Errorf("Param error not find NodeId=number")
|
|
}
|
|
|
|
parts := strings.Split(os.Args[1], "=")
|
|
if len(parts) < 2 {
|
|
return 0
|
|
//return fmt.Errorf("Param error not find NodeId=number")
|
|
}
|
|
|
|
if parts[0] != "NodeId" {
|
|
return 0
|
|
//return fmt.Errorf("Param error not find NodeId=number")
|
|
}
|
|
|
|
//读取配置
|
|
currentNodeid, err := strconv.Atoi(parts[1])
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
|
|
return currentNodeid
|
|
}
|
|
|
|
func NewOriginNode() *COriginNode {
|
|
CurrentNodeId := GetCmdParamNodeId()
|
|
if CurrentNodeId == 0 {
|
|
fmt.Print("Param error not find NodeId=number")
|
|
os.Exit(-1)
|
|
}
|
|
|
|
//创建模块
|
|
node := new(COriginNode)
|
|
node.exitChan = make(chan bool)
|
|
node.waitGroup = &sync.WaitGroup{}
|
|
|
|
//安装系统服务
|
|
syslogservice := &sysservice.LogService{}
|
|
syslogservice.InitLog("syslog", fmt.Sprintf("syslog_%d", CurrentNodeId), sysmodule.LEVER_DEBUG)
|
|
service.InstanceServiceMgr().Setup(syslogservice)
|
|
|
|
//初始化集群对象
|
|
err := cluster.InstanceClusterMgr().Init(CurrentNodeId)
|
|
if err != nil {
|
|
fmt.Print(err)
|
|
os.Exit(-1)
|
|
return nil
|
|
}
|
|
|
|
return node
|
|
}
|
|
|
|
func (s *COriginNode) GetSysLog() *sysservice.LogService {
|
|
logService := service.InstanceServiceMgr().FindService("syslog")
|
|
if logService == nil {
|
|
fmt.Printf("Cannot find syslog service!")
|
|
os.Exit(-1)
|
|
return nil
|
|
}
|
|
|
|
return logService.(*sysservice.LogService)
|
|
}
|
|
|
|
func (s *COriginNode) EnableMonitorModule(checkInterval time.Duration){
|
|
service.EnableDeadForMonitor(checkInterval)
|
|
}
|
|
|