在过去持续分享的几十期阿里Java面试题中,几乎每次都会问到Dubbo相关问题,比如:“如何从0到1设计一个Dubbo的RPC框架”,这个问题主要考察以下几个方面:

你对RPC框架的底层原理掌握程度。
考验你的整体RPC框架系统设计能力。

具体,mike来为大家详解。

RPC和RPC框架

1.RPC(Remote Procedure Call)

即远程过程调用, 主要解决远程通信间的问题,不需要了解底层网络的通信机制。

2.RPC框架

RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式、以及通信细节。
实际使用中,并不需要关心底层通信细节和调用过程,让业务端专注于业务代码的实现。
国内大家熟知的PRC框架,阿里的HSF和Dubbo(开源)

Dubbo的发展由来

1. 业务规模小

比如早期一个应用Java War包,将所有功能都打包,部署在一个单机服务器,调用接口也比较方便,不涉及到任何分布式场景。

2.业务规模变大

随着业务的快速发展,业务越来越多、子系统也越来越多时。比如:淘宝的交易系统、商品系统、用户系统、评价系统…上百个系统的出现。

系统变得越来越复杂,业务代码依然耦合在一起。比如最早期的淘宝denali工程,包含所有业务系统的代码,就仅打包部署都需要很长的时间。

并且,随着每个业务线的快速发展,业务代码耦合在一起,上线后出现问题急需要回滚代码,拉分支、大量的代码merge工作,这个过程极其痛苦。

这个时候,你会发现技术已经成了业务的瓶颈,急需把业务单独抽离出来,各自单独部署。

3.Dubbo和HSF的出现

应用系统一旦涉及到拆分部署,问题就来了,急需一种高效的应用程序间的通讯手段来完成这种需求,这就会涉及到分布式远程调用。

于是,淘宝就把denali按照业务为单位拆分成了类似这样的系统:UM(UserManger)、SM(ShopManager)…等等几十个工程代码。

再按照业务为单位,把所有调用相关的接口以业务为单元进行拆分;- UIC(用户中心服务)、SIC(店铺中心服务)…等等以业务为单位集群部署,按照业务提供服务。

所以,RPC的框架来了,阿里内部使用HSF,以及开源的RPC框架:Dubbo。

RPC框架的核心设计

前面mike提到了RPC的核心目标:主要是解决分布式系统中服务之间的调用问题。

其实,走到这一步涉及的知识体系非常的多:要求对通信、远程调用、消息机制等有深入的理解和掌握,要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。

1.RPC框架三个核心角色

1)服务提供者(Server)
对外提供后台服务,将自己的服务信息,注册到注册中心

2)注册中心(Registry)
用于服务端注册远程服务以及客户端发现服务。
目前主要的注册中心可以借由 zookeeper,eureka,consul,etcd 等开源框架实现。
比如:阿里的Dubbo就是采用zookeeper实现注册中心。

3)服务消费者(Client)
从注册中心获取远程服务的注册信息,然后进行远程过程调用。

2.RPC远程调用过程

1)服务调用方(client)调用以本地调用方式调用服务;
2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在Java里就是序列化的过程
3)client stub找到服务地址,并将消息通过网络发送到服务端;
4)server stub收到消息后进行解码,在Java里就是反序列化的过程;
5)server stub根据解码结果调用本地的服务;
6)本地服务执行处理逻辑;
7)本地服务将结果返回给server stub;
8)server stub将返回结果打包成消息,Java里的序列化;
9)server stub将打包后的消息通过网络并发送至消费方
10)client stub接收到消息,并进行解码, Java里的反序列化;
11)服务调用方(client)得到最终结果。

RPC框架的目标就是要2~10这些步骤都封装起来。

RPC框架涉及技术

1.建立通信

首先,要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。

2.服务寻址

1)服务注册
首先需要把服务注册到服务中心。其实就是在注册中心进行一个登记,注册中心存储了该服务的IP、端口、调用方式(协议、序列化方式)等。在zookeeper中,进行服务注册,实际上就是在zookeeper中创建了一个znode节点,该节点存储了上面所说的服务信息。

2)服务发现
服务消费者在第一次调用服务时,会通过注册中心找到相应的服务的IP地址列表,并缓存到本地,以供后续使用。当消费者调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务。

3)注册服务
可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以zookeeper来实现注册服务等等。

服务提供者启动后主动向服务(注册)中心注册机器ip、端口以及提供的服务列表。

服务消费者启动时向服务(注册)中心获取服务提供方地址列表,可实现软负载均衡和Failover。

提供者需要定时向注册中心发送心跳,一段时间未收到来自提供者的心跳后,认为提供者已经停止服务,从注册中心上摘取掉对应的服务等等。

3.网络传输

数据传输采用什么协议,数据该如何序列化和反序列化。

4.NIO通信

当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。

5.服务调用

比如:B机器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作。

总之,要实现一个RPC不算难,难的是实现一个高性能高可靠的RPC框架,后续将结合Dubbo的实现一起再探讨。

以上就是RPC的介绍,更多Redis、Spring Cloud、MySQL数据库分库分表等高并发架构设计,具体请参考高并发架构系列专题:


觉得有用请点赞支持,送你:

1、上面架构师专题资料合集,由原BAT架构师坚持1年、精心创作,目前已更新至90期;
2、Java 面试题目最全集合1000+ ;

欢迎留言或进我的个人群179961551领取,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不定期答题、探讨。

阿里P8架构师分享:如何从0到1设计一个类Dubbo的RPC框架相关推荐

  1. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    优知学院 2019-01-22 18:43:51 之前持续分享的几十期阿里Java面试题中,几乎每次必问Dubbo,比如:"如何从0到1设计一个Dubbo的RPC框架",其实主要考 ...

  2. 终于拿到了阿里P8架构师分享的JCF和JUC源码分析与实现笔记java岗

    时代的一粒尘,落在每个人身上,就是一座山". 时代更迭变换,我们好像都知道今天与昨天不同,又好像肉眼看不出哪里不同. 但其实它就正在以各种各样的方式体现在每一个普通人身上. 疫情爆发三个月的 ...

  3. 阿里P8架构师分享:我是如和从月薪8K成长到年薪50W的架构师?

    前言 很多工作一定年限的程序员感觉自己到了瓶颈不知道怎么去突破,其实这个时候就要冲破传说中的架构师. 架构师是个很神秘人物,那么架构师的技术一般在什么程度呢?怎样才能被称为架构师? 技术深度 有没有看 ...

  4. 阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别

    什么是RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC使 ...

  5. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

    什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群 ...

  6. 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K

    关于Spring的叙述: 我之前死磕spring的时候,刷各种资料看的我是一头雾水的,后面从阿里的P8架构师那里拿到这两份资料,从源码到案例详细的讲述了spring的各个细节,是我学Spring的启蒙 ...

  7. 从普通JAVA程序员到阿里P8架构师,他用了六年

    工作年限:8 年服务公司:4 家(含四大门户中的两家)最近职业:Java 架构师职场关键词:社交平台.高并发系统架构设计.技术团队管理.多款从零到一的产品城市! 六年间,这位职人呆过四大门户中的两家, ...

  8. 阿里P8架构师谈:架构设计经验汇总

    架构设计更多的是实践经验总结,以下架构设计经验,我会陆续补充完整. 一:数据库拆分原则 阿里P8架构师谈:架构设计之数据库拆分六大原则 二:缓存选择原则 阿里P8架构师谈:分布式缓存的应用场景.选型比 ...

  9. 阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

    编辑 性能优化基本是BAT等一线互联网公司程序员必备的技能,以下为大家完整揭晓性能完整的优化方案和方法:包含web网站调优.数据库.JVM调优.架构调优等方案. 第一:Web网站调优 1.尽可能减少H ...

  10. 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式

    什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...

最新文章

  1. Unix/Linux提权漏洞快速检测工具unix-privesc-check
  2. 【转载】增强中调用BAPI并COMMIT使用
  3. 根据字符串选择类并完成类的初始化--方法二
  4. Navicat怎样筛选数据
  5. oracle查询某个用户下的所有视图
  6. 关于Ajax的type为post提交方式出现请求失效问题
  7. Scrapy从理论到爬图
  8. 安卓逆向系列教程(二)APK 和 DEX
  9. linux驱动编写(nand flash驱动)
  10. struts2漏洞修复
  11. C语言如何去掉非数字字符串,Objective-C中利用正则去除非数字字母汉字方法实例...
  12. 如何从PDF文件中提取几页为一个PDF文件?
  13. w ndows10专业版连接不上网,Windows10连不上无线网怎么办 Windows10修复网络教程
  14. 洛谷P1179 [NOIP2010 普及组] 数字统计题解
  15. 解决Windows密码错误无法进入系统的问题
  16. SpringBoot整合grpc
  17. 使用svg-sprite-loader 遇到的问题
  18. 主码流和辅码流的区别
  19. java aria,ARIA 标签和关系
  20. Linux笔记之浅析Linux文件管理

热门文章

  1. LA 2218 Triathlon (Geometry, Half Plane Intersection)
  2. 趋势程序大赛第 六七 天
  3. 「代码随想录」746. 使用最小花费爬楼梯【动态规划】力扣详解!
  4. 「leetcode」501. 二叉搜索树中的众数【暴力统计】【中序遍历】详解
  5. leetcode [27] 移除元素 / Remove Element
  6. codeforces D. Palindrome pairs 动态规划
  7. C++经典书籍推荐 .
  8. iZotope RX 9 for Mac(数字音频修复工具)
  9. 在 Mac 上用输入法如何以另一种语言键入?
  10. CVE-2014-6332学习笔记