Dubbo在電商開發(fā)中的應(yīng)用
一,、Dubbo背景
所謂背景介紹,,就是“我們?cè)谑裁辞闆r下,,基于什么原因開發(fā)了這樣一個(gè)中間件,?”就博主來看,簡而言之,,總結(jié)如下:
(1) 隨著服務(wù)的不斷增多,,服務(wù)的URL配置管理變得非常困難。此時(shí),,我們需要找一個(gè)中介替我們管理,。
(2) 服務(wù)間的依賴關(guān)系變得錯(cuò)蹤復(fù)雜,相互調(diào)用混亂,。此時(shí),,我們需要厘清誰是服務(wù)提供方,誰是服務(wù)的消費(fèi)方,。
(3) 服務(wù)間的調(diào)用量越來越大,,服務(wù)的容量問題就暴露出來,這個(gè)服務(wù)需要多少機(jī)器支撐,?什么時(shí)候該加機(jī)器,?此時(shí),我們需要有一個(gè)自動(dòng)監(jiān)控系統(tǒng),,幫助我們監(jiān)控管理這一切,。
基于以上三點(diǎn),我們?cè)僮鲆粋€(gè)進(jìn)一步提?。?/p>
我們需要一個(gè)管理眾多服務(wù)URL的中介 ——注冊(cè)中心,;
我們需要搞清服務(wù)間復(fù)雜的依賴關(guān)系 ——服務(wù)提供方和服務(wù)消費(fèi)方;
我們需要有一個(gè)自動(dòng)監(jiān)控系統(tǒng),,監(jiān)管一切 ——監(jiān)控中心,。
如此,我們Dubbo的模型就自然而然的出來了,。
二,、Dubbo簡介
Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來架構(gòu),,使用這種方式可以使各個(gè)層之間解耦合(或者最大限度地松耦合),,比如表現(xiàn)層和業(yè)務(wù)層就需要解耦合,。
從面向服務(wù)的角度來看,Dubbo采用的是一種非常簡單的模型,,要么是提供方提供服務(wù),,要么是消費(fèi)方消費(fèi)服務(wù),所以基于這一點(diǎn)可以抽象出服務(wù)提供方(Provider)和服務(wù)消費(fèi)方(Consumer)兩個(gè)角色,。
除了以上兩個(gè)角色,,它還有注冊(cè)中心和監(jiān)控中心。它可以通過注冊(cè)中心對(duì)服務(wù)進(jìn)行注冊(cè)和訂閱,,實(shí)現(xiàn)了軟負(fù)載均衡和Failover(故障切換),,降低對(duì)F5硬件負(fù)載均衡器的依賴,也能減少部分成本,。同事,,還可以通過監(jiān)控中心對(duì)服務(wù)進(jìn)行監(jiān)控,這樣的話,,就可以知道哪些服務(wù)使用率高,、哪些服務(wù)使用率低。對(duì)使用率高的服務(wù)增加機(jī)器,,對(duì)使用率低的服務(wù)減少機(jī)器,,達(dá)到合理分配資源的目的。
調(diào)用關(guān)系說明:
[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è)中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者,。
[4] 服務(wù)消費(fèi)者,,從提供者地址列表中,基于軟負(fù)載均衡算法,,選一臺(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ā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心,。
三,、注冊(cè)中心
注冊(cè)中心負(fù)責(zé)服務(wù)地址的注冊(cè)與查找,相當(dāng)于目錄服務(wù),,服務(wù)提供者和消費(fèi)者只在啟動(dòng)時(shí)與注冊(cè)中心交互,,注冊(cè)中心不轉(zhuǎn)發(fā)請(qǐng)求,壓力較小,。Dubbo目前支持4種注冊(cè)中心,(multicast,、zookeeper、Redis,、simple),,但是對(duì)于dubbo-2.3.3以上版本,建議使用Zookeeper注冊(cè)中心,。
(1)Zookeeper簡介
Zookeeper是Apacahe Hadoop的子項(xiàng)目,,是一個(gè)樹型的目錄服務(wù),支持變更推送,,適合作為Dubbo服務(wù)的注冊(cè)中心,,工業(yè)強(qiáng)度較高,可用于生產(chǎn)環(huán)境,,并推薦使用,。
流程說明:
①服務(wù)提供者啟動(dòng)時(shí):
向/dubbo/com.foo.BarService/providers目錄下寫入自己的URL地址。
②服務(wù)消費(fèi)者啟動(dòng)時(shí):
訂閱/dubbo/com.foo.BarService/providers目錄下的提供者URL地址,。
并向/dubbo/com.foo.BarService/consumers目錄下寫入自己的URL地址,。
③監(jiān)控中心啟動(dòng)時(shí):
訂閱/dubbo/com.foo.BarService目錄下的所有提供者和消費(fèi)者URL地址。
支持以下功能:
①當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時(shí),,注冊(cè)中心能自動(dòng)刪除提供者信息,。
②當(dāng)注冊(cè)中心重啟時(shí),能自動(dòng)恢復(fù)注冊(cè)數(shù)據(jù),,以及訂閱請(qǐng)求,。
③當(dāng)會(huì)話過期時(shí),能自動(dòng)恢復(fù)注冊(cè)數(shù)據(jù),,以及訂閱請(qǐng)求,。
④當(dāng)設(shè)置<dubbo:registry check="false" />時(shí),記錄失敗注冊(cè)和訂閱請(qǐng)求,,后臺(tái)定時(shí)重試,。
⑤可通過<dubbo:registry username="admin" password="1234" />設(shè)置zookeeper登錄信息。
⑥可通過<dubbo:registry group="dubbo" />設(shè)置zookeeper的根節(jié)點(diǎn),,不設(shè)置將使用無根樹,。
⑦支持*號(hào)通配符<dubbo:reference group="*" version="*" />,可訂閱服務(wù)的所有分組和所有版本的提供者
(2)Zookeeper單機(jī)安裝
安裝環(huán)境:Linux centOS、JDK環(huán)境(Zookeeper是由Java開發(fā)的)
第一步:下載zookeeper的壓縮包,,上傳到linux系統(tǒng)
- 下載Zookeeper-3.4.5.tar.gz 地址http://www./dist/zookeeper/
第二步:解壓縮
- tar -zxf zookeeper-3.4.5.tar.gz
第三步:創(chuàng)建zoo.cfg文件,,進(jìn)入zookeeper-3.4.5/conf/目錄,修改zoo_sample.cfg 為zoo.cfg
- cp zoo_sample.cfg zoo.cfg
第四步:配置zoo.cfg
- 主要配置dataDir和clientPort參數(shù),。例如:dataDir = /usr/local/zookeeper/data; clientPort = 2181,。
- 注意:datadir目錄中的data末級(jí)目錄如果不存在,也會(huì)自動(dòng)生成,。
第五步:啟動(dòng)zookeeper
- 啟動(dòng)命令:./zkServer.sh start
- 關(guān)閉命令:./zkServer.sh stop
- 查看狀態(tài)命令:./zkServer.sh status
第六步:關(guān)閉防火墻(可選)
- 暫時(shí)關(guān)閉:service iptables stop
- 永久關(guān)閉:chkconfig iptables off</strong>
四,、Dubbo的配置
Dubbo采用全spring配置方式,透明化接入應(yīng)用,,對(duì)應(yīng)用沒有任何API侵入,,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴(kuò)展進(jìn)行加載,。
在Maven的pom.xml中配置如下
- <dependency>
- <!-- 配置zookeeper的客戶端Curator支持Fluent風(fēng)格的操作API -->
- <groupId>com.netflix.curator</groupId>
- <artifactId>curator-framework</artifactId>
- <version>${com.netflix.curator.version}</version>
- </dependency>
- <dependency>
- <!-- 配置zookeeper的客戶端ZkClient -->
- <!-- 可以解決常見問題:重復(fù)注冊(cè)watcher,、session失效重連、異常處理,。 -->
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- <version>${com.101tec.version}</version>
- <exclusions>
- <exclusion>
- <!-- 添加日志 -->
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <!-- 配置Zookeeper -->
- <groupId>org.apache.zookeeper</groupId>
- <artifactId>zookeeper</artifactId>
- <version>${org.apache.zookeeper.version}</version>
- <exclusions>
- <exclusion>
- <!-- 添加日志 -->
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <!-- 配置Dubbo -->
- <groupId>com.alibaba</groupId>
- <artifactId>dubbo</artifactId>
- <version>${com.alibaba.version}</version>
- <exclusions>
- <exclusion>
- <artifactId>spring</artifactId>
- <groupId>org.springframework</groupId>
- </exclusion>
- </exclusions>
- </dependency>
在applicationContext.xml中添加如下配置
- <!-- 引入Dubbo相關(guān)的配置文件 -->
- <import resource="applicationContext-dubbo.xml"/>
- <import resource="service-provider.xml"/>
- <import resource="service-consumer.xml"/>
在applicationContext-dubbo.xml中添加如下配置
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns:xsi="http://www./2001/XMLSchema-instance"
- xmlns:dubbo="http://code./schema/dubbo"
- xmlns="http://www./schema/beans"
- xsi:schemaLocation="
- http://www./schema/beans
- http://www./schema/beans/spring-beans-2.5.xsd
- http://code./schema/dubbo
- http://code./schema/dubbo/dubbo.xsd">
- <!-- 注冊(cè)中心地址 -->
- <dubbo:registry protocol="zookeeper" address="${dubbo.protocol.zookeeper}"
- client="curator" file="docservice-query.properties" />
- <!-- 本地緩存文件(保留已注冊(cè)的服務(wù)) -->
- <!--<dubbo:registry address="multicast://224.5.96.10:1234" /> -->
- <!-- 提供方應(yīng)用信息:application-計(jì)算依賴關(guān)系,。name-應(yīng)用名,owner-負(fù)責(zé)人 -->
- <dubbo:application name="${dubbo.application.name}"
- owner="${dubbo.application.owner}" logger="slf4j" />
- <!-- 注冊(cè)端口名字(接收器)-->
- <dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}" />
- <!-- 當(dāng)前提供組名 -->
- <dubbo:provider group="${dubbo.registry.group}" />
- <!-- 需要消費(fèi)的消費(fèi)組名 -->
- <dubbo:consumer group="${dubbo.registry.group}" />
- </beans>
服務(wù)提供方service-provider.xml配置如下
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns:xsi="http://www./2001/XMLSchema-instance"
- xmlns:dubbo="http://code./schema/dubbo"
- xmlns="http://www./schema/beans"
- xsi:schemaLocation="
- http://www./schema/beans
- http://www./schema/beans/spring-beans-2.5.xsd
- http://code./schema/dubbo
- http://code./schema/dubbo/dubbo.xsd">
- <!-- 需要暴露的服務(wù)地址以及服務(wù)名 ,,protocol接收器標(biāo)識(shí)-->
- <dubbo:service interface="com.xxx.XxxService" ref="xxxService"
- protocol="dubbo" timeout="1000"/>
- </beans>
服務(wù)消費(fèi)方service-consumer.xml配置如下
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns:xsi="http://www./2001/XMLSchema-instance"
- xmlns:dubbo="http://code./schema/dubbo"
- xmlns="http://www./schema/beans"
- xsi:schemaLocation="
- http://www./schema/beans
- http://www./schema/beans/spring-beans-2.5.xsd
- http://code./schema/dubbo
- http://code./schema/dubbo/dubbo.xsd">
- <!-- 需要暴露的服務(wù)地址以及服務(wù)名 ,,protocol接收器標(biāo)識(shí)-->
- <dubbo:reference interface="com.xxx.XxxService" id="xxxService" protocol="dubbo"
- timeout="10000" init="true" group="${dubbo.registry.group}" check="false"/>
dubbo.properties配置如下
- <strong>#注冊(cè)端口名字(接收器)
- dubbo.application.name=service-query
- dubbo.protocol.name=dubbo
- dubbo.protocol.port=20020
- #contarin conf
- dubbo.container=logback,spring
- dubbo.shutdown.hook=true
- #log
- dubbo.application.logger=slf4j
- #spring container
- dubbo.spring.config=classpath*:*spring/applicationContext.xml
- dubbo.logback.level=debug
- dubbo.logback.maxhistory=30</strong>
|