本文综合介绍了明道云的技术栈选择和技术路径选择背后的思考,为用户选型提供一个更加全局性的参考资料。我们希望明道云产品不仅满足客户对产品特性的需求,更能够符合企业IT长期发展的路线图规划。
技术架构
明道云系统整体基于微服务架构。前端(Web/H5)主要基于 React 框架,后端开发语言主要使用 Java、C#、Node.js。前端通过 http 方式与 API 建立连接,API 与微服务、微服务与微服务之间主要基于 RPC 协议(基于 gRPC)来实现接口调用,数据存储涉及的组件包括:MySQL
、MongoDB
、Redis
、Kafka
、ZooKeeper
、Elasticsearch
、File
、Flink
。
MySQL
:主要存储用户、组织等系统基础数据;
MongoDB
:主要是用于存储业务数据(如:应用、工作表、工作流等);
Redis
:缓存支持,提升系统性能;
Kafka&ZooKeeper
: 核心使用场景包括工作表汇总、工作表数据收集、工作流事件等;
Elasticsearch
:目前主要是支撑协作套件下的全局搜索能力;File
:默认采用的是开源文件存储系统 MinIO ,并在此基础上做了一层适配。同时也支持配置符合 S3 标准的文件对象服务(如:阿里云 OSS、腾讯云 COS、华为云 OBS、七牛云等);Flink
:用于实现数据集成的实时同步与ETL能力;
开源模块
本产品引入了很多主流的开源框架,包括开发语言与中间件。
(1)Java
Java 是一门面向对象编程语言,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java 作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。本产品主要使用了业界主流的 Spring Boot 框架,如工作流部分。
(2).NET
.NET 是开放源代码通用开发平台,由 Microsoft 和 .NET 社区在 GitHub 上共同维护,具有跨平台 、开放源代码 、部署灵活等特点。本产品一部分微服务基于 .NET 开发的, 目前基于 .NET6(LTS)版本。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动,非阻塞 I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。如本产品的IM Web Socket 通信服务正式基于Node.js SocketIO 框架而构建。
MongoDB 是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。本产品 APaaS 核心模块涉及的数据存储均基于 MongoDB 实现,基于其灵活的数据结构,也为产品的快速迭代提供了极大的便利。
MySQL 是一个关系型数据库管理系统,属于 Oracle 旗下产品,是最流行的关系型数据库管理系统之一。MySQL 软件采用了双授权政策,分为社区版和商业版。由于 MySQL 其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,所以很多企业应用产品都选择 MySQL 作为数据存储。本产品涉及的用户、组织等结构化基础数据均采用 MySQL 存储。
Redis 是一个开源的高性能的 Key-Value 数据库。它支持存储的 value 类型包括 string(字符串)、list(链表)、set(集合)、zset(有序集合)和 hash(哈希)。Redis 的操作都是原子性的,为了保证效率,数据都是缓存在内存中。同时 Redis 可周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave (主从)同步。本产品在非常多功能上均采用了 Redis 提供数据缓存,如最基础的用户信息、组织信息,也包括应用信息、工作表信息、工作表行数据、工作流、应用角色权限等等。出于查询性能考虑,Redis 的运用基本无处不在。
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,支持多种开发语言,基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特点。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。本产品大部分微服务都是基于 gRPC 实现,包括 C#、Java、Node.js 相关服务。
Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。根据 DB-Engines 的排名显示,Elasticsearch 是最受欢迎的企业搜索引擎。本产品的超级搜索功能并是基于 Elasticsearch 来实现的(包含跨应用的工作表数据、协作套件数据),目的是给用户提供更快的响应和更精准的匹配。同时在应用使用统计功能上也是基于 Elasticsearch 提供周期性的统计维度查看,充分了解应用的使用状态。
Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,是一个支持分布式、多分区、多副本、多订阅者,基于zookeeper协调的分布式消息系统。通过引入 Kafka,能促使服务之间的解耦,且能顶住高峰时间段的访问压力,不会因为突发的超负荷请求而完全崩溃。本产品的 APasS 部分功能在数据变更下,需要触发工作流的执行,这部分是实现主要就是基于 Kafka 的消息发布与订阅来实现,同时基于 Kafka 高吞吐量、多分区等特性,在配置合理的消费端数量情况下,达到事件有序执行和低延迟的效果。另外在本产品智能搜索模块也采用了 Kafka 作为数据传输中间件。
MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几KB到最大5TB不等。用户上传的文件以及一些静态资源文件都会存放于此服务中。
Apache Flink 是一个开源的大数据处理框架,专为实时流处理和批处理设计。它具有高吞吐量、低延迟、高可扩展性和强大的状态管理能力。Flink 支持分布式计算,能够在大规模集群上处理大量数据。Flink 采用了数据流编程模型,使得用户可以方便地构建高效的数据处理流水线。本产品的数据集成中的“多数据源数据实时同步”与“同步过程中的ETL数据处理能力”均建立在Flink之上。
技术要点
明道云综合采纳了MongoDB, Redis和Elasticsearch等多个NOSQL数据技术栈。这样做的主要目的是发挥不同模态数据库引擎的专业化优势,在功能拓展性、性能和用户体验方面为用户带来更大的价值。虽然我们使用了复杂的技术栈,但是每项技术栈的选择都着眼于主流、开源、可运维和符合业界标准。并且用户不需要与原生技术栈打交道,应用的搭建和运行都是在零代码的应用环境中进行的。
国内首家公开的且可通过容器技术部署的零代码/低代码平台,降低运维安装部署成本,支持单机版、集群版高可用等部署模式,也支持在Kubernetes下部署。这一能力确保了客户能够得到云原生的可伸缩性和高可用性。
明道云私有部署的前端代码完整开源(mingdao-openweb),允许用户fork并二次开发。
适配多种架构基础设施,包括X86 CPU架构与ARM64 CPU架构的Linux内核服务器,以及国产操作系统。内置快捷操作命令,包括停止、重启、升级、回滚、备份等便捷操作。
支持应用导入、导出、备份、维护、回滚以及可更新升级,应用搭建人员可高效维护。
无处不在的开放性,构筑的企业应用均自动建立标准开放接口(REST),提供所有数据对象增删查改的完整接口并自动生成文档。工作流的Webhook触发器、动作节点、API集成也可以实现无代码与其他应用的对接。
创新的自动化工作流,除了传统的审批流以外,支持表单事件、人员、定时、自定义按钮、接口触发等模式,支持在流程中完成数据增删查改,消息通知。
依据PBC(Packaged Business Capabilities)思想,创新的设计出了封装业务流程功能,它利用工作流编排的数据自动处理流程。它可以在整个组织内复用数据处理能力,接受约定的参数传入,通过工作流处理后传出结果参数,除了能调用内部的数据以外,还可以通过API与外部数据交互。
支持以零代码方式配置的多类型数据库实时同步。明道云支持如MySQL、SQL Server、Oracle、PostgreSQL、MongoDB、IBM DB2、Kafka等外部数据源作为数据源或数据目的地,建立同步管道,实现秒级延迟的数据实时同步。
技术路径比较(模型驱动 vs 低代码开发工具)
在本市场,为了实现快速应用构建,大体有两种技术路径。
一种是以明道云为代表的零代码应用平台模式(No Code APaaS),完全使用模型驱动的方式。用户通过可视化方式搭建应用,实质上生成了一个模型文件(一个类似JSON文件的结构),然后通过平台(Run-time)直接解释运行。在运行时,实质性的计算(数据的存储、运算、分析等)依然通过原生的方式和微服务交互。
另一种是以快速开发为导向的低代码开发平台(LCDP)。它们沿袭了快速开发工具(RAD)品类的思路,但是提供了更多的可视化建模工具,使得开发者在既定的CI/CD流程上得到更高的开发效率。LCDP适应代码开发人员的习惯,能够输出局部的源代码,但是大多数产品依然不能脱离平台产品Run-time独立编译运行。
下表综合体现了两者的异同点:
以下是我们选择该技术路径的完整理由和强化举措。
(1)降低学习成本,能够让非开发者参与到应用设计和实现过程中。非开发者既包括业务人员,也包括非开发类型的IT专业人员(架构、产品、业务分析等)。
(2)为开发者提供可选的扩展机会,而不是要求整个应用实现都低代码化。开发者应该发挥他们的优势,而不是把精力花在重复性很高的CRUD项目上。
(3)通过灵活组合能力颗粒,APaaS同样可以完成高复杂度的企业应用。因为大多数复杂企业应用的特点只是数据对象多、属性多、关联关系多、业务流程长。这些多和长的问题都是可以分而治之,各个击破的。
(4)通过前端开源和插件开发平台解决前端自由度的需求。而不是为了100%的精确控制让用户从画布开始规划。后者需要使用者掌握较为完备的前端知识,并处理复杂的控件与数据源的绑定逻辑。
(5)应用质量。追求No Code, No Bug(一次对,次次对;一处对,处处对)的原理实现,让应用构建者不必再投入昂贵的单元测试。
(6)取舍均衡。明道云定位于解决范式化程度最高的企业中后台应用,这些应用大多数是基于关系数据结构的数据管理和业务流程整合。这就为高零代码程度解决应用实现创造了可能。
(7)对应用开发模式趋势的响应。 未来企业应用的开发更多聚焦在业务的可组合性上,即使是原生开发,也强调无服务器化和SOA架构的现代化。APaaS产品为这个技术趋势提供了一个预先实现的框架,使得企业用户无需精力在基础技术架构上,而可以专注于自己的业务场景实现。