技士要无业了,中台微服务了

时间:2020-04-06 17:28来源:亚洲城ca88唯一官方网站
时间: 2019-12-25阅读: 89标签: 前端 时间: 2019-07-14阅读: 256标签: 编程 前段时间作者写了《当中台遇到DDD,我们该如何设计微服务?》这篇文章,文章中详细描述了基于 DDD设计思想的中台微

时间: 2019-12-25阅读: 89标签: 前端

时间: 2019-07-14阅读: 256标签: 编程

图片 1

前段时间作者写了《当中台遇到 DDD,我们该如何设计微服务?》这篇文章,文章中详细描述了基于 DDD 设计思想的中台微服务设计方法以及分布式架构实施过程中的关注点等内容。中台建设完成后,通过微服务实现了后端应用的解耦,提高了中台应用的弹性伸缩能力。但由于微服务拆分,也会导致项目团队和服务的碎片化,给前端项目集成带来一定的复杂度。

“中台之后,便是无代码编程。”无代码编程是什么?开发流程是怎么样的?有何优缺点?无代码编程时代来了,就不需要程序员编写代码了吗?下面作者将跟大家聊聊无代码编程的那些事儿。

规模化的组织,经常要面临这样的挑战:每个应用的基础设施是相同的,部分的代码也是相同的,甚至于它们可能只是数据模型不同而已。结果却导致了,他/她们要一次又一次地重新编写一个应用。对于一个新的应用而言,它需要对接大量的三方服务。服务之间的不断变化 ,导致了对应的使用方也需要发生变化。不断变化的业务,导致了前台的设计不断变化。为了应对快速谈的的前台服务,后台便诞生了中台,以提供快速的响应能力。而随着中台进一步沉淀,从某种形式上趋于稳定,而前台仍然需要快速地响应能力。

微服务架构通常采用前后端分离方式,中台服务通过 API 网关对外发布,单体应用拆分后一个前端项目可能会面对多个中台微服务项目。前端开发人员犹如维修电工一样,将面对成千上万中台团队开发出来的 API 接头,如何正确的连接和拼装,并且保证不出错,不是一件很容易的事情。而当中台 API 出现变更时,又如何通知所有受影响的前端项目团队同步调整和版本协同发布,需要的沟通成本相信也不小。

规模化的组织,经常要面临这样的挑战:每个应用的基础设施是相同的,部分的代码也是相同的,甚至于它们可能只是数据模型不同而已。结果却导致了,他/她们要一次又一次地重新编写一个应用。对于一个新的应用而言,它需要对接大量的三方(非自己团队)服务。服务之间的不断变化 ,导致了对应的使用方也需要发生变化。不断变化的业务,导致了前台的设计不断变化。为了应对快速谈的的前台服务,后台便诞生了中台,以提供快速的响应能力。而随着中台进一步沉淀,从某种形式上趋于稳定,而前台仍然需要快速地响应能力。

于是乎,作为一个前端开发人员,我们不断提炼和复用代码,想着的模式在之前的文章已提到了:

如何降低前端集成的复杂度?做到后端解耦,前端聚合?这是一个很有意思的话题。

于是乎,作为一个前端开发人员,我们不断提炼和复用代码,想着的模式在之前的文章已提到了:

脚手架

本文主要借鉴微前端设计思想,参考微服务单一职责和共享原则将前端进行拆分和组合。从功能垂直的角度,将微前端与中台微服务进行集成和组合,形成从前端到后端可独立开发、测试、部署和运维的,领域功能自包含的业务单元。

脚手架

组件库

前端页面通过微前端加载器,利用页面路由和动态加载等技术,实现前端集成主页面与微前端的“拼图式”开发。前端集成项目团队只需关注前端整体风格、微前端之间的数据交互和页面路由等内容,不涉及前端与中台之间以及中台与中台之间的 API 集成,从而降低集成过程中的技术敏感度、团队沟通成本和集成复杂度,提高交付效率和用户体验。

组件库

模式库

本文最后通过保险订单销售模式设计案例来说明如何进行前端设计

模式库

模板和模板应用

微前端概述

模板和模板应用

对应的,我们还创建了一系列的 CLI、工具集、编程器插件以及设计系统,以完成整个系统的快速开发。然而,我们还缺少一套有效的工具,来统一化的管理这些工具。

微前端概念是 ThoughtWorks 在 2016 年提出来的,它将微服务理念扩展到前端开发,解决中台微服务化后,前端由于仍为单体而存在的逻辑繁杂和臃肿的问题。微前端是按照前端设计方法在前端同时构建多个可以独立部署、完全自治、松耦合的页面组合,其中每个组合只负责特定的 UI 元素和功能。

对应的,我们还创建了一系列的 CLI、工具集、编程器插件以及设计系统,以完成整个系统的快速开发。然而,我们还缺少一套有效的工具,来统一化的管理这些工具。

换句话来说,就是:我们需要一个前端的中台,它便是无代码/低代码编程。

微前端与微服务都是希望将单体应用,按照一定的规则拆分为多个可以独立运行、独立开发、独立部署、独立运维的微服务或者页面聚合,从而满足业务快速变化及分布式多团队并行开发的需求。

换句话来说,就是:我们需要一个前端的中台,它便是无代码/低代码编程。

无代码/低代码是一种创建应用的方法,它可以让开发人员使用最少的编码知识,来快速开发应用程序。它可以在图形界面中,使用可视化建模的方式,来组装和配置应用程序。开发人员可以直接跳过所有的基础架构,只关注于使用代码来实现业务逻辑。

微前端除了可以实现前端页面的解耦外,还可实现前端页面的复用,做到“一次开发,多端复用”,这也与中台服务共享理念是一脉相承。

什么是无代码编程?

当然,从开发人员的角度来看,降低代码量,可能是:

从单体前端到微前端

无代码/低代码是一种创建应用的方法,它可以让开发人员使用最少的编码知识,来快速开发应用程序。它可以在图形界面中,使用可视化建模的方式,来组装和配置应用程序。开发人员可以直接跳过所有的基础架构,只关注于使用代码来实现业务逻辑。

框架本身处理了复杂性。毕竟 “复杂度同力一样不会消失,也不会凭空产生,它总是从一个物体转移到另一个物体或一种形式转为另一种形式。”

传统的软件项目往往采用单体式架构,前端往往由一个团队创建并维护一个 Web 应用程序,通过 API 网关从微服务调用服务。随着时间的推移,前端往往会越来越臃肿,越来越难维护。

当然,从开发人员的角度来看,降低代码量,可能是:

代码生成减少了工作量。大量的复制、粘贴需要更多的时间。

随着 5G 技术的应用,企业活动将进一步移动化和线上化,过去企业的通常做法是为不同的应用开发出很多独立的 APP。但是用户来并不想装那么多 APP!

框架本身处理了复杂性。毕竟“复杂度同力一样不会消失,也不会凭空产生,它总是从一个物体转移到另一个物体或一种形式转为另一种形式。”

流程

为了提高用户体验,实现统一运营,很多企业开始缩减 APP 的数量,通过一个 APP 集成所有应用功能。试想如果将企业内所有前端页面、流程设计以及前端与后端集成的工作都交给前端项目,将原来独立和分散的应用,展示在一个巴掌大的手机屏幕上。前端项目将会面对无数的中台项目和成千上万不太熟悉的 API 接口,这绝对会是一场灾难。

代码生成减少了工作量。大量的复制、粘贴需要更多的时间。

只是凭借这个概念,我们是无法理解无代码编程的。于是,我画了一张图来展示相应的架构和流程:

相对互联网企业而言,传统企业的渠道应用更多样化,有面向内部人员的柜台类应用、面向外部客户的互联网电商及移动 APP 类应用,还有面向商业生态圈的第三方 API 集成。由于渠道的差异,传统企业前端设计将会更多样化和复杂化。

流程

图片 2

传统企业在实施中台战略时,为满足前端和中台多渠道共享和复用,部分场景还应有别于阿里巴巴的中台战略。传统企业除了要像阿里巴巴一样进行通用共享服务(主要提供共享 API)的中台化建设外,还需要对核心专属业务(除 API 外,还存在大量面向用户的页面)进行中台化建设,以满足不同渠道的业务复用的需求。

只是凭借这个概念,我们是无法理解无代码编程的。于是,我画了一张图来展示相应的架构和流程:

低代码编程流

从单体前端到微前端

依照我的观点来看,我将无代码编程分为了两部分:

依照我的观点来看,我将无代码编程分为了两部分:

如何实现前端复用,降低前端集成的复杂度?

用于构建 UI 的编辑器——一种在线的拖拽式 UI 设计和页面构建工具

用于构建 UI 的编辑器——一种在线的拖拽式 UI 设计和页面构建工具

在前端设计时,我们可以参考微服务设计方法,遵循单一职责和共享原则,按照领域模型和微服务边界,将前端页面进行拆分和组合形成微前端,与中台微服务组合成业务单元。

用于编写业务逻辑的流编辑器——通过流编程的方式来编写业务代码(多数是对于数据的处理)

用于编写业务逻辑的流编辑器——通过流编程的方式来编写业务代码(多数是对于数据的处理)

业务单元定义:在前后端分离架构模式下,微前端页面与中台微服务共同组成一个业务单元。在同一个业务单元内,从前端页面、中台微服务到后端数据可以独立开发、测试、部署和运维,在业务单元内自包含完成中台领域内的部分或全部业务功能。

UI 编程器

UI 编程器

项目职责和系统边界

为了设计出我们的 UI 构建器,我们需要准备好一系列的基础设施:

为了设计出我们的 UI 构建器,我们需要准备好一系列的基础设施:

从前端项目主要负责前端页面的集成、页面风格设计和流程控制,以及与微前端集成相关的微前端加载、微前端注册、页面路由以及数据共享。

UI 编程器。用于拖拽式设计 UI。

UI 编程器。用于拖拽式设计 UI。

后端中台项目负责业务单元内中台微服务以及微服务对应微前端开发和集成。

空白脚手架。一个带有完整的应用生命周期的项目,但是它是一个空白的项目——用于我们在构建 UI 的过程中,随时随地的添加组件和代码。

空白脚手架。一个带有完整的应用生命周期的项目,但是它是一个空白的项目——用于我们在构建 UI 的过程中,随时随地的添加组件和代码。

通用和专属中台项目既面向第三方生态圈提供 API 服务,也面向前端集成主页面提供微前端页面复用。微前端和中台微服务组合成业务单元为多渠道业务提供从前端到后台的页面和业务逻辑复用。在面向多渠道业务页面复用时,微前端需要做好页面风格适配,以满足不同渠道界面风格的要求。

设计系统。我们需要一个完整的组件库,大量的页面模板,以及一定数量的模板应用,减少相应的开发工具量。

设计系统。我们需要一个完整的组件库,大量的页面模板,以及一定数量的模板应用,减少相应的开发工具量。

通过职责分工和应用边界的清晰划分,前端项目专注于微前端集成,后端项目专职做好本业务领域内中台微服务开发和微前端集成,确保领域内前端页面和后端业务逻辑作为一个业务单元整体高可用。

代码片段集。它将设计系统中的组件库进一步实例化成代码段,在完成编辑后通过 CLI 来动态编辑代码。

代码片段集。它将设计系统中的组件库进一步实例化成代码段,在完成编辑后通过 CLI 来动态编辑代码。

由于微前端和微服务之间的 API 集成已由中台项目完成,前端项目可基于微前端实现拼图式开发,在实现前后端复用的同时,大大降低前端集成复杂度。

DSL(领域特定语言,可选)。中间生成物,用于隔离框架与设计。

DSL(领域特定语言,可选)。中间生成物,用于隔离框架与设计。

微前端与微服务组合的几种形态

