Blame view

src/components/net/server.go 3.18 KB
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
1
2
3
4
  package net
  
  import (
  	"fmt"
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
5
  	"github.com/golang/protobuf/proto"
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
6
  	"net"
5d9cf01c   zhangqijia   plugin 热更
7
  	"plugin"
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
8
  	"pro2d/conf"
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
9
  	"pro2d/protos/pb"
5d9cf01c   zhangqijia   plugin 热更
10
  	"pro2d/src/common"
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
11
12
13
14
  	"pro2d/src/components/db"
  	"pro2d/src/components/etcd"
  	"pro2d/src/components/logger"
  	"pro2d/src/models"
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
15
16
17
  	"sync"
  )
  
c92a54a3   zhangqijia   循环引用的问题
18
19
20
  type ActionHandler func (msg *MsgPkg)  (int32, proto.Message)
  var ActionMap map[pb.ProtoCode]ActionHandler
  
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
21
22
23
  type Server struct {
  	SConf      *conf.SConf
  	Clients *sync.Map
c92a54a3   zhangqijia   循环引用的问题
24
  	EtcdClient *etcd.EtcdClient
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
25
  
5d9cf01c   zhangqijia   plugin 热更
26
  	TaskQueue []chan*MsgPkg
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
27
28
29
30
31
32
  }
  
  func NewServer(sConf *conf.SConf) *Server {
  	return &Server{
  		SConf:      sConf,
  		Clients:    new(sync.Map),
5d9cf01c   zhangqijia   plugin 热更
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  		EtcdClient: new(etcd.EtcdClient),
  
  		TaskQueue: make([]chan *MsgPkg, common.WorkerPoolSize),
  	}
  }
  
  //StartWorkerPool 启动worker工作池
  func (s *Server) StartWorkerPool() {
  	//遍历需要启动worker的数量,依此启动
  	for i := 0; i < s.SConf.WorkerPoolSize; i++ {
  		//一个worker被启动
  		//给当前worker对应的任务队列开辟空间
  		s.TaskQueue[i] = make(chan *MsgPkg,  common.MaxTaskPerWorker)
  		//启动当前Worker,阻塞的等待对应的任务队列是否有消息传递进来
  		go s.StartOneWorker(i, s.TaskQueue[i])
  	}
  }
  
  //StartOneWorker 启动一个Worker工作流程
  func (s *Server) StartOneWorker(workerID int, taskQueue chan *MsgPkg) {
  	//不断的等待队列中的消息
  	for {
  		select {
  		//有消息则取出队列的Request,并执行绑定的业务方法
  		case request := <-taskQueue:
  			_ = workerID
  			s.DoMsgHandler(request)
  		}
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
61
62
63
  	}
  }
  
5d9cf01c   zhangqijia   plugin 热更
64
65
  func (s *Server) DoMsgHandler(msg *MsgPkg) {
  	logger.Debug("DoMsgHandler cmd: %d, data: %s", msg.Head.Cmd, msg.Body)
c92a54a3   zhangqijia   循环引用的问题
66
  	if md, ok := ActionMap[pb.ProtoCode(msg.Head.Cmd)]; ok {
5d9cf01c   zhangqijia   plugin 热更
67
  		logger.Debug("adfadfadfasdfadfadsf")
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
68
69
70
71
72
73
74
75
76
  		errCode, protomsg := md(msg)
  		rsp, err := proto.Marshal(protomsg)
  		if err != nil {
  			msg.Conn.SendMsgByCode(-100, msg.Head.Cmd, nil)
  			return
  		}
  		msg.Conn.SendMsgByCode(errCode, msg.Head.Cmd, rsp)
  		return
  	}
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
77
  	logger.Error("protocode not handler: %d", msg.Head.Cmd)
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
78
79
80
81
82
83
  }
  
  func (s *Server) OnClose(conn *Connection) {
  	s.Clients.Delete(conn.Id)
  }
  
5d9cf01c   zhangqijia   plugin 热更
84
85
  func (s *Server) LoadPlugin() {
  	//重新加载
bca0b6f9   zhangqijia   重新加载plugin server...
86
  	_, err:=plugin.Open(conf.GlobalConf.GameConf.PluginPath)
5d9cf01c   zhangqijia   plugin 热更
87
  	if err != nil {
3f0a1991   zhangqijia   del test plugin
88
  		logger.Error("load plugin err: %v, %s", err, conf.GlobalConf.GameConf.PluginPath)
5d9cf01c   zhangqijia   plugin 热更
89
90
  		return
  	}
bca0b6f9   zhangqijia   重新加载plugin server...
91
  	logger.Debug("load plugin success")
5d9cf01c   zhangqijia   plugin 热更
92
93
  }
  
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
94
  func (s *Server)Start() error {
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
95
  	//mongo 初始化
5d9cf01c   zhangqijia   plugin 热更
96
  	db.MongoDatabase = db.MongoClient.Database(conf.GlobalConf.GameConf.DBName)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
97
98
99
  	models.InitGameServerModels()
  
  	//Etcd 初始化
3f0a1991   zhangqijia   del test plugin
100
101
102
103
104
  	var err error
  	s.EtcdClient, err = etcd.NewEtcdClient(conf.GlobalConf.Etcd)
  	if err != nil {
  		return err
  	}
c92a54a3   zhangqijia   循环引用的问题
105
  	s.EtcdClient.PutWithLeasePrefix(conf.GlobalConf.GameConf.Name, conf.GlobalConf.GameConf.ID, fmt.Sprintf("%s:%d", conf.GlobalConf.GameConf.IP, conf.GlobalConf.GameConf.Port), 5)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
106
  
5d9cf01c   zhangqijia   plugin 热更
107
  	//初始化plugin
3f0a1991   zhangqijia   del test plugin
108
  	_, err = plugin.Open(conf.GlobalConf.GameConf.PluginPath)
5d9cf01c   zhangqijia   plugin 热更
109
110
111
112
  	if err != nil {
  		return err
  	}
  
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
113
114
115
116
117
118
  	port := fmt.Sprintf(":%d", s.SConf.Port)
  	l, err := net.Listen("tcp", port)
  	if err != nil {
  		return err
  	}
  
5d9cf01c   zhangqijia   plugin 热更
119
120
  	s.StartWorkerPool()
  
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
121
  	logger.Debug("listen on %s\n", port)
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  	id := 0
  	for {
  		conn, err := l.Accept()
  		if err != nil {
  			return err
  		}
  
  		id++
  		client := NewConn(id, conn, s)
  		s.Clients.Store(id, client)
  		go client.Start()
  	}
  }
  
  func (s *Server)Stop()  {
  }