skynetチュートリアル(1)-サービスの作成

3373 ワード

作成者:[email protected]、転載は作者を明記してください
skynetソースコード分析シリーズの文章が発表されてから、step by stepのチュートリアルが必要だというフィードバックが続々と寄せられ、周りの友达もチュートリアルを要求した.そこでこのチュートリアルを书きました.
各チュートリアルはhello worldから始まるので、hello worldバージョンとしてechoサービスを書きます.echoサービスはskynet/exampleというディレクトリの下に置いておきます.構成に関することはまだ話していませんから.環境準備の必要性:
1.inuxまたはmac osx.2.編集したskynet.3.luaを記述できるエディタ.参考になるのはeclipse ldt/sublime text
skynetのWIKIは熟読が必要で、wikiの紙面は大きいが、WIKIを読まないのは開発に不利だ.https://github.com/cloudwu/skynet/wiki
skynetは最初は単一プロセスマルチスレッドで、1つ1つのサービスから構成されていました.skynetで開発をするのは、実際には書き込みサービスです.サービスとサービスとの間でメッセージキューを介して通信が行われます.この文章はサービスがどのように書くべきかを話しています.
一、まずフレームlocal skynet = require "skynet"を導入する
次に、skynetフレームワークによって呼び出されるコールバック関数を用意します.メッセージがサービスに送信されると、skynetフレームワークはサービスのコールバック関数を呼び出してメッセージを処理します.このコールバック関数はskynetです.dispatch.
最後にskynetを使います.startはサービスを起動します.
skyet/example/echo.lua
local skynet = require "skynet"
require "skynet.manager"


local command = {}

function command.HELLO(what)
    return "i am echo server, get this:" .. what
end

function dispatcher() 
    skynet.dispatch("lua", function(session, address, cmd, ...)
        cmd = cmd:upper()
        if cmd == "HELLO" then
            local f = command[cmd]
            assert(f)
            skynet.ret(skynet.pack(f(...)))
        end
    end)
    skynet.register("echo")
end

skynet.start(dispatcher)

ここで説明する必要がありますsession,address,cmdは何ですか...可変パラメータを表すので、これは説明しません.sessionはコード分析の時に言ったことがありますが、それは自増の数字で、オーバーフローしてまた1から始まります.実際にはリクエストシーケンス番号として理解でき,リクエスト側が応答を受信した場合,セッションという数字で応答パケットが対応するどのリクエストに対して送信されたかを識別することができ,このリクエストはリクエスト側が送信したものである.非同期リクエストではよくこれが必要です.
addressはskynetでサービスされるアドレスで、このアドレスは実行時に一意です.上のコードでは、echoサービス自体を表すアドレスです.実際には数字でもあります
cmdは命令字ですが、これはあまり説明しません.次はまたお話しします.skynet.register("echo")という言葉はサービスに名前をつけることです.これはソース分析の時にも言いましたが、この名前は繰り返してはいけません.
二、上のコードを書き終えると大功を奏したのではないでしょうか.実際にはありません.このサービスを測るには、もう一つのサービスを書く必要があります.ある人の心の中には黙って三字経を読んでいる人もいるかもしれません.サービス・エンドが構築されていない場合、skynet環境でテストを実行するだけで、現在はそうするしかありません.
skynet/example/test_echo.lua
local skynet = require "skynet"

skynet.start(function() 
    local echo = skynet.newservice("echo")
    print(skynet.call(echo, "lua", "HELLO", "world"))
end);

skynetを直接使用してtestを起動しないでください.echo.luaスクリプトは、必ずエラーを報告します.私がここで何を言っても、必ず誰かがやってみると信じています.
skynet.Newserviceはechoサービスを起動します.
skynet.callは呼び出しサービスで、パラメータechoは上のdispatchに対応するaddressであり、パラメータ「lua」はdispatchにおけるluaであり、「HELLO」は上の対応するcmdである.パラメータ「world」は...中身は.callはブロック呼び出しです.
ここまで来ればいいのではないでしょうか.いやいや、あと3歩ありますが、3歩目は簡単です.
三、修正プロファイルexample/configはソース分析で分析したが、skynetには必ずプロファイルが必要で、cpath/threadなどの情報を配置する.まずexample/configファイルをバックアップします.それからまた個性example/configファイルでstartの行を
start = "main"  -- main script

に改心
start = "test_echo" -- main script

保存、保存、保存、大切なことを3回言って、必ず保存します.
このstartはskynetが実行するluaエントリスクリプトです
四、はい、今./skynet ./example/config運行しています.おめでとうございます.成功すれば現れます.
i am echo server, get this:world
[:01000002] KILL self

ここまでで、サービスの作成例が完成しました.この記事で私たちはskynetを勉強しました.start、skynet.dispatch、skynet.register、skynet.call、skynet.Newserviceといういくつかの重要な方法.ついでにプロファイルを見てみました.