proxySrv.lua 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. -- 代理服务
  2. -- 用法 skynet.newservice("proxySrv", "被代理服务", ”代理数量“, "注册服务名字", "是否远程调用", ... 服务启动参数)
  3. require "skynet.manager"
  4. local skynet = require "skynet"
  5. local cluster = require "skynet.cluster"
  6. local balance = 1
  7. local addresList = {}
  8. local serParam = table.pack(...)
  9. local sername, sernum, regname, remove = serParam[1], tonumber(serParam[2]), serParam[3], serParam[4]
  10. skynet.register_protocol {
  11. name = "system",
  12. id = skynet.PTYPE_SYSTEM,
  13. unpack = function (...) return ... end,
  14. }
  15. local forwardMap = {
  16. [skynet.PTYPE_SNAX] = skynet.PTYPE_SYSTEM,
  17. [skynet.PTYPE_LUA] = skynet.PTYPE_SYSTEM,
  18. [skynet.PTYPE_RESPONSE] = skynet.PTYPE_RESPONSE, -- don't free response message
  19. }
  20. skynet.init(function ()
  21. for i = 1, sernum do
  22. addresList[i] = skynet.newservice(sername, table.unpack(serParam, 5))
  23. end
  24. -- 注册名字
  25. if regname ~= "nil" then
  26. skynet.register(regname)
  27. end
  28. -- 远程服务
  29. if remove == "true" then
  30. cluster.register(regname, skynet.self())
  31. end
  32. end)
  33. local function getAddress()
  34. local address = addresList[balance]
  35. if address then
  36. balance = balance + 1
  37. if balance > sernum then
  38. balance = 1
  39. end
  40. end
  41. return assert(address, "get realsvr address error!")
  42. end
  43. skynet.forward_type(forwardMap, function()
  44. skynet.dispatch("system", function (session, source, msg, sz)
  45. local realsvr = getAddress()
  46. if session == 0 then
  47. skynet.rawsend(realsvr, "lua", msg, sz)
  48. else
  49. skynet.ret(skynet.rawcall(realsvr, "lua", msg, sz))
  50. end
  51. end)
  52. end)