微服務之Service Mesh淺析

2021-02-15 牧師架構之路


       隨著技術體系的不斷革新,基於原有的模式或思路使得軟體的架構越來越難以維護,無論是國外還是國內的軟體行業,都得到進一步的證實。依據各大主流技術論壇或者商業網站,目測,全球大約有85%以上的企業計劃使用或者正在使用微服務體系生態。畢竟,原有的單一架構體系難以繼續開發和持續維護,而基於微服務生態則允許使用較小的目標服務來實現更大的敏捷性收益。

       然而,我們發現,在實際的業務場景中,隨著組織構建更多的微服務(通常基於不同的程式語言和部署模型),使得它們最終會面臨複雜的環境,這些環境可能會使得成本高昂且難以操作。這種複雜性在某種意義上扼殺了創新,公然違背了微服務的初衷。

       那麼,企業如何能夠全面、大規模地維護和管理所有服務以及如何使得我們的微服務依據業務的複雜性能夠很好的落地呢? 這是一個值得深思的話題,同時也是一個必須面對、解決的問題。由此,Service Mesh 技術應運而生,解決了這一痛點。

       首先,我們先了解下在實際的業務場景中,常用的微服務邏輯架構,具體如下圖所示:

                          

      什麼是 Service Mesh ?

      Service Mesh 這個概念最早由開發Linkerd 的 Buoyant, Inc 公司 CEO William Morgan 提出:服務網格即通過將這些功能插入平臺層而非應用程式層來向應用程式添加可觀察性,安全性和可靠性功能的工具。具體什麼意思呢?首先,Service Mesh 是一個專門負責請求可靠傳輸的基礎架構層,也就是說它是一種底層框架,其次,Service Mesh 與應用部署在一起,通過網絡代理來實現,使得應用程式無感知。

       服務網格是微服務部署的一種體系結構模式,通常被實現為與應用程式代碼一起部署的可伸縮網絡代理集(一種有時稱為Sidecar的模式)。這些代理處理微服務之間的通信,並充當可以引入服務網格功能的點。代理伺服器組成服務網格的數據平面,並由其控制平面進行整體控制。其主要目標是確保服務之間的通信安全,快速和可靠。

       對於Service Mesh 的概念其所負有的職責邊界,William Morgan 對其進行明確的補充:服務網格的興起與「雲原生」應用程式的興起息息相關。在雲原生世界中,一個應用程式可能包含數百個服務。每個服務可能有數千個實例;而且這些實例中的每一個實例都可能處於不斷變化的狀態,因為它們是由像Kubernetes這樣的協調器動態調度的。在這個世界中,服務之間的通信不僅非常複雜,而且是應用程式運行時行為的基本組成部分。管理它對於確保端到端性能,可靠性和安全性至關重要。

       基於上述所述,我們來看下Service Mesh 簡要架構圖,具體如下所示:

       基於上述架構圖,我們可以得知:在服務網格體系結構中,給定部署或集群中的微服務通過 Sidecar 代理相互交互。這些交互背後的安全和通信規則是通過控制平面定向的。開發人員可以在控制平面級別配置和添加策略,並且可以抽象化微服務背後的治理注意事項,而與構建技術無關。流行的Service Mesh框架(例如Istio)應運而生,以幫助組織實施這些體系結構模式。下面我們對Service Mesh 架構中的核心組件進行簡要解析,具體如下:

       SideCar 模式

       SideCar 模式是 Service Mesh 的一個核心關鍵要素。首先來看熟悉下在傳統的微服務中體系中,服務與服務之間是怎樣進行交互,具體如下圖所示:

       在上述的服務調用鏈路中,NetworkFunctions 組件即我們所說的業務場景中所具備的熔斷降級,負載均衡等一系列的相關功能。那麼,對於我們新一代微服務 Service Mesh 其服務之間的相互調用又是怎樣的呢?具體可參考如下圖示:

       基於上述服務調用鏈-Service Mesh,我們可以看到,原本服務框架中需要在我們每個服務裡面實現的一些框架功能,諸如,服務發現、負載均衡、熔斷降級均已由 SideCar來 實現,而我們的服務代碼、業務代碼再也不用關心與業務本身無關的內容。

        Control Plane

       基於上述的解析,我們知道 Sidecar 實現了服務的攔截調用功能,所有的服務都通過 SideCar 來進行轉發和流量處理,這樣所有的 Sidecar 再通過一個Control Plane 作為中心點來管控全局,這就形成了一個服務網格。有了前面 SideCar 的作用,Control Plane 作為一個中心點的作用就很明顯了,具體如下:

        1、服務發現,我們寫的服務通過Sidecar 註冊到 Control Plane 的註冊中心,這樣當,服務需要進行其他服務調用的時候,先經過 SideCar,然後 SideCar 去 Control Plane  註冊中心查詢相應的服務提供者的列表。

        2、負載均衡,承接上一步,拿到了服務提供者的列表之後,SideCar 就根據一定的負載均衡算法選擇一個節點進行調用。同時通過 ControlPlane 也可以修改這些 SideCar 的負載均衡算法。

        3、請求路由,SideCar 從Control Plane 拿到服務提供者列表之後,也可以通過 Control Plane 來進行控制,例如 A/B Test、流量切換等等。

        4、故障處理,服務之間調用如果出現故障,就需要加以控制、超時重傳、熔斷等,這些都可以通過 SideCar 轉發時,通過 Control Plane 動態配置。

        5、安全認證,通過 Control Plane 控制哪個服務可以被誰進行訪問,以及訪問哪些信息

