簡(jiǎn)述
開(kāi)啟 server的用戶, 所用到的cluster
方法:
cluster.register(name, address)
在當(dāng)前節(jié)點(diǎn)上為一個(gè)服務(wù)起一個(gè)字符串名字雁仲,之后可以用這個(gè)名字取代地址筛欢。
cluster.open(port)
讓當(dāng)前節(jié)點(diǎn)監(jiān)聽(tīng)一個(gè)端口甫贯。
訪問(wèn) server的用戶,所用到的cluster
方法:
cluster.query(node, name)
在遠(yuǎn)程節(jié)點(diǎn)上查詢一個(gè)名字對(duì)應(yīng)的地址。
cluster.proxy(node, address)
為遠(yuǎn)程節(jié)點(diǎn)上的服務(wù)創(chuàng)建一個(gè)本地代理服務(wù)谋竖。
cluster.call(node, address, ...)
向一個(gè)節(jié)點(diǎn)上的一個(gè)服務(wù)提起一個(gè)請(qǐng)求,等待回應(yīng)。
cluster.send(node, address, ...)
向一個(gè)節(jié)點(diǎn)上的一個(gè)服務(wù)推送一條消息进苍。
快速一覽
-
服務(wù)器101 啟動(dòng)服務(wù);
服務(wù)器102 訪問(wèn)服務(wù)
-
服務(wù)器101 使用
cluster.register()
注冊(cè)服務(wù), 并用cluster.open()
打開(kāi)端口監(jiān)聽(tīng)
服務(wù)器102 使用cluster.proxy()
創(chuàng)建101服的本地代理服務(wù), 并用skynet.call/send()
發(fā)送消息到代理的addr
或
服務(wù)器102使用cluster.call/send()
直接向101服發(fā)起請(qǐng)求
詳細(xì)介紹
服務(wù)器ip 192.168.1.101
上有文件main.lua
,myserver1.lua
,myserver2.lua
,clustername.lua
和config
-
這里是服務(wù)的啟動(dòng)
clustername.lua
文件里面,寫(xiě)下你要開(kāi)啟監(jiān)聽(tīng)的cluster
節(jié)點(diǎn)
--這個(gè)名字就是,上面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()
--啟動(dòng)名為myserver1的服務(wù)
local _my_server1 = skynet.uniqueservice("myserver1")
--用"my_server1"這個(gè)名字去綁定生成的myserver1地址
cluster.register("my_server1",_my_server1)
--啟動(dòng)名為myserver2的服務(wù)
local _my_server2 = skynet.uniqueservice("myserver2")
--用"my_server2"這個(gè)名字去綁定生成的myserver2地址
cluster.register("my_server2",_my_server2)
--開(kāi)始監(jiān)聽(tīng) 叫"my_server_on_cluster" 的ip&port, 見(jiàn)上面的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)
這兩個(gè)server區(qū)別就是CMD.func
的名字,里面的print
和return
的字符串.
服務(wù)器ip 192.168.1.102
上有文件main.lua
,clustername.lua
和config
-
這里是服務(wù)的訪問(wèn)
clustername
文件里面,寫(xiě)下你訪問(wèn)的cluster
節(jié)點(diǎn)
--這個(gè)名字就是上面cluster.open()里使用的名字, 也是下面會(huì)用到的名字
my_server_on_cluster = "192.168.1.101:10001"
config
里把clustername.lua
配置一下
略
//集群名稱配置文件
cluster = "./存放路徑/clustername.lua"
略
main.lua
- 方法1: 用到
cluster
的query
,proxy
,并用skynet.call/send
訪問(wèn).
local skynet = require "skynet"
local cluster = require "cluster"
skynet.start(function()
--[[
先根據(jù)clustername里配置的節(jié)點(diǎn)信息my_server_on_cluster,
和節(jié)點(diǎn)服務(wù)cluster.register()所注冊(cè)的名字my_server1來(lái)獲取101服節(jié)點(diǎn)上對(duì)應(yīng)的地址addr
]]
local addr = cluster.query("my_server_on_cluster", "my_server1")
--創(chuàng)建本地代理服務(wù)
local proxy = cluster.proxy("my_server_on_cluster", addr)
--接下來(lái)就像本地服務(wù)一樣,用skynet.call來(lái)訪問(wèn)
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
時(shí), cluster.register
過(guò)的名字,在被使用時(shí),是不用加@
符號(hào)的.
在cluster.proxy
里如果不用cluster.query
出來(lái)的地址,那么填寫(xiě)cluster.register
過(guò)的名字時(shí),是需要加@
符號(hào)的. 包括cluster.call/send
第二參數(shù)也要加@
符號(hào).
總結(jié)
- 需要注意
@
符號(hào)的使用,具體看上面的代碼 -
skynet.call/send
是,只有獲取到cluster.proxy
代理的本地服務(wù)地址后,才能使用. - 不用
cluster.proxy
的話, 就直接用cluster.send/call
來(lái)訪問(wèn).
如果本文有什么問(wèn)題,請(qǐng)留言,謝謝.