系統(tǒng)分為不同的層級(jí),每個(gè)層級(jí)有對(duì)應(yīng)的職責(zé)搁胆,UI層負(fù)責(zé)和用戶進(jìn)行交互粤铭、業(yè)務(wù)邏輯層負(fù)責(zé)具體的業(yè)務(wù)功能凹髓、數(shù)據(jù)庫(kù)層負(fù)責(zé)和上層進(jìn)行數(shù)據(jù)交換和存儲(chǔ)赌躺。
下面是垂直架構(gòu)的架構(gòu)圖:
在這個(gè)階段SSH(struts+spring+hibernate)是項(xiàng)目的關(guān)鍵技術(shù),Struts負(fù)責(zé)web層邏輯控制祝蝠、Spring負(fù)責(zé)業(yè)務(wù)層管理Bean恍风、Hibernate負(fù)責(zé)數(shù)據(jù)庫(kù)操作進(jìn)行封裝,持久化數(shù)據(jù)。
服務(wù)化架構(gòu)
如果公司進(jìn)一步的做大沟娱,垂直子系統(tǒng)會(huì)變的越來(lái)越多蓖扑,系統(tǒng)和系統(tǒng)之間的調(diào)用關(guān)系呈指數(shù)上升的趨勢(shì)嗓奢。在這樣的背景下厂榛,很多公司都會(huì)考慮服務(wù)的SOA化。SOA代表面向服務(wù)的架構(gòu),將應(yīng)用程序根據(jù)不同的職責(zé)劃分為不同的模塊,不同的模塊直接通過(guò)特定的協(xié)議和接口進(jìn)行交互。這樣使整個(gè)系統(tǒng)切分成很多單個(gè)組件服務(wù)來(lái)完成請(qǐng)求腮鞍,當(dāng)流量過(guò)大時(shí)通過(guò)水平擴(kuò)展相應(yīng)的組件來(lái)支撐砚蓬,所有的組件通過(guò)交互來(lái)滿足整體的業(yè)務(wù)需求。
SOA服務(wù)化的優(yōu)點(diǎn)是,它可以根據(jù)需求通過(guò)網(wǎng)絡(luò)對(duì)松散耦合的粗粒度應(yīng)用組件進(jìn)行分布式部署、組合和使用煌茴。服務(wù)層是SOA的基礎(chǔ)僚害,可以直接被應(yīng)用調(diào)用捻艳,從而有效控制系統(tǒng)中與軟件代理交互的人為依賴性月培。
服務(wù)化架構(gòu)是一套松耦合的架構(gòu)纯续,服務(wù)的拆分原則是服務(wù)內(nèi)部高內(nèi)聚兔魂,服務(wù)之間低耦合芙代。
下面是服務(wù)化架構(gòu)圖:
在這個(gè)階段可以使用WebService或者dubbo來(lái)服務(wù)治理肝谭。
我們發(fā)現(xiàn)從單體架構(gòu)到服務(wù)化架構(gòu)掘宪,應(yīng)用數(shù)量都在不斷的增加,慢慢的下沉的就成了基礎(chǔ)組建攘烛,上浮的就成為業(yè)務(wù)系統(tǒng)魏滚。從上述也可以看出架構(gòu)的本質(zhì)就是不斷的拆分重構(gòu):分的過(guò)程是把系統(tǒng)拆分為各個(gè)子系統(tǒng)/模塊/組件,拆的時(shí)候坟漱,首先要解決每個(gè)組件的定位問(wèn)題鼠次,然后才能劃分彼此的邊界,實(shí)現(xiàn)合理的拆分。合就是根據(jù)最終要求腥寇,把各個(gè)分離的組件有機(jī)整合在一起成翩。拆分的結(jié)果使開(kāi)發(fā)人員能夠做到業(yè)務(wù)聚焦、技能聚焦赦役,實(shí)現(xiàn)開(kāi)發(fā)敏捷麻敌,合的結(jié)果是系統(tǒng)變得柔性,可以因需而變掂摔,實(shí)現(xiàn)業(yè)務(wù)敏捷术羔。
SOA和微服務(wù)架構(gòu)
SOA和微服務(wù)的區(qū)別
其實(shí)服務(wù)化架構(gòu)已經(jīng)可以解決大部分企業(yè)的需求了,那么我們?yōu)槭裁匆芯课⒎?wù)呢乙漓?先說(shuō)說(shuō)它們的區(qū)別;
- 微服務(wù)架構(gòu)強(qiáng)調(diào)業(yè)務(wù)系統(tǒng)需要徹底的組件化和服務(wù)化叭披,一個(gè)組件就是一個(gè)產(chǎn)品寥殖,可以獨(dú)立對(duì)外提供服務(wù)
- 微服務(wù)不再?gòu)?qiáng)調(diào)傳統(tǒng)SOA架構(gòu)里面比較重的ESB企業(yè)服務(wù)總線
- 微服務(wù)強(qiáng)調(diào)每個(gè)微服務(wù)都有自己獨(dú)立的運(yùn)行空間,包括數(shù)據(jù)庫(kù)資源涩蜘。
- 微服務(wù)架構(gòu)本身來(lái)源于互聯(lián)網(wǎng)的思路嚼贡,因此組件對(duì)外發(fā)布的服務(wù)強(qiáng)調(diào)了采用HTTP Rest API的方式來(lái)進(jìn)行
- 微服務(wù)的切分粒度會(huì)更小
總結(jié):微服務(wù)架構(gòu)是 SOA 架構(gòu)思想的一種擴(kuò)展,更加強(qiáng)調(diào)服務(wù)個(gè)體的獨(dú)立性皱坛、拆分粒度更小编曼。
為什么考慮Spring Cloud
- Spring Cloud來(lái)源于Spring,質(zhì)量剩辟、穩(wěn)定性掐场、持續(xù)性都可以得到保證
- Spirng Cloud天然支持Spring Boot,更加便于業(yè)務(wù)落地贩猎。
- Spring Cloud發(fā)展非常的快熊户,從16年開(kāi)始接觸的時(shí)候相關(guān)組件版本為1.x,到現(xiàn)在將要發(fā)布2.x系列
- Spring Cloud是Java領(lǐng)域最適合做微服務(wù)的框架吭服。
- 相比于其它框架,Spring Cloud對(duì)微服務(wù)周邊環(huán)境的支持力度最大嚷堡。
- 對(duì)于中小企業(yè)來(lái)講,使用門檻較低艇棕。
Spring Cloud 是微服務(wù)架構(gòu)的最佳落地方案
它的特性
以下為Spring Cloud的核心特性:
- 分布式/版本化配置
- 服務(wù)注冊(cè)和發(fā)現(xiàn)
- 路由
- 服務(wù)和服務(wù)之間的調(diào)用
- 負(fù)載均衡
- 斷路器
- 分布式消息傳遞
這些特性都是由不同的組件來(lái)完成蝌戒,在架構(gòu)的演進(jìn)過(guò)程中扮演著重要的角色,接下來(lái)我們一起看看沼琉。
微服務(wù)架構(gòu)
Spring Cloud解決的第一個(gè)問(wèn)題就是:服務(wù)與服務(wù)之間的解耦北苟。很多公司在業(yè)務(wù)高速發(fā)展的時(shí)候,服務(wù)組件也會(huì)相應(yīng)的不斷增加打瘪。服務(wù)和服務(wù)之間有著復(fù)雜的相互調(diào)用關(guān)系友鼻,經(jīng)常有服務(wù)A調(diào)用服務(wù)B傻昙,服務(wù)B調(diào)用服務(wù)C和服務(wù)D ...,隨著服務(wù)化組件的不斷增多彩扔,服務(wù)之間的調(diào)用關(guān)系成指數(shù)級(jí)別的增長(zhǎng)妆档,極端情況下就如下圖所示:
這樣最容易導(dǎo)致的情況就是牽一發(fā)而動(dòng)全身虫碉。經(jīng)常出現(xiàn)由于某個(gè)服務(wù)更新而沒(méi)有通知到其它服務(wù)贾惦,導(dǎo)致上線后慘案頻發(fā)。這時(shí)候就應(yīng)該進(jìn)行服務(wù)治理蔗衡,將服務(wù)之間的直接依賴轉(zhuǎn)化為服務(wù)對(duì)服務(wù)中心的依賴纤虽。Spring Cloud 核心組件Eureka就是解決這類問(wèn)題。
Eureka
Eureka是Netflix開(kāi)源的一款提供服務(wù)注冊(cè)和發(fā)現(xiàn)的產(chǎn)品绞惦,它提供了完整的Service Registry和Service Discovery實(shí)現(xiàn)。也是Spring Cloud體系中最重要最核心的組件之一洋措。
用大白話講济蝉,Eureka就是一個(gè)服務(wù)中心,將所有的可以提供的服務(wù)都注冊(cè)到它這里來(lái)管理菠发,其它各調(diào)用者需要的時(shí)候去注冊(cè)中心獲取王滤,然后再進(jìn)行調(diào)用,避免了服務(wù)之間的直接調(diào)用滓鸠,方便后續(xù)的水平擴(kuò)展雁乡、故障轉(zhuǎn)移等。如下圖:
當(dāng)然服務(wù)中心這么重要的組件一但掛掉將會(huì)影響全部服務(wù)踱稍,因此需要搭建Eureka集群來(lái)保持高可用性,生產(chǎn)中建議最少兩臺(tái)悠抹。隨著系統(tǒng)的流量不斷增加珠月,需要根據(jù)情況來(lái)擴(kuò)展某個(gè)服務(wù),Eureka內(nèi)部已經(jīng)提供均衡負(fù)載的功能楔敌,只需要增加相應(yīng)的服務(wù)端實(shí)例既可啤挎。那么在系統(tǒng)的運(yùn)行期間某個(gè)實(shí)例掛了怎么辦?Eureka內(nèi)容有一個(gè)心跳檢測(cè)機(jī)制卵凑,如果某個(gè)實(shí)例在規(guī)定的時(shí)間內(nèi)沒(méi)有進(jìn)行通訊則會(huì)自動(dòng)被剔除掉庆聘,避免了某個(gè)實(shí)例掛掉而影響服務(wù)。
因此使用了Eureka就自動(dòng)具有了注冊(cè)中心勺卢、負(fù)載均衡伙判、故障轉(zhuǎn)移的功能。如果想對(duì)Eureka進(jìn)一步了解可以參考這篇文章:注冊(cè)中心Eureka
Hystrix
在微服務(wù)架構(gòu)中通常會(huì)有多個(gè)服務(wù)層調(diào)用值漫,基礎(chǔ)服務(wù)的故障可能會(huì)導(dǎo)致級(jí)聯(lián)故障澳腹,進(jìn)而造成整個(gè)系統(tǒng)不可用的情況织盼,這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)。服務(wù)雪崩效應(yīng)是一種因“服務(wù)提供者”的不可用導(dǎo)致“服務(wù)消費(fèi)者”的不可用,并將不可用逐漸放大的過(guò)程酱塔。
如下圖所示:A作為服務(wù)提供者沥邻,B為A的服務(wù)消費(fèi)者,C和D是B的服務(wù)消費(fèi)者羊娃。A不可用引起了B的不可用唐全,并將不可用像滾雪球一樣放大到C和D時(shí),雪崩效應(yīng)就形成了蕊玷。
在這種情況下就需要整個(gè)服務(wù)機(jī)構(gòu)具有故障隔離的功能,避免某一個(gè)服務(wù)掛掉影響全局垃帅。在Spring Cloud 中Hystrix組件就扮演這個(gè)角色延届。
Hystrix會(huì)在某個(gè)服務(wù)連續(xù)調(diào)用N次不響應(yīng)的情況下,立即通知調(diào)用端調(diào)用失敗贸诚,避免調(diào)用端持續(xù)等待而影響了整體服務(wù)方庭。Hystrix間隔時(shí)間會(huì)再次檢查此服務(wù),如果服務(wù)恢復(fù)將繼續(xù)提供服務(wù)酱固。
繼續(xù)了解Hystrix可以參考:熔斷器Hystrix
Hystrix Dashboard和Turbine
當(dāng)熔斷發(fā)生的時(shí)候需要迅速的響應(yīng)來(lái)解決問(wèn)題械念,避免故障進(jìn)一步擴(kuò)散,那么對(duì)熔斷的監(jiān)控就變得非常重要运悲。熔斷的監(jiān)控現(xiàn)在有兩款工具:Hystrix-dashboard和Turbine
Hystrix-dashboard是一款針對(duì)Hystrix進(jìn)行實(shí)時(shí)監(jiān)控的工具龄减,通過(guò)Hystrix Dashboard我們可以直觀地看到各Hystrix Command的請(qǐng)求響應(yīng)時(shí)間, 請(qǐng)求成功率等數(shù)據(jù)。但是只使用Hystrix Dashboard的話, 你只能看到單個(gè)應(yīng)用內(nèi)的服務(wù)信息, 這明顯不夠. 我們需要一個(gè)工具能讓我們匯總系統(tǒng)內(nèi)多個(gè)服務(wù)的數(shù)據(jù)并顯示到Hystrix Dashboard上, 這個(gè)工具就是Turbine. 監(jiān)控的效果圖如下:
想了解具體都監(jiān)控了哪些指標(biāo)希停,以及如何監(jiān)控可以參考這篇文章:熔斷監(jiān)控Hystrix Dashboard和Turbine
配置中心
隨著微服務(wù)不斷的增多,每個(gè)微服務(wù)都有自己對(duì)應(yīng)的配置文件鳖敷。在研發(fā)過(guò)程中有測(cè)試環(huán)境脖苏、UAT環(huán)境、生產(chǎn)環(huán)境定踱,因此每個(gè)微服務(wù)又對(duì)應(yīng)至少三個(gè)不同環(huán)境的配置文件棍潘。這么多的配置文件,如果需要修改某個(gè)公共服務(wù)的配置信息崖媚,如:緩存亦歉、數(shù)據(jù)庫(kù)等,難免會(huì)產(chǎn)生混亂畅哑,這個(gè)時(shí)候就需要引入Spring Cloud另外一個(gè)組件:Spring Cloud Config肴楷。
Spring Cloud Config
Spring Cloud Config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了Client和Server兩個(gè)部分荠呐,Server提供配置文件的存儲(chǔ)赛蔫、以接口的形式將配置文件的內(nèi)容提供出去砂客,Client通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用呵恢。
其實(shí)就是Server端將所有的配置文件服務(wù)化鞠值,需要配置文件的服務(wù)實(shí)例去Config Server獲取對(duì)應(yīng)的數(shù)據(jù)。將所有的配置文件統(tǒng)一整理渗钉,避免了配置文件碎片化彤恶。配置中心git實(shí)例參考:配置中心git示例;
如果服務(wù)運(yùn)行期間改變配置文件鳄橘,服務(wù)是不會(huì)得到最新的配置信息声离,需要解決這個(gè)問(wèn)題就需要引入Refresh√绷可以在服務(wù)的運(yùn)行期間重新加載配置文件术徊,具體可以參考這篇文章:配置中心svn示例和refresh
當(dāng)所有的配置文件都存儲(chǔ)在配置中心的時(shí)候,配置中心就成為了一個(gè)非常重要的組件宝磨。如果配置中心出現(xiàn)問(wèn)題將會(huì)導(dǎo)致災(zāi)難性的后果弧关,因此在生產(chǎn)中建議對(duì)配置中心做集群,來(lái)支持配置中心高可用性唤锉。具體參考:配置中心服務(wù)化和高可用
Spring Cloud Bus
上面的Refresh方案雖然可以解決單個(gè)微服務(wù)運(yùn)行期間重載配置信息的問(wèn)題,但是在真正的實(shí)踐生產(chǎn)中别瞭,可能會(huì)有N多的服務(wù)需要更新配置窿祥,如果每次依靠手動(dòng)Refresh將是一個(gè)巨大的工作量,這時(shí)候Spring Cloud提出了另外一個(gè)解決方案:Spring Cloud Bus
Spring Cloud Bus通過(guò)輕量消息代理連接各個(gè)分布的節(jié)點(diǎn)蝙寨。這會(huì)用在廣播狀態(tài)的變化(例如配置變化)或者其它的消息指令中晒衩。Spring Cloud Bus的一個(gè)核心思想是通過(guò)分布式的啟動(dòng)器對(duì)Spring Boot應(yīng)用進(jìn)行擴(kuò)展,也可以用來(lái)建立一個(gè)或多個(gè)應(yīng)用之間的通信頻道墙歪。目前唯一實(shí)現(xiàn)的方式是用AMQP消息代理作為通道听系。
Spring Cloud Bus是輕量級(jí)的通訊組件,也可以用在其它類似的場(chǎng)景中虹菲。有了Spring Cloud Bus之后靠胜,當(dāng)我們改變配置文件提交到版本庫(kù)中時(shí),會(huì)自動(dòng)的觸發(fā)對(duì)應(yīng)實(shí)例的Refresh毕源,具體的工作流程如下:
也可以參考這篇文章來(lái)了解:配置中心和消息總線
服務(wù)網(wǎng)關(guān)
在微服務(wù)架構(gòu)模式下,后端服務(wù)的實(shí)例數(shù)一般是動(dòng)態(tài)的霎褐,對(duì)于客戶端而言很難發(fā)現(xiàn)動(dòng)態(tài)改變的服務(wù)實(shí)例的訪問(wèn)地址信息址愿。因此在基于微服務(wù)的項(xiàng)目中為了簡(jiǎn)化前端的調(diào)用邏輯,通常會(huì)引入API Gateway作為輕量級(jí)網(wǎng)關(guān)冻璃,同時(shí)API Gateway中也會(huì)實(shí)現(xiàn)相關(guān)的認(rèn)證邏輯從而簡(jiǎn)化內(nèi)部服務(wù)之間相互調(diào)用的復(fù)雜度响谓。
Spring Cloud體系中支持API Gateway落地的技術(shù)就是Zuul。Spring Cloud Zuul路由是微服務(wù)架構(gòu)中不可或缺的一部分娘纷,提供動(dòng)態(tài)路由嫁审,監(jiān)控,彈性失驶,安全等的邊緣服務(wù)土居。Zuul是Netflix出品的一個(gè)基于JVM路由和服務(wù)端的負(fù)載均衡器。
它的具體作用就是服務(wù)轉(zhuǎn)發(fā)嬉探,接收并轉(zhuǎn)發(fā)所有內(nèi)外部的客戶端調(diào)用擦耀。使用Zuul可以作為資源的統(tǒng)一訪問(wèn)入口,同時(shí)也可以在網(wǎng)關(guān)做一些權(quán)限校驗(yàn)等類似的功能涩堤。
具體使用參考這篇文章:服務(wù)網(wǎng)關(guān)zuul
鏈路跟蹤
隨著服務(wù)的越來(lái)越多眷蜓,對(duì)調(diào)用鏈的分析會(huì)越來(lái)越復(fù)雜,如服務(wù)之間的調(diào)用關(guān)系胎围、某個(gè)請(qǐng)求對(duì)應(yīng)的調(diào)用鏈吁系、調(diào)用之間消費(fèi)的時(shí)間等,對(duì)這些信息進(jìn)行監(jiān)控就成為一個(gè)問(wèn)題白魂。在實(shí)際的使用中我們需要監(jiān)控服務(wù)和服務(wù)之間通訊的各項(xiàng)指標(biāo)汽纤,這些數(shù)據(jù)將是我們改進(jìn)系統(tǒng)架構(gòu)的主要依據(jù)。因此分布式的鏈路跟蹤就變的非常重要福荸,Spring Cloud也給出了具體的解決方案:Spring Cloud Sleuth和Zipkin
Spring Cloud Sleuth為服務(wù)之間調(diào)用提供鏈路追蹤撕阎。通過(guò)Sleuth可以很清楚的了解到一個(gè)服務(wù)請(qǐng)求經(jīng)過(guò)了哪些服務(wù)卸察,每個(gè)服務(wù)處理花費(fèi)了多長(zhǎng)時(shí)間怨规。從而讓我們可以很方便的理清各微服務(wù)間的調(diào)用關(guān)系骏庸。
Zipkin是Twitter的一個(gè)開(kāi)源項(xiàng)目幸缕,允許開(kāi)發(fā)者收集 Twitter 各個(gè)服務(wù)上的監(jiān)控?cái)?shù)據(jù)腔剂,并提供查詢接口
分布式鏈路跟蹤需要Sleuth+Zipkin結(jié)合來(lái)實(shí)現(xiàn)瘪贱。
總結(jié)
我們從整體上來(lái)看一下Spring Cloud各個(gè)組件如何來(lái)配套使用:
從上圖可以看出Spring Cloud各個(gè)組件相互配合颤介,合作支持了一套完整的微服務(wù)架構(gòu)梳星。
- 其中Eureka負(fù)責(zé)服務(wù)的注冊(cè)與發(fā)現(xiàn),很好將各服務(wù)連接起來(lái)
- Hystrix 負(fù)責(zé)監(jiān)控服務(wù)之間的調(diào)用情況买窟,連續(xù)多次失敗進(jìn)行熔斷保護(hù)丰泊。
- Hystrix dashboard,Turbine 負(fù)責(zé)監(jiān)控 Hystrix的熔斷情況,并給予圖形化的展示
- Spring Cloud Config 提供了統(tǒng)一的配置中心服務(wù)
- 當(dāng)配置文件發(fā)生變化的時(shí)候始绍,Spring Cloud Bus 負(fù)責(zé)通知各服務(wù)去獲取最新的配置信息
- 所有對(duì)外的請(qǐng)求和服務(wù)瞳购,我們都通過(guò)Zuul來(lái)進(jìn)行轉(zhuǎn)發(fā),起到API網(wǎng)關(guān)的作用
- 最后我們使用Sleuth+Zipkin將所有的請(qǐng)求數(shù)據(jù)記錄下來(lái)亏推,方便我們進(jìn)行后續(xù)分析
Spring Cloud從設(shè)計(jì)之初就考慮了絕大多數(shù)互聯(lián)網(wǎng)公司架構(gòu)演化所需的功能学赛,如服務(wù)發(fā)現(xiàn)注冊(cè)年堆、配置中心、消息總線盏浇、負(fù)載均衡变丧、斷路器、數(shù)據(jù)監(jiān)控等绢掰。這些功能都是以插拔的形式提供出來(lái)痒蓬,方便我們系統(tǒng)架構(gòu)演進(jìn)的過(guò)程中,可以合理的選擇需要的組件進(jìn)行集成滴劲,從而在架構(gòu)演進(jìn)的過(guò)程中會(huì)更加平滑攻晒、順利。
微服務(wù)架構(gòu)是一種趨勢(shì)班挖,Spring Cloud提供了標(biāo)準(zhǔn)化的鲁捏、全站式的技術(shù)方案,意義可能會(huì)堪比當(dāng)前Servlet規(guī)范的誕生萧芙,有效推進(jìn)服務(wù)端軟件系統(tǒng)技術(shù)水平的進(jìn)步给梅。
歡迎工作一到五年的Java工程師朋友們加入Java架構(gòu)開(kāi)發(fā):810589193
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)双揪、高性能及分布式动羽、Jvm性能調(diào)優(yōu)、Spring源碼渔期,MyBatis曹质,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用"沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰擎场!趁年輕,使勁拼几莽,給未來(lái)的自己一個(gè)交代