北京道達(dá)天際科技有限公司 北京 100089
在互聯(lián)網(wǎng)初期,業(yè)務(wù)比較單一,一個(gè)小型的應(yīng)用服務(wù)就可滿足用戶需求,典型代表就是一個(gè)應(yīng)用、一個(gè)數(shù)據(jù)庫、一個(gè)Web容器,彈體架構(gòu)的應(yīng)用服務(wù)就可以正常運(yùn)行[1]。
在單體架構(gòu)發(fā)展一段時(shí)間之后,系統(tǒng)為了應(yīng)對(duì)更大的數(shù)據(jù)量,就會(huì)進(jìn)行不同的層級(jí)劃分,每個(gè)層級(jí)有對(duì)應(yīng)的職責(zé),UI 層負(fù)責(zé)和用戶進(jìn)行交互、業(yè)務(wù)邏輯層負(fù)責(zé)具體的業(yè)務(wù)功能、數(shù)據(jù)庫層負(fù)責(zé)和上層進(jìn)行數(shù)據(jù)交換和存儲(chǔ)。
隨著系統(tǒng)的進(jìn)一步擴(kuò)大,系統(tǒng)之間的調(diào)用關(guān)系呈指數(shù)上升,服務(wù)的SOA化應(yīng)運(yùn)而生,SOA代表面向服務(wù)的架構(gòu),將應(yīng)用程序按照不同的職責(zé)劃分為不同的模塊,不同的模塊直接通過特定的協(xié)議和接口進(jìn)行交互。
隨著不斷地對(duì)系統(tǒng)進(jìn)行優(yōu)化,服務(wù)個(gè)體的獨(dú)立性越來越強(qiáng),業(yè)務(wù)拆分的粒度越來越細(xì),業(yè)務(wù)系統(tǒng)需要徹底進(jìn)行組件化和服務(wù)化,此時(shí)就需要一種更適合的架構(gòu)來支撐整個(gè)系統(tǒng)的運(yùn)行,微服務(wù)架構(gòu)由之而來,其實(shí)微服務(wù)架構(gòu)是SOA架構(gòu)思想的一種擴(kuò)展[2]。
目前,國內(nèi)使用 Spring Cloud 技術(shù)的公司并不多見,不是因?yàn)?Spring Cloud 不好,主要原因有以下幾點(diǎn):
(1)Spring Cloud 中文文檔較少,對(duì)于在使用過程中出現(xiàn)的問題,沒有太多的解決方案獲取路徑。
(2)國內(nèi)的互聯(lián)網(wǎng)公司以及互聯(lián)網(wǎng)技術(shù)日新月異,針對(duì)很多系統(tǒng)而言,國內(nèi)的很多互聯(lián)網(wǎng)公司發(fā)布的開源架構(gòu)也可滿足需求,且相關(guān)文檔較為豐富,出現(xiàn)問題時(shí)的解決方案較多。
(3)大型公司基本都有自己的分布式解決方案,而中小型公司的系統(tǒng)體量以及業(yè)務(wù)場(chǎng)景不需要微服務(wù)即可滿足,所以這些中小型公司就沒有采用Spring Cloud的必要性。
Spring cloud基于Spring Boot提供了一套微服解決方案,為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)的工具,并利用Spring Boot的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),可做到一鍵啟動(dòng)和部署。具體優(yōu)點(diǎn)如下:
(1)提供良好的開箱即用經(jīng)驗(yàn)的典型用例和可擴(kuò)展性機(jī)制覆蓋。
(2)服務(wù)拆分粒度更細(xì),對(duì)于資源的重復(fù)利用以及開發(fā)的效率有很大提升。
(3)可以更精準(zhǔn)的制定優(yōu)化服務(wù)方案,系統(tǒng)的可維護(hù)性較高[3]。
(4)微服務(wù)架構(gòu)采用去中心化思想,服務(wù)之間采用Restful等輕量級(jí)通訊,比ESB更輕量。
(5)適于互聯(lián)網(wǎng)時(shí)代,產(chǎn)品迭代周期更短。
但是Spring Cloud除了以上優(yōu)勢(shì)外,還有許多劣勢(shì),詳細(xì)如下:
(1)微服務(wù)過多,治理成本高,系統(tǒng)維護(hù)的成本較高。
(2)分布式系統(tǒng)開發(fā)的成本高對(duì)研發(fā)團(tuán)隊(duì)的壓力大。
Spring Cloud包含了許多子項(xiàng)目,這些子項(xiàng)目中的眾多的組件幫助使用者方便地完成服務(wù)注冊(cè)和發(fā)現(xiàn)、服務(wù)調(diào)用方式、斷路器、負(fù)載均衡、服務(wù)路由和過濾、分布式配置、集群選主,分布式消息等功能,主要功能詳細(xì)介紹如下:
Eureka意為古希臘語:發(fā)現(xiàn)。Eureka由Eureka Server和Eureka Client組成,Eureka Server 是服務(wù)的注冊(cè)中心,用于管理注冊(cè)服務(wù)的列表。
Netflix Ribbon是負(fù)責(zé)進(jìn)行客戶端負(fù)載均衡的組件;一般與Rest Template結(jié)合,在訪問Eureka Client提供的服務(wù)時(shí)進(jìn)行負(fù)載均衡處理。也就是說,Ribbon用于服務(wù)調(diào)用者向被調(diào)用者進(jìn)行服務(wù)調(diào)用,并且如果服務(wù)者有多個(gè)節(jié)點(diǎn)時(shí),會(huì)進(jìn)行客戶端的負(fù)載均衡處理[4];
Netf lix Feign與Ribbon功能類似,用于調(diào)用方與被調(diào)用方的服務(wù)調(diào)用,同時(shí)進(jìn)行客戶端負(fù)載均衡的處理;不過它能提供類似本地調(diào)用的方式調(diào)用遠(yuǎn)程的Eureka Client提供的服務(wù);它實(shí)際上是在Ribbon基礎(chǔ)上進(jìn)行了進(jìn)一步的封裝來提高調(diào)用服務(wù)的簡便性。
Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開源庫,能夠保證在一個(gè)依賴出現(xiàn)問題的情況下,不會(huì)導(dǎo)致整體服務(wù)失敗,避免級(jí)聯(lián)故障,以提供分布式系統(tǒng)的彈性。
Netfix Zuul是讓所有的外部調(diào)用都要先經(jīng)過一個(gè)總的入口,這個(gè)總的入口就相當(dāng)于一道墻,把外部與內(nèi)部的所有服務(wù)接口隔開,所有外部調(diào)用都要先經(jīng)過這個(gè)總?cè)肟冢蛇@個(gè)總的入口來決定,要調(diào)用哪個(gè)服務(wù)。
Spring Cloud Config是一個(gè)基于http協(xié)議的遠(yuǎn)程配置實(shí)現(xiàn)方式。通過統(tǒng)一的配置管理服務(wù)器進(jìn)行配置管理,客戶端通過https協(xié)議主動(dòng)地拉取服務(wù)的配置信息,完成配置獲取。
Spring Cloud Bus通過輕量消息代理連接各個(gè)分布的節(jié)點(diǎn)。用于廣播狀態(tài)的變化或其他消息指令。其中一個(gè)核心思想是通過分布式的啟動(dòng)器對(duì)spring boot應(yīng)用進(jìn)行擴(kuò)展,也可以用來建立一個(gè)多個(gè)應(yīng)用之間的通信頻道。目前唯一實(shí)現(xiàn)的方式是用AMQP消息代理作為通道。
Spring Cloud Security是Spring提供的一個(gè)安全框架,提供認(rèn)證和授權(quán)功能,最主要的是它提供了簡單的使用方式,同時(shí)又有很高的靈活性[5]。
通過以上對(duì)Spring Cloud的描述可以看出,雖然Spring Cloud有許多缺點(diǎn),但就總體而言,Spring Cloud的優(yōu)勢(shì)大于劣勢(shì),目前Spring Cloud分布式微服務(wù)架構(gòu)下的一站式解決方案,是各個(gè)微服務(wù)架構(gòu)落地技術(shù)的集合體,將各個(gè)服務(wù)進(jìn)行解耦,很好地解決了系統(tǒng)臃腫、高可用等問題,為用戶帶來了更好的使用體驗(yàn),此外還提供了一系列分布式系統(tǒng)快速構(gòu)建的工具極大地簡化了研發(fā)人員的開發(fā)工作。