相對於單體式應用,微服務有如下優點
技術異構性
在單體架構下,會非常依賴於項目一開始對技術的選擇,一旦選擇了個技術棧,之后幾年都會被綁定在這樣個技術棧下,很難應對變化。給我們提供了一個更細粒度使用技術的可能在不同的服務里可以使用完全不同的技術棧不同的語言、框架甚至數據庫,真正做到用最適合的技術解決最適合的問題,從而讓我們可以更加敏捷地響應需求和市場的變化提高了競爭力。
彈性
彈性彈性工程學的一個關鍵概念是艙壁。如果系統中的一個組件不可用了,但並沒有導致級聯故障,那么系統的其他部分還可以正常運行。服務邊界就是一個很顯然的艙壁。在單塊系統中,如果服務不可用,那么所有的功能都會不可用。對於單塊服務的系統而言,可以通過將同樣的實例運行在不同的機器上來降低功能完全不可用的概率,然而微服務系統本身就能夠很好地處理服務不可用和功能降級問題。
擴展
龐大的單塊服務只能作為一個整體進行擴展即使系統中只有一小部分存在性能問題,也需要對整個服務進行擴展。如果使用較小的多個服務,則可以只對需要擴展的服務進行擴展,這樣就可以把那些不需要擴展的服務運行在更小的、性能稍差的硬件上。
簡化部署
在有幾百萬行代碼的單塊應用程序中,即使只修改了一行代碼,也需要重新部署整個應用程序才能夠發布該變更。這種部署的影響很大、風險很高,因此相關千系人不敢輕易做部署。於是在實際操作中,部署的頻率就會變得很低。這意味着在兩次發布之間我們對軟件做了很多功能增強,但直到最后一刻才把這些大量的變更一次性發布到生產環境中。這時,另外一個問題就顯現出來了:兩次發布之間的差異越大,出錯的可能性就更大在微服務架構中,各個服務的部署是獨立的這樣就可以更快地對特定部分的代碼進行部署。如果真的出了問題,也只會影響一個服務,並且容易快速回滾,這也意味着客戶可以更快地使用我們開發的新功能。 Amazon和 Netflix等組織采用這種架構主要就是基於上述考慮。這種架構很好地清除了軟件發布過程中的種種障礙。微服務部署領域的技術在過去幾年時間里發生了巨大的變化,第6章會對該話題做更深入的討論。
與組織結構相匹配
我們經歷過太多由於團隊和代碼庫過大引起問題的情況。當團隊是分布式的時候,問題會更明顯。我們也知道在小型代碼庫上工作的小團隊更加高效。
可組合性/組件化
分布式系統和面向服務架構聲稱的主要好處是易於重用已有功能。而在微服務架構中,根據不同的目的,人們可以通過不同的方式使用同一個功能,在考慮客戶如何使用該軟件時這一點尤其重要。單純考慮桌面網站或者移動應用程序的時代已經過去了。現在我們需要考慮的應用程序種類包括Web、原生應用、移動端Web、平板應用及可穿戴設備等,針對每一種都應該考慮如何對已有功能進行組合來實現這些應用。現在很多組織都在做整體考慮,拓展他們與客戶交互的渠道,同時也需要相應地調整架構來輔助這種變化的發生。在微服務架構中,系統會開放很多接縫供外部使用。當情況發生改變時,可以使用不同的方式構建應用,而整體化應用程序只能提供一個非常粗粒度的接縫供外部使用。如果想要得到更有用的細化信息,你需要使用榔頭撬開它!第5章會討論如何將已有的單塊應用程序分解成為多個微服務,並且達到可重用、可組合的目的。
對可替代性的優化
如果你在一個大中型組織工作,很可能接觸過一些龐大而丑陋的遺留系統。這些系統無人敢碰,卻對公司業務的運營至關重要。更糟糕的是,這些程序是使用某種奇怪的Fortran變體編寫的,並且只能運行在25年前就應該被淘汰的硬件上。為什么這些系統直到現在還沒有被取代?其實你很清楚答案工作量很大,而且風險很高。當使用多個小規模服務時,重新實現某一個服務或者是直接刪除該服務都是相對可操作的。想想看,在單塊系統中你是否會在一天內刪掉上百行代碼,並且確信不會引發問題?微服務中的多個服務大小相似,所以重寫或移除一個或者多個服務的阻礙也很小。使用微服務架構的團隊可以在需要時輕易地重寫服務,或者刪除不再使用的服務。當個代碼庫只有幾百行時,人們也不會對它有太多感情上的依賴,所以很容易替換它。
其他
- 每個微服務相對較小,開發者易於理解, IDE處理效率快,利於提高勞動生產率,Web容器壓力小,容器啟動速度快,易於提供勞動生產率和生產環境部署速度。
- 每個微服務都可以獨立部署,簡化了部署新服務版本的流程。
- 於規模化開發,多個開發團隊可以並行開發,每個團隊負責一項服務。這意味着,對於開發這而言,僅需要了解自己負責的一部分業務邏輯即可,然而這對於開發者並不一定是好事情。
- 改善故障隔離。一個服務宕機不會影響其他的服務。
微服務架構的不足
- 微服務強調了服務的大小,但實際上這並沒有一個同意的標准。
- 微服務架構帶來了分布式數據庫事物,以及分布式系統架構。分布式系統相對於單體應用更加復雜。由於CAP原理的約束,使得我們不得不放棄傳統的強一致性,而是轉而追求最終一致性。
- 微服務架構對測試也帶了很大的挑戰。測試人員需要構建部署復雜的分布式應用進行測試。