流编程器

流编程器

微前端与微服务可以有多种组合方式,以实现不同的业务目标。

流编程器。用于拖拽式、输入编写业务代码。

流编程器。用于拖拽式、输入编写业务代码。

一个虚框内微前端、中台微服务共同组成一个业务单元(如下图)。虚框内组件可以按照业务单元分前端和后端进行独立部署。

后端服务。如果不能提供现成的后端服务,则需要拥有一个标准的 API 规范,以及相应的 mock server。

后端服务。如果不能提供现成的后端服务,则需要拥有一个标准的 API 规范,以及相应的 mock server。

微前端页面包括业务操作必需的页面要素,不含页面导航等要素,页面导航功能位于前端集成主页面内。

模式库。包含相应的业务处理代码,如通用的登录、数据获取、UI 交互等。

模式库。包含相应的业务处理代码,如通用的登录、数据获取、UI 交互等。

微前端页面稍加改造就可以完成简单的单一场景业务,也可根据页面路由动态加载到前端集成主页面完成复杂组合场景业务。

DSL(领域特定语言,可选)。同上

DSL(领域特定语言,可选)。同上

微前端的几种形态

当然了,我们还需要能实时预览构建出来的应用。随后,我们执行了构建,而后构建出了一个半成品应用。开发人员只需要在它的基础上开发应用即可。而在开发人员开发的过程中,我们可以设计一系列的工具,来帮助开发人员更快速地构建应用。

当然了,我们还需要能实时预览构建出来的应用。随后,我们执行了构建,而后构建出了一个半成品应用。开发人员只需要在它的基础上开发应用即可。而在开发人员开发的过程中,我们可以设计一系列的工具,来帮助开发人员更快速地构建应用。

微前端与微服务的组合主要有以下几类形式。

编辑器插件。包含设计系统、模式库等的自动完成代码,以及组织内部常用的代码库。

编辑器插件。包含设计系统、模式库等的自动完成代码,以及组织内部常用的代码库。

单一类微前端:一个微前端和一个中台微服务组成一个业务单元。微前端完成业务单元内页面流程和前端操作,中台微服务完成后端业务逻辑,业务单元功能独立且自包含。微前端可按照页面路由动态加载至前端集成主页面。

调试工具。对于混合类型的应用而言,我们还需要一个开发工具来快速构建应用。

调试工具。对于混合类型的应用而言,我们还需要一个开发工具来快速构建应用。

组合类微前端:一个微前端与多个中台微服务组成业务单元。微前端通过对多个中台微服务进行服务编排和组合,完成业务单元内较复杂的页面流程和前端操作。业务逻辑由后端多个微服务组合完成,如:可由专属业务中台与通用中台微服务组合,也可由同一领域内多个微服务组合。在微前端设计时,微前端对应的组合微服务的数量要均衡考虑,否则很容易将微前端开发成单体前端。同时业务单元的领域边界要清晰,避免由于功能交叉而导致单元与单元之间的耦合,影响项目团队职责边界,进而影响到部署、测试以及运维等。

从上述的流程上来看,无代码编程还具有以下的特点:

从上述的流程上来看,无代码编程还具有以下的特点

通用共享类微前端:一个微前端与一个或多个通用中台微服务组成共享类业务单元。通用共享类微前端一般通过前端集成主页面,以共享页面的模式与其他微前端页面组合,共同完成业务流程。该类微前端通常对应通用中台共享类微服务。

拖放式界面。又或者是可视化模型——基于节点和箭头。

拖放式界面。又或者是可视化模型——基于节点和箭头。

基于微前端的保险订单销售方案设计

基于视觉的设计。

基于视觉的设计

本节主要介绍如何通过微前端与中台微服务组合设计,满足保险产品订单销售业务模式要求。由于篇幅有限,本文主要描述技术和设计思路。如对详细设计感兴趣,可关注作者简书号:欧创新,在《中台战略下的保险订单销售模式设计》文中有详细介绍。

可扩展的设计。如对于插件、插件商店,社区等一系列的支持。

可扩展的设计。如对于插件、插件商店,社区等一系列的支持。

保险订单销售模式的必要性

跨平台功能。支持 PC Web 应用开发,支持移动应用构架等。

跨平台功能。支持 PC Web 应用开发,支持移动应用构架等。

对于保险集团而言,为充分利用销售资源,实现集团一体化的综拓销售和所有子公司保险产品的一体化交叉销售,需对所有产品实现无差异的一体化运营和销售。传统的保险核心业务系统基本都是分险种建设的,前端没有统一的操作界面,客户在购买多个保险产品时很难享受到流畅的服务。

强大的部署后。即平台包含着整个应用的生命周期。

强大的部署后。即平台包含着整个应用的生命周期。

以产险为例,承保核心系统基本是以车险和非车险产品为边界建设。由于前端页面分离,没有统一的销售界面,用户只能在一个系统内进行竖井式操作,一次只能完成一类产品承保。如产品涉及车和非车险,则需要分别操作车险和非车险两个系统才能完成承保。

拥有丰富的集成支持。可以随意的找到需要的组件,以及对应的后台服务。

拥有丰富的集成支持。可以随意的找到需要的组件,以及对应的后台服务。

同一公司内跨车和非车险产品销售存在体验的问题,如果把产、寿、健和养老所有子公司保险产品放在一起统一运营和销售,面临的问题就更复杂了。

配置化。它也意味着大量的自定义配置。

配置化。它也意味着大量的自定义配置。

为了解决所有保险产品无差异一体化销售的问题,可以借鉴电商订单化的销售模式,在保险产品之上增加一个实体,这个实体就是订单。

自制的领域特定语言(可选)。用于构建时优化。

自制的领域特定语言。用于构建时优化。

在前端,利用前端集成主页面通过商品、录单、购物车、订单、保单管理等业务功能,建立所有产品的客户接触和体验的一体化销售界面。

优缺点

优缺点

