天天看点

dubbo 连接灵魂三问前沿

前沿

目前在看深度剖析ApacheDubbo核心技术内幕一书 发现几个很有意思的问题:

第一点:由于同一个服务提供者机器可以提供多个服务,那么消费者机器需要与同一个服务提供者机器提供的多个服务共享连接,还是与每个服务都建立一个连接?

第二点:消费端是启动时就与服务提供者机器建立好连接吗?

第三点:每个服务消费端与服务提供者集群中的所有机器都有连接吗?

源码分析(截图源于dubbo 2.7.5)

由于同一个服务提供者机器可以提供多个服务,那么消费者机器需要与同一个服务提供者机器提供的多个服务共享连接,还是与每个服务都建立一个连接?

回答这个问题前,我们需要对 dubbo 连接有个了解。dubbo的链接有2类,第一类是共享连接。consumer&每一个provider实例有一个多服务共享的连接。第二类是独享连接,consumer&每一个provider实例的每一个暴露的服务有独立的链接。

从下面源码分析可得知,在默认情况下 当消费端引用同一个服务提供机器上的多个服务时,这些服务复用一个Netty连接

dubbo 连接灵魂三问前沿

消费端是启动时就与服务提供者机器建立好连接吗?

先看源码,这里的lazy 默认为 false, 标明 启动时就建立好连接。如果有设置 lazy 为 true,则 标明 惰性连接

dubbo 连接灵魂三问前沿

每个服务消费端与服务提供者集群中的所有机器都有连接吗

dubbo 连接灵魂三问前沿
dubbo 连接灵魂三问前沿

拓展

Dubbo基础

分层架构–Dubbo采用分层架构。Dubbo框架整体上分为了业务层(business)、RPC层和远程调用层(Remoting),其中业务层提供API,让使用者方便地发布与引用服务;RPC层则是对服务注册与发现、服务代理、路由、负载均衡等功能的封装,该层有可以被划分为很多层;远程调用层则是对网络传输与请求数据序列/反序列化等的抽象。

扩展性–Dubbo是一个扩展性极强的框架,其RPC层中的所有组件都是基于SPI扩展接口实现的,每个组件都可以被替换。

集群容错–Dubbo框架提供了分布式系统中常见的集群容错策略,并且提供了扩展接口,让使用方方便地定制自己的集群容错策略。

负载均衡、路由–Dubbo框架提供了分布式系统中常见的负载均衡策略,并且提供了扩展接口,让使用者方便地指定自己的负载均衡策略;另外,陆游规则提供了服务治理的一种策略,在Dubbo中我们可以通过管理控制台来配置路由规则,让消费者只可以访问那些服务提供者。

注册中心–在Dubbo框架中,提供了扩展接口来方便地让我们使用Zookeeper,redis等作为服务注册中心。

代理远程调用–Dubbo框架和其他RPC框架一样,采用代理来实现,让使用者无感知地发起远程过程调用。服务提供端使用代理与JavaAssist技术来减少反射调用开销。

网络通信–Dubbo的分层架构中,Transport网络传输层把Mina和Netty抽象为统一接口,并且在默认情况下使用Netty作为底层网络通信。

异步调用–Dubbo基于Netty的异步非阻塞能力和JDK8中的CompletableFuture轻松地实现RPC请求的异步调用,提供了资源的利用率。

Dubbo框架内核原理剖析

架构分层是一个比较经典的模式,比如网络中的7层协议,每层执行固定的功能,上层依赖下层提供的功能,下层的改变对上层不可见等,并且每层都是一个可被替换的组件。

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实在具体用某一个实现类的时候才对具体实现类进行实例化。

Proxy服务代理层:该层主要是对服务消费端使用的接口进行代理,把本地调用透明的转换为远程调用;另外对服务提供方的服务实现类进行代理,把服务实现类转换为Wrapper类,这减少了反射的调用。

Registry服务注册中心层:服务提供者启动时会把服务注册到服务注册中心,消费者启动时回去服务注册中心获取服务提供者的地址列表,Registry层主要功能是封装服务地址的注册与发现逻辑。

Cluster路由层:封装多个服务提供者的路由规则,负载均衡、集群容错的实现,并桥接注册中心;

扩展接口Cluster对应的实现类有FailoverCluster失败重试,FailbackCluster失败自动恢复,FailfastCluster快速失败,FailSafeCluster失败安全,ForkingCluster并行调用等;负载均衡扩展接口LoadBalance对应的实现类为RandomLoadBalance随机、RoundRobinLoadBalance轮询、LeastActiveLoadBalance最小活跃数、ConsistentHashLoadBalance一致性Hash。

Monitor监控层:用来统计RPC调用次数和调用耗时时间,扩展接口为MonitorFactory。

Protocol远程调用层:封装RPC调用逻辑。

Exchange信息交换层:封装请求响应模式,同步转异步。

Transport网络传输层:Mina和Netty抽象为统一接口。

Serialize数据序列化层:通过可以复用的一些工具。