Dubbo
1. 什么是Dubbo
Dubbo是一个分布式服务架构,致力于提供高性能和透明化的PRC远程服务调用方案,以及SOA(程序不同单元和功能通过约定的接口联系起来)服务治理方案。
1.1系统间通信
soa架构:
面向服务的架构,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
如何实现远程通信:
- Webservice:效率不高基于soap协议。项目中不推荐使用。
- 使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。
- 使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。
涉及概念:
- soap:SOAP 最初代表“简单对象访问协议” SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 使用http协议传输xml文本的技术
- restful:一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
- rpc:(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
三种方式的区别比较
底层传输协议 | 传输速度 | 特点 | 共同点 | 适用场景 | |
socket | UDP或TCP | 最快 | 开发步骤繁琐 | 被多种操作系统/开发语言支持 | socket适用于对传输速度和执行效率要求高的场合。如高并发、大流量的Client - Server通信。 |
Rest WebService | HTTP | 一般 | 非标准 | (同上) | Rest WebService适用于开发专用的系统或功能,或者移动客户端(手机/平板等)与服务器的通信。 Rest WebService的数据传输量比传统WebService要小,有利于节约流量。 |
传统WebService | SOAP | 最慢 | 标准,通用 | 标准,通用 | 传统WebService适用于开发传统的web项目或者通用功能(如天气预报、手机号归属地查询等便民服务)。 它是四种远程调用技术中在互联网上应用最为广泛的。 |
Dubbo架构
当服务增多,需要管理服务,提高机器利用率,资源调度和治理中心(SOA)是关键
Dubbo就是资源调度和治理中心的管理工具
- Provider: 暴露服务的服务提供方。
- Consumer: 调用远程服务的服务消费方。
- Registry: 服务注册与发现的注册中心。
- Monitor: 统计服务的调用次调和调用时间的监控中心。
- Container: 服务运行容器。
注册中心
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,建议使用zookeeper注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
Zookeeper的安装:
第一步:安装jdk
第二步:解压缩zookeeper压缩包
第三步:将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg
第四步:修改配置dataDir属性,指定一个真实目录
Dubbo原理(使用zookeeper做注册中心)
Dubbo常用配置介绍
- <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/> 用于指定方法参数配置。
Dubbo的spring配置
Dubbo基于spring的schema扩展进行加载
单一工程中的spring配置
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
远程服务
将local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。
然后提供方暴露服务:dubbo:service
<beans xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation=
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd>
<!-- 和本地服务一样实现远程服务 -->
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<!-- 使用dubbo发布服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" />
<dubbo:registry protocol="zookeeper"
address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
<beans>
消费方引用服务:dubbo:reference
<dubbo:application name="hello-world-app"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"/>
<!-- 增加引用远程服务配置 -->
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
<!-- 和本地服务一样使用远程服务 -->
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
框架整合
maven添加Dubbo依赖:
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>