Dubbo中文文檔地址
https://dubbo.gitbooks.io/dubbo-user-book/content/
Dubbo背景
- 單一應(yīng)用架構(gòu)
當(dāng)網(wǎng)站流量很小時(shí)厉萝,只需一個(gè)應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點(diǎn)和成本瓤鼻。
此時(shí),用于簡(jiǎn)化增刪改查工作量的 數(shù)據(jù)訪問(wèn)框架(ORM) 是關(guān)鍵亡鼠。 - 垂直應(yīng)用架構(gòu)
當(dāng)訪問(wèn)量逐漸增大,單一應(yīng)用增加機(jī)器帶來(lái)的加速度越來(lái)越小错维,將應(yīng)用拆成互不相干的幾個(gè)應(yīng)用,以提升效 率橄唬。此時(shí)赋焕,用于加速前端頁(yè)面開(kāi)發(fā)的 Web框架(MVC) 是關(guān)鍵。 - 分布式應(yīng)用架構(gòu)
當(dāng)垂直應(yīng)用越來(lái)越多仰楚,應(yīng)用之間交互不可避免隆判,將核心業(yè)務(wù)抽取出來(lái),作為獨(dú)立的服務(wù)僧界,逐漸形成穩(wěn)定的服務(wù) 中心侨嘀,使前端應(yīng)用能更快速的響應(yīng)多變的市場(chǎng)需求。此時(shí)捂襟,用于提高業(yè)務(wù)復(fù)用及整合的 分布式服務(wù)框架(RPC)是關(guān)鍵咬腕。 - 流動(dòng)計(jì)算架構(gòu)
當(dāng)服務(wù)越來(lái)越多,容量的評(píng)估笆豁,小服務(wù)資源的浪費(fèi)等問(wèn)題逐漸顯現(xiàn)郎汪,此時(shí)需增加一個(gè)調(diào)度中心基于訪問(wèn)壓力實(shí)時(shí)管理集群容量,提高集群利用率闯狱。此時(shí)煞赢,用于提高機(jī)器利用率的 資源調(diào)度和治理中心(SOA) 是關(guān)鍵。
Dubbo
Dubbo快速搭建(結(jié)合SpringBoot):http://start.dubbo.io/哄孤,快速生成消費(fèi)者和提供者項(xiàng)目
- <dubbo:service/> 服務(wù)配置照筑,用于暴露一個(gè)服務(wù),定義服務(wù)的元信息瘦陈,一個(gè)服務(wù)可以用多個(gè)協(xié)議暴露凝危,一個(gè)服務(wù)也可以注冊(cè)到多個(gè)注冊(cè)中心。
- <dubbo:reference/> 引用配置晨逝,用于創(chuàng)建一個(gè)遠(yuǎn)程服務(wù)代理蛾默,一個(gè)引用可以指向多個(gè)注冊(cè)中心。
- <dubbo:protocol/> 協(xié)議配置捉貌,用于配置提供服務(wù)的協(xié)議信息支鸡,協(xié)議由提供方指定,消費(fèi)方被動(dòng)接受趁窃。
- <dubbo:application/> 應(yīng)用配置牧挣,用于配置當(dāng)前應(yīng)用信息,不管該應(yīng)用是提供者還是消費(fèi)者醒陆。
- <dubbo:module/> 模塊配置瀑构,用于配置當(dāng)前模塊信息,可選刨摩。
- <dubbo:registry/> 注冊(cè)中心配置寺晌,用于配置連接注冊(cè)中心相關(guān)信息世吨。
- <dubbo:monitor/> 監(jiān)控中心配置,用于配置連接監(jiān)控中心相關(guān)信息呻征,可選另假。
- <dubbo:provider/> 提供方的缺省值,當(dāng)ProtocolConfig和ServiceConfig某屬性沒(méi)有配置時(shí)怕犁,采用此缺省值边篮,可選。
- <dubbo:consumer/> 消費(fèi)方缺省配置奏甫,當(dāng)ReferenceConfig某屬性沒(méi)有配置時(shí)戈轿,采用此缺省值,可選阵子。
- <dubbo:method/> 方法配置思杯,用于ServiceConfig和ReferenceConfig指定方法級(jí)的配置信息。
- <dubbo:argument/> 用于指定方法參數(shù)配置挠进。
Dubbo的Pom文件配置
<!-- dubbo 需要的jar start -->
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- dubbo 需要的jar end -->
Dubbo基本使用
服務(wù)提供者和消費(fèi)者都需要引入公用接口相關(guān)的jar包
服務(wù)提供者
<!-- 提供方應(yīng)用信息色乾,用于計(jì)算依賴關(guān)系 -->
<dubbo:application name="gw-service-user"/>
<!-- 使用zookeeper注冊(cè)中心暴露服務(wù)地址
<dubbo:registry protocol="zookeeper" address="192.168.3.71:2181" />
-->
<!-- 使用multicast廣播注冊(cè)中心暴露服務(wù)地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 和本地bean一樣實(shí)現(xiàn)服務(wù) -->
<bean id="pmsUserFacade" class="wusc.edu.facade.user.service.impl.PmsUserFacadeImpl"/>
<!-- 用戶服務(wù)接口 -->
<dubbo:service interface="wusc.edu.facade.user.service.PmsUserFacade" ref="pmsUserFacade"/>
服務(wù)消費(fèi)者
<!-- 消費(fèi)方應(yīng)用名,用于計(jì)算依賴關(guān)系领突,不是匹配條件暖璧,不要與提供方一樣 -->
<dubbo:application name="edu-web-boss"/>
<!-- 使用zookeeper注冊(cè)中心暴露服務(wù)地址 -->
<!-- 注冊(cè)中心地址-->
<!--<dubbo:registry protocol="zookeeper" address="192.168.3.71:2181" />-->
<!-- 使用multicast廣播注冊(cè)中心暴露服務(wù)地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!-- 用戶服務(wù)接口 -->
<dubbo:reference interface="wusc.edu.facade.user.service.PmsUserFacade" id="pmsUserFacade" check="false"/>
配置重試次數(shù),最好只用于讀的重試君旦,寫(xiě)操作可能會(huì)引起多次寫(xiě)入 下面三個(gè)任意一個(gè)配置就行 默認(rèn)retries="0"
- <dubbo:service retries="2" />
- <dubbo:reference retries="2" />
- <dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
注冊(cè)中心
流程:
1.服務(wù)提供者啟動(dòng)時(shí)向/dubbo/com.foo.BarService/providers目錄下寫(xiě)入U(xiǎn)RL
2.服務(wù)消費(fèi)者啟動(dòng)時(shí)訂閱/dubbo/com.foo.BarService/providers目錄下的URL向/dubbo/com.foo.BarService/consumers目錄下寫(xiě)入自己的URL
3.監(jiān)控中心啟動(dòng)時(shí)訂閱/dubbo/com.foo.BarService目錄下的所有提供者和消費(fèi)者URL
Dubbo負(fù)載均衡
- Random LoadBalance
隨機(jī)澎办,按權(quán)重設(shè)置隨機(jī)概率。
在一個(gè)截面上碰撞的概率高金砍,但調(diào)用量越大分布越均勻局蚀,而且按概率使用權(quán)重后也比較均勻,有利于動(dòng)態(tài)調(diào)整提供者權(quán)重恕稠。- RoundRobin LoadBalance
輪循琅绅,按公約后的權(quán)重設(shè)置輪循比率。
存在慢的提供者累積請(qǐng)求問(wèn)題鹅巍,比如:第二臺(tái)機(jī)器很慢千扶,但沒(méi)掛,當(dāng)請(qǐng)求調(diào)到第二臺(tái)時(shí)就卡在那昆著,久而久之县貌,所有請(qǐng)求都卡在調(diào)到第二臺(tái)上术陶。- LeastActive LoadBalance
最少活躍調(diào)用數(shù)凑懂,相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計(jì)數(shù)差梧宫。
使慢的提供者收到更少請(qǐng)求接谨,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會(huì)越大摆碉。- ConsistentHash LoadBalance
一致性Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者脓豪。
當(dāng)某一臺(tái)提供者掛時(shí)巷帝,原本發(fā)往該提供者的請(qǐng)求,基于虛擬節(jié)點(diǎn)扫夜,平攤到其它提供者楞泼,不會(huì)引起劇烈變動(dòng)。算法參見(jiàn):http://en.wikipedia.org/wiki/Consistent_hashing笤闯。
缺省只對(duì)第一個(gè)參數(shù)Hash堕阔,如果要修改,請(qǐng)配置<dubbo:parameter key="hash.arguments" value="0,1" />
缺省用160份虛擬節(jié)點(diǎn)颗味,如果要修改超陆,請(qǐng)配置<dubbo:parameter key="hash.nodes" value="320" />
<dubbo:service interface="..." loadbalance="roundrobin" />
<dubbo:reference interface="..." loadbalance="roundrobin" />
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
Dubbo多協(xié)議配置
不同服務(wù)在性能上適用不同協(xié)議進(jìn)行傳輸,比如大數(shù)據(jù)用短連接協(xié)議浦马,小數(shù)據(jù)大并發(fā)用長(zhǎng)連接協(xié)議时呀。
<!-- 多協(xié)議配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo協(xié)議暴露服務(wù) -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
<!-- 使用rmi協(xié)議暴露服務(wù) -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" />
<!-- 使用多個(gè)協(xié)議暴露服務(wù) -->
<dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
Dubbo多注冊(cè)中心
<!-- 多注冊(cè)中心配置 -->
<dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" />
<!-- 向多個(gè)注冊(cè)中心注冊(cè) -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" />
一個(gè)接口多種實(shí)現(xiàn)時(shí)
<dubbo:service group="feedback" interface="com.xxx.IndexService" />
<dubbo:service group="member" interface="com.xxx.IndexService" />
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />
<!--任意組:(2.2.0以上版本支持,總是只調(diào)一個(gè)可用組的實(shí)現(xiàn))-->
<dubbo:reference id="barService" interface="com.foo.BarService" group="*" />
多版本
當(dāng)一個(gè)接口實(shí)現(xiàn)晶默,出現(xiàn)不兼容升級(jí)時(shí)谨娜,可以用版本號(hào)過(guò)渡,版本號(hào)不同的服務(wù)相互間不引用磺陡。
在低壓力時(shí)間段瞧预,先升級(jí)一半提供者為新版本
再將所有消費(fèi)者升級(jí)為新版本
然后將剩下的一半提供者升級(jí)為新版本
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<dubbo:service interface="com.foo.BarService" version="2.0.0" />
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />