基于面向对象编程思想开发的一个功能

基于Laravel框架的 Middleware 中间件开发的一个小流量功能今天上线了。这个功能的核心逻辑是基于请求参数中的user_id和小流量配置参数控制将部分流量引到灰度环境。

首先有个基类 Smallflow,负责根据传入的user_id和当前环境告诉我们是否需要引流:

<?php
class Smallflow
{
    private $user_id;

    public function __construct($user_id)
    {
        $this->user_id = $user_id;
    }

    public function isDataSmallflow()
    {
        // 根据小流量配置和user_id计算出当前 user_id 是否需要走灰度
    }

    public function isEnvSmallflow()
    {
        // 根据网站的配置文件返回当前环境是线上环境还是灰度环境
    }
}

?>

然后,有一个具体的 SmallflowApi 类,负责告诉我们是否需要引流:

<?php
class SmallflowApi extends Smallflow
{
    public function isRedirect()
    {
        $redirect = true;

        if ($this->getEnvSmallflow == $this->getDataSmallflow()) {
            $redirect = false;
        }

        return $redirect;
    }
}
?>

最后,小流量中间件 SmallflowMiddleware 只要去问一下 SmallflowApi 类是否要跳转就可以实现该功能了:

<?php
class SmallflowMiddleware extends Middleware
{
    public function handle()
    {
        $smallflow = new SmallflowApi($user_id);
        if ($smallflow->isRedirect()) {
            // 重定向
        } else {
            // 继续在当前环境处理请求
        }
    }
}
?>

除了在入口实现小流量之外,队列也需要判断一下小流量,这个时候,只需要基于 Smallflow 再创建一个类来回答队列是否需要小流量的问题就可以了:

<?php
class SmallflowJob extends Smallflow
{
    public function getJobName($job_name)
    {
        if ($this->getEnvSmallflow != $this->getDataSmallflow()) {
            $job_name .= '-smallflow';
        }

        return $job_name;
    }
}
?>

 

发表评论