Dubbo : 簡單來說,Dubbo 是一個服務(wù)治理的框架,集中管理RPC調(diào)用,并提供多種訪問策略和負載來滿足應(yīng)用系統(tǒng)之間的相互調(diào)用。
RPC遠程過程調(diào)用協(xié)議:它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。RPC采用客戶機/服務(wù)器模式。請求程序就是一個客戶機,而服務(wù)提供程序就是一個服務(wù)器。首先,客戶機調(diào)用進程發(fā)送一個有進程參數(shù)的調(diào)用信息到服務(wù)進程,然后等待應(yīng)答信息。在服務(wù)器端,進程保持睡眠狀態(tài)直到調(diào)用信息的到達為止。當(dāng)一個調(diào)用信息到達,服務(wù)器獲得進程參數(shù),計算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用進程接收答復(fù)信息,獲得進程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進行。Dubbo架構(gòu)
注意:Registry 是一個很輕的東西,實際上Dubbo只是在注冊中心共享了服務(wù)的相關(guān)信息,Dubbo的主體是Provider和Consumer,這兩者都是屬于應(yīng)用范 圍內(nèi)的。Monitor也是很輕的模塊,需要有監(jiān)控服務(wù)在Registry進行了注冊應(yīng)用才能正常使用監(jiān)控,監(jiān)控宕掉不影響服務(wù)。
Dubbo 本身提供了多種協(xié)議的支持,hession協(xié)議也是其中之一。
dubbo:// dubbo缺省協(xié)議采用單一長連接和NIO異步通訊(非組撒),適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費者機器數(shù)大于服務(wù)提者機器數(shù)的情況。
Dubbo也支持多種類型的注冊中心,分別有:
<a class="external-link" rel="nofollow">User+Guide-zh</a>
接口定義定義Maven接口項目
pom.xml<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.z</groupId><artifactId>Iexample</artifactId><version>1.0</version></project> |
定義接口
ISayHello.java| 1234 | packagecom.z.iexample;publicinterfaceISayHello {publicString sayHelloWaitAnswer(String s);} |
定義Maven服務(wù)端項目,并提供相應(yīng)依賴(Iexample,dubbo,zookeeper)。
pom.xml<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.z</groupId><artifactId>example-server</artifactId><version>1.0</version><dependencies><dependency><groupId>com.z</groupId><artifactId>Iexample</artifactId><version>1.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.3</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.2.1.RELEASE</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.4</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.4</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies></project> |
Dubbo對外的依賴是需要什么就增加什么的jar依賴,我們需要到的依賴一個是dubbo自身的依賴,另外一個是注冊中心zookeeper的依賴,需要提供zookeeper的連接客戶端,再者就是需要實現(xiàn)的接口jar了。
實現(xiàn)接口的服務(wù)類
SayHelloImpl.java| 123456789101112131415161718192021 | packagecom.z.example.server.rpc;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.concurrent.atomic.AtomicInteger;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importcom.z.iexample.ISayHello;publicclassSayHelloImplimplementsISayHello {privatefinalLogger log = LoggerFactory.getLogger(getClass());privateDateFormat dateFormat =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");privateString template ="[%s] - %d.";privateAtomicInteger count =newAtomicInteger();publicString sayHelloWaitAnswer(String s) {log.info("Receive message {} from client", s);Date now =newDate();String answerTime = dateFormat.format(now);returnString.format(template, answerTime, count.getAndIncrement());}} |
準備Spring的配置文件,因為這個示例是基于Spring Context實現(xiàn)的。
applicationContext.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方應(yīng)用信息,用于計算依賴關(guān)系 --><dubbo:applicationname="say-hello-server"/><!-- Group屬性指定dubbo在zookeeper中以什么路徑開始,group之間相對隔離,如果不寫,則所有服務(wù)都從根/開始 --><dubbo:registryaddress="zookeeper://10.10.110.58:2181"group="dubbo"client="zkclient"/><!-- 如果注冊中心里有監(jiān)控服務(wù)進行注冊,則可以開啟下面的配置,監(jiān)控會從注冊中心尋找監(jiān)控服務(wù)端,通過protocol="registry"指定 --><!-- <dubbo:monitor protocol="registry"/> --><!-- 服務(wù)提供方對外提供的連接數(shù)控制,connections代表與每一個消費者建立多少連接,accepts代表本服務(wù)提供方總共對外提供多少連接 --><dubbo:providerconnections="5"accepts="8"/><!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --><dubbo:protocolname="dubbo"port="20880"/><!-- 聲明需要暴露的服務(wù)接口 --><dubbo:serviceinterface="com.z.iexample.ISayHello"ref="simpleServer"/><!-- 和本地bean一樣實現(xiàn)服務(wù) --><beanid="simpleServer"class="com.z.example.server.rpc.SayHelloImpl"/></beans> |
提供主程序入口
Main.java| 1234567891011121314151617 | packagecom.z.example.server;importjava.io.IOException;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassMain {/*** @param args*/publicstaticvoidmain(String[] args) {ClassPathXmlApplicationContext context =newClassPathXmlApplicationContext("applicationContext.xml");context.start();try{System.in.read();}catch(IOException e) {e.printStackTrace();}}} |
定義Maven項目,提供消費者的依賴
pom.xml<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.z</groupId><artifactId>example-client</artifactId><version>1.0</version><dependencies><dependency><groupId>com.z</groupId><artifactId>Iexample</artifactId><version>1.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.3</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.2.1.RELEASE</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.4</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.4</version>
|