dubbo总结

原创
2016/04/06 15:06
阅读数 316
  1. 启动方式

    参见dubbo-container工程

    代码库:https://github.com/alibaba/dubbo
    目录结构

    部署目录
         |-bin
            |-start.bat
            |-start.sh
            |-...
         |-conf
            |-dubbo.properties
            |-xxx.properties
            |-log4j.properties
         |-lib
            |-dubbo-x.x.x.jar
            |-其它依赖包...

    准备

    1. 将dubbo.jar中的bin目录下的拷贝到部署目录
    2. 在部署目录新建conf文件夹
    3. 在conf文件夹中新建dubbo.properties
    4. 在dubbo.jar!/META-INF下新建spring文件夹,文件夹中可以放置spring的配置文件(xxx.xml)
    5. 自定义的properties文件可以放到conf目录下,同时日志系统的配置文件也可放到conf下(log4j\logback)

    启动

    1. Spring容器启动(默认方式):

      • 示例配置(这里采用了广播方式作为注册中心,其它方式参见章节9):
        //方式一:spring配置文件
        <dubbo:annotation />
        <dubbo:application name="provider1" />
        <dubbo:registry dynamic="true" address="multicast://224.5.6.7:1234"/>
        //方式二:使用dubbo.properties
        dubbo.registry.address=multicast://224.5.6.7:1234
        #dubbo.registry.address=zookeeper://127.0.0.1:2181
        #dubbo.registry.address=redis://127.0.0.1:6379
        #dubbo.registry.address=dubbo://127.0.0.1:9090
      • 启动命令:
        cd bin
        ./start.sh 或者 start.bat
      • 启动结果
        Starting the iZ947uua03aZ ....OK!
        或者
        Dubbo service server started!
    2. Jetty容器启动:
      • lib目录下增加jetty-6.1.26.jar以及jetty-util-6.1.26.jar
      • dubbo.properties
        dubbo.container=log4j,spring,jetty
        dubbo.jetty.port=8080
      • 启动命令与Spring方式一致
    3. Spring项目集成方式
      • 只需要在spring配置文件中配置相应的<dubbo:annotation/>、<dubbo:application/>、<dubbo:service/>、<dubbo:registry/>即可
  2. 配置方式

    参见dubbo-config工程

    配置项参考手册
    dubbo提供四种配置方式:

    1. Spring配置(推荐):
      <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
      <dubbo:reference/> 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。
      <dubbo:protocol/> 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
      <dubbo:application/> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
      <dubbo:module/> 模块配置,用于配置当前模块信息,可选。
      <dubbo:registry/> 注册中心配置,用于配置连接注册中心相关信息。
      <dubbo:monitor/> 监控中心配置,用于配置连接监控中心相关信息,可选。
      <dubbo:provider/> 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。
      <dubbo:consumer/> 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。
      <dubbo:method/> 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。
      <dubbo:argument/> 用于指定方法参数配置。
    2. dubbo.properties(推荐):
      Dubbo将自动加载classpath根目录下的dubbo.properties,可以通过JVM启动参数:-Ddubbo.properties.file=xxx.properties 改变缺省配置位置。
      映射规则:
      将XML配置的标签名,加属性名,用点分隔,多个属性拆成多行:
      比如:dubbo.application.name=foo等价于<dubbo:application name="foo" />
      比如:dubbo.registry.address=10.20.153.10:9090等价于<dubbo:registry address="10.20.153.10:9090" />
      如果XML有多行同名标签配置,可用id号区分,如果没有id号将对所有同名标签生效:
      比如:dubbo.protocol.rmi.port=1234等价于<dubbo:protocol id="rmi" name="rmi" port="1099" />
      (协议的id没配时,缺省使用协议名作为id)
      比如:dubbo.registry.china.address=10.20.153.10:9090等价于<dubbo:registry id="china" address="10.20.153.10:9090" />
    3. 注解方式(依赖spring,可与以上两种方式结合):
      import com.alibaba.dubbo.config.annotation.Service;
      @Service(version="1.0.0")
      public class FooServiceImpl implements FooService {
      // ......
      }
    4. 代码调用(不推荐):
      import com.alibaba.dubbo.rpc.config.ApplicationConfig;
      import com.alibaba.dubbo.rpc.config.RegistryConfig;
      import com.alibaba.dubbo.rpc.config.ProviderConfig;
      import com.alibaba.dubbo.rpc.config.ServiceConfig;
      import com.xxx.XxxService;
      import com.xxx.XxxServiceImpl;
      // 服务实现
      XxxService xxxService = new XxxServiceImpl();
      // 当前应用配置
      ApplicationConfig application = new ApplicationConfig();
      application.setName("xxx");
      // 连接注册中心配置
      RegistryConfig registry = new RegistryConfig();
      registry.setAddress("10.20.130.230:9090");
      registry.setUsername("aaa");
      registry.setPassword("bbb");
      // 服务提供者协议配置
      ProtocolConfig protocol = new ProtocolConfig();
      protocol.setName("dubbo");
      protocol.setPort(12345);
      protocol.setThreads(200);
      // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
      // 服务提供者暴露服务配置
      ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); 
      // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
      service.setApplication(application);
      service.setRegistry(registry); // 多个注册中心可以用setRegistries()
      service.setProtocol(protocol); // 多个协议可以用setProtocols()
      service.setInterface(XxxService.class);
      service.setRef(xxxService);
      service.setVersion("1.0.0");
      // 暴露及注册服务
      service.export();
  3. 依赖
    dubbo使用了maven管理依赖关系,各个依赖包的版本号在dubbo-master(dubbo-parent)下的POM文件中。dubbo代码很久没有更新,因此其中的各种依赖的版本都很低,如果有仓库中没有的依赖请下载依赖包到本地maven仓库。
    特别需要注意的是,dubbo依赖的spring-2.5.6.jar,如果大家有使用spring可以在自己工程的POM中排除掉dubbo的依赖(亲测4.2.1没有冲突,其实dubbo只是使用了spring的beans\context\remoting包)。
    有需要的朋友可以将各个依赖升级到新的版本(可以关注下当当网的dubbox项目)。
  4. 协议
    • dubbo://
      + Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
      - Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
    • rmi://
      + RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。
    • hessian://
      + Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
      + Hessian是Caucho开源的一个RPC框架:http://hessian.caucho.com,其通讯效率高于WebService和Java自带的序列化。
    • http://
      + 采用Spring的HttpInvoker实现,实现并不完善,不适用于生产系统
    • webservice://
      + 基于CXF的frontend-simple和transports-http实现。
    • thrift://
      + 当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码,后续版本中会在这方面做一些增强。
    • memcached://
    • redis://
  5. 注册中心
    • Multicast注册中心
      • 不需要启动任何中心节点,只要广播地址一样,就可以互相发现
      • 组播受网络结构限制,只适合小规模应用或开发阶段使用。
      • 组播地址段: 224.0.0.0 - 239.255.255.255
    • Zookeeper注册中心
      • 建议使用dubbo-2.3.3以上版本的zookeeper注册中心客户端
      • 阿里内部并没有采用Zookeeper做为注册中心,而是使用自己实现的基于数据库的注册中心,即:Zookeeper注册中心并没有在阿里内部长时间运行的可靠性保障,此Zookeeper桥接实现只为开源版本提供,其可靠性依赖于Zookeeper本身的可靠性。
    • Redis注册中心
      • 阿里内部并没有采用Redis做为注册中心,而是使用自己实现的基于数据库的注册中心,即:Redis注册中心并没有在阿里内部长时间运行的可靠性保障,此Redis桥接实现只为开源版本提供,其可靠性依赖于Redis本身的可靠性。
    • Simple注册中心
      • 注册中心本身就是一个普通的Dubbo服务,可以减少第三方依赖,使整体通讯方式一致。
      • 此SimpleRegistryService只是简单实现,不支持集群,可作为自定义注册中心的参考,但不适合直接用于生产环境。
  6. monitor
    • 解压dubbo-monitor-simple/target/dubbo-monitor-simple-2.5.4-SNAPSHOT-assembly.tar.gz
    • 修改dubbo.properties中注册中心的配置
    • bin/start.sh
    • 访问地址:http://127.0.0.1:8080
  7. 管理控制台
    • 复制dubbo-admin/target/dubbo-admin-2.5.4-SNAPSHOT到web服务器
    • 修改WEB-INF/dubbo.properties中注册中心及登录密码配置
    • 启动web服务器
  8. 逻辑架构
    dubbo架构图

    • 服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
    • 配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
    • 服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以 - ServiceProxy为中心,扩展接口为ProxyFactory。
    • 服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
    • 集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。
    • 监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。
    • 远程调用层(Protocol):封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
    • 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
    • 网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
    • 数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。
  9. 初始化
    未完待续

  10. 分布式架构
    1. 集群
    2. 容错
    3. 服务降级
    4. 负载均衡
展开阅读全文
打赏
1
10 收藏
分享
加载中
更多评论
打赏
0 评论
10 收藏
1
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部