# strategy_framework **Repository Path**: nero5201/strategy_framework ## Basic Information - **Project Name**: strategy_framework - **Description**: 基于配置的策略引擎,不同于市面上的开源引擎,此引擎是基于配置走if-else逻辑,实现业务策略,进行分支流转。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-10-16 - **Last Updated**: 2023-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 策略框架 #### 背景 - 因为引导策略较复杂、分支过多,硬编码的方式代码冗长、改动难度大,且引导策略修改较频繁,于是编写了StrategyEngine框架 #### 目的 - 灵活的设计、修改策略,以较小甚至无需编码来构建、修改策略;对于分支较多的服务、功能可插拔的方式使用此框架 #### 使用方式 - 实现策略,通过继承 **BaseStrategy**,overwrite对应的方法来实现功能 - 在初始化时需把实现的策略加载 ``` strategyEngine.loadStrategyComponent("com.xxx.xxx.xxx.com.xx.test.strategy","com.xx.xxxx.xxxxx.core.result"); ``` #### 概念 - 策略以**strategyKey**为唯一标识,即不同的**strategyKey**会命中不同的策略 - 策略里的上下文存储于**ThreadLocal**,以**Map**的形式存储,实现的handler可进行存取。外部可通过**StrategyEngine.getInstance()** 来进行上下文的存取。 - [注意] 由于上下文存储于**ThreadLocal**,所以策略执行完毕一定要进行 **remove** - [注意] 暂未支持子线程对上下文的存取 - 策略配置 - 每个策略都会有**desc**字段用于识别改策略的用处,且该字段还会用于引擎执行日志**strategyEngineLog**的记录,所以一定要写清楚,便于排查问题 - 策略配置类为**StrategyConfig**入口,wconfig配置成的jsonarray的形式,这样个可以一个配置文件配多个策略,甚至可以把strategyKey当做策略中的方法。 - 具体执行里定义了三个处理策略,分别为**beforeStrategy**、**bizStrategy**、**afterStrategy**,三者目前并没有不同,更多的是一个框架结构上的划分,后期可进行扩展 - [约定] **StrategyConfig**中的**List or** 数组类型之间为或的关系,或者 if-else的关系 - [约定] **CompareEntity** 中的 **and** 就是 and的逻辑,即 满足当前compareEntity,如果**and** 不为空,继续向下执行 - [约定] **strategyRespCode** 为策略的出口,通过返回码来判断逻辑 - 具体的逻辑判断配置写在了**CompareEntity**中,每个字段的具体可查看代码注释,示例如下 ``` { "beforeStrategy": { "desc": "前置过滤", "or": [ { "comparedParam": "true", "comparer": "UserVipHandler", "desc": "判断是否vip,是则退出此策略", "operation": "==", "paramType": "bool", "strategyRespCode": 100401 }, { "comparedParam": "xxx", "compareParam": "productType", "comparer": "ClientInfoHandler", "desc": "产品类型是否xxx?", "and":[ { "comparedParam": "postSuccess,postFailed", "comparer": "PageTypeHandler", "desc": "xx的请求pageType是否为xxx?", "strategyRespCode": 100401 } ] } ] }, "bizStrategy": { "desc": "推荐策略1.0", "or": [ { "beforeFiller": "UserTagHandler", "comparedParam": "0", "compareParam": "xxxx", "comparer": "UserTagHandler", "contextKey": "userTagRet", "desc": "未付费用户?", "operation": "<=", "paramType": "double", "and": [ { "comparedParam": "1,2", "comparer": "UidGrayHandler", "desc": "尾号1-2?走线上逻辑", "operation": "contains", "paramType": "int", "strategyRespCode": 100401, "logEntities": [ { "key": "log:abtest", "value": 1 } ] } ] } ] }, "desc": "推荐1.0", "strategyKey": "guideStrategy20211209" } ``` #### 日志 - **/log/strategy/strategyenginelog.log** 策略逻辑执行日志**