Chapter 27 - 服務:偉大與渺小

以服務為導向的架構和微服務架構最近變得很流行,流行的原因包括以下幾點:

  • 服務似乎彼此強烈解耦
  • 服務似乎支援開發與部屬的獨立性

以下我們會看到,這種主張都只是『部分正確』

服務是架構?

使用服務就本質上而言是一種架構,有些人可能會這樣認為,但事實上顯然不是的。系統的架構是由高層級的策略與低層級細節分離的邊界來定義的,並遵循依賴規則。利用服務來分離功能性通常具有很大的好處,不過服務本身並未定義一個架構。

服務的謬誤

這邊我們介紹一些對於服務的一些誤解。

解耦的謬誤

把系統拆分為服務的好處就是服務之間會強烈的解耦。畢竟,每個服務都運行在不同的行程中,甚至是不同的處理器上,況且服務之間還不能取用彼此的變數,而且每個服務的介面都有很明確清楚的定義。

這確實是說中了一些事實,但,也不是很多的事實。

單從變數存取層面來說,服務之間確實是解耦的。但如果這些服務彼此之間共享了某些資料,我們將視角拉到資料層面去檢視服務之間的關係,就會發現服務彼此之間還是會因為資料的變動而耦合著。

舉例來說,兩個服務都會用到同一個資料表,而當今天資料表多新增了一個欄位,那麼我勢必就是必須對於兩個服務都去做出相對應的修改。因此,這些服務之間因為資料而耦合再一起了。

獨立開發和獨立部署的謬誤

服務的另外一個好處是,他可以被一個專門的團隊來開發及維運。開發和部署的這種獨立性被假定是可拓展的。相信這個論點的人認為,即便是要建立大型系統,他也可以由十幾個甚至幾百個可獨立開發及部署的服務去建構起來。

這個信念有一些是事實,但,只有一些是。

從歷史痕跡縱觀上來看,大型系統可以由單片系統、基於元件的系統和基於服務的系統來建構出來。所以,服務並不是建構可擴展系統的唯一選擇。

再者,解耦的謬誤告訴我們,只要資料跟行為上有相互影響,就意味著服務之間互相耦合,就必須協同著開發、部署及運行。

橫切關注面

架構的邊界並不在服務之間。相反的,這些邊界貫穿了服務,並將他們分解成元件。