关于Netflix Conductor的简介和Demo使用,我已经在深入浅出Netflix Conductor使用文章中做了详细说明,从本文开始将深入分析Conductor的源码以及原理期待能够给喜欢Conductor的同学一些指导和建议。
一、Conductor源码总体介绍
从github(https://github.com/Netflix/conductor/)上面check源码后在idea界面上展示,如图1-1所示:
从图中可以看到整个项目使用的是gradle进行项目管理的并且项目默认采用的是从jcenter仓库(http://jcenter.bintray.com)jar包下载非常慢,于是采用了阿里云的仓库,但是目前在企业开发过程中普遍使用的是maven来管理项目于对项目结构进行了转换,变成了maven结构,git地址如下:http://git.hualala.com/infrastructure/hualala-conductor
项目结构如图1-2所示:
说明:
- admin层
由于Conductor采用的是DSL来做流程定义,但是没有可视化界面需要使用者每次自己手动书写流程定义,这样对使用者的要求就比较高必须要先非常熟悉定义格式才能进行编写,同时没有校验机制不知道写的是不是正确,同时写完流程格式定义文件后还需要自己手动上传到swagger管理界面中才能被server识别,所以基于此我们二次开发了一个模块admin,我们提供了界面通过在界面中简单填写数据生成DSL文件同时能够自动上传到swagger管理界面中。 - client层
Conductor的使用场景是服务编排,必然会涉及client和server端也就是说在我们的微服务中的服务中可以使用client端来和conductor的server端进行通信,根据不同状态来执行相应任务。 - common层
这一层主要涉及的是Task任务和Workflow工作流的元数据和请求参数定义,还有一些工具类。 - core层
这一层主要包括的是核心类,包括:事件、队列功能类,还包括任务类型定义、每种类型任务的具体实现逻辑和映射关系,比如分支条件如何进行判断,逻辑表达式如何解析,并行任务如何执行等等。 - jersey层
这个主要提供的是Swagger接口展示层,通过启动这个模块可以看到一个接口列表页面,用户可以在界面上操作接口实现任务和工作流元数据的编写和上传,还可以在界面上启动工作流引擎等。 - es-persistence
这一层主要是持久层,根据请求版本不同包括es5和es2二个模块,作用主要包括将任务和工作流元数据保存到es中,还有就是将任务运行时数据进行保存,比如任务执行的状态,执行时间等等。 - mysql-persistence
mysql持久层,存储任务和工作流定义的元数据。 - redis-persistence
redis持久层,存储任务和工作流定义的元数据。 - server层
负责conductor server端的启动、工作流任务的启动,由server层调用core层实现分布式状态机控制和任务的调度。 - UI层
可视化任务管理界面,通过该界面能够看到任务和工作流定义的元数据和图形展现,以及工作流执行的状态情况。