博客地址git
在單體到微服務架構的遷移過程當中,咱們常常會問一個問題:在什麼狀況下我須要從單體中剝離一部分出來將其做爲一個微服務?答案有不少,其中有一個答案就是:我發現好多單體都有類似的功能,我以爲能夠把它抽出來作一個公共服務。github
那麼何爲公共服務?公共服務就是那些專門爲其餘服務提供服務的服務,它的業務具備高度普適性和可複用性。好比用戶服務、訂單服務就是這樣一類服務。數據庫
那咱們怎樣才能達成這一目標呢?下面舉個例子說明:segmentfault
咱們發現單體A、B、C中的具備高度類似的功能F,通過初步研究發現能夠抽取出一個公共服務P,因而立刻安排人員開發,而後上線、遷移。
一切彷佛會很順利,可是等等,這裏有太多風險和未經驗證的東西。那咱們應該怎麼作?架構
第一步:識別不兼容運維
咱們須要深刻到單體A、B、C的功能F的細節中去考察,雖然功能F在各個單體中的看起來差很少,可是細節是魔鬼。
畢竟這三個單體是獨立演進的,若是深刻細節,就會發現AF、BF、CF總有一些不兼容的地方,具體表現形式能夠是數據schema不一致、接口不一致,還有更糟糕的——部分業務邏輯不一致。分佈式
這些不兼容若是一開始不識別出來,那最有可能的結果是開發人員從單體A中抽取功能F開發公共服務P,結果公共服務P只能給單體A使用,單體B、C徹底沒法使用。微服務
第二步:設計並導入概念post
識別出了不兼容,那麼咱們就須要做出一套兼容單體A、B、C的功能F的設計,在設計過程當中咱們須要和單體A、B、C的產品經理、需求設計人員、開發人員作詳盡的溝通。
作這些溝通最主要的目的就是將新的功能F的設計導入到相關人員的腦中,即所謂的概念導入。加密
概念導入是很是重要的一步,道理很簡單,若是你們對同一件事情的認知是同樣的,那麼這件事情就好辦了,不然在推行過程當中極可能出現不可預料的阻力。
第三步:開發類庫
好了,我們設計也作了,思想也統一了,爲何不直接開始開發服務P呢?這是由於雖然咱們在第二步已經統一了思想,可是在真正落地的時候極可能還會存在乎想不到的困難。
所以咱們要把這些困難在早期趟平,用的辦法就是提供功能F的公共類庫,將其替換掉原來單體A、B、C中的代碼。
這一工做完成後我能可以獲得的成果有:
也就是說,咱們作到了表裏一致,有了這個基礎,開發公共服務P纔有了真正堅實的基礎。
第四步:微服務架構設計
公共類庫的思路畢竟仍是單體應用的思路,只是作到了代碼層面的複用。當你要作公共服務P的時候就須要額外考慮一些額外的設計,好比:
固然以上這些並非說要一次性所有作到,能夠一開始只實現一部分,以後經過迭代不斷地完善。
第五步:遷移
好了,咱們的公共服務P已經上線了,那麼如何從公共類庫遷移到公共服務P呢?
其實到這一步就很簡單了,在製做公共類庫的時候咱們應該定義了良好的接口,而且提供了一套基於單體架構的實現。
如今咱們只需提供一套基於公共服務的實現而後替換上去就能夠了。舉個例子,公共類庫有一個接口叫作UserRepository
,它有一個實現是查詢本地數據庫的,咱們只需提供另外一個實現是查詢RESTful接口的就能夠了。
固然,這個查詢RESTful接口的實現最好也由公共服務P的開發團隊提供,這樣能夠避免單體A、B、C開發團隊的重複勞動。
第六步:沒有第六步
到此爲止大功告成。