前言

平常我们在构建分布式系统的时候,一般都是基于 Dubbo 技术栈或者是SpringCloud 技术栈来做。早期其实最先比较流行的是Dubbo,我记得我们当时有个部分的老大就是用的是Dubbo 来构建的一个系统,到后面才出来的 SpringCloud,由于它是基于 Spring 生态建立起来的,提供了一整套微服务组件,功能齐全,大受中小型公司开发者的青睐。

但是现在还是有不少公司没有换成 SpringCloud 来做微服务的东西,还是基于 Dubbo,面试的时候不管是 SpringCloud 也好,Dubbo 也罢,基本上都会提到这两个框架的底层原理。你想尝试一下高级的职位,基本上跑不脱这个问题。

OK,今儿我们就大概聊聊 Dubbo 的底层架构原理吧。

服务注册中心

分布式系统里面这个是必备的,服务提供者跟服务消费者都在启动的时候都会注册到服务注册中心来。服务注册中心会记录。

动态代理层 Proxy

通常这些框架大多数采用的思想都是通过对你的方法,接口生成一个代理对象,然后在这个代理对象里面去写它的功能。

所以这里我们需要每个服务都需要提供接口出来,在发起服务调用执勤,会创建一个动态代理对象,在我们的消费者中只有一个接口,我们可以认为动态代理类相当于为这个接口动态的创建一个实体类出来,然后用动态带来对象进行接口调用。

Cluster 集群层

我们准备好了要去调用了远程服务的接口,那么现在问题是我们的服务提供者会部署多台机器,那么我们到底去调用哪台机器呢?怎么选择?

此时动态代理对象回去找一个叫 Cluster 这层的东西,这层就负责具体要调用哪一台机器。

那么 Cluster 层就必须得拿到有哪些机器对不对,不然怎么选呢。那么这个过程就叫做动态感知。

Cluster 里面有很多组件,比如 Directory、Router 还有LoadBalance ,此时就会使用负载均衡组件 LoadBlance 挑选一台机器。到这里,机器就选好了。

protocol 协议层

这层主要就是选择一种协议来组织我们的请求。

Dubbo支持的协议很多,包括:dubbo、rmi、hessian、http、webservice、thrift、memcached、redis等。默认使用dubbo 协议。

Exchange 信息交换层

这层最主要的目的就是把我们的请求数据包装成 Request 或者 Response 。

Transport 网络通信层

现在我们挑选好了机器,也把请求按照协议进行组织好了,并且封装好了请求。那么这个请求怎么发送到服务提供者的哪台机器呢?

此时我们就需要选择一个网络通信的框架。由他来负责把你的请求通过网络发送过去。比如比较常见的 netty、mina 等。

在发送过去之前,还得对请求进行序列化。序列化有多种方式可以选择,比如Json、Protobuf、Protostuff、Hessian、Kryo等、Java序列化等等。

服务消费者接受到请求后的处理

那么服务提供者怎么才能收到这个请求呢?此时服务提供者里面也得需要一个网络通信框架,他去监听你开放的某个端口,比如就启动一个 netty 去监听消费者发送过来的请求。

接受到请求过后,然后进行反序列化,然后,前面我们发过来的是 通过 Exchange 层包装的 Request 请求,那么这里也需要 这层来对 请求进行解析。解析的时候,也需要根据一种协议来进行解析。

实际上 解析完成请求以后,还会创建一个动态代理对象,再去调用我们的服务提供者接口,最后返回数据。

整个调用流程图

希望你在面试的时候,能够给面试官画出来这个图。

参考资料

可能面试的时候还会有更多的细节,那么根据上面大体的几层,一层一层的了解各自的细节。这样子可能会更有把握一些。

dubbo 中文文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

Dubbo 实现原理及架构详解:http://crazyfzw.github.io/2018/06/10/dubbo-architecture/[1]

把上面的图了解了,再去看官方的,我认为会更好一些。

关注我的头条号并在后台私信我:555,即可(获取Java高级架构资料)。

不知道怎么私信的朋友可以关注公众号:Java耕耘者。(点击小助理获取)

cgblib 代理接口原理_Java开发者你还不知道?告诉你Dubbo 的底层原理,面试不再怕...相关推荐

  1. 越来越多的岗位需要DPDK,那从DPDK该如何提升网络底层效率丨网络原理丨Linux服务器开发丨后端开发丨网络底层原理

    越来越多的岗位需要dpdk,那从dpdk该如何提升网络底层效率 1. dpdk线程模型 2. kni与数据接收处理流程 3. 手把手代码实现 视频讲解如下,点击观看: 越来越多的岗位需要DPDK,那从 ...

  2. cgblib 代理接口原理_Spring5参考指南-AOP代理

    AOP代理 通常来说Spring AOP有两种代理方式,一种默认的JDK代理,只能代理接口,一种是CGLIB代理,可以代理具体的类对象. SpringAOP默认为对AOP代理使用标准的JDK动态代理. ...

  3. synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...

    并发编程已经成为程序员必备技能 作为Java程序员,不懂得并发编程显然已经不能满足市场需求了,尤其是在面试过程中将处于被动地位,也有可能面试将就此终结. 那么作为Java开发者的你,日常虽然可以基于J ...

  4. python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)

    字典:(拓展–重要)字典核心底层原理 字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket. 每个bucket 有两部分:一个是键对象的引用,一个是值对 ...

  5. 冷热分离和直接使用大数据库_还不知道HBase冷热分离的技术原理?看这一篇就够了...

    作者:郭泽晖(索月),阿里巴巴技术专家 HBase是当下流行的一款海量数据存储的分布式数据库.往往海量数据存储会涉及到一个成本问题,如何降低成本.常见的方案就是通过冷热分离来治理数据.冷数据可以用更高 ...

  6. 还不知道 Redis 分布式锁的背后原理?还不赶快学习一下

    前言 以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情 ...

  7. dubbo的底层原理

    一.Duboo基本概念解释 Dubbo是一种分布式服务框架. Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,他需要结合F5实现负载均衡.因此,dubbo除了可以 ...

  8. java web底层原理_详解Java开发Web应用程序的底层原理

    前言 前面一篇文章,我从整个应用程序的整体以及跟运行环境的关系简单聊了一下我们现在常用的Spring框架的设计基础和准则,其中主要是控制反转和依赖注入,以及容器化编程等概念. 这里我不想去复述这些概念 ...

  9. 计算机原理与技术索引的应用,经常学一点计算机底层原理系列之索引

    最近和一些大牛在一些聊天时(资深技术专家),想到有必要写这个系列和大家分享点自己的感悟和想法.技术分为快餐技术和慢技术,快餐技术就是大家一看就懂的技术,而且马上就可以使用,看到效果,一般大家都比较喜欢 ...

最新文章

  1. 使用动态代理简单模拟一下spring的事务管理
  2. ../configure: /bin/sh^M: bad interpreter: No such file or directory
  3. maven工程xml文件路径问题
  4. (转)java动态代理与aop
  5. mongodb上一篇下一篇_如何使用Microsoft office word—上一篇
  6. 晚上答辩的理论知识准备
  7. PHP opencv Dlib,Face_Recognition
  8. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者
  9. [转]PlantUML画类图、流程图、时序图使用详解
  10. 利用WinSock进行有连接的通信
  11. python输出一首诗_Python里隐藏的 诗
  12. 【动态规划】路径dp:蓝桥2020: 数字三角形
  13. NIOS II EDS NIOS II IDE 转载
  14. 从武则天的故事看职场生涯规划的一个最重要方面
  15. CAS配置数据库进行用户验证
  16. c语言十七算法,算法精解十七(C语言版)
  17. Android 权限汇总大全
  18. android建脚本,Android Studio Gradle构建脚本(示例代码)
  19. 如何获取div中的value值
  20. 【 直接复制不用下载 】-- 走遍美国总词汇(完整版)

热门文章

  1. mybatis3 类型别名
  2. list python 转tensor_Pytorch--Tensor, Numpy--Array,Python--List 相互之间的转换。
  3. Python_面向对象_zipfile和tarfile
  4. SVN查看提交日志的命令
  5. ElasticSearch 2 (27) - 信息聚合系列之故事开始
  6. 有意思的小学数学竞赛题-2
  7. 实用MYSQL语句收集
  8. 哈希表(HashTable)探究(转)
  9. 泛型实现List(ListT)排序
  10. [Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]