1.dubbo简介
Apache Dubbo
是一款高性能的
Java RPC
框架。其前身是阿里巴巴公司开源的、轻量级的开源
Java RPC
框架,可以和
Spring
框架无缝集成,
2018
年阿里巴巴把这个框架捐献给了
apache
基金会
什么是
RPC
?
RPC
全称为
remote procedure call
,即
远程过程调用
。比如两台服务器
A
和
B
,
A
服务器上部署一个应 用,B
服务器上部署一个应用,
A
服务器上的应用想调用
B
服务器上的应用提供的方法,由于两个应用不 在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
需要注意的是
RPC
并不是一个具体的技术,而是指整个网络远程调用过程。
RPC
是一个泛化的概念,严格来说一切远程过程调用手段都属于
RPC
范畴。各种开发语言都有自己的 RPC框架。
Java
中的
RPC
框架比较多,广泛使用的有
RMI
、
Hessian
、
Dubbo
等。
Dubbo
官网地址:
http://dubbo.apache.org
Dubbo
提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
2.dubbo架构
节点角色说明:
虚线都是异步访问,实线都是同步访问 蓝色虚线
:
在启动时完成的功能 红色虚线
(
实线
)
都是程序运行过 程中执行的功能
调用关系说明
:
0.
服务容器负责启动,加载,运行服务提供者。
1.
服务提供者在启动时,向注册中心注册自己提供的服务。
2.
服务消费者在启动时,向注册中心订阅自己所需的服务。
3.
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失
败,再选另一台调用。
5.
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
3.服务注册中心Zookeeper
通过前面的
Dubbo
架构图可以看到,
Registry
(服务注册中心)在其中起着至关重要的作用。
Dubbo
官方推荐使用Zookeeper
作为服务注册中心。
Zookeeper树形目录服务:
![](https://i-blog.csdnimg.cn/blog_migrate/6c6b90a76fd8205166a929e71d08dff6.png)
流程说明:
服务提供者
(Provider)
启动时
:
向
/dubbo/com.foo.BarService/providers
目录下写入自己的
URL
地址
服务消费者
(Consumer)
启动时
:
订阅
/dubbo/com.foo.BarService/providers
目录下的提供者
URL
地址。并向
/dubbo/com.foo.BarService/consumers
目录下写入自己的
URL
地址
监控中心
(Monitor)
启动时
:
订阅
/dubbo/com.foo.BarService
目录下的所有提供者和消费者
URL
地址
3.1启动、停止Zookeeper
进入
Zookeeper
的
bin
目录,启动服务命令
./zkServer.sh start
停止服务命令
./zkServer.sh stop
查看服务状态:
./zkServer.sh status
客户端连接 :./zkCli.sh
4.dubbo快速入门
详见pdf
5.解决Dubbo无法发布被事务代理的Service问题
前面我们已经完成了
Dubbo
的入门案例,通过入门案例我们可以看到通过
Dubbo
提供的标签配置就可以进行包扫描,扫描到@Service
注解的类就可以被发布为服务。
但是我们如果在服务提供者类上加入
@Transactional
事务控制注解后,服务就发布不成功了。原因是事务控制的底层原理是为服务提供者类创建代理对象,而默认情况下Spring
是基于
JDK
动态代理方式创建代理对象,而此代理对象的完整类名为com.sun.proxy.$Proxy42
(最后两位数字不是固定的),导致Dubbo在发布服务前进行包匹配时无法完成匹配,进而没有进行服务的发布。
问题详见pdf