監控上報,所有 SideCar 轉發的信息都會經過 Control Plane,再由 Control Plane 發送給監控系統,例如Prometheus。

        6、日誌記錄,所有 SideCar 轉發的日誌信息也會經過 Control Plane,再由 ControlPlane 發送給日誌系統。

        7、資源配額,例如可以在 Control Plane 裡面對每個服務配置最大調用次數,這樣 SideCar 轉發調用時就會進行次數的審計。

       上述我們簡要解析了Service Mesh的基本架構、工作流,回到之前的問題,基於 Service Mesh 的應用,到底能夠幫我們解決哪些問題?基於作者的淺薄經驗,具體總結如下:

        1、雲原生的需要,在越來越多的微服務進行了容器化,並且開始在如 Kubernetes 這樣的平臺上運行。傳統的服務治理,需要在業務代碼裡集成服務框架的SDK,這就比較麻煩,而Service Mesh 可以無侵入的進行服務治理,比較符合雲原生的理念。具體可參考如下拓撲所示:

        2、基於不同程式語言調用的需要,目前為止,支持微服務體系的語言較多,現有的很多開源微服務框架要麼與特定的語言綁定如 Dubbo 和 Spring Cloud,僅支持 Java,要麼是與語言無關如 gRPC,需要定義IDL文件,然後根據這個文件生成不同語言的Client 和Server,並且很多功能例如超時重傳,負載均衡,服務發現等等。

        那麼,最後,我們真的需要Service Mesh 嗎?

       Service Mesh 已經被視為大部分基於微服務體系的公司的重要組成部分。根據Gartner和IDC的說法,將微服務部署到生產中的公司將需要某種形式的服務網格功能才能進行擴展。

        但是,服務網格無法獨自解決微服務生命周期中的所有挑戰。組織仍然需要一種輕鬆地在團隊之間發布和重用服務的方法。此外,如上所述,服務網格旨在在特定群集內進行服務到服務的通信。在典型的企業中,幾種服務還將在任何一個特定域之外擁有消費者。

       因此,企業需要一種方法來集中其服務的發現、管理和安全性,而與語言、域或部署模型無關。到此,關於Service Mesh (服務網格)相關內容解析為止,大家有什麼問題,歡迎隨時留言溝通。

- EOF -

點擊關注公眾號:"牧師架構之路"

如果您喜歡本文,歡迎點擊右上角,把文章分享到朋友圈~~~

