目录
前言
在平时业务开中经常会遇到不同业务走不同的业务逻辑,为了代码的扩展性,不得不采取一些手段来对其进行解耦,代码扩展点实现方式主要包括 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() {
}
}
参考
http://www.guanshanw.com/post/18811.html
https://blog.csdn.net/significantfrank/article/details/100074716