Spring Cloud 還沒學明白,Istio 又是什麼鬼??

来源:https://www.cnblogs.com/javastack/archive/2022/07/28/16528563.html
-Advertisement-
Play Games

背景 過去,我們運維著“能做一切”的大型單體應用程式。這是一種將產品推向市場的很好的方式,因為剛開始我們也只需要讓我們的第一個應用上線。 而且我們總是可以回頭再來改進它的。部署一個大應用總是比構建和部署多個小塊要容易。 集中式: 集群: 分散式: 分散式和集中式會配合使用。 我們在搭建網站的時候,為 ...


背景

過去,我們運維著“能做一切”的大型單體應用程式。這是一種將產品推向市場的很好的方式,因為剛開始我們也只需要讓我們的第一個應用上線。

而且我們總是可以回頭再來改進它的。部署一個大應用總是比構建和部署多個小塊要容易。

集中式:

集群:

分散式:

分散式和集中式會配合使用。

我們在搭建網站的時候,為了及時響應用戶的請求,尤其是高併發請求的時候,我們需要搭建分散式集群來處理請求。

我們一個伺服器的處理能力是有限的。如果用我們一臺設備當作伺服器,那麼當併發量比較大的時候,同一時間達到上百的訪問量。那伺服器就宕機了。然後只能重啟伺服器,當出現高併發訪問的時候,就又會宕機。

所以我們需要更多的伺服器來並行工作,處理用戶的請求。那麼問題來了,我們伺服器運行的時候,怎麼分發大量的請求給不同的伺服器呢?

一般會採用(1apache+nTomcat)或者伺服器模式來分發並處理請求。或者採用nginx分發請求。

微服務是運行在自己的進程中的可獨立部署的服務套件。他們通常使用 HTTP 資源進行通信,每個服務通常負責整個應用中的某一個單一的領域。

在流行的電子商務目錄例子中,你可以有一個商品條目服務,一個審核服務和一個評價服務,每個都只專註一個領域。

用這種方法讓多語言服務(使用不同語言編寫的服務)也成為可能,這樣我們就可以讓 Java/C++ 服務執行更多的計算密集型工作,讓 Rails / Node.js 服務更多來支持前端應用等等。

微服務會成為大規模分散式應用的主流架構。任何複雜的工程問題都會歸結為devide and conquer(分而治之),意思就是就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……

直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。微服務本質是對服務的拆分,與工程領域慣用的“分而治之”的思路是一致的。

Spring Cloud 與 K8S 對比

兩個平臺 Spring Cloud 和 Kubernetes 非常不同並且它們之間沒有直接的相同特征。

兩種架構處理了不同範圍的MSA障礙,並且它們從根本上用了不同的方法。Spring Cloud方法是試圖解決在JVM中每個MSA挑戰,然而Kubernetes方法是試圖讓問題消失,為開發者在平臺層解決。

Spring Cloud在JVM中非常強大,Kubernetes管理那些JVM很強大。同樣的,它就像一個自然發展,結合兩種工具並且從兩個項目中最好的部分受益。

可以看到,裡面差不多一半關註點是和運維相關的。這麼看來,似乎拿spring cloud和kubernetes比較有點不公平,spring cloud只是一個開發框架,對於應用如何部署和調度是無能為力的,而kubernetes是一個運維平臺。

也許用spring cloud+cloud foundry去和kubernetes比較才更加合理,但需要註意的是,即使加入了cloud foundry的paas能力,spring cloud仍然是“侵入式”的且語言相關,而kubernetes是“非侵入式”的且語言無關。

Spring Cloud vs Istio

這裡面哪些內容是我們可以拿掉或者說基於 Service Mesh(以 Istio 為例)能力去做的?

分析下來,可以替換的組件包括網關(gateway 或者 Zuul,由Ingress gateway 或者 egress 替換),熔斷器(hystrix,由SideCar替換),註冊中心(Eureka及Eureka client,由Polit,SideCar 替換),負責均衡(Ribbon,由SideCar 替換),鏈路跟蹤及其客戶端(Pinpoint 及 Pinpoint client,由 SideCar 及Mixer替換)。

這是我們在 Spring Cloud 解析中需要完成的目標:即確定需要刪除或者替換的支撐模塊。

可以說,springcloud關註的功能是kubernetes的一個子集。

可以看出,兩邊的解決方案都是比較完整的。kubernetes這邊,在Istio還沒出來以前,其實只能提供最基礎的服務註冊、服務發現能力(service只是一個4層的轉發代理),istio出來以後,具有了相對完整的微服務能力。

而spring cloud這邊,除了發佈、調度、自愈這些運維平臺的功能,其他的功能也支持的比較全面。相對而言,雲廠商會更喜歡kubernetes的方案,原因就是三個字:非侵入。

平臺能力與應用層的解耦,使得雲廠商可以非常方便的升級、維護基礎設施而不需要去關心應用的情況,這也是我比較看好service mesh這類技術前景的原因。

Spring Boot + K8S

如果不用 Spring Cloud,那就是使用 Spring Boot + K8S。

Spring Boot 基礎就不介紹了,推薦下這個實戰教程:

https://github.com/javastacks/spring-boot-best-practice

這裡就需要介紹一個項目,Spring Cloud Kubernetes,作用是把kubernetes中的服務模型映射到Spring Cloud的服務模型中,以使用Spring Cloud的那些原生sdk在kubernetes中實現服務治理。

