Dubbo是一款高性能 Java RPC框架 。
实现了服务注册和发现 ,容错负载均衡,扩展性,基于接口的远程调用
1.Dubbo整合Spring的主要配置项
provider配置
<!--1. 应用配置,定义服务提供者-->
<dubbo:application name="spring-provider36"/>
<!--2. 将服务接口的实现类对象,放入Spring中-->
<bean id="demoService" class="com.cskaoyan.service.DemoServiceImpl"/>
<!--3. 服务配置,定义对外暴露的服务对象-->
<dubbo:service interface="com.cskaoyan.api.DemoService" ref="demoService"/>
<!--4. 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!--5. 注册中心-->
<dubbo:registry address="zookeeper://localhost:2181"/>
consumer配置
<!--1. 应用配置,定义服务消费者的名字-->
<dubbo:application name="spring-consumer36"/>
<!--2.引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心-->
<dubbo:reference id="demoService" interface="com.cskaoyan.api.DemoService"/>
<!--3. 注册中心-->
<dubbo:registry address="zookeeper://localhost:2181"/>
2.Dubbo的RPC原理
1)服务消费方(client)调用以本地调用方式调用服务; 2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体; 3)client stub找到服务地址,并将消息发送到服务端; 4)server stub收到消息后进行解码; 5)server stub根据解码结果调用本地的服务; 6)本地服务执行并将结果返回给server stub; 7)server stub将返回结果打包成消息并发送至消费方; 8)client stub接收到消息,并进行解码; 9)服务消费方得到最终结果。
3.RPC过程
1.在服务提供者进程被启动时,创建一个spring容器,容器中有两个对象,一个是服务接口实现类对象,另一个是对外暴露功能的服务对象(对上面bean容器中的接口实现类对象持有引用); 2.在服务消费者进程被启动时,创建一个spring容器,容器中只有一个对象,服务的引用对象(Dubbo动态生成的代理对象); 在这个代理对象中,并没有真正实现被调用的方法,主要用来和服务提供者建立网络连接,将发送调用的请求按照Dubbo协议,封装序列化并发送。provider接收到请求,反序列化得到得到请求数据,这里provider维护了一个map<String,服务对象>,通过请求中的全限定类名来唯一指定对应的服务对象,找到服务对象通过服务对象去调用真正实现了接口功能的实现类对象的方法,执行方法之后将方法调用的结果进行序列化通过网络连接最终返回给consumer。 原理大概是这样,具体dubbo的底层通信框架并不是socket,是Netty,抽象 mina 和 netty 为统一接口,以 Message 为中心 代理类主要做的事情(伪代码)
class DemoServiceInvoker implements DemoService {
String protocol;
String targetIp;
int port;
public String sayHello(String name) throws IOException {
Socket socket = new Socket(targetIp, port);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
return null;
}
}
4.Dubbo框架分了哪些层
服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现 配置层(Config):对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心 服务代理层(Proxy):服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton 服务注册层(Registry):封装服务地址的注册与发现,以服务 URL 为中心 集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心 监控层(Monitor):RPC 调用次数和调用时间监控 远程调用层(Protocol):封将 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为 Protocol、Invoker、Exporter 信息交换层(Exchange):封装请求响应模式,同步转异步,以 Request 和 Response 为中心 网络传输层(Transport):抽象 mina 和 netty 为统一接口,以 Message 为中心
|