专栏首页后端技术学习Dubbo调用流程学习总结

Dubbo调用流程学习总结

首先我们知道Dubbo是一个RPC框架,因此解决的问题是服务治理,这个治理是解决服务注册和调用列表的维护治理,产生注册中心维护服务列表和更新,同时方便远程调用和本地调用是一样的,同时方便解耦,我猜这个是dubbo框架产生的初衷吧。而服务的调用和服务的引用是采用网络编程框架Netty,由于其基于NIO,因此其具有很高的性能。同时因为服务的调用和服务的引用,与IM通信或者我们看到的Http请求三次握手是类似的,采用的是应答模式。

下面我们来看一下服务的调用和服务流程,如图1所示:

图1 服务提供、引用与注册中心、监控

从这张图,可以看到服务端则会事先将自己的信息注册到注册中心,同时暴露接口,这样的话,方便服务提供者和服务引用调用,注册到注册中,以zookeeper为例,可以看到注册服务信息在树状列表中,也即dubbo下面的service下的providers的信息。也即它只负责将服务注册到注册中心,同时将服务提供信息统计到监控Monitor。

同时可以看到服务引用服务首先经过Proxy,而Proxy中会持有一个Invoker对象,然后出发invoke调用过程。在调用过程中,首先经过Cluster进行容错,比如默认的Failover,失败重试。经过Directory列表,这里包含动态注册列表信息和静态注册列表信息。如果用户配置了路由,则会进行用户配置的路由规则进行路由,常用的路由:脚本路由和条件路由。路由完之后,会进行负载均衡。常见的负载均衡:随机、轮询、最少活跃,千筛万选最终调用符合条件的Invoker。这里涉及到的容错、注册信息目录列表、路由、负载均衡,可以在图2中可以看到。

图2 Dubbo的Cluster、Router、Directory、LoadBalance

两条主线:订阅变更通知、进行数据传输。也即进行调用首先进行协议的适配Protocol,适配之后,进行服务的订阅subscribe和notify变更通知,如图1。接着进行Transporter操作,满足条件的Invoker会调用Client,采用同步的方式,默认采用Netty进行数据交互。这个过程会首先会对Header进行编码Codec,对Body进行序列化,然后调用服务端。服务端会进行收发Dispather到线程池中进行处理。此时它会根据请求找到Invoker,也即代理找到具体的接口,从而拿到实现,如图3。

图3 远程调用

也就是采用注册建立服务提供和服务引用的列表信息和变更,通过Netty进行远程调用,采用register将服务注册到注册中心,采用subscirbe从服务中心订阅需要调用的服务,采用notify进行变更通知操作,通知服务引用,服务提供者是否变更服务。而服务引用调用服务时,采用invoke适配协议拿到服务。同时可以看到Container,我猜它应该是启动的服务器,类似tomcat一样,这个待确认,这个从SPI中可以看到的默认服务器是Netty。服务的提供和调用采用Montior进行监控。

本文分享自微信公众号 - 后端技术学习(gh_9f5627e6cc61),作者:路行的亚洲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadPoolExecutor源码学习

    但点进去看newSingleThreadExecutor可以看到其会调用ThreadPoolExecutor里面的线程。因此有必要研究ThreadPoolExe...

    路行的亚洲
  • CompletionService学习

    前面已经说到Future的默认实现是FutureTask,因此你可以看到其在jdk1.5的时候采用的是AQS去实现的,因此具有阻塞性,但jdk1.6之后,可以看...

    路行的亚洲
  • 单例模式

    private static SingletonExample1 instance= null;

    路行的亚洲
  • 用实战题目学习Python

    昨天在公众号发了第一个广告,是商家主动找的我,考虑到自己现在的粉丝比较少,我没有收取任何广告费。这篇关于Python的广告,大家还是结合自身实际再去买课,互联网...

    stormwen
  • redis系列:通过通讯录案例学习hash命令

    这一篇文章将讲述Redis中的hash类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。

    云枭
  • 从0到1打牢算法基础之手写一个哈希表

    目的:手写实现一个哈希表,采用拉链法构建,每个hash(key)对应的是一个红黑树。

    公众号guangcity
  • 23种设计模式之单例模式进阶

    前一篇推文里面我们初步介绍了一下23种设计模式,并且讲解了其中的单例模式的两种情况,今天我们再来讲一讲另外几种单例模式的情况,因为我们都知道懒汉式和饿...

    Python进击者
  • 微服务API通过ip可访问,域名不可访问问题分析

    经常会有同学遇到api通过ip可以访问,但是通过域名却不可以访问。本篇文章总结了造成这种情况可能的原因。因为与具体技术的选型、规则配置有关,所以没有深入讨论,只...

    方丈的寺院
  • 大唐长安人杜环在两河流域, 耶路撒冷和北非的行程

    原文链接:https://github.com/nomorewzx/jingxing.ji

    流川疯
  • Java 设计模式系列(1) —— 单例模式

    由运行结果可知,在此过程中创建了3个实例,这便是产生了线程安全问题,三个线程同时访问指针获取空值,从而创建了三个变量。

    求和小熊猫

扫码关注云+社区

领取腾讯云代金券