自助网站建设怎么建设,网页休闲小游戏,邵阳建设局网站,山西省的网站目录
Pomelo
安装Pomelo
创建demoserver项目
pomelo命令
项目结构说明
pomelo框架
架构
服务器实现
客户端请求与响应、广播的抽象介绍 Pomelo
pomelo是一个快速、可扩展、Node.js分布式游戏服务器框架#xff0c;对游戏服务器开发感兴趣的同学可以关注关注。
之前…目录
Pomelo
安装Pomelo
创建demoserver项目
pomelo命令
项目结构说明
pomelo框架
架构
服务器实现
客户端请求与响应、广播的抽象介绍 Pomelo
pomelo是一个快速、可扩展、Node.js分布式游戏服务器框架对游戏服务器开发感兴趣的同学可以关注关注。
之前做页游端游和手游一直都是用的C或者C luaC golang的方式来开发说实话C用起来得心用手有多少坑自己心里有点逼数用的大都是腾讯系的框架库要么是盛大系的框架库底层比较稳定即使如此但一旦有个项目要立项之前代码不可换皮的情况下你发现用C开发还真的是笨重因为你可能又得重新编一大堆的库或许编完就得大半天功夫有些工具类库可能还得自己去写。
后来在2018年接手国外的一个游戏项目老外借助gameSparks平台开发用的nodejs这个时候我才关注nodejs到现在已经2年了我不算是nodejs的开发老人但也算是用nodejs开发了不少游戏项目那么这里我给大家分享一个比较热门活跃的服务器框架pomelo。
用它的主要好处
1. 入门简单有比较丰富的文档和示例虽然现在看版本也比较老了但是入门没什么问题
2.分布式多进程且扩展简单单进程多线程每个服务器都是一个Node进程通过配置文件就可以管理集群
3.可以不去关注底层和网络相关逻辑聚焦业务逻辑的处理对于有Web服务器开发经验却没有游戏服务器开发经验来说还是比较友好的
4.提供了很多工具和客户端支持像IOS、Android Java、Javascript、C、Cocos2d-x、U3D等 安装Pomelo
安装要求 不管是windows还是linux 我更喜欢用源码安装毕竟源码时最新的而且我也可以选择版本来更新。
比如用命令简单傻瓜操作
npm install pomelo -g
如果用源码安装
git clone https://github.com/NetEase/pomelo.git
cd pomelo
npm install -g
安装完之后看到我的版本信息 说明Pomelo安装可能出现各种失败 1. 回头去检查一下Python是否2.5 version 3.0和VC编辑器是否有问题 2.如果以前全局安装过Pomelo最好删除掉 “C:\Users\当前用户\AppData\Roaming\npm\node_modules”目录下Pomelo文件夹和“C:\Users\当前用户\AppData\Roaming\npm-cache”目录下Pomelo开头的文件夹 3.如果并不报错npm卡住不动多数是网络原因重复多安几次或者打开FQ工具试试也可以用淘宝镜像 cnpm 安装.
创建demoserver项目
$ pomelo init ./demoserver或者使用命令
$ mkdir demoserver
$ cd demoserver
$ pomelo init
在初始化项目过程中需要你选择网络连接协议
Please select underly connector, 1 for websocket(native socket), 2 for socket.io, 3 for wss, 4 for socket.io(wss), 5 for udp, 6 for mqtt
除了5 for udp,其它都是长连接我们接下来选择1至于这些协议之间有什么区别请各位自行查找资料这里不赘述了。 如果你不小心选择网络协议错了不要紧你仍然有机会修改app.js的配置 如果你需要替换成wss那么你只需要参考app.js.wss里的配置修改里边对应的位置 项目初始化成功后转到项目根目录执行安装项目执行 npm-install.bat 依赖项 (其它平台执行npm-install.sh)接下来我有必要说一下pomelo的命令因为你在目前或者后期会经常和一些命令打交道。
pomelo命令
命令行工具pomelo是Pomelo框架提供的一个小工具该工具能够帮助开发者更便捷、更有效率地进行应用开发。该工具包括的命令支持绝大多数的应用开发操作包括创建初始项目、启动应用、停止应用、关闭应用等。
init init: 创建一个新项目该项目中包含创建pomelo应用的基本文件及pomelo应用的简单示例。支持相对路径和绝对路径。默认情况下为当前路径项目名称为当前文件夹名称。
pomelo init projectname
在创建新项目时需要选择新项目使用的与客户端通信时使用的connector1代表Websocket(native socket)2代表 socket.io。
start start: 启动应用及服务器。
pomelo start [-e,–env ] [-d,–directory ] [-D,–daemon] 命令格式
其中-e 用来选择启动时使用的env如productiondevelopmentstress-test等; -d 用来指定项目目录 -D 用来开启daemon模式启动如果开启了daemon那么进程将转入后台运行, 所有的日志将不再打印到console上只能通过对应的日志文件查看日志。
list
list: 列出当前应用开启的所有服务器的信息包括服务器Id、服务器类型、pid、堆使用情况、启动时长。
pomelo list [-u,–username ] [-p,–password ] [-h,–host ] [-P,–port ] 命令格式
当应用启动后该命令列出所有服务器信息。由于当执行此操作时pomelo是作为监控管理框架的一个客户端的在连接注册到master上的时候需要进行身份验证。默认生成的项目中有一个默认的用户名admin口令也为admin因此在不指定用户名和口令的时候默认使用的用户名和口令均为admin下面的stop命令和kill命令均需要使用用户名和口令验证默认值与此处相同。应用的管理用户可以通过修改config/adminUser.json文件进行配置 执行本命令时还需要指定master服务器的ip和port, 这样可以是的pomelo list可以在任意地方执行。pomelo stop/kill/add等也同样需要指定master服务器的ip和port默认使用127.0.0.1:3005作为master服务器的地址。
4 . pomelo命令stop
stop: 关闭应用及服务器或者停止指定的服务器。
pomelo stop [-u,–username ] [-p,–password ] [-h,–host ] [-P,–port ] […] 命令格式
stop用来停止当前应用优雅地关闭应用。和kill命令不同这种关闭首先会切断客户端与服务器的连接然后逐一关闭所有服务器。如果指定了服务器serverId的话则会关闭特定的服务器而不是关闭所有的服务器。与list命令一样需要权限验证默认的用户名和密码均为admin,也需要指定master服务器的位置, 跟pomelo list一样默认使用127.0.0.1:3005。
kill 该命令需在项目的根目录或game-server下使用; kill: 强制关闭应用及服务器。
pomelo kill [-u,–username ] [-p,–password ] [-h,–host ] [-P,–port ] [-f,–force]
该命令强制关闭应用。在本地进行应用开发过程中如果遇到kill之后还有服务器进程没有关闭的情况可以增加–force选项强制关闭所有服务器进程。该操作相当地暴力可能产生数据丢失等不好的影响可以在开发调试时使用不推荐在线上使用该命令。该命令同样也需要进行身份验证以及指定master服务器的位置具体方式同list和stop。
6 . pomelo命令add
add: 运行时动态添加服务器。pomelo add也需要身份验证以及指定master服务器的地址。
pomelo add [-u,–username ] [-p,–password ] [-h,–host ] [-P,–port ] […]
args参数是用来指定新增服务器的参数的包括服务器类型服务器id等 支持一次增加一台或多台同类型的服务器示例如下
pomelo add host127.0.0.1 port8000 clientPort9000 frontendtrue clusterCount3 serverTypeconnector pomelo add host127.0.0.1 port8000 clientPort9000 frontendtrue serverTypeconnector idadded-connector-server
masterha
masterha: 当启用masterha高可用的时候用来启动master服务器的slave节点。需要在game-server/config目录下配置masterha.json。其他的命令行参数类似于pomelo start
pomelo masterha [-d,–direcotry ]
其他命令 –version列出当前使用pomelo的版本信息。 –help列出所有pomelo支持的命令及使用说明。
项目结构说明 game-server 游戏服务器所有游戏服务器功能和逻辑都在此目录下 game-server/app.js入口文件 game-server/app 存放游戏逻辑和功能相关代码都这个子目录下servers目录下可以新建多个目录来创建不同类型的服务器在pomelo中使用路径来区分服务器类型 game-server/config存放游戏服务器配置文件目录像日志、服务器、数据库等几乎所有配置文件都可以存放到此目录下 game-server/logs日志目录存放游戏服务器所有日志文件 web-server web服务器如果你是个H5游戏这里就是Web客户端如果是IOS、Andriod客户端这目录就没什么用 shared公共代码存放处这里要以放一些共用代码 所有依赖项安装成功后开始启动项目 启动game-server
cd game-server
pomelo start 测试连接 1.启动web-server
cd web-server
node app 修改web-server里的app.js : 打开浏览器 测试gameserver 这里可以用我刚才说的pomelo命令查看下当前的服务器 好了你现在可以运行demo了那么接下来就得开始循序渐进熟悉框架了
pomelo框架
架构
该架构把游戏服务器做了抽象 抽象成为两类前端服务器和后端服务器 如图 前端服务器(frontend)的职责
负责承载客户端请求的连接
维护session信息
把请求转发到后端
把后端需要广播的消息发到前端
后端服务器(backend)的职责
处理业务逻辑 包括RPC和前端请求的逻辑
把消息推送回前端
服务器实现
动态语言的面向对象有个基本概念叫鸭子类型 服务器的抽象也同样可以比喻为鸭子 服务器的对外接口只有两类 一类是接收客户端的请求 叫做handler 一类是接收RPC请求 叫做remote handler和remote的行为决定了服务器长什么样子。 因此我们只要定义好handler和remote两类的行为 就可以确定这个服务器的类型。
服务器抽象的实现
利用目录结构与服务器对应的形式 可以快速实现服务器的抽象。
以下是示例图 图中的connector, connector, gate三个目录代表三类服务器类型 每个目录下的handler与remote决定了这个服务器的行为对外接口。 开发者只要往handler与remote目录填代码 就可以实现某一类的服务器。这让服务器实现起来非常方便。 让服务器动起来 只要填一份配置文件servers.json就可以让服务器快速动起来。 配置文件和对应的进行架构如下所示 1 . gate服务器 一个应用的gate服务器一般不参与rpc调用也就是说其配置项里可以没有port字段仅仅有clientPort字段它的作用是做前端的负载均衡。客户端往往首先向gate服务器发出请求gate会给客户端分配具体的connector服务器。具体的分配策略一般是根据客户端的某一个key做hash得到connector的id这样就可以实现各个connector服务器的负载均衡。
2 . connector服务器 connector服务器接收客户端的连接请求创建与客户端的连接维护客户端的session信息。同时接收客户端对后端服务器的请求按照用户配置的路由策略将请求路由给具体的后端服务器。当后端服务器处理完请求或者需要给客户端推送消息的时候connector服务器同样会扮演一个中间角色完成对客户端的消息发送。connector服务器会同时拥有clientPort和port其中clientPort用来监听客户端的连接port端口用来给后端提供服务。
目前pomelo提供了hybridconnector和sioconnector其中hybridconnector支持tcpwebsocket; sioconnector支持socket.io。但是实际编程中只有这些connector可能还无法满足我们的需求我们可能需要自己定制自己的connectorpomelo提供了定制connector的接口我们将会在后边的项目实例种用到。
3 . 应用逻辑服务器 gate服务器和connector服务器又都被称作前端服务器应用逻辑服务器是后端服务器它完成实际的应用逻辑提供服务给客户端当然客户端的请求是通过前端服务器路由过来的。后端服务器之间也会通过rpc调用而有相互之间的交互。由于后端服务器不会跟客户端直接有连接因此后端服务器只需监听它提供服务的端口即可。
4 . master服务器 master服务器加载配置文件通过读取配置文件启动所配置的服务器集群并对所有服务器进行管理。
5 . rpc调用 pomelo中使用rpc调用进行进程间通信在pomelo中rpc调用分为两大类使用namespace进行区分namespace为sys的为系统rpc调用它对用户来说是透明的目前pomelo中系统rpc调用有 1.后端服务器向前端服务器请求session信息 2.后端服务器通过channel推送消息时对前端服务器发起的rpc调用 3.前端服务器将用户请求路由给后端服务器时也是sys rpc调用 除了系统rpc调用外其余的由用户自定义的rpc调用属于user namespace的rpc调用需要用户自己完成rpc服务端remote的handle代码并由rpc客户端显式地发起调用
6 . route,touter route用来标识一个具体服务或者客户端接受服务端推送消息的位置对服务端来说其形式一般是…,例如chat.chatHandler.send, chat就是服务器类型chatHandler是chat服务器中定义的一个Handlersend则为这个Handler中的一个handle方法。对客户端来说其路由一般形式为onXXX当服务端推送消息时客户端会有相应的回调。 一般来说具体的同类型应用服务器都会有多个当客户端请求到达后前端服务器会将用户客户端请求派发到后端服务器这种派发需要一个路由函数router可以粗略地认为router就是根据用户的session以及其请求内容做一些运算后将其映射到一个具体的应用服务器id。可以通过application的route调用给某一类型的服务器配置其router。如果不配置的话pomelo框架会使用一个默认的router。pomelo默认的路由函数是使用session里面的uid字段计算uid字段的crc32校验码然后用这个校验码作为key跟同类应用服务器数目取余得到要路由到的服务器编号。注意这里有一个陷阱就是如果session没有绑定uid的话此时uid字段为undefined可能会造成所有的请求都路由到同一台服务器。所以在实际开发中还是需要自己来配置router。
7 . Channel channel可以看作是一个玩家id的容器主要用于需要广播推送消息的场景。可以把某个玩家加入到一个Channel中当对这个Channel推送消息的时候所有加入到这个Channel的玩家都会收到推送过来的消息。一个玩家的id可能会被加入到多个Channel中这样玩家就会收到其加入的Channel推送过来的消息。需要注意的是Channel都是服务器本地的应用服务器A和B并不会共享Channel也就是说在服务器A上创建的Channel只能由服务器A才能给它推送消息。
8 . request, response, notify, push pomelo中有四种消息类型的消息分别是requestresponsenotify和push客户端发起request到服务器端服务器端处理后会给其返回响应response;notify是客户端发给服务端的通知也就是不需要服务端给予回复的请求;push是服务端主动给客户端推送消息的类型。
9 . filter filter分为before和after两类每类filter都可以注册多个形成一个filter链所有的客户端请求都会经过filter链进行一些处理。before filter会对请求做一些前置处理如检查当前玩家是否已登录打印统计日志等。after filter是进行请求后置处理的地方如释放请求上下文的资源记录请求总耗时等。after filter中不应该再出现修改响应内容的代码因为在进入after filter前响应就已经被发送给客户端。
10 . handler handler是实现具体业务逻辑的地方在请求处理流程中它位于before filter和after filter之间handler的接口声明如下 handler.methodName function(msg, session, next) { // … } 参数含义与before filter类似。handler处理完毕后如有需要返回给客户端的响应可以将返回结果封装成js对象通过next传递给后面流程。
11 . error handler error handler是一个处理全局异常的地方可以在error handler中对处理流程中发生的异常进行集中处理如统计错误信息组织异常响应结果等。error handler函数是可选的格式如下 app.set(‘errorHandler’, handleFunc); 来向pomelo框架进行注册函数声明如下 errorHandler function(err, msg, resp, session, next) { // … } err是前面流程中发生的异常resp是前面流程传递过来需要返回给客户端的响应信息。 12 . component pomelo 框架是由一些松散耦合的component组成的每个component完成一些功能。每个component往往有startafterStartstop等调用用来完成生命周期管理。
13 . admin client, monitor, master monitor运行在各个应用服务器中它会向master注册自己向master上报其服务器的信息当服务器群有变化时接收master推送来的变化消息更新其服务器上下文。 master运行在应用服务器中它会收集整个服务器群的信息有变化时会将变化推送到各个monitor同时master还接受admin client的请求按照client发出的命令执行对应的操作。 client独立运行自己的进程它会发起到master的连接然后通过对master发出请求或者命令来管理整个服务器群。
14 . admin module 在pomelo中module特指服务器监控管理模块实现的是监控逻辑比如收集进程状态等。用户在使用时可以通过application的registerAdmin注册管理模块实现自己定制的监控管理功能。每一个module中都会定义可选的四种回调函数
masterHandler(agent, msg, cb) 当有应用服务器给master发监控数据时这个回调函数会由master进程进行回调完成应用服务器的消息处理;monitorHandler(agent, msg, cb) 当有master请求应用服务器的一些监控信息时由应用服务器进行回调完成对master请求的处理;clientHandler(agent, msg, cb当由管理客户端向master请求服务器群信息时由master进程进行回调处理客户端的请求。start(cb) 当admin module注册加载完成后这个回调会被执行在这里可以做一些初始化工作。
客户端请求与响应、广播的抽象介绍
所有的web应用框架都实现了请求与响应的抽象。尽管游戏应用是基于长连接的 但请求与响应的抽象跟web应用很类似。 下图的代码是一个request请求示例 请求的api与web应用的ajax请求很象基于Convention over configuration的原则 请求不需要任何配置。 如下图所示请求的route字符串chat.chatHandler.send 它可以将请求分发到chat服务器上chatHandler文件定义的send方法。
Pomelo的框架里还实现了request的filter机制广播/组播机制详细介绍见pomelo框架参考。
服务器间RPC调用的抽象介绍
架构中各服务器之间的通讯主要是通过底层RPC框架来完成的该RPC框架主要解决了进程间消息的路由和RPC底层通讯协议的选择两个问题。 服务器间的RPC调用也实现了零配置。实例如下图所示 上图的remote目录里定义了一个RPC接口 chatRemote.js它的接口定义如下
chatRemote.kick function(uid, player, cb) {}
其它服务器RPC客户端只要通过以下接口就可以实现RPC调用
app.rpc.chat.chatRemote.kick(session, uid, player, function(data){}); 这个调用会根据特定的路由规则转发到特定的服务器。如场景服务的请求会根据玩家在哪个场景直接转发到对应的server。
rpc的使用远比其它rpc框架简单好多因为我们无需写任何配置文件也无需生成stub。因为我们服务器抽象的实现的方式使得rpc客户端可以在应用启动时扫描服务器目录自动生成stub对象。
完成了以上三个目标 一个实时的分布式应用框架的轮廓就搭出来了。接下来我们在下一章节里说明下在当前demoserver的基础上不断地扩充丰富它的功能。