背景介绍
在《平台对业务敏捷支撑的挑战》中,我们可以看到平台在对业务敏捷支撑的关键点:
- 平台的能力是否可以外化并暴露出去,各行业的业务团队能清楚的知道平台具备什么样的能力;
- 平台对外提供的可扩展性是否足够,业务团队能自助式无侵入式的进行业务逻辑定制
大部分平台具备什么样的能力,有什么开放的扩展点,以及相互之间有啥组件依赖要求。都是通过一些软件、文档来进行人肉维护。随着时间的推移,这些文档很快就过时,也不够准确。这些花了大量精力维护的文档逐渐就成了摆设。
在《Lattice – 场景级SDK开放》一文中,我介绍了如何基于Lattice进行场景级SDK的定义,以及场景级业务资产沉淀的必要性。本文,我将介绍,如何基于Lattice编译增强插件,将基于Lattice构建的业务、产品、场景、能力以及扩展点,在编译器生成一份准确的元数据。 这份元数据,未来可以被可视化的Web管理控制台去采集。采集后,只要经过简单加工,就可以让公司所有相关产品、技术,都能可视化的知道平台具备了哪些能力,有什么样的扩展机制来做业务定制插件包。
版本依赖
在项目的pom.xml 中,添加以下信息:
<build>
<plugins>
<plugin>
<groupId>org.hiforce.lattice</groupId>
<artifactId>lattice-maven-build-plugin</artifactId>
<version>1.0.13</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>lattice</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
模型介绍
在pom.xml中添加上述配置后,在打包时,会在jar包中的 META-INF/lattice 目录下,生成 lattice.json 文件。这个json文件的模型总览如下:
大家可以把lattice-sample编译后,查看 lattice-quick-start-1.0.0-SNAPSHOT.jar 中 META-INF/lattice/lattice.json 文件内容,生成的json格式的lattice元信息如下:
下面,我就结合上面的模型图,分别介绍一下几个关键的模型。
LatticeInfo
这个模型记录了本jar包的 GAV 信息,以及聚合了本jar包所定义或者用到的Ability、Busienss、Product以及UseCase信息。
AbilitySet/ProductSet/UseCaseSet/BusinessSet
这些Set对象里,基本有两个属性: providing 和 using。我们以AbilitySet为例子,这两个属性分别代表本jar包中定义并提供的能力清单和通过依赖间接使用到的能力清单。
对于间接依赖到的,我们还会生成Dependency信息,来标注本jar依赖的能力的GAV坐标,如下:
AbilityInfo/AbilityInstInfo
在AbilityInfo对象中,会描述当前Ability所涉及到的实例列表,以及这些实例(AbilityInstInfo)对外提供了哪些扩展点。
public class AbilityInstInfo extends BaseInfo {
......
@Getter
private final List<ExtensionInfo> extensions = Lists.newArrayList();
......
所以,通过AbilityInfo,我们可以很清楚的知道这个能力的编码、名字以及对外提供了哪些具体的可扩展点用于定制。
ExensionInfo
ExtensionInfo是具体的扩展点定义信息,里面主要包含:
- 扩展点编码
- 扩展点名字
- ReduceType策略类型
- ProtocolType类型
- 当前扩展点涉及到的Method名
- 当前扩展点的返回参数类型
- 当前扩展点的入参列表
BusinessInfo/ProductInfo
除了描述当前定义的业务的基本信息,如编码、名称外,BusinessInfo里还会给出当前业务具体定制了哪些扩展点。
比如,一个能力,对外提供了2个扩展点,但是业务只对其中一个扩展点做了定制。在BusinessInfo的customized中,我们会记录这个业务具体是定制了哪个扩展点。
这对于扩展点被使用情况,以及业务实际做了哪些定制的分析,以及后续做相似需求看类似业务实际做过什么定制会非常有帮助。
ProductInfo 和 BusinessInfo里的信息基本类似。
UseCaseInfo
UseCaseInfo 和BusinessInfo也基本类似,但在UseCaseInfo中,会多一份这个场景,对外提供了哪些可二次开发的扩展点。
public class UseCaseInfo extends BaseInfo {
@Getter
@Setter
private String sdk; //可二次开发的SDK门面类
//当前场景对外提供的可二次开发的扩展点清单
@Getter
private final Set<ExtensionInfo> extensions =
Sets.newHashSet();
//当前场景用到了/依赖了哪些底层扩展点
@Getter
private final List<ExtensionInfo> customized =
Lists.newArrayList();
}
基于Lattice编译插件所生成的这些信息,我们可以很容易的去做一套Web可视化的能力地图、场景SDK开发指导手册等。比如,笔者基于这套体系构建的,面向智慧城市领域构建的某个业务资产如下:
基于这种方式,可以很容易、很低成本的,在不同智慧城市这种超大型项目快速落地、复用!
Sample项目URL: https://github.com/hiforce/lattice-sample
发表回复