28

Dubbo:我有阿里爸爸的保驾护航,再不了解我就out啦!

 5 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzU2Njg3OTU1Mg%3D%3D&%3Bmid=2247483854&%3Bidx=1&%3Bsn=d3af8bb6e74917ca9214b693d79513ec&%3Butm_source=tuicool&%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

还没关注?

快动动手指!

聊技术、论职场!

为IT人打造一个“有温度”的 狸猫技术窝

一、Dubbo 整体架构

zQZ7vye.jpg!web

dubbo官方的这个图很复杂,但是一开始没有必要深入细节,下面我们简单讲解主要模块。

其中 Service 和 Config 层为 API ,对应服务提供方来说是使用ServiceConfig来代表一个要发布的服务配置对象。

对应服务消费方来说ReferenceConfig代表了一个要消费的服务的配置对象。可以直接初始化配置类,也可以通过 spring 解析配置生成配置类。

其它各层均为 SPI ,SPI意味着下面各层都是组件化可以被替换的,这也是dubbo比较好的一点,主要功能组件都可以插件化替换。

dubbo增强了JDK中的SPI功能,在dubbo中其它各层都是使用扩展点进行提供服务的。

dubbo增强的SPI增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点,并且不会一次性实例化扩展点的所有实现类

这避免了有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源的情况,增强的SPI是在具体用某一个实现类时候才进行实例化。

后续会具体讲解增强的SPI的实现原理。

proxy 服务代理层 :扩展接口为 ProxyFactory,dubbo实现的SPI主要JavassistProxyFactory(默认使用)和JdkProxyFactory,用来对服务提供方和服务消费方的服务进行代理。

registry 注册中心层 :封装服务地址的注册与发现,扩展接口为 Registry , RegistryService

Dubbo提供的扩展接口实现为ZookeeperRegistry,RedisRegistry,MulticastRegistry,DubboRegistry。

扩展接口RegistryFactory,dubbo提供的扩展接口实现DubboRegistryFactory,DubboRegistryFactory,RedisRegistryFactory,ZookeeperRegistryFactory。

cluster 路由层 :封装多个提供者的路由及负载均衡,并桥接注册中心,扩展接口为 Cluster , Directory , Router ,LoadBalance。

monitor 监控层 :RPC 调用次数和调用时间监控,扩展接口为 MonitorFactory , Monitor , MonitorService。

protocol 远程调用层 :封将 RPC 调用,扩展接口为 Protocol , Invoker , Exporter。

exchange 信息交换层 :封装请求响应模式,同步转异步,扩展接口为 Exchanger , ExchangeChannel ,ExchangeClient , ExchangeServer

transport 网络传输层 :抽象 mina 和 netty 为统一接口扩展接口为 Channel , Transporter , Client , Server , Codec

serialize 数据序列化层

:可复用的一些工具,扩展接口为 Serialization ,

ObjectInput , ObjectOutput , ThreadPool

关于dubbo扩展点一个简单的例子:
以扩展 Dubbo 的协议为例,在协议的实现 jar 包内放置文本文件: METAINF/dubbo/com.alibaba.dubbo.rpc.Protocol ,内容为:

myprotocol=com.alibaba.user.MyProtocol

MyProtocol内容如下:

package com.alibaba.user;
import com.alibaba.dubbo.rpc.Protocol;
public class MyProtocol implemenets Protocol {
// ...
}

配置模块中的配置
Dubbo 配置模块中,扩展点均有对应配置属性或标签,通过配置指定使用哪个扩展实现。

比如:


 
   
    
  <dubbo:protocol name="myprotocol" />
  
    

二、远程调用细节

3.1 服务提供者暴露一个服务的详细过程

6FbiI3i.jpg!web

首先 ServiceConfig 类拿到对外提供服务的实际类 ref(如:UserServiceImpl)

然后通过 ProxyFactory 类的 getInvoker 方法使用 ref 生成一个AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化。

接下来就是 Invoker 转换到 Exporter 的过程。Dubbo 处理服务暴露的关键就在 Invoker 转换到 Exporter 的过程,上图中的红色部分。

Dubbo 协议的 Invoker 转为 Exporter 发生在 DubboProtocol 类的

export 方法

它主要是打开创建一个Netty Server 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现,然后注册服务到服务注册中心。

3.2 服务消费者消费一个服务的详细过程

uMRf2iF.jpg!web

  • 首先 ReferenceConfig 类的 init 方法调用 Protocol 的 refer 方法生

    成 Invoker 实例(如上图中的红色部分),这是服务消费的关键。

  • 接下来把Invoker 转换为客户端需要的接口(如:UserServiceBo)。

  • dubbo协议的invoker转换为客户端需要的接口是发生在DubboProtocol的refer方法

  • 他主要是创建一个netty client 链接服务提供者,通讯细节由 Dubbo 自己实现。

三、总结

本文简单的介绍了dubbo整体架构,后续具体介绍dubbo增强的spi的实现,服务提供方如何发布服务。

比如何时如何创建netty Server来监听服务消费者的链接,何时如何注册服务到服务治理中心;dubbo的filter链如何构建;服务消费方如何消费服务,何时创建netty client….

END

本文作者:ifeve

本文来源:

http://ifeve.com/dubbo-framework/

本文 转载自 并发编程网 – ifeve.com

长按下图二维码,即刻关注【 狸猫技术窝

阿里、京东、美团、字节跳动

顶尖技术专家 坐镇

为IT人打造一个 “有温度” 的技术窝!

QjAra2y.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK