1.什么是Dubbo?
Apache Dubbo是一款高性能的RPC框架(RPC:remote procedure call,即远程过程调用)。
2.Dubbo功能
面向接口的远程方法调用,智能容错和负载均衡,服务自动注册和发现。
以及高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
3.Dubbo架构(来源:Dubbo官网)
- 注册中心。协调 Consumer 与 Provider 之间的地址注册与发现
- 配置中心。
- 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
- 负责服务治理规则(路由规则、动态配置等)的存储与推送。
- 元数据中心。
- 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
- 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展
4.Dubbo注册中心--zookeeper
zookper是Apache Hadoop 的子项目,是一种树形目录服务,支持变更推送。适合作为Dubbo服务注册中心。
5.Dubbo基本配置(基于注解)
provider(服务提供者):
- xml配置:
<!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 -->
<dubbo:application name="dubbodemo_provider" />
<!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址-->
<dubbo:registry address="zookeeper://192.168.134.129:2181"/>
<!-- 注册 协议和port -->
<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
<!-- 扫描指定包,加入@Service注解的类会被发布为服务 -->
<dubbo:annotation package="com.xxx.service" />
- 用法:在service的实现类上加注解:@Service(注意,此注解使用Dubbo提供的)
consumer(服务消费者):
- xml配置:
<!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 -->
<dubbo:application name="dubbodemo_consumer" />
<!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址-->
<dubbo:registry address="zookeeper://192.168.134.129:2181"/>
<!-- 扫描controller -->
<dubbo:annotation package="com.xxx.controller" />
- 用法:在controller中注入service(注解:@Reference)
6.被事务代理的Service无法发布到Dubbo
- 原因:基于JDK动态代理的事务在创建代理对象时,对象的完整名为com.sun.proxy.$Proxy42(后面两位数字不固定),导致Dubbo进行包匹配时无法匹配。因此无法发布到Dubbo。
- 解决方案:
事务修改为基于cglib动态代理.(在配置开启事务注解支持时,添加proxy-target-class="true")
<tx:annotation-driven transaction-manager="transactionManager" proxy-target- class="true"/>
在服务实现类@Service注解中添加:interfaceClass=XXX.class(XXX为要发布服务的类名)
@Service(interfaceClass=XXX.class)
@Transactional
public class XXXServiceImpl implements XXXService{
...
}