行業(yè)資訊
要討論微服務(wù)、集群、分布式,需要先講講“單機(jī)架構(gòu)”,單機(jī)架構(gòu)很常見,比如有一個(gè)很小的系統(tǒng),不用處理很多東西,只需要一臺服務(wù)器,在上面搭建出自己需要的服務(wù),就可以開始工作。這種架構(gòu)優(yōu)點(diǎn)顯而易見,方便維護(hù),出了問題解決起來很方便。缺點(diǎn)也很明顯,如果處理變多,資源也就不夠用了。
單機(jī)架構(gòu)無法滿足要求,集群架構(gòu)就可以提供更好更快的處理,簡單來說,集群架構(gòu)就是把單機(jī)架構(gòu)上面運(yùn)行的服務(wù),摘出來,然后復(fù)制,在多個(gè)服務(wù)器上面進(jìn)行部署,這樣可以提高工作效率。在集群中,每個(gè)服務(wù)器都稱為節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)提供不同的服務(wù),比如Database、Web、日志工具。
國外服務(wù)器免費(fèi)測試:http://www.mogaix.com/
一、什么是微服務(wù)架構(gòu)?
它是Martin Fowler在2014年首次提出的一個(gè)概念,「微服務(wù)是一種架構(gòu)風(fēng)格,可以說是一種處理問題的思想,通過這種思想可以將原來一個(gè)復(fù)雜的系統(tǒng)拆分成多個(gè)子系統(tǒng),多個(gè)子系統(tǒng)之間是相互獨(dú)立的」,有自己獨(dú)立的進(jìn)程,可以單獨(dú)部署,每個(gè)子系統(tǒng)(微服務(wù))都只關(guān)注實(shí)現(xiàn)自己的業(yè)務(wù)功能,這樣子就解決了原來所有業(yè)務(wù)都存放在一個(gè)系統(tǒng)上,讓系統(tǒng)顯得很臃腫,并且難以抽離的問題。
下面開始介紹所謂的微服務(wù)。 微服務(wù)就是將一個(gè)完整的系統(tǒng),按照業(yè)務(wù)功能,拆分成一個(gè)個(gè)獨(dú)立的子系統(tǒng),在微服務(wù)結(jié)構(gòu)中,每個(gè)子系統(tǒng)就被稱為“服務(wù)”。這些子系統(tǒng)能夠獨(dú)立運(yùn)行在web容器中,它們之間通過RPC方式通信。
1、RPC通信是什么?
這里制作一個(gè)簡單介紹,想具體了解RPC的,請自行Google。RPC(Remote Procedure Call Procotol)遠(yuǎn)程過程調(diào)用協(xié)議,通俗的解釋就是:客戶端在不知道調(diào)用細(xì)節(jié)的情況下,調(diào)用存在于遠(yuǎn)程計(jì)算機(jī)上的某個(gè)對象,就像調(diào)用本地應(yīng)用程序中的對象一樣。阿里巴巴的Dubbo框架,就是運(yùn)用RPC協(xié)議比較好的框架
舉個(gè)例子,假設(shè)需要開發(fā)一個(gè)在線商城。按照微服務(wù)的思想,我們需要按照功能模塊拆分成多個(gè)獨(dú)立的服務(wù),如:用戶服務(wù)、產(chǎn)品服務(wù)、訂單服務(wù)、后臺管理服務(wù)、數(shù)據(jù)分析服務(wù)等等。這一個(gè)個(gè)服務(wù)都是一個(gè)個(gè)獨(dú)立的項(xiàng)目,可以獨(dú)立運(yùn)行。如果服務(wù)之間有依賴關(guān)系,那么通過RPC方式調(diào)用。
這樣的好處有很多:系統(tǒng)之間的耦合度大大降低,可以獨(dú)立開發(fā)、獨(dú)立部署、獨(dú)立測試,系統(tǒng)與系統(tǒng)之間的邊界非常明確,排錯(cuò)也變得容易,開發(fā)效率大大提升。
系統(tǒng)之間的耦合度降低,從而系統(tǒng)更易于擴(kuò)展。我們可以針對性地?cái)U(kuò)展某些服務(wù)。假設(shè)這個(gè)商城要搞一次大促,下單量可能會(huì)大大提升,因此我們可以針對性地提升訂單系統(tǒng)、產(chǎn)品系統(tǒng)的節(jié)點(diǎn)數(shù)量,而對于后臺管理系統(tǒng)、數(shù)據(jù)分析系統(tǒng)而言,節(jié)點(diǎn)數(shù)量維持原有水平即可。
服務(wù)的復(fù)用性更高。比如,當(dāng)我們將用戶系統(tǒng)作為單獨(dú)的服務(wù)后,該公司所有的產(chǎn)品都可以使用該系統(tǒng)作為用戶系統(tǒng),無需重復(fù)開發(fā)。
那么問題來了,當(dāng)采用微服務(wù)結(jié)構(gòu)后,一個(gè)完整的系統(tǒng)可能有很多獨(dú)立的子系統(tǒng)組成,當(dāng)業(yè)務(wù)量漸漸發(fā)展起來之后,而這些子系統(tǒng)之間的關(guān)系將錯(cuò)綜復(fù)雜,而且為了能夠針對性地增加某些服務(wù)的處理能力,某些服務(wù)的背后可能是一個(gè)集群模式,由多個(gè)節(jié)點(diǎn)構(gòu)成,這無疑大大增加了運(yùn)維的難度。微服務(wù)的想法好是好,但開發(fā)、運(yùn)維的復(fù)雜度實(shí)在是太高。為了解決這些問題,阿里巴巴的Dubbo就橫空出世了。
2、Dubbo,Dubbo是一套微服務(wù)系統(tǒng)的協(xié)調(diào)者,在它這套體系中,一共有三種角色,分別是:服務(wù)提供者(下面簡稱提供者)、服務(wù)消費(fèi)者(下面簡稱消費(fèi)者)、注冊中心。
你在使用的時(shí)候需要將Dubbo的jar包引入到你的項(xiàng)目中,也就是每個(gè)服務(wù)都要引入Dubbo的jar包。然后當(dāng)這些服務(wù)初始化的時(shí)候,Dubbo就會(huì)將當(dāng)前系統(tǒng)需要發(fā)布的服務(wù)、以及當(dāng)前系統(tǒng)的IP和端口號發(fā)送給注冊中心,注冊中心便會(huì)將其記錄下來。這就是服務(wù)發(fā)布的過程。與此同時(shí),也是在系統(tǒng)初始化的時(shí)候,Dubbo還會(huì)掃描一下當(dāng)前系統(tǒng)所需要引用的服務(wù),然后向注冊中心請求這些服務(wù)所在的IP和端口號。接下來系統(tǒng)就可以正常運(yùn)行了。當(dāng)系統(tǒng)A需要調(diào)用系統(tǒng)B的服務(wù)的時(shí)候,A就會(huì)與B建立起一條RPC信道,然后再調(diào)用B系統(tǒng)上相應(yīng)的服務(wù)。這,就是Dubbo的作用。
3、具體部署
當(dāng)我們使用了微服務(wù)架構(gòu)后,我們將一個(gè)原本完整的系統(tǒng),按照業(yè)務(wù)邏輯拆分成一個(gè)個(gè)可獨(dú)立運(yùn)行的子系統(tǒng)。為了降低系統(tǒng)間的耦合度,我們希望這些子系統(tǒng)能夠運(yùn)行在獨(dú)立的環(huán)境中,這些環(huán)境之間能夠相互隔離。
在Docker出現(xiàn)之前,若使用虛擬機(jī)來實(shí)現(xiàn)運(yùn)行環(huán)境的相互隔離的話成本較高,虛擬機(jī)會(huì)消耗較多的計(jì)算機(jī)硬件/軟件資源。Docker不僅能夠?qū)崿F(xiàn)運(yùn)行環(huán)境的隔離,而且能極大程度的節(jié)約計(jì)算機(jī)資源,它成為一種輕量級的“虛擬機(jī)”。
docker具體是什么或者怎么用,這里就不講解了,自行搜索吧。
當(dāng)我們使用微服務(wù)架構(gòu)后,隨著業(yè)務(wù)的逐漸發(fā)展,系統(tǒng)之間的依賴關(guān)系會(huì)日益復(fù)雜,而且各個(gè)模塊的構(gòu)建順序都有所講究。對于一個(gè)小型系統(tǒng)來說,也許只有幾個(gè)模塊,那么你每次采用人肉構(gòu)建的方式也許并不感覺麻煩。但隨著系統(tǒng)業(yè)務(wù)的發(fā)展,你的系統(tǒng)之間的依賴關(guān)系日益復(fù)雜,子系統(tǒng)也逐漸增多,每次構(gòu)建一下你都要非常小心謹(jǐn)慎,稍有不慎整個(gè)服務(wù)都無法正常啟動(dòng)。而且這些構(gòu)建的工作很low,但卻需要消耗大量的精力,這無疑降低了開發(fā)的效率。不過沒關(guān)系,Jenkins就是來幫助你解決這個(gè)問題的。
我們只需在Jenkins中配置好代碼倉庫、各個(gè)模塊的構(gòu)建順序和構(gòu)建命令,在以后的構(gòu)建中,只需要點(diǎn)擊“立即構(gòu)建”按鈕,Jenkins就會(huì)自動(dòng)到你的代碼倉庫中拉取最新的代碼,然后根據(jù)你事先配置的構(gòu)建命令進(jìn)行構(gòu)建,最后發(fā)布到指定的容器中運(yùn)行。你也可以讓Jenkins定時(shí)檢查代碼倉庫版本的變化,一旦發(fā)現(xiàn)變動(dòng)就自動(dòng)地開始構(gòu)建過程,并且讓Jenkins在構(gòu)建成功后給你發(fā)一封郵件。這樣你連“立即構(gòu)建”的按鈕也不需要按,就能全自動(dòng)地完成這一切構(gòu)建過程。
二、什么是集群架構(gòu)?
集群搭建出來后,有這樣一個(gè)角色,負(fù)責(zé)調(diào)度客戶端來的請求究竟要到哪一臺服務(wù)器上去,然后在進(jìn)行接下來的工作流,這個(gè)角色叫做——“負(fù)載均衡器”
集群也分為高可用集群,負(fù)載均衡集群(可能高并發(fā)架構(gòu)就是負(fù)載均衡架構(gòu)的升級版)。
高可用集群工具常見的有:heartbeat,pacemaker,keepalived
負(fù)載均衡器工具常見的有:nginx,lvs,HAproxy
集群架構(gòu)優(yōu)點(diǎn):可擴(kuò)展性,服務(wù)器資源不夠用,就可以加一臺繼續(xù)進(jìn)行工作
缺點(diǎn):維護(hù)起來困難,trouble shoot的時(shí)候需要花費(fèi)時(shí)間較多
三、微服務(wù)、集群、分布式三者的關(guān)系和區(qū)別:
1.微服務(wù)是將一個(gè)復(fù)雜系統(tǒng)根據(jù)業(yè)務(wù)或者其他方式拆分成具有不同功能的子系統(tǒng)的思想或者說架構(gòu)風(fēng)格,可以說是實(shí)現(xiàn)集群或者分布式的前提,畢竟,沒有系統(tǒng)的話集群和分布式也就沒有作用的對象了。
2.集群則是將按照微服務(wù)架構(gòu)風(fēng)格拆分出來的同一個(gè)業(yè)務(wù)系統(tǒng)部署到不同的服務(wù)器上,這樣一個(gè)系統(tǒng)就存在多份,保障了系統(tǒng)的高可用性。
3.分布式則是按照微服務(wù)架構(gòu)風(fēng)格拆分出來的不同業(yè)務(wù)的系統(tǒng)系統(tǒng)部署到不同的服務(wù)器上,可以對分布式上的每一個(gè)節(jié)點(diǎn)進(jìn)行集群設(shè)置,實(shí)現(xiàn)高可用,它是一種工作的方式。
4.簡單說,分布式是以縮短單個(gè)任務(wù)的執(zhí)行時(shí)間來提升效率的,如一個(gè)任務(wù)由5個(gè)小任務(wù)組成,處理完一個(gè)任務(wù)需要1個(gè)小時(shí),那么使用一臺服務(wù)器的話則需要五個(gè)小時(shí),如果使用五臺服務(wù)器則只需要一個(gè)小時(shí),這種也是Hadpood中的一種Map/Reduce 分布式計(jì)算模型的工作模式。