12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- -- 代理服务
- -- 用法 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)
|