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