云原生|為什么服務網格能夠輕松重塑微服務?一文講清楚!

目錄

一、概述

二、 設計

三、服務網格

四、總結


一、概述

容器化技術與容器編排推動了微服務架構應用的演進,于是應用的擴展與微服務的數量日益增加,新的問題隨之而來,監控服務的性能變得越來越困難,微服務與微服務之間相互通信變得越來越復雜,請求鏈路越來越長,排查問題變得越來越繁瑣……

云原生應用下使用服務網格作為解決上述問題的方案之一。

服務網格不僅描述了這個應用的網絡,而且還描述了分布式應用程序組件之間的交互,所有在該應用之間傳遞的數據都會由服務網格來接管。這意味著它能管控流量,控制路由……如果僅僅只是這些倒是與傳統的網關基礎設施沒什么區別。但微服務體系結構通常還有更復雜的操作需求,比如A/B測試,Canary部署,速率限制,訪問控制,加密和端到端身份驗證等。

服務網絡可以通過可觀測性,網絡和安全策略來分隔應用程序的業務邏輯。通過服務網格可以鏈接微服務,讓微服務更安全,可以更好地監控微服務。

二、 設計

假設我們現在已存在一個微服務架構的系統,但是我們用傳統的網關代理方式來作為服務之間的通信代理(如下圖所示)。

圖片

可以看到Nginx代理了該系統中的所有服務,無論是服務1還是Minio,DB等都在Nginx的代理下。在這種網絡代理下如果Server1請求Server2還是訪問DB服務都要將流量先打到Nginx,然后再由路由進行分發,代理到具體的某個服務下。

在上述這種代理模式下,服務的Path管理會變得很繁瑣,每引入或者擴容一個新服務就需要更改一次Nginx的配置,服務可能因為某種原因而崩潰,但是Nginx只能做到基礎的健康檢查,如果想做負載均衡還得再調整配置……

服務發現也許能通過引入Consul來解決,但是路由的代理最終還是需要在網關層面做配置,健康檢查也不能解決服務因為崩潰后斷連的問題,手動運維這些會相當繁瑣。這時候可能會想:不如直接上Kubernetes,容器化技術解決自啟動的問題,Kubernetes中自帶服務發現/注冊,只需要使用Nginx代理一下Server就好。

于是設計可能會演變成:

圖片

上述示意圖中為了代理各個服務,由ingress接管原本Nginx路由分發,然后將流量轉發給Service,由Service來做負載均衡。而Minio則代表著?些邊緣服務。

Minio API 在代碼訪問中不能添加Path路徑,它的安全策略不允許,所以 www.demo.com/minio 這類的地址是無法訪問的。使用Ingress時代理Minio需要額外申請一個域名。

當請求從客戶端發起時,由Nginx轉發到Kubernetes Nginx-Ingress服務端口,再由Ingress進行流量分割發送到不同的Service。這一網絡鏈路看似沒什么問題,但是在做單體應用向微服務應用拆分時,往往也容易背負巨大的技術債務。

例如:Minio/DB從單體部署演變成集群,勢必涉及到部署的方式改變,數據的遷移,數據備份,容災等......某些暫時無法進行拆分的基礎設施成為了云原生環境下的邊緣服務,示意圖中的Minio也代表著這一類的服務(它們不好拆分或成本略高)。

于是我們依舊保留著Nginx作為唯一網關的入口,并代理一部分的邊緣服務,業務服務的網絡代理由Kubernetes接管,服務與服務之間的通信使用集群網絡。

上述的方案可能對于一定規模的應用下夠用了,但是隨著業務要求,引入一些新技術,比如為了服務的穩定性,要求上線前做金絲雀發布(Kubernetes固然可以通過更改Pod的數量來按照比例伸縮達到目的);收集整個系統的日志信息(還記得我們有一部分部署在集群之外的邊緣服務嗎?);跨集群進行訪問,亦或跨不同云廠商的集群訪問;

這些新技術的引入會讓原本就復雜的網絡鏈路變得更加復雜,當你想對系統進行測壓時,一個配置(可能是Nginx的配置,也可能是Ingress的配置)錯誤都會讓你難以定位,可能你會找錯瓶頸,混淆你的判斷從而走向錯誤的方向。

三、服務網格

Kubernetes最精細的顆粒度也只能達到容器層次,如果再想進一步只能依靠工程師來管理,容器編排系統很難提供更有效的支持。但是服務網格的出現就是為了彌補這一缺憾。

服務網格只是處理程序間通信的基礎設施,但它不是一個獨立的存在,它以"邊車"的形式直接部署在應用旁邊,一對一為應用提供服務代理。

"邊車",?種常見的容器設計模式,用來形容外掛在容器身上的輔助程序。

服務網格在容器的支持下,不需要侵入業務代碼就能強制性地對應用通信進行管理,原理類似中間人流量劫持,透明地接管容器。

下圖出自《鳳凰架構》

圖片

服務網格包括兩大塊內容:和微服務共同部署的邊車代理;用于控制這些代理的管理者;服務網格使用數據平面通信和控制平面通信來形容這兩類流量。

我們使用服務網格其實希望更好梳理網絡的訪問鏈路,期望在基礎設施服務就能解決網絡的一部分問題,比如中斷重試,不同云廠商之間平穩遷移,統一納入網絡平面,不依賴程序就能控制訪問等……

數據平面也被稱為轉發平面,為了在不可靠的物理網絡中保證程序間通信的最大可靠性,它可以在無感情況下自動完成服務路由,健康檢查,負載均衡,認證鑒權,產生監控數據等……

四、總結

我們從單體應用向微服務的演變講述了網絡代理在各個階段的變化。服務網格可能是未來的一個趨勢,時至今日服務網格的代表Istio已經從CNCF中畢業了,但服務網格并非是"銀彈",它不支持與其他系統或服務集成,也不解決轉換映射或路由類型之類的問題……使用服務網格也需要云原生環境,一些邊緣,獨立部署的服務也無法納入系統中享受新技術帶來的便利;引入一套全新的網絡服務也會增加應用的成本,使用不當反而會增加項目風險,留下成本巨大的技術債務。?

在實際項目中我們需要考慮不同應用架構,規模使用最合適的網絡服務代理。如果僅僅只是一個單體應用,那么Nginx或許是最好的選擇;如果是正在演進的分布式系統,又在不斷迭代,那么Nginx ingress 在這一階段也許就能滿足需求;如果微服務應用已經達到一定規模,開發工程師或運維工程師已經無法了解整個系統的全貌,那使用服務網格倒也無可厚非。

版權聲明:本文由神州數碼云基地團隊整理撰寫,若轉載請注明出處。

公眾號搜索神州數碼云基地,了解更多技術干貨!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14306.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

v-rep--lua接口和c++接口的關聯

我們在coppeliasim中調用的lua腳本函數sim.xxxxx()的執行規律有兩種情況: 1,要么就是在coppliasim的sim.lua中有這個lua函數的定義,直接執行這個lua函數即可。比如,sim.creatPath(); 2,要么就是這個lua接口沒有lua語…

Kafka-集群管理者(Controller)選舉機制、任期(epoch)機制

Kafka概述 Kafka-集群管理者(Controller)選舉機制 Kafka中的Controller是Kafka集群中的一個特殊角色,負責對整個集群進行管理和協調。Controller的主要職責包括分區分配、副本管理、Leader選舉等。當當前的Controller節點失效或需要進行重新…

嵌入式實時操作系統筆記1:RTOS入門_理解簡單的OS系統

今日開始學習嵌入式實時操作系統RTOS:UCOS-III實時操作系統 本次目標是入門RTOS,理解多任務系統...... 本文只是個人學習筆記,基本都是對網上資料的整合...... 目錄 STM32裸機與RTOS區別: 裸機中斷示例: RTOS對優先級…

汽車標定技術(二十一)--英飛凌TC3xx的OLDA怎么玩?(2)

目錄 1.概述 2.Vector提出的OLDA概念 2.1 RAM Copy 2.2 Data Trace 3.小結 1.概述 上一篇汽車標定技術(二十一)--英飛凌TC3xx的OLDA怎么玩?(1)-CSDN博客,我們講了TC3xx

Spring MVC/Web

