一.主流架構(gòu)模型SOA架構(gòu)和微服務(wù)架構(gòu)
SOA架構(gòu)
SOA全稱(ServiceOrientedArchitecture)中文意思為面相服務(wù)的架構(gòu),他是一種設(shè)計方法,輕重包含多個服務(wù),服務(wù)之間通過相互依賴最終提供一系列的功能,一個服務(wù)通常以獨(dú)立的形式存在與操作系統(tǒng)進(jìn)程中,各個服務(wù)之間通過網(wǎng)絡(luò)調(diào)用,
跟SOA相提并論的還有ESB(企業(yè)服務(wù)總線),簡單來說ESB就是管道,鏈接各個服務(wù)節(jié)點,為了集成不同系統(tǒng)和不同協(xié)議,ESB做消息的轉(zhuǎn)化解釋和路由的工作。讓不同的服務(wù)連通。
系統(tǒng)初期
系統(tǒng)后期
SOA架構(gòu),使用ESB
SOA解決的問題
1.系統(tǒng)集成,站在系統(tǒng)的角度,解決企業(yè)系統(tǒng)間的通信問題,把原先散亂無規(guī)劃的系統(tǒng)間的網(wǎng)狀結(jié)構(gòu),梳理成規(guī)劃,可治理的系統(tǒng)間星型結(jié)構(gòu)。這一步需要引入一些產(chǎn)品,例如ESB,以及技術(shù)規(guī)范,服務(wù)管理規(guī)范,這一步解決的核心問題是有序
2,系統(tǒng)的服務(wù)化,站在功能的角度,把業(yè)務(wù)邏輯抽象成可復(fù)用可組裝的服務(wù),通過服務(wù)的編排和實現(xiàn)業(yè)務(wù)的快速再生,目的:把原先固有的業(yè)務(wù)功能變?yōu)橥ㄓ玫臉I(yè)務(wù)服務(wù),實現(xiàn)業(yè)務(wù)邏輯的快速復(fù)用,這步解決的核心問題是復(fù)用
3,業(yè)務(wù)的服務(wù)化,站在企業(yè)的角度,把企業(yè)只能抽象成可復(fù)用可組裝的服務(wù),把原先職能化的企業(yè)架構(gòu)轉(zhuǎn)為變?yōu)榉?wù)花的企業(yè)架構(gòu),進(jìn)一步提升企業(yè)的對外服務(wù)能力,前兩步都是技術(shù)層面來解決系統(tǒng)調(diào)用,系統(tǒng)功能復(fù)用的問題,第三步則是以業(yè)務(wù)驅(qū)動把一個業(yè)務(wù)單元封裝成一項服務(wù),這一步解決的核心問題是高效。
微服務(wù)架構(gòu)
微服務(wù)架構(gòu)和SOA架構(gòu)類似,微服務(wù)架構(gòu)是在SOA上做的升華,微服務(wù)架構(gòu)強(qiáng)調(diào)的一個重點是“業(yè)務(wù)需要徹底的組件化和服務(wù)化”,原有的單個業(yè)務(wù)系統(tǒng)會拆分為多個可以獨(dú)立開發(fā)設(shè)計運(yùn)行的小應(yīng)用。這些小應(yīng)用之間通過服務(wù)完成交互和集成。
組件表示一個可以獨(dú)立更換和升級的單元,像PC機(jī)中的CPU內(nèi)存,顯卡等獨(dú)立且可以更換升級而不影響其他單元,如果我們把PC機(jī)作為組件以服務(wù)的方式構(gòu)建,那么這臺PC只需要維護(hù)主板和一些必要的外部設(shè)備,CPU,內(nèi)存,硬盤都是以組件方式提供服務(wù),PC需要調(diào)用CPU做計算機(jī)處理,只需要知道CPU這個組件的地址即可。
微服務(wù)特征
1.通過服務(wù)實現(xiàn)組件化
2.按業(yè)務(wù)能力來劃分服務(wù)和開發(fā)團(tuán)隊
3.去中心化
4,基礎(chǔ)設(shè)施自動化(devops,自動化部署)
SOA架構(gòu)和微服務(wù)架構(gòu)的區(qū)別
1,微服務(wù)不在強(qiáng)調(diào)傳統(tǒng)的SOA架構(gòu)里面比較重的ESB企業(yè)服務(wù)總線,同時SOA的思想進(jìn)入到單個業(yè)務(wù)系統(tǒng)內(nèi)部實現(xiàn)真正的組件化。
2,Docker容器技術(shù)的出現(xiàn),為微服務(wù)提供了便利的條件,比如更小的部署單元,每個服務(wù)都可以通過類似的Node或者Springboot等技術(shù)跑在自己的進(jìn)程中,
3,SOA注重的系統(tǒng)集成方面,而微服務(wù)關(guān)注的是完全分離
二.分布式架構(gòu)的基本理論CAP,base以及應(yīng)用
首先了解下一致性的問題
強(qiáng)一致性:
以客戶端的角度來看,多并發(fā)訪問時更新過的數(shù)據(jù),要求數(shù)據(jù)能被后續(xù)的訪問看到,就是強(qiáng)一致性,例如數(shù)據(jù)庫的事務(wù)
弱一致性:
以客戶端的角度來看,多并發(fā)訪問時更新過的數(shù)據(jù),如果能容忍后續(xù)的訪問可以看到部分或者全部看不到,這就是弱一致性,例如:銀行轉(zhuǎn)賬(一般是兩小時或者24小時內(nèi)到賬)
最終一致性
以客戶端的角度來看,多并發(fā)訪問時更新過的數(shù)據(jù),如果經(jīng)過一段時間后要求能訪問到更新后的數(shù)據(jù),這就是最終一致性,例如:銀行轉(zhuǎn)賬(一般是兩小時或者24小時內(nèi)到賬)
最終一致性是弱一致性的一個特例,是若一致性中非常推崇的一種一致性模型,也是業(yè)界在大型分布式系統(tǒng)的數(shù)據(jù)一致性上比較用的多的模型
cap原理中,有三個要素
一致性(Consistency)
可用性(Availability)
分區(qū)容忍性(Partitiontolerance)
CAP原理指的是這三個要素最多只能同時實現(xiàn)兩點,不能三者兼顧,因此在設(shè)計分布式系統(tǒng)架構(gòu)時,必須做出取舍,而對于分布式系統(tǒng)分區(qū)容忍性是最基本要求,否則就失去價值,因此設(shè)計分布式系統(tǒng),就是在一致性C和可用性A中去一個平衡,對于大多數(shù)web應(yīng)用,其實并不需要強(qiáng)一致性,因此犧牲一致性而換取高可用性,是目前多數(shù)分布式系統(tǒng)設(shè)計的方向。
一致性:所有節(jié)點上的數(shù)據(jù)時刻保持同步
可用性:每個請求都能接受一個相應(yīng),無論響應(yīng)成功或失敗
分區(qū)容錯:系統(tǒng)應(yīng)該持續(xù)提供服務(wù),即使系統(tǒng)內(nèi)部(某個節(jié)點分區(qū))有消息丟失。比如交換機(jī)失敗,網(wǎng)址網(wǎng)絡(luò)被分成幾個子網(wǎng),形成腦裂,服務(wù)器發(fā)生網(wǎng)絡(luò)延遲或死機(jī),導(dǎo)致某些server與集群中的其他機(jī)器失去聯(lián)系。
CAP并不是一個普適性的原理和知道思想,他僅僅使用于原子讀寫的NoSql場景中,并不適用于數(shù)據(jù)庫系統(tǒng)。
base理論
從前面的分析中知道,在分布式系統(tǒng)下,CAP并不適合數(shù)據(jù)庫事務(wù)(因為更新一些錯誤的數(shù)據(jù)而導(dǎo)致失敗,無論使用什么樣的高可用方案都是徒勞,因為數(shù)據(jù)發(fā)生了無法修正的錯誤)。此外XA事務(wù)()雖然保證了數(shù)據(jù)庫在分布式系統(tǒng)下的ACID(原子性,一致性,隔離性,持久性)特性,但也帶來了性能的代價,對于并發(fā)和響應(yīng)時間要求比較高的電商平臺來說,很難接受的。
eBay嘗試了另外一條完全不同的路,放寬了數(shù)據(jù)庫事務(wù)的ACID的要求,提出一套名為base的新準(zhǔn)則。base全稱是Basicallyavailablesoft-stateEventuallyConsistent系統(tǒng)基本可用軟狀態(tài)數(shù)據(jù)最終一致性,相對CAP來說,他大大的降低了我們對系統(tǒng)的要求。
Basicallyavailable(基本可用),在分布式系統(tǒng)出現(xiàn)不可預(yù)知的故障時,允許瞬時部分可用性
1.比如我們在淘寶上搜索商品,正常情況下是在0.5s內(nèi)返回查詢結(jié)果,但是由于后端的系統(tǒng)故障導(dǎo)致查詢響應(yīng)時間變成了2s
2.再比如數(shù)據(jù)庫采用分片模式,100W個用戶數(shù)據(jù)分在5個數(shù)據(jù)庫實例上,如果破壞了一個實例,那么可用性還有80%,也就是80%的用戶都可以登錄,系統(tǒng)仍然可用做技術(shù)人的指路明燈,做職場生涯的精神導(dǎo)師
3.電商大促時,為了應(yīng)對訪問量激增,部分用戶可能會被引導(dǎo)到降級頁面,服務(wù)層也可能只提供降級服務(wù)。這就是損失部分可用性的體現(xiàn)
soft-state(軟狀態(tài)).表示系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并且這個中間狀態(tài)的存在不會影響系統(tǒng)的整體可用性,也就是表示系統(tǒng)允許在不同節(jié)點的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步過程中存在延時;比如訂單狀態(tài),有一個待支付、支付中、支付成功、支付失敗,那么支付中就是一個中間狀態(tài),這個中間狀態(tài)在支付成功以后,在支付表中的狀態(tài)同步給訂單狀態(tài)之前,中間會存在一個時間內(nèi)的不一致。
Eventuallyconsistent(數(shù)據(jù)的最終一致性),表示的是所有數(shù)據(jù)副本在一段時間的同步后最終都能達(dá)到一個一直的狀態(tài),因此最終一致性的本質(zhì)是要保證數(shù)據(jù)最終達(dá)到一直,而不需要實時保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致
base理論的核心思想是:即使無法做到強(qiáng)一致性,但每個應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性
什么是分布式架構(gòu)下的高可用設(shè)計
1,避免單點故障
a。負(fù)載均衡技術(shù)(failover,選址,硬件負(fù)載,軟件負(fù)載,去中心化負(fù)載(gossip(redis-cluster))
b。熱備linuxHA
c。多機(jī)房(同城災(zāi)備,異地災(zāi)備)
2,應(yīng)用的高可用
a。故障監(jiān)控(系統(tǒng)監(jiān)控(cpu,內(nèi)存)、鏈路監(jiān)控、日志監(jiān)控)自動預(yù)警
b。應(yīng)用的容錯設(shè)計(服務(wù)降級,限流)自我保護(hù)能力
c。數(shù)據(jù)量(數(shù)據(jù)分片,讀寫分離)
分布式架構(gòu)下的可伸縮設(shè)計
垂直伸縮提升硬件能力
水平伸縮增加服務(wù)節(jié)點(服務(wù)器)
加速靜態(tài)內(nèi)容訪問速度的CDN
cdn是ContentDeliveryNetwork的縮寫,表示的事內(nèi)容的分發(fā)網(wǎng)絡(luò),CDN的作用是把用戶需要的內(nèi)容分發(fā)到離用戶最近的地方,這樣可以是用戶能夠快速獲取所需要的內(nèi)容。CDN其實就是一種網(wǎng)絡(luò)緩存技術(shù),能夠把一些相對穩(wěn)定的資源放到距離用戶最近的地方,一方面節(jié)省整個廣域網(wǎng)的帶寬消耗,另一方面可以提升用戶的訪問速度,改進(jìn)用戶的體驗,一般會把靜態(tài)資源文件(圖片,腳本,靜態(tài)頁面等)存放在CDN中
1.當(dāng)用戶訪問網(wǎng)站時,URL經(jīng)過本地DNS解析,DNS系統(tǒng)會最終將域名的解析權(quán)交割CNAME指向的CDN專用DNS服務(wù)器
2.CDN的DNS服務(wù)器將CDN的全局負(fù)載均衡設(shè)備ip地址放回用戶
3,用戶想CDN的全局負(fù)載均衡設(shè)備泛起內(nèi)容URL訪問請求
4,CDN全局負(fù)載均衡設(shè)備根據(jù)用戶IP地址,以及用戶請求的內(nèi)容URL選在一臺用戶所屬區(qū)域的區(qū)域負(fù)載均衡設(shè)備,告訴用戶向這臺設(shè)備發(fā)起請求
5.區(qū)域負(fù)載均衡設(shè)備為用戶選擇一臺合適的緩存服務(wù)器提供服務(wù),選擇的依據(jù)包括:根據(jù)IP地址,判斷一臺服務(wù)器距離用戶最近
根據(jù)用戶所請求的URL中攜帶的內(nèi)容名稱,判斷那一臺服務(wù)器上有用戶所需要的內(nèi)容,查詢各個服務(wù)器當(dāng)前的負(fù)載狀況,判斷那一臺服務(wù)器尚有服務(wù)能力,基于上述條件綜合分析之后,區(qū)域負(fù)載均衡設(shè)備會向全局負(fù)載均衡設(shè)備返回一臺緩存服務(wù)器的IP地址
6.全局負(fù)載均衡設(shè)備會把服務(wù)器的IP返回給用戶
用戶向緩存服務(wù)器發(fā)起請求,緩存服務(wù)器響應(yīng)用戶請求,將用戶所需內(nèi)容傳送到用戶終端,如果這臺緩存服務(wù)器上并沒有用戶想要的內(nèi)容,而區(qū)域均衡設(shè)備依然將他分配給用戶,那么這臺服務(wù)器就要向她的上一級緩存服務(wù)器請求內(nèi)容,直至追溯到網(wǎng)站的源服務(wù)器將內(nèi)容拉到本地。
什么情況下使用CDN
最適合那些不會經(jīng)常變化的內(nèi)容,比如圖片js文件css
以上就是北大青鳥長沙麓谷校區(qū)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java分布式系統(tǒng)框架教程,架構(gòu)設(shè)計”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
Java教程