架構與思維:一定需要微服務麼?

Hello-Brand發表於2024-04-07

1 微服務發展

微服務架構的發展伴隨著網際網路行業的飛速增長和技術的日新月異。起初,企業為了提升應用的靈活性和可維護性,開始嘗試將單體應用拆分為多個服務,這便是面向服務的架構(SOA)的興起。然而,此時的拆分粒度仍然相對較大,並沒有完全實現服務的細粒度劃分。

隨著Docker和容器技術的興起,微服務架構真正得到了發展的助力。容器技術為微服務提供了輕量級的隔離環境,使得微服務更容易部署和管理。 每個微服務都可以獨立執行、擴充套件和更新,大大提高了系統的靈活性和可維護性。

進入雲原生時代,伴隨著Kubernetes等技術的興起,微服務架構得到了更為完善的支撐。雲原生技術為微服務提供了自動化部署、管理和監控的能力,進一步推動了微服務架構的廣泛應用

image

2 微服務有哪些特點

微服務提倡將 單一應用程式劃分成一組鬆散耦合的細粒度小型服務,輔助輕量級的協議,互相協調、互相配合,為使用者提供最終價值。
所以,微服務(或微服務架構)是一種雲原生架構方法,其中單個應用程式由許多鬆散耦合且可獨立部署的較小元件或服務組成。這些服務通常包含如下特點:

2.1 單一職責

微服務架構中的每個節點高度服務化,都是具有業務邏輯的,符合高內聚、低耦合原則以及單一職責原則的單元,包括資料庫和資料模型;不同的服務透過“管道”的方式靈活組合,從而構建出龐大的系統。
原來的單體系統逐漸演變成具有單一職責的細粒度服務。
image

2.2 輕量級通訊

透過REST API模式或者RPC框架,實現服務間互相協作的輕量級通訊機制。參考作者這一篇《微服務通訊之RPC

  • 效能佳
  • 穩定性高
  • 安全性好

image

2.3 獨立性

在微服務架構中,每個服務都是獨立的業務單元,與其他服務高度解耦,只需要改變當前服務本身,就可以完成獨立的開發、測試、部署、運維。
image

2.4 程序隔離

在微服務架構中,應用程式由多個服務組成,每個服務都是高度自治的獨立業務實體,可以執行在獨立的程序中,不同的服務能非常容易地部署到不同的主機上,實現高度自治和高度隔離。
程序的隔離,還能保證服務達到動態擴縮容的能力,業務高峰期自動增加服務資源以提升併發能力,業務低谷期則可自動釋放服務資源以節省開銷。

2.5 混合技術棧和混合部署方式

團隊可以為不同的服務元件使用不同的技術棧和不同的部署方式(公有云、私有云、混合雲)。

2.6 簡化治理

元件可以彼此獨立地進行擴縮容和治理,從而減少了因必須縮放整個應用程式而產生的浪費和成本,因為單個功能可能面臨過多的負載。

2.7 安全可靠,可維護。

從架構上對運維提供友好的支撐,在安全、可維護的基礎上規範化釋出流程,支援資料儲存容災、業務模組隔離、訪問許可權控制、編碼安全檢測等。

3 微服務架構適用的場景

微服務架構的適用場景廣泛,尤其在以下情況下表現尤為突出:

1. 業務複雜,模組多且相對獨立:當業務複雜到單體應用難以維護時,將應用拆分為多個微服務是一個明智的選擇。每個微服務專注於一個業務領域,實現業務的高度解耦和快速迭代。
2. 團隊多,管理隔離:隨著公司規模的擴大,團隊數量也在不斷增加。每個團隊都有自己的管理方式和負責的業務領域。微服務架構可以實現團隊自治,提高開發效率。
3. 應用規模大,併發使用者多:微服務架構可以橫向分散式擴充套件,輕鬆應對應用規模的不斷擴大和海量使用者增長。
4. 快速迭代、持續交付:在業務需求快速變化的情況下,微服務架構可以實現快速的開發、測試和部署,支援持續交付和持續整合。

4 微服務架構的優勢和挑戰

4.1 微服務架構的優勢

4.1.1 易於開發和維護

由於每個微服務都是獨立的,開發團隊可以專注於自己的服務,從而更容易進行開發和維護。

4.1.2 啟動速度快

與單體應用相比,微服務的啟動速度更快,因為只需要啟動所需的服務,而不是整個應用。

4.1.3 區域性修改容易部署

當某個服務出現問題或需要更新時,只需要針對該服務進行修改和部署,而不需要重新部署整個應用。

4.1.4 技術棧靈活

每個微服務都可以使用最適合的技術棧進行開發,從而可以充分利用最新的技術和工具。

4.1.5 易於擴充套件

每個微服務都可以獨立進行擴充套件,從而可以根據需要靈活地調整系統的效能和資源使用。

4.1.6 獨立執行和擴充套件

