watchdog.lua
3.15 KB
1
2
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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
local skynet = require "skynet"
require "skynet.manager"
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")
skynet.call(conf.httpd, "lua", "start")
-- 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
function CMD.hotfix(code)
agent_ctrl:hotfix(code)
end
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)
skynet.register "WATCHDOG"
-- 数据库服务
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)