easyswoole 搭建訊息佇列服務03 - 基礎插件配置
在搞定環境以后,開始了撰寫代碼的程序,我使用的環境是 easyswoole 3.x,官方大佬給我的聊天室Demo,這就開始了架構撰寫之旅,兵馬未動糧草先行,編碼為寫,架構先行,下圖是我設計的架構草圖,僅供參考:
遇到的第一個問題是端與端的加密問題,讓我想到了一個叫Jwt的插件,解決Api、端的互動(Pc/Android/Ios),是一種非常好的加密方式,它使用也非常簡單,
傳統的做法是將已經認證過的用戶資訊存盤在服務器上,比如Session,用戶下次請求的時候帶著Session ID,然后服務器以此檢查用戶是否認證過而Jwt的好處在于把加密留在客戶端以減少服務端的壓力,
安裝jwt (JSON Web Token)
安裝jwt
可以安裝官方版
composer require lcobucci/jwt
也可以安裝easyswoole版
composer require easyswoole/jwt
使用上沒有什么不同,GitHub官方檔案: https://github.com/huizhang-Easyswoole/jwt,在類使用前引入use EasySwoole\Jwt\Jwt;
加密
/**
* 為用戶設定 token Jwt
* https://github.com/lcobucci/jwt/blob/3.3/README.md
*/
protected function setToken(){
$jwtObject = Jwt::getInstance()
->setSecretKey('easyswoole') // 秘鑰
->publish();
$jwtObject->setAlg('HMACSHA256'); // 加密方式
$jwtObject->setAud('user'); // 用戶
$jwtObject->setExp(time()+3600); // 過期時間
$jwtObject->setIat(time()); // 發布時間
$jwtObject->setIss('easyswoole'); // 發行人
$jwtObject->setJti(md5(time())); // jwt id 用于標識該jwt
$jwtObject->setNbf(time()+60*5); // 在此之前不可用
$jwtObject->setSub('主題'); // 主題
// 自定義資料
$jwtObject->setData([
'other_info'
]);
// 最終生成的token
$token = $jwtObject->__toString();
return $token;
}
解密 token
/**
* 獲取token的公共介面 Jwt
*/
protected function getToken(){
$auth_token = $this->request()->getHeader('auth_token');
if( empty($auth_token) ){
//密碼不正確
}
$jwtObject = Jwt::getInstance()->setSecretKey('easyswoole')->decode($auth_token);
$status = $jwtObject->getStatus();
switch ($status)
{
case -1:
echo 'token無效';
break;
case 1:
echo '驗證通過';
....
break;
case 2:
echo '驗證失敗';
break;
case 3:
echo 'token過期';
break;
}
}

DB與連接池
第二個問題是連接資料的方式,官方支持Mysqli、Orm、和Elasticsearch,出于性能和功能我選擇Orm,使用連接池的連接方式,
這里簡單的說說連接池的知識點,顧名思義,連接池是提高性能,減小服務器記憶體的常規手段,規定最大連接數和最小連接數,達到資源重用、更快的系統回應速度、統一的連接管理,避免資料庫連接泄露的作用,
Mysql-Orm 安裝
composer require easyswoole/orm
初始化加載配置,加載Orm,這里說一下,加載組態檔也需要在初始化的initialize,方法里加載,不要使用PHP的建構式,有可能會造成Bug,
根目錄EasySwooleEvent.php的initialize方法,首先加載自定義組態檔:
/**
* 加載自定義組態檔
*/
public static function loadConf()
{
$ConfPath = EASYSWOOLE_ROOT . '/App/Conf';
$Conf = Config::getInstance();
$files = File::scanDirectory($ConfPath);
if (!is_array($files['files'])) {
return;
}
foreach ($files['files'] as $file) {
echo $file.PHP_EOL;
$data = require_once $file;
$Conf->setConf(strtolower(basename($file, '.php')), (array)$data);
}
}
如果沒有找到File類,開頭引入 use EasySwoole\Utility\File;,需要自己注意一下,因為版本的不同會有所差異,需要同學們自己進行除錯,
初始化加載Orm組件,GlobalConfig就是use EasySwoole\EasySwoole\Config
$dbConf = GlobalConfig::getInstance()->getConf('db');
$config = new DBConfig();
$config->setDatabase($dbConf['mysql-master']['database']);
$config->setUser($dbConf['mysql-master']['username']);
$config->setPassword($dbConf['mysql-master']['password']);
$config->setHost($dbConf['mysql-master']['host']);
$config->setPort($dbConf['mysql-master']['port']);
$config->getCharset($dbConf['mysql-master']['charset']);
//Mysql連接池配置
$config->setGetObjectTimeout(3.0); //設定獲取連接池物件超時時間
$config->setIntervalCheckTime(30*1000); //設定檢測連接存活執行回收和創建的周期
$config->setMaxIdleTime(15); //連接池物件最大閑置時間(秒)
$config->setMaxObjectNum(20); //設定最大連接池存在連接物件數量
$config->setMinObjectNum(5); //設定最小連接池存在連接物件數量
$config->setAutoPing(5); //設定自動ping客戶端鏈接的間隔
DbManager::getInstance()->addConnection(new Connection($config));
Model層的檔案擴展
namespace App\Models;
use EasySwoole\ORM\AbstractModel;
/**
* 用戶Model模型
* Class UserShop
*/
class UserModel extends AbstractModel
{
protected $tableName = 'wm_user_user';
}
Controller的呼叫
$userModel = UserModel::create()->field(['user_id'])->get($user_id);
$userData = $userModel->getOriginData();
Redis插件安裝
以連接池連接方式安裝下載對應的依賴
composer require easyswoole/redis-pool
composer require easyswoole/pool
mainServerCreate 方法中注冊Redis服務(在服務啟動前被調起)
//注冊 redis連接池
$RedisConfig = new RedisConfig();
$masterRedisConfig = new \EasySwoole\Redis\Config\RedisConfig(GlobalConfig::getInstance()->getConf('redis'));
//注冊連接池管理物件
\EasySwoole\Pool\Manager::getInstance()->register(new \App\Pool\RedisPool($RedisConfig,$masterRedisConfig),'redis');
新增redisPool管理器,新增檔案/App/Pool/RedisPool.php
namespace App\Pool;
use EasySwoole\Pool\Config;
use EasySwoole\Pool\AbstractPool;
use EasySwoole\Redis\Config\RedisConfig;
use EasySwoole\Redis\Redis;
class RedisPool extends AbstractPool
{
protected $redisConfig;
/**
* 重寫建構式,為了傳入redis配置
* RedisPool constructor.
* @param Config $conf
* @param RedisConfig $redisConfig
* @throws \EasySwoole\Pool\Exception\Exception
*/
public function __construct(Config $conf,RedisConfig $redisConfig)
{
parent::__construct($conf);
$this->redisConfig = $redisConfig;
}
protected function createObject()
{
//根據傳入的redis配置進行new 一個redis
$redis = new Redis($this->redisConfig);
return $redis;
}
}
Contrllor 呼叫
/**
* @throws 快取token
*/
protected function cacheToken($token){
$redis=\EasySwoole\Pool\Manager::getInstance()->get('redis')->getObj();
$redis->select(1);
$result = $redis->set('auth_token:100', $token,['NX','PX'=>20000]);
echo $redis->get('auth_token:100');
}

啟動 easyswoole
php easyswoole server start -mode=websocket


碼文不易,多多鼓勵
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/197791.html
標籤:其他