每個微服務都可以獨立地執行和擴充套件,使得系統能夠很容易地水平擴充套件以處理更多的負載。

4.1.7 提高可用性

透過將應用程式分解為多個小而自治的服務,可以降低單點故障的風險,提高整個系統的可用性。

4.2 微服務架構面臨的挑戰

4.2.1 分散式系統的固有複雜性

微服務架構是基於分散式的系統,而構建分散式系統必然會帶來額外的開銷。

  • 效能: 分散式系統是跨程序、跨網路的呼叫, 受網路延遲和頻寬的影響。
  • 可靠性: 由於高度依賴於網路狀況, 任何一次的遠端呼叫都有可能失敗,隨著服務的增多還會出現更多的潛在故障點。此,如何提高系統的可靠性、降低因網路引起的故障率,是系統構建的一大挑戰。
  • 分散式通訊: 分散式通訊大大增加了功能實現的複雜度,並且 伴隨著定位難、除錯難等問題
  • 資料一致性: 需要保證分散式系統的資料強一致性,即 在 C(一致性)A(可用性)P(分割槽容錯性) 三者之間做出權衡。塊可以參考我的這篇《分散式事務》。
  • 安全性問題:微服務架構涉及多個服務之間的網路通訊,存在資料洩露、劫持等安全風險,需要實施適當的安全措施。

4.2.2 服務的依賴管理和測試

在單體應用中,通常使用整合測試來驗證依賴是否正常。而在微服務架構中,服務數量眾多,每個服務都是獨立的業務單元,服務主要透過介面進行互動,如何保證它的正常,是測試面臨的主要挑戰。
所以單元測試和單個服務鏈路的可用性非常重要。

4.2.3 有效的配置版本管理

在單體系統中,配置可以寫在yaml檔案,分散式系統中需要統一進行配置管理,同一個服務在不同的場景下對配置的值要求還可能不一樣,所以需要引入配置的版本管理、環境管理。

4.2.4 自動化的部署流程

在微服務架構中,每個服務都獨立部署,交付週期短且頻率高,人工部署已經無法適應業務的快速變化。有效地構建自動化部署體系,配合服務網格、容器技術,是微服務面臨的另一個挑戰。

4.2.5 對於DevOps更高的要求

在微服務架構的實施過程中,開發人員和運維人員的角色發生了變化,開發者也將承擔起整個服務的生命週期的責任,包括部署、鏈路追蹤、監控;因此,按需調整組織架構、構建全功能的團隊,也是一個不小的挑戰。

1.2.6 運維成本

運維主要包括配置、部署、監控與告警和日誌收集四大方面。微服務架構中,每個服務都需要獨立地配置、部署、監控和收集日誌,成本呈指數級增長。服務化粒度越細,運維成本越高。

怎樣去解決這些問題,是微服務架構必須面臨的挑戰。

5 什麼時候需要微服務化?

作為一線大廠架構師,我們也承擔著很多舊系統改造的工作,在判斷是否使用微服務架構時,以下是一些可能的參考:
1. 流量和併發量
當系統的流量或併發量達到一定的閾值,比如日活躍使用者數量超過百萬,或者每秒請求數(QPS)達到數千甚至更高時,傳統的單體架構可能難以支撐如此高的負載。此時,將系統拆分為微服務可以提高系統的吞吐量和響應速度。

2. 迭代頻率
如果業務需求變更非常頻繁,例如每週兩次以上甚至每天都有新的功能需要上線,那麼微服務架構的靈活性將更加適合這種快速迭代的需求。每個微服務可以獨立進行開發、測試和部署,這將大大縮短新功能上線的週期。

3. 系統擴充套件需求
當系統需要快速擴充套件以滿足業務增長時,微服務架構可以更容易地實現水平擴充套件。透過增加更多的服務例項或部署到更多的伺服器上,可以線性地提高系統的處理能力。如果預計未來幾年內系統需要大幅度擴充套件,那麼使用微服務架構可能是一個明智的選擇。

4. 耦合度和依賴關係
如果舊系統中的模組之間存在高度的耦合和複雜的依賴關係,這可能導致維護和升級變得困難。透過微服務架構,可以將這些模組拆分為獨立的服務,降低耦合度,減少依賴關係,從而提高系統的可維護性和可擴充套件性。

5. 故障隔離和容錯能力
如果系統中的某個模組出現故障,是否會影響到整個系統的正常執行?如果答案是肯定的,那麼使用微服務架構可以提高系統的容錯能力。每個微服務都可以獨立執行和故障隔離,一個服務的故障不會影響到其他服務的正常執行。

需要注意的是, 貿然拆分成為服務架構,反而可能導致服務間訪問效率變低、服務間呼叫的可靠性變低、故障問題定位慢、更高的資料一致性保障、很高的機器資源(物力)和運維(人力)成本。所以,適合的才是對的,需要平衡各方面利弊再做決定。

相關文章