关于ubuntu12.04下firefliy的架设

来源:互联网 发布:动画软件flash下载 编辑:程序博客网 时间:2024/06/05 15:24

这篇文章本来是我发在9秒论坛的一篇文章,但前几天发现因为论坛改版,原版文章已经不能正常访问,附件也不能下载了,所以决定在自己的博客重新写一次,并且针对上次文章的反馈稍微修改下,因为上次,有人用按我文章的内容搭建之后,发现我文章里面缺了一个小的需要注意的环节,我在交流群里面已经给出了解决方法,所以这次一起写一下,

ubuntu12.04安装,因为我电脑里本来就装了ubuntu12.04虚拟机,所以安装系统就不说了,大家要想自己尝试安装,自己去下个安装镜像,或者写信给开发组,开发组会邮寄一张安装光盘给你的(注:ubuntu没有yum服务,安装命令为apt-getinstall)。

开始安装必要的软件

第一步:gcc安装,Linux下如果不是刚装的系统,这个应该之前都安装好了

 我们来查看是否安装gcc

$ gcc –vsersion

如果没有安装那么登陆 【软件中心】

如果找不到【软件中心 】在Dash主页里面的已安装软件里找,在软件中心搜索栏里搜索gcc,或者打开终端(找不到的话,同样去Dash主页里面的已安装软件里找),在终端里面敲入

$ sudo apt-get build-depgcc,装完我们进行下一步mysql安装

Mysql跟gcc一样,我们都在【软件中⼼】安装,终端安装命令为sudo apt-get installmysql-server

服务端安装好后,根据自己的喜好来安装客户端软件,我个人喜欢Mysqlnavigator 功能很强大,操作也比较简单,跟使用windows下的软件很相似。在【软件中⼼】里面直接可以找到安装。

python 安装

还是登陆 【软件中心】搜索框内输入 python会出现python2.7 可以直接进行安装

easy_install 安装

终端下

swordfishx@swordfishx-virtual-machine:~$ sudo apt-get install python-setuptools[sudo] password for swordfishx:apt-get install libmysqld-devapt-get install libmysqlclient-devsudo apt-get install python-dev

如果遇到mysql开发版的问题,上面的几个安装会解决问题。如果没有遇到问题,那就继续。

下面安装protobuf 安装

.下载https://code.google.com/p/protobuf/downloads/list

解压并安装解压命令

tar zxvf protobuf-2.5.0.tar.bz2或者右键解压

然后

tar zxvf protobuf-2.5.0.tar.bz2或者右键解压然后cd protobuf-2.5.0                 //进入安装目录./configure                    //文件安装配置make && make install           //安装
libevent 安装一样.下载http://libevent.org/.解压安装tar zxvf libevent-2.0.21-stable.tar.gzcd libevent-2.0.21-stable./configure --prefix=/usr          //稍有不同make && make install

memacached安装

