首先 安装 架构 npm install pomelo -g 然后到 命令行生成文件 命令是
pomelo init 进行如下图![在这里
完成之后打开生成的项目
game_server 是所有游戏的服务器 所有的功能逻辑都在这个目录下
game-server/app.js 是入口文件
game-server/app:这个是春芳游戏逻辑功能的相关代码都在这个子目录下
servers 目录下是可以新 创建多个目录扶我去 在 pomelo 中是 使用 路径来区分服务器类型的
game-server/log 这个是日志目录 存放 所有游戏的 日志文件
game-server/config 存放游戏服务器的向光配置文件目录 想日志 服务区 数据库 等所有配置文件
shared 公共的代码存放处 这里可以放一些代码
行动项目的命令行
game-start
取浏览取中输入 出翔这个界面 就应该没有问题了
开始创建分布式服务区 然后进行相关的 配置
首先在 servers 的文件夹 下生成这这几个文件 !
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191202152712658.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191202152841558.png)
这几个代表的 都是服务器
在一般情况下用户量一台机器就可以支撑,但用户量多了就得扩充服务器,gate服务器的作用就相当于前端负载均衡服务器;
客户端向gate服务器发出请求,gate服务器会给客户端分配一个connector服务器;
创建完成之后配置 config 的 josn 文件 来连接 访问
配置 master.json
{
“development”: {
“id”: “master-server-1”, “host”: “127.0.0.1”, “port”: 3005
},
“production”: {
“id”: “master-server-1”, “host”: “127.0.0.1”, “port”: 3005
}
}
然后在配置 servers。josn 文件
注意这个是 你 服务器的 名字 以及 端口 连接子接口的端口 虽然我也不明白怎么回事先记得 以后再说;
{
“development”:{
“connector”: [
{“id”: “connector-server-1”, “host”: “127.0.0.1”, “port”: 3150, “clientHost”: “127.0.0.1”, “clientPort”: 3010, “frontend”: true}
],
“gate”:[
{“id”:“gata-server-1”,“host”:“127.0.0.1”,“port”:3350,“clientPort”:3250,“frontend”:true,“auto-restart”:true}
],
“hall”:[
{“id”:“hall-server-1”,“host”:“127.0.0.1”,“port”:4200}
],
“versus”:[
{
“id”:“sersus-server-1”,“host”:“127.0.0.1”,“port”:4250
}
]
},
“production”:{
“connector”: [
{“id”: “connector-server-1”, “host”: “127.0.0.1”, “port”: 3150, “clientHost”: “127.0.0.1”, “clientPort”: 3010, “frontend”: true}
],
“gate”:[
{“id”:“gata-server-1”,“host”:“127.0.0.1”,“post”:3350,“clientPort”:3250,“frontend”:true,“aotu-restart”:true}
],
“hall”:[
{“id”:“hall-server-1”,“host”:“127.0.0.1”,“prot”:4200}
],
“versus”:[
{“id”:“sersus-server-1”,“host”:“127.0.0.1”,“port”:4250}
]
}
}
id 字符串类型的服务器
host 应用服务器的域名 或者地址
port 请求的端口
frontend bool类型是佛是前段服务器 默认是false
配置 adminServer。json
[{
“type”: “connector”,
“token”: "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn
},
{
“type”:“chat”,
“token”:"agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn
},
{
“type”:“gate”,
“token”:“agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn”
},
{
“type”:“hall”,
“token”:“agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn”
}
]
5解决服务器分配的问题
冲上面的servers.json 配置的修好可以看出最先来时创建的项目一个服务区相比, connector 和chat 我都配置了一个
这就是要姐姐客服端的请求服务器分配问题 解决思路 用户 访问gate服务器 使用该用户的uid 的省人才2
的校验码 与 connector 服务器的合适取余宠儿得到一个 connector服务器把这个connector服务器分配各请求的用户
在 app的目录先创建util 的目录 在这个目录下创建dispatcher.js 和 routeUtil.js 文件来处理赐福去的分配问题
var crc = require(‘crc’);
module.exports = function () {
return new dispatch();
};
var dispatch = function () {}
dispatch.prototype.dispatch = function(uid, connectors) {
console.log(‘connectors------>seves’,connectors);
console.log(‘uid’,uid);
console.log(‘connectors------>seves’,typeof connectors);
var index = Math.abs(crc.crc32(uid)) % connectors.length;
return connectors[index];
};
routeUtil.js的内容
module.exports = function () {
return new exp();
};
var exp = function () {};
var dispatcher = require('./dispatcher');
exp.prototype.createGame = function(serverName)
{
return function(session, msg, app, cb) {
let servers = app.getServersByType(serverName);
if(!servers || servers.length === 0) {
if(!!cb && typeof cb == 'function')
{
cb(new Error('can not find '+ serverName +' servers.'));
}
return;
}
let openid = session.get('openid');
let d = new dispatcher();
let res = d.dispatch(openid, servers);
cb(null, res.id);
};
};
准备好这些 在game-server 服务区的如楼文件app.js 中添加配置
var pomelo = require(‘pomelo’);
//创建模块的实例
var app = pomelo.createApp();
//设置名字
app.set(‘name’, ‘text’);
//获取实例
var routeUtil = require(’./app/util/routeUtil’);
var fs = require(‘fs’);
app.configure('production|development', 'connector', function(){
let serverConfig = {
reloadHandlers:true,
reloadRemotes:true
};
app.set('serverConfig',serverConfig);
app.set('connectorConfig',
{
connector : pomelo.connectors.hybridconnector,
heartbeat : 30,
/* ssl: {
type: 'wss',
key: fs.readFileSync('./key/3027754_xcx.20181206.top.key'),
cert: fs.readFileSync('./key/3027754_xcx.20181206.top.pem')
}, */
useDict : true,
useProtobuf : true,
handshake : function(msg, cb){
cb(null, {});
}
});
});
//
app.loadConfig("mysql", app.getBase() + "/config/mysql.json");
app.loadConfig("wechat", app.getBase() + "/config/wechat.json");
app.loadConfig("breakModel", app.getBase() + "/config/break.json");
app.loadConfig("modelTime", app.getBase() + "/config/modelTime.json");
app.configure('production|development' ,function () {
var dbclient = require('./app/dao/mysql/mysql').init(app);
app.set('dbclient', dbclient);
})
app.configure('production|development', 'gate', function(){
app.set('connectorConfig',
{
connector : pomelo.connectors.hybridconnector,
useProtobuf : true
});
});
var routeT = new routeUtil();
app.route('hall', routeT.createGame('hall'));
app.route('versus', routeT.createGame('versus'));
var HttpServer = require('./app/gamehttp/httpServer');
var httpServer = new HttpServer(app);
app.set('httpServer', httpServer);
var roomManager = require('./app/game/roomManager');
var gamescene = require('./app/game/gameid').gamescene;
app.configure('production|development', function () {
const serverType = app.serverType;
if(serverType !== 'master' && serverType !== 'connector')
{
const scene = gamescene[serverType];
for(const key in scene)
{
const sbj = scene[key];
let room = new roomManager(sbj.time);
app.set(sbj.room,room);
room.timerForOutCard();
}
}
})
app.start();
process.on('uncaughtException', function (err) {
console.error(' Caught exception: ' + err.stack);
});