Bootstrap

扩展点设计

目录

前言

一、扩展点设计

二、抽象业务扩展点实现方式

 领域及领域服务定义

定义域能力 

定义扩展点 

参考


前言

在平时业务开中经常会遇到不同业务走不同的业务逻辑,为了代码的扩展性,不得不采取一些手段来对其进行解耦,代码扩展点实现方式主要包括 Java SPI、dubbo SPI、策略模式及改进扩展点实现、Cola扩展点和抽象业务扩展点实现方式,这里我们介绍下Cola的实现方式。


一、扩展点设计

在讨论之前,我们先来明确一下在COLA2.0扩展设计中引入的新概念:业务、用例、场景。

  • 业务(Business):就是一个自负盈亏的财务主体,比如tmall、淘宝和零售通就是三个不同的业务。
  • 用例(Use Case):描述了用户和系统之间的互动,每个用例提供了一个或多个场景。比如,支付订单就是一个典型的用例。
  • 场景(Scenario):场景也被称为用例的实例(Instance),包括用例所有的可能情况(正常的和异常的)。比如对于“订单支付”这个用例,就有“可以使用花呗”,“支付宝余额不足”,“银行账户余额不足”等多个场景。

简单来说,就是一个业务是有多个用例组成的,一个用例是有多个场景组成的。用广告投放业务转化做一个简单示例,业务、用例和场景的关系如下: 

支持这种更细粒度的扩展支持,COLA2.0引入了Business,Use Case和Scenario这三个概念。如下是 投放业务的广点通APP场景,扩展定位如下图所示:

在COLA2.0下,例如我们实现上图中所展示的扩展:在投放launch这个业务下——的广点通转化用例——的APP应用场景——的用户身份校验进行扩展,我们只需要声明一个如下的扩展实现(Extension)就可以了。 

/**
 /**
 * 广点通-APP 转化
 *
 * @author yangyanping
 * @date 2023-12-11
 */
@Slf4j
@Extension(bizId = "launch", useCase = "gdt", scenario = "APP")
public class GdtConversionExt implements ConversionExtPt {
    
}

以下是完整代码 

定义广告转化扩展点 

/**
 * 广告转化接口
 *
 * @author yangyanping
 * @date 2023-12-11
 */
public interface ConversionExtPt extends ExtensionPointI {
    /**
     * 转化
     */
    PostBackResponse conversion(PostBackRequest request);
}

广点通转化回传扩展点实现类

/**
 /**
 * 广点通-APP 转化
 *
 * @author yangyanping
 * @date 2023-12-11
 */
@Slf4j
@Extension(bizId = "launch", useCase = "gdt", scenario = "APP")
public class GdtConversionExt implements ConversionExtPt {
    
    public PostBackResponse conversion(PostBackRequest postBackRequest) {
        log.info("gdt");
    }
}

巨量转化扩展点实现类 

/**
 * 巨量 转化
 *
 * @author yangyanping
 * @date 2023-12-11
 *
 */
@Slf4j
@Extension(bizId = "launch", useCase = "tt", scenario="APP")
public class OceanengineConversionExt implements ConversionExtPt {

    public PostBackResponse conversion(PostBackRequest postBackRequest) {
        log.info("tt");
    }
}

测试扩展点:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = WebApplication.class)
public class ExtensionTest {
    @Resource
    private ExtensionExecutor executor;

    @Test
    public void test() {
        PostBackRequest request = new PostBackRequest();
        BizScenario bizScenario = BizScenario.valueOf("launch", "gdt", "App");
        executor.execute(ConversionExtPt.class, bizScenario, exe ->
                exe.conversion(request)
        );
    }
}

二、抽象业务扩展点实现方式

基础概念理解
扩展点的实现离不开业务,业务的扩展点需要更高的抽象才能支持得更灵活,先明确几个关键词:

业务流程与业务活动: 用户完成某次业务操作的全过程,视为业务活动的编排。如用户执行一次下单操作包括:生成订单、营销优惠计算和库存扣减三个业务活动,业务活动即业务流程编排的基础单元。

  • 领域(@Domain): 一个完整上下文的抽象,可大可小,视具体业务而定。常见的大的电商领域有订单域、支付域、库存域等,小的如营销域中的活动域、价格域等。
  • 领域服务(@DomainService): 各个领域能对外提供的服务,比如活动域可以提供查询优惠领域服务等
  • 域能力(@Ability): 领域具备的可扩展的能力,比如活动域的活动添加、删除能力等
  • 域能力扩展点(@AbilityExtension): 域能力的可扩展点,通常是方法级的扩展,如针对于不同场景减库存的逻辑是不一样的,这个不同的逻辑处理就放到域能力扩展点上来实现。
  • 域能力实例(@AbilityInstance): 域能力的子类实现,理解为具象的域能力。

 领域及领域服务定义

public interface DomainService {
}
public class HumanCarryDomainService implements CarryDomainService {
    @Override
    public void carry() {
        // 1. 获取搬运货物的能力
        ICarryAbility carryAbility = getCarryAbility();

        // 2. 搬运货物
        carryAbility.carry();
    }
}

定义域能力 

public interface IAbility {
}
public interface ICarryAbility extends IAbility {
    void carry();
}
public class DefaultCarryAbility implements ICarryAbility {
    @Override
    public void carry() {
        // Step 1:找到货物
        //......

        // Step 2:搬运货物(可根据不同业务场景bizCode获取不的扩展点)
        ICarryBusinessExt iCarryBusinessExt = getICarryBusinessExt(bizCode);
        iCarryBusinessExt.carry();

        // Step 3:放置货物
        //......
    }
}

定义扩展点 

public interface IExtensionPoints {
}
public interface ICarryBusinessExt {
    /**
     * 扩展点实现类
     */
    @AbilityExtension
    void carry();
}
public class DefaultCarryBusinessExt implements ICarryBusinessExt {
    @Override
    public void carry() {
        
    }
}
public class XyyCarryBusinessExt implements ICarryBusinessExt {
    @Override
    public void carry() {

    }
}


参考

常用代码扩展点设计方式_java扩展点设计-CSDN博客

JD-Matrix - 简书

http://www.guanshanw.com/post/18811.html

https://blog.csdn.net/significantfrank/article/details/100074716

https://github.com/alibaba/COLA

张建飞(Frank)-CSDN博客

一文教会你如何写复杂业务的代码_支付和贷款代码哪个复杂-CSDN博客 

;