终端直接输入(不要自己下载memcached编译安装,不知什么原因,编译不成功,不要给自己找麻烦

sudoapt-get install memcached

安装之后

 

键入memcached -d -m 128 -p 11211 -u root 开启服务,服务命令参数为{   -p 监听的端口      -l 连接的 IP地址, 默认是本机      -d start 启动 memcached 服务      -d restart 重起 memcached 服务      -d stop|shutdown 关闭正在运行的 memcached 服务      -d install 安装 memcached 服务      -d uninstall 卸载 memcached 服务      -u 以的身份运行  (仅在以 root运行的时候有效)      -m 最大内存使用,单位 MB。默认 64MB      -M 内存耗尽时返回错误,而不是删除项      -c 最大同时连接数,默认是 1024      -f 块大小增长因子,默认是 1.25      -n 最小分配空间,key+value+flags 默认是 48      -h 显示帮助}新开个终端窗口telnet 127.0.0.1 11211 之后键入stats命令可以查看当前看缓存服务的状态具体操作swordfishx@swordfishx-virtual-machine:~$ telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.             //说明监控成功,之后输入statsstatsSTAT pid 534STAT uptime 96STAT time 1392961141STAT version 1.4.13STAT libevent 2.0.21-stableSTAT pointer_size 32STAT rusage_user 0.008000STAT rusage_system 0.000000STAT curr_connections 5STAT total_connections 6STAT connection_structures 6STAT reserved_fds 20STAT cmd_get 0STAT cmd_set 0STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 0STAT get_misses 0STAT delete_misses 0STAT delete_hits 0STAT incr_misses 0STAT incr_hits 0STAT decr_misses 0STAT decr_hits 0STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT touch_hits 0STAT touch_misses 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 7STAT bytes_written 0STAT limit_maxbytes 67108864STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT hash_power_level 16STAT hash_bytes 262144STAT hash_is_expanding 0STAT expired_unfetched 0STAT evicted_unfetched 0STAT bytes 0STAT curr_items 0STAT total_items 0STAT evictions 0STAT reclaimed 0END^]quit                    //退出命令,上面就是memcached运行的状态---------------------------------------------------
memcached 服务器的功能呢,是生成一个虚拟的数据库,因为这个临时数据库存在在内存中,所以读写速度大大加快,隔一段时间memcached会把内存里的临时数据更新进数据库。

到现在我们工作完成了大半了

下面我们安装第三方库

Sudo easy_install twistedSudo easy_install python-memcachedSudo easy_install DBUtilsSudo easy_install zope.interfaceSudo easy_install affinitySudo easy_install MySQL-python

Firefly 安装

http://www.9miao.com/thread-44805-1-1.html下载

 

2.解压之后

Cd 安装目录

python setup.py buildpython setup.py install测试是否安装成功swordfishx@swordfishx-virtual-machine:~$ firefly-admin.py createproject FireflyHelloWorldcreate dir FireflyHelloWorld create success                       //说明可以创建swordfishx@swordfishx-virtual-machine:~$ cd FireflyHelloWorldswordfishx@swordfishx-virtual-machine:~/FireflyHelloWorld$ lsapp  appmain.py  config.json  startmaster.py  toolswordfishx@swordfishx-virtual-machine:~/FireflyHelloWorld$ python startmaster.py2014-02-21 14:16:13+0800 [-] Log opened.2014-02-21 14:16:13+0800 [-] DelaySite starting on 99982014-02-21 14:16:13+0800 [-] Starting factory <firefly.web.delayrequest.DelaySite instance at 0x8c7014c>2014-02-21 14:16:13+0800 [-] BilateralFactory starting on 99992014-02-21 14:16:13+0800 [-] Starting factory <firefly.distributed.root.BilateralFactory instance at 0x8c706ec>2014-02-21 14:16:14+0800 [-] Log opened.2014-02-21 14:16:14+0800 [-] gate start...2014-02-21 14:16:14+0800 [-] Log opened.2014-02-21 14:16:14+0800 [-] net start...2014-02-21 14:16:14+0800 [-] gate pid: 21862014-02-21 14:16:14+0800 [-] net pid: 21872014-02-21 14:16:14+0800 [BilateralBroker,1,127.0.0.1] node [gate] takeProxy ready                     
好了这样,我们的firefly就安装完了。

firefly安装好了,我们就拿个官方的通信例子测试一下

首先看下json配置文件都都代表什么


配置中主要包括四个部分,master,servers,db,memcached。master 用来
定义master 的端口,servers 用来定义各个服务器中的配置,以及服务进程的
扩展。db定义了数据库的连接配置信息,memcached配置 memcached服务
的连接配置信息。 
 
master 配置 
rootport  master 服务的管理端口; 
  webport        master 服务的对外http端口,通过web接口实现对各个服务进
程的管理。 
 
servers 配置 
   server 下面配置的没一个key 的名称就是定义的新的服务进程的名称。通过
添加新的项来扩充服务进程。每个服务进程的配置规则如下: 
    netport[可选]提供客户端进行tcp连接的端口,用户与客户端的通信。 
    rootport[可选]提供其他服务进程连接的端口,这样实现进程间的RPC 调用 

    remoteport[可选]指定要连接到哪些服务进程的信息的列表,其中包括
rootname要连接到的服务进程的名称,rootport要连接到的服务进程的端口。 
    name[可选]服务进程的名称 
    app[可选]指定该进程的入口模块名称 
    log[可选]指定该进程的日志文件存放信息 
    db[可选]是否需要数据库服务 
    mem[可选]是否需要memcached缓存服务 
    cpu[可选]进程绑定到指定 cpu核心运行,减少 cpu 切换的性能消耗 
 
db 配置[可选] 
    host        数据库服务地址 
    user        数据库用户名 
    passwd        数据库密码 
    port        数据库连接端口 
    db        数据库库名称 
    charset        数据库连接客户端编码 
 
memcached 配置[可选] 
    urls        memcache连接配置 

    hostname        memcached缓存分配命名。 

     本例演示的是 firefly 完整通讯,客户端→net(客户端连接)服务器→gate(场景跳转,
消息分发)服务器→game(游戏场景,逻辑)服务器。客户端将用户输入的数字发送到服
务器,服务器随机一个数进行对比,一样则返回 True,不一样则返回 False 和服务器随机的
数值。 
1.创建工程 
命令行下输入 firefly-admin.py createproject test_netconnect-distributed(linux 在终端输入,这里测试在win平台), 

{"master":{"rootport":9999,"webport":9998},"servers":{"net":{"netport":11000,"name":"net","app":"app.net","remoteport":[{"rootport":10001,"rootname":"gate"}]},"gate":{"rootport":10001,"name":"gate","app":"app.gate"},"game":{"remoteport":[{"rootport":10001,"rootname":"gate"}],"name":"game","app":"app.game"}},"db":{"host":"localhost","user":"root","passwd":"111","port":3306,"db":"test","charset":"utf8"}}


C:\Users\Administrator>d:D:\>cd D:\test_netconnect-distributedD:\test_netconnect-distributed>python D:\test_netconnect-distributed\startmaster.py2015-06-06 14:59:56+0800 [-] Log opened.2015-06-06 14:59:56+0800 [-] DelaySite starting on 99982015-06-06 14:59:56+0800 [-] Starting factory <firefly.web.delayrequest.DelaySite instance at 0x0000000002E93F48>2015-06-06 14:59:56+0800 [-] BilateralFactory starting on 99992015-06-06 14:59:56+0800 [-] Starting factory <firefly.distributed.root.BilateralFactory instance at 0x0000000002EA04C8>2015-06-06 14:59:58+0800 [-] Log opened.2015-06-06 14:59:58+0800 [-] Log opened.2015-06-06 14:59:58+0800 [-] Log opened.2015-06-06 14:59:58+0800 [-] game start...22015-06-06 14:59:58+0800 [-] net start...2015-06-06 14:59:58+0800 [-] gate start...015-06-06 14:59:58+0800 [-] game pid: 886422015-06-06 14:59:58+0800 [-] net pid: 6460015-06-06 14:59:58+0800 [-] gate pid: 91402015-06-06 14:59:58+0800 [BilateralBroker,0,127.0.0.1] node [net] takeProxy ready2015-06-06 14:59:58+0800 [BilateralBroker,1,127.0.0.1] node [game] takeProxy ready2015-06-06 14:59:58+0800 [BilateralBroker,2,127.0.0.1] node [gate] takeProxy ready22015-06-06 14:59:58+0800 [Broker,client] call method remote_connect on service[single]015-06-06 14:59:58+0800 [Broker,client] call method remote_connect on service[single]22015-06-06 14:59:58+0800 [Broker,client] Starting factory <twisted.spread.pb.PBClientFactory instance at 0x0000000003019B88>015-06-06 14:59:58+0800 [Broker,client] Starting factory <twisted.spread.pb.PBClientFactory instance at 0x0000000002F5F088>2015-06-06 14:59:58+0800 [BilateralBroker,0,127.0.0.1] node [game] takeProxy ready2015-06-06 14:59:58+0800 [BilateralBroker,1,127.0.0.1] node [net] takeProxy ready
2)运行客户端,输入 1~10 中任意一个数字,输入 exit 退出客户端 

