easyswoole - 基于swoole扩展实现的一款高性能php框架

AtomicLimit

EasySwoole 提供了一個基于 Atomic 計數器的限流器。

原理

通過限制某一個時間周期內的總請求數,從而實現基礎限流。舉個例子,設置5秒內,允許的最大請求量為200,那么理論平均并發為40,峰值并發為200。

組件要求

  • php: >= 7.1.0
  • easyswoole/component: ^2.0

安裝方法

composer require easyswoole/atomic-limit

倉庫地址

easy-swoole/atomic-limit

在 EasySwoole 中使用

首先在 EasySwoole 全局的 mainServerCreate 事件(即項目根目錄的 EasySwooleEvent.phpmainServerCreate 函數) 中,進行限流器注冊

<?php
/**
 * This file is part of EasySwoole.
 *
 * @link http://www.zbjtqy.com
 * @document http://www.zbjtqy.com
 * @contact http://www.zbjtqy.com/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

namespace EasySwoole\EasySwoole;

use EasySwoole\AtomicLimit\AtomicLimit;
use EasySwoole\Component\Di;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        ###### 配置限流器 ######
        $limit = new AtomicLimit();
        /** 為方便測試,(全局的)限制設置為 10 */
        $limit->setLimitQps(10);
        $limit->attachServer(ServerManager::getInstance()->getSwooleServer());
        Di::getInstance()->set('auto_limiter', $limit);
    }
}

App\HttpController\Index.php 中調用限流器:

<?php
/**
 * This file is part of EasySwoole.
 *
 * @link http://www.zbjtqy.com
 * @document http://www.zbjtqy.com
 * @contact http://www.zbjtqy.com/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

namespace App\HttpController;

use EasySwoole\AtomicLimit\AtomicLimit;
use EasySwoole\Component\Di;
use EasySwoole\Http\AbstractInterface\Controller;

class Index extends Controller
{
    /** @var AtomicLimit $autoLimiter */
    private $autoLimiter;

    protected function onRequest(?string $action): ?bool
    {
        $this->autoLimiter = Di::getInstance()->get('auto_limiter');

        if ($action == 'test1') {
            # 調用限流器對 http://127.0.0.1:9501/test1 請求限制流量
            if ($this->autoLimiter->access($action, 1)) {
                return true;
            } else {
                $this->writeJson(200, null, 'test1 refuse!');
                return false;
            }
        } else if ($action == 'test2') {
            # 調用限流器對 http://127.0.0.1:9501/test2 請求限制流量
            if ($this->autoLimiter->access($action, 2)) {
                return true;
            } else {
                $this->writeJson(200, null, 'test2 refuse!');
                return false;
            }
        }

        return parent::onRequest($action);
    }

    public function test1()
    {
        $this->writeJson(200, null, 'test1 success!');
    }

    public function test2()
    {
        $this->writeJson(200, null, 'test2 success!');
    }
}

以上代碼表示,index/test1 這個限流器在每秒內允許的最大流量為 1,而 index/test2 這個限流器的最大流量為 2

我們也可以在 EasySwooleBase 控制器的 onRequest 方法中,進行請求攔截。例如在全局 onRequest 事件中,先進行流量檢驗,如果校驗通過,則進行下一步操作。

在 Swoole 中使用

以經典的暴力 CC 攻擊防護為例子。我們可以限制一個 ip-urlqps 訪問。

<?php
/**
 * This file is part of EasySwoole.
 *
 * @link http://www.zbjtqy.com
 * @document http://www.zbjtqy.com
 * @contact http://www.zbjtqy.com/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

// example url: http://127.0.0.1:9501/index.html?api=1

require_once __DIR__ . '/vendor/autoload.php';

use EasySwoole\AtomicLimit\AtomicLimit;

$http = new swoole_http_server("127.0.0.1", 9501);

###### 配置限流器 ######
$limit = new AtomicLimit();
/** 為方便測試,(全局的)限制設置為3 */
$limit->setLimitQps(3);
$limit->attachServer($http);

$http->on("request", function ($request, $response) use ($http, $limit) {
    $ip = $http->getClientInfo($request->fd)['remote_ip'];
    $requestUri = $request->server['request_uri'];
    $token = $ip . $requestUri;
    /** access 函數允許單獨對某個 token 指定qps */
    if ($limit->access($token)) {
        $response->write('request accept');
    } else {
        $response->write('request refuse');
    }
    $response->end();
});

$http->start();

注意,本例子是用一個自定義進程內加定時器來實現計數定時重置,實際上用一個進程來做這件事情有點不值得,因此實際生產可以指定一個 worker,設置定時器來實現。

主站蜘蛛池模板: 全自动烫金机-全自动移印机-全自动丝印机-全自动平面机-东莞联昌实业供应各种丝印机和移印机 | 中华石油化工网 www.cnpec.net——歌颂石化 服务石化 奉献石化 发展石化 | 郑州网站建设_郑州网站制作_郑州网络公司-三猫网络 | 自动缠绕机_帝虎包装设备(上海)有限公司_缠绕包装机 | 智能照明模块_智能照明控制器_照明控制系统_智能调光模块_西安邦华电气工程有限公司 | 麦秸映像网络技术有限公司,河南省政府采网入驻对接,新乡网站维护建设,小程序开发,APP定制开发,钉钉开发,新乡软件开发等相关网络业务 | 消防排烟风机|防火阀|斜流风机|江苏恒恒暖通设备有限公司 | 山东万利精密机械制造有限公司-高速金属圆锯机,数控高速圆锯机,高速圆锯机生产厂家 | 深圳市泰美乐纸制品有限公司-纸杯厂,一次性纸杯,广告纸杯,奶茶纸杯,试饮纸杯定做 | 淘客联盟平台_网络电话系统-河南英邦软件科技有限公司官网 | 啤酒厂家_啤酒代工厂_原浆啤酒厂家 - 山东十谷啤酒有限公司 | 威学一百-专注国际学校择校备考-DSE-A-level-雅思-托福-OSSD-港澳台联考-AP-IGCSE-IB-AMC-多邻国-PTE-SAT-SSAT-小语种(如日语,韩语,德语,法语,西班牙语,意大利语,俄语,泰语)等考试培训,为出国留学学生提供个性化定制性学习方案,线下实体面授+线上网络课程, 提供一对一,小班课等多种班型 | 深圳U盘工厂 U盘厂家 U盘生产厂家 礼品U盘定制 深圳正益通电子公司 | 苏州涂附磨具厂家-陶瓷磨具-树脂磨具批发-苏州磨料磨具-苏州远东砂轮有限公司 | 美标球阀_美标闸阀-浙江川一阀门有限公司 | 小型生活污水处理设备_MBR膜生物反应器_口腔医院/脱脂污水处理设备_酸洗磷化/喷涂废水处理设备-上海台江环保 | 火绒杀毒软件|火绒安全企业版_西南|四川|重庆|贵州|云南|西藏|成都火绒服务中心_成都火影科技有限公司-火绒安全|成都火影科技|火绒 | 输送带_山东输送带厂家_橡胶传送带-山东中输输送机械有限公司 | 行域人才网-垂直行业领域招聘首选的专业人才网,分行业招聘就上行域人才网 | 戒网瘾学校-陕西正规戒网瘾-叛逆青少年教育学校-重生教育官网 | 塑料模具公司,塑料包装桶厂家,PET打包带厂家,缠绕膜厂家-新疆福吉亚工贸有限公司 | 上海希喆机械有限公司-Schunk雄克,雄克卡盘, 雄克机械手, B+R贝加莱, ELCIS编码器,艾西斯编码器, TWK编码器,Nexen,Joyce dayton升降机,Thomson汤姆森,TPG减速机,INA导轨。 | 上海企业团建|上海团建|上海团建活动|上海拓展培训|上海拓展训练|傲朗企业管理顾问(上海)有限公司 | 陕西散花照明-西安太阳能路灯,陕西太阳能路灯,西安太阳能路灯厂家,陕西太阳能路灯厂家 | 长春互联网运营值选星广传媒,长春短视频运营,长春新媒体运营,长春互联网运营,长春抖音运营,吉林视频号代运营,吉林快手代运营,短视频推广公司,公众号运营,微博运营,新媒体运营 | 深圳万和制药有限公司_消化领域专业公司 万和香港(集团)成员 深圳同步带轮_东莞齿轮加工_东莞同步轮厂家-东莞东城精胜机械配件厂 | 起点养生网-分享科学养生保健知识,中医健康养生之道-无锡据风网络科技有限公司 | 搅拌器「厂家直销」-淄博亿贝化工设备有限公司 | 销售系统_营销系统_自动营销软件_b2b营销系统_数字营销平台_AI销售 | 装盒机_全自动装盒机-温州凯祥包装机械有限公司 | 塑木地板,塑木栏杆,塑木地板价格,塑木地板厂家—浙江尚元塑木制品有限公司 | 上饶建盛建设,建盛建设,上饶市建盛建设工程质量检测有限公司-房屋鉴定 | 石材雕刻机_墓碑雕刻机_木工雕刻机_雕刻机厂家-合肥沃力数控设备有限责任公司 | 深圳市金正电器有限公司 | 铁谷网-垂直于铸造产业链服务平台、原材料采购网、行业资讯网 | 球磨机配件_烘干机配件_回转窑配件_球磨机小齿轮_球磨机大齿轮-巩义市兴农机械制造公司 | 压力容器锻件_升高法兰_管板_阀体_接管锻件 - 山西中重重工集团 压力机-压装机-黄油机-黄油泵-[广东品嘉灵]专业定制各种精密压装设备 | 长型材数控钻孔攻牙机-自动数控热熔钻孔机-东莞市利速数控机械有限公司 | 中科联航(江苏)-信息化监理|信息化咨询|信息系统项目管理|信息系统工程监理公司 | 新东方大学考试官网_考研/英语/雅思/托福/四六级/日语/韩语/教资在线网课官网 | 河北博隆环保科技有限公司-甲醛检测_甲醛治理_光触媒 |