init.go 8.5 KB

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