Blame view

src/services/watchdog.lua 3.15 KB
314bc5df   zhengshouren   提交服务器初始代码
1
  local skynet = require "skynet"
3fe4471e   zhouhaihai   热更新 demo
2
  require "skynet.manager"
314bc5df   zhengshouren   提交服务器初始代码
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  local redisproxy = require "shared.redisproxy"
  local socket = require "skynet.socket"
  local netpack = require "skynet.netpack"
  local datacenter = require "skynet.datacenter"
  local snax = require "skynet.snax"
  local agent_ctrl = require "services.agent_ctrl"
  local xxtea = require "xxtea"
  local mc = require "skynet.multicast"
  
  require "ProtocolCode"
  require "GlobalVar"
  require "shared.init"
  require "utils.init"
  
  local CMD, SOCKET = {}, {}
  local globald
  
  local pool_size = tonumber(...)
  
  function SOCKET.open(fd, addr)
  	skynet.call(gate_serv, "lua", "accept" , fd)
  	agent_ctrl:socket_open(fd, addr)
  end
  
  function SOCKET.close(fd)
  	print("socket close", fd)
  	agent_ctrl:socket_close(fd)
  end
  
  function SOCKET.error(fd, msg)
  	print("socket error",fd, msg)
  	agent_ctrl:socket_error(fd)
  end
  
  function SOCKET.data(fd, msg)
  	local cmd = string.unpack("H", string.sub(msg, 1, 2))
  	if cmd == actionCodes.Role_queryLoginRpc then
  		local data = MsgPack.unpack(xxtea.decrypt(string.sub(msg, 3), XXTEA_KEY))
  		-- TODO: 先检测uid的合法性
  		if not data or not data.uid then return end
  		agent_ctrl:query_agent(fd, data.uid)
   	end
  end
  
  local use_logd = tonumber(skynet.getenv "logd")
  
  -- @desc: agent状态定时检测
  function check_agent_status()
  	pcall(agent_ctrl.check_agent_status, agent_ctrl)
  	skynet.timeout(1, check_agent_status)
  end
  
  -- 创建world以及union channel 用于广播
  function create_mutilcast()
  	for i = 1, 10 do
  		local chan_w = mc:new()
  		datacenter.set("MC_W_CHANNEL" .. i, chan_w.channel)
  	end
  end
  
  function CMD.start(conf)
  	skynet.call(gate_serv, "lua", "open" , conf)
  	skynet.call(redisd, "lua", "open", conf)
  
  	if use_logd == 1 then
  		skynet.call(logd, "lua", "open", conf)
  	end
  	-- 开启agent状态检测定时器
  	check_agent_status()
  	-- 创建广播服务
  	create_mutilcast()
  
  	skynet.call(conf.ngxd, "lua", "start")
3fe4471e   zhouhaihai   热更新 demo
76
  	skynet.call(conf.httpd, "lua", "start")
314bc5df   zhengshouren   提交服务器初始代码
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  
  	-- roomServer = skynet.newservice("services/roomServer")
  	-- skynet.call(roomServer, "lua", "start")
  
  	globald = skynet.newservice("services/globald")
  	skynet.call(globald, "lua", "start")
  
  	skynet.newservice("services/dbseed")
  
  end
  
  function CMD.forceClose(fd)
  	agent_ctrl:exit_agent(fd)
  end
  
3fe4471e   zhouhaihai   热更新 demo
92
93
94
95
  function CMD.hotfix(code)
  	agent_ctrl:hotfix(code)
  end
  
314bc5df   zhengshouren   提交服务器初始代码
96
97
98
99
100
101
102
103
104
105
106
  skynet.start(function()
  	skynet.dispatch("lua", function(session, source, cmd, subcmd, ...)
  		if cmd == "socket" then
  			local f = SOCKET[subcmd]
  			f(...)
  			-- socket api don't need return
  		else
  			local f = assert(CMD[cmd])
  			skynet.ret(skynet.pack(f(subcmd, ...)))
  		end
  	end)
3fe4471e   zhouhaihai   热更新 demo
107
  	skynet.register "WATCHDOG"
314bc5df   zhengshouren   提交服务器初始代码
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  	-- 数据库服务
  	redisd = skynet.newservice("services/redisd")
  
  	-- load all csv data
  	skynet.newservice("services/csvdatad")
  	print("launch csvdatad ...")
  
  	-- 日志服务
  	if use_logd == 1 then
  		logd = skynet.newservice("services/logd")
  	end
  	
  	local poold = skynet.newservice("services/poold")
  	local obj = skynet.call(poold, "lua", "start", pool_size)
  
  	agent_ctrl:init(obj, poold)
  
  	print(string.format("launch %d agent at the beginning", pool_size))
  
  	-- 全局工具函数
  	skynet.newservice("services/named")
  	skynet.newservice("services/chated")
  	-- 网关服务
  	gate_serv = skynet.newservice("gate")
  end)