不久前腕侄,我們討論過Nginx+tomcat組成的集群殊校,這已經(jīng)是非常靈活的集群技術(shù),但是當(dāng)我們的系統(tǒng)遇到更大的瓶頸晶默,全部應(yīng)用的單點(diǎn)服務(wù)器已經(jīng)不能滿足我們的需求谨娜,這時(shí),我們要考慮另外一種磺陡,我們熟悉的內(nèi)容趴梢,就是分布式,而當(dāng)下流行的Dubbo框架币他,不容我們忽視坞靶,這里,咱們一起來探討一下這個(gè)框架的使用蝴悉。
一彰阴,背景
以前我們需要遠(yuǎn)程調(diào)用他人的接口,我們是這么做的:
我們遇到的問題:
(1) 當(dāng)服務(wù)越來越多時(shí)拍冠,服務(wù)URL配置管理變得非常困難尿这,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也越來越大。
此時(shí)需要一個(gè)服務(wù)注冊中心庆杜,動(dòng)態(tài)的注冊和發(fā)現(xiàn)服務(wù)射众,使服務(wù)的位置透明。
并通過在消費(fèi)方獲取服務(wù)提供方地址列表晃财,實(shí)現(xiàn)軟負(fù)載均衡和Failover叨橱,降低對F5硬件負(fù)載均衡器的依賴,也能減少部分成本断盛。
(2) 當(dāng)進(jìn)一步發(fā)展罗洗,服務(wù)間依賴關(guān)系變得錯(cuò)蹤復(fù)雜,甚至分不清哪個(gè)應(yīng)用要在哪個(gè)應(yīng)用之前啟動(dòng)钢猛,架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系伙菜。
這時(shí),需要自動(dòng)畫出應(yīng)用間的依賴關(guān)系圖厢洞,以幫助架構(gòu)師理清理關(guān)系仇让。
(3) 接著,服務(wù)的調(diào)用量越來越大躺翻,服務(wù)的容量問題就暴露出來丧叽,這個(gè)服務(wù)需要多少機(jī)器支撐?什么時(shí)候該加機(jī)器公你?
為了解決這些問題踊淳,第一步,要將服務(wù)現(xiàn)在每天的調(diào)用量陕靠,響應(yīng)時(shí)間迂尝,都統(tǒng)計(jì)出來,作為容量規(guī)劃的參考指標(biāo)剪芥。
其次垄开,要可以動(dòng)態(tài)調(diào)整權(quán)重,在線上税肪,將某臺機(jī)器的權(quán)重一直加大溉躲,并在加大的過程中記錄響應(yīng)時(shí)間的變化,直到響應(yīng)時(shí)間到達(dá)閥值益兄,記錄此時(shí)的訪問量锻梳,再以此訪問量乘以機(jī)器數(shù)反推總?cè)萘俊?/p>
為解決這些問題,Dubbo為我們做了什么呢:
負(fù)載均衡:
這就是所謂的軟負(fù)載均衡净捅!
現(xiàn)在讓我們一起來接觸下這個(gè)優(yōu)秀的框架:
簡介
架構(gòu)如圖:
節(jié)點(diǎn)角色說明:
Provider:暴露服務(wù)的服務(wù)提供方疑枯。
Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心蛔六。
Monitor:統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心荆永。
Container:服務(wù)運(yùn)行容器。
調(diào)用關(guān)系說明:
0.服務(wù)容器負(fù)責(zé)啟動(dòng)国章,加載屁魏,運(yùn)行服務(wù)提供者。
1.服務(wù)提供者在啟動(dòng)時(shí)捉腥,向注冊中心注冊自己提供的服務(wù)氓拼。
2.服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊中心訂閱自己所需的服務(wù)抵碟。
3.注冊中心返回服務(wù)提供者地址列表給消費(fèi)者桃漾,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者拟逮。
4.服務(wù)消費(fèi)者撬统,從提供者地址列表中,基于軟負(fù)載均衡算法敦迄,選一臺提供者進(jìn)行調(diào)用恋追,如果調(diào)用失敗凭迹,再選另一臺調(diào)用。
5.服務(wù)消費(fèi)者和提供者苦囱,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間嗅绸,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心。
Dubbo提供了很多協(xié)議撕彤,Dubbo協(xié)議鱼鸠、RMI協(xié)議、Hessian協(xié)議羹铅,我們查看Dubbo源代碼蚀狰,有各種協(xié)議的實(shí)現(xiàn),如圖所示:
我們之前沒用Dubbo之前時(shí)职员,大部分都使用Hessian來使用我們服務(wù)的暴露和調(diào)用麻蹋,利用HessianProxyFactory調(diào)用遠(yuǎn)程接口。
上面是參考了Dubbo官方網(wǎng)介紹焊切,接下來我們來介紹SpringMVC哥蔚、Dubbo、Zookeeper整合使用蛛蒙。
第三:Dubbo與Zookeeper糙箍、SpringMVC整合使用
第一步:在Linux上安裝Zookeeper
Zookeeper作為Dubbo服務(wù)的注冊中心,Dubbo原先基于數(shù)據(jù)庫的注冊中心牵祟,沒采用Zookeeper深夯,Zookeeper一個(gè)分布式的服務(wù)框架,是樹型的目錄服務(wù)的數(shù)據(jù)存儲诺苹,能做到集群管理數(shù)據(jù)?咕晋,這里能很好的作為Dubbo服務(wù)的注冊中心,Dubbo能與Zookeeper做到集群部署收奔,當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時(shí)掌呜,Zookeeper注冊中心能自動(dòng)刪除提供者信息,當(dāng)提供者重啟時(shí)坪哄,能自動(dòng)恢復(fù)注冊數(shù)據(jù)质蕉,以及訂閱請求。我們先在linux上安裝Zookeeper翩肌,我們安裝最簡單的單點(diǎn)模暗,集群比較麻煩。
先需要安裝JdK念祭,從Oracle的Java網(wǎng)站下載兑宇,安裝很簡單,就不再詳述粱坤。
單機(jī)安裝非常簡單隶糕,只要獲取到 Zookeeper 的壓縮包并解壓到某個(gè)目錄如:C:\zookeeper-3.4.5\下瓷产,Zookeeper 的啟動(dòng)腳本在 bin 目錄下,Windows 下的啟動(dòng)腳本是 zkServer.cmd枚驻。
在你執(zhí)行啟動(dòng)腳本之前濒旦,還有幾個(gè)基本的配置項(xiàng)需要配置一下,Zookeeper 的配置文件在 conf 目錄下测秸,這個(gè)目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名為 zoo.cfg灾常,因?yàn)?Zookeeper 在啟動(dòng)時(shí)會找這個(gè)文件作為默認(rèn)配置文件霎冯。下面詳細(xì)介紹一下,這個(gè)配置文件中各個(gè)配置項(xiàng)的意義钞瀑。
需要了解源碼的朋友加我QQ:2137028325
框架簡介:
本系統(tǒng)一款通用的SOA中間件平臺沈撞,用來開發(fā)各類J2EE企業(yè)級應(yīng)用,節(jié)省時(shí)間和人力成本雕什。本系統(tǒng)采用MVC模式缠俺、AOP引擎、任務(wù)調(diào)度器贷岸、Ajax壹士、攔截器、過濾器偿警、緩存躏救、日志監(jiān)控、數(shù)據(jù)訪問螟蒸、表達(dá)式盒使、國際化等技術(shù)使碾。
框架/平臺構(gòu)成:
Maven+Springmvc + Mybatis + Shiro(權(quán)限)+ Tiles(模板) +ActiveMQ(消息隊(duì)列) + Rest(服務(wù)) + WebService(服務(wù))+ EHcache(緩存) + Quartz(定時(shí)調(diào)度)+ Html5(支持PC咖驮、IOS封豪、Android)
用戶權(quán)限系統(tǒng):
組織結(jié)構(gòu):角色徽惋、用戶隔躲、用戶組掉盅、組織機(jī)構(gòu)云头;權(quán)限點(diǎn):頁面酒请、方法绍赛、按鈕鞋拟、數(shù)據(jù)權(quán)限、分級授權(quán)
項(xiàng)目管理新體驗(yàn):
快速出原型系統(tǒng)惹资、組件樹贺纲、版本控制、模塊移植褪测、協(xié)同開發(fā)猴誊、實(shí)時(shí)監(jiān)控潦刃、發(fā)布管理
可持續(xù)集成:
所有組件可移植、可定制懈叹、可擴(kuò)充乖杠,開發(fā)成果不斷積累,形成可持續(xù)發(fā)展的良性循環(huán)
支持平臺平臺:
Windows XP澄成、Windows 7 胧洒、Windows 10 、 Linux 墨状、 Unix
服務(wù)器容器:
Tomcat 5/6/7 卫漫、Jetty、JBoss肾砂、WebSphere 8.5
需要了解源碼的朋友加我QQ:2137028325
[html]view plaincopy
#?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=C:\\zookeeper-3.4.5\\data
dataLogDir=C:\\zookeeper-3.4.5\\log
#?the?port?at?which?the?clients?will?connect
clientPort=2181
#
#?Be?sure?to?read?the?maintenance?section?of?the
#?administrator?guide?before?turning?on?autopurge.
#
#?http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
#?The?number?of?snapshots?to?retain?in?dataDir
#autopurge.snapRetainCount=3
#?Purge?task?interval?in?hours
#?Set?to?"0"?to?disable?auto?purge?feature
#autopurge.purgeInterval=1
tickTime:這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔列赎,也就是每個(gè) tickTime 時(shí)間就會發(fā)送一個(gè)心跳。
dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄镐确,默認(rèn)情況下包吝,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個(gè)目錄里。
dataLogDir:顧名思義就是 Zookeeper 保存日志文件的目錄
clientPort:這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口源葫,Zookeeper 會監(jiān)聽這個(gè)端口诗越,接受客戶端的訪問請求。
當(dāng)這些配置項(xiàng)配置好后息堂,你現(xiàn)在就可以啟動(dòng) Zookeeper 了掺喻,啟動(dòng)后要檢查 Zookeeper 是否已經(jīng)在服務(wù),可以通過 netstat – ano 命令查看是否有你配置的 clientPort 端口號在監(jiān)聽服務(wù)储矩。
第二步:配置dubbo-admin的管理頁面感耙,方便我們管理頁面
(1)下載dubbo-admin-2.4.1.war包,在windows的tomcat部署持隧,先把dubbo-admin-2.4.1放在tomcat的webapps/ROOT下即硼,然后進(jìn)行解壓
(2)然后到webapps/ROOT/WEB-INF下,有一個(gè)dubbo.properties文件屡拨,里面指向Zookeeper?只酥,使用的是Zookeeper?的注冊中心,如圖所示:
[html]view plaincopy
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
(3)然后啟動(dòng)tomcat服務(wù)呀狼,用戶名和密碼:root,并訪問服務(wù)裂允,顯示登陸頁面,說明dubbo-admin部署成功哥艇,如圖所示:
第三步:SpringMVC與Dubbo的整合绝编,這邊使用的Maven的管理項(xiàng)目
第一:我們先開發(fā)服務(wù)注冊的,就是提供服務(wù),項(xiàng)目結(jié)構(gòu)如圖所示:
(1)test-maven-api項(xiàng)目加入了一個(gè)服務(wù)接口十饥,代碼如下:
[java]view plaincopy
publicinterfaceTestRegistryService?{
publicString?hello(String?name);
}
(2)test-maven-console在pom.xml加入Dubbo和Zookeeper的jar包窟勃、引用test-maven-api的jar包,代碼如下:
[html]view plaincopy
cn.test
test-maven-api
0.0.1-SNAPSHOT
com.alibaba
dubbo
2.5.3
org.apache.zookeeper
zookeeper
3.4.6
com.github.sgroschupf
zkclient
0.1
(3)test-maven-console實(shí)現(xiàn)具體的服務(wù)逗堵,代碼如下:
[java]view plaincopy
@Service("testRegistryService")
publicclassTestRegistryServiceImplimplementsTestRegistryService?{
publicString?hello(String?name)?{
return"hello"+name;
}
}
(4)我們服務(wù)以及實(shí)現(xiàn)好了秉氧,這時(shí)要暴露服務(wù),代碼如下:
[html]view plaincopy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/jee?http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://code.alibabatech.com/schema/dubbo?http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.1.xsd"
default-lazy-init="false">
說明:
dubbo:registry標(biāo)簽一些屬性的說明:
1)register是否向此注冊中心注冊服務(wù)蜒秤,如果設(shè)為false汁咏,將只訂閱,不注冊作媚。
2)check注冊中心不存在時(shí)攘滩,是否報(bào)錯(cuò)。
3)subscribe是否向此注冊中心訂閱服務(wù)掂骏,如果設(shè)為false轰驳,將只注冊厚掷,不訂閱弟灼。
4)timeout注冊中心請求超時(shí)時(shí)間(毫秒)。
5)address可以Zookeeper集群配置冒黑,地址可以多個(gè)以逗號隔開等田绑。
dubbo:service標(biāo)簽的一些屬性說明:
1)interface服務(wù)接口的路徑
2)ref引用對應(yīng)的實(shí)現(xiàn)類的Bean的ID
3)registry向指定注冊中心注冊,在多個(gè)注冊中心時(shí)使用抡爹,值為的id屬性掩驱,多個(gè)注冊中心ID用逗號分隔,如果不想將該服務(wù)注冊到任何registry冬竟,可將值設(shè)為N/A
4)register?默認(rèn)true?欧穴,該協(xié)議的服務(wù)是否注冊到注冊中心。
(5)啟動(dòng)項(xiàng)目泵殴,然后我們在Dubbo管理頁面上顯示涮帘,已經(jīng)暴露的服務(wù),但顯示還沒有消費(fèi)者笑诅,因?yàn)槲覀冞€沒實(shí)現(xiàn)消費(fèi)者服務(wù)调缨,如圖所示:
第二:我們在開發(fā)服務(wù)消費(fèi)者,就是調(diào)用服務(wù)吆你,我們在新建一個(gè)新的消費(fèi)者項(xiàng)目:
(1)test-maven-server-console的pom.xml引入Dubbo和Zookeeper的jar包弦叶、test-maven-api的jar包,因?yàn)橐雝est-maven-api的jar包妇多,我們在項(xiàng)目中調(diào)用像在本地調(diào)用一樣伤哺。代碼如下:
[html]view plaincopy
cn.test
test-maven-api
0.0.1-SNAPSHOT
com.alibaba
dubbo
2.5.3
org.apache.zookeeper
zookeeper
3.4.6
com.github.sgroschupf
zkclient
0.1
(2)test-maven-server-console項(xiàng)目的具體實(shí)現(xiàn),代碼如下:
[java]view plaincopy
@Controller
publicclassIndexController?{
@Autowired
privateTestRegistryService?testRegistryService;
@RequestMapping("/hello")
publicString?index(Model?model){
String?name=testRegistryService.hello("zz");
System.out.println("xx=="+name);
return"";
}
}
(3)我們要引用的地址,代碼如下:
[java]view plaincopy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/jee?http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://code.alibabatech.com/schema/dubbo?http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.1.xsd"
default-lazy-init="false">
說明:
dubbo:reference的一些屬性的說明:
1)interface調(diào)用的服務(wù)接口
2)check?啟動(dòng)時(shí)檢查提供者是否存在默责,true報(bào)錯(cuò)贬循,false忽略
3)registry從指定注冊中心注冊獲取服務(wù)列表,在多個(gè)注冊中心時(shí)使用桃序,值為的id屬性杖虾,多個(gè)注冊中心ID用逗號分隔
4)loadbalance?負(fù)載均衡策略,可選值:random,roundrobin,leastactive媒熊,分別表示:隨機(jī)奇适,輪循,最少活躍調(diào)用
(4)項(xiàng)目啟動(dòng)芦鳍,Dubbo管理頁面嚷往,能看到消費(fèi)者,如圖所示:
(5)然后訪問消費(fèi)者項(xiàng)目柠衅,Controller層能像調(diào)用本地一樣調(diào)用服務(wù)的具體實(shí)現(xiàn)皮仁,如圖所示:
總結(jié):
經(jīng)過一系列的操作之后,我們感覺菲宴,的確很簡單贷祈,dubbo給我們封裝了很多操作,讓我們不需要過多考慮具體的實(shí)現(xiàn)細(xì)節(jié)喝峦,配置化生成咱們的應(yīng)用势誊,這樣的思想,現(xiàn)在在IT行業(yè)正在盛行谣蠢!