资讯专栏INFORMATION COLUMN

dubbo源码解析——概要篇

Meathill / 1035人阅读

摘要:服务提供者代码上面这个类会被封装成为一个实例,并新生成一个实例。这样当网络通讯层收到一个请求后,会找到对应的实例,并调用它所对应的实例,从而真正调用了服务提供者的代码。

这次源码解析借鉴《肥朝》前辈的dubbo源码解析,进行源码学习。总结起来就是先总体,后局部.也就是先把需要注意的概念先抛出来,把整体架构图先画出来.让读者拿着"地图"跟着我的脚步,并且每一步我都提醒,现在我们在哪,我们下一步要做什么,这样才不会迷失方向。

总体概述


首先是总体出发了解整体的架构,涉及到概念,在学习dubbo会更加理解透彻。
下面对上面这张图做简要的分析:
(1)cluster是集群,主要是

Invoker

概念:
Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。它里面有一个很重要的方法 Result invoke(Invocation invocation)。

Invocation是会话域,它持有调用过程中的变量,比如方法名,参数等重要信息。

它有2种类型的Invoker

1.本地执行类的Invoker
   server端:比如有一个dubbo接口demoService.sayHello,在本项目中执行 demoService.sayHello,就通过InjvmExporter来进行反射执行demoService.sayHello就可以了。
   

2.远程通信类的Invoker

    client端:要执行 demoService.sayHello,它封装了DubboInvoker进行远程通信,发送要执行的接口给server端。
    server端:采用了AbstractProxyInvoker执行了DemoServiceImpl.sayHello,然后将执行结果返回发送给client.

按服务提供、服务消费分类

引用官方文档:分为服务提供 Invoker 和服务消费 Invoker 

为了更好的解释上面这张图,我们结合服务消费和提供者的代码示例来进行说明:

服务消费者代码:

public class DemoClientAction {
 
    private DemoService demoService;
 
    public void setDemoService(DemoService demoService) {
        this.demoService = demoService;
    }
 
    public void start() {
        String hello = demoService.sayHello("world" + i);
    }
}

上面代码中的 DemoService 就是上图中服务消费端的 proxy,用户代码通过这个 proxy 调用其对应的 Invoker [5],而该 Invoker 实现了真正的远程服务调用。

服务提供者代码:

public class DemoServiceImpl implements DemoService {
 
    public String sayHello(String name) throws RemoteException {
        return "Hello " + name;
    }
}

上面这个类会被封装成为一个 AbstractProxyInvoker 实例,并新生成一个 Exporter 实例。这样当网络通讯层收到一个请求后,会找到对应的 Exporter 实例,并调用它所对应的 AbstractProxyInvoker 实例,从而真正调用了服务提供者的代码。

Invoker继承关系

Directory

概念
简单来说,Directory就是装载invoker的文件目录

两个重要Directory
StaticDirectory:静态目录服务,他的Invoker是固定的。
RegistryDirectory:注册目录服务,他的Invoker集合数据来源于zk注册中心的,他实现了NotifyListener接口,这个接口中的notify方法就是注册中心的回调,也就是它之所以能根据注册中心动态变化的根源所在.。
整个过程有一个重要的map变量,methodInvokerMap(它是数据的来源;同时也是notify的重要操作对象,重点是写操作。)

Router

概念
利用Router,可以从多个服务提者方中选择一个进行调用
分类
主要是3个实现类:
ConditionRouter(条件路由):条件路由主要就是根据dubbo管理控制台配置的路由规则来过滤相关的invoker
MockInvokersSelector:主要根据参数,判断是否需要筛选出正常的(非mock的)invoker 或者 mock的invoker
ScriptRouter(脚本路由):待补充

例子
参考:org.apache.dubbo.rpc.cluster.router.script.ScriptRouterTest

LoadBalance

概念
与Router功能类似,利用负载均衡策略(random,roundrobin,leastactive),从多个服务提者方中选择一个进行调用

Protocol

概念
Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。

再接下来给大家一张"地图","地图"上我已经标记了序号,再下面的源码分析中,我也会实时提醒我们所在的位置,以至于不会迷失方向.

消费方调用过程中,dubbo究竟做了什么?
a、在Directory中找出本次集群中的全部invokers
b、在Router中,将上一步的全部invokers挑选出满足条件的invokers
c、在LoadBalance中,将上一步的能正常的执行invokers中,根据配置的负载均衡策略,挑选出需要执行的invoker

后面开始,就是正式的源码阅读(环境搭建这些略过)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72101.html

相关文章

  • dubbo源码解析——消费过程

    摘要:上一篇源码解析概要篇中我们了解到中的一些概念及消费端总体调用过程。由于在生成代理实例的时候,在构造函数中赋值了,因此可以只用该进行方法的调用。 上一篇 dubbo源码解析——概要篇中我们了解到dubbo中的一些概念及消费端总体调用过程。本文中,将进入消费端源码解析(具体逻辑会放到代码的注释中)。本文先是对消费过程的总体代码逻辑理一遍,个别需要细讲的点,后面会专门的文章进行解析。...

    darkbug 评论0 收藏0
  • dubbo扩展点的IOC

    摘要:属性上篇文章中,提到在获取扩展点接口对应的的时候,会执行私有构造函数。因为此时是,即当为时,即我们可以看出,所有非扩展点接口都会执行对应的实例的方法返回一个实例,即对象。 spring是如何获得容器中管理的类的 拿到applicationContext,就可以调用getBean方法来获得Spring的bean对象了 public class SpringContextUtil impl...

    Zoom 评论0 收藏0
  • dubbo源码解析(二)Dubbo扩展机制SPI

    摘要:二注解该注解为了保证在内部调用具体实现的时候不是硬编码来指定引用哪个实现,也就是为了适配一个接口的多种实现,这样做符合模块接口设计的可插拔原则,也增加了整个框架的灵活性,该注解也实现了扩展点自动装配的特性。 Dubbo扩展机制SPI 前一篇文章《dubbo源码解析(一)Hello,Dubbo》是对dubbo整个项目大体的介绍,而从这篇文章开始,我将会从源码来解读dubbo再各个模块的实...

    DirtyMind 评论0 收藏0
  • dubbo源码解析(四十七)服务端处理请求过程

    摘要:而存在的意义就是保证请求或响应对象可在线程池中被解码,解码完成后,就会分发到的。 2.7大揭秘——服务端处理请求过程 目标:从源码的角度分析服务端接收到请求后的一系列操作,最终把客户端需要的值返回。 前言 上一篇讲到了消费端发送请求的过程,该篇就要将服务端处理请求的过程。也就是当服务端收到请求数据包后的一系列处理以及如何返回最终结果。我们也知道消费端在发送请求的时候已经做了编码,所以我...

    yzzz 评论0 收藏0
  • 【推荐】最新200:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<