-- 代理服务 -- 用法 skynet.newservice("proxySrv", "被代理服务", ”代理数量“, "注册服务名字", "是否远程调用", ... 服务启动参数) require "skynet.manager" local skynet = require "skynet" local cluster = require "skynet.cluster" local balance = 1 local addresList = {} local serParam = table.pack(...) local sername, sernum, regname, remove = serParam[1], tonumber(serParam[2]), serParam[3], serParam[4] skynet.register_protocol { name = "system", id = skynet.PTYPE_SYSTEM, unpack = function (...) return ... end, } local forwardMap = { [skynet.PTYPE_SNAX] = skynet.PTYPE_SYSTEM, [skynet.PTYPE_LUA] = skynet.PTYPE_SYSTEM, [skynet.PTYPE_RESPONSE] = skynet.PTYPE_RESPONSE, -- don't free response message } skynet.init(function () for i = 1, sernum do addresList[i] = skynet.newservice(sername, table.unpack(serParam, 5)) end -- 注册名字 if regname ~= "nil" then skynet.register(regname) end -- 远程服务 if remove == "true" then cluster.register(regname, skynet.self()) end end) local function getAddress() local address = addresList[balance] if address then balance = balance + 1 if balance > sernum then balance = 1 end end return assert(address, "get realsvr address error!") end skynet.forward_type(forwardMap, function() skynet.dispatch("system", function (session, source, msg, sz) local realsvr = getAddress() if session == 0 then skynet.rawsend(realsvr, "lua", msg, sz) else skynet.ret(skynet.rawcall(realsvr, "lua", msg, sz)) end end) end)