保险订单销售模式可以满足跨多个保险产品复杂场景的产品无差异的一体化销售目标,给客户提供一致的体验,满足集团化或者保险商城等多产品组合销售场景要求。同时还可以通过事件驱动的异步化的模式,彻底解耦后端应用,降低实时处理压力。

相应的,它具有以下的一些优点:

相应的,它具有以下的一些优点:

承保业务中台的建设

高效。不用多说,节省时间和开发成本。

高效。不用多说,节省时间和开发成本。

保险公司有很多类保险产品,但由于不同保险产品面向不同的场景,解决的问题不同,在录单要素、业务规则以及流程等方面存在差异,因此其前端页面和领域模型也会存在不同。为了避免不同类产品之间的相互影响和干扰,在进行承保业务中台设计时,可以以同类相似场景的保险产品作为聚合进行承保专属业务中台的建设。

有限的 Bug,安全性。

有限的 Bug,安全性。

按照上述思路,集团内 N 类产品将会有 N 个承保专属业务中台,每个承保业务中台至少包含:投保和保单管理两个微服务。为了简单起见,以下图中六边形微服务图例为保险产品的承保业务中台,如:车险所在图例为车险承保业务中台,车险承保业务中台中至少包含了投保和保单管理两个微服务。

低成本。其所需的预算非常有限。

低成本。其所需的预算非常有限。

投保微服务主要存储客户接触过程中的投保数据和处理投保业务逻辑。配合核保中心完成核保操作,订单支付完成后,订单中心通过事件机制触发投保微服务将投保单转成保单,并异步将数据传送到保单管理微服务和客户统一视图。

易用(取决于设计)。

易用。

保单管理微服务异步接收从投保微服务将投保单转保单后的保单数据。异步传送后续流程需要的数据,如:佣金、收付费、再保以及客户统一视图库和业务统一视图数据。

开发速度更快。

开发速度更快。

中台项目在建设投保和保单管理微服务时,需同步建设和集成录单和保单管理微前端,微前端分别完成录单和批改、退保的页面逻辑。

开发过程中的 AI 。

开发过程中的 AI 。

单体前端集成模式

维护成本低。

维护成本低。

在承保业务中台完成建设后,如果前端项目仍然采用单体前端集成模式。前端项目将面临 N 类产品的中台项目和微服务暴露出来的成千上万的 API。

对应的相应的缺点有:

对应的相应的缺点有:

以录单为例,如果前端用一个录单页面完成所有产品的录入,将会面临由于不同类产品录单要素不一样而导致页面众口难调的问题,最终影响用户体验。而且在集成过程中还需要处理不同产品中台 API 路由的问题。

仍然需要编程技能。

仍然需要编程技能。

而如果前端项目为每类产品单独开发一个录单页面,暂且不提需要开发 N 类产品前端录单页面的工作量。在与中台集成的过程中,前端项目团队需要详细了解所有 N 类产品的中台 API,并需要为每类产品完成前后端的集成。而且有可能由于业务中台属于不同子公司,而导致集成开发需要跨公司,而公司之间或许还存在技术异构,这将会给前端集成带来非常巨大的工作量。而一旦中台 API 出现变更,前端版本的调整和多个应用版本的协同发布,也会影响到业务的正常运行。

受限的自定义能力。

受限的自定义能力。

单体前端的集成模式给前端项目提出了很高的要求。

可扩展性成了新的问题。

可扩展性成了新的问题。

而如果采用微前端的集成模式呢?或许情况会发生很大的变化。

集成受限。

集成受限。

单体前端集成模式

就当前而言,低代码开发平台通常分为两大类:

就当前而言,低代码开发平台通常分为两大类:

微前端集成模式

对于外部:制作简单的产品,如网络移动应用程序

对于外部:制作简单的产品,如网络移动应用程序

如采用微前端集成模式,中台项目和前端项目将会有清晰的职责和应用边界。前端项目可通过前端集成主页面按需加载微前端,实现拼图式开发。

对于内部:为您的团队或企业创建业务应用程序

对于内部:为您的团队或企业创建业务应用程序

前端项目主要负责前端主页面的集成、页面风格设计和流程控制,以及与微前端集成相关的微前端加载、微前端注册、页面路由以及前端集成主页面的数据共享。

诸如只使用CRUD、表单、验证、简单聚合、分页等简易的服务。最常见的例子就是表单构建了,诸如金数据这样的应用,便是可以直接通过拖拽元素来生成,相应的开源实现有 jQuery Form Builder。

诸如只使用 CRUD、表单、验证、简单聚合、分页等简易的服务。最常见的例子就是表单构建了,诸如金数据这样的应用,便是可以直接通过拖拽元素来生成,相应的开源实现有 jQuery Form Builder。

后端中台项目负责业务单元内中台微服务以及对应的微前端建设,完成中台微服务与微前端的集成。

对于开发人员来说,我们只需要定义好数据模型,再通过拖拽来决定元素的位置即可。从这种角度来看,只要能使用 Serverless 构建的应用和服务,都可以直接使用低代码开发模式。

对于开发人员来说,我们只需要定义好数据模型,再通过拖拽来决定元素的位置即可。从这种角度来看,只要能使用 Serverless 构建的应用和服务,都可以直接使用低代码开发模式。

中台项目为投保微服务和保单管理微服务分别开发录单微前端和保单管理微前端。录单微前端与投保微服务组成投保业务单元(如下图虚框内组件组合为一个业务单元)。由于微前端与中台微服务的开发、测试和集成都是在中台项目内完成,集成起来的难度和出问题的可能性会比单体前端集成模式要小的多。

开发流程对比

从我们的理解来看,传统应用的开发流程是:

前端项目只需要关注集成主页面中的微前端加载、注册和页面路由规则的设置,不需关心中台微服务 API 的集成和中台业务逻辑的技术实现,从而屏蔽底层技术复杂度,降低前端项目技术能力要求、沟通和测试成本。

从我们的理解来看,传统应用的开发流程是:

分析、设计、确认、规划需求。

微前端集成模式

分析、设计、确认、规划需求。

设计系统架构。

保险订单销售模式方案

设计系统架构。

搭建前后端项目。选择技术栈、从零开始搭建或者从脚手架中创建。

为了后续描述方便在本节定义一个新名词“保险产品通道”。

搭建前后端项目。选择技术栈、从零开始搭建或者从脚手架中创建。

搭建持续集成。

保险产品通道

搭建持续集成。

创建线框图和高保真原型。

保险产品通道包括微前端、承保专属业务中台以及专属业务中台后端对应的收付费、佣金、再保等通用中台和客户统一视图和业务统一视图等数据中台。同类产品在这个通道内完成录单、投保、保单生成、退保、批改以及向后端送数等操作。

创建线框图和高保真原型。

设计数据模型,定义前后端契约,即 API URI、方法、字段等。

保险产品通道主要隔离点在微前端和承保专属业务中台。同类产品使用同一个产品通道,不同类产品使用不同的产品通道,所有流程无交叉,代码、部署和功能隔离。保险产品通道包括领域内若干微前端和微服务组合成的若干个业务单元,这些业务单元能力组合成全部的领域能力,如车险中台所在的投保业务单元和保单管理业务单元,共同组成车险承保领域能力。

设计数据模型,定义前后端契约,即 API URI、方法、字段等。

前后端实现业务逻辑。

保险订单销售模式方案

前后端实现业务逻辑。

前端实现 UI 页面。

产品通道设计要点

前端实现 UI 页面。

集成第三方后端服务。

承保流程中不同保险产品通道之间无交叉和交互。

集成第三方后端服务。

功能需求测试(DEV、QA、ST、UAT)

同类产品承保业务流程在自己专属产品通道内完成。

功能需求测试(DEV、QA、ST、UAT)

跨功能需求测试

产品通道的意义

跨功能需求测试(安全性、性能等)

部署到生产环境。

业务专一性:领域模型更聚焦,功能更单一,前后端项目团队规模更小,集中办公,更专注于本领域内的业务逻辑和微前端。产品通道业务高度内敛,同类产品录单、流程和规则基本相似,产品之间干扰小,用户体验会更好。

部署到生产环境。

低代码开发流程:

职责专一性:产品通道完成了产品从前端到后端全部承保流程。中台项目专职于产品承保业务中台业务逻辑和微前端页面的实现,因此谁负责产品,谁就负责微前端和专属业务中台建设,并保证全通道内业务的高可用。前端项目只需完成前端主页面与微前端的集成,集成过程甚至不涉及到 API,可以减轻前端集成压力和界面开发的复杂度。尤其对于集团级跨子公司(主要问题是系统和业务相互不熟悉,接口和集成复杂,沟通成本高)的系统集成会带来极大的好处,降低沟通成本和集成的复杂度。

低代码开发流程:

分析、设计、确认、规划需求

复用性:微前端和承保业务中台都有高度的复用性。微前端可快速加入前端集成主页面,或将微前端直接发布成 APP,实现快速响应和发布。某些场景甚至一个微前端就是一个 APP 应用,完成单一场景产品的销售。

分析、设计、确认、规划需求

选择需要的第三方 API

隔离性:同类产品的问题修复和代码修改在一个产品通道内,不会影响其他产品通道的业务。不同产品通道在物理和逻辑上隔离,业务单元的版本发布和新产品上线相互之间不受影响。

选择需要的第三方 API

在可视 IDE 中绘制应用程序的工作流程、数据模型和用户界面。

响应能力:新产品通道可以独立开发、测试、集成和部署,完成部署后只需在集成主页面完成微前端注册和增加页面路由即可上线销售。

在可视 IDE 中绘制应用程序的工作流程、数据模型和用户界面。

连接 API——通常使用服务、函数发现。

测试和沟通成本低:一个产品通道由一个中台项目团队负责。产品通道功能自包含,在一个通道内可以完成从前端到后端所有业务流程集成和测试,降低沟通和测试成本。

连接 API——通常使用服务、函数发现。

编写业务逻辑。手动代码添加到前端或者自定义自动生成的 SQL 查询。

技术敏感度低:微前端只要符合规范即可快速动态加载到前端集成主页面,前端项目在前端集成过程中不需要关注中台的技术实现和 API 集成,降低技术敏感度。

编写业务逻辑(可选)。手动代码添加到前端或者自定义自动生成的 SQL 查询。

用户验收测试。

前端集成主页面

用户验收测试。

部署到生产环境。

前端集成主页面类似门户,集成所有微前端页面,实现所有微前端的聚合。按照正确的逻辑(如根据客户选择产品,选择加载产品对应的录单微前端,完成录单和投保)加载微前端页面,协同配合完成完整的业务流程,给用户提供一致的体验。

部署到生产环境。

从步骤上来看,无代码编程少了几个步骤。这些步骤都因为大量丰富的内部系统集成,而变得非常简单。

前端集成主页面和所有微前端须有统一的页面风格,且符合前端的集成技术规范。

从步骤上来看,无代码编程少了几个步骤。这些步骤都因为大量丰富的内部系统集成,而变得非常简单。

就当前而言,无代码编程实际上是一种高度的场景预设的模式。因此,它存在一定的适用场景:

前端集成主页面加载并组合各微前端,作为一个整体为客户提供所有保险产品销售的接触和体验界面,包括商品展示、录单、购物车、订单管理、支付管理以及退保和批改等保单管理操作。

适用场景

模型驱动开发。

以投保和保单管理为例,说明一下前端集成主页面的工作原理。

就当前而言,无代码编程实际上是一种高度的场景预设的模式。因此,它存在一定的适用场景:

快速 UI 构建。

在录单过程中,客户选择保险产品,前端集成主页面根据客户选择的保险产品,获取产品对应的录单微前端路由,也就是录单微前端 URL 地址,在主页面指定区域加载录单微前端页面。录单微前端负责录单界面,投保微服务负责投保单生成等后端逻辑,两者配合在产品通道内完成投保单的录入和投保单生成。