1.Spring MVC 的介紹 Spring Web MVC是基于Servlet API構建的原始Web框架,也是Spring框架的一部分。它提供了靈活可擴展的MVC架構,方便開發者構建高性能的Web應用程序,并與 Spring 生態系統無縫集成。 2.MVC 設計模式 MVC(Model…

設計模式—23種設計模式重點 表格梳理

設計模式的核心在于提供了相關的問題的解決方案,使得人們可以更加簡單方便的復用成功的設計和體系結構。 按照設計模式的目的可以分為三大類。創建型模式與對象的創建有關;結構型模式處理類或對象的組合;行為型模式對類或對象怎樣交互和怎樣…

CSS實現圖片浮動在底層 div 之上,而不會影響底層 div 的布局和內容

前言&#xff1a;遇到個需求&#xff0c;需要圖片顯示在div之上&#xff0c;但是不占用div的空間布局&#xff0c;網上的答案五花八門&#xff0c;但其實使用css就可以簡單實現&#xff0c;僅以此博客作為記錄 舉個栗子 <div class"container"><img src&qu…

Linux 網絡編程基礎——網絡模型

網絡模型 網絡模型1. OSI七層模型1. 物理層&#xff08;Physical Layer&#xff09;2. 數據鏈路層&#xff08;Data Link Layer&#xff09;3. 網絡層&#xff08;Network Layer&#xff09;4. 傳輸層&#xff08;Transport Layer&#xff09;5. 會話層&#xff08;Session Lay…

研發機構大數據遷移如何保障敏感數據不泄露

隨著云計算和大數據技術的飛速進步&#xff0c;越來越多的企業正試圖通過數據遷移來提升IT基礎設施的效率&#xff0c;減少成本&#xff0c;并增強業務的靈活性。但是&#xff0c;這一過程并非沒有它的挑戰&#xff0c;尤其是在數據安全方面。數據在轉移過程中可能會遭遇黑客攻…

SQL的多表聯查

這里我先附上兩張表的數據&#xff1a; Orders 表: OrderIDCustomerID1321324NULL Customers 表: CustomerIDCustomerName1Alice2Bob3Charlie4David INNER JOIN &#x1f91d; 概念&#xff1a; INNER JOIN&#xff08;內連接&#xff09;返回兩個表中匹配的記錄。如果某條…

解決深度確定問題:使用不相交集合森林

解決深度確定問題&#xff1a;使用不相交集合森林 引言不相交集合森林&#xff08;DSF&#xff09;基礎按秩合并與路徑壓縮深度確定問題的解決方案實現MAKE-TREE修改FIND-SET實現FIND-DEPTH實現GRAFT分析最壞情況運行時間結論參考文獻 引言 在計算機科學中&#xff0c;樹結構是…

時空扭曲:重溫相對論的終極挑戰,探尋真理的腳步

大家都知道&#xff0c;相對論是愛因斯坦提出的劃時代理論&#xff0c;為人類認知時空和引力做出了革命性貢獻。但這個理論真的萬無一失嗎&#xff1f;近日&#xff0c;一項新研究提出了測試時間扭曲的新方法&#xff0c;或許能讓我們重新審視相對論在宇宙大尺度上的適用性。 時…

HTML5好看的通用網站模板源碼

文章目錄 1.設計來源1.1 主界面1.2 模板菜單1 界面1.3 模板菜單2 界面1.4 模板菜單3 界面1.5 下拉菜單1 界面1.6 下拉菜單2 界面1.7 模板菜單4 界面1.8 模板菜單5 界面1.9 界面底部 2.效果和源碼2.1 動態效果2.2 源碼目錄2.3 源代碼 源碼下載 作者&#xff1a;xcLeigh 文章地址…

Python 造數據神器Faker

大家好&#xff0c;在編寫代碼過程中&#xff0c;我們經常需要一些假數據來進行測試或者演示。手動創建這些數據不僅耗時&#xff0c;而且容易出錯。幸運的是&#xff0c;Python有一個非常有用的庫叫做Faker&#xff0c;它可以生成各種類型的假數據&#xff0c;從名字、地址到公…

【驅動】ARM手冊引腳寄存器地址(絕對物理地址)查找(以AM437x為例)

1、問題描述 在配置設備樹時,經常遇到如下宏: XXX_IOPAD(pa, val)實際定義如下: DRA7XX_CORE_IOPAD(pa, val) AM33XX_IOPAD(pa, val) DM816X_IOPAD(pa, val) DM814X_IOPAD(pa, val) AM4372_IOPAD(pa, val)一般注釋中的說明如下: 原文:Macro to allow using the absol…

md5和byte64字符串加密

說明&#xff1a;最近碰到一個需求&#xff0c;網絡請求&#xff0c;傳遞json的時候&#xff0c;必須加密&#xff0c;對字符串加密&#xff0c;然后前端去解密字符串&#xff0c;然后解析json&#xff0c;展示數據&#xff0c;可逆 step1: Md5加密方式 package com.example.…

Java技術精粹:高級面試問題與解答指南(一)

Java 面試問題及答案 問題1&#xff1a;請解釋Java中的多態性&#xff0c;并給出一個例子。 答案&#xff1a; 多態性是Java中的一個重要特性&#xff0c;它允許一個引用類型可以指向多種實際類型的對象&#xff0c;并且可以通過這個引用調用實際對象的方法。多態性主要通過繼…

JAVA:常見的加密算法簡介

一、前言 加密算法是指將明文信息轉變為密文信息的過程&#xff0c;即將信息從可讀形式&#xff08;明文&#xff09;轉換為加密形式&#xff08;密文&#xff09;的過程。在加密過程中&#xff0c;信息通過加密算法和加密密鑰被加密處理&#xff0c;加密后的信息&#xff08;密…

【代碼隨想錄算法訓練Day17】LeetCode 110. 平衡二叉樹、LeetCode 257.二叉樹的所有路徑、LeetCode 404.左葉子之和

Day17 二叉樹第四天 LeetCode 110. 平衡二叉樹【后序遍歷】 平衡二叉樹仍是后序遍歷&#xff0c;就是獲取左右子樹的高度然后作差&#xff0c;如果子樹就不平衡&#xff0c;那么就直接將-1向上傳給父節點&#xff0c;否則該數的高度為左右子樹高度的最大值1。 class Solutio…

day 38 435.無重疊區間 763.劃分字母區間 56. 合并區間 738.單調遞增的數字 968.監控二叉樹

435.無重疊區間 思路 為了使區間盡可能的重疊所以排序來使區間盡量的重疊&#xff0c;使用左邊界排序來統計重疊區間的個數與452. 用最少數量的箭引爆氣球恰好相反。 代碼 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,…