我們知道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。
原生就是土生土長的意思,我們在開始設計應用的時候就考慮到應用將來是運行雲環境里面的,要充分利用雲資源的優點,比如️雲服務的彈性和分布式優勢。
