微服務等於 Spring Cloud?瞭解微服務架構和框架

微服務初探

什麼是微服務

首先微服務並沒有一個官方的定義,想要直接描述微服務比較困難,我們可以通過對比傳統 WEB 應用,來理解什麼是微服務。

傳統的 WEB 應用核心分爲業務邏輯、適配器以及 API 或通過 UI 訪問的 WEB 界面。業務邏輯定義業務流程、業務規則以及領域實體。適配器包括數據庫訪問組件、消息組件以及訪問接口等。一個打車軟件的架構圖如下:

儘管也是遵循模塊化開發,但最終它們會打包並部署爲單體式應用。例如 Java 應用程序會被打包成 WAR,部署在 Tomcat 或者 Jetty 上。

這種單體應用比較適合於小項目,優點是:

當然它的缺點也十分明顯,特別對於互聯網公司來說:

所以,現在主流的設計一般會採用微服務架構。其思路不是開發一個巨大的單體式應用,而是將應用分解爲小的、互相連接的微服務。一個微服務完成某個特定功能,比如乘客管理和下單管理等。每個微服務都有自己的業務邏輯和適配器。一些微服務還會提供 API 接口給其他微服務和應用客戶端使用。

比如,前面描述的系統可被分解爲:

每個業務邏輯都被分解爲一個微服務,微服務之間通過 REST API 通信。一些微服務也會向終端用戶或客戶端開發 API 接口。但通常情況下,這些客戶端並不能直接訪問後臺微服務,而是通過 API Gateway 來傳遞請求。API Gateway 一般負責服務路由、負載均衡、緩存、訪問控制和鑑權等任務。

微服務架構的優點

微服務架構有很多重要的優點。首先,它解決了複雜性問題。它將單體應用分解爲一組服務。雖然功能總量不變,但應用程序已被分解爲可管理的模塊或服務。這些服務定義了明確的 RPC 或消息驅動的 API 邊界。微服務架構強化了應用模塊化的水平,而這通過單體代碼庫很難實現。因此,微服務開發的速度要快很多,更容易理解和維護。

其次,這種體系結構使得每個服務都可以由專注於此服務的團隊獨立開發。只要符合服務 API 契約,開發人員可以自由選擇開發技術。這就意味着開發人員可以採用新技術編寫或重構服務,由於服務相對較小,所以這並不會對整體應用造成太大影響。

第三,微服務架構可以使每個微服務獨立部署。開發人員無需協調對服務升級或更改的部署。這些更改可以在測試通過後立即部署。所以微服務架構也使得 CI/CD 成爲可能。

最後,微服務架構使得每個服務都可獨立擴展。我們只需定義滿足服務部署要求的配置、容量、實例數量等約束條件即可。比如我們可以在 EC2 計算優化實例上部署 CPU 密集型服務,在 EC2 內存優化實例上部署內存數據庫服務。

微服務架構的缺點和挑戰

實際上並不存在silver bullets,微服務架構也會給我們帶來新的問題和挑戰。其中一個就和它的名字類似,微服務強調了服務大小,但實際上這並沒有一個統一的標準。業務邏輯應該按照什麼規則劃分爲微服務,這本身就是一個經驗工程。有些開發者主張 10-100 行代碼就應該建立一個微服務。雖然建立小型服務是微服務架構崇尚的,但要記住,微服務是達到目的的手段,而不是目標。微服務的目標是充分分解應用程序,以促進敏捷開發和持續集成部署。

微服務的另一個主要缺點是微服務的分佈式特點帶來的複雜性。開發人員需要基於 RPC 或者消息實現微服務之間的調用和通信,而這就使得服務之間的發現、服務調用鏈的跟蹤和質量問題變得的相當棘手。

微服務的另一個挑戰是分區的數據庫體系和分佈式事務。更新多個業務實體的業務交易相當普遍。這些類型的事務在單體應用中實現非常簡單,因爲單體應用往往只存在一個數據庫。但在微服務架構下,不同服務可能擁有不同的數據庫。CAP 原理的約束,使得我們不得不放棄傳統的強一致性,而轉而追求最終一致性,這個對開發人員來說是一個挑戰。