具體來說,就是把k8s中的services對應到Spring Cloud中的services,k8s中的endpoints對應到Spring Cloud的instances。這樣通過標準的Spring Cloud api就可以對接k8的服務治理體系。

老實說,個人認為這個項目的意義並不是很大,畢竟都上k8了,k8本身已經有了比較完善的微服務能力(有註冊中心、配置中心、負載均衡能力),應用之間直接可以互相調用,應用完全無感知,你再通過sdk去調用,有點多此一舉的感覺。

而且現在強調的是語言非侵入,Spring Cloud一個很大的限制是只支持java語言(甚至比較老的j2ee應用都不支持,只支持Spring Boot應用)。所以我個人感覺,這個項目,在具體業務服務層面,使用的範圍非常有限。

藉助於Spring Cloud Kubernetes項目,zuul可以以一種無侵入的方式提供api網關的能力,應用完全不需要做任何改造,並且網關是可插拔的,將來可以用其他網關產品靈活替換,整體耦合程度非常低。

得益於k8的service能力,zuul甚至支持異構應用的接入,這是Spring Cloud體系所不具備的。

而本身基於java開發,使得java程式員可以方便的基於zuul開發各種功能複雜的filter,而不需要去學習go或者openresty這樣不太熟悉的語言。

Service Mesh的價值

無論是單體應用,還是分散式應用,都可以建立在Service Mesh上,mesh上的sidecar支撐了所有的上層應用,業務開發者無須關心底層構成,可以用Java,也可以用Go等語言完成自己的業務開發。

當微服務架構體系越來越複雜的時候,需要將“業務服務”和“基礎設施”解耦,將一個微服務進程一分為二:

為什麼代理會叫sidecar proxy?

看了上圖就容易懂了,biz和proxy相生相伴,就像摩托車(motor)與旁邊的車廂(sidecar)。

未來,sidecar和proxy就指微服務進程解耦成兩個進程之後,提供基礎能力的那個代理進程。

Istio的理論概念是Service Mesh(服務網路),我們不必糾結於概念實際也是微服務的一種落地形式有點類似上面的SideCar模式。

它的主要思想是關註點分離,即不像SpringCloud一樣交給研發來做,也不集成到k8s中產生職責混亂,Istio是通過為服務配 Agent代理來提供服務發現、負截均衡、限流、鏈路跟蹤、鑒權等微服務治理手段。

Istio開始就是與k8s結合設計的,Istio結合k8s可以牛逼的落地微服務架構。

istio 超越 spring cloud和dubbo 等傳統開發框架之處, 就在於不僅僅帶來了遠超這些框架所能提供的功能, 而且也不需要應用程式為此做大量的改動,開發人員也不必為上面的功能實現進行大量的知識儲備。

但結論是不是 spring cloud 能做到的,k8s + istio 也能做到?甚至更好?

原文鏈接:https://blog.csdn.net/zhangxin09/article/details/105342762

版權聲明:本文為CSDN博主「sp42a」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:本文所用到的版本 MySql 8.0.28 SpringBoot 2.7.2 準備工作 :建表 、pom.xml導入依賴 、application.yml 配置 建表 CREATE TABLE `rna` ( `id` int NOT NULL AUTO_INCREMENT, `name` va ...
  • NoSQL(Not Only SQL),即反SQL運動或者是不僅僅SQL,指的是非關係型的資料庫,是一項全新的資料庫革命運動,是一種全新的思維註入 NoSQL優點 資料庫高併發讀寫 海量數據高效率存儲和訪問 資料庫高擴展性和高可用性 NoSQL缺點 資料庫事務一致性需求 資料庫的寫實時性和讀實時性需 ...
  • 多線程簡介 1.Process與Thread 程式本身是指定和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念。 而進程則是執行程式中的一次執行過程,是一個動態的概念。是系統能夠資源分配的單位。 通常在一個進程里,可以包含若幹個線程,當然一個進程至少有一個線程,不然沒有存在的意義。 線程是 ...
  • 作者:明明如月學長 鏈接:https://juejin.cn/post/7118073840999071751 一、背景 有些業務場景下需要將 Java Bean 轉成 Map 再使用。 本以為很簡單場景,但是坑很多。 二、那些坑 2.0 測試對象 import lombok.Data; impor ...
  • 前言 😋 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 本次採集網介紹:圖書頻道-全球最大中文網上書店 專業提供小說傳記,青春文學,成功勵志,投資理財等各品類圖書 暢銷榜最新報價、促銷、評論信息,引領最新網上購書體驗! 環境使用 🎈: Python 3.8 Pycharm 模塊使用 🎠: reque ...
  • 1. 簡介 1.1什麼是Mybatis MyBatis 是一款優秀的持久層框架 它支持自定義 SQL、存儲過程以及高級映射。 MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。 MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 Java POJ ...
  • 問題描述 用python 讀取csv文件時,報錯utf-8' codec can't decode byte 0xff in position 0: invalid start byte 問題原因 打開所用的編碼方式不對,需要指定該csv文件所用編碼 解決方法 1.找到該csv文件所用編碼方法 用記 ...
  • 兄弟們,溫故而知新,可以為師矣。 就是說,我們所學過的東西,要去多複習,這樣才能總結出屬於自己的理解,這樣就可以做老師了。 但是我以為的我以為,後面可以改成,將自己所學及所領會的教給別人,這樣才能更加記憶深刻。 今日內容:Python將多個文件多列進行關聯 知識點 文件讀寫 基礎語法 異常處理 迴圈 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...