模型驱动开发。

极简的业务功能。

在保单管理过程中,前端集成主页面根据客户选择的保险产品加载产品对应的保单管理微前端,两者配合在产品通道内完成保单退保或批改。

快速 UI 构建。

IT 资源受限。在资源受限的情况下,能快速开发出符合业务需求的应用最重要。

实施微前端的主要价值和意义

极简的业务功能。

而从流程上来看,对于一部分的应用来说,我们并不能实现无代码编程——存在一些业务上的不同之处。因此,多数场景之下,只是实现了低代码编程。

现在越来越多的公司都在进行微前端的落地和应用,微前端主要技术方向有 Mooa、Single-SPA、Web Components、Vue 等开源前端框架,在此不做赘述。

IT 资源受限。在资源受限的情况下,能快速开发出符合业务需求的应用最重要。

若是想真实的无代码编程,则需要一些更特定的场景:

微前端是前端建设的一个非常重要的方向和关注点,通过微前端的集成模式可以减轻系统开发的复杂度,降低前端集成的难度。它的主要价值和意义如下:

而从流程上来看,对于一部分的应用来说,我们并不能实现无代码编程——存在一些业务上的不同之处。因此,多数场景之下,只是实现了低代码编程。

设计表格

前端集成简单:前端项目只需关注前端集成主页面与微前端的集成,不涉及到 API 集成和中台技术实现细节,可真正实现模块化集成,实现拼图式的开发,降低前端集成的复杂度和成本。

若是想真实的无代码编程,则需要一些更特定的场景:

创建报告

项目职责专一:中台项目从数据库、中台到微前端界面端到端地完成领域逻辑功能开发,确保领域业务单元内从前端到后端可用。由于团队职责专一,项目成员都熟悉团队内的业务和技术,从而降低开发过程因为沟通和集成出问题的风险。

设计表格(输入数据)

常规调度和自动化过程

隔离和依赖性:每个团队都有自己的关注点,各关注点边界清晰,相互隔离,风暴都在茶壶内。业务单元在代码、逻辑和物理边界都是隔离的,降低应用之间的依赖性。在出现问题时可实现快速问题定位和修复,并可将风险控制在一个业务单元内,不会影响其他业务单元的正常运行。版本发布过程中不会影响其它业务单元的正常运行。

创建报告(组织数据)

更多的场景正在探索中。

降低沟通和测试成本:一个中台项目团队从前端页面到后端中台业务逻辑,实现从开发、测试、集成和部署的全流程和全生命周期管理,降低前后端集成的测试和沟通成本。

常规调度和自动化过程(操纵数据)

无代码编程,除了需要准备好上述的一系列基础设施,还不可避免地会遇到一系列挑战。

更敏捷的发布:由于应用之间的隔离和依赖性降低,每一个小的变化都控制在业务单元内,项目团队可以独立按照自己的步调进行迭代开发,实现更快的发布周期。

更多的场景正在探索中。

谁来写这部分代码?

降低技术敏感性:由于前端项目主要关注微前端的集成和前端技术,屏蔽了前端对中台技术的要求,从而降低了前端项目技术的敏感性。在降低前端集成复杂度的同时,中台项目可以更便捷的选择和尝试更多更合适的技术和架构,实现架构的演进。

无代码编程的挑战

客户端的基础设施准备。

高度复用性:微前端和业务中台都有高度的复用性。微前端可快速按需加载到前端集成主页面,或将微前端直接发布成 APP,实现快速发布。某些场景一个微前端就是一个 APP 应用。

无代码编程,除了需要准备好上述的一系列基础设施,还不可避免地会遇到一系列挑战。

服务端的服务平台搭建。

(本文章转载自infoq, 如有侵权, 请联系作者删除)

谁来写这部分代码?

统一用户体验设计。设计出一系列能便利组合的组件,及对应的模板页面。与此同时,它们还能适应于不同的风格,即有多样性的主题支持。

客户端的基础设施准备。

DevOps 流水线设计。低代码编程,依赖于一系列的自动化工具,以实现构建、调试、部署以及维护,同时还包含应用的测试。

服务端的服务平台搭建。

领域语言设计。

统一用户体验设计。设计出一系列能便利组合的组件,及对应的模板页面。与此同时,它们还能适应于不同的风格,即有多样性的主题支持。

自动化测试。如果我们的前端代码是自动生成的,那么我们还需要对它们进行测试吗?这是一个好问题,而如果代码是自动生成的,那么测试也应该是自动生成的。毕竟要在平台上,编写大量的自动化测试,以保证平台的质量。

DevOps 流水线设计。低代码编程,依赖于一系列的自动化工具,以实现构建、调试、部署以及维护,同时还包含应用的测试。

其中,有一些部分略微复杂一些,我们大概可以探索一下。

领域语言设计。

在我们创建这样一个平台和工具时,我们要考虑的第一个问题是,这个工具是为谁写的?

自动化测试。如果我们的前端代码是自动生成的,那么我们还需要对它们进行测试吗?这是一个好问题,而如果代码是自动生成的,那么测试也应该是自动生成的。毕竟要在平台上,编写大量的自动化测试,以保证平台的质量。

没有编程经验的人。如业务人员,他/她们对于业务系统有着非常丰富的经验。

其中,有一些部分略微复杂一些,我们大概可以探索一下。

有编程知识,但是没有经验的人。

谁来写这部分代码?

有一定经验的开发人员。

在我们创建这样一个平台和工具时,我们要考虑的第一个问题是,这个工具是为谁写的?

有丰富经验的开发人员。对于专业的人来说,自动化就意味着缺少灵活度。甚至与自己编写相比,他们要花费更多的时间来修复生成的代码。

没有编程经验的人。如业务人员,他/她们对于业务系统有着非常丰富的经验。

