init.go 7.9 KB

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