service.lua 933 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. local skynet = require "skynet"
  2. local service = {}
  3. local cache = {}
  4. local provider
  5. local function get_provider()
  6. provider = provider or skynet.uniqueservice "service_provider"
  7. return provider
  8. end
  9. local function check(func)
  10. local info = debug.getinfo(func, "u")
  11. assert(info.nups == 1)
  12. assert(debug.getupvalue(func,1) == "_ENV")
  13. end
  14. function service.new(name, mainfunc, ...)
  15. local p = get_provider()
  16. local addr, booting = skynet.call(p, "lua", "test", name)
  17. local address
  18. if addr then
  19. address = addr
  20. else
  21. if booting then
  22. address = skynet.call(p, "lua", "query", name)
  23. else
  24. check(mainfunc)
  25. local code = string.dump(mainfunc)
  26. address = skynet.call(p, "lua", "launch", name, code, ...)
  27. end
  28. end
  29. cache[name] = address
  30. return address
  31. end
  32. function service.query(name)
  33. if not cache[name] then
  34. cache[name] = skynet.call(get_provider(), "lua", "query", name)
  35. end
  36. return cache[name]
  37. end
  38. return service