微服務架構對測試也帶來了很大的挑戰。傳統的單體 WEB 應用只需測試單一的 REST API 即可,而對微服務進行測試,需要啓動它依賴的所有其他服務。這種複雜性不可低估。

微服務的另一大挑戰是跨多個服務的更改。比如在傳統單體應用中,若有 A、B、C 三個服務需要更改,A 依賴 B,B 依賴 C。我們只需更改相應的模塊,然後一次性部署即可。但是在微服務架構中,我們需要仔細規劃和協調每個服務的變更部署。我們需要先更新 C,然後更新 B,最後更新 A。

部署基於微服務的應用也要複雜得多。單體應用可以簡單的部署在一組相同的服務器上,然後前端使用負載均衡即可。每個應用都有相同的基礎服務地址,例如數據庫和消息隊列。而微服務由不同的大量服務構成。每種服務可能擁有自己的配置、應用實例數量以及基礎服務地址。這裏就需要不同的配置、部署、擴展和監控組件。此外,我們還需要服務發現機制,以便服務可以發現與其通信的其他服務的地址。因此,成功部署微服務應用需要開發人員有更好地部署策略和高度自動化的水平。

以上問題和挑戰可大體概括爲:

幸運的是,出現了很多微服務框架,可以解決以上問題。

第一代微服務框架

Spring Cloud

Spring Cloud 爲開發者提供了快速構建分佈式系統的通用模型的工具(包括配置管理,服務發現,熔斷器,智能路由,微代理,控制總線,一次性令牌,全局鎖,領導選舉,分佈式會話,集羣狀態等)。主要項目包括:

Dubbo

Dubbo 是一個阿里巴巴開源出來的一個分佈式服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案,以及 SOA 服務治理方案。其核心部分包含:

但是顯而易見,無論是 Dubbo 還是 Spring Cloud 都只適用於特定的應用場景和開發環境,它們的設計目的並不是爲了支持通用性和多語言性。並且它們只是Dev層的框架,缺少DevOps的整體解決方案(這正是微服務架構需要關注的)。而隨之而來的便是 Service Mesh 的興起。

下一代微服務:Service Mesh?

Service Mesh

Service Mesh 又譯作 “服務網格”,作爲服務間通信的基礎設施層。如果用一句話來解釋什麼是 Service Mesh,可以將它比作是應用程序或者說微服務間的 TCP/IP,負責服務之間的網絡調用、限流、熔斷和監控。對於編寫應用程序來說一般無須關心 TCP/IP 這一層(比如通過 HTTP 協議的 RESTful 應用),同樣使用 Service Mesh 也就無須關係服務之間的那些原來是通過應用程序或者其他框架實現的事情,比如 Spring Cloud、OSS,現在只要交給 Service Mesh 就可以了。

Service Mesh 有如下幾個特點:

Service Mesh 的架構如下圖所示:

Service Mesh 作爲 Sidebar 運行,對應用程序來說是透明,所有應用程序間的流量都會通過它,所以對應用程序流量的控制都可以在 Service Mesh 中實現。

目前流行的 Service Mesh 開源軟件有 Linkerd、Envoy 和 Istio,而最近 Buoyant(開源 Linkerd 的公司)又發佈了基於 Kubernetes 的 Service Mesh 開源項目 Conduit。

Linkerd

Linkerd 是開源網絡代理,設計爲以服務網格部署:用於管理,控制和監控應用程序內的服務與服務間通訊的專用層。

Linkerd 旨在解決 Twitter,Yahoo,Google 和 Microsoft 等公司運營大型生產系統時發現的問題。根據經驗,最複雜,令人驚奇和緊急行爲的來源通常不是服務本身,而是服務之間的通訊。Linkerd 解決了這些問題,不僅僅是控制通訊機制,而是在其上提供一個抽象層。

它的主要特性有:

Envoy

Envoy 是一個面向服務架構的 L7 代理和通信總線而設計的,這個項目誕生是出於以下目標:

對於應用程序而言,網絡應該是透明的,當發生網絡和應用程序故障時,能夠很容易定位出問題的根源。

Envoy 可提供以下特性:

Istio

Istio 是一個用來連接、管理和保護微服務的開放平臺。Istio 提供一種簡單的方式來建立已部署服務網絡,具備負載均衡、服務間認證、監控等功能,而不需要改動任何服務代碼。想要爲服務增加對 Istio 的支持,您只需要在環境中部署一個特殊的邊車(sidecar),使用 Istio 控制面板功能配置和管理代理,攔截微服務之間的所有網絡通信。

Istio 目前僅支持在 Kubernetes 上的服務部署,但未來版本中將支持其他環境。

Istio 提供了一個完整的解決方案,通過爲整個服務網格提供行爲洞察和操作控制來滿足微服務應用程序的多樣化需求。它在服務網絡中統一提供了許多關鍵功能:

Istio 服務網格邏輯上分爲數據面板和控制面板:

下圖顯示了構成每個面板的不同組件:

Conduit

Conduit 是爲 Kubernetes 設計的一個超輕型服務網格服務,它可透明地管理在 Kubernetes 上運行的服務的運行時通信,使得它們更安全可靠。Conduit 提供了可見性、可靠性和安全性的功能,而無需更改代碼。

Conduit service mesh 也是由數據面板和控制面板組成。數據面板承載應用實際的網絡流量。控制面板驅動數據面板,並對外提供北向接口。

對比

Linkerd 和 Envoy 比較相似,都是一種面向服務通信的網絡代理,均可實現諸如服務發現、請求路由、負載均衡等功能。它們的設計目標就是爲了解決服務之間的通信問題,使得應用對服務通信無感知,這也是 Service Mesh 的核心理念。Linkerd 和 Envoy 像是分佈式的 Sidebar,多個類似 Linkerd 和 Envoy 的 proxy 互相連接,就組成了 service mesh。

而 Istio 則是站在了一個更高的角度,它將 Service Mesh 分爲了 Data Plane 和 Control Plane。Data Plane 負責微服務間的所有網絡通信,而 Control Plane 負責管理 Data Plane Proxy:

並且 Istio 天生的支持 Kubernetes,這也彌合了應用調度框架與 Service Mesh 之間的空隙。

關於 Conduit 的資料較少,從官方介紹看它的定位和功能與 Istio 類似。

Kubernetes + Service Mesh

Kubernets 已經成爲了容器調度編排的事實標準,而容器正好可以作爲微服務的最小工作單元,從而發揮微服務架構的最大優勢。所以我認爲未來微服務架構會圍繞 Kubernetes 展開。而 Istio 和 Conduit 這類 Service Mesh 天生就是爲了 Kubernetes 設計,它們的出現補足了 Kubernetes 在微服務間服務通訊上的短板。雖然 Dubbo、Spring Cloud 等都是成熟的微服務框架,但是它們或多或少都會和具體語言或應用場景綁定,並只解決了微服務Dev層面的問題。若想解決Ops問題,它們還需和諸如 Cloud Foundry、Mesos、Docker Swarm 或 Kubernetes 這類資源調度框架做結合:

但是這種結合又由於初始設計和生態,有很多適用性問題需要解決。

Kubernetes 則不同,它本身就是一個和開發語言無關的、通用的容器管理平臺,它可以支持運行雲原生和傳統的容器化應用。並且它覆蓋了微服務的DevOps階段,結合 Service Mesh,它可以爲用戶提供完整端到端的微服務體驗。

所以我認爲,未來的微服務架構和技術棧可能是如下形式:

多雲平臺爲微服務提供了資源能力(計算、存儲和網絡等),容器作爲最小工作單元被 Kubernetes 調度和編排,Service Mesh 管理微服務的服務通信,最後通過 API Gateway 向外暴露微服務的業務接口。

我相信未來隨着以 Kubernetes 和 Service Mesh 爲標準的微服務框架的盛行,將大大降低微服務實施的成本,最終爲微服務落地以及大規模使用提供堅實的基礎和保障。

作者:TIM XU

來源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/sXmuHUKVPxAMpouDRdURww