Dubbo

9/6/2015来源:Java教程人气:5640

Dubbo

Dubbo : 简单来说,Dubbo 是一个服务治理的框架,集中管理RPC调用,并提供多种访问策略和负载来满足应用系统之间的相互调用。

RPC远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。Dubbo架构

  • PRovider:暴露服务的服务提供方。
  • Consumer:调用远程服务的服务消费方。
  • Registry:服务注册与发现的注册中心。
  • Monitor:统计服务的调用次调和调用时间的监控中心。
  • Container:服务运行容器。

注意:Registry 是一个很轻的东西,实际上Dubbo只是在注册中心共享了服务的相关信息,Dubbo的主体是Provider和Consumer,这两者都是属于应用范 围内的。Monitor也是很轻的模块,需要有监控服务在Registry进行了注册应用才能正常使用监控,监控宕掉不影响服务。

Dubbo 本身提供了多种协议的支持,hession协议也是其中之一。

dubbo:// dubbo缺省协议采用单一长连接和NIO异步通讯(非组撒),适合于小数据量大并发的服务调用,以及服务消费者机器数大于服务提者机器数的情况。

  • Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

    • rmi://RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。
    • hessian://Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
    • http://基于http的短连接协议,基本不会去使用了。
    • webservice://webservice
    • redis://Redis是一个高效的KV存储服务器
    • memcached://Memcached是一个高效的KV缓存服务器
    • Thrift://Thrift是Facebook捐给Apache的一个RPC框架

注册中心介绍

Dubbo也支持多种类型的注册中心,分别有:

    • Multicast基于组 播实现的注册中心,互相发现
    • ZookeeperZookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。
    • RedisRedis是一个高效的KV存储服务器
    • Simple注册中心本身就是一个普通的Dubbo服务,可以减少第三方依赖,使整体通讯方式一致。

<a href="http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm" class="external-link" rel="nofollow">User+Guide-zh</a>

接口定义
  1. 定义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>
  2. 定义接口

    ISayHello.java
    1234packagecom.z.iexample;publicinterfaceISayHello {publicString sayHelloWaitAnswer(String s);}
服务提供方(Provider)

  1. 定义Maven服务端项目,并提供相应依赖(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的连接客户端,再者就是需要实现的接口jar了。

  2. 实现接口的服务类

    SayHelloImpl.java
    123456789101112131415161718192021packagecom.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());}}
  3. 准备Spring的配置文件,因为这个示例是基于Spring Context实现的。

    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"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:applicationname="say-hello-server"/><!-- Group属性指定dubbo在zookeeper中以什么路径开始,group之间相对隔离,如果不写,则所有服务都从根/开始 --><dubbo:registryaddress="zookeeper://10.10.110.58:2181"group="dubbo"client="zkclient"/><!-- 如果注册中心里有监控服务进行注册,则可以开启下面的配置,监控会从注册中心寻找监控服务端,通过protocol="registry"指定 --><!-- <dubbo:monitor protocol="registry"/> --><!-- 服务提供方对外提供的连接数控制,connections代表与每一个消费者建立多少连接,accepts代表本服务提供方总共对外提供多少连接 --><dubbo:providerconnections="5"accepts="8"/><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocolname="dubbo"port="20880"/><!-- 声明需要暴露的服务接口 --><dubbo:serviceinterface="com.z.iexample.ISayHello"ref="simpleServer"/><!-- 和本地bean一样实现服务 --><beanid="simpleServer"class="com.z.example.server.rpc.SayHelloImpl"/></beans>
  4. 提供主程序入口

    Main.java
    1234567891011121314151617packagecom.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();}}}
服务消费方(Consumer)
  1. 定义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>