如何通过合理的设计,实现一个易用的编排框架

上一篇文章我们讲了流程编排框架的背景,做了需求分析,包括功能性需求和非功能性需求,这是正式设计开始之前的铺垫。

前面提到,实际项目分为分析、设计、实现、测试。 分析环节和面向对象分析很相似,都是需求排序。 但时间项目的设计和实施并不是一回事。 这里的“设计”是指系统设计,主要是划分模块、设计模块。

我们主要分为模型定义、流程加载、流程分析、集成使用四个模块来阐述编排框架的设计思想。 今天讲解的重点是如何实现一个易用、易扩展、灵活、低延迟、高容错等非功能性需求的编排框架。

型号定义

框架需要定义服务模型,包括请求参数、输出参数、临时变量、流程定义和节点定义。

请求参数:流程需要定义输入参数的基类。 开发过程中,请求参数DTO需要继承这个DTO;

输出参数:流程需要定义输出参数的基类,开发过程中响应参数DTO需要继承这个DTO;

临时变量:用于进程执行过程中的上下文管理,包括EL表达式解析变量以及进程间的参数轮换;

流程定义:需要定义流程标识ID来标识流程,流程名称用于定义流程别名,请求参数用于定义流程的统一输入DTO,输出参数用于定义流程的统一响应DTO,临时变量用于上下文管理,流程描述。 用于描述整个流程的功能项目框架拆解流程,流程节点用于以Map的形式保存所有节点;

节点定义:需要定义节点ID来标识节点,节点名用于定义节点别名,请求参数用于定义流程的统一输入DTO,输出参数用于定义统一的流程DTO。流程的响应DTO,节点描述用于描述整个流程的作用。 节点类型用于不同的节点类型包括方法节点、bean节点、服务节点、条件节点等。下一个节点标识使用递归执行节点,组件内容具体指向执行节点。

这些模型之间有什么直接关系呢? 整个流程模型是一个包含关系。 流程定义=请求参数+输出参数+临时变量+节点定义+自定义属性; 节点定义=请求参数+输出参数+自定义属性; 我们在日常开发流程中需要定义请求参数和输出参数,分别集成请求参数和输出参数的基类,并通过配置文件加载流程定义,这意味着我们在运行时只会使用流程定义模型阶段。 定义如下:

姓名:

id: 测试

图片[1]-如何通过合理的设计,实现一个易用的编排框架 - fyxm-专注于分享与收集全网优质资源-fyxm-专注于分享与收集全网优质资源

desc:条件执行

输入:mon.model。

:mon.型号。

温度:mon.model。

:节点1

节点:

-节点:

ID:节点1

姓名:

: .: 测试1

desc: 单节点执行

输入:mon.model。

类型:

下一个:节点2

-节点:

ID:节点2

姓名:

: : 测试2

desc: 单节点执行

输入:mon.model。

类型: 豆类

下一个:节点3

-节点:

ID:节点3

图片[2]-如何通过合理的设计,实现一个易用的编排框架 - fyxm-专注于分享与收集全网优质资源-fyxm-专注于分享与收集全网优质资源

姓名:

:年龄>20:节点4,年龄

desc: 单节点执行

类型:

-节点:

ID:节点4

姓名:

: : 测试4

desc: 单节点执行

输入:mon.model。

类型: 豆类

-节点:

id: 节点5

姓名:

: : 测试5

desc: 单节点执行

输入:mon.model。

类型: 豆类

进程加载

首先我们需要确定流程的几个来源,可能是定义的yml、xml、json或者; 那么我们的设计必须支持流程模型的可扩展性。 无论模型如何初始化,只要能够转换为流程定义,无论任何方法都可以,并且完全取决于可扩展性要求;

当然,我们也会提供默认的进程加载方式。 这里我们以yml格式为例。 首先我们需要定义一个yml流程文件。 示例如下。 添加 test.flow.yml 文件。 为了考虑文件路径定制,我们还需要将扫描包做成可配置的功能,模式为:flow/*.flow.yml;

平台首先需要定义一个流程注册接口。 加载进程模型用于实现进程注册。 通过平台的机制将流程模型加载到流程管理器后,我们需要解析定义的yml流程为具体的实现类。 当然,规范必须严格遵循yml格式定义; 加载过程中必须有异常处理机制。 例如,如果定义的节点和参数不存在,则必须重复定义过程; 每个模型的异常处理完全由平台控制。

考虑到编写流程文件的方便性,需要提供一种机制,在应用程序初始化过程中将所有DTO和基本组件加载到组件模型中。 定义流程文件时无需定义完整路径,通过注册的bean 映射到具体的实现组件,这样的编排文件变得更加简单。

工艺分析

图片[3]-如何通过合理的设计,实现一个易用的编排框架 - fyxm-专注于分享与收集全网优质资源-fyxm-专注于分享与收集全网优质资源

我们将节点分为方法节点、bean节点、服务节点、条件节点、循环节点和子流程节点。 我们来谈谈主要设计;

步骤1:获取进程ID,并在定义的进程上下文中获取进程模型。 如果无法获取对应的进程,则会抛出对应的异常;

步骤2:处理主流程。 在处理主流程的时候项目框架拆解流程,我们需要执行流程并计时。 通过解析请求参数和输出参数,将上下文实例化为对象; 加载所有流程节点并找到第一个定义的流程节点。 ;

步骤3:节点解析。 根据定义的类型,我们可以知道需要什么样的节点解析器来处理;

第四步:节点处理,方法节点很简单,通过反射机制调用基础组件; bean节点比方法节点多了一个bean到类的映射,并且组件也是通过反射执行的; 条件节点通过EL表达式进行匹配,可以通过多种方式配置同时满足if else场景和when case场景的条件; 服务节点需要我们定制SDK,定义一个不依赖任务容器、需要在模块中实现的轻量级框架;

步骤5:流程节点执行完毕后,会获取下一个节点,然后递归调用,有多少个节点就调用多少次,直到没有下一个节点标识为止;

第6步:执行情况统计,包括耗时和响应参数;

第七步:异常处理机制,全局可定制的异常处理机制,可以在流程发生异常时回滚操作;

综合使用

我们的框架参考了低侵入、松耦合的设计思想。 编排框架也应该满足这个设计思想。 因为框架需要集成到应用程序中,所以我们希望框架尽可能具有侵入性,与业务代码松散耦合,并且更容易替换和删除。 我们基于框架进行集成,并提供依赖组件。

相关资源:微服务编排引擎.zip_微服务流程引擎、流程编排…

—————————————————

版权声明:本文为CSDN博主“吉贤”原创文章,遵循CC 4.0 BY-SA版权协议。 转载时请附上原文出处链接及本声明。

原文链接:

© 版权声明
THE END
喜欢就支持一下吧
点赞2845 分享