公众号|松花皮蛋的黑板报|浅谈组件化
松花皮蛋的黑板报
  • 分享在京东工作的技术感悟,还有JAVA技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的

扫一扫
关注公众号

浅谈组件化

博客首页文章列表 松花皮蛋me 2020-02-19 21:26

我之前在做业务需求的时候,很多的个性化需求并不能快速响应,实现后有时也很难保证系统的可阅读性。不过好消息是,我今年在做京东内容领域的组件化改造和能力输出,之前的问题或许会得到根本性的解决。那么,接下来我将分享一些个人对于组件化的认知,希望能帮助到你。

一、什么是组件

组件,它是基于可复用、可插拔为目标的功能单元,同时具有清晰的职责和上下文边界。当然组件颗粒度把控也是一门学问,太大和太小都会直接影响到重用性和复杂性,所以组件一般为某个业务域下具体的、能独立提供服务的产品或者模块。

比如,我们日常使用的统一规范、代码自动生成器、分库分表组件、连接池组件、SQL拦截组件、多级缓存代理组件等等都是组件。由于它们都不具备业务逻辑,不能算为业务组件,只能定义为技术组件。


二、什么是组件化

根据以往开发的痛点,抽取几个修改频繁,个性化需求较多的功能进行总结抽象,将主流程和个性化剥离开来,以便于沉淀核心流程,将个性化能力开放给第三方团队实现,减少个性化需求的耦合。这个过程就是业务组件化改造。

比如,内容创作基础能力提供通用服务,然后定义出一系列扩展点,包括语言包(中文、英文、泰文等)、创作页面配置(图片、富文本、话题、商品、视频等)、表单字段基本校验(字数限制、格式限制)、内容校验规则配置(黑名单、图片文本、商品好评率等)等,然后第三方团队就可以通过实现扩展点进行编排,从而达到自助式开发的快速试错。


显然组件化的方式更具备扩展性,更能适应各种场景和快速响应新的业务需求。


三、组件化的目的


沉淀业务资产,以面的方式协同复用,从而达到支持快速、低成本的组合式开发,快速应对业务的不稳定性、不确定性、复杂性、模糊性。


再者,从宏观角度来看,组件化改造是从”一体化组织”到”积木型组织”的变革之路。


四、组件化的步骤


组件化的步骤是,重新梳理业务、重新组织数据,明确业务边界,提取可复用的能力进行角色、场景枚举,然后进行统一语义接口设计。前面是主流程设计,再者是扩展点设计。扩展点是主流程和个性化逻辑解耦的唯一核心概念,扩展点由第三方独立实现,独立打包,主流程则借助框架加载执行扩展点。当然框架还提供了链式处理快速失败逻辑,当某个扩展点语义失败时中止执行其他扩展点。

需要注意的是,过程中我们需要从业务研发思绪转变成中台研发思绪,组件化的时候把自己当成中台业务架构,已有架构适配过程把自己当成前台业务实施团队。另外组件化的时候,要重点关注业务活动,还要考虑扩展点定义是否真正满足第三方团队的需求。

我们看到组件化的过程,其实是以SPI扩展点方式代替API接口开发,与传统SPI方式相比多了业务身份概念。


五、组件化的方法


1、基于流程引擎的实现


创建多个结点,然后将这个结点形成一条链。业务数据沿着这个链依次进行处理,只有当前结点执行成功后才能执行下一个结点,如果结点执行异常就进行重试,直到成功或者达到最大重试次数限制。


比如,京东的KitStore运维编排工具,通过将复杂的作业节点编排成任务,通过设定触发条件或者依赖,满足更为灵活的应用场景。

类似于自动化运维工具SaltStack,只不过KitStore将其可视化了,使得接入门槛更低。


以下为SaltStack的PlayBook示例,可以通过order指定顺序,还可以通过require、watch、onchanges、onfail灵活设置依赖和触发任务。

2、基于规则配置的实现


将业务规则的配置单独提取出来,使之与业务系统保持低耦合。

比如,京东的达人平台,支持渠道、样式、类型、字段等动态调整。前端根据规则渲染页面和拼装请求参数,服务端根据规则动态校验和保存。


3、基于设计模式的实现

增加一层抽象来隔离变化。比如模板方法。

4、基于运行时加载的实现

比如Spring Boot框架的自动装配特性,它会在ClassPath中搜索符合预期的JAR包并加载其Bean对象。

5、基于开放脚本的实现

脚本可以是代码片段、也可以是表达式,还可以是指标计算公式,其可以被动态编辑管理。

比如,京东通天塔平台提供了丰富的图文、商品、导航、营销模板,同时支持自定义代码生成自己的模板,从而让采销、运营、商家能快速和灵活地搭建营销活动页面。

六、总结


本文讲解了组件和组件化的概念,还有具体落地方案,希望能给你带来一些思考。多说一句,组件化的初衷是美好的,但是开发、维护、冶理的成本不容小视,比如如何利用DevOps工具保证第三方业务包的集成测试。