金慶的專欄
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評論 :: 0 Trackbacks
公告
我的隨筆
我的評論
我參與的隨筆
留言簿
(12)
給我留言
查看公開留言
查看私人留言
隨筆分類
(502)
1. C/C++(166)
(rss)
2. 網游開發(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊
公告照片
搜索
積分與排名
積分 - 659031
排名 - 25
最新評論
1.?re: boost::asio::spawn 將一統C++網絡庫
asio 成為C++首選網絡庫
--linda
2.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--金慶
3.?re: mingw編譯OrzNet
能發送一個mingw編譯好的OrzNet庫給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--bigbad
5.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯誤(11054)
2.?SVN中邪惡的replace(10972)
3.?VS2005編譯libevent(10429)
4.?混音算法的學習與研究(10230)
5.?C調用lua腳本的效率測試(9019)
評論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯誤(18)
4.?C++引用優于指針(17)
5.?ACE與ASIO之間關于Socket編程的比較(16)
跨服Lua調用
跨服Lua調用
(金慶的專欄 2017.3)
跨服Lua調用是指服務器集群內部A服調用B服上的腳本。
服務器之間已經實現RPC調用,Lua調用是Rpc調用的簡化方式。
示例:
-- Tell remote server svr_id that game_clt_id is disconnected.
local arguments = { "Remote.ClientDisconnected", game_clt_id }
remote_runner.run_mfa(svr_id, "event.dispatcher",
"dispatch", arguments)
以上例子相當于調用了其他服務器上的代碼:
require("event.dispatcher").dispatch("Remote.ClientDisconnected", game_clt_id)
需要參數為:
* 遠程服務器ID
* Lua模塊名
* Lua模塊中的函數名
* 調用參數列表
remote_runner這樣實現:
-- 運行另一服務器上的Lua代碼
-- 也支持本服運行(本服RPC調用)
local M = {}
local log = require("log"):new("remote_runner")
local pb = require("protobuf")
local serpent = require("serpent")
-- on_result(result) 生成 rpc 回調函數 cb(resp_str)
local function get_mfa_cb(on_result)
if (not on_result) then return nil end
assert("function" == type(on_result))
local cb = function(resp_str)
assert("string" == type(resp_str))
local resp = pb.decode("svr.RunLuaMfaResponse", resp_str)
local ok, copy = serpent.load(resp.returned_dump)
assert(ok, "Run mfa returns invalid value.")
log:debug("RunLuaMfaResponse: %s", serpent.line(copy))
on_result(table.unpack(copy)) -- 回調時執行
end -- cb
return cb
end -- get_mfa_cb()
-- Run module function with arguments on remote server.
-- 示例 rum_mfa(123, "event.dispatcher", "dispatch", {"EventName", 1,2,3}, nil)
function M.run_mfa(svr_id, module_name, function_name, arguments, on_result)
assert("number" == type(svr_id))
assert("string" == type(module_name))
assert("string" == type(function_name))
assert("table" == type(arguments))
assert(nil == on_result or "function" == type(on_result))
log:debug("Request to call Svr_%s %s.%s()", svr_id, module_name, function_name)
local req = {
module_name = module_name,
function_name = function_name,
arguments_dump = serpent.dump(arguments)
}
local req_str = pb.encode("svr.RunLuaMfaRequest", req)
local cb = get_mfa_cb(on_result)
c_rpc.request_svr(svr_id, "svr.RunLua", "RunMfa", req_str, cb)
end -- run()
return M
通過Rpc服務RunLua.RunMfa實現。run_lua.proto如下定義
syntax = "proto3";
package svr;
// 服務器內部跨服調用Lua
service RunLua {
// 運行 module.function(...arguments...)
rpc RunMfa(RunLuaMfaRequest) returns (RunLuaMfaResponse);
}
message RunLuaMfaRequest {
string module_name = 1;
string function_name = 2;
// arguments_dump = serpent.dump({1,2,3})
string arguments_dump = 3;
}
message RunLuaMfaResponse {
// Get returned table copy:
// local ok, copy = serpent.load(returned_dump)
string returned_dump = 1;
}
服務這樣實現:
-- svc_run_lua.lua
-- Run lua by other servers.
local M = {}
local log = require("log"):new("svc_run_lua")
local pb = require("protobuf")
-- Run module.function(...arguments...)
function M.RunMfa(ctx, content)
local req = pb.decode("svr.RunLuaMfaRequest", content)
log:debug("RunMfa %s.%s", req.module_name, req.function_name) -- todo: from where?
local mod = require(req.module_name)
local fun = mod[req.function_name]
local ok, arguments = serpent.load(serpent.dump(req.arguments_dump))
assert(ok, "Illegal arguments.")
local result_table = table.pack(fun(table.unpack(arguments)))
local resp = { returned_dump = serpent.dump(result_table) }
local resp_str = pb.encode("svr.RunLuaMfaResponse", resp)
c_rpc.reply_to(ctx, resp_str)
end -- Run()
return M
posted on 2017-03-02 17:12
金慶
閱讀(467)
評論(0)
編輯
收藏
引用
所屬分類:
2. 網游開發
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
相關文章:
How are dtLinks created in NavMesh
UE4 Blueprint Multiple Event BeginPlay
第9代游戲主機
Canvas Scaler 的3種模式
幀同步是否允許客戶端指定命令幀號
rpc應答太快造成請求超時
測試 tolua 例子 TestErrorStack
lua變量缺少local造成unity死鎖
C# tolua 之間互傳 byte[]
Unity使用異步grpc
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
色天使久久综合网天天
|
久久久久亚洲AV片无码下载蜜桃
|
91精品国产色综合久久
|
97久久婷婷五月综合色d啪蜜芽
|
久久国产精品一区
|
久久久久亚洲AV成人网人人软件
|
青青青国产精品国产精品久久久久
|
香蕉99久久国产综合精品宅男自
|
99国内精品久久久久久久
|
国产99久久久国产精品~~牛
|
99久久无色码中文字幕
|
99久久婷婷国产综合精品草原
|
国产亚州精品女人久久久久久
|
久久久99精品一区二区
|
久久只有这精品99
|
久久这里只有精品18
|
国产精品毛片久久久久久久
|
丰满少妇人妻久久久久久4
|
午夜精品久久久久久影视777
|
久久久久久久久久久久久久
|
久久久亚洲欧洲日产国码aⅴ
|
久久er国产精品免费观看2
|
精品久久久久一区二区三区
|
狠狠色丁香久久婷婷综合_中
|
日产精品久久久一区二区
|
久久99国产亚洲高清观看首页
|
久久精品国产精品亚洲人人
|
久久久久久久久久久久久久
|
精品久久久久中文字幕日本
|
国产A级毛片久久久精品毛片
|
深夜久久AAAAA级毛片免费看
|
久久久噜噜噜久久中文福利
|
久久www免费人成看国产片
|
97精品伊人久久久大香线蕉
|
久久久久无码精品国产不卡
|
亚洲一本综合久久
|
天天躁日日躁狠狠久久
|
精品熟女少妇aⅴ免费久久
|
久久精品午夜一区二区福利
|
久久久久99精品成人片牛牛影视
|
99久久婷婷免费国产综合精品
|