关于dubbo:深度剖析Apache-Dubbo核心技术内幕学习笔记

28次阅读

共计 2573 个字符,预计需要花费 7 分钟才能阅读完成。

一、前言

工欲善其事,必先利其器,后面通过几篇文章简略的介绍了如何应用 Dubbo 搭建一个简略的分布式系统,在接下来的的一段时间就来钻研 Dubbo 原理设计,本文作为原理设计的开篇先整体介绍下 dubbo 的架构。
参考书籍:《深度分析 Apache Dubbo 核心技术底细》
京东连贯:https://item.jd.com/12769688….
链接: https://pan.baidu.com/s/1WA7z… 提取码: rets

二、整体架构

image.png

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 服务提供者裸露一个服务的具体过程

image.png

  • 首先 ServiceConfig 类拿到对外提供服务的理论类 ref(如:UserServiceImpl), 而后通过 ProxyFactory 类的 getInvoker 办法应用 ref 生成一个
    AbstractProxyInvoker 实例,到这一步就实现具体服务到 Invoker 的转化。
    接下来就是 Invoker 转换到 Exporter 的过程。Dubbo 解决服务裸露的要害就在 Invoker 转换到 Exporter 的过程,上图中的红色局部。
  • Dubbo 协定的 Invoker 转为 Exporter 产生在 DubboProtocol 类的
    export 办法,它次要是关上创立一个 Netty Server 侦听服务,并接管客户端发来的各种申请,通信细节由 Dubbo 本人实现,而后注册服务到服务注册核心。

3.2 服务消费者生产一个服务的具体过程

image.png

  • 首先 ReferenceConfig 类的 init 办法调用 Protocol 的 refer 办法生
    成 Invoker 实例(如上图中的红色局部),这是服务生产的要害。接下来把
    Invoker 转换为客户端须要的接口(如:UserServiceBo)。
  • dubbo 协定的 invoker 转换为客户端须要的接口是产生在 DubboProtocol 的 refer 办法,他次要是创立一个 netty client 链接服务提供者,通信细节由 Dubbo 本人实现。

四、总结

本文简略的介绍了 dubbo 整体架构,后续具体介绍,dubbo 加强的 spi 的实现,服务提供方如何公布服务,比方何时如何创立 netty Server 来监听服务消费者的链接,何时如何注册服务到服务治理核心;dubbo 的 filter 链如何构建;服务生产方如何生产服务,何时创立 netty client….

正文完
 0