關於SpringCloud的微服務以及組件詳解
一、SpringCloud
1.1、什麼是SpringCloud
SpringCloud不同於其他 Spring 的優秀項目, 它不再是 像SpringSecurity、SpringMvc... 的一個基礎框架
, 而是一個更高層次的、 架構視角的綜合性大型項目, 他的目標是構建一套標準化的微服務解決方案
。讓架構師、 開發者在使用微服務理念構建應用系統的時候, 面對各個環節的問題都可以找到相應的組件來處理。
引用網友戲稱的一個比喻:Spring Cloud 可以說是 Spring 社區為微服務架構提供的一個 “ 全傢桶 ” 套餐。 由於 “ 套餐 ” 中的組件通過一個社區進行包裝與整合, 使得 “ 套餐 ” 中各個組件之間的配合變得更加和諧, 這可以有效減少我們在組件的選型和整合上花費的精力
, 所以它可以幫助我們快速構建起基礎的微服務架構系統。
1.2、SpringCloud缺點
Spring Cloud因其涵蓋的內容非常廣泛,因此對於很多初學者來說就像被專業名詞轟炸瞭一樣, 入門的難度也就大大提高瞭。 同時, 中文文檔與資料的匱乏,以及官方文檔的內容對於使用描述並不夠細致等問題, 也直接提升瞭使用者的學習門檻。
二、什麼是微服務架構
2.1、什麼是微服務
“微服務 ”是在2014年3月名字叫Martin Fowler
所提出的
微服務是系統架構上的一種設計風格, 它的主旨是將一個原本獨立的系統拆分成多個小型服務
,這些小型服務都在各自獨立的進程中運行,服務之間通過基於HTTP的RESTful API進行通信協作。由於有瞭輕量級的通信協作基礎, 所以這些微服務可以使用不同的語言來編寫。
2.2、微服務有什麼優點
微服務就是將單個應用拆分為瞭多個應用(這裡的應用可以理解為jar包或war包),然後通過框架提供的網關、服務治理、服務發現、服務熔斷等等,給人的感覺就會像是一個應用,主要目的是拆分多個應用,一旦並發、cpu、內存達到一定的瓶頸,可以采取多機部署,分擔服務器壓力。
往往一個龐大的高並發的業務系統都會采用微服務。同時微服務給人的感覺就是專業的人幹專業的事,訂單模塊就是負責訂單業務,用戶模塊就是負責用戶相關業務,這樣做的好處就是項目比較好維護。
2.3、微服務面臨的問題
在實施微服務之前, 我們必須要知道, 微服務雖然有非常多吸引人的優點, 但是也因為服務的拆分引發瞭諸多原本在單體應用中沒有的問題。
- 運維的新挑戰:運維人員需要維護的進程數量會大大增加,運維過程需要更多的自動化, 這就要求運維人員具備一定的開發能力來編排運維過程並讓它們能自動運行起來(往往因為這一點 慢慢演變的開發也得具備一定的運維能力)。
- 接口的一致性:雖然我們拆分瞭服務, 但是業務邏輯上的依賴並不會消除,
隻是從單體應用中的代碼依賴變為瞭服務間的通信依賴
。 而當我們對原有接口進行瞭一些修改, 那麼交互方也需要協調這樣的改變來進行發佈, 以保證接口的正確調用。我們需要更完善的接口和版本管理, 或是嚴格地遵循開閉原則
。 - 分佈式的復雜性:由於拆分後的各個微服務都是獨立部署並運行在各自的進程內,它們隻能通過通信來進行協作, 所以分佈式環境的問題都將是微服務架構系統設計時需要考慮的重要因素, 比如
網絡延遲、 分佈式事務、 異步消息
等。
一旦使用微服務意味著項目會有很多個,我們不可能再使用傳統的方式使用tomcat來部署瞭。 tomcat部署缺點:一旦有一個服務更新就需要重啟tomcat 這時候就需要打jar包,使用java -jar命令來啟動項目瞭,使用java -jar啟動項目一旦有很多的話不容易維護, 於是便引進瞭docker部署,docker可以和jenkins相結合 來完成
微服務的自動化部署
,同時這也是現在很流行的技術體系。
2.4、架構類型劃分
下面這張圖代表的是我們的思想一直在不斷變化,從剛開始的ORM對象關系映射,到後面的MVC分層,RPC遠程調用,最後到現在流行的SOA面向服務開發。
2.4.1、單一應用架構
不斷擴大的需求會使得單體應用變得越來越腕腫。單體應用的問題就逐漸凸顯出來, 由於單體系統部署在一個進程內, 往往我們修改瞭一個很小的功能, 為瞭部署上線會影響其他功能的運行。隨著系統的發展, 維護成本會變得越來越大, 且難以控制。
2.4.2、垂直應用架構
每個小應用各自都有自己獨立的、完整的可運行的一套系統。
2.4.3、分佈式服務架構
目前我接手的幾個項目都是用的這個架構,服務之間調用並沒有用註冊中心。
應用之間交互不可避免,將核心業務抽取出來,用於提高業務復用及整合的分佈式服務框架(RPC)是關鍵。
2.4.4、流動計算架構
應用越來越多,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率
三、版本選擇
使用springcloud必然離不開springboot,這兩個框架的版本可不是隨便一選就能搭配使用的,假如用的版本不對,可能會出現各種問題。
3.1、SpringBoot版本
springboot官網:https://spring.io/projects/spring-boot
springboot的git源碼地址:https://github.com/spring-projects/spring-boot
通過官網可以發現:截至目前springboot最穩定的版本是2.7.0
依稀記著我上傢公司springboot版本是用的1.5.9
版本,項目是比較老的,已經有三四年瞭並且是個大項目。官網也明確說明瞭,強烈建議升級到2.0
及以上版本。
3.2、SpringCloud版本
springcloud官網:https://spring.io/projects/spring-cloud springcloud的git源碼地址:https://github.com/spring-cloud
SpringCloud是一個由許多子項目組成的綜合項目,各子項目有不同的發佈節奏。為瞭管理SpringCloud與各子項目的版本依賴關系,發佈瞭一個清單,其中包括瞭某個SpringCloud版本對應的子項目版本。
為瞭避免SpringCloud版本號與子項目版本號混淆,SpringCloud版本采用瞭名稱而非版本號的命名,這些版本的名字采用瞭倫敦地鐵站的名字,根據字母表的順序來對應版本時間順序。例如Angel是第一個版本, Brixton是第二個版本。
當SpringCloud的發佈內容積累到臨界點或者一個重大BUG被解決後,會發佈一個"service releases"版本,簡稱SRX版本,比如Greenwich.SR2就是SpringCloud發佈的Greenwich版本的第2個SRX版本。
目前我們公司有一個項目就是用的 Hoxton.SR4版本的SpringCloud + 2.2.5.RELEASE(RELEASE代表是發行版)版本的SpringBoot
截止目前官網最新可使用的版本是2021.0.3
:
GA:General Availability: 正式發佈的版本,官方推薦使用此版本。在國外都是用GA來說明release版本的。CURRENT:當前推薦的版本PRE:裡程碑版/預覽版本SHAPSHOT:快照
這裡隻是一個標識,方便大傢在使用的時候,進行選擇版本,我們一般選擇是CURRENT和GA版本
3.3、如何進行版本選擇
官網提供瞭cloud和springboot的版本對應。
更詳細的查看:https://start.spring.io/actuator/info
這個是官網提供的,會給我們返回更詳細的版本對應關系,如果我們不知道版本怎麼選擇,可以看這個網站 ,網站返回的是json,我們需要格式化一下。
在線json格式化:https://www.sojson.com/
現在要是學習最新的SpringCloud和SpringBoot應該用哪個版本?
四、Cloud組件
4.1、Cloud組件介紹
這張圖是兩年前springcloud的所有組件,其中有很多組件已經不再更新,不再更新不代表不能用,隻能說不建議再用瞭,當下最流行的組件是Spring Cloud Alibaba
。
4.1.1、Spring Cloud Netflix
Netflix(Nasdaq NFLX) 美國奈飛公司,是一傢會員訂閱制的流媒體播放平臺。由於微服務的快速發展,Netflix公司的微服務又相對比較成熟,於是在技術上毫無保留的把一整套微服務架構核心技術棧開源瞭出來,叫做Netflix OSS,也正是如此,在技術上依靠開源社區的力量不斷的壯大。
Pivotal在Netflix開源的一整套核心技術產品線的同時,做瞭一系列的封裝,就變成瞭Spring Cloud;Spring Cloud隻是集成Netflix的各個組件,實現瞭各種starter,例如Eureka-starter、Zuul-starter,可以理解成簡化Netflix微服務的使用,但是底層仍然是引用的Netflix
,封裝過後同時又可以和其他Spring Cloud產品進行無縫集成。
Netflix的各個組件在2018年是最火的一年,而後面相對來說他的很多產品已經基本上不再使用,原因就是Netflix的部分組件已經停更。再加上由於他的停更,Alibaba就采取瞭他的思想,研究出瞭Spring Cloud Alibaba,而對於現在而言Spring Cloud Alibaba基本上完全可以取代Netflix組件。
Netflix源碼社區:https://github.com/Netflix
Spring Cloud Netflix的五大組件(神獸):
- Eureka:服務註冊和發現,它提供瞭一個服務註冊中心、服務發現的客戶端,還有一個方便的查看所有註冊的服務的界面。 所有的服務使用Eureka的服務發現客戶端來將自己註冊到Eureka的服務器上。
- Zuul:網關,所有的客戶端請求通過這個網關訪問後臺的服務。他可以使用一定的路由配置來判斷某一個URL由哪個服務來處理。並從Eureka獲取註冊的服務來轉發請求。
- Ribbon:即負載均衡,Zuul網關將一個請求發送給某一個服務的應用的時候,如果一個服務啟動瞭多個實例,就會通過Ribbon來通過一定的負載均衡策略來發送給某一個服務實例。
- Feign:服務客戶端,服務之間如果需要相互訪問,可以使用RestTemplate,也可以使用Feign客戶端訪問。它默認會使用Ribbon來實現負載均衡。
- Hystrix:監控和斷路器。我們隻需要在服務接口上添加Hystrix標簽,就可以實現對這個接口的監控和斷路器功能。
Spring Cloud Netflix的其他組件:
- Archaius:動態屬性配置框架,URL、JDBC 和 Amazon DynamoDB 的動態配置源的實現。
- Turbine:Turbine 是一種用於將服務器發送事件 (SSE) JSON 數據流聚合成單個流的工具。Hystrix的監控中,隻能監控單個節點,實際生產中都為集群,因此可以通過Turbine來監控集群下Hystrix的metrics情況。
4.1.2、Spring Cloud Alibaba
Spring Cloud Alibaba組件:
- Nacos:Nacos是現在開發當中出場率最高的,他可以完成服務發現、配置管理、DNS服務,也就是一個組件可以完成config、Eureka、Bus三個組件的功能。
spring-cloud-starter-alibaba-nacos-discovery
:服務發現是微服務架構中的關鍵組件之一。在這樣的架構中,手動為每個客戶端配置服務列表可能是一項艱巨的任務,並且使動態擴展變得極其困難。Nacos Discovery 幫助您將服務自動註冊到 Nacos 服務器
,Nacos 服務器會跟蹤服務並動態刷新服務列表
。此外,Nacos Discovery 將服務實例的一些元數據,如主機、端口、健康檢查 URL、主頁等註冊到 Nacos。spring-cloud-starter-alibaba-nacos-config
:使用 Spring Cloud Alibaba Nacos Config 基於 Spring Cloud 的編程模型快速接入 Nacos 配置管理能力。
- sentinel:Sentinel中文名稱是哨兵,Sentinel 主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助用戶提升服務的穩定性。流量監控就是您可以看到您的服務器的監控數據,精確到秒級,甚至可以看到少於 500 個節點的集群的整體運行狀態,pom依賴
spring-cloud-starter-alibaba-sentinel
。 - dubbo:Alibaba提供瞭
spring-cloud-starter-dubbo
,對dubbo進行的封裝,主要是為瞭讓我們更好的讓dubbo和Cloud其他組件進行集成使用。 - RocketMQ:是一個開源的分佈式消息系統。它基於高可用分佈式集群技術,提供低延遲、高穩定性的消息發佈和訂閱服務。Alibaba提供瞭
spring-cloud-starter-stream-rocketmq
,幫我們在cloud當中很方便的集成RocketMQ。 - ANS:Alibaba提供瞭
spring-cloud-starter-alicloud-ans
,ANS(Application Naming Service)是EDAS的一個組件。Spring Cloud 阿裡雲 ANS 提供符合 Spring Cloud 規范的商業版服務註冊和發現,讓您可以在本地開發應用,在雲端運行。 - acm:Alibaba提供瞭
spring-cloud-starter-alicloud-acm
,Spring Cloud阿裡雲ACM是Spring Cloud客戶端商用產品ACM (Application Configuration Management)的一個實現,是免費的。 - OSS:Alibaba提供瞭
spring-cloud-starter-alicloud-oss
,OSS(Object Storage Service)是阿裡雲上的存儲產品。alicloud-oss提供符合 Spring Cloud 規范的商業化存儲服務。提供易於使用的 API,並支持在 Spring 框架中集成 Resource。 - schedulerX:SchedulerX(分佈式作業調度)是阿裡雲產品EDAS的一個組件。
spring-cloud-starter-alicloud-schedulerX
提供瞭符合 Spring Cloud 規范的分佈式作業調度。SchedulerX提供高精度秒級、高穩定性、高可用性的定時作業調度服務,支持簡單的單服務器作業、簡單的多主機作業、腳本作業、網格作業等多種作業類型。 - SMS:SMS(Short Message Service)是一種覆蓋全球的短信服務,
spring-cloud-starter-alicloud-sms
提供瞭一個更易用的API,用於快速訪問阿裡雲的短信服務。
企業級分佈式應用服務 EDAS(Enterprise Distributed Application Service)是一個應用托管和微服務管理的 PaaS 平臺,提供應用開發、部署、監控、運維等全棧式解決方案,同時支持 Spring Cloud、Apache Dubbo(以下簡稱 Dubbo )、HSF 等微服務運行環境,助力您的各類應用輕松上雲。
4.1.3、其他組件
- Spring Cloud Config:springcloud config 項目是一個解決分佈式系統的配置管理方案。它包含瞭 client 和 server 兩個部分,server 端提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,client 端通過接口獲取數據、並依據此數據初始化自己的應用。 簡單一點的說就是:在分佈式環境中,很多的服務都是集群部署,那就意味著這些集群部署的服務都需要相同的配置文件。所以,這時候就引入瞭 springcloud config 這個組件,使用該組件來進行眾多的配置文件的統一管理。例如,我們在修改某一配置文件時,隻需要在遠程的 gitHub 等工具上面修改即可,不用多次的在眾多的配置文件中來回繁瑣的修改。
- Spring Cloud Bus:Spring Cloud Bus 將分佈式系統的節點與輕量級消息代理鏈接起來。這可以用來廣播 狀態改變(例如配置改變)或其他管理指令。
- Spring Cloud Sleuth:微服務跟蹤(sleuth)其實是一個工具,它在整個分佈式系統中能跟蹤一個用戶請求的過程(包括數據采集,數據傳輸,數據存儲,數據分析,數據可視化),捕獲這些跟蹤數據,就能構建微服務的整個調用鏈的視圖,這是調試和監控微服務的關鍵工具。
- Spring Cloud Data Flow:Spring Cloud Data Flow是什麼,雖然已經出現一段時間瞭,但想必很多人不知道,因為在項目中很少有人用。不僅找不到很多中文資料,英文資料也一樣少的可憐。Spring Cloud Data Flow是基於微服務的,專門用於流式和批式數據處理的框架。
- Spring Cloud Security:Spring Cloud Security 用於以最小的麻煩構建安全的應用程序和服務。基於 Spring Boot 和 Spring Security OAuth2,我們可以快速創建實現常見模式的系統,如單點登錄、令牌中繼和令牌交換。
- Spring Cloud Zookeeper:通過一些簡單的註釋,您可以快速啟用和配置應用程序中的常見模式,並使用 Zookeeper 構建大型分佈式系統。提供的模式包括服務發現和分佈式配置。
- Spring Cloud Stream:Spring Cloud Stream 是一個框架,用於構建與共享消息系統連接的高度可擴展的事件驅動微服務。他可以和各種消息框架進行整合。
- Spring Cloud CLI:Spring Boot CLI為Spring Cloud提供Spring Boot命令行功能。您可以編寫 Groovy 腳本來運行 Spring Cloud 組件應用程序(例如)。您還可以輕松地執行加密和解密等操作,以支持具有秘密配置值的 Spring Cloud Config 客戶端。使用 Launcher CLI,您可以方便地從命令行一次性啟動 Eureka、Zipkin、Config Server 等服務(在開發時非常有用)。
- Spring Cloud OpenFeign:同Feign是一樣的,是一個遠程調用框架,Feign已經停止更新,OpenFeign在Feign的基礎上添加瞭對 Spring MVC 註釋的支持。
- Spring Cloud Task:Spring Cloud Task 允許用戶使用 Spring Cloud 開發和運行短期微服務,並在本地、雲中甚至在 Spring Cloud Data Flow 上運行它們。隻需將@EnableTask您的應用程序作為 Spring Boot 應用程序(單個應用程序上下文)添加並運行。
- Spring Cloud Connectors:簡化瞭在 Cloud Foundry 和 Heroku 等雲平臺中連接服務和獲得操作環境意識的過程,尤其是對於 Spring 應用程序。它是為可擴展性而設計的:您可以使用提供的雲連接器之一或為您的雲平臺編寫一個,您可以使用對常用服務(關系數據庫、MongoDB、Redis、RabbitMQ)的內置支持或擴展 Spring與您自己的服務一起使用的雲連接器。
- Spring Cloud Circuit Breaker:提供瞭跨不同斷路器實現的抽象。它提供瞭在您的應用程序中使用的一致 API,讓您開發人員可以選擇最適合您的應用程序需求的斷路器實現。
- Spring Cloud Consul:Consul是 HashiCorp 公司推出的開源工具,用於實現分佈式系統的服務發現與配置。與其它分佈式服 務註冊與發現的方案,Consul 的方案更“一站式”,內置瞭服務註冊與發現框 架、分佈一致性協議實 現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其它工具(比如 ZooKeeper 等)。 使用起來也較為簡單。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和 Mac OS X);安裝包僅包含一個可執行文件,方便部署,與 Docker 等輕量級容器可無縫配合。
- Spring Cloud Gateway:目前市場上很流行的網關服務,功能強大豐富,性能好,官方基準測試 RPS (每秒請求數)是Zuul的1.6倍,能與 SpringCloud 生態很好兼容,單從流式編程+支持異步上也足以讓開發者選擇它瞭。
4.2、停更的組件
1. eureka停更:
eureka目前已經在Netflix社區明確聲明不在更新!而springcloud當中的eureka的starter仍然在更新,但是他更新隻是為瞭兼容springcloud版本,並改變不瞭eureka已經停更的事實。
就好比假如
mysql版本不再更新瞭,而navcat客戶端還在不斷更新,我們天天跟Navicat打交道,以至於很多人不知道其實項目已經是個死項目瞭,沒有發展前途瞭。
Netflix的eureka社區:https://github.com/Netflix/eureka/wiki
2. Hystrix停更不停用:
NetfLix官網明確聲明:Hystrix 不再處於積極開發階段,目前處於維護模式。Hystrix(版本 1.5.18)足夠穩定,可以滿足 Netflix 對我們現有應用程序的需求。
3. Feign停更:
Feign是在2019就已經不再更新瞭,通過maven網站就可以看出來,隨之取代的是OpenFeign,從名字上就可以知道,他是Feign的升級版。
maven網站:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign
4. Ribbon停更:
項目處於維護狀態 ,已經好久沒有更新過瞭。 https://github.com/Netflix/ribbon
5. Config:
Config沒用停更,隻不過現在大部分人都采用nacos來做配置中心。
6. Archaius停更:
Netflix下的Archaius在2018年就已經停更。
7. Bus:
SpringCloud原生的服務總線組件,現在風頭也被Nacos搶瞭。
到此這篇關於關於SpringCloud的使用以及現狀的文章就介紹到這瞭,更多相關SpringCloud詳解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringCloud微服務基礎簡介
- 聊聊SpringCloud和SpringCloudAlibaba的區別
- 基於springboot服務間Feign調用超時的解決方案
- 基於FeignClient調用超時的處理方案
- Java之Springcloud Feign組件詳解