關(guān)于Netflix Conductor的簡介和Demo使用,我已經(jīng)在深入淺出Netflix Conductor使用文章中做了詳細(xì)說明,從本文開始將深入分析Conductor的源碼以及原理期待能夠給喜歡Conductor的同學(xué)一些指導(dǎo)和建議。
一、Conductor源碼總體介紹
從github(https://github.com/Netflix/conductor/)上面check源碼后在idea界面上展示,如圖1-1所示:

圖1-1
從圖中可以看到整個(gè)項(xiàng)目使用的是gradle進(jìn)行項(xiàng)目管理的并且項(xiàng)目默認(rèn)采用的是從jcenter倉庫(http://jcenter.bintray.com)jar包下載非常慢,于是采用了阿里云的倉庫,但是目前在企業(yè)開發(fā)過程中普遍使用的是maven來管理項(xiàng)目于對(duì)項(xiàng)目結(jié)構(gòu)進(jìn)行了轉(zhuǎn)換,變成了maven結(jié)構(gòu),git地址如下:http://git.hualala.com/infrastructure/hualala-conductor
項(xiàng)目結(jié)構(gòu)如圖1-2所示:

圖1-2
說明:
- admin層
由于Conductor采用的是DSL來做流程定義,但是沒有可視化界面需要使用者每次自己手動(dòng)書寫流程定義,這樣對(duì)使用者的要求就比較高必須要先非常熟悉定義格式才能進(jìn)行編寫,同時(shí)沒有校驗(yàn)機(jī)制不知道寫的是不是正確,同時(shí)寫完流程格式定義文件后還需要自己手動(dòng)上傳到swagger管理界面中才能被server識(shí)別,所以基于此我們二次開發(fā)了一個(gè)模塊admin,我們提供了界面通過在界面中簡單填寫數(shù)據(jù)生成DSL文件同時(shí)能夠自動(dòng)上傳到swagger管理界面中。 - client層
Conductor的使用場(chǎng)景是服務(wù)編排,必然會(huì)涉及client和server端也就是說在我們的微服務(wù)中的服務(wù)中可以使用client端來和conductor的server端進(jìn)行通信,根據(jù)不同狀態(tài)來執(zhí)行相應(yīng)任務(wù)。 - common層
這一層主要涉及的是Task任務(wù)和Workflow工作流的元數(shù)據(jù)和請(qǐng)求參數(shù)定義,還有一些工具類。 - core層
這一層主要包括的是核心類,包括:事件、隊(duì)列功能類,還包括任務(wù)類型定義、每種類型任務(wù)的具體實(shí)現(xiàn)邏輯和映射關(guān)系,比如分支條件如何進(jìn)行判斷,邏輯表達(dá)式如何解析,并行任務(wù)如何執(zhí)行等等。 - jersey層
這個(gè)主要提供的是Swagger接口展示層,通過啟動(dòng)這個(gè)模塊可以看到一個(gè)接口列表頁面,用戶可以在界面上操作接口實(shí)現(xiàn)任務(wù)和工作流元數(shù)據(jù)的編寫和上傳,還可以在界面上啟動(dòng)工作流引擎等。 - es-persistence
這一層主要是持久層,根據(jù)請(qǐng)求版本不同包括es5和es2二個(gè)模塊,作用主要包括將任務(wù)和工作流元數(shù)據(jù)保存到es中,還有就是將任務(wù)運(yùn)行時(shí)數(shù)據(jù)進(jìn)行保存,比如任務(wù)執(zhí)行的狀態(tài),執(zhí)行時(shí)間等等。 - mysql-persistence
mysql持久層,存儲(chǔ)任務(wù)和工作流定義的元數(shù)據(jù)。 - redis-persistence
redis持久層,存儲(chǔ)任務(wù)和工作流定義的元數(shù)據(jù)。 - server層
負(fù)責(zé)conductor server端的啟動(dòng)、工作流任務(wù)的啟動(dòng),由server層調(diào)用core層實(shí)現(xiàn)分布式狀態(tài)機(jī)控制和任務(wù)的調(diào)度。 - UI層
可視化任務(wù)管理界面,通過該界面能夠看到任務(wù)和工作流定義的元數(shù)據(jù)和圖形展現(xiàn),以及工作流執(zhí)行的狀態(tài)情況。