阿里面试必问的Dubbo相关问题

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

你对RPC框架的底层原理掌握程度。程序员

以及考验你的总体RPC框架系统设计能力。面试

具体,我来为你们详解。算法

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框架的核心设计

前面提到了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到5年开发经验的程序员在面试中涉及到的绝大部分架构面试题及答案作成了文档和架构视频资料免费分享给你们(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),但愿能帮助到您面试前的复习且找到一个好的工做,也节省你们在网上搜索资料的时间来学习,也能够关注我一下之后会有更多干货分享。

资料获取方式: QQ群搜索“708-701-457” 便可免费领取



相关文章
相关标签/搜索