如何實現遠程通信?
1.WebService:效率不高,基於soap協議。在項目中不推薦使用。
2.使用restful形式的服務:http+json。很多項目中應用。但是有個缺點是,如果服務太多,服務之間的調用關係就非常混亂,需要治療服務。
3.使用dubbo。使用rpc協議進行遠程調用,直接使用socket通信。傳輸效率高,並且可以統計出系統之間的調用關係、調用次數。但是dubbo也有個比較大的缺點,那就是使用它的工程必須都是用java開發的才行,如果一個用的java,另一個用的PHP,就無法使用dubbo。
那麼,什麼是dubbo?
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。Dubbo架構發展路線圖如下。
從上圖可以看到,發展經歷了四個階段:
第一階段:單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。其中1~10的意思是,當一個tomcat服務無法滿足要求時,我們可以增加部署tomcat的數量並用反向代理來做負載均衡。由於不同的tomcat之間session要共享,方法就是要定時向其它節點進行廣播,其它tomcat發現發現與之不同時便會進行同步,當節點數量較多時,廣播將會佔用大部分帶寬,以至於真正的通信所用的帶寬嚴重不足。因此該架構只能用於節點數小於10的情況。
第二階段:垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。舉個例子,比如把一個大的項目拆分成訂單系統、會員系統、前臺系統、後臺系統、搜索系統,每個系統自成一家,服務層和web層都在一起,哪個系統壓力大,就給那個系統增加節點以提升性能。此時用於加速前端開發的Web框架(MVC)是關鍵。
第三階段:分佈式服務架構
當垂直應用越來越多,應用之間交互不可避免,這時代碼將非常臃腫(因爲同一套代碼邏輯可能會被寫多遍)。這時將核心業務抽離出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能夠更快速的響應市場需求。此時用於提高業務複用及整合的分佈式服務框架(RPC)是關鍵。
第四階段:流動計算架構
當服務越來越多,容量的評估、小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集羣容量,提高集羣利用率。此時用於提高機器利用率的資源調度和治理中心(SOA)是關鍵。
下面我們來看下Dobbo的架構,第0步是服務提供者的發佈,provider的發佈需要用到容器,我們的spring便是專門用來做容器的,因此服務提供者的發佈需要用到spring。
第1步是進行註冊,就是說服務提供者在發佈之後,要在dubbo的註冊管理中心進行註冊,扮演Registry(註冊中心的最好是zookeeper,其次可以選擇redis),這樣註冊中心便知道有哪些服務可供消費者使用了。第2步是消費者要調用服務,但是它是不知道有哪些服務可供調用的,因此它需要先到註冊中心進行詢問,查詢一下是否有自己想要調用的服務,註冊中心查找之後發現有匹配的服務可供調用,便會向消費者返回可供調用的服務的IP和端口號。消費者拿到IP和端口號之後,便不再需要經過註冊中心,直接就可以訪問服務了(這就是第4步),第5步是指dobbo想要監測都是哪些消費者調用了哪些服務,調用了多少次,這樣便於管理。
上圖的節點角色說明:
Provider:暴露服務的服務提供方。
Consumer:調用遠程服務的服務消費方。
Registry:服務註冊與發現的註冊中心。
Monitor:統計服務的調用次數和調用時間的監控中心。
Container:服務運行容器。
調用關係說明:
0.服務容器負責啓動、加載,運行服務提供者。
1.服務提供者在啓動時,向註冊中心註冊自己提供的服務。
2.服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
3.註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
4.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
5.服務消費者和服務提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
Zookeeper單機版安裝
下面我們來說下zookeeper如何安裝,在實際開發中,zookeeper都是運行在linux系統上的,因此,我們也把zookeeper安裝到linux系統上,由於我們的電腦系統是windows系統,因此要想有linux環境就需要安裝虛擬機,然後在虛擬機中進行安裝。這裏我們使用的是CentOS6虛擬機,而且是最小化安裝的CentOS,關於如何最小化安裝CentOS,大家可以參考http://blog.csdn.net/u012453843/article/details/68947589這篇博客進行學習。安裝完CentOS之後我們需要配置下靜態IP而且要保證能上網,大家可以參考:http://blog.csdn.net/u012453843/article/details/52839105這篇博客進行學習。配置完之後,我們還需要zookeeper安裝包,大家可以到http://download.csdn.net/detail/u012453843/9793647這個地址進行下載。
做好準備條件後,我們需要使用連接工具來訪問虛擬機,我使用的是XShell,關於XShell操作服務器大家可以參考:http://blog.csdn.net/u012453843/article/details/54293774這篇博客進行學習。由於最小化安裝的CentOS沒有rz和sz命令,因此我們需要先安裝rz和sz命令,安裝命令是yum install lrzsz。
- [root@zookeeper1 ~]# yum install lrzsz
最小化安裝的虛擬機是沒有vim命令的,我們需要安裝一下
- [root@zookeeper1 ~]# yum install vim-enhanced
下面我們我們在/usr/local目錄下新建一個software目錄,專門用於存放各種安裝包(這是我個人習慣)
- [root@zookeeper1 ~]# mkdir /usr/local/software
由於zookeeper的安裝需要JDK的支持,因此需要先安裝JDK,大家可以參考http://blog.csdn.net/u012453843/article/details/52422736這篇博客進行學習。
安裝完JDK後,我們使用"rz"命令來上傳zookeeper安裝包到/usr/local/software目錄下
- [root@zookeeper1 software]# rz
- [root@zookeeper1 software]# ll
- 總用量 16020
- -rw-r--r--. 1 root root 16402010 10月 15 2016 zookeeper-3.4.5.tar.gz
- [root@zookeeper1 software]#
下面我們解壓開發包,將安裝包解壓到/usr/local目錄下(這是我的個人習慣),我們使用的命令是:tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/,如下所示。
- [root@zookeeper1 software]# tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/
我們進入到zookeeper-3.4.5文件夾,如下所示。
- [root@zookeeper1 software]# cd /usr/local/zookeeper-3.4.5/
- [root@zookeeper1 zookeeper-3.4.5]# ll
- 總用量 1512
- drwxr-xr-x. 2 501 games 4096 4月 25 07:34 bin
- -rw-r--r--. 1 501 games 75988 10月 1 2012 build.xml
- -rw-r--r--. 1 501 games 70223 10月 1 2012 CHANGES.txt
- drwxr-xr-x. 2 501 games 4096 4月 25 07:34 conf
- drwxr-xr-x. 10 501 games 4096 4月 25 07:34 contrib
- drwxr-xr-x. 2 501 games 4096 4月 25 07:34 dist-maven
- drwxr-xr-x. 6 501 games 4096 4月 25 07:34 docs
- -rw-r--r--. 1 501 games 1953 10月 1 2012 ivysettings.xml
- -rw-r--r--. 1 501 games 3120 10月 1 2012 ivy.xml
- drwxr-xr-x. 4 501 games 4096 4月 25 07:34 lib
- -rw-r--r--. 1 501 games 11358 10月 1 2012 LICENSE.txt
- -rw-r--r--. 1 501 games 170 10月 1 2012 NOTICE.txt
- -rw-r--r--. 1 501 games 1770 10月 1 2012 README_packaging.txt
- -rw-r--r--. 1 501 games 1585 10月 1 2012 README.txt
- drwxr-xr-x. 5 501 games 4096 4月 25 07:34 recipes
- drwxr-xr-x. 8 501 games 4096 4月 25 07:34 src
- -rw-r--r--. 1 501 games 1315806 11月 5 2012 zookeeper-3.4.5.jar
- -rw-r--r--. 1 501 games 833 11月 5 2012 zookeeper-3.4.5.jar.asc
- -rw-r--r--. 1 501 games 33 11月 5 2012 zookeeper-3.4.5.jar.md5
- -rw-r--r--. 1 501 games 41 11月 5 2012 zookeeper-3.4.5.jar.sha1
- [root@zookeeper1 zookeeper-3.4.5]#
我們在zookeeper-3.4.5目錄下新建一個data目錄,如下圖所示。
- [root@zookeeper1 zookeeper-3.4.5]# mkdir data
- [root@zookeeper1 zookeeper-3.4.5]# ll
- 總用量 1516
- drwxr-xr-x. 2 501 games 4096 4月 25 07:34 bin
- -rw-r--r--. 1 501 games 75988 10月 1 2012 build.xml
- -rw-r--r--. 1 501 games 70223 10月 1 2012 CHANGES.txt
- drwxr-xr-x. 2 501 games 4096 4月 25 07:34 conf
- drwxr-xr-x. 10 501 games 4096 4月 25 07:34 contrib
- drwxr-xr-x. 2 root root 4096 4月 25 07:35 data
- drwxr-xr-x. 2 501 games 4096 4月 25 07:34 dist-maven
- drwxr-xr-x. 6 501 games 4096 4月 25 07:34 docs
- -rw-r--r--. 1 501 games 1953 10月 1 2012 ivysettings.xml
- -rw-r--r--. 1 501 games 3120 10月 1 2012 ivy.xml
- drwxr-xr-x. 4 501 games 4096 4月 25 07:34 lib
- -rw-r--r--. 1 501 games 11358 10月 1 2012 LICENSE.txt
- -rw-r--r--. 1 501 games 170 10月 1 2012 NOTICE.txt
- -rw-r--r--. 1 501 games 1770 10月 1 2012 README_packaging.txt
- -rw-r--r--. 1 501 games 1585 10月 1 2012 README.txt
- drwxr-xr-x. 5 501 games 4096 4月 25 07:34 recipes
- drwxr-xr-x. 8 501 games 4096 4月 25 07:34 src
- -rw-r--r--. 1 501 games 1315806 11月 5 2012 zookeeper-3.4.5.jar
- -rw-r--r--. 1 501 games 833 11月 5 2012 zookeeper-3.4.5.jar.asc
- -rw-r--r--. 1 501 games 33 11月 5 2012 zookeeper-3.4.5.jar.md5
- -rw-r--r--. 1 501 games 41 11月 5 2012 zookeeper-3.4.5.jar.sha1
- [root@zookeeper1 zookeeper-3.4.5]#
- [root@zookeeper1 zookeeper-3.4.5]# cd conf
- [root@zookeeper1 conf]# ll
- 總用量 12
- -rw-r--r--. 1 501 games 535 10月 1 2012 configuration.xsl
- -rw-r--r--. 1 501 games 2161 10月 1 2012 log4j.properties
- -rw-r--r--. 1 501 games 808 10月 1 2012 zoo_sample.cfg
- [root@zookeeper1 conf]#
我們需要將zoo_sample.cfg文件改下名字,如下圖所示。
- [root@zookeeper1 conf]# mv zoo_sample.cfg zoo.cfg
- [root@zookeeper1 conf]# ll
- 總用量 12
- -rw-r--r--. 1 501 games 535 10月 1 2012 configuration.xsl
- -rw-r--r--. 1 501 games 2161 10月 1 2012 log4j.properties
- -rw-r--r--. 1 501 games 808 10月 1 2012 zoo.cfg
- [root@zookeeper1 conf]#
下面我們來修改zoo.cfg文件,我們使用的命令是vi zoo.cfg,在打開的文件中修改"dataDir"的路徑爲我們上面創建的data的絕對路徑。如下所示。
- [root@zookeeper1 conf]# vi zoo.cfg
- # The number of milliseconds of each tick
- tickTime=2000
- # The number of ticks that the initial
- # synchronization phase can take
- initLimit=10
- # The number of ticks that can pass between
- # sending a request and getting an acknowledgement
- syncLimit=5
- # the directory where the snapshot is stored.
- # do not use /tmp for storage, /tmp here is just
- # example sakes.
- dataDir=/usr/local/zookeeper-3.4.5/data
- # the port at which the clients will connect
- clientPort=2181
修改完zoo.cfg之後,按ESC退出編輯模式,然後按Shift+ZZ來保存並退出zoo.cfg,這樣我們便配置好了。接下來我們便啓動zookepper,我們進入到bin目錄下,使用命令./zkServer.sh start來啓動zookeeper,啓動完之後,我們可以使用./zkServer.sh status來查看啓動狀態,如下圖所示。
- [root@zookeeper1 zookeeper-3.4.5]# cd bin
- [root@zookeeper1 bin]# ls
- README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh
- [root@zookeeper1 bin]# ./zkServer.sh start
- JMX enabled by default
- Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
- Starting zookeeper ... STARTED
- [root@zookeeper1 bin]# ./zkServer.sh status
- JMX enabled by default
- Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
- Mode: standalone
- [root@zookeeper1 bin]#
如果想關閉zookeeper可以使用命令./zkServer.sh stop來關閉,這裏就不演示了。啓動完zookeeper,我們便有註冊中心了。
注:如果出現端口無法訪問的情況,請關閉防火牆,並且設置開機也不啓動
- [root@zookeeper1 bin]# service iptables stop
- [root@zookeeper1 bin]# chkconfig iptables off