聯(lián)網(wǎng)的發(fā)展,網(wǎng)站利用的范圍不斷擴(kuò)大,常規(guī)的垂直利用架構(gòu)已沒(méi)法應(yīng)對(duì),散布式服務(wù)架構(gòu)和活動(dòng)計(jì)算架構(gòu)勢(shì)在必行,Dubbo是1個(gè)散布式服務(wù)框架,在這類情況下誕生的。現(xiàn)在核心業(yè)務(wù)抽取出來(lái),作為獨(dú)立的服務(wù),使前端利用能更快速和穩(wěn)定的響應(yīng)。
第1:介紹Dubbo背景
大范圍服務(wù)化之前,利用可能只是通過(guò)RMI或Hessian等工具,簡(jiǎn)單的暴露和援用遠(yuǎn)程服務(wù),通過(guò)配置服務(wù)的URL地址進(jìn)行調(diào)用,通過(guò)F5等硬件進(jìn)行負(fù)載均衡。
(1) 當(dāng)服務(wù)愈來(lái)愈多時(shí),服務(wù)URL配置管理變得非常困難,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也愈來(lái)愈大。
此時(shí)需要1個(gè)服務(wù)注冊(cè)中心,動(dòng)態(tài)的注冊(cè)和發(fā)現(xiàn)服務(wù),使服務(wù)的位置透明。
并通過(guò)在消費(fèi)方獲得服務(wù)提供方地址列表,實(shí)現(xiàn)軟負(fù)載均衡和Failover,下降對(duì)F5硬件負(fù)載均衡器的依賴,也能減少部份本錢。
(2) 當(dāng)進(jìn)1步發(fā)展,服務(wù)間依賴關(guān)系變得錯(cuò)蹤復(fù)雜,乃至分不清哪一個(gè)利用要在哪一個(gè)利用之前啟動(dòng),架構(gòu)師都不能完全的描寫利用的架構(gòu)關(guān)系。
這時(shí)候,需要自動(dòng)畫出利用間的依賴關(guān)系圖,以幫助架構(gòu)師理清算關(guān)系。
(3) 接著,服務(wù)的調(diào)用量愈來(lái)愈大,服務(wù)的容量問(wèn)題就暴露出來(lái),這個(gè)服務(wù)需要多少機(jī)器支持?甚么時(shí)候該加機(jī)器?
為了解決這些問(wèn)題,第1步,要將服務(wù)現(xiàn)在每天的調(diào)用量,響應(yīng)時(shí)間,都統(tǒng)計(jì)出來(lái),作為容量計(jì)劃的參考指標(biāo)。
其次,要可以動(dòng)態(tài)調(diào)劑權(quán)重,在線上,將某臺(tái)機(jī)器的權(quán)重1直加大,并在加大的進(jìn)程中記錄響應(yīng)時(shí)間的變化,直到響應(yīng)時(shí)間到達(dá)閥值,記錄此時(shí)的訪問(wèn)量,再以此訪問(wèn)量乘以機(jī)器數(shù)反推總?cè)萘俊?/p>
第2:Dubbo的簡(jiǎn)介
Dubbo是1個(gè)散布式服務(wù)框架,解決了上面的所面對(duì)的問(wèn)題,Dubbo的架構(gòu)如圖所示:
節(jié)點(diǎn)角色說(shuō)明:
Provider: 暴露服務(wù)的服務(wù)提供方。
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心。
Container: 服務(wù)運(yùn)行容器。
調(diào)用關(guān)系說(shuō)明:
0. 服務(wù)容器負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。
1. 服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
2. 服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心定閱自己所需的服務(wù)。
3. 注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。
4. 服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選1臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另外一臺(tái)調(diào)用。
5. 服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送1次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心。
Dubbo提供了很多協(xié)議,Dubbo協(xié)議、RMI協(xié)議、Hessian協(xié)議,我們查看Dubbo源代碼,有各種協(xié)議的實(shí)現(xiàn),如圖所示:
我們之前沒(méi)用Dubbo之前時(shí),大部份都使用Hessian來(lái)使用我們服務(wù)的暴露和調(diào)用,利用HessianProxyFactory調(diào)用遠(yuǎn)程接口。
上面是參考了Dubbo官方網(wǎng)介紹,接下來(lái)我們來(lái)介紹SpringMVC、Dubbo、Zookeeper整合使用。
第3:Dubbo與Zookeeper、SpringMVC整合使用
第1步:在Linux上安裝Zookeeper
Zookeeper作為Dubbo服務(wù)的注冊(cè)中心,Dubbo本來(lái)基于數(shù)據(jù)庫(kù)的注冊(cè)中心,沒(méi)采取Zookeeper,Zookeeper1個(gè)散布式的服務(wù)框架,是樹(shù)型的目錄服務(wù)的數(shù)據(jù)存儲(chǔ),能做到集群管理數(shù)據(jù) ,這里能很好的作為Dubbo服務(wù)的注冊(cè)中心,Dubbo能與Zookeeper做到集群部署,當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時(shí),Zookeeper注冊(cè)中心能自動(dòng)刪除提供者信息,當(dāng)提供者重啟時(shí),能自動(dòng)恢復(fù)注冊(cè)數(shù)據(jù),和定閱要求。我們先在linux上安裝Zookeeper,我們安裝最簡(jiǎn)單的單點(diǎn),集群比較麻煩。
(1)下載Zookeeper⑶.4.6.tar.gz
(2) 我們放到Linux下的1個(gè)文件夾,然后解壓:
#tar zxvf zookeeper⑶.4.6.tar.gz
(3)然后在對(duì)應(yīng)的zookeeper⑶.4.6/conf 下有1個(gè)文件zoo_sample.cfg的這個(gè)文件里面配置了監(jiān)聽(tīng)客戶端連接的端口等1些信息,Zookeeper 在啟動(dòng)時(shí)會(huì)找zoo.cfg這個(gè)文件作為默許配置文件,所以我們復(fù)制1個(gè)名稱為zoo.cfg的文件,如圖所示:
我們查看1下這個(gè)文件的里面的1些配置信息,如圖所示:
獲得【下載地址】 最主流的Java后臺(tái) SSM 框架 springmvc spring mybatis 項(xiàng)目源碼
說(shuō)明:
clientPort:監(jiān)聽(tīng)客戶端連接的端口。
tickTime:基本事件單元,以毫秒為單位。它用來(lái)控制心跳和超時(shí),默許情況下最小的會(huì)話超時(shí)時(shí)間為兩倍的 tickTime。
我們可以對(duì)配置文件的端口等或進(jìn)行高級(jí)配置和集群配置例如:maxClientCnxns:限制連接到 ZooKeeper 的客戶真?zhèn)€數(shù)量等
(4)啟動(dòng)Zookeeper 的服務(wù),如圖所示:
到這邊Zookeeper的安裝和配置完成
第2步:配置dubbo-admin的管理頁(yè)面,方便我們管理頁(yè)面
(1)下載dubbo-admin⑵.4.1.war包,在Linux的tomcat部署,先把dubbo-admin⑵.4.1放在tomcat的webapps/ROOT下,然落后行解壓:
#jar -xvf dubbo-admin⑵.4.1.war
(2)然后到webapps/ROOT/WEB-INF下,有1個(gè)dubbo.properties文件,里面指向Zookeeper ,使用的是Zookeeper 的注冊(cè)中心,如圖所示:
(3)然后啟動(dòng)tomcat服務(wù),用戶名和密碼:root,并訪問(wèn)服務(wù),顯示登陸頁(yè)面,說(shuō)明dubbo-admin部署成功,如圖所示:
第3步:SpringMVC與Dubbo的整合,這邊使用的Maven的管理項(xiàng)目
第1:我們先開(kāi)發(fā)服務(wù)注冊(cè)的,就是提供服務(wù),項(xiàng)目結(jié)構(gòu)如圖所示:
(1)test-maven-api項(xiàng)目加入了1個(gè)服務(wù)接口,代碼以下:
(2)test-maven-console在pom.xml加入Dubbo和Zookeeper的jar包、援用test-maven-api的jar包,代碼以下:
(3)test-maven-console實(shí)現(xiàn)具體的服務(wù),代碼以下:
(4)我們服務(wù)和實(shí)現(xiàn)好了,這時(shí)候要暴露服務(wù),代碼以下:
說(shuō)明:
dubbo:registry 標(biāo)簽1些屬性的說(shuō)明:
1)register是不是向此注冊(cè)中心注冊(cè)服務(wù),如果設(shè)為false,將只定閱,不注冊(cè)。
2)check注冊(cè)中心不存在時(shí),是不是報(bào)錯(cuò)。
3)subscribe是不是向此注冊(cè)中心定閱服務(wù),如果設(shè)為false,將只注冊(cè),不定閱。
4)timeout注冊(cè)中心要求超時(shí)時(shí)間(毫秒)。
5)address可以Zookeeper集群配置,地址可以多個(gè)以逗號(hào)隔開(kāi)等。
dubbo:service標(biāo)簽的1些屬性說(shuō)明:
1)interface服務(wù)接口的路徑
2)ref援用對(duì)應(yīng)的實(shí)現(xiàn)類的Bean的ID
3)registry向指定注冊(cè)中心注冊(cè),在多個(gè)注冊(cè)中心時(shí)使用,值為<dubbo:registry>的id屬性,多個(gè)注冊(cè)中心ID用逗號(hào)分隔,如果不想將該服務(wù)注冊(cè)到任何registry,可將值設(shè)為N/A
4)register 默許true ,該協(xié)議的服務(wù)是不是注冊(cè)到注冊(cè)中心。
(5)啟動(dòng)項(xiàng)目,然后我們?cè)贒ubbo管理頁(yè)面上顯示,已暴露的服務(wù),但顯示還沒(méi)有消費(fèi)者,由于我們還沒(méi)實(shí)現(xiàn)消費(fèi)者服務(wù),如圖所示:
第2:我們?cè)陂_(kāi)發(fā)服務(wù)消費(fèi)者,就是調(diào)用服務(wù),我們?cè)谛陆?個(gè)新的消費(fèi)者項(xiàng)目結(jié)構(gòu)如圖所示:
(1)test-maven-server-console的pom.xml引入Dubbo和Zookeeper的jar包、test-maven-api的jar包,由于引入test-maven-api的jar包,我們?cè)陧?xiàng)目中調(diào)用像在本地調(diào)用1樣。代碼以下:
(2)test-maven-server-console項(xiàng)目的具體實(shí)現(xiàn),代碼以下: