mingyuanyun/yii2-iaop

iAop组件

v1.1.7 2021-07-21 09:56 UTC

README

iAop 针对多租户个性化场景,提供智能加载、智能路由、智能AOP等整套产品个性化定制解决方案,实现了产品代码与租户个性化定制代码分仓库管理、互不影响、并行开发的良好开发模式(防止租户个性化代码污染主产品代码)。

一、安装

标准框架默认内置了 iAop 组件。

如果是其他项目要安装,执行以下命令即可安装最新发布版本:

composer require mingyuanyun/yii2-iaop

安装指定发布版本:

composer require mingyuanyun/yii2-iaop:版本号

更新版本 修改composer.json文件,调整版本号,再执行:

composer update mingyuanyun/yii2-iaop

注意:每次执行完 comopser 命令后需要把此组件包下的 .git 文件夹删除再进行代码提交,否则会提交不成功,可以加这段脚本

二、配置

在配置文件bootstrap中添加iAop组件 (注意大小写):

'bootstrap' => ['iAop']

在配置文件components中添加iAop组件:

'components' => [
    'iAop' => [
        'class' => 'iAop\Component',
        'tenantIdentifierReaderConfig' => ['query' => 'o,tenant_code', 'header' => 'tenant-code', 'cookie' => 'o'],
        // 'tenantIdentifierReaderClass' => '\services\aop\TenantIdentifierReader', //与 tenantIdentifierReaderConfig 配置二选一
        'aopHeaderFlag' => 'X-Aop',
        'autoloadTenantCode' => false,
        'aopDebug' => false,
        'isAopEnabled' => false,
        'greyTenantConfig' => [
            // 'configProviderClass' => '\services\aop\GreyTenantConfigProvider',
            'methodConfigKey' => 'grey_tenant_method_config',
            'paramConfigKey' => 'grey_tenant_param_config'
        ],
        'aspectConfig' => [
            'appDir' => dirname(dirname(__DIR__)),
            'cacheDir' => dirname(dirname(__DIR__)) . '/runtime/aspect',
            'includePaths' => [
                dirname(dirname(__DIR__)) . '/backend/controllers',
                dirname(dirname(__DIR__)) . '/backend/services',
            ],
            'excludePaths' => [
                dirname(dirname(__DIR__)) . '/runtime/aspect',
                dirname(dirname(__DIR__)) . '/vendor',
            ],
            'aspectDir' => dirname(dirname(__DIR__)) . '/aspect',
            'ignoreAnnotations' => ['specialAnnotation1', 'specialAnnotation2'],
            // 'pointcutConfig'=>'\services\aop\PointcutConfigProvider',
            'pointcutConfig'=>[
                'modules\test\controllers\TestController' => [
                    'actionTest'
                ],
            ]
        ]
    ],
]
  • 通用配置说明
属性含义说明
tenantIdentifierReaderConfig租户标识读取配置与 tenantIdentifierReaderClass 二选一,支持多个参数来源,同一来源的多个参数以','分隔
tenantIdentifierReaderClass租户标识读取类与 tenantIdentifierReaderConfig 二选一,自定义租户标识读取类,继承基类 \iAop\base\AbstractTenantIdentifierReader
aopHeaderFlag请求返回头部中的aop标识请求返回头部中携带的租户标识,选填,默认为X-Aop
autoloadTenantCode是否自动加载租户代码(性能优化)默认为false,iAop每次都会使用内部的租户代码加载器加载租户代码,在压测时对性能有一定的影响(一般场景下大约20%的性能损耗)。配置为true时,不会使用内部的租户代码加载器,而是依赖composer的自动加载机制加载代码, 需要在项目composer.json文件中配置 "autoload": {"classmap": ["customization/"]}, 然后执行 `composer dumpautoload`,否则可能会报找不到类文件。生产环境建议配置为true以提升性能
isAopEnabled是否开启aop功能,bool类型,默认为false(关闭)部分用户只使用原生AOP功能,此开关适用于原生aop场景;对于智能aop场景,此开关会自动开启,不用设置
aopDebug是否开启aop调试模式, bool类型,默认为false(关闭)开启调试功能后每次会检测文件更改,生成缓存文件,有一定性能损耗,生产环境建议关闭调试模式
  • greyTenantConfig配置说明
属性含义说明
configProviderClass灰度租户配置提供类选填,继承基类iAop\base\GreyTenantConfigProviderBase,返回数据格式可参考 ./demo/greytenant 文件夹下DemoGreyTenantConfigProvider文件
methodConfigKey灰度租户可用方法配置key的值通过该key的值从参数中读取灰度租户可用方法的配置,格式参照如下示例
paramConfigKey灰度租户可用参数配置key的值通过该key值从参数重读取灰度租户可用参数的配置,格式参照如下示例
methodConfigKey对应配置的数据格式为
[
    'poly' => [
        'grey\modules\api\controllers\ApiController' => [
            'actionList'
        ],
        'grey\backend\controllers\MsgController' => [
            'actionSend'
        ]
    ],
    'bgy' => [
        'grey\modules\api\controllers\ApiController' => [
            'actionList'
        ],
    ]
]

paramConfigKey对应配置的数据格式为
[
    'poly' => [
        'email_config'
    ]
]
  • aspectConfig配置说明(AOP配置)
属性含义说明
appDir应用目录,用于读取 aop 注解选填,默认为项目vendor上一层目录
cacheDiraop 缓存目录,需要读写权限选填,默认为 runtimePath
includePathsaop 检索目录选填,数组格式,默认为项目目录
excludePathsaop 检索排除目录选填,数组格式,一般情况下排查 vendor 目录或缓存目录即可
aspectDir自定义切面目录选填,切面编写语法可参考 ./demo/aspect 文件夹下实例代码
ignoreAnnotations忽略注解中@开头的关键字选填,数组格式,默认已录入 showdoc 的关键字,可累加
pointcutConfig切点配置选填,数组格式,也可以实现 \iAop\interfaces\PointcutConfigProviderInterface 接口,以类的方式提供,推荐后种方式

pointcutConfig切点配置说明

切点配置定义用于替换原来在标准产品代码注释加切点的方式,通过这种方式,可以实现不改动标准产品代码(不需要发版)增加切点。 数据格式举例:

[
    'modules\test\controllers\TestController' => [
        'actionTest'
    ],
    'backend\controllers\HelpController' => [
        'actionTest'
    ],
    'services\TestService' => [
        'base','one','two'
    ],
    'services\OrderService' => [
        'order'
    ]
]

注意: 改完配置需要清理一次aop缓存目录,新切点才能生效。

三、命令行使用

若要在命令行中使用,需要修改你的命令行程序,其controller基类需要增加如下代码:

    public $XAopTenant;
    
    public function options($actionID)
    {
        return array_merge(parent::options($actionID), ['XAopTenant']);
    }

命令行执行的时候传递该参数标识租户,例如:php yii sync-handle/index --XAopTenant=rongxin

租户个性化参数

  • 获取租户个性化参数配置
    \Yii::$app->iAop->getParamValue('demo_key');
    

详细文档请查看这个链接