init.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package service
  2. import (
  3. "fmt"
  4. "github.com/olivere/elastic/v7"
  5. "github.com/olivere/elastic/v7/config"
  6. "gopkg.in/yaml.v2"
  7. "io/ioutil"
  8. "log"
  9. "math/rand"
  10. "os"
  11. "os/signal"
  12. "rocommon/socket"
  13. "rocommon/socket/mysql"
  14. "rocommon/util"
  15. "strconv"
  16. "strings"
  17. "syscall"
  18. )
  19. var (
  20. serviceName string //gate game
  21. serviceConfig ConfigServerNode
  22. etcdDiscovery *ServiceDiscovery //etcd服务器发现
  23. crossEtcdDiscovery *ServiceDiscovery //跨服etcd服务器发现
  24. redisConnector RedisConnector //用来db连接redis使用
  25. elasticConnector *elastic.Client //elastic
  26. mysqlConnector *mysql.MysqlConnector
  27. mysqlOrmConnector *mysql.MysqlOrmConnector
  28. //调试标记(调试模式下设置成true,不会触发重连)
  29. //默认为非调试模式
  30. DebugMode = false
  31. )
  32. func Init(name string) {
  33. rand.Seed(int64(util.GetTimeMilliseconds()))
  34. serviceName = name
  35. err := ServerCmd.Parse(os.Args[1:])
  36. if err != nil {
  37. log.Printf("ServerCmd.Parse failed!!!")
  38. panic(err)
  39. }
  40. //命令行解析 / yaml配置文件解析 :start game.exe -config game_config.yaml -server game1
  41. initServerConfig(*flagServerConfigPath, *flagServerName)
  42. serviceConfig.ServerStartTime = util.GetTimeMilliseconds()
  43. //日志初始化
  44. err = util.InitLog(serviceConfig.Node.LogLevel, serviceConfig.Node.LogMaxSize,
  45. serviceConfig.Node.Logfile, serviceName+strconv.Itoa(serviceConfig.Node.Id)+"_",
  46. serviceConfig.Node.UniLogFile)
  47. if err != nil {
  48. log.Printf("InitLog failed!!! err=%v", err)
  49. panic(err)
  50. }
  51. //etcd
  52. if etcdDiscovery == nil && serviceConfig.Node.EtcdAddr != "" {
  53. sd, err := NewNetServiceDiscovery(serviceConfig.Node.EtcdAddr)
  54. if err != nil {
  55. util.PanicF("Service Discovery start err:%v addr:%v", err, serviceConfig.Node.EtcdAddr)
  56. } else {
  57. etcdDiscovery = sd
  58. util.InfoF("service discovery start success")
  59. }
  60. }
  61. //cross etcd
  62. if crossEtcdDiscovery == nil && serviceConfig.Node.CrossEtcdAddr != "" &&
  63. serviceConfig.Node.CrossEtcdAddr != serviceConfig.Node.EtcdAddr {
  64. sd, err := NewNetServiceDiscovery(serviceConfig.Node.CrossEtcdAddr)
  65. if err != nil {
  66. util.PanicF("Service CrossDiscovery start err:%v addr:%v", err, serviceConfig.Node.CrossEtcdAddr)
  67. } else {
  68. crossEtcdDiscovery = sd
  69. util.InfoF("service CrossDiscovery start success")
  70. }
  71. }
  72. //是否需要连接redis数据库
  73. if len(serviceConfig.Redis.RedisAddr) > 0 {
  74. redisConnector = NewNetRedisConnector(serviceConfig.Redis.RedisAddr,
  75. serviceConfig.Redis.Password,
  76. serviceConfig.Redis.DBIndex,
  77. serviceConfig.Redis.RedisCluster)
  78. redisConnector.SetName(serviceName)
  79. _, err := redisConnector.RedisCli().Ping().Result()
  80. if err != nil {
  81. util.PanicF("New RedisConnector ping failed er=%v", err)
  82. }
  83. util.InfoF("redisconnector success...")
  84. }
  85. //mysql
  86. if serviceConfig.Redis.MysqlAddr != "" {
  87. mysqlConnector = socket.NewServerNode("mysqlConnector", name,
  88. serviceConfig.Redis.MysqlAddr, nil).(*mysql.MysqlConnector)
  89. mysqlConnector.Start()
  90. if mysqlConnector.IsReady() {
  91. util.InfoF("mysqlConnector connect success...")
  92. } else {
  93. util.PanicF("mysqlConnector connect failed...")
  94. }
  95. mysqlOrmConnector = socket.NewServerNode("MysqlOrmConnector", name,
  96. serviceConfig.Redis.MysqlAddr, nil).(*mysql.MysqlOrmConnector)
  97. mysqlOrmConnector.Start()
  98. if mysqlOrmConnector.IsReady() {
  99. util.InfoF("mysqlOrmConnector connect success...")
  100. } else {
  101. util.PanicF("mysqlOrmConnector connect failed...")
  102. }
  103. //
  104. //mysqlConnector.Operate(func(rawClient interface{}) interface{} {
  105. // client := rawClient.(*sql.DB)
  106. // retQuery := mysql.NewWrapper(client).Query("select User from user")
  107. //
  108. // retQuery.Each(func(wrapper *mysql.Wrapper) bool {
  109. // var name string
  110. // err := wrapper.Scan(&name)
  111. // util.InfoF("scan=%v err=%v", name, err)
  112. // return true
  113. // })
  114. //
  115. // return nil
  116. //})
  117. }
  118. //是否需要连接elasticsearch
  119. //http://www.wtgame.cn:9200/_nodes/http?pretty
  120. if serviceConfig.Elastic.Url != "" {
  121. var err error = nil
  122. bSniff := false
  123. elasticConnector, err = elastic.NewClientFromConfig(&config.Config{
  124. URL: serviceConfig.Elastic.Url,
  125. Index: serviceConfig.Elastic.Index,
  126. Sniff: &bSniff,
  127. })
  128. if err != nil {
  129. util.ErrorF("New elasticConnector err=%v...", err)
  130. }
  131. util.InfoF("New ElasticConnector...")
  132. }
  133. }
  134. func WaitExitSignal() {
  135. log.Printf("wait for exit signal[SIGTERM SIGINT SIGQUIT SIGKILL]")
  136. util.InfoF("wait for exit signal[SIGTERM SIGINT SIGQUIT SIGKILL]")
  137. ch := make(chan os.Signal, 1)
  138. signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL)
  139. <-ch
  140. if GetMysql() != nil {
  141. GetMysql().Stop()
  142. }
  143. if GetMysqlORM() != nil {
  144. GetMysqlORM().Stop()
  145. }
  146. }
  147. func GetServiceName() string {
  148. return serviceName
  149. }
  150. //server/gate#type@zone@index -> gate#1@1@1
  151. func GetLocalServiceID() string {
  152. //gate#id@zone@type
  153. return fmt.Sprintf("%s#%d@%d@%d", serviceName,
  154. serviceConfig.Node.Zone, serviceConfig.Node.Type, serviceConfig.Node.Id)
  155. }
  156. func initServerConfig(configPath, serverName string) {
  157. if configPath == "" {
  158. return
  159. }
  160. yamlFile, err := ioutil.ReadFile(configPath)
  161. if err != nil {
  162. log.Fatalf("load config [%v] err:%v\n", configPath, err)
  163. }
  164. //err = yaml.Unmarshal(yamlFile, &serviceConfig)
  165. //tmpaa := ConfigServerNode{}
  166. //ab := ConfigServerNode{
  167. // Node: configServerNode{
  168. // NodeName: "gate1",
  169. // Addr: "12312313",
  170. // Type: 1,
  171. // Id: 1,
  172. // Zone: 1,
  173. // },
  174. // Acceptor: configServerAcceptor{
  175. // Addr: "123123",
  176. // },
  177. // Redis: configServerDB{
  178. // RedisAddr: "1231232",
  179. // Password: "123",
  180. // },
  181. //}
  182. //tmpaa.Server = append(tmpaa.Server, ab)
  183. //tmpaa.Server = append(tmpaa.Server, ab)
  184. //tt, _ := yaml.Marshal(tmpaa)
  185. //log.Printf("aa=%v", string(tt))
  186. serviceConfigList := ServerNode{}
  187. err = yaml.Unmarshal(yamlFile, &serviceConfigList)
  188. if err != nil {
  189. log.Fatalf("unmarshal [%v] err:%v\n", configPath, err)
  190. }
  191. if serverName == "" {
  192. strList := strings.Split(configPath, "/")
  193. if len(strList) > 0 {
  194. strList1 := strings.Split(strList[len(strList)-1], "_")
  195. if len(strList1) > 0 {
  196. serverName = strList1[0]
  197. if serverName == "" {
  198. log.Panicf("servername invalid path=%v servername=%v", configPath, serverName)
  199. }
  200. }
  201. }
  202. }
  203. bFind := false
  204. for idx := 0; idx < len(serviceConfigList.Server); idx++ {
  205. if serviceConfigList.Server[idx].Node.NodeName == serverName {
  206. serviceConfig = serviceConfigList.Server[idx]
  207. bFind = true
  208. break
  209. }
  210. }
  211. if !bFind {
  212. log.Panicf("servername yaml not find path=%v servername=%v", configPath, serverName)
  213. }
  214. log.Println("Server yaml config load success:", configPath, serverName)
  215. }
  216. //返回服务器配置文件
  217. func GetServiceConfig() ConfigServerNode {
  218. return serviceConfig
  219. }
  220. func GetServiceDiscovery() *ServiceDiscovery {
  221. return etcdDiscovery
  222. }
  223. func GetRedis() BaseCmdable {
  224. return redisConnector.RedisCli()
  225. }
  226. func SetRedis(cli RedisConnector) {
  227. redisConnector = cli
  228. }
  229. func GetElastic() *elastic.Client {
  230. return elasticConnector
  231. }
  232. func GetMysql() *mysql.MysqlConnector {
  233. return mysqlConnector
  234. }
  235. func GetMysqlORM() *mysql.MysqlOrmConnector {
  236. return mysqlOrmConnector
  237. }