Spring Cloud 簡介
? Spring Cloud作為Java語言的微服務(wù)框架,它依賴于SpringBoot,有快速開發(fā)、持續(xù)交付和容易部署等特點。SpringCloud的組件非常多,涉及微服務(wù)的方方面面,在開源社區(qū)Spring和Netflix、Pivotal兩大公司的推動下越來越完善。
1 微服務(wù)應(yīng)該具備的功能
? 微服務(wù)可拆分為 “微” 和 “服務(wù)” 兩個?!拔ⅰ?即小的的意思,那到底多小才算 “微” 呢?可能不同的團隊有不同的答案。從參與微服務(wù)的人數(shù)來講,單體微服務(wù)從架構(gòu)、代碼、開發(fā)、測試、運維的人數(shù)加起來是8~10人才算“微”。那么何為“服務(wù)呢”?按照 “微服務(wù)” 概念提出者Martin Fowler給出的建議:“服務(wù)”是一個獨立運行的單元組件,每個單元組件運行在獨立的進程中。組件與組件之間通常使用HTTP這種輕量級的通信機制進行通信。
微服務(wù)具有一下特點:
- 按照業(yè)務(wù)來劃分服務(wù),單個服務(wù)代碼量小,業(yè)務(wù)單一,易于維護。
- 每個微服務(wù)都有自己獨立的基礎(chǔ)組件,例如數(shù)據(jù)庫、緩存等,且運行在獨立的進程中。
- 微服務(wù)之間的通信是通過HTTP協(xié)議或者消息組件,且具有容錯能力。
- 微服務(wù)有一套服務(wù)治理的解決方案,服務(wù)之間不耦合,可以隨時加入或剔除服務(wù)。
- 單個微服務(wù)能夠集群化部署,并且有負載均衡的能力。
- 整個微服務(wù)系統(tǒng) 應(yīng)該有一個完整的安全機制,包括用戶驗證、權(quán)限認證、資源保護等。
- 整個微服務(wù)系統(tǒng)有鏈路追蹤的能力。
- 有一套完善的實時日志日志系統(tǒng)
? 微服務(wù)具有以上這些特點,那么微服務(wù)需要具備一些什么樣的功能呢?微服務(wù)的功能主要體現(xiàn)在以下幾個方面。
- 微服務(wù)的注冊和發(fā)現(xiàn)
- 服務(wù)的負載均衡
- 服務(wù)的容錯
- 服務(wù)網(wǎng)關(guān)
- 服務(wù)配置的統(tǒng)一管理
- 鏈路追蹤
- 實時日志
1.1.1 服務(wù)的注冊與發(fā)現(xiàn)
? 微服務(wù)系統(tǒng)由很多個單一職責(zé)的服務(wù)單元組成,例如Netflix公司的系統(tǒng)是由600多個微服務(wù)構(gòu)成的,而每一個微服務(wù)又有眾多實例。由于微服務(wù)于系統(tǒng)的服務(wù)粒度小,服務(wù)數(shù)量眾多,服務(wù)之間相互依賴成網(wǎng)狀,所以微服務(wù)系統(tǒng)服務(wù)注冊中心來統(tǒng)一管理微服務(wù)實例,方便查看每一個微服務(wù)實例的健康狀態(tài)。
? 服務(wù)注冊是指向服務(wù)注冊中心注冊一個服務(wù)實例,服務(wù)提供者將自己的服務(wù)信息(如服務(wù)名、IP地址等)告知服務(wù)注冊中心。服務(wù)發(fā)現(xiàn)是指當服務(wù)消費者需要消費另外一個服務(wù)時,服務(wù)注冊中心能夠告知服務(wù)消費者它所需要消費服務(wù)的實例信息(如服務(wù)名、IP地址等)。通常情況下,一個服務(wù)即是服務(wù)提供者,也是服務(wù)消費者。服務(wù)消費者一般使用HTTP協(xié)議或者消息組件這種輕量級的通信機制來進行服務(wù)消費。服務(wù)的注冊與發(fā)現(xiàn)如圖所示:
? 服務(wù)注冊中心會提供服務(wù)的健康檢查方案,檢查被注冊的服務(wù)是否可用。通常一個服務(wù)實例注冊后,會定時向服務(wù)中心提供 “心跳”,以表明自己處于可用的狀態(tài)。當一個服務(wù)實例通知向服務(wù)注冊中心提供心跳一段時間后,服務(wù)注冊中心會認為服務(wù)實例不可用,會將該服務(wù)實例從服務(wù)注冊中心列表中剔除。如果這個被剔除掉的服務(wù)實例過一段時間后繼續(xù)向注冊中心提供心跳,那么服務(wù)注冊中心會將該服務(wù)實例重新加入服務(wù)注冊中心的列表中,另外,微服務(wù)的服務(wù)注冊組件都會提供服務(wù)的健康狀況查看的UI界面,開發(fā)人員或者運維人員只需要登錄相關(guān)的界面就可以服務(wù)的健康狀態(tài)。
1.1.2 服務(wù)的負載均衡
? 在微服務(wù)架構(gòu)中,服務(wù)之間的相互調(diào)用一般是通過HTTP通信協(xié)議來實現(xiàn)的。網(wǎng)絡(luò)往往具有不可靠性,為了保證服務(wù)的高可用 (High Availability),服務(wù)單元往往是集群化部署的。例如將服務(wù)提供者進行集群化部署,那么服務(wù)消費者該調(diào)用哪個服務(wù)者提供的實例呢?這就涉及了服務(wù)的負載均衡。
? 服務(wù)的負載均衡一般最流行的做法如圖所示,所有的服務(wù)都向服務(wù)注冊中心注冊,服務(wù)注冊中心持有每個服務(wù)的應(yīng)用名和IP地址信息等,同時每個服務(wù)也會獲取所有服務(wù)注冊列表信息。服務(wù)消費者集成負載均衡組件,該組件會向服務(wù)消費者獲取服務(wù)注冊列表信息,并每隔一段時間重新刷新獲取該列表。當服務(wù)消費者消費服務(wù)時,負載均衡組件獲取服務(wù)提供者所有實例的注冊信息,并通過一定的負載均衡策略(開發(fā)者可以配置),選擇一個服務(wù)提供者的實例,向該實例進行服務(wù)消費,這樣就實現(xiàn)了負載均衡。
? 服務(wù)注冊中心不但需要定時接受每個服務(wù)的心跳(用來檢查服務(wù)是否可用),而且每個服務(wù)定期獲取服務(wù)注冊列表的信息,當服務(wù)實例數(shù)量很多時,服務(wù)注冊中心承擔(dān)了非常大的負載。由于服務(wù)注冊中心在微服務(wù)系統(tǒng)中起到了至關(guān)重要的作用,所以必須實現(xiàn)高可用。一般的做法是將服務(wù)注冊中心集群化,每個服務(wù)注冊中心的數(shù)據(jù)實時同步,如圖所示:
1.1.3 服務(wù)的容錯
? 微服務(wù)落地到實際項目中,服務(wù)數(shù)量往往非常多,服務(wù)之間的相互依賴性也是錯綜復(fù)雜的,一個網(wǎng)絡(luò)請求通常要調(diào)用多服務(wù)才能完成。如果一個服務(wù)不可用,例如網(wǎng)絡(luò)延遲或故障,會影響到依賴于這個不可用的服務(wù)的其他服務(wù)。如圖所示,一個微服務(wù)系統(tǒng)有很多個服務(wù),當服務(wù)F因某些原因?qū)е铝朔?wù)的不可用,來至于用戶的網(wǎng)絡(luò)請求需要調(diào)用服務(wù)F。由于服務(wù)F無響應(yīng) ,用戶的請求都處于阻塞狀態(tài),在高并發(fā)的場景下,短時間內(nèi)會導(dǎo)致服務(wù)器的線程資源消耗殆盡。另外,依賴于服務(wù)F的其他服務(wù),例如圖中的服務(wù)E、服務(wù)G,服務(wù)J、也會等待服務(wù)F的響應(yīng),處于阻塞狀態(tài),導(dǎo)致這些服務(wù)的線程資源消耗殆盡,進而導(dǎo)致它們的不可用,以及依賴于它們的服務(wù)的不可用,最后導(dǎo)致整個系統(tǒng)處于癱瘓的狀態(tài)也就是雪崩效應(yīng)。
? 為了解決分布式系統(tǒng)的雪崩效應(yīng),分布式系統(tǒng)引進了熔斷器機制。熔斷器(Circuit Breaker)一次來源于物理學(xué)中的電路知識,它的作用是電路中出現(xiàn)故障時迅速切斷電路,從而保護電路,熔斷機制如圖所示。當一個服務(wù)的處理用戶請求的失敗次數(shù)在一定時間內(nèi)大于設(shè)定的閾值時,說明出現(xiàn)了故障,打開熔斷器,這時所有的請求會執(zhí)行快速失敗,不執(zhí)行業(yè)務(wù)邏輯。當處于打開狀態(tài)的容器時,一段時間后會處于半打開狀態(tài),并執(zhí)行一定數(shù)量的請求,剩余的請求會執(zhí)行快速失敗,若執(zhí)行的請求失敗了,則繼續(xù)打開熔斷器,若成功了,則將熔斷器關(guān)閉。
? 這種機制有著非常重要的意義,它不僅能夠有效的防止系統(tǒng)的 “雪崩” 效應(yīng),還具有一下作用。
- 將資源進行隔離,如果某個服務(wù)里的某個API接口出現(xiàn)了故障,只會隔離該API接口,不會影響到其他API接口。被隔離的API接口會執(zhí)行快速失敗的邏輯,不會等待,請求不會阻塞。如果不進行這種隔離,請求會一直處于阻塞狀態(tài),知道超時。若有大量的請求同時涌入,都處于阻塞的狀態(tài),服務(wù)器的線程資源,迅速被耗完。
- 服務(wù)降級的功能。當服務(wù)處于正常的狀態(tài)時,大量的請求在短時間內(nèi)同時涌入,超過了服務(wù)的處理能力,這時熔斷器會被打開,將服務(wù)降級,以免服務(wù)器因負載過高而出現(xiàn)故障。
- 自我修復(fù)能力。當某個微小的故障(例如網(wǎng)絡(luò)服務(wù)商的問題),導(dǎo)致網(wǎng)絡(luò)在短時間內(nèi)不可用,熔斷器被打開。如果不能我監(jiān)控、自我檢測和自我修復(fù),那么需要開發(fā)人員手動的去關(guān)閉熔斷器,無疑會增加開發(fā)人員的工作量。
? Netflix 的 Hystrix熔斷器開源組件功能非常強大,不僅有熔斷器的功能,還有熔斷器的狀態(tài)監(jiān)測,并提供友好的UI界面,開發(fā)人員或運維人員通過UI界面能夠直觀的看到熔斷器的狀態(tài)和各種性能指標。
1.1.4 服務(wù)網(wǎng)關(guān)
? 微服務(wù)系統(tǒng)通過將資源以API接口的形式暴露給外界來提供服務(wù)。在微服務(wù)系統(tǒng)中,API接口資源通常是由服務(wù)網(wǎng)關(guān)(也稱 API網(wǎng)關(guān))統(tǒng)一暴露,內(nèi)部服務(wù)不直接對外提供API資源的暴露。這樣做的好處是將內(nèi)部服務(wù)隱藏起來,外界還以為是一個服務(wù)在提供服務(wù),在一定程度上保護了微服務(wù)系統(tǒng)的安全。API網(wǎng)關(guān)通常有請求轉(zhuǎn)發(fā)的作用,另外它可能需要負責(zé)一定在安全驗證,例如判斷某個請求是否合法,該請求對某一個資源是否具有操作權(quán)限等。通常情況下,網(wǎng)關(guān)層以集群的形式存在。在服務(wù)網(wǎng)關(guān)層之前,有可能需要加上負載均衡層,通常為Nginx雙機熱備,通過一定的路由策略,將請求轉(zhuǎn)發(fā)到網(wǎng)關(guān)層。到達網(wǎng)關(guān)層后,進過一系列的用戶身份驗證、權(quán)限判斷,最終轉(zhuǎn)發(fā)到具體的服務(wù)。具體的服務(wù)經(jīng)過一系列的邏輯運算和數(shù)據(jù)操作,最終將結(jié)果返回給用戶,此時的架構(gòu)如圖所示:
? 網(wǎng)關(guān)層具有很重要的意義,具體體現(xiàn)在以下方面。
- 網(wǎng)關(guān)將所有服務(wù)的API接口資源統(tǒng)一聚合,對外統(tǒng)一暴露,外界系統(tǒng)調(diào)用的API接口都是網(wǎng)關(guān)對外暴露的API接口。外界系統(tǒng)不需要知道微服務(wù)架構(gòu)中個服務(wù)相互調(diào)用的復(fù)雜性,微服務(wù)系統(tǒng)也保護了其他內(nèi)部微服務(wù)單元的API接口,防止外界直接調(diào)用以及服務(wù)的敏感信息對外暴露。
- 網(wǎng)關(guān)可以做一些用戶身份認證、權(quán)限認證,防止非法請求操作API接口,對內(nèi)部服務(wù)起到保護作用。
- 網(wǎng)關(guān)可以實現(xiàn)監(jiān)控功能,實時日志輸出,對請求進行記錄。
- 網(wǎng)關(guān)可以用來做流量監(jiān)控,在高流量的情況下,對服務(wù)進行降級。
- API接口從內(nèi)部服務(wù)分離出來,方便做測試。
? 當然,網(wǎng)關(guān)實現(xiàn)這些功能,需要做高可用,否則網(wǎng)關(guān)很可能成為架構(gòu)中的拼勁。最常用的網(wǎng)關(guān)組件有Zuul和Nginx等。
1.1.5 服務(wù)配置的統(tǒng)一管理
? 在實際開發(fā)過程中,每個服務(wù)都有大量的配置文件,例如數(shù)據(jù)庫的配置、日志輸出級別的配置等,而往往這些配置在不同的環(huán)境中也是不一樣的。隨著服務(wù)數(shù)量的增加,配置文件的管理也是一件非常復(fù)雜的事。
? 在微服務(wù)架構(gòu)中,需要有統(tǒng)一管理配置文件的組件,例如:Spring Cloud的Spring Cloud Config組件、阿里巴巴的Diamood、百度的Disconf、攜程的Apollo等。這些配置組件所實現(xiàn)的功能大體相同,但又有差別,下面以Spring Cloud Config為例來闡述服務(wù)配置的統(tǒng)一管理。如圖所示:
? 大致過程如下:
- 首先,Config Service(配置服務(wù))讀取配置文件倉庫的配置信息,其中配置文件倉庫可以存放在配置服務(wù)的本地倉庫,也可以放在遠程的Git倉庫(例如GitHub、Coding等)。
- 配置服務(wù)啟動后,讀取配置文件信息,讀取完成的配置信息存放在配置服務(wù)的內(nèi)存中。
- 當啟動服務(wù)A、B時,由于服務(wù)A、B指定了向配置服務(wù)讀取配置信息,服務(wù)A、B項配置服務(wù)讀取配置信息。
- 當服務(wù)的配置信息需要修改且修改完成后,向配置服務(wù)發(fā)送POST請求進行刷新,這是服務(wù)A、B會向配置服務(wù)重寫讀取配置文件。
? 對于集群化的服務(wù),可以通過使用消息總線來刷新多個服務(wù)實例。如果服務(wù)數(shù)量較多,對配置中心需要考慮集群化部署,從而使配置中心高可用,做分布式集群。
1.1.6 服務(wù)鏈路追蹤
? 微服務(wù)系統(tǒng)是一個分布式架構(gòu)的系統(tǒng),微服務(wù)系統(tǒng)按業(yè)務(wù)劃分服務(wù)單元,一個微服務(wù)系統(tǒng)往往有很多個服務(wù)單元。由于服務(wù)單元很多且復(fù)雜,服務(wù)與服務(wù)之間的調(diào)用有可能非常復(fù)雜,一旦出現(xiàn)了異常和錯誤,就會很難去定位。所以在微服務(wù)架構(gòu)中,必須實現(xiàn)分布式鏈路追蹤,去跟進一個請求到底有哪些服務(wù)參與,參與的順序又是怎樣的,從而使每個請求鏈路清晰可見,出現(xiàn)了問題很快就能定位。
? 舉個例子,如圖所示,在微服務(wù)系統(tǒng)中,一個來自用戶的請求先到達前端A(如前端界面),然后通過遠程調(diào)用,到達系統(tǒng)的中間件B、C(如負載均衡、網(wǎng)關(guān)等),最后到達后端服務(wù)D、E。后端經(jīng)過一系列的邏輯運算,最后將數(shù)據(jù)返回給用戶。對于這一請求,經(jīng)歷了了這么多服務(wù),怎么樣將他的請求過程的數(shù)據(jù)記錄下來呢?這就需要用到服務(wù)鏈路的追蹤。
? Google開源了鏈路追蹤組件Dapper,并在2010年發(fā)表了論文《Dapper,a Large-Scale Distrbuted Systems Tracing Infrastructure》,這篇文章是業(yè)內(nèi)實現(xiàn)鏈路追蹤的標桿和理論基礎(chǔ),具有非常高的參考價值。
? 目前,常見的鏈路追蹤組件有Google的Dapper、Twitter的Zipkin,以及阿里的Eagleeye(鷹眼)等。都是非常優(yōu)秀的鏈路追蹤開源組件。
2 Spring Cloud
2.1.1 簡介
? Spring Cloud是基于Spring Boot的。Spring Boot 是由Pivotal團隊提供的全新Web框架,它主要的特點就是簡化了開發(fā)和部署的過程,簡化了Spring復(fù)雜的配置和依賴管理,通過起步依賴和內(nèi)置Servlet容器能夠使及開發(fā)者迅速搭建起一個Web工程。所以Spring Cloud在開發(fā)部署上繼承了Spring Boot的一些有點,提高了開發(fā)和部署上的效率。
? Spring Cloud的首要目標就是通過一系列開發(fā)組件和框架,幫助開發(fā)者迅速搭建一個分布式的微服務(wù)系統(tǒng)。Spring Cloud是通過包裝其他技術(shù)框架來實現(xiàn)的,例如包裝開源的Netflix OSS組件,實現(xiàn)了一套通過基于注解、Java配置和基于模板開發(fā)的微服務(wù)框架.Spring Cloud框架來自于Spring Resource社區(qū),由Pivotal和Netflix兩大公司和一些其他的開發(fā)者提供技術(shù)上的更新迭代。Spring Cloud提供了開發(fā)分布式微服務(wù)系統(tǒng)的一些常用組件,例如服務(wù)注冊和發(fā)現(xiàn)、配置中心、熔斷器、智能路由、為代理、控制總線、全局鎖、分布式會話等。
2.1.2 常用組件
- 服務(wù)注冊和發(fā)現(xiàn)組件 Eureka
- 利用Eureka組件可以很輕松的實現(xiàn)服務(wù)的注冊和發(fā)現(xiàn)的功能。Eureka組件提供了服務(wù)的健康監(jiān)測,以及界面友好的UI。通過Eureka通過的UI,Eureka組件可以讓開發(fā)人員隨時了解服務(wù)單元的運行情況。另外Spring Cloud也支持Consul和Zookeeper,用于注冊和發(fā)現(xiàn)服務(wù)。
- 熔斷組件 Hystrix
- Hystrix是一個熔斷組件,它除了有一些基本的熔斷器功能外,還能夠?qū)崿F(xiàn)服務(wù)降級、服務(wù)限流的功能。另外Hystrix提供了熔斷器的健康監(jiān)測,以及熔斷器健康數(shù)據(jù)的API接口。Hystrix Dashboard組件提供了單個服務(wù)熔斷器的健康狀態(tài)數(shù)據(jù)的界面展示功能 ,Hystrix Tubine組件提供了多個服務(wù)的熔斷器的健康狀態(tài)數(shù)據(jù)的頁面展示功能。
- 負載均衡組件 Ribbon
- Ribbon 是一個負載均衡組件,它通常和Eureka、Zuul、RestTemplate、Feign配合使用。Ribbon和Zuul配合,很容易做到負載均衡,將請求根據(jù)負載均衡策略分配到不同的服務(wù)實例中。Ribbon和RestTemplate、Feign配合,在消費服務(wù)時能夠做到負載均衡。
- 路由網(wǎng)關(guān) Zuul
- 路由網(wǎng)關(guān)Zuul有智能路由和過濾的功能。內(nèi)部服務(wù)的API接口通過Zuul網(wǎng)關(guān)統(tǒng)一對外暴露,內(nèi)部服務(wù)的API接口不直接暴露,防止內(nèi)部服務(wù)敏感信息對外暴露。在默認的情況下,Zuul和Ribbon相結(jié)合,能夠做到負載均衡、只能路由。Zuul過濾功能是通過攔截請求來實現(xiàn)的,可以對一些用戶的角色和權(quán)限進行判斷,起到安全驗證的作用,同時也可以用于輸出實時請求日志。
? 上述的4個組件都來自于Netflix公司,統(tǒng)一稱為 Spring Cloud Netflix。
- Spring Cloud Config
- Spring Cloud Config組件提供了配置文件統(tǒng)一管理的功能。Spring Cloud Config 包括 Server端和Client端,Server端讀取本地倉庫或者遠程倉庫的配置文件,所有的Client向Server讀取配置信息,從而達到配置文件系統(tǒng)統(tǒng)一管理的目的。通常情況下,Spring Cloud Config和Spring Cloud Bus相互配合刷新指定Client或所有Client的配置文件。
- Spring Cloud Security
- Spring Cloud Security是對 Spring Security組件的封裝,Spring Cloud Security向服務(wù)單元提供了用戶驗證和權(quán)限驗證 。一般來說,單獨在微服務(wù)系統(tǒng)中使用Spring Cloud Security是很少見的,一般它會配合Spring Security Oauth2組件一起使用,通過搭建授權(quán)服務(wù),通過驗證Token或者JWT這種形式對整個微服務(wù)系統(tǒng)進行安全驗證。
- Spring Cloud Sleuth
- Spring Cloud Sleuth是一個分布式鏈路追蹤組件,它封裝了Dapper、ZipKin和Kibana等組件,通過它可以知道服務(wù)之間的相互依賴關(guān)系,并實時觀察鏈路的調(diào)用情況。
- Spring Cloud Stream
- Spring Cloud Stream 是 Spring Cloud框架的數(shù)據(jù)流操作包,可以封裝RabbitMQ、ActiveMQ、Kafka、Redis等消息組件,利用Spring Cloud Stream可以實現(xiàn)消息的接受和發(fā)送。
? 上述列舉了一些常用的Spring Cloud組件。一個簡單的由Spring Cloud構(gòu)建的微服務(wù)系統(tǒng),通過常用服務(wù)注冊中心Eureka、網(wǎng)關(guān)Zuul、配置中心Config和授權(quán)服務(wù)Auth構(gòu)成,如圖所示:
2.1.3 項目一覽
- Spring Cloud Config:服務(wù)配置中心,將所有的服務(wù)的配置文件放到本地倉庫或者遠程倉庫,配置中心負責(zé)讀取倉庫的配置文件,其他服務(wù)向配置中心讀取配置。Spring Cloud Config將服務(wù)的配置統(tǒng)一管理,并可以在不人為重啟服務(wù)的情況下進行服務(wù)配置的刷新。
- Spring Cloud Netflix:它是通過包裝Netflix公司的微微服務(wù)組件實現(xiàn)的,也是Spring Cloud核心的核心組件,包括Eureka、Hystrix、Zuul、和Archaius等。
- Eureka:服務(wù)注冊和發(fā)現(xiàn)組件。
- Hystrix:熔斷器組件。Hystrix通過控制服務(wù)的API接口的熔斷來轉(zhuǎn)移故障,防止微服務(wù)系統(tǒng)發(fā)生雪崩效應(yīng)。另外。Hystrix能夠起到服務(wù)限流的和服務(wù)降級的作用。使用Hystrix Dasbboard組件監(jiān)控單個服務(wù)的熔斷器的狀態(tài),使用Turbine組件可以聚合多個服務(wù)的熔斷器的狀態(tài)。
- Zuul:智能路由網(wǎng)關(guān)組件。Netflix Zuul 能夠起到智能路由和請求過濾的作用,是服務(wù)接口統(tǒng)一暴露的關(guān)鍵模塊,也是安全驗證、權(quán)限控制的一道門。
- Feign:聲明式遠程調(diào)用組件。
- Ribbon:負載均衡組件
- Archaius:配置管理API的組件,一個基于Java的配置管理庫,主要用于多配置的動態(tài)獲取
- Spring Cloud Bus:消息總線組件,常和Spring Cloud Config配合使用,用于動態(tài)刷新服務(wù)的配置。
- Spring Cloud Sleuth:服務(wù)鏈路追蹤組件,Spring Cloud Data Flow是Spring XD的替代品,也是一個混合計算的模型,可通過命令行的方式操作數(shù)據(jù)流。
- Spring Cloud Security:安全模塊組件,是對Spring Security的封裝,通常配合OAuth2使用來保護微服務(wù)系統(tǒng)的安全
- Spring Cloud Consul:該組件是Spring Cloud對Consul的封裝,和Eureka類似,它是另一個服務(wù)注冊和發(fā)現(xiàn)的組件。
- Spring Cloud ZooKeeper:該組件是Spring Cloud對ZooKeeper的封裝,和Eureka、Consul類似,用于服務(wù)的注冊和發(fā)現(xiàn)。
- Spring Cloud Stream:數(shù)據(jù)流操作組件,可以封裝Redis、RabbitMQ、Kafka等組件,實現(xiàn)發(fā)送和接收消息等個。
- Spring Cloud CLL:該組件是Spring Cloud對Spring Boot CLL的封裝,可以讓用戶以命令行方式快速運行和搭建容器。
- Spring Cloud Task:該組件基于Spring Task,提供了任務(wù)調(diào)度和任務(wù)管理的功能。
- Spring Cloud Connectors:用于PaaS云平臺連接到后端。
3 Dubbo簡介
? Dubbo是阿里開源的一個分布式服務(wù)框架,致力于提高性能和透明化的RPC遠程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。Dubbo廣泛用于阿里巴巴的各大站點,有很多互聯(lián)網(wǎng)公司也在使用這個框架。它包含如下核心內(nèi)容:
- RPC遠程調(diào)用:封裝了長連接NIO框架,如Netty和Mina等,使用的是多線程模式
- 集群容錯:提供了基于接口方法的遠程調(diào)用的功能,并實現(xiàn)了負載均衡策略、失敗容錯等功。
- 服務(wù)發(fā)現(xiàn):集成了Apache的Zookeeper組件,用于服務(wù)的注冊和發(fā)現(xiàn)
? Dubbo的架構(gòu)圖如圖所示:
? Dubbo架構(gòu)的流程如下:
- 服務(wù)提供者向服務(wù)中心注冊服務(wù)
- 服務(wù)消費者訂閱服務(wù)
- 服務(wù)消費者發(fā)現(xiàn)服務(wù)
- 服務(wù)消費者遠程調(diào)度服務(wù)提供者進行服務(wù)消費,在調(diào)度過程中,使用了負載均衡策略、失敗容錯的功能
- 服務(wù)消費者和提供者,在內(nèi)存中記錄服務(wù)的調(diào)用次數(shù)和調(diào)用時間,并定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
? Dubbo是一個非常優(yōu)秀的服務(wù)治理框架,在國內(nèi)互聯(lián)網(wǎng)公司應(yīng)用廣泛,它具有以下特點:
- 連通性:注冊中心負責(zé)服務(wù)的注冊:監(jiān)控中心負責(zé)收集調(diào)用次數(shù)、調(diào)用時間;注冊中心、服務(wù)提供者、服務(wù)消費者為長連接
- 健壯性:監(jiān)控中心宕機不影響其他服務(wù)的調(diào)用 :注冊中心集群,任意一個實例宕機自動切換到另一個注冊中心實例;服務(wù)實例集群,任意一個實例宕機,自動切換到一個可用的實例
- 伸縮性:可以動態(tài)增減注冊中心和服務(wù)的實例數(shù)量。
- 升級性:服務(wù)集群升級,不會對現(xiàn)有的架構(gòu)產(chǎn)生壓力。
4 Spring Cloud 與 Dubbo比較
? 首先從微服務(wù)關(guān)注點來比較Spring Cloud和Dubbo兩大服務(wù)框架,如表所示:
微服務(wù)關(guān)注點 | Spring Cloud | Dubbo |
---|---|---|
配置管理 | Config | —— |
服務(wù)發(fā)現(xiàn) | Eureka、Consul、Zookeeper | Zookeeper |
負載均衡 | Ribbon | 自帶 |
網(wǎng)關(guān) | Zuul | —— |
分布式追蹤 | Spring Cloud Sleuth | —— |
容錯 | Hystrix | 不完善 |
通信方式 | HTTP、Message | RPC |
安全模塊 | Spring Cloud Security | —— |
? Spring Cloud擁有很多的項目模塊,包含了微服務(wù)系統(tǒng)的方方面面。Dubbo是一個非常優(yōu)秀的服務(wù)治理和服務(wù)調(diào)用框架,但缺少很多功能模塊,例如網(wǎng)關(guān)、鏈路追蹤等。在項目模塊上,Spring Cloud更具有優(yōu)勢。
? Spring Cloud的更新速度非???,Camden.SR5版本發(fā)布于2017年2月,Camden.SR6版本發(fā)布于2017年3月,Dalston版本發(fā)布于2017年4月,F(xiàn)inchley版本發(fā)布于2018年6月,Greenwich版本發(fā)布于2019年2月,基本每年發(fā)布1~2次版本,每月會發(fā)一次版本的迭代。從GitHub的代碼倉庫來看,Spring Cloud幾乎每天都在更新。阿里巴巴于2011年10月開源了Dubbo,開源后的Dubbo發(fā)展迅速,大概每23個月有一次版本更新。然而,從在2013年3月開始,Dubbo暫停了版本更新,并只在2014年10月發(fā)布了一個小版本,修復(fù)了一個Bug,之后長期處于版本停止更新的狀態(tài)。直到2017年9月,阿里巴巴中間件部門重新組建了Dubbo團隊,把Dubbo列為重點開源項目,并在2017年911月之間,一直保持每月一次版本更新的頻率。
? 從學(xué)習(xí)成本上考慮,Dubbo的版本趨于穩(wěn)定,文檔完善,可以即學(xué)即用,沒有太大難度。Spring Cloud基于Spring Boot開發(fā),需要開發(fā)者先學(xué)會Spring Boot。另外,Spring Cloud版本迭代快,需要快速跟進學(xué)習(xí)。Spring Cloud文檔大都是英文的,要求學(xué)習(xí)者有一定的英文閱讀能力。此外,Spring Cloud文檔很多,不容易快速找到相應(yīng)的文檔。
? 從開發(fā)風(fēng)格上來講,Dubbo更傾向于Spring Xml的配置方式,Dubbo官方也是推薦這種方式。Spring Cloud基于Spring Boot,Spring Boot采用的是基于注解和JavaBean配置方式的敏捷開發(fā)。從開發(fā)速度上講,Spring Cloud具有更高的開發(fā)和部署速度。
? 最后。Spring Cloud的通信方式大多數(shù)是基于HTTP Restful風(fēng)格的,服務(wù)與服務(wù)之間完全無關(guān)、無耦合。由于采用的是HTTP Rest,因此服務(wù)無關(guān)乎語言和平臺,只需要提供響應(yīng)的API接口,就可以相互調(diào)用。Dubbo的通信方式基于遠程調(diào)用,對接口、平臺和語言有強依賴性。如果需要實現(xiàn)跨平臺調(diào)用服務(wù),需要寫額外的中間件,這也是Dubbox(支持HTTP協(xié)議)存在的原因。
? Dubbo和Spring Cloud擁有各自的優(yōu)缺點,Dubbo更容易上手,并且廣泛使用于阿里巴巴的各大站點,經(jīng)歷了 “雙11” 期間高并發(fā)、大流量的檢驗,Dubbo框架非常成熟和穩(wěn)定。Spring Cloud服務(wù)框架嚴格遵守Martin Fowle提出的微服務(wù)規(guī)范,社區(qū)異?;钴S,它很可能成為微服務(wù)架構(gòu)的標準。
5 Kubernetes 簡介
? Kubermetes是一個容器集群管理系統(tǒng),為容器話的應(yīng)用程序提供部署運行、維護、擴展、資源調(diào)度、服務(wù)發(fā)現(xiàn)等功能。
? Kubermetes是Google運行Borg大規(guī)模系統(tǒng)達15年之久的一個經(jīng)驗總結(jié)。Kubermetes結(jié)合了社區(qū)的最佳創(chuàng)意和實踐,旨在幫助開發(fā)人員將容器打包、動態(tài)編排,同時幫助各大公司向微服務(wù)方向進行 技術(shù)演進。它具有以下特點:
- Planet Scale(大容量):使用Kubermetes的各大公司(包括Google)每周運行了數(shù)十億個容器,這些容器的平臺采用同樣的設(shè)計原則。這些平臺在不增加DevOps團隊成員的情況下,可以讓容器數(shù)量增加,節(jié)省了人力成本,達到了復(fù)用性。
- Never Outgrow(永不過期):無論容器是運行在一個小公司的測試環(huán)境中,還是運行在一個全球化企業(yè)的大型系統(tǒng)里,Kubermetes都能靈活的滿足復(fù)雜的需求。同時,無論業(yè)務(wù)多么復(fù)雜,Kubermetes都能穩(wěn)定的提供服務(wù)。
- Run Anywhere(隨時隨地運行):Kubermetes是開源的,可以自由的利用內(nèi)部、混合或公共云的基礎(chǔ)組件進行部署,讓開發(fā)者可以將更多的時間和精力投入在業(yè)務(wù)上,而不是服務(wù)部署上。
? Kubermetes開源免費,是Google在過去15年時間里部署、管理微服務(wù)的經(jīng)驗結(jié)晶,所以目前Kubermetes在技術(shù)社區(qū)也是十分火熱。下面來看它提供的功能。
- Automatic Binpacking(自動包裝):根據(jù)程序自身的資源需求和一些其他方面的需求自動配置容器。Kubermetes能夠最大化的利用及其的工作負載,提高資源的利用率。
- Self-healing(自我修復(fù)):容器失敗自動重啟,當節(jié)點處于 “死機” 的狀態(tài)時,它會被替代并重新編排;當容器達到用戶設(shè)定的無響應(yīng)的閾值時,它會被剔除,并且不讓其它容器調(diào)用它,直到它恢復(fù)服務(wù)。
- Horizontal Scaling(橫向擴展):可以根據(jù)機器的CPU的使用率來調(diào)整容器的數(shù)量,只需開發(fā)人員在管理界面上輸入幾個命令即可。
- Service Discovery and Load Balancing(服務(wù)發(fā)現(xiàn)和負載均衡):在不需要修改現(xiàn)有的應(yīng)用程序代碼的情況下,便可使用服務(wù)的發(fā)現(xiàn)機制。Kubermetes為容器提供了一個虛擬網(wǎng)絡(luò)環(huán)境,每個容器擁有獨立的IP地址和DNS名稱,容器之間發(fā)現(xiàn)了負載均衡。
- Automated Rollouts and Rollbacks(自動部署或回滾):Kubermetes支撐滾動更新模式,能逐步替換掉當前環(huán)境的應(yīng)用程序和配置,同時監(jiān)視應(yīng)用程序運行狀況,以確保不會同時殺死所有實例。如果出現(xiàn)問題,Kubermetes支持回滾更改。
- Secret and Configuration Managenent(配置管理):部署和更新應(yīng)用程序的配置,不需要重新打鏡像,并且不需要在堆棧中暴露配置。
- Storage Orchestration(存儲編排):自動安裝所有選擇的存儲系統(tǒng),無論是本地存儲、公共云提供商(如GCP或AWS),還是網(wǎng)絡(luò)存儲系統(tǒng)(如NFS、iSCSI、Gluster、Ceph、Cinder或Flocker)
- Batch execution(批量處理):除了服務(wù)之外,Kubermetes還可以管理批量處理和CI的工作負載,如果需要,可以替換容器,如NFS、iSCSI、Gluster、Ceph、Cinder或Flocker等。
? 從Kubermetes提供的功能來看,Kubermetes完全可以成為構(gòu)建和部署微服務(wù)的一個工具,它是從服務(wù)編排上實現(xiàn)的,而不是代碼實現(xiàn)的。目前國外有很多知名的公司在使用Kubermetes,如Google、eBay、Pearson等 。由于它的開源免費,Microsoft、VMWare、RedHat、CoreOS等公司紛紛加入并貢獻代碼。Kubermetes技術(shù)吸引了一大批公司和技術(shù)愛好者,它已經(jīng)成為容器管理的領(lǐng)導(dǎo)者。
6 Spring Cloud 與 Kubermetes 比較
? Spring Cloud是一個構(gòu)建微服務(wù)的框架,而Kubermetes是通過運行的容器的編排來實現(xiàn)構(gòu)建微服務(wù)的。兩者從構(gòu)建微服務(wù)的角度和實現(xiàn)方式有很大的不同,但它們提供了構(gòu)建微服務(wù)所需要的全部功能。從提供的微服務(wù)所需的功能上看,兩者不分上下,如表所示:
微服務(wù)關(guān)注點 | Spring Cloud | Kubermetes |
---|---|---|
配置管理 | Config | Kubermetes ConfigMap |
服務(wù)發(fā)現(xiàn) | Eureka、Consul、Zoopeeper | Kubermetes Services |
負載均衡 | Ribbon | Kubermetes Services |
網(wǎng)關(guān) | Zuul | Kubermetes Services |
分布式追蹤 | Spring Cloud Sleuth | Open tracing |
容錯 | Hystrix | Kubermetes Health Check |
安全模塊 | Spring Cloud Security | —— |
分布式日志 | ELK | EFK |
任務(wù)管理 | Spring Boot | Kubermetes Jobs |
? Spring Cloud 通過眾多的數(shù)據(jù)庫來實現(xiàn)微服務(wù)系統(tǒng)所需的各個組件,同時不斷集成優(yōu)秀的組件,所以Spring Cloud組件是非常完善的。Spring Cloud基于Spring Boot框架,有快速開發(fā)、快速部署的有點。對于Java開發(fā)者來說,學(xué)習(xí)Spring Cloud的成本不高
? Kubermetes在編排上解決微服務(wù)的各個功能,例如服務(wù)發(fā)現(xiàn)、配置管理、負載均衡、容錯等。Kubermetes不局限于Java平臺,也不局限于語言,開發(fā)者可以自由選擇開發(fā)語言進行項目開發(fā)。
? 與Kubermetes相比,Spring Cloud具有以下有點:
- 采用Java語言開發(fā),基于Spring平臺,繼承了Spring Boot快速開發(fā)的優(yōu)勢,是Java程序員實現(xiàn)微服務(wù)的最佳實踐
- Spring Cloud有大量的類庫和資源,基本上能解決所有可能出現(xiàn)的問題。
? 與Kubermetes相比,Spring Cloud具有以下有點:
- 依賴于Java語言,不支持跨語言
- Spring Cloud需要在代碼中關(guān)注微服務(wù)的功能點,例如服務(wù)發(fā)現(xiàn)、負載均衡等。Kubermetes則不要關(guān)注這些。
? 下面介紹Kubermetes的有點和缺點:
- 優(yōu)點:
- Kubermetes支持多種語言,并且是一個容器管理平臺。Kubermetes使程序容器化,并在容器管理上提供了微服務(wù)的功能,例如配置管理、服務(wù)發(fā)現(xiàn)、負載均衡等。Kubermetes能夠被運用于多種場合,例如程序開發(fā)、測試環(huán)境、創(chuàng)建環(huán)境等。
- Kubermetes除了提供基本的構(gòu)建微服務(wù)的功能外,還提供了環(huán)境、資源限制、管理應(yīng)用程序的生命周期的功能。Kubermetes更像是是一個平臺,而Spring Cloud是一個框架
- 缺點
- Kubermetes面向DevOps人員,普通的開發(fā)人員需要學(xué)習(xí)很多這方面的知識,學(xué)習(xí)成本非常高。
- Kubermetes任然是一個相對較新的平臺,發(fā)展十分能迅速。新特性更新得快,所以需要DevOps人員跟進,不斷的學(xué)習(xí)
? Spring Cloud嘗試從Java類庫來實現(xiàn)微服務(wù)的所有功能,而Kubermetes嘗試從容器編排上實現(xiàn)所有的微服務(wù)功能,兩者的實現(xiàn)角度和方式不一樣,個人覺得,兩者最終的實現(xiàn)功能和效果上不分勝負,但從實現(xiàn)的方式上來講,Kubermetes略勝一籌。Kubermetes面向DevOps人員,學(xué)習(xí)成本高。Spring Cloud有很多的類庫。以Spring為基礎(chǔ),繼承了Spring Boot快速開發(fā)的優(yōu)點,為Java程序員開發(fā)微服務(wù)提供了很好的體驗,學(xué)習(xí)成本也較低。所以二者比較,各有優(yōu)勢。沒有最好的框架,也沒有最好的工具,關(guān)鍵是要適合業(yè)務(wù)需求和滿足業(yè)務(wù)場景。
7 總結(jié)
? 首先介紹了微服務(wù)應(yīng)該具備的功能,然后介紹了Spring Cloud和Spring Cloud的基本組件,最后介紹了Spring Cloud與Dubbo、Kubermetes之間的比較,以及它們的優(yōu)缺點。Spring Cloud作為Java語言的微服務(wù)落地框架,有很多的微服務(wù)組件。
本高。Spring Cloud有很多的類庫。以Spring為基礎(chǔ),繼承了Spring Boot快速開發(fā)的優(yōu)點,為Java程序員開發(fā)微服務(wù)提供了很好的體驗,學(xué)習(xí)成本也較低。所以二者比較,各有優(yōu)勢。沒有最好的框架,也沒有最好的工具,關(guān)鍵是要適合業(yè)務(wù)需求和滿足業(yè)務(wù)場景。文章來源:http://www.zghlxwxcb.cn/news/detail-401335.html
7 總結(jié)
? 首先介紹了微服務(wù)應(yīng)該具備的功能,然后介紹了Spring Cloud和Spring Cloud的基本組件,最后介紹了Spring Cloud與Dubbo、Kubermetes之間的比較,以及它們的優(yōu)缺點。Spring Cloud作為Java語言的微服務(wù)落地框架,有很多的微服務(wù)組件。文章來源地址http://www.zghlxwxcb.cn/news/detail-401335.html
到了這里,關(guān)于Spring Cloud 簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!