简述
开启 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.lua
和config
-
这里是服务的启动
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
的名字,里面的print
和return
的字符串.
服务器ip 192.168.1.102
上有文件main.lua
,clustername.lua
和config
-
这里是服务的访问
clustername
文件里面,写下你访问的cluster
节点
--这个名字就是上面cluster.open()里使用的名字, 也是下面会用到的名字
my_server_on_cluster = "192.168.1.101:10001"
config
里把clustername.lua
配置一下
略
//集群名称配置文件
cluster = "./存放路径/clustername.lua"
略
main.lua
- 方法1: 用到
cluster
的query
,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.proxy
和skynet.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: 不用
cluster
的query
或proxy
和skynet.call/send
,只用cluster
的call/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
来访问.
如果本文有什么问题,请留言,谢谢.