Blame view

src/components/net/server.go 3.58 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
  	"pro2d/src/components/db"
  	"pro2d/src/components/etcd"
  	"pro2d/src/components/logger"
0cc58315   zhangqijia   添加定时器, 检查心跳
14
  	"pro2d/src/components/timewheel"
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
15
  	"pro2d/src/models"
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
16
  	"sync"
0cc58315   zhangqijia   添加定时器, 检查心跳
17
  	"time"
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
18
19
  )
  
c92a54a3   zhangqijia   循环引用的问题
20
21
  type ActionHandler func (msg *MsgPkg)  (int32, proto.Message)
  var ActionMap map[pb.ProtoCode]ActionHandler
0cc58315   zhangqijia   添加定时器, 检查心跳
22
  var TimeWheel *timewheel.TimeWheel
c92a54a3   zhangqijia   循环引用的问题
23
  
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
24
25
26
  type Server struct {
  	SConf      *conf.SConf
  	Clients *sync.Map
c92a54a3   zhangqijia   循环引用的问题
27
  	EtcdClient *etcd.EtcdClient
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
28
  
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
29
  	TaskQueue []chan func()
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
30
31
32
33
34
35
  }
  
  func NewServer(sConf *conf.SConf) *Server {
  	return &Server{
  		SConf:      sConf,
  		Clients:    new(sync.Map),
5d9cf01c   zhangqijia   plugin 热更
36
37
  		EtcdClient: new(etcd.EtcdClient),
  
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
38
  		TaskQueue: make([]chan func(), common.WorkerPoolSize),
5d9cf01c   zhangqijia   plugin 热更
39
40
41
  	}
  }
  
5d9cf01c   zhangqijia   plugin 热更
42
43
44
45
46
47
  //StartWorkerPool 启动worker工作池
  func (s *Server) StartWorkerPool() {
  	//遍历需要启动worker的数量,依此启动
  	for i := 0; i < s.SConf.WorkerPoolSize; i++ {
  		//一个worker被启动
  		//给当前worker对应的任务队列开辟空间
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
48
  		s.TaskQueue[i] = make(chan func(),  common.MaxTaskPerWorker)
5d9cf01c   zhangqijia   plugin 热更
49
50
51
52
53
54
  		//启动当前Worker,阻塞的等待对应的任务队列是否有消息传递进来
  		go s.StartOneWorker(i, s.TaskQueue[i])
  	}
  }
  
  //StartOneWorker 启动一个Worker工作流程
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
55
  func (s *Server) StartOneWorker(workerID int, taskQueue chan func()) {
5d9cf01c   zhangqijia   plugin 热更
56
57
58
59
  	//不断的等待队列中的消息
  	for {
  		select {
  		//有消息则取出队列的Request,并执行绑定的业务方法
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
60
  		case f:= <-taskQueue:
5d9cf01c   zhangqijia   plugin 热更
61
  			_ = workerID
38dd96b4   zhangqijia   定时器+网络数据 peer 在一条...
62
63
  			f()
  			//s.DoMsgHandler(request)
5d9cf01c   zhangqijia   plugin 热更
64
  		}
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
65
66
67
  	}
  }
  
5d9cf01c   zhangqijia   plugin 热更
68
  func (s *Server) DoMsgHandler(msg *MsgPkg) {
c92a54a3   zhangqijia   循环引用的问题
69
  	if md, ok := ActionMap[pb.ProtoCode(msg.Head.Cmd)]; ok {
98b0736d   zhangqijia   添加定时器, 检查心跳
70
  		logger.Debug("protocode handler: %d", msg.Head.Cmd)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
71
72
  		errCode, protomsg := md(msg)
  		rsp, err := proto.Marshal(protomsg)
98b0736d   zhangqijia   添加定时器, 检查心跳
73
  		fmt.Printf("errCode: %d, protomsg:%v\n", errCode, protomsg)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
74
75
76
77
78
79
80
  		if err != nil {
  			msg.Conn.SendMsgByCode(-100, msg.Head.Cmd, nil)
  			return
  		}
  		msg.Conn.SendMsgByCode(errCode, msg.Head.Cmd, rsp)
  		return
  	}
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
81
  	logger.Error("protocode not handler: %d", msg.Head.Cmd)
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
82
83
84
  }
  
  func (s *Server) OnClose(conn *Connection) {
98b0736d   zhangqijia   添加定时器, 检查心跳
85
  	//conn.Stop()
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
86
87
88
  	s.Clients.Delete(conn.Id)
  }
  
