一次完整的RPC调用过程

前面的文章研究了dubbo中服务的发布和引用流程,这篇文章主要集中在真实rpc调用的过程上。 负载均衡算法 在进行真实的rpc调用前,有一个非常重要的步骤就是进行负载均衡。由于对于同一个服务来说,往往都有很多服务提供者,与此对应的就是服务消费者在进行服务引用时,本地会缓存很多的Invoker,在进行真实rpc调用时,如何选择Invoker,是负载均衡要解决的问题。dubbo中主要有四种负载均衡算法,分别为:RandomLoadBalance,LeastActiveLoadBalance,RoundRobinLoadBalance和ConsistentHashLoadBalance,下面分别介绍这四种负载均衡算法。 RandomLoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 关键代码如下: »

远程服务的发布与引用

之前分析了Dubbo本地服务的发布与引用,那篇文章充其量只能算是热身,一是因为整个服务的发布与引用流程非常简单直接,二是既然是rpc框架,其核心必然在于远程服务的发布与引用。下面就将着重分析dubbo框架中远程服务的发布与引用的流程。 远程服务发布 远程服务的暴露过程可以分为如下四个步骤: 根据要暴露服务的接口,方法名称等参数组装URL 利用JavassitProxyFactory创建Invoker的过程 在RegistryProtocol中根据URL创建对应的Exporter,比如DubboExporter,然后根据URL中的参数创建指定socket server,监听指定端口 向注册中心注册所提供服务的URL,并且订阅客户端注册的消息 其中前个步骤跟本地服务的发布基本上是一样的,这里不再赘述。 第三步中,除了创建Exporter外,还会根据URL参数创建socket server,监听指定端口。这个socket »

Dubbo架构

最近在学习Dubbo,想着记录一下自己的学习历程。这篇文章是个热身,是从dubbo官网开发者手册摘抄过来关于架构的一些信息。 Dubbo功能模块 调用关系说明: 服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。 (1) »

dubbo中“Wrapper”类

在dubbo中,有一种特殊类型的类,这种类含有一个复制构造函数,dubbo中把这种类型的类叫做Wrapper类,比如ProtocolFilterWrapper或者ProtocolListenerWrapper,它们都含有自身的复制构造函数,我们在调试dubbo的时候会发现,只要是Protocol的子类都会被这两个类“wrap”起来,那么在dubbo中是怎么实现这种功能的呢?下面通过代码来分析这个的实现过程。 首先,当ExtensionLoader调用loadExtensionClasses的时候,会依次加在如下三个目录中的配置文件: loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY); loadFile(extensionClasses, DUBBO_DIRECTORY); loadFile(extensionClasses, »

Dubbo的SPI机制

SPI机制类似于Spring的IOC容器,实现对bean的管理。框架本身定义接口、规范,第三方只需要将自己实现在META-INF下描述清楚,那么框架就会自动加载你的实现。Dubbo的规则是在META-INF/dubbo,META-INF/dubbo/internal或者META-INF/services创建描述文件,以Property的形式对所实现的接口进行描述,比如dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol,就给出了Protocol接口的一个实现类,然后框架自动家在这个类。 Dubbo对这一块的实现全部都集中在类ExtensionLoader中,那么接下来将围绕这个类来介绍Dubbo插件化的实现,在介绍Dubbo插件化实施之前, »