讀【微服務設計】(三)如何建模服務

1. 好的微服務架構都具備什麼特點

應該具備兩個核心特點,松耦合、高內聚。這兩個核心特點應該是一種僅次於SOA概念層級的概念,不遵循(或不具備)這兩個核心特點的話,討論更多的細節都沒有什麼意義了,更不可能建設出一個優秀的微服務架構實踐了。

2. 松耦合

如果做到了服務之間的松耦合,那麼修改A服務就不需要修改B服務。使用微服務最重要的一點是,能夠獨立修改及部署單個服務而不需要修改系統的其他部分,這是非常重要的。

一個松耦合的服務,應該儘可能地少知道與之協作的那些服務的信息,一個小的實踐就是接口需要的參數儘可能的少。

3. 高內聚

我們希望把相關的行爲聚集在一起,把不相關的行爲放在別處。爲什麼?

因爲如果要改變某個行爲的話,最好能夠只在一個地方進行修改,然後就可以快速的發佈。如果同時需要修改多個服務,就得同時發佈多個微服務才能交付這個功能。這樣的結果就是修改起來慢,部署風險高,上線成本高,這幾點都是應當盡力避免的。

所以,找到問題域的邊界就可以確保相關的行爲能放在同一個地方(服務),並且他們會和其他邊界以儘量松耦合的形式進行通信。

4. 限界上下文

這一概念是在Eric Evans的《領域驅動設計》一書中提出的,Eric Evans認爲任何一個給定的領域都包含多個限界上下文CTX,每個CTX中的東西分成兩部分,一部分不需要與外界通信,另一部分則需要,一個CTX都有明確的接口,決定了哪些內容會暴露給其他的CTX。Eric Evans使用細胞膜比喻:“細胞之所以存在,是因爲細胞定義了什麼在細胞內,什麼在細胞外,並且確定了什麼物質可以通過細胞膜。”

例如一個公司包含一個倉庫部門和財務部分,倉庫部門負責發出的訂單以及退回的產品,還有新到的庫存,還需要保證剷車的正常運行等等。而財務部門負責的是公司的工資單和公司的賬戶,並且生成很多重要的報表。

這裏就可以看到,倉庫和財務部門可以看做是兩個獨立的CTX,它們有明確的對外接口(倉庫的存貨報告、退貨報告,財務的工資單發佈等),也有着只需要自己知道的一些細節(剷車、計算器...)。

財務部門不需要知道倉庫的內部細節,只需要知道庫存水平以便於更新賬戶,以及退回的產品是否到貨以便於退款。這些都通過接口實現兩個部門之間的通信。所以接口的定義非常重要。

當然,通過不斷的發展,倉庫的內部細節越來越多,也可以再劃分出不同的CTX,比如庫存CTX,設備維護CTX。這其中保持不變的核心概念是:當一個領域內部細節足夠多(通常是劃分了多個模塊),這個時候就應該考慮拆分這個領域,提取出模塊間需要共享的部分。

5. 模塊和服務

在剛開始開發一個代碼庫時,我們最好通過模塊的方式來減少不同內部領域之間的耦合,當我們發現這個代碼庫中的限界上下文後,就可以使用模塊對其建模,模塊內隱藏一些細節,共享/暴露一些細節。

這些模塊邊界就可以成爲絕佳的微服務侯選。一般來說,微服務應該清晰的和限界上下文保持一致。熟練之後就可以省掉在單塊系統中先使用模塊這個步驟,而直接使用單獨的服務。然而對於一個新系統而言,可以先使用一段時間的單塊系統,因爲如果服務之間的邊界搞錯了,後面修復的代價很大。所以最好能夠等到系統穩定下來,再確定把哪些東西作爲一個服務劃分出去。

所以,服務邊界和領域的限界上下文保持一致,就跨出了走向高內聚松耦合的微服務架構的第一步。

6. 過早的劃分

作者提到的一個親身經歷,一開始就使用微服務的方式構建新系統,幾個月之後發現現在系統的用例和之前想的有所不同,這些不同證明了之前的服務劃分方式有問題,這導致了很多跨服務的修改,代價相當高,後來作者的團隊又逐漸把這些服務合併成了一個單塊系統,給到所有人時間去理解服務邊界到底應該在哪,一年後,團隊識別出了非常穩定的邊界,纔再據此拆分成了微服務架構。

所以作者強烈建議:

很多時候,將一個已有的代碼庫劃分成微服務,要比從頭開始構建微服務簡單得多。

在我看來,這其實和過度設計是一個道理。

7. 逐步劃分上下文

剛開始你會識別出一些粗粒度的限界上下文,而這個CTX可能又包含一些嵌套的限界上下文。舉個例子,你可以把倉庫分解爲不同的部分:訂單處理、庫存管理、貨物接收等。當考慮微服務邊界時,首先考慮比較大的、粗粒度的那些上下文,然後當發現合適的縫隙後,再進一步劃分出那些嵌套的上下文。

8. 小結

這篇文章總結了什麼是好的服務,以及如何在問題空間中尋找能達到高內聚松耦合的接縫。限界上下文是尋找這些接縫的一個非常重要的工具,通過將微服務與這些邊界相匹配,可以保證最終的系統能夠得到微服務提供的所有好處。

到此我們也瞭解了進一步劃分微服務的方法,後面的文檔會深入討論這個話題。

另外作者在小結時再次提到了Eric Evans的《領域驅動設計》一書,說到其中提到的概念對於尋找的明顯的服務邊界來說非常有用。作者還推薦了一本書,Vaughn Vernon的《實現領域驅動設計》,這本書能夠幫助我們理解如何實踐這些方法。

到目前爲止文章提到的內容都比較寬泛偏理論,下一章開始,內容技術性會更強。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章