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-Lengthwww.cungun.com标识返回数据长度,否则一律视为不返回数据到客户端,
另外数据是由后后向前切取,比方输入内容为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