背景介绍

在《平台对业务敏捷支撑的挑战》中,我们可以看到平台在对业务敏捷支撑的关键点:

  • 平台的能力是否可以外化并暴露出去,各行业的业务团队能清楚的知道平台具备什么样的能力;
  • 平台对外提供的可扩展性是否足够,业务团队能自助式无侵入式的进行业务逻辑定制

大部分平台具备什么样的能力,有什么开放的扩展点,以及相互之间有啥组件依赖要求。都是通过一些软件、文档来进行人肉维护。随着时间的推移,这些文档很快就过时,也不够准确。这些花了大量精力维护的文档逐渐就成了摆设。

在《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