相關焦點

  • service mesh - 微服務通信進化之路
    在處理分布式微服務架構中"多個節點"的互相通信上,需要解決這些通用的問題:服務註冊、服務發現;負載均衡;彈性能力(熔斷、限流、降級、超時、重試等);安全(認證授權);service mesh 要做微服務時代的 TCP,也就是在解決上述問題的基礎上,還要做到通用化、標準化,解耦合業務進程與 mesh。讓通信過程在微服務間變得簡單、可靠。
  • Service Mesh 淺析:從概念、產品到實踐
    近幾年,微服務架構逐漸發展成熟,從最初的星星之火到現在大規模的落地和實踐,幾乎已經成為分布式環境下的首選架構。然而軟體開發沒有銀彈,基於微服務構建的應用系統在享受其優勢的同時,痛點也越加明顯。Service Mesh 技術也因此而生,受到越來越多的開發者關注,並擁有了大批擁躉。
  • 從侵入式服務治理到Service Mesh
    目前service mesh技術在網際網路公司中越來越流行,那麼之前分布式系統是如何服務治理的呢,又是如何一步步發展成service mesh的呢?Service Mesh的定義最早是由出品Linkerd的Buoyant公司的CEO William在他的經典博客文章What's a service mesh? And why do I need one?中給出的。
  • 正確入門Service Mesh:起源、發展和現狀
    文末福利:課程 -【微服務實戰:Service Mesh與Istio】隨著雲原生時代的來臨,微服務架構與容器化部署模式越來越流行,從原來的新潮詞彙慢慢演變成為現代IT企業的技術標配。不得不說,起名真是門藝術,Micro-Services -> Service Mesh,多麼承前啟後和順其自然啊,光看名字就能很形象地理解這玩意兒所做的事情:把微服務的各個service(服務)節點,用一張mesh(網格)連接起來。
  • 微服務進入2.0時代
    直到服務網格(Service Mesh)被提出,這一切都有了答案。1 微服務之殤時光回到2017年初,那時所有主流的微服務框架,不管是類庫性質的Finagle、Hystrix,還是框架性質的Spring Cloud、Dubbo,本質上都歸於應用內解決方案,都存在以下三個問題:
  • 了解 Linkerd Service Mesh 架構
    控制平面是一組服務,提供對 Linkerd 整體的控制。數據平面由在每個服務實例「旁邊」運行的透明微代理(micro-proxies)組成,作為 Pod 中的 sidecar。這些代理會自動處理進出服務的所有 TCP 流量,並與控制平面進行通信以進行配置。Linkerd 還提供了一個 CLI,可用於與控制平面和數據平面進行交互。
  • 教程|使用Istio實現一個Service Mesh以簡化微服務間的通信模式
    原文地址:https://kublr.com/blog/implementing-a-service-mesh-with-istio-to-simplify-microservices-communication
  • Service Mesh 和 API Gateway 關係深度探討
    https://konghq.com/blog/the-difference-between-api-gateways-and-service-mesh/https://blog.christianposta.com/microservices/do-i-need-an-api-gateway-if-i-have-a-service-mesh/https:
  • Traefik 團隊開源的輕量級 Service Mesh 工具 Maesh
    Containous(Traefik 團隊)推出了全新設計的輕量級 service mesh(服務網格)工具:Maesh,Maesh 允許對 Kubernetes
  • Google Cloud 服務網格:Traffic Director 與 Anthos Service Mesh 的左右互搏
    下圖中的 forwarding rule 定義了一個暴露在 10.0.0.1:80 上的服務,該服務對應的 url map 定義了兩條路由規則,對應的主機名分別為 * 和 hello-worold,請求將被路由到後端的 td-vm-service backend service 中的服務實例。
  • 2020年-Service Mesh工具對比
    如果沒有服務網格,則每個微服務都需要配置接收(或發送)來自其他微服務的流量。服務網格完全改變了這一點。有了服務網格,微服務就能夠以可靠,安全和可控制的方式相互通信,而不必進行手動配置,也不必花費大量時間和精力來維護微服務之間的連接。Kubernetes和服務網格是相互協作的,同時使用服務網格可以很輕鬆地實現更複雜的容器化架構。
  • 【雲原生の微服務】35)Istio 中的虛擬服務及 API 網關的路由功能
    對 Istio 來說,服務表示的是應用行為的一個集合,每個服務在服務註冊表中都有自己的名字。一個服務由一個或多個網絡終端(Endpoint)組成,而每個終端有對應的一個或多個工作負載(Workload)。 以地址管理服務為例,它表示的是與地址管理相關的行為的集合,其名稱是 address-service。
  • 微服務架構與服務網格Service Mesh
    我們可以這樣聯想,一個用戶請求一個網頁(客戶端 請求 服務端)時,在tcp層會經歷三次握手和四次揮手;因此微服務之間的通信,也有其自己類似的 "TCP 協議",並且還會包括熔斷策略,負載均衡,服務發現,等各種通用的語義功能。而微服務框架在或多或少實現了這些功能,一定程度上屏蔽了這些通信細節。比如spring cloud框架,幾乎成為微服務的代名詞。
  • 微服務平臺的發展趨勢
    收錄於話題 #微服務 對於許多人來說,對如今的顛覆性市場基礎架構進行現代化意味著要邁向雲本機應用程式,這類應用程式構建為微服務,並通過 Kubernetes 和
  • 如何在Kubernetes上使用Istio Service Mesh設置Java微服務?
    對於那些關注不夠的人來說-Istio是用於分布式應用程式體系結構的service mesh,尤其是那些在雲上運行的Kubernetes。Istio與Kubernetes適配得非常好,以至於你可能認為它是Kubernetes平臺的一部分。如果你還想知道,到底什麼是service mesh或Istio?那麼,讓我們來看看Istio。
  • Service Mesh 在超大規模場景下的落地挑戰
    業務與技術協同發展 —— 飛行中更換引擎業務與技術的協同發展首先要回答好一個問題,即新技術帶給業務的價值是什麼。畢竟,現實中每個應用大多會同時承擔 Consumer 和 Provider 兩種角色。此外,我們曾與 Istio 社區共同探索實現了 EGDS (Endpoint Group Discovery Service),作為 EDS 的增強,但由於 Envoy 社區擔心該 feature 通用性不足而最終沒能接受而完成這次反哺。這一「失敗」不只體現了我們反哺社區的意願和熱情,也是更好融入開源社區的一次很好的學習機會。
  • Service Mesh架構反思:數據平面和控制平面的界線該如何劃定?
    這時的service mesh,主要是以proxy/sidecar的形式出現,功能基本都在sidecar中(linkerd有個named的模塊分出了部分功能)。使服務能夠在多個維度上分配和釋放配額,當服務消費者對有限的資源發生搶佔時,配額就成了一種有效的資源管理工具,它為服務之間的資源搶佔提供相對的公平。頻率控制就是配額的一個實例。遙測報告。使服務能夠上報日誌和監控。在未來,它還將啟用針對服務運營商以及服務消費者的跟蹤和計費流。
  • 推薦|目前最完整的Istio Service Mesh示例教程匯總
    只要傻瓜式操作就可以部署一個Istio出來,同時還提供了Weave scope可以對service mesh的中的服務關係做可視化呈現。同時還能提供部分監控功能,比如服務狀態,CPU和內存使用情況。
  • Service Mesh 是什麼,我們為什麼需要它?
    在這篇文章,我會講解 Service Mesh 的定義,並通過應用服務架構過去十年的發展追溯其起源。並將 Service Mesh 與其他相似的概念,包括 API 網關,邊緣代理以及 ESB (enterprise service bus)進行區分。最終,將會描述 Service Mesh 的發展方向,以及隨著雲原生概念的普及,Service Mesh 發生的變化。
  • Mesh8# Envoy原理提點與常用命令
    Enovy Mesh: 由一組Envoy組成的拓撲網絡Listener:  監聽器負責監聽數據埠,接受下遊的連接和請求,下遊主機通過Listener連接EnvoyCluster: 集群管理後端服務服務的連接池