分佈式遊戲網關--fooking 原 薦

這個項目醞釀很久了,但是一直以來比較忙,加上游戲癮比較大,所以也拖了蠻久時間纔開發完第一個版本!主要是做一個分佈式的遊戲網關,負責消息的轉發,項目地址: http://git.oschina.net/scgywx/fooking

不是什麼

1、不是框架
2、不是擴展
3、不是Http server

是什麼

fooking是一個分佈式遊戲網關,主要用於承載長連接,將客戶端的數據包完整的轉發給後端,後端服務處理完之後由fooking轉發給客戶端。
好像聽起來有點像nginx+fpm?嗯!沒錯,如果是單純的request/response,跟nginx類似;
但在遊戲中經常出現要主動推數據給客戶端,而沒有request,比如:A發消息給B,B是沒有request的,只有response.
嗯哼?就這些功能?聽上也沒什麼吸引力啊。。
當然不只如此,他包括:
1、分佈式網關配置,只需要簡單配置就能動態添加網關,以提供更多的連接數量;
2、SESSION維持,每個連接會有唯一sessionid,後端只需要指定sessionid發送消息即可,不用關心這個連接在哪臺機器上;
3、組播,N個用戶加入到一組,只需要向組名發送消息即可,不用關心這個組有多少人(當然你非要自己去循環session發送我也阻止不了你);
4、服務器狀態監控,可以觀察到當前有多少組服務器,總共有多少連接,每臺服務器上有多少連接,哪些空閒,哪些繁忙;
5、客戶端連接與斷開事件通知;
6、後端無語言限制,遵循fastcgi協議即可;

優勢

1、節約硬件,遊戲通常剛開區壓力比較大,過段時間人少了就沒多少壓了,配置多臺服務器完全可以循環開服;
2、後端無痛熱更,例如php-fpm重啓或者是熱更代碼,客戶端完全沒有察覺;
3、開發方便,跟開發web一樣,只需將要發送的數據直接輸出即可(需要添加Content-Length用於確定包大小,詳見協議說明)

4、PHP錯誤能在log文件裏一覽無餘,並且錯誤不會對fooking有任何影響

架構

fooking由一個router與多個gateway組成,所有gateway都會去連接router,後端主動推送的消息由router派發給gateway,然後由gateway轉發客戶端.
request/response模式下不需要router干預,僅僅是gateway與backend(php-fpm)通信.

協議

網關爲什麼會有協議?既然是消息轉發,就必須將一個包完整的發到後端,而不是讓後端來檢測包是否完整;
協議分爲兩種,一種是前端協議,一種是後端協議
前端協議是指客戶端與fooking的交互協議,這個很簡單,32位int + data(準備下個版本支持lua進行自定義協議).
後端協議是使用Fastcgi,這就意味着,後端無所謂什麼語言,只需要遵循fastcgi協議即可,我是phper,當然推薦使用fpm;
注: 後端返回的數據必須有Content-Length標識返回數據長度,否則一律視爲不返回數據到客戶端,
另外數據是由後後向前切取,比如輸出內容爲abcdef,而Content-Length: 3,那麼客戶端會收到def..

編譯

在fooking目錄下執行make即可,啓動需要cd src

配置

具體的配置請詳見src/config.lua與src/router.lua

啓動router

./fooking router.lua

啓動gateway

./fooking config.lua

example

已做了個簡單的聊天室,位於example/chat
使用方法:
1、使用nginx或者apache將目錄指向example/chat目錄,並修改index.html的服務器IP與端口(需要訪問index.html和chat.swf)
2、運行python flash.py(flash的安全沙箱,因爲客戶端是使用flash socket)
3、配置router.lua和config.lua,然後啓動router和gateway
4、訪問localhost/index.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章