這次說個在大型項目比較常見的東西,就是分布式,分布式到底是個什么東西呢?概念太大,不好說,就像剛學javaee的人問你,什么是web啊,什么是spring啊等等,你可能覺得,這個東西我好像知道,但是用口頭語言就是不好描述,這很正常!
其實,用一兩次就知道了,然后你再慢慢看那些大神的原理和文字描述。
1.簡要說說分布式
在這里,我就大白話大概說一說分布式是個什么鬼,也不知道對不對,詳細的可以多在博客園查查相關的內容。
分布式,看名字就知道應該是要把什么東西分開布置,對於我們新手來說,那就是把所謂的web應用分開,那為什么要分開呢?寫在一起部署在一台服務器多好啊,容易開發,又好維護。。。
這其實也是早期的一種方式,所有的都布置在一台服務器上。但是時代在進步,現在人手一個手機甚至多個手機,還有電腦,平板什么的,都去訪問一個網站,這么高的訪問量、高並發量很容易一下子就把一台服務器卡爆了,然后很多數據就會丟失,用戶體驗很差,最后造成用戶流失,各種問題。就像淘寶,百度等這種,你很難想象如果是一台服務器,那這台服務器那要多牛才能滿足幾千萬甚至上億的訪問量。
現在擺在明面上的修改方案有兩個:
1.我很有錢,我去買一個非常牛的服務器或者話很多錢把原來的服務器升級,性能是原來的菜雞服務器的兩三倍甚至更高(這種方式也叫做縱向擴展)。
2.只有一點錢,再買一個菜雞服務器2號,想辦法把原來的那個web應用的一部分布置到這個菜雞服務器2號上,然后再想個辦法使得一些請求到原來的服務器上之后,實際上就會調用菜雞服務器2號上的一些功能。(這也叫做橫向擴展)
兩種方式雖然各有優缺點:第一種方案最大的缺點是要花很多很多錢,有的時候,將性能提升一倍,花的錢都夠再買幾台這樣的服務器了!最重要的是,這種方案是有天花板的、有瓶頸的,你還真能一直升級服務器性能么;優點就不多說,就用起來很方便,方便維護管理,開發也比較容易。
方案二的缺點是開發的難度就提升了很多,而且類似淘寶這種超大型項目,可不是一兩台服務器,可能是十幾台甚至幾十台服務器的相互配合,維護起來也是各種困難,而且還有可能服務器之間還要相互依賴,就更為復雜了。優點卻是更明顯,就是性能提升無上限,你只要有這個技術水平,可以買幾百台菜雞服務器組合成分布式系統,那個性能可比最頂級的服務器高了不知道多少。
所以我們現在的問題就是怎么樣使得兩台服務器可以相互調用,舉個例子:我在一個服務器寫個controller,另外一個服務器寫個service,現在就用這個controller調用service中的方法;只要這個可以成功調用,那最基本的分布式原理就懂了一點點了。
這里先理清楚一個邏輯:controller是使用別人方法的一方,而service是提供方法的一方;於是我們就稱controller為服務的消費者,service成為服務的提供者。
ok,分布式系統的大概原理到這里結束,更專業的解釋去看看那些大牛的博客吧!
2.什么是Zookeeper+Dubbo組合
先說Zookeeper,上文說過服務提供者和服務消費者的概念,但是你要知道服務提供者可不止那一個,而是很多很多的,假如有幾百個,一部分在這台服務器,一部分在另外一台服務器里,還有一些在其他服務器里,這個時候問題來了,服務消費者要消費服務,怎么判斷在哪個服務器里,你總不可能自己手動的一個一個去找吧?那就太坑爹了。
於是就有了一個Zookeeper的存在,這個單詞的百度翻譯是"動物園管理員",還真的有點形象,其實就是管理所有服務的管理員,只要服務提供者將自己的服務注冊到Zookeeper里,服務消費者訂閱了自己需要的服務;Zookeeper就能把詳細的服務列表推送給服務消費者, 而且一旦服務提供者發生變化,那么Zookeeper就會自動更新自己的服務列表,並且將最新的服務列表推送給服務消費者。
有點類似於那個啥婚介所,假如一個帥哥要找女朋友,帥哥就是服務消費者,要找的女朋友就是服務提供者,而婚介所不就是Zookeeper嘛,婚介所時刻更新妹紙的最新消息,一旦有什么最新情況,肯定就會把最新情況告訴帥哥啊!哈哈哈,稍提一下
那么Dubbo又是什么呢?剛剛說到Zookeeper把最新服務列表給了服務消費者,但是服務消費者也是只看眼巴巴的看着這么多的服務,卻用不了(就像去酒店點菜,看着那個菜單你能把菜單給吃了嗎?),需要Dubbo里面的功能才能實現遠程調用,也就是用RPC遠程過程調用協議才能夠調用遠處的服務器里的服務。
在這里稍提一下,Dubbo是一個開源分布式框架,它的功能可以簡單的看作將服務提供者注冊進Zookeeper中,指定Zookeeper所在的ip地址,讓服務訂閱者訂閱Zookeeper中的服務,還能夠讓服務消費者遠程調用服務,以及監控等等。。。用中學語文來描述,應該叫做貫穿全文,哈哈!
下面這個圖可以大概看一看流程:

3.下載並啟動Zookeeper
Zookeeper的詳細知識就不在這里介紹了,博客園里搜一下有很多,可以自己慢慢學習,這里只是用一下。
Zookeeper安裝方式有三種:單機模式(就一個Zookeeper),偽集群模式(一台電腦下載多個Zookeeper),集群模式(多台電腦每台都下載Zookeeper)
我們就用單機模式直觀一點:
下載地址:http://mirror.bit.edu.cn/apache/zookeeper/,我下載的是3.4.13版本,速度很快,很快就下好了,解壓,於是可以看到下面這樣的文件夾

在這里,我們需要配置一些東西,首先明確一點,這個Zookeeper是用java寫的,所以需要jdk環境,最好是jdk8,jdk7也行,再低就可能出現版本問題了。
而且我們需要對zookeeper進行一些小的修改;添加創建兩個文件夾data、logs,用來存放數據和日志,並且在配置文件里配置一下這兩個文件夾路徑(這里有個坑,這個配置文件的名字要修改,不改居然會報錯),接下來演示一下:


打開改名后的配置文件

基本的配置結束,現在我們要啟動它,我們怎么簡單怎么來,不配置環境變量(想配置的可惜自己配置環境變量),然后進入bin文件夾


看到下面這內容監聽2181端口,在等待客戶端連接,就成功了(注意:這個窗口不要關了)

我們可以用客戶端連接試試,再在bin目錄下打開命令窗口執行下面所示命令。(其實可以直接在bin目錄里雙擊ZkCli.cmd更簡單)

可以看到下圖所示,隨便輸入個字母h,能看到Zookeeper的很多命令,連接成功。具體的命令的使用可以自己去學習,這里就不多說了。

4.搭建基本環境
弄清楚Zookeeper和Dubbo之間的關系之后,就來簡單用一下,咳,由於沒有兩台電腦,也木有裝虛擬機(本來搞了一個virtualbox虛擬機的,貌似是我電腦配置太低了,虛擬機網速太慢了,卸載了。。。)
我就簡單的用idea開兩個應用吧!這里有兩種方式:
第一種:類似Eclipse那種多項目查看的方式,你只需要在idea中設置File------->Setting-------->Appearance & behavior------->System Settings ,但是這種很不好用,就是每查看一個項目都要切換一下整個頁面,不怎么直觀。

第二種:用多模塊的方式(idea推薦用多模塊的方式),我用的就是多模塊的方式。
注意:會用多模塊的小伙伴可以直接跳一下,其實就是新建一個空項目,在空項目里新建兩個只導入web模塊的springboot應用(一個叫做provider,一個叫做consumer,都是1.5.xx版本)。
首先新建空項目,點擊next取個名字,就會提示你要新建模塊


然后就是新建一個springboot應用,后面的就和原來的一樣(記住只需要web模塊+1.5.xx版本),啪啪啪,我就當你新建成功了一個provider模塊

繼續新建第二個模塊consumer

一頓簡單操作,最后的目錄結構就是I這樣

下一節就簡單使用一下分布式系統的調用。。。
