[skynet]cluster使用小笔记 关于启动和调用

简述

开启 server的用户, 所用到的cluster方法:

cluster.register(name, address) 在当前节点上为一个服务起一个字符串名字,之后可以用这个名字取代地址。
cluster.open(port) 让当前节点监听一个端口。

访问 server的用户,所用到的cluster方法:

cluster.query(node, name) 在远程节点上查询一个名字对应的地址。
cluster.proxy(node, address) 为远程节点上的服务创建一个本地代理服务。
cluster.call(node, address, ...) 向一个节点上的一个服务提起一个请求,等待回应。
cluster.send(node, address, ...) 向一个节点上的一个服务推送一条消息。


快速一览

  • 服务器101 启动服务;
    服务器102 访问服务
  • 服务器101 使用cluster.register()注册服务, 并用cluster.open()打开端口监听
    服务器102 使用cluster.proxy()创建101服的本地代理服务, 并用skynet.call/send()发送消息到代理的addr

    服务器102使用cluster.call/send()直接101服发起请求

详细介绍

服务器ip 192.168.1.101 上有文件main.lua,myserver1.lua,myserver2.lua,clustername.luaconfig

  • 这里是服务的启动

clustername.lua文件里面,写下你要开启监听的cluster节点

--这个名字就是,上面cluster.open()里使用的名字
my_server_on_cluster = "192.168.1.101:10001"

config里把clustername.lua配置一下

略
//集群名称配置文件
cluster = "./存放路径/clustername.lua"
略

下面是main.lua

local skynet = require "skynet"
local cluster = require "cluster"

skynet.start(function()
    --启动名为myserver1的服务
    local _my_server1 = skynet.uniqueservice("myserver1")
    --用"my_server1"这个名字去绑定生成的myserver1地址
    cluster.register("my_server1",_my_server1)

    --启动名为myserver2的服务
    local _my_server2 = skynet.uniqueservice("myserver2")
    --用"my_server2"这个名字去绑定生成的myserver2地址
    cluster.register("my_server2",_my_server2)

    --开始监听 叫"my_server_on_cluster" 的ip&port, 见上面的clustername文件
    cluster.open("my_server_on_cluster")

    skynet.exit()
end)

myserver1.lua如下

local skynet = require "skynet"
local CMD = {}

function CMD.func1()
    print("hi 1")
    return "from myserver1"
end

skynet.start(function ()
    skynet.dispatch("lua",function (session, source, cmd, ...)
        local f = CMD[cmd]
        if f then
            skynet.retpack(f,...)
        end
    end)
end)

myserver2.lua如下

local skynet = require "skynet"
local CMD = {}

function CMD.func2()
    print("hi 2")
    return "from myserver2"
end

skynet.start(function ()
    skynet.dispatch("lua",function (session, source, cmd, ...)
        local f = CMD[cmd]
        if f then
            skynet.retpack(f,...)
        end
    end)
end)

这两个server区别就是CMD.func的名字,里面的printreturn的字符串.


服务器ip 192.168.1.102 上有文件main.lua,clustername.luaconfig

  • 这里是服务的访问

clustername文件里面,写下你访问的cluster节点

--这个名字就是上面cluster.open()里使用的名字, 也是下面会用到的名字
my_server_on_cluster = "192.168.1.101:10001"

config里把clustername.lua配置一下

略
//集群名称配置文件
cluster = "./存放路径/clustername.lua"
略

main.lua

  • 方法1: 用到clusterquery,proxy,并用skynet.call/send访问.
local skynet = require "skynet"
local cluster = require "cluster"

skynet.start(function()
    --[[
    先根据clustername里配置的节点信息my_server_on_cluster, 
    和节点服务cluster.register()所注册的名字my_server1来获取101服节点上对应的地址addr
    ]]
    local addr = cluster.query("my_server_on_cluster", "my_server1")
    --创建本地代理服务
    local proxy = cluster.proxy("my_server_on_cluster", addr)
    --接下来就像本地服务一样,用skynet.call来访问
    skynet.call(proxy,"lua","func1")
    --skynet.send(proxy,"lua","func1")
    skynet.exit()
end)
  • 方法2: 不用cluster.query, 只使用cluster.proxyskynet.call/send
local skynet = require "skynet"
local cluster = require "cluster"

skynet.start(function()
    --不用query的方法1 
    local proxy = cluster.proxy("my_server_on_cluster@my_server2")
    skynet.call(proxy,"lua","func2")
    --skynet.send(proxy,"lua","func2")

    --不用query的方法2
    proxy = cluster.proxy("my_server_on_cluster", "@my_server2")
    skynet.call(proxy,"lua","func2")
    --skynet.send(proxy,"lua","func2")

    skynet.exit()
end)
  • 方法3: 不用clusterqueryproxyskynet.call/send,只用clustercall/send
local skynet = require "skynet"
local cluster = require "cluster"

skynet.start(function()
    cluster.call("my_server_on_cluster","@my_server1","func1")
    cluster.send("my_server_on_cluster","@my_server2","func2")

    skynet.exit()
end)

上面三种方式里,需要注意的是cluster.query时, cluster.register过的名字,在被使用时,是不用加@符号的.
cluster.proxy里如果不用cluster.query出来的地址,那么填写cluster.register过的名字时,是需要加@符号的. 包括cluster.call/send第二参数也要加@符号.


总结

  • 需要注意@符号的使用,具体看上面的代码
  • skynet.call/send是,只有获取到cluster.proxy代理的本地服务地址后,才能使用.
  • 不用cluster.proxy的话, 就直接用cluster.send/call来访问.

如果本文有什么问题,请留言,谢谢.

你可能感兴趣的:([skynet]cluster使用小笔记 关于启动和调用)