我們知道spring cloud可以用來開發微服務,但是應該很少有人真正知道Spring Cloud是什麼。
官方的解釋是:spring cloud提供了一些可以讓開發者快速構建分散式應用的工具,這些服務可以很好的工作在任何分散式環境下。
既然提供的是一些快速構建微服務應用的工具,那麼我們需要了解微服務開發過程中需要解決哪些問題?
- 服務註冊發現
- 遠端服務呼叫
- 負載均衡
- 斷路器
- 分散式訊息
- 配置中心
- 鏈路監控
所以,spring cloud提供了一些解決這類問題的工具,比如服務註冊提供了Eureka/Consoul/zookeeper;遠端呼叫基於RestTemplate針對http協議呼叫的封裝;負載均衡採用Ribbon、斷路器採用hystrix;分散式訊息基於kafka、rabbitMQ;配置中心基於config;鏈路監控基於sleuth.
但是,從這些元件中,我們發現了一些問題,這些元件並不是spring提供的啊,比如eureka、ribbon、hystrix是netflix開源的。而kafka、zookeeper是一些獨立的元件,和spring似乎沒有關係。沒錯,這就是spring團隊的強大之處,他們很少重複早輪子,而是他們利用別人造好的輪子來進行封裝使得使用者在使用的時候更加方便。
舉個簡單例子,比如最早spring只提供了IOC和AOP的核心功能,而像ORM框架、快取、MVC框架,spring只是提供了一種相容以及支援,所以當時大家說spring是萬能膠,可以把各種各樣的框架整合進來。
當然,spring也會對一些市面上做得不好的技術進行替代,比如struts2.,我記得當時公司使struts2經常出現各種漏洞,所以spring mvc才被創造出來並且很快代替了struts。成為現在的主流框架。
所以,對於spring cloud來說也是如此,spring cloud並不是一個框架,因為Spring Cloud的核心並沒有實現服務註冊、熔斷、配置中心等功能,它提供了一個標準規範。而Spring Cloud Netflix才是spring Cloud規範的一種實現。
常見的服務元件
Ø 融合在每個微服務中、依賴其它元件併為其提供服務。
Ribbon,客戶端負載均衡,特性有區域親和、重試機制。
Hystrix,客戶端容錯保護,特性有服務降級、服務熔斷、請求快取、請求合併、依賴隔離。
Feign,宣告式服務呼叫,本質上就是Ribbon+Hystrix
Stream,訊息驅動,有Sink、Source、Processor三種通道,特性有訂閱釋出、消費組、訊息分割槽。
Bus,訊息匯流排,配合Config倉庫修改的一種Stream實現,
Sleuth,分散式服務追蹤,需要搞清楚TraceID和SpanID以及抽樣,如何與ELK整合。
Ø 獨自啟動不需要依賴其它元件,單槍匹馬都能幹。
Eureka,服務註冊中心,特性有失效剔除、服務保護。
Dashboard,Hystrix儀表盤,監控叢集模式和單點模式,其中叢集模式需要收集器Turbine配合。
Zuul,API服務閘道器,功能有路由分發和過濾。
Config,分散式配置中心,支援本地倉庫、SVN、Git、Jar包內配置等模式
Spring Cloud生態的構建
Spring Cloud的生態是基於spring boot這個微框架來構建的,所以spring cloud可以說是基於spring boot來對其他框架進行整合,那麼什麼是spring boot或者為什麼要基於spring boot來整合呢?
首先,spring boot並不是一個新的技術,它是基於spring框架下對於“約定由於配置(Convention Over Configuration)”理念下的產物,主要是幫助開發人員更容易更快速的建立獨立執行和產品級別的基於spring框架的應用。為什麼說springboot是微框架呢?如果大家玩過springboot,那應該很有體會,我們只需要非常少的配置就可以快速構建一個web專案。
而spring boot中並沒有新的技術,如果大家對spring框架比較熟悉,那麼在學習springboot的時候會更加容易。
圍繞springboot構建的spring cloud生態下,目前有兩類的比較或的實現,一個是基於netflix、另一個是基於alibaba。
Spring Cloud Alibaba的相關資料
前面一個階段,我們講完了Spring Cloud Alibaba生態中的Dubbo元件,當然,我們沒有基於spring cloud project的形式來講解,而是基於元件的形式形式來講,原因是spring cloud本質上就是對各個元件的整合。
目前Spring Cloud Alibaba這個生態中,已經有相對成熟的體系
- Dubbo 用於實現高效能Java RPC 通訊
- Nacos 服務註冊發現、配置管理、服務管理
- Sentinel 流量控制、熔斷降級、系統負載保護
- RocketMQ 分散式訊息系統,提供低延時的、高可靠的訊息釋出與訂閱服務
- Seata 高效能微服務分散式事務解決方案
- Alibaba Cloud OSS 阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。
- Alibaba Cloud SchedulerX 阿里中介軟體團隊開發的一款分散式任務排程產品,支援週期性的任務與固定時間點觸發任務。
- Alibaba Cloud SMS 覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
在2019年8月1號,spring-cloud-alibaba釋出了第一個畢業版本(從孵化器倉庫畢業),釋出了V2.1.0.RELEASE版本, 目前最新的的版本是2.2.1.RELEASE,2.2.x 版本適用於 Spring Boot 2.2.x
另外,相比於Spring Cloud Netflix 生態,到2020年,archaus/hystrix/ribbon/zuul/turbine等starter都會進入維護模式,進入維護模式意味著spring cloud團隊不會再向這些模組中新增新的功能,但是仍然會修復安全問題和一些block級別的bug。只是沒有新的功能迭代了,spring cloud netflix仍然可以繼續使用。
文章連結->spring-cloud-netflix-projects-entering-maintenance-mode
進入維護模式的最根本原因還是Netflix對於zuul、ribbon等專案維護投入比較少、所以spring cloud 會在greenwich中把這些專案都進入到維護模式。
當然,這些元件會有相應功能的其他元件代理,有些還在孵化中。有些已經畢業了,比如alibaba這套標準
微服務的整體架構
Spring Cloud Alibaba
提起微服務,不得不提 Spring Cloud 全家桶系列,SpringCloud 是若干個框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 個子專案,提供了服務治理、服務閘道器、智慧路由、負載均衡、斷路器、監控跟蹤、分散式訊息佇列、配置管理等領域的解決方案。
Spring Cloud 通過 Spring Boot 風格的封裝,遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、容易部署的分散式系統開發工具包。
Spring Cloud 一樣,Spring Cloud Alibaba 也是一套微服務解決方案,包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。
依託 Spring Cloud Alibaba,您只需要新增一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,通過阿里中介軟體來迅速搭建分散式應用系統。
Spring Cloud Alibaba中包含的元件
阿里開源元件
Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
RocketMQ:開源的分散式訊息系統,基於高可用分散式叢集技術,提供低延時的、高可靠的訊息釋出與訂閱服務。
Dubbo:這個就不用多說了,在國內應用非常廣泛的一款高效能 Java RPC 框架。
Seata:阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。
Arthas:開源的Java動態追蹤工具,基於位元組碼增強技術,功能非常強大。
阿里商業化元件
作為一家商業公司,阿里巴巴推出 Spring Cloud Alibaba,很大程度上市希望通過搶佔開發者生態,來幫助推廣自家的雲產品。所以在開源社群,夾帶了不少私貨,這部分元件我在阿里工作時都曾經使用過,整體易用性和穩定性還是很高的。
Alibaba Cloud ACM:一款在分散式架構環境中對應用配置進行集中管理和推送的應用配置中心產品。
Alibaba Cloud OSS:阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的雲端儲存服務。
Alibaba Cloud SchedulerX:阿里中介軟體團隊開發的一款分散式任務排程產品,提供秒級、精準的定時(基於 Cron 表示式)任務排程服務。
Nacos服務註冊中心
Nacos提供了統一配置管理、服務發現與註冊。 其中服務註冊和發現的功能,相當於dubbo裡面使用到的zookeeper、 或者spring cloud裡面應用到的consoul以及eureka。
服務發現和服務健康監測
Nacos提供了基於RPC的服務發現,服務提供者可以將自身的服務通過原生API或者openApi來實現服務的註冊,服務消費者可以使用API或者Http來查詢和發現服務
同時,Nacos提供了對服務的實時監控檢查,當發現服務不可用時,可以實現對服務的動態下線從而阻止服務消費者向不健康的服務傳送請求。
配置管理
傳統的配置管理,是基於專案中的配置檔案來實現,當出現配置檔案變更時需要重新部署,而動態配置中心可以將配置進行統一的管理,是的配置變得更加靈活以及高效。
動態配置中心可以實現路由規則的動態配置、限流規則的動態配置、動態資料來源、開關、動態UI等場景
國內比較有名的開源配置中心: Aollo / diamond / disconf
Nacos的整體架構
Nacos的整體架構還是比較清晰的,我們可以從下面這個官方提供的架構圖進行簡單分析。
雲原生
雲原生從字面意思上來看可以分成雲和原生兩個部分。
雲是和本地相對的,傳統的應用必須跑在本地伺服器上,現在流行的應用都跑在雲端,雲包含了IaaS,、PaaS和SaaS。
原生就是土生土長的意思,我們在開始設計應用的時候就考慮到應用將來是執行雲環境裡面的,要充分利用雲資源的優點,比如️雲服務的彈性和分散式優勢。
<img src="https://mic-blob-bucket.oss-cn-beijing.aliyuncs.com/202110291741029.webp" alt="img" style="zoom:60%;" />
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!