聊聊kingbus的main.go

编程

本文主要研究一下kingbus的main.go

main.go

kingbus/cmd/kingbus/main.go

package main

import (

"flag"

"fmt"

"os"

"os/signal"

"syscall"

"github.com/flike/kingbus/config"

"github.com/flike/kingbus/log"

"github.com/flike/kingbus/server"

)

var (

//BuildDate used for generating build date in make command

BuildDate string

//BuildVersion used for generating kingbus version in make command

BuildVersion string

)

const banner string = `

__ _ __

/ /__(_)___ ____ _/ /_ __ _______

/ //_/ / __ / __ "/ __ / / / / ___/

/ ,< / / / / / /_/ / /_/ / /_/ (__ )

/_/|_/_/_/ /_/\__, /_.___/\__,_/____/

/____/

`

func main() {

configFile := flag.String("config", "./kingbus.yaml", "kingbus config file")

printVersion := flag.Bool("version", false, "print kingbus version info")

flag.Parse()

//only print version

if *printVersion {

fmt.Printf("version is %s, build at %s

", BuildVersion, BuildDate)

return

}

//fmt.Print(banner)

fmt.Printf("version is %s, build at %s

", BuildVersion, BuildDate)

if len(*configFile) == 0 {

fmt.Println("must use a config file")

return

}

serverCfg, err := config.NewKingbusServerConfig(*configFile)

if err != nil {

fmt.Printf("NewKingbusServerConfig error,err:%s

", err.Error())

return

}

//init log

log.InitLoggers(serverCfg.LogDir, serverCfg.LogLevel)

defer log.UnInitLoggers()

ks, err := server.NewKingbusServer(serverCfg)

if err != nil {

log.Log.Fatalf("main:NewKingbusServer error,err:%s", err)

}

sc := make(chan os.Signal, 1)

signal.Notify(sc,

syscall.SIGINT,

syscall.SIGTERM,

syscall.SIGQUIT,

)

go func() {

for {

sig := <-sc

if sig == syscall.SIGINT || sig == syscall.SIGTERM || sig == syscall.SIGQUIT {

ks.Stop()

os.Exit(0)

}

}

}()

ks.Run()

}

  • main方法读取config、version参数,然后通过config.NewKingbusServerConfig(*configFile)获取serverCfg,之后通过server.NewKingbusServer(serverCfg)创建KingbusServer,然后执行ks.Run()

config.go

kingbus/config/config.go

func NewKingbusServerConfig(configPath string) (*KingbusServerConfig, error) {

if configPath == "" {

return nil, errors.New("config path is nil")

}

viper.SetConfigFile(configPath)

if err := viper.ReadInConfig(); err != nil {

return nil, err

}

//get raft node config

raftNodeCfg, err := getRaftNodeConfig()

if err != nil {

return nil, err

}

adminURLs, err := types.NewURLs([]string{viper.GetString("admin-url")})

if err != nil {

return nil, err

}

if len(adminURLs) != 1 {

return nil, fmt.Errorf("adminURLs muster be 1")

}

ksCfg := &KingbusServerConfig{

RaftNodeCfg: *raftNodeCfg,

AdminURLs: adminURLs,

MetricsAddr: viper.GetString("metrics-addr"),

LogDir: viper.GetString("log-dir"),

LogLevel: viper.GetString("log-level"),

}

return ksCfg, nil

}

  • NewKingbusServerConfig方法通过viper来解析配置文件;KingbusServerConfig定义了RaftNodeCfg、AdminURLs、MetricsAddr、LogDir、LogLevel属性

server.go

kingbus/server/server.go

func NewKingbusServer(cfg *config.KingbusServerConfig) (*KingbusServer, error) {

s := new(KingbusServer)

s.Cfg = cfg

s.lead = atomic.NewUint64(0)

err := s.starRaft(s.Cfg.RaftNodeCfg)

if err != nil {

log.Log.Errorf("NewKingbusServer:startRaft error,err:%s", err)

return nil, err

}

err = s.startRaftPeer(s.Cfg.RaftNodeCfg.PeerURLs)

if err != nil {

log.Log.Errorf("NewKingbusServer:startRaftPeer error,err:%s", err)

return nil, err

}

err = s.startAdminServer(s.Cfg.AdminURLs)

if err != nil {

log.Log.Errorf("NewKingbusServer:startAdminServer error,err:%s", err)

return nil, err

}

err = s.newBinlogProgress()

if err != nil {

log.Log.Errorf("NewKingbusServer:newBinlogProgress error,err:%s", err)

return nil, err

}

err = s.startPrometheus(s.Cfg.MetricsAddr)

if err != nil {

log.Log.Errorf("NewKingbusServer:startPrometheus error,err:%s", err)

return nil, err

}

s.started = atomic.NewBool(false)

return s, nil

}

  • NewKingbusServer主要是通过KingbusServerConfig创建KingbusServer;这里执行了KingbusServer的starRaft、startRaftPeer、startAdminServer、newBinlogProgress、startPrometheus

小结

kingbus的main方法读取config、version参数,然后通过config.NewKingbusServerConfig(*configFile)获取serverCfg,之后通过server.NewKingbusServer(serverCfg)创建KingbusServer,然后执行ks.Run()

doc

  • main.go

以上是 聊聊kingbus的main.go 的全部内容, 来源链接: utcz.com/z/517385.html

回到顶部