在客户端控制台输入



看看代码

net.py

#coding:utf8from firefly.server.globalobject import netserviceHandle,GlobalObject@netserviceHandledef random_1001(_conn,number):    #客户端传来的number是str型,转换成int型    number = int(number)    #调用root服务器(gate)的random_1002方法,参数为number    result = GlobalObject().remote['gate'].callRemote("random_1002",number)    #返回结果    return result
gate.py
#coding:utf8from firefly.server.globalobject import rootserviceHandle,GlobalObject@rootserviceHandledef random_1002(number):    #调用node服务器(game)的random_1003方法,参数为number    result = GlobalObject().root.callChildByName("game","random_1003",number)    #返回结果    return result
game.py
#coding:utf8from firefly.server.globalobject import remoteserviceHandleimport random@remoteserviceHandle("gate")def random_1003(number):    randomNu = random.randint(1,10)#在1~10内随机一个数    if number == randomNu:#对比客户端传来的数据        return "True"    else:        return "False,result is %s" % randomNu            

客户端

#coding:utf8from socket import AF_INET,SOCK_STREAM,socketimport struct,timedef sendData(sendstr,commandId):    '''定义协议头    '''    HEAD_0 = chr(0)    HEAD_1 = chr(0)    HEAD_2 = chr(0)    HEAD_3 = chr(0)    ProtoVersion = chr(0)    ServerVersion = 0    sendstr = sendstr    data = struct.pack('!sssss3I',HEAD_0,HEAD_1,HEAD_2,\                       HEAD_3,ProtoVersion,ServerVersion,\                       len(sendstr)+4,commandId)    senddata = data+sendstr    return senddatadef resolveRecvdata(data):    '''解析数据,根据定义的协议头解析服务器返回的数据    '''    head = struct.unpack('!sssss3I',data[:17])    lenght = head[6]    message = data[17:17+lenght]    return messageif __name__ == "__main__":    HOST='localhost'    PORT=11000    ADDR=(HOST , PORT)    client = socket(AF_INET,SOCK_STREAM)    client.connect(ADDR)#建立socket连接    while 1:        number = raw_input("Please enter your number(1~10):")        if number == "exit":            break        client.sendall(sendData(number,1001))#向服务器发送消息        message = client.recv(1024)#接收服务器返回的消息        message = resolveRecvdata(message)#解析消息        print message    client.close()





0 0