[skynet]cluster使用小筆記 關(guān)于啟動(dòng)和調(diào)用

簡(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.luaconfig

  • 這里是服務(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的名字,里面的printreturn的字符串.


服務(wù)器ip 192.168.1.102 上有文件main.lua,clustername.luaconfig

  • 這里是服務(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: 用到clusterquery,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.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時(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)留言,謝謝.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸭叙,隨后出現(xiàn)的幾起案子觉啊,更是在濱河造成了極大的恐慌,老刑警劉巖沈贝,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠人,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宋下,警方通過(guò)查閱死者的電腦和手機(jī)嗡善,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)学歧,“玉大人罩引,你說(shuō)我怎么就攤上這事≈Ρ浚” “怎么了袁铐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)横浑。 經(jīng)常有香客問(wèn)我剔桨,道長(zhǎng),這世上最難降的妖魔是什么徙融? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任洒缀,我火速辦了婚禮,結(jié)果婚禮上张咳,老公的妹妹穿的比我還像新娘帝洪。我一直安慰自己似舵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布葱峡。 她就那樣靜靜地躺著砚哗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砰奕。 梳的紋絲不亂的頭發(fā)上蛛芥,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音军援,去河邊找鬼仅淑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胸哥,可吹牛的內(nèi)容都是我干的涯竟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼空厌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庐船!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嘲更,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筐钟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赋朦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篓冲,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宠哄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壹将。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琳拨,死狀恐怖瞭恰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狱庇,我是刑警寧澤惊畏,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站密任,受9級(jí)特大地震影響颜启,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浪讳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一缰盏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦口猜、人聲如沸负溪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)川抡。三九已至,卻和暖如春须尚,著一層夾襖步出監(jiān)牢的瞬間崖堤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工耐床, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留密幔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓撩轰,卻偏偏與公主長(zhǎng)得像胯甩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钧敞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容