diff --git a/game-server/app.ts b/game-server/app.ts index 75db65944..d05e59bf4 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -13,6 +13,7 @@ import './app/servers/user.rpc.define' import * as routeUtil from './app/util/routeUtil'; import { preload } from './preload'; var checkEventFilter = require('./app/servers/battle/filter/checkEventFilter'); +import { connectRedis } from './config/redis'; // TODO 需要整理。 import _pinus = require('pinus'); @@ -21,13 +22,7 @@ const filePath = (_pinus as any).FILEPATH; filePath.MASTER = '/config/master'; filePath.SERVER = '/config/servers'; filePath.CRON = '/config/crons'; -// if(process.env.NODE_ENV == 'local') { - filePath.LOG = '/config/log4js.local'; -// } else if(process.env.NODE_ENV == 'prod'){ -// filePath.LOG = '/config/log4js.prod'; -// } else { -// filePath.LOG = '/config/log4js.prod'; -// } +filePath.LOG = '/config/log4js'; filePath.SERVER_PROTOS = '/config/serverProtos'; filePath.CLIENT_PROTOS = '/config/clientProtos'; filePath.MASTER_HA = '/config/masterha'; @@ -45,32 +40,36 @@ adminfilePath.ADMIN_USER = 'config/adminUser'; */ preload(); -let mongoAddr = 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098'; -if(process.env.NODE_ENV == 'local') { - mongoAddr = 'mongodb://127.0.0.1/zyz'; -} - -// 创建 mongodb 连接 -mongoose.connect(mongoAddr, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }, (err) => { - if (err) { - console.log('mongodb connect err', err); - } else { - console.log('mongodb connect suc'); - } -}); - /** * Init app for client. */ let app = pinus.createApp(); app.set('name', 'chatofpomelo-websocket'); -// TODO 重启 1 次只需要初始化 1 次,判断方法可以优化 -if (app.serverId === 'master-server-1') { - redisService.initAllRank(); - redisService.clearComBtlQueue(); -} + +// 加载数据库和redis +app.configure(function() { + app.loadConfig('database', app.getBase() + '/config/database'); + + mongoose.connect(app.get('database').mongo, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false }, (err) => { + if (err) { + console.log('mongodb connect err', err); + } else { + console.log('mongodb connect suc'); + } + }); + + const redisClient = connectRedis(app.get('database').redis); + app.set('redis', redisClient); + + // TODO 重启 1 次只需要初始化 1 次,判断方法可以优化 + if (app.serverId === 'master-server-1') { + redisService.initAllRank(); + redisService.clearComBtlQueue(); + } +}); + // app configuration -app.configure('production|development|local', 'connector', function () { +app.configure('production|development|alpha|dev', 'connector', function () { app.set('connectorConfig', { connector: pinus.connectors.hybridconnector, @@ -95,7 +94,7 @@ app.configure('production|development|local', 'connector', function () { }); }); -app.configure('production|development|local', 'gate', function () { +app.configure('production|development|alpha|dev', 'gate', function () { app.set('connectorConfig', { connector: pinus.connectors.hybridconnector, @@ -128,7 +127,7 @@ export function globalErrorHandler(err: Error, msg: any, resp: any, } // app configure -app.configure('production|development|local', function () { +app.configure('production|development|alpha|dev', function () { app.set(RESERVED.ERROR_HANDLER, errorHandler); app.set(RESERVED.GLOBAL_ERROR_HANDLER, globalErrorHandler); app.globalAfter((err: Error, routeRecord: RouteRecord, msg: any, session: FrontendOrBackendSession, resp: any, cb: HandlerCallback) => { @@ -169,7 +168,7 @@ app.configure('production|development|local', function () { }); }); -app.configure('development|local', function () { +app.configure('development', function () { // enable the system monitor modules app.enable('systemMonitor'); app.enable('rpcDebugLog'); diff --git a/game-server/app/servers/gate/handler/gateHandler.ts b/game-server/app/servers/gate/handler/gateHandler.ts index 8039a0c06..af6b0df26 100644 --- a/game-server/app/servers/gate/handler/gateHandler.ts +++ b/game-server/app/servers/gate/handler/gateHandler.ts @@ -31,10 +31,6 @@ export class GateHandler { } // select connector let res = dispatch(userCode, connectors); - if(process.env.NODE_ENV=='local') { - return resResult(STATUS.SUCCESS, {host: '127.0.0.1', port: res.clientPort}); - } else { - return resResult(STATUS.SUCCESS, {host: res.clientHost, port: res.clientPort}); - } + return resResult(STATUS.SUCCESS, {host: res.clientHost, port: res.clientPort}); } } \ No newline at end of file diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index 7fb301ae6..936a12bce 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -4,68 +4,39 @@ import * as Redis from 'redis'; import {REDIS_KEY} from '../consts' import { GameModel } from "../db/Game"; import { promisifyAll } from 'bluebird'; - -// 映射 redis 接口 -declare module 'redis' { - export interface RedisClient extends NodeJS.EventEmitter { - hdelAsync(...args: any[]): Promise; - spopAsync(...args: any[]): Promise; - sremAsync(...args: any[]): Promise; - sismemberAsync(...args: any[]): Promise; - srandmemberAsync(...args: any[]): Promise; - delAsync(...args: any[]): Promise; - } - export interface Multi extends Commands { - execAsync(...args: any[]): Promise; - } -} - -let redisArr = 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com'; -if(process.env.NODE_ENV == 'local') { - redisArr = '127.0.0.1'; -} -// 创建 redis 连接 -const oldRedisClient = Redis.createClient(6379, redisArr, {detect_buffers: true}); -oldRedisClient.auth('zyz_2020', (err, reply) => { - if (err) { - console.log('redis err', err); - } else { - console.log('redis suc'); - } -}) - -// 转 promise -const client = promisifyAll(oldRedisClient) as Redis.RedisClient; -client.set('hello', 'redis', Redis.print); +import { pinus } from 'pinus'; /** * 在服务重新启动时,将信息存入redis */ export async function initAllRank() { + const client: Redis.RedisClient = pinus.app.get('redis'); const serverList = await GameModel.getAllServerList(); - await redisDel(REDIS_KEY.USER_INFO); + await client.delAsync(REDIS_KEY.USER_INFO); for(let {id} of serverList) { - await redisDel(getKeyName(REDIS_KEY.TOWER_RANK, id)); + await client.delAsync(getKeyName(REDIS_KEY.TOWER_RANK, id)); await initRank(id); } } export async function initRank(serverId: number) { // console.log('*****', 'initRank') - await redisExpire(getKeyName(REDIS_KEY.TOWER_RANK, serverId), 30 * 24 * 60 * 60); - await redisExpire(REDIS_KEY.USER_INFO, 30 * 24 * 60 * 60); + const client: Redis.RedisClient = pinus.app.get('redis'); + await client.expireAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), 30 * 24 * 60 * 60); + await client.expireAsync(REDIS_KEY.USER_INFO, 30 * 24 * 60 * 60); let ranks = await RoleModel.getRank('tower', serverId, ['roleId', 'roleName', 'towerLv', 'lv', 'vLv']); for(let {towerLv, roleId, roleName, lv, vLv, towerUpTime} of ranks) { // console.log(roleId); - await redisZadd(getKeyName(REDIS_KEY.TOWER_RANK, serverId), encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId); + await client.zaddAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId); await redisUserInfoAdd(roleId, {roleName, lv, vLv, guildName:"", head: "zhaoyun"}); } } // 排行榜是否存在 export async function existsRank(key: string, serverId: number) { - const result = await redisExists(getKeyName(key, serverId)); + const client: Redis.RedisClient = pinus.app.get('redis'); + const result = await client.existsAsync(getKeyName(key, serverId)); return result; } @@ -75,31 +46,35 @@ export function getKeyName(key: string, serverId: number) { // 更新玩家信息 export async function redisUserInfoUpdate(roleId: string, arr: Array<{field: string, value:(string|number)}>) { - let params = await redisHget(REDIS_KEY.USER_INFO, roleId); + const client: Redis.RedisClient = pinus.app.get('redis'); + let params = await client.hgetAsync(REDIS_KEY.USER_INFO, roleId); if(params) { let obj = JSON.parse(params); for(let {field, value} of arr) { obj[field] = value; } - return await redisHset(REDIS_KEY.USER_INFO, roleId, JSON.stringify(obj)); + return await client.hsetAsync(REDIS_KEY.USER_INFO, roleId, JSON.stringify(obj)); } } // 添加玩家信息缓存 export async function redisUserInfoAdd(roleId: string, params: {roleName: string, lv: number, vLv: number, guildName: string, head: string}) { + const client: Redis.RedisClient = pinus.app.get('redis'); let value = JSON.stringify(params); - return await redisHset(REDIS_KEY.USER_INFO, roleId, value); + return await client.hsetAsync(REDIS_KEY.USER_INFO, roleId, value); } // 更新排行榜 export async function setRank(key: string, serverId: number, roleId: string, score: number, timestamp: number, params: {roleName: string, lv: number, vLv: number, guildName: string, head: string}) { + + const client: Redis.RedisClient = pinus.app.get('redis'); // 更新分数 const _score = encodeScoreWithTime(score, timestamp); - await redisZadd(getKeyName(key, serverId), _score, roleId); + await client.zaddAsync(getKeyName(key, serverId), _score, roleId); // 移除100名以外 - await redisZremRangeByRank(getKeyName(key, serverId), 100, 10000); + await client.zremrangebyrankAsync(getKeyName(key, serverId), 100, 10000); // 如果没有信息,更新玩家信息 - const hasCurUser = await redisHexists(REDIS_KEY.USER_INFO, roleId); + const hasCurUser = await client.hexistsAsync(REDIS_KEY.USER_INFO, roleId); if(!hasCurUser) { await redisUserInfoAdd(roleId, params); } @@ -108,12 +83,14 @@ export async function setRank(key: string, serverId: number, roleId: string, sco // 获取排行榜 export async function getRank(key: string, serverId: number, roleId: string) { + + const client: Redis.RedisClient = pinus.app.get('redis'); let ranks = [], myRank = null; - const rankFromDb = await redisZrevrangeByScore(getKeyName(key, serverId), '+inf', '-inf', true, 100); + const rankFromDb = await client.zrevrangebyscoreAsync(getKeyName(key, serverId), '+inf', '-inf', "WITHSCORES", "LIMIT", 0, 100); for(let ii = 0; ii < rankFromDb.length; ii+=2) { const _roleId = rankFromDb[ii]; const _score = decodeScoreWithTime(rankFromDb[ii + 1]); - const userInfo = await redisHget(REDIS_KEY.USER_INFO, _roleId); + const userInfo = await client.hgetAsync(REDIS_KEY.USER_INFO, _roleId); const _userInfo = JSON.parse(userInfo); const tmp = {..._userInfo, roleId: _roleId, num: _score, rank: Math.floor(ii/2)+1} ranks.push(tmp); @@ -141,6 +118,7 @@ function decodeScoreWithTime(num: string): number { // 把寻宝的玩家信息存入 redis export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: Array) { + const client: Redis.RedisClient = pinus.app.get('redis'); let cmds = []; qualityArr.forEach(quality => { if (quality) { @@ -156,16 +134,19 @@ export async function setTeamSearchReq(roleId: string, sid: string, qualityArr: // 取出 0 - 2 个某品质的匹配中玩家,并在其它品质中删除此玩家信息 export async function rmRoleFromQueue(roleId: string, sid: string, qualityArr: Array) { + + const client: Redis.RedisClient = pinus.app.get('redis'); let cmds = []; for (let q of qualityArr) { cmds.push(['srem', `${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`, `${roleId}:${sid}`]); }; - const multiClient = client.multi(cmds) as Redis.Multi; + const multiClient = client.multi(cmds) as Redis.Multi; const newMulti = promisifyAll(multiClient) as Redis.Multi; await newMulti.execAsync(); } export async function getTeamSearchByQuality(quality: number) { + const client: Redis.RedisClient = pinus.app.get('redis'); // TODO: 操作不具有原子性 const userInfos = await client.srandmemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, 2); console.log('getTeamSearchByQuality: ' + userInfos); @@ -190,6 +171,7 @@ export async function getTeamSearchByQuality(quality: number) { } export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: Array) { + const client: Redis.RedisClient = pinus.app.get('redis'); for (let quality of qualityArr) { let res = await client.sismemberAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${quality}`, `${roleId}:${sid}`); if (res) { @@ -200,84 +182,10 @@ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr: } export async function clearComBtlQueue() { + const client: Redis.RedisClient = pinus.app.get('redis'); for (let q of GOOD_QUALITY) { client.delAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`); } } /**************** 寻宝相关 end */ - -////// redis方法 - -//// key - -// key 是否存在。 -export async function redisExists(key: string) { - return await createPromise('exists', [key]); -} - -// 在 key 存在时删除 key。 -export async function redisDel(key: string) { - return await createPromise('del', [key]); -} - -// 设置过期时间 -export async function redisExpire(key: string, seconds: number) { - return await createPromise('expire', [key, seconds]); -} - -//// 有序集合 - -// 返回有序集中指定分数区间内的成员,分数从高到低排序 -export async function redisZrevrangeByScore(key: string, max: (number|string), min: (number|string), withscores: boolean, limit?:number, offset=0): Promise> { - let param = [key, max, min]; - if(withscores) param.push('WITHSCORES'); - if(limit) param.push('LIMIT', offset, limit); - return await createPromise('zrevrangebyscore', param); -} - -// 向有序集合添加一个或多个成员,或者更新已存在成员的分数 -export async function redisZadd(key: string, field: number, value: string) { - return await createPromise('zadd', [key, field, value]); -} - -// 获取有序集合的成员数 -export async function redisZcard(key: string) { - return await createPromise('zcard', [key]); -} - -// 移除有序集合中给定的排名区间的所有成员 -export async function redisZremRangeByRank(key: string, start: number, stop: number) { - return await createPromise('zremrangebyrank', [key, start, stop]); -} - -//// 哈希 - -// 将哈希表 key 中的字段 field 的值设为 value -export async function redisHset(key: string, field: string, value: string) { - return await createPromise('hset', [key, field, value]); -} - -// 获取存储在哈希表中指定字段的值。 -export async function redisHget(key: string, field: string) { - return await createPromise('hget', [key, field]); -} - -// 获取存储在哈希表中指定字段的值。 -export async function redisHexists(key: string, field: string) { - return await createPromise('hexists', [key, field]); -} - -///// 封装promise -function createPromise(type: string, params: Array):Promise { - return new Promise((resolve, reject) => { - const cb = function(err: Error, result: any) { - if(err) { - reject(err); - } else { - resolve(result); - } - }; - client[type].apply(client, [...params, cb]); - }); -} \ No newline at end of file diff --git a/game-server/config.js b/game-server/config.js new file mode 100644 index 000000000..2abb43604 --- /dev/null +++ b/game-server/config.js @@ -0,0 +1,16 @@ +var fs = require('fs'); +function main (){ + var args = process.argv.splice(2) + if (args.length !== 1) { + return console.log('参数请填写环境变量'); + } + + let configObject = { + env: args[0] + }; + let result = JSON.stringify(configObject); + + fs.writeFileSync(__dirname + '/config.json', result, 'utf8'); +} + +main(); diff --git a/game-server/config.json b/game-server/config.json new file mode 100644 index 000000000..2877c2cae --- /dev/null +++ b/game-server/config.json @@ -0,0 +1 @@ +{"env":"development"} \ No newline at end of file diff --git a/game-server/config/log4js.ts b/game-server/config/alpha/log4js.ts similarity index 100% rename from game-server/config/log4js.ts rename to game-server/config/alpha/log4js.ts diff --git a/game-server/config/database.ts b/game-server/config/database.ts new file mode 100644 index 000000000..1406d714e --- /dev/null +++ b/game-server/config/database.ts @@ -0,0 +1,19 @@ +module.exports = { + 'development': { + 'mongo': 'mongodb://127.0.0.1/zyz', + 'redis': '127.0.0.1' + }, + + 'production': { + 'mongo': 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098', + 'redis': 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com' + }, + 'alpha': { + 'mongo': 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098', + 'redis': 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com' + }, + 'dev': { + 'mongo': 'mongodb://dbop:zyzdbopbantu@dds-8vbdb47c6fb58a541.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vbdb47c6fb58a542.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-500808098', + 'redis': 'r-8vb4i2kgl91886fkxd.redis.zhangbei.rds.aliyuncs.com' + } +}; \ No newline at end of file diff --git a/game-server/config/log4js.local.ts b/game-server/config/dev/log4js.ts similarity index 100% rename from game-server/config/log4js.local.ts rename to game-server/config/dev/log4js.ts diff --git a/game-server/config/development/log4js.ts b/game-server/config/development/log4js.ts new file mode 100644 index 000000000..6f40a7e00 --- /dev/null +++ b/game-server/config/development/log4js.ts @@ -0,0 +1,170 @@ +module.exports = { + 'appenders': { + 'console': { + 'type': 'console' + }, + 'logger': { + 'type': 'file', + 'filename': '${opts:base}/logs/logger.log', + 'pattern': 'connector', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'log': { + 'type': 'file', + 'filename': '${opts:base}/logs/log.log', + 'pattern': 'connector', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'con-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/con-log-${opts:serverId}.log', + 'pattern': 'connector', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'rpc-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/rpc-log-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'forward-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/forward-log-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'rpc-debug': { + 'type': 'file', + 'filename': '${opts:base}/logs/rpc-debug-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'crash-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/crash.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'admin-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/admin.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'pinus': { + 'type': 'file', + 'filename': '${opts:base}/logs/pinus-default.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'error': { + 'type': 'file', + 'filename': '${opts:base}/logs/error.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'pinus-admin': { + 'type': 'file', + 'filename': '${opts:base}/logs/pinus-admin.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'pinus-rpc': { + 'type': 'file', + 'filename': '${opts:base}/logs/pinus-rpc-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + } + }, + + 'categories': { + 'default': { + 'appenders': ['console'], + 'level': 'debug' + }, + 'pinus': { + 'appenders': ['console', 'pinus'], + 'level': 'debug' + }, + 'con-log': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'rpc-log': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'forward-log': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'rpc-debug': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'crash-log': { + 'appenders': ['console', 'crash-log'], + 'level': 'debug' + }, + 'admin-log': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'pinus-admin': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'pinus-rpc': { + 'appenders': ['console', 'log'], + 'level': 'debug' + }, + 'logger': { + 'appenders': ['console', 'logger'], + 'level': 'error' + } + }, + + 'prefix': '${opts:serverId} ', + 'replaceConsole': true, + 'lineDebug': false, + 'errorStack': true +}; diff --git a/game-server/config/master.ts b/game-server/config/master.ts index 2410ff2b8..969a78ee8 100644 --- a/game-server/config/master.ts +++ b/game-server/config/master.ts @@ -4,13 +4,17 @@ module.exports = { 'host': '127.0.0.1', 'port': 3005 }, - 'production': { 'id': 'master-server-1', 'host': '127.0.0.1', 'port': 3005 }, - 'local': { + 'alpha': { + 'id': 'master-server-1', + 'host': '127.0.0.1', + 'port': 3005 + }, + 'dev': { 'id': 'master-server-1', 'host': '127.0.0.1', 'port': 3005 diff --git a/game-server/config/log4js.pro.ts b/game-server/config/production/log4js.pro.ts similarity index 97% rename from game-server/config/log4js.pro.ts rename to game-server/config/production/log4js.pro.ts index c6dc84833..6f40a7e00 100644 --- a/game-server/config/log4js.pro.ts +++ b/game-server/config/production/log4js.pro.ts @@ -117,6 +117,10 @@ module.exports = { }, 'categories': { + 'default': { + 'appenders': ['console'], + 'level': 'debug' + }, 'pinus': { 'appenders': ['console', 'pinus'], 'level': 'debug' diff --git a/game-server/config/production/log4js.ts b/game-server/config/production/log4js.ts new file mode 100644 index 000000000..88878c40d --- /dev/null +++ b/game-server/config/production/log4js.ts @@ -0,0 +1,134 @@ +module.exports = { + 'appenders': { + 'console': { + 'type': 'console' + }, + 'con-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/con-log-${opts:serverId}.log', + 'pattern': 'connector', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'rpc-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/rpc-log-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'forward-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/forward-log-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'rpc-debug': { + 'type': 'file', + 'filename': '${opts:base}/logs/rpc-debug-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'crash-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/crash.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'admin-log': { + 'type': 'file', + 'filename': '${opts:base}/logs/admin.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'pinus': { + 'type': 'file', + 'filename': '${opts:base}/logs/pinus-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'pinus-admin': { + 'type': 'file', + 'filename': '${opts:base}/logs/pinus-admin.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + }, + 'pinus-rpc': { + 'type': 'file', + 'filename': '${opts:base}/logs/pinus-rpc-${opts:serverId}.log', + 'maxLogSize': 1048576, + 'layout': { + 'type': 'basic' + }, + 'backups': 5 + } + }, + + 'categories': { + 'default': { + 'appenders': ['console', 'pinus'], + 'level': 'debug' + }, + 'con-log': { + 'appenders': ['con-log'], + 'level': 'debug' + }, + 'rpc-log': { + 'appenders': ['rpc-log'], + 'level': 'debug' + }, + 'forward-log': { + 'appenders': ['forward-log'], + 'level': 'debug' + }, + 'rpc-debug': { + 'appenders': ['rpc-debug'], + 'level': 'debug' + }, + 'crash-log': { + 'appenders': ['crash-log'], + 'level': 'debug' + }, + 'admin-log': { + 'appenders': ['admin-log'], + 'level': 'debug' + }, + 'pinus-admin': { + 'appenders': ['pinus-admin'], + 'level': 'debug' + }, + 'pinus-rpc': { + 'appenders': ['pinus-rpc'], + 'level': 'debug' + }, + + }, + + 'prefix': '${opts:serverId} ', + 'replaceConsole': true, + 'lineDebug': false, + 'errorStack': true +}; diff --git a/game-server/config/redis.ts b/game-server/config/redis.ts new file mode 100644 index 000000000..234a16b14 --- /dev/null +++ b/game-server/config/redis.ts @@ -0,0 +1,63 @@ +import * as Redis from 'redis'; +import { promisifyAll } from 'bluebird'; + +// 映射 redis 接口 +declare module 'redis' { + export interface RedisClient extends NodeJS.EventEmitter { + // key 是否存在。 + existsAsync(key: string): Promise; + // 在 key 存在时删除 key。 + delAsync(key: string): Promise; + // 设置过期时间 + expireAsync(key: string, time: number): Promise; + + // 删除哈希表 key 中的一个或多个指定字段 + hdelAsync(key: string, field: string): Promise; + // 将哈希表 key 中的字段 field 的值设为 value + hsetAsync(key: string, field: string, value: string): Promise; + // 获取存储在哈希表中指定字段的值 + hgetAsync(key: string, field: string): Promise; + + // 移除并返回集合中的一个随机元素 + spopAsync(key: string, count?: number): Promise; + // 移除集合中一个或多个成员 + sremAsync(key: string, member: string): Promise; + // 返回集合中一个或多个随机数 + srandmemberAsync(key: string, count?: number): Promise; + // 判断成员元素是否是集合的成员 + sismemberAsync(key: string, member: string): Promise; + + // 向有序集合添加一个或多个成员,或者更新已存在成员的分数 + zaddAsync(key: string, score: number, member: string): Promise; + // 返回有序集中指定分数区间内的成员,分数从高到低排序 + zrevrangebyscoreAsync(key: string, max: (string|number), min: (string|number), withscores?: string, limit?:string, offset?: number, count?:number): Promise; + // 获取有序集合的成员数 + zcardAsync(key: string): Promise; + // 移除有序集合中给定的排名区间的所有成员 + zremrangebyrankAsync(key: string, start: number, stop: number): Promise; + // 获取存储在哈希表中指定字段的值。 + hexistsAsync(key: string, field: string): Promise; + } + export interface Multi extends Commands { + execAsync(...args: any[]): Promise; + } +} + +export function connectRedis(redisArr: string) { + + // 创建 redis 连接 + const oldRedisClient = Redis.createClient(6379, redisArr, {detect_buffers: true}); + oldRedisClient.auth('zyz_2020', (err, reply) => { + if (err) { + console.log('redis err', err); + } else { + console.log('redis suc'); + } + }) + + // 转 promise + const client = promisifyAll(oldRedisClient) as Redis.RedisClient; + client.set('hello', 'redis', Redis.print); + + return client; +} \ No newline at end of file diff --git a/game-server/config/servers.ts b/game-server/config/servers.ts index df5e65ec5..77f8959ea 100644 --- a/game-server/config/servers.ts +++ b/game-server/config/servers.ts @@ -1,81 +1,5 @@ module.exports = { 'development': { - 'connector': [ - { - 'id': 'connector-server-1', - 'host': '127.0.0.1', - 'port': 4050, - 'clientHost': 'zyzdev.trgame.cn', - 'clientPort': 3050, - 'frontend': true, - 'args': '--inspect=10001' - } - ], - 'chat': [ - {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050, 'args': '--inspect=10002'}, - {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051, 'args': '--inspect=10004'}, - {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052, 'args': '--inspect=10005'} - ], - 'role': [ - {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053, 'args': '--inspect=10006'} - ], - 'battle': [ - {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054, 'args': '--inspect=10007'} - ], - 'gm': [ - {'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055, 'args': '--inspect=10009'} - ], - 'gate': [ - { - 'id': 'gate-server-1', - 'host': '127.0.0.1', - 'clientHost': 'zyzdev.trgame.cn', - 'clientPort': 3014, - 'frontend': true, - 'args': '--inspect=10003' - }, - { - 'id': 'gate-server-2', - 'host': '127.0.0.1', - 'clientHost': 'zyzdev.trgame.cn', - 'clientPort': 3015, - 'frontend': true, - 'args': '--inspect=10008' - } - ] - }, - 'production': { - 'connector': [ - {'id': 'connector-server-1', 'port': 4050, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true}, - {'id': 'connector-server-2', 'port': 4051, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true}, - {'id': 'connector-server-3', 'port': 4052, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true} - ], - 'chat': [ - {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}, - {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051}, - {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052} - ], - 'role': [ - {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053} - ], - 'battle': [ - {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054} - ], - 'gate': [ - {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'zyzdev.trgame.cn', 'clientPort': 3014, 'frontend': true}, - { - 'id': 'gate-server-2', - 'host': '127.0.0.1', - 'clientHost': 'zyzdev.trgame.cn', - 'clientPort': 3015, - 'frontend': true - } - ], - 'gm': [ - {'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055} - ] - }, - 'local': { 'connector': [ { 'id': 'connector-server-1', @@ -115,5 +39,98 @@ module.exports = { 'frontend': true } ] + }, + 'production': { + 'connector': [ + {'id': 'connector-server-1', 'port': 4050, 'clientHost': 'pinus_test.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true}, + {'id': 'connector-server-2', 'port': 4051, 'clientHost': 'pinus_test.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true}, + {'id': 'connector-server-3', 'port': 4052, 'clientHost': 'pinus_test.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true} + ], + 'chat': [ + {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}, + {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051}, + {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052} + ], + 'role': [ + {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053} + ], + 'battle': [ + {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054} + ], + 'gate': [ + {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'pinus_test.trgame.cn', 'clientPort': 3014, 'frontend': true}, + { + 'id': 'gate-server-2', + 'host': '127.0.0.1', + 'clientHost': 'pinus_test.trgame.cn', + 'clientPort': 3015, + 'frontend': true + } + ], + 'gm': [ + {'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055} + ] + }, + 'alpha': { + 'connector': [ + {'id': 'connector-server-1', 'port': 4050, 'clientHost': 'zyz_web.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true}, + {'id': 'connector-server-2', 'port': 4051, 'clientHost': 'zyz_web.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true}, + {'id': 'connector-server-3', 'port': 4052, 'clientHost': 'zyz_web.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true} + ], + 'chat': [ + {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}, + {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051}, + {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052} + ], + 'role': [ + {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053} + ], + 'battle': [ + {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054} + ], + 'gate': [ + {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'zyz_web.trgame.cn', 'clientPort': 3014, 'frontend': true}, + { + 'id': 'gate-server-2', + 'host': '127.0.0.1', + 'clientHost': 'zyz_web.trgame.cn', + 'clientPort': 3015, + 'frontend': true + } + ], + 'gm': [ + {'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055} + ] + }, + 'dev': { + 'connector': [ + {'id': 'connector-server-1', 'port': 4050, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true}, + {'id': 'connector-server-2', 'port': 4051, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true}, + {'id': 'connector-server-3', 'port': 4052, 'clientHost': 'zyzdev.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true} + ], + 'chat': [ + {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}, + {'id': 'chat-server-2', 'host': '127.0.0.1', 'port': 6051}, + {'id': 'chat-server-3', 'host': '127.0.0.1', 'port': 6052} + ], + 'role': [ + {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053} + ], + 'battle': [ + {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054} + ], + 'gate': [ + {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'zyzdev.trgame.cn', 'clientPort': 3014, 'frontend': true}, + { + 'id': 'gate-server-2', + 'host': '127.0.0.1', + 'clientHost': 'zyzdev.trgame.cn', + 'clientPort': 3015, + 'frontend': true + } + ], + 'gm': [ + {'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055} + ] } }; diff --git a/game-server/generatePm2Config.js b/game-server/generatePm2Config.js index d3fa94895..77f84683c 100644 --- a/game-server/generatePm2Config.js +++ b/game-server/generatePm2Config.js @@ -8,7 +8,8 @@ var cwd='/game-server'; //项目的运行环境 -var envType= 'production'; +var config = require('./config.json'); +var envType= config.env; //配置文件的输出目录 var outputFilePath = './pomeloPm2Start.json'; diff --git a/game-server/package.json b/game-server/package.json index 5d8aa2bdf..8d8349792 100644 --- a/game-server/package.json +++ b/game-server/package.json @@ -11,7 +11,7 @@ "cov": "nyc mocha", "ci": "yarn run test", "gen-api-ref": "node ../../../node_modules/typedoc/bin/typedoc --mode file --hideGenerator --excludeExternals --ignoreCompilerErrors --out ../../../run/site/public/api-reference/pinus-loader lib/", - "local": "npm run build && cd dist && NODE_ENV=local pinus start" + "local": "npm run build && cd dist && pinus start" }, "dependencies": { "@typegoose/typegoose": "^7.3.5", diff --git a/game-server/preload.ts b/game-server/preload.ts index 325856c1c..337c86982 100644 --- a/game-server/preload.ts +++ b/game-server/preload.ts @@ -30,6 +30,7 @@ export function preload() { // 捕获普通异常 process.on('uncaughtException', function (err) { + console.log(err) console.error(pinus.app.getServerId(), 'uncaughtException Caught exception: ', err); }); diff --git a/game-server/pushdocker.sh b/game-server/pushdocker.sh index c66b2a624..79696e85f 100755 --- a/game-server/pushdocker.sh +++ b/game-server/pushdocker.sh @@ -1,2 +1,24 @@ #!/bin/sh -rsync -av --include '.babelrc' --include '.eslintrc.js' --exclude '.*' --exclude 'node_modules' --exclude 'bower_components' --exclude 'dist' --progress --inplace --no-owner --no-group --rsh='ssh -p22' . root@ltctest:/root/zyz/game-server/ +if [ $# != 1 ] ; then + echo "需要1个参数" + echo "stable: 同步代码到 stable 服务器上,作为正式服使用" + echo "alpha: 同步代码到 alpha 服务器上,作为测试服供服务开发使用" + echo "dev: 同步代码到 dev 服务器上,作为测试服供服务开发使用" + exit 1; +fi + +if [ ${1} == 'stable' ] ; then + destUrl="root@zyz:/root/zyz/game-server" +elif [ ${1} == 'alpha' ] ; then + destUrl="root@zyzalpha:/root/zyz/game-server" +elif [ ${1} == 'dev' ] ; then + destUrl="root@zyzdev:/root/zyz/game-server" +else + echo "需要一个参数指明服务器" + exit 1; +fi + +node ./config.js ${1} + +rsync -av --include '.babelrc' --include '.eslintrc.js' --exclude '.*' --exclude './game-server/node_modules' --exclude './game-server/node_modules' --exclude './game-server/dist' --exclude 'node_modules' --exclude 'bower_components' --exclude 'dist' --progress --inplace --no-owner --no-group --rsh='ssh -p22' . ${destUrl} +git checkout ./config.json \ No newline at end of file diff --git a/pushdocker.sh b/pushdocker.sh index 74e7a4960..f7bd19539 100755 --- a/pushdocker.sh +++ b/pushdocker.sh @@ -17,4 +17,8 @@ else echo "需要一个参数指明服务器" exit 1; fi -rsync -av --include '.babelrc' --include '.eslintrc.js' --exclude '.*' --exclude './game-server/node_modules' --exclude './game-server/node_modules' --exclude 'node_modules' --exclude 'bower_components' --exclude 'dist' --progress --inplace --no-owner --no-group --rsh='ssh -p22' . ${destUrl} + +node ./game-server/config.js ${1} + +rsync -av --include '.babelrc' --include '.eslintrc.js' --exclude '.*' --exclude './game-server/node_modules' --exclude './game-server/node_modules' --exclude './game-server/dist' --exclude 'node_modules' --exclude 'bower_components' --exclude 'dist' --progress --inplace --no-owner --no-group --rsh='ssh -p22' . ${destUrl} +git checkout ./game-server/config.json \ No newline at end of file