5d9cf01c   zhangqijia   plugin 热更
89
90
  func (s *Server) LoadPlugin() {
  	//重新加载
bca0b6f9   zhangqijia   重新加载plugin server...
91
  	_, err:=plugin.Open(conf.GlobalConf.GameConf.PluginPath)
5d9cf01c   zhangqijia   plugin 热更
92
  	if err != nil {
3f0a1991   zhangqijia   del test plugin
93
  		logger.Error("load plugin err: %v, %s", err, conf.GlobalConf.GameConf.PluginPath)
5d9cf01c   zhangqijia   plugin 热更
94
95
  		return
  	}
bca0b6f9   zhangqijia   重新加载plugin server...
96
  	logger.Debug("load plugin success")
5d9cf01c   zhangqijia   plugin 热更
97
98
  }
  
0cc58315   zhangqijia   添加定时器, 检查心跳
99
100
101
102
103
104
105
  func (s *Server) handleTimeOut() {
  	s.Clients.Range(func(key, value interface{}) bool {
  		client := value.(*Connection)
  		client.update()
  		return true
  	})
  
6f0d72bd   zhangqijia   定时器功能完善优化
106
  	timewheel.TimeOut(1*time.Second, s.handleTimeOut)
0cc58315   zhangqijia   添加定时器, 检查心跳
107
108
  }
  
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
109
  func (s *Server)Start() error {
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
110
  	//mongo 初始化
5d9cf01c   zhangqijia   plugin 热更
111
  	db.MongoDatabase = db.MongoClient.Database(conf.GlobalConf.GameConf.DBName)
9644352a   zhangqijia   登录服改为http,游戏服改为长连...
112
113
114
  	models.InitGameServerModels()
  
  	//Etcd 初始化
3f0a1991   zhangqijia   del test plugin
115
116
117
118
119
  	var err error
  	s.EtcdClient, err = etcd.NewEtcdClient(conf.GlobalConf.Etcd)
  	if err != nil {
  		return err
  	}
c92a54a3   zhangqijia   循环引用的问题
120
  	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,游戏服改为长连...
121
  
5d9cf01c   zhangqijia   plugin 热更
122
  	//初始化plugin
0cc58315   zhangqijia   添加定时器, 检查心跳
123
124
125
126
  	//_, err = plugin.Open(conf.GlobalConf.GameConf.PluginPath)
  	//if err != nil {
  	//	return err
  	//}
5d9cf01c   zhangqijia   plugin 热更
127
  
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
128
129
130
131
132
133
  	port := fmt.Sprintf(":%d", s.SConf.Port)
  	l, err := net.Listen("tcp", port)
  	if err != nil {
  		return err
  	}
  
0cc58315   zhangqijia   添加定时器, 检查心跳
134
  	//启动协程池
5d9cf01c   zhangqijia   plugin 热更
135
136
  	s.StartWorkerPool()
  
0cc58315   zhangqijia   添加定时器, 检查心跳
137
  	//启动定时器
0cc58315   zhangqijia   添加定时器, 检查心跳
138
139
140
  	s.handleTimeOut()
  
  	//监听端口
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
141
  	logger.Debug("listen on %s\n", port)
fee11bff   zhangqijia   客户端无法使用grpc热更,不用g...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  	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()  {
0cc58315   zhangqijia   添加定时器, 检查心跳
157
158
  	TimeWheel.Stop()
  }