企業級微服務架構設計實踐需要從宏觀到微觀層面的思考,主要分為業務架構、應用架構、技術架構和開發設計方法論。
一、業務架構思考
要建設企業的信息系統首先要明確系統的需求,而要制定系統需求則首先要明確系統對于企業來講要解決哪些問題,哪些參與對象以及如何參與,然后再考慮如何使用信息化手段來優化提升生產力,這就是業務架構需要解決的問題。
1. 業務領域識別
主要明確業務操作的業務主體,業務功能,和業務邊界,這里是對業務功能的理解與設想。業務領域的理解需要使用領域驅動設計的思想做戰略層面的設計,明確各領域的職責,劃分好領域的邊界。
領域的劃分并沒有一個統一的標準,是根據企業的實際情況綜合利弊而得出的,主要的原則是高內聚低耦合,將此業務領域強關聯的業務包括進來,將其它領域的業務剝離出去。對于一些模棱兩可的業務歸屬,需要認真對待,分析業務結果的本質再去判斷如何歸屬。如果出現太多的類似業務存在,需要考慮之前的業務領域的識別是否正確。
業務領域功能設計是一個持續的過程,是應該有一個能力地圖的,是有對此領域所提供的能力有一個長線的規劃。只有這樣才能當某項業務操作流程出現的時候才清楚如何去設計功能歸屬。
2. 業務流程梳理
業務流程形象的表述就是多個業務操作之間業務結果的傳遞。從整個業務系統的宏觀層面上看,業務結果是在各業務領域間傳遞的,業務流程的設計需要保持業務結果的獨立性和復用性,對傳遞方式要求規范性和通用性。從業務領域的微觀層面上看,業務結果是在各業務操作間傳遞的,業務流程的設計需要保持簡便性。
3. 業務模型建設
這部分是業務架構的價值所在,深刻認識業務領域作用,透視眾多業務流程,理清業務操作本質,把握業務發展軌跡,形成業務建設原則,構建業務架構模型。
業務的抽象需要深刻理解業務操作背后的業務邏輯,切勿簡單地去實現現有的需求,充分考慮業務模型的通用性和多變性,去適配未來業務的不斷發展。需求細節的變化是多種多樣的,但為了實現目標的述求基礎上是不變的,應從此出發,站在業務解決問題的角度出發來建立業務模型。
二、應用架構思考
應用架構需要定義整個產品有哪些業務系統,它們是如何集成的,內部是怎么劃分的,它們是怎么聯系起來的。
1.應用劃分
- 業務需求 :應用的劃分很大程度來源于業務架構的分析,是業務模型的結果顯現。
- 技術現狀 :考慮到實際技術的支撐情況,需要去平衡性能與穩定性的要求。一些應用服務的特點是業務簡單,響應容忍度低,受眾面廣,穩定性高;一些應用服務的特點是業務復雜,響應容忍度高,受眾面小,有接受一定的故障率。
- 物理環境 :在一些復雜的網絡環境中,可能會出現一些服務需要和不同網絡環境中的其它服務進行交互的需求,從而導致應用的拆分。
- 安全要求 :應用服務中所涉及的安全等級有可能不一樣,有一些是對外的服務,有一些是對內的API,它們的安全認證方式也不一樣。
- 系統迭代 :由于系統的不斷升級可能會出現不兼容的情況,由于人員的更迭老版本維護起來越來越吃力,由于技術架構的革新出現不適配的情況
2. 應用交互
主要包括兩種方式,一種是阻斷式的同步方式,強關聯操作;另一種是觸發式的異步方式,是弱關聯操作。
2.1 強關聯交互
用于流程操作中必需的步驟,強一致性,主要使用遠程接口調用。此種方式要求調用與被調用方都必須及時響應,反應迅速,系統耦合度較高,執行流程較復雜。在系統設計中盡量減少此類方式的調用,必須調用時需要關注被調用方的響應時間。
2.2 弱關聯交互
用于流程操作中本應用不關心的其它操作,應用只需要把消息發出,需要使用此消息的應用進行訂閱,主要使用消息中間件。此種方式使用的是異步方式,不要求訂閱方及時響應,系統耦合度低,默認情況下沒有一致性要求,可實現最終一致性。在系統設計中盡量使用此類方式,以便提高整個系統的響應速度和結構的穩定性。
2.3 消息傳輸的形式
行為標識的傳輸 :包括行為對象的類型,行為對象的狀態以及行為對象的標識代碼
{"code":"XP0000000000000D6001","notice":"PRODUCT","noticeAction":"MODIFY"}
這種方式傳輸的內容簡單,量小,格式統一,訂閱方接收到消息后需要再次通過遠程接口查詢行為對象,此處結果可以制定化,但增加了額外的調用開銷且需要保持雙方通訊穩定性
行為對象的傳輸 :傳遞的內容是整個行為對象,而行為的識別可由消息路由去配置
{"code":"XP0000000000000D6001","name":"XXX","statue":"MODIFY","id":"XXX" ...}
這種方式傳輸的內容體積較大,格式不一致,訂閱方接收到消息后可直接得到行為對象,無須再次請求接口,但行為對象的格式是固定的,無法制定化,為了適配更多的訂閱方需求往往需要把整個對象傳遞出去,傳輸消耗大,如果消息在消息服務器中堆積較多可能嚴重影響服務器性能。
兩種形式有不一樣的應用場景,可根據需要選擇。一般情況下如果行為對象本身內容較小,為了避免二次請求可以直接傳輸行為對象,如果行為對象內容較大,可只傳輸行為標識。