首先對項目拆分, 根據業務服務內容拆分項目, 最終結果是一堆dll. 相關的dll組合起來服務一項業務功能, 稱為模塊. 如果單獨部署, 則為一個微服務模塊.
這樣先拆分模塊之后根據具體項目配給的人力物力進行最終的部署: 哪些模塊作為獨立服務部署, 哪些模塊組合成一個服務部署.
這里的模塊所指的都是業務模塊. 結構如圖:
於是模塊化的微服務需要的幾個基礎功能就顯現出來了:
一 模塊的生命周期
一個模塊接入服務中需要監聽幾個生命周期事件, 初始化\配置\啟動\停止...也可以作為一個基類由繼承模塊重寫. 這樣一個模塊的基礎定義完成.
二 模塊間的接口調用
模塊內部有各種ApplicationService, 各個service之間通過接口IApplicationService進行調用.
於是, 對於host中有接口實現的則調用具體實現, 約等於直接調用. 對於分為兩個host部署的模塊, 自己host中不含接口具體實現的, 通過接口代理走服務發現\負載均衡\遠程請求進行調用.
這里的關鍵是需要實現一個代理所有IApplicationService的接口調用代理類型. 目前我調查和使用過的是Autofac和AspectCore, 都可以. Autofac是基於Castle.DynamicProxy, AspectCore則是它的AspectCore.DynamicProxy組件, 可以單獨使用組件. 個人喜歡單獨使用Castle.DynamicProxy, 不需要更換asp.netcore的自帶容器.
三 事件
與接口調用類似, 事件也需要分為模塊內事件和分布式事件兩種.
內部事件派發很簡單, 跟普通事件類似, 走內存. 分布式事件可以依賴RabbitMQ等, 類庫有CAP\Masstransit.
四 其他分布式需要的功能
如服務注冊/發現/分布式事務等, 這是屬於微服務(分布式)帶來的問題, 無論模塊化與否都存在.