Dubbo笔记 ② : 架构概述

一、前言

本系列为个人Dubbo学习笔记,内容来源于《深度剖析Apache Dubbo 核心技术内幕》,仅用于个人笔记记录。本文分析基于Dubbo2.7.0版本,由于个人理解的局限性,若文中不免出现错误,感谢指正。


本文纯理论,内容来自 《深度剖析Apache Dubbo 核心技术内幕》。写本篇的目的是为了作为后续系列文章的一个开篇。

二、分层架构概述

在这里插入图片描述

  • Service和Config层:为API接口层,是为了让Dubbo使用方方便地发布服务和引用服务;对于服务提供方来说需要实现服务接口,然后使用ServiceConfig API 来发布该服务;对于服务消费方来说需要使用ReferenceConfig 对服务接口进行代理。Dubbo服务发布与引用方可以直接初始化配置类,也可以通过Spring配置自动生成配置类。

  • 其他各层均为SPI(Service Provider Interface,服务提供者接口)层,SPI意味着下面各层都是组件化的,是可以被替换的,这也是Dubbo设计比较好的一点。Dubbo增强了JDK中提供的标准SPI功能,在Dubbo中除了Service和Config层,其他各层都是通过实现扩展点接口来提供服务的;Dubbo增强的SPI增加了对扩展点IoC和AOP的支持,一个扩展点可以直接使用setter()方法注入其他扩展点,并且不会一次性实例化扩展点的所有实现类,这就避免了当扩展点实现类初始化很耗时,但当前还没用上它的功能时仍进行加载实例化这种浪费资源的情况;增强的SPI是在具体用某一个实现类的时候才对具体实现类进行实例化。后续会具体讲解Dubbo增强的SPI的实现原理。

  • Proxy服务代理层:该层主要是对服务消费端使用的接口进行代理,把本地调用透明地转换为远程调用;另外对服务提供方的服务实现类进行代理,把服务实现类转换为Wrapper类,这是为了减少反射的调用,后面会具体讲解。Proxy层的SPI扩展接口为ProxyFactory,Dubbo提供的实现类主要有JavassistProxyFactory(默认使用)和JdkProxyFactory,用户可以实现ProxyFactory SPI接口,自定义代理服务层的实现。

  • Registry 服务注册中心层:服务提供者启动时会把服务注册到服务注册中心,消费者启动时会去服务注册中心获取服务提供者的地址列表,Registry层主要功能是封装服务地址的注册与发现逻辑,扩展接口Registry 对应的扩展实现为ZookeeperRegistry、RedisRegistry、MulticastRegistry、DubboRegistry等。扩展接口RegistryFactory 对应的扩展接口实现为DubboRegistryFactory、DubboRegistryFactory、RedisRegistryFactory、ZookeeperRegistryFactory。另外,该层扩展接口Directory实现类有RegistryDirectory、StaticDirectory,用来透明地把Invoker列表转换为一个Invoker;用户可以实现该层的一系列扩展接口,自定义该层的服务实现。

  • Cluster 路由层:封装多个服务提供者的路由规则、负载均衡、集群容错的实现,并桥接服务注册中心;扩展接口Cluster 对应的实现类有FailoverCluster(失败重试)、FailbackCluster(失败自动恢复)、FailfastCluster(快速失败)、FailsafeCluster (失败安全)、ForkingCluster(并行调用)等;负载均衡扩展接口LoadBalance 对应的实现类为RandomLoadBalance(随机)、RoundRobinLoadBalance(轮询)、LeastActiveLoadBalance(最小活跃数)、ConsistentHashLoadBalance(一致性Hash)等。用户可以实现该层的一系列扩展接口,自定义集群容错和负载均衡策略。

  • Monitor 监控层:用来统计RPC 调用次数和调用耗时时间,扩展接口为MonitorFactory,对应的实现类为DubboMonitorFactroy。用户可以实现该层的MonitorFactory扩展接口,实现自定义监控统计策略。

  • Protocol 远程调用层:封装RPC 调用逻辑,扩展接口为Protocol,对应实现有RegistryProtocol、DubboProtocol、InjvmProtocol等。

  • Exchange 信息交换层:封装请求响应模式,同步转异步,扩展接口为Exchanger,对应的扩展实现有HeaderExchanger等。

  • Transport网络传输层:Mina和Netty抽象为统一接口。扩展接口为Channel,对应的实现有NettyChannel(默认)、MinaChannel等;扩展接口Transporter对应的实现类有GrizzlyTransporter、MinaTransporter、NettyTransporter(默认实现);扩展接口Codec2对应的实现类有DubboCodec、ThriftCodec等。

  • Serialize 数据序列化层:提供可以复用的一些工具,扩展接口为Serialization,对应的扩展实现有DubboSerialization、FastJsonSerialization、Hessian2Serialization、JavaSerialization等,扩展接口ThreadPool对应的扩展实现有FixedThreadPool、CachedThreadPool、LimitedThreadPool等。

    扫描二维码关注公众号,回复: 13007167 查看本文章

三、远程调用概述

1. 服务提供者暴露服务概述

在这里插入图片描述

  1. Ref -> Invoker : ServiceConfig 类引用对外提供服务的实现类ref(如GreetingServiceImpl), 然后通过ProxyFactory#getInvoker方法使用ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成了具体服务到Invoker 的转化。。
  2. Invoker -> Export : Dubbo协议的Invoker转为Exporter发生在Protocol#export 方法中,Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程中,在这个过程中会先启动Netty Server监听服务连接,然后将服务注册到服务注册中心。

2. 服务消费者消费服务概述

在这里插入图片描述

  1. ReferenceConfig 首先ReferenceConfig#init 方法调用Protocol#refer方法生成Invoker 实例,这是服务消费的关键。接下来把Invoker 转换为客户端需要的接口(如GreetingService)。
  2. Dubbo协议的Invoker转换为客户端需要的接口,发生在ProxyFactory接口的扩展实现类的getProxy方法中,它主要是使用代理对服务接口的调用转换为对Invoker的调用。

以上:内容部分参考
《深度剖析Apache Dubbo 核心技术内幕》
如有侵扰,联系删除。 内容仅用于自我记录学习使用。如有错误,欢迎指正

猜你喜欢

转载自blog.csdn.net/qq_36882793/article/details/114591565