Pomelo-完全なチャットサービスの構築と出会う穴

5842 ワード

前に書いてください.チャットサービスの開発に関する問題について、皆さんと交流して討論してください.
本文を読む前に、pomeloの基本知識を知る必要があります.参考できます.
  • Pomelo構築(一)
  • Pomelo構築(二) : Web ,
  • 一.身分証明書の追加(JWT Token)
    ここでは、JWTTokenを用いて簡単に説明する.ユーザはログイン後にサーバから返されたtokenを取得し( と理解できる)、次の要求時にこのトークンを持参してアイデンティティ検証を行い、検証に成功して初めてアクセスできる.また、tokenには期限が切れています.一定時間以内で有効です.期限を過ぎたら、再度ログインしてください.JWTTokenを知らない人はここに来てみてもいいです.JWT Token概要. : pomelo websocket , http ( ), route , token , , 。
  • JWTTokenは、頭部(header)、負荷(payload)、ビザ(signature)の3つの部分に分けられている.(1)ヘッダ(header):2つの部分の情報を含み、a. (jwt) b. (通常は直接にHmacSHA 256を使用する).例えば:{‘type’:‘JWT’,‘alg’:‘HS 256’(2)負荷:有効な情報を保存するところ、ユーザー名など(3)ビザ(signature):3つの部分から構成され、各部分の間に" . "
  • が接続されています.
  • headerがbase 64を経て生成された文字列は、headerStr
  • と記載されている.
  • payloadがbase 64を経て生成された文字列は、payloadStr
  • と記載されています.
  • signatureは、headerStr + '.' + payloadStrがheaderによって宣言した暗号化方式でsecretを組み合わせて暗号化した文字列で、sigStr
  • と記載されている.
    JWT Token=header Str+'''+payloadStr+''+sigStr :JWTtoken JSON
  • Filterの追加は、各要求に対するアイデンティティ検証を可能にするために、各要求におけるFilterのtokenを追加して検証する.pomeloではどのようにfilterを追加するかを説明します.pomeloの開発文書では、汚い言葉に置き換えられたfilterの小さい例を紹介しています.ここではこの小さい例を簡単に紹介し、分析します.まずfilterを作成します.Filter.js(game-server/app/servers/chat/filter/)
  • module.exports = function(){
        return new Filter();
    }
    
    var Filter = function(){};
    //   filter,         
    Filter.prototype.before = function(msg, session, next){
    	//        :content       ,token     token
    	var content = msg.content;
    	var token = msg.token;
    	//   token  ,  token          
    	if(validate(token)){
    	    //     , content    ,            
    	    msg.content = content.replace('fuck', '****');
    	    // next()   filter    ,           handler 
    	    next();
    	}
    	// token    , msg       , :
    	msg.code = 500;
    	msg.errorMsg = 'token   token  ';
    	next();
    }
    //   filter,          
    Filter.prototype.before = function(msg, session, next){
    	//             , ...
    }
    
    filterを作成したら、ap.jsにFilter.jsを導入し、以下のように構成します.
    var pomelo = require('pomelo');
    var routeUtil = require('./app/util/routeUtil');
    /**
     * Init app for client.
     */
    var app = pomelo.createApp();
    app.set('name', 'chatofpomelo');
    //     connector       
    app.configure('production|development', 'connector', function(){
    	app.set('connectorConfig',
    		{
    			connector : pomelo.connectors.hybridconnector,
    			heartbeat : 3,
    			useDict : true,
    			useProtobuf : true,
    			closeTimeout : 60 * 1000,
    		});
    });
    //     gate       
    app.configure('production|development', 'gate', function(){
    	app.set('connectorConfig',
    		{
    			connector : pomelo.connectors.hybridconnector,
    			useProtobuf : true,
    			closeTimeout : 60 * 1000,
    		});
    });
    
    //      Filter.js
    var Filter = require('./app/servers/chat/filter/Filter');
    
    // app configure,                
    app.configure('production|development', function() {
    	// route configures
    	app.route('chat', routeUtil.chat);
    	//   Filter,before    ,after    
    	app.before(Filter);
    });
    
    // start app
    app.start();
    
    process.on('uncaughtException', function(err) {
    	console.error(' Caught exception: ' + err.stack);
    });
    
    : filter , , chat/handler , 。( filter , , )二.ログ記録
    pomeloは、log4jsをカプセル化することにより、pomelo-loggerというコンポーネントを形成しているので、ログ記録を使用する際には、このコンポーネントを導入する必要がある.ロゴ4 jsの処理をよりよく理解するために、ここで直接的にロゴ4 jsを使用して紹介します.
  • インストールlogs 4 js-----npm install logs 4 js
  • log 4 jsを構成し、log 4 js.jsファイルを新規作成する
  • .
    //   log4js  
    var log4js = require('log4js');
    //       
    log4js.configure({
    	appenders: {
            console: {
                type: "console"
            },
            dateFile: {
                type: "dateFile",
                //          ,                logs   
                filename: "logs/LogFile",
                pattern: "-yyyy-MM-dd.log",
                category: "log_date",
                encoding: 'utf-8',
                alwaysIncludePattern: true
            }
        },
        categories: {
            dateFile: {
                appenders: ['dateFile'], level: 'error'
            },
            default: {
                appenders: ['console', 'dateFile'], level: 'all'
            }
        }
    });
    var dateFile = log4js.getLogger('log_date')
    
    module.exports = dateFile
    
    使用時には、var log = require(‘ log4js.js ’);などを通じて、異なるレベルのログ情報を入力することができます.ロゴ4 jsの詳細については、ロゴ4 jsとAPIを参照してください.
    三.関連部署と発生した問題
    運転環境:AWSクラウドサーバ(EC 2)
    ステップ:1.構築環境:node(nvmを使用してインストールすることを推奨する)のインストール、pythonのインストール、pomeloのインストール(npm install pomelo-g)2.コードの引き出し:git clonehttps://github.com/NetEase/chatofpomelo.git (chatofpomeloを例にして)3.プロジェクトディレクトリのnpm-innstall.shスクリプトのインストールに関する依存性log.error();log.info();log.warn().pomelo start-e production-D実行サービス(-eは選択環境、-Dはバックグラウンド動作を表します.)
    問題:1.起動後のアクセスエラー : , (sudo chown -R filePath) 解決:nodeバージョンが高すぎて、低いバージョンを選択して再インストールしてから、ステップ3から開始します.
    2.Hostアドレスの設定(pomeloのクラスタ構成はまだ使用されていないので、hostは同じIP)はParserIncomingMessage is not a constructor.の下の : node v6.11.2, node v10.x.xおよびgame-server/configの中で、master.jsonを対応サーバのservers.jsonに変更する.
    以上はpomeloに対して使ういくつか記録で、もし何か間違ったところがあれば、ご指摘を歓迎します.皆さんと一緒に学習を交流し、共に進歩したいです.