關于Netflix Conductor的簡介和Demo使用,我已經(jīng)在深入淺出Netflix Conductor使用文章中做了詳細說明,從本文開始將深入分析Conductor的源碼以及原理期待能夠給喜歡Conductor的同學一些指導和建議。
一、Conductor源碼總體介紹
從github(https://github.com/Netflix/conductor/)上面check源碼后在idea界面上展示,如圖1-1所示:
圖1-1
從圖中可以看到整個項目使用的是gradle進行項目管理的并且項目默認采用的是從jcenter倉庫(http://jcenter.bintray.com)jar包下載非常慢,于是采用了阿里云的倉庫,但是目前在企業(yè)開發(fā)過程中普遍使用的是maven來管理項目于對項目結構進行了轉換,變成了maven結構,git地址如下:http://git.hualala.com/infrastructure/hualala-conductor
項目結構如圖1-2所示:
圖1-2
說明:
- admin層
由于Conductor采用的是DSL來做流程定義,但是沒有可視化界面需要使用者每次自己手動書寫流程定義,這樣對使用者的要求就比較高必須要先非常熟悉定義格式才能進行編寫,同時沒有校驗機制不知道寫的是不是正確,同時寫完流程格式定義文件后還需要自己手動上傳到swagger管理界面中才能被server識別,所以基于此我們二次開發(fā)了一個模塊admin,我們提供了界面通過在界面中簡單填寫數(shù)據(jù)生成DSL文件同時能夠自動上傳到swagger管理界面中。 - client層
Conductor的使用場景是服務編排,必然會涉及client和server端也就是說在我們的微服務中的服務中可以使用client端來和conductor的server端進行通信,根據(jù)不同狀態(tài)來執(zhí)行相應任務。 - common層
這一層主要涉及的是Task任務和Workflow工作流的元數(shù)據(jù)和請求參數(shù)定義,還有一些工具類。 - core層
這一層主要包括的是核心類,包括:事件、隊列功能類,還包括任務類型定義、每種類型任務的具體實現(xiàn)邏輯和映射關系,比如分支條件如何進行判斷,邏輯表達式如何解析,并行任務如何執(zhí)行等等。 - jersey層
這個主要提供的是Swagger接口展示層,通過啟動這個模塊可以看到一個接口列表頁面,用戶可以在界面上操作接口實現(xiàn)任務和工作流元數(shù)據(jù)的編寫和上傳,還可以在界面上啟動工作流引擎等。 - es-persistence
這一層主要是持久層,根據(jù)請求版本不同包括es5和es2二個模塊,作用主要包括將任務和工作流元數(shù)據(jù)保存到es中,還有就是將任務運行時數(shù)據(jù)進行保存,比如任務執(zhí)行的狀態(tài),執(zhí)行時間等等。 - mysql-persistence
mysql持久層,存儲任務和工作流定義的元數(shù)據(jù)。 - redis-persistence
redis持久層,存儲任務和工作流定義的元數(shù)據(jù)。 - server層
負責conductor server端的啟動、工作流任務的啟動,由server層調用core層實現(xiàn)分布式狀態(tài)機控制和任務的調度。 - UI層
可視化任務管理界面,通過該界面能夠看到任務和工作流定義的元數(shù)據(jù)和圖形展現(xiàn),以及工作流執(zhí)行的狀態(tài)情況。