显然,对于相当有经验的开发人员而言,这个工具并不一定是他们所需要的。

有编程知识,但是没有经验的人。

从我的理解来看,它适合于快速的 MVP 构建,并且生成的代码还应该方便修改,而不是诸如早期的 DreamWeaver 或者 FrontPage 这样的工具。

有一定经验的开发人员。

而与此同时,由于面向的开发人员水平不同,我们所需要做的工具也不同:

有丰富经验的开发人员。对于专业的人来说,自动化就意味着缺少灵活度。甚至与自己编写相比,他们要花费更多的时间来修复生成的代码。

支持云构建和调试。

显然,对于相当有经验的开发人员而言,这个工具并不一定是他们所需要的。

GUI 编程应用。

客户端基础设施

代码生成。

从我的理解来看,它适合于快速的 MVP 构建,并且生成的代码还应该方便修改,而不是诸如早期的 DreamWeaver 或者 FrontPage 这样的工具。

设计系统体系构建。组件库搭建,模板应用创建等。

而与此同时,由于面向的开发人员水平不同,我们所需要做的工具也不同:

更难的是,容易让开发人员能接受代码生成。

支持云构建和调试。

对于一个低代码平台而言,它对应的后端应该:

GUI 编程应用。

大量可用的现有服务。身份验证、安全性、推送能力、地图等等。

代码生成。

快速构建出后端服务。若是有内部 Serverless 或者 FaaS 方案,可以说是再好不过了。

设计系统体系构建。组件库搭建,模板应用创建等。

方便与第三方服务集成。

更难的是,容易让开发人员能接受代码生成。

灵活性。支持多语言等。

服务端

统一的后端服务 API,对于后端服务来说,我们需要一个通用的范式。所有的 API 应该按照这样的范式来设计。不过,作为一个 API 的消费方,我们可能没有这么大的权力,但是我们可以采用装饰器模式,即封装第三方 API 成统一的方式。为此,我们采用的方式,仍然是:

对于一个低代码平台而言,它对应的后端应该:

契约。诸如 Swagger UI,它可以直接创建一个简易可用的服务。

大量可用的现有服务。身份验证、安全性、推送能力、地图等等。

BFF。即我们一一去按我们的需要,去封装这些第三方应用。

快速构建出后端服务。若是有内部 Serverless 或者 FaaS 方案,可以说是再好不过了。

查询语言。与自己编写 BFF 相比,更简单的方式是采用:GraphQL 这样的后端查询语言,便捷性更高、模式更加灵活。

方便与第三方服务集成。

在开发前的设计期里,我们需要首先设计出对应的领域模型。

灵活性。支持多语言等。

低代码环境使用建模语言来指定整个系统、产品的行为。它意味着:

统一的后端服务 API,对于后端服务来说,我们需要一个通用的范式。所有的 API 应该按照这样的范式来设计。不过,作为一个 API 的消费方,我们可能没有这么大的权力,但是我们可以采用装饰器模式,即封装第三方 API 成统一的方式。为此,我们采用的方式,仍然是:

将数据结构、领域模式应用到程序的各个层级中。

契约。诸如 Swagger UI,它可以直接创建一个简易可用的服务。

将业务规则、决策融入到应用中。

BFF。即我们一一去按我们的需要,去封装这些第三方应用。

这也就意味着,我们需要设计一个模型语言。而它对于我们而言,实际上是领域特定语言。如下是一个简单的 DSL 示例,用于描述使用到的组件:

查询语言。与自己编写 BFF 相比,更简单的方式是采用:GraphQL这样的后端查询语言,便捷性更高、模式更加灵活。

{'style':'','id': 2,'blocks':

[{'content': {'content':'content','title':'hello'},'type':'card'}]

}

在开发前的设计期里,我们需要首先设计出对应的领域模型。

除此,我们还需要设计对应的布局 DSL,诸如于:

领域语言设计

H:[circle1(circle1.height)] // set aspect-ratio for circle1

HV:[circle2..5] // use same width/height for other circles

H:|[circle1]-[circle2]-[circle3]-[circle4]-[circle5]|

V:|~[circle1..5]~| // center all circles vertically

低代码环境使用(图形)建模语言来指定整个系统、产品的行为。它意味着:

最后,我们还需要将流代码,转换为真实的项目代码。三种类型的 DSL 结合下来,都不是一个轻松的工具。

将数据结构、领域模式应用到程序的各个层级中。

写好现有的组件,通用型接口。如常见的登录接口,对于使用登录接口的业务来说,它们只关心三部分的内容:

将业务规则、决策融入到应用中(层级)。

成功登录。

这也就意味着,我们需要设计一个模型语言。而它对于我们而言,实际上是领域特定语言(DSL)。如下是一个简单的 DSL 示例,用于描述使用到的组件:

取消登录。

{'style': '','id': 2,'blocks': [{'content': {'content': 'content','title': 'hello'},'type':'card'}] }

登录失败。对于客户端而言,可以视为取消登录。对于服务端来说,则可能是密码错误、用户名不存在、账号被锁定等。

除此,我们还需要设计对应的布局 DSL,诸如于:

对应于以上情景,又有一些通用的逻辑处理:

H:[circle1(circle1.height)] // set aspect-ratio for circle1HV:[circle2..5(circle1)] // use same width/height for other circlesH:|[circle1]-[circle2]-[circle3]-[circle4]-[circle5]|V:|~[circle1..5]~| // center all circles vertically

登录成功。保存 Token,并返回历史页面。

最后,我们还需要将流代码,转换为真实的项目代码。三种类型的 DSL 结合下来,都不是一个轻松的工具。

登录失败。弹出一个自定义内容的提示框。

原型设计

这些代码是相似的。

写好现有的组件,通用型接口。如常见的登录接口,对于使用登录接口的业务来说,它们只关心三部分的内容:

前端原型

成功登录。

在一些简单的前端应用里:

取消登录。

模板。只是在使用这些模板,再为这些模板设置相应的属性,绑定对应的值。

登录失败。对于客户端而言,可以视为取消登录。对于服务端来说,则可能是密码错误、用户名不存在、账号被锁定等。

数据。其过程都只是在各种保存变量的值,并 CRUD 这些变量的路上。为此,我们需要一个数据处理的管道架构设计,用于处理这些值。

对应于以上情景,又有一些通用的逻辑处理:

函数。事实上,我们的所有函数都只是一些管理函数,只用于处理这些对应的逻辑。

登录成功。保存 Token,并返回历史页面。

这些常见的功能都可以做成一些组件,它们对于某些应用来说,代码相应的重复。

登录失败。弹出一个自定义内容的提示框。

无限加载页面。只需要绑定上 API,再控制一下元素的显示与隐藏即可。

这些代码是相似的。

表单。定义好字段即类型,对应的前后台逻辑都有了。除此,我们还需要为它们自定义好常见的规则,如正则表达式。而一旦表单之间有联动,那么这个组件的设计就更加麻烦了。

前端原型

卡片式元素。

在一些简单的前端应用里:

表单和表格展示。

模板。只是在使用这些模板,再为这些模板设置相应的属性,绑定对应的值。

常见图表。事实上,已经有一系列的图表工具了,我们只是在它们在基础上,进行了二次封装而已——使得它们可以变成领域语言的形式。

数据。其过程都只是在各种保存变量的值,并 CRUD 这些变量的路上。为此,我们需要一个数据处理的管道架构设计,用于处理这些值。

高级的响应式布局。与每个应用独立开发布局不同的是,低代码平台需要提供一套强大的自定义、响应式布局设计——即要满足移动端的通用模式,还要满足桌面版的通用模式。如对于大量数据来说,桌面端使用的是 Pagination,移动端使用的是无限滚动。

函数。事实上,我们的所有函数都只是一些管理函数,只用于处理这些对应的逻辑。

后端原型

这些常见的功能都可以做成一些组件,它们对于某些应用来说,代码相应的重复。

事实上,对于后端来说,低成本平台意味着,代码生成及服务生成。而服务本身是有限的,既然是业务上发生了一些变化,后端服务也可能并不会发生变化。

无限加载页面。只需要绑定上 API,再控制一下元素的显示与隐藏即可。

它也意味着:

表单。定义好字段即类型,对应的前后台逻辑都有了。除此,我们还需要为它们自定义好常见的规则,如正则表达式。而一旦表单之间有联动,那么这个组件的设计就更加麻烦了。

微服务化。每个后端服务要尽可能的小。

卡片式元素。

API 规范化。即采用统一的 API 格式,接受统一的权限管理

表单和表格展示。

大量的 API 服务。

常见图表。事实上,已经有一系列的图表工具了,我们只是在它们在基础上,进行了二次封装而已——使得它们可以变成领域语言的形式。

快速集成第三方服务方案。集成第三方服务是开发应用不可避免的情况。为了应对这个问题,我们需要做准备好对应的创建服务逻辑,传入第三方服务所需要的参数,便可以直接生成我们的转发服务。

高级的响应式布局。与每个应用独立开发布局不同的是,低代码平台需要提供一套强大的自定义、响应式布局设计——即要满足移动端的通用模式,还要满足桌面版的通用模式。如对于大量数据来说,桌面端使用的是 Pagination,移动端使用的是无限滚动。

那么,问题来了,既然如此,我们是否能提供一个定制的工具呢?让每个人可以创建自己的组件流?

后端原型

答案,显然是可以的。

事实上,对于后端来说,低成本平台意味着,代码生成及服务生成。而服务本身是有限的,既然是业务上发生了一些变化,后端服务也可能并不会发生变化。

于是乎,在我最近设计的 PoC 里,采用的是 Anguar 框架。相应的基本思想如下:

它也意味着:

使用 Material Design 作为组件库,使用 CDK 的 Drag 来实现拖拽功能。每个拖拽的组件,称为 Element,由 ElementDispatcher 由根据数据生成对应的组件。可拖拽的部分由两部分组成:布局 元素。

微服务化。每个后端服务要尽可能的小。

UI 构建完后,生成对应的 DSL,目前采用的是 JSON。毕竟数据结构是最简单的领域特定语言。

API 规范化。即采用统一的 API 格式,接受统一的权限管理

借由 Angular Schematics 解析这部分的 DSL,来生成相应的项目代码。

大量的 API 服务。

觉得不错请点赞支持,欢迎留言或进我的个人群855801563领取【架构资料专题目合集90期】、【BATJTMD大厂JAVA面试真题1000 】,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不定期答题、探讨。

快速集成第三方服务方案。集成第三方服务是开发应用不可避免的情况。为了应对这个问题,我们需要做准备好对应的创建服务逻辑,传入第三方服务所需要的参数,便可以直接生成我们的转发服务。

那么,问题来了,既然如此,我们是否能提供一个定制的工具呢?让每个人可以创建自己的组件流?

答案,显然是可以的。

概念证明

于是乎,在我最近设计的 PoC (概念证明)里,采用的是 Anguar 框架。相应的基本思想如下:

使用 Material Design 作为组件库,使用 CDK 的 Drag 来实现拖拽功能。每个拖拽的组件,称为 Element(元素),由 ElementDispatcher 由根据数据生成对应的组件。可拖拽的部分由两部分组成:布局 元素。

UI 构建完后,生成对应的 DSL,目前采用的是 JSON。毕竟数据结构是最简单的领域特定语言。

借由 Angular Schematics 解析这部分的 DSL,来生成相应的项目代码。

相关开源项目:

拖拽式 Web 建造工具:基于 Flow 的编程工具: 布局生成器:可视化数据流编辑器:基于 React 的内容生成器:-kurtz

来自:_44801979/article/details/88998256

编辑:亚洲城ca88唯一官方网站 本文来源:技士要无业了,中台微服务了

关键词: 亚洲城ca88