0%

分布式系统面试题整理

Dubbo 相关
  1. 说一下Dubbo的工作原理?
    Dubbo整体架构共分为10层,其架构图如下:

upload successful
下面,结合Dubbo官方文档,我们分别解释下各个层次的设计要点:

  • 第一层:service层,接口层,给服务提供者和服务消费者来实现的
  • 第二层:config层,配置层,主要是对dubbo进行各种配置的,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
  • 第三层:proxy层,服务代理层,无论是consumer还是provider,dubbo都会给你生成代理,代理之间进行网络通信
  • 第四层:registry层,服务注册层,负责服务的注册与发现
  • 第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组成一个服务
  • 第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控
  • 第七层:protocol层,远程调用层,封装rpc调用
  • 第八层:exchange层,信息交换层,封装请求响应模式,同步转异步
  • 第九层:transport层,网络传输层,抽象mina和netty为统一接口
  • 第十层:serialize层,数据序列化层,可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool

2.注册中心挂了consumer与provider可以继续通信吗?
可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信。

3.dubbo 支持哪些通信协议?

  • dubbo协议
    缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
    连接个数:单连接
    连接方式:长连接
    传输协议:TCP
    传输方式:NIO异步传输
    序列化:Hessian二进制序列化
    适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
    适用场景:常规远程服务方法调用
    1、dubbo默认采用dubbo协议,dubbo协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
    2、他不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
    配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- Set default protocol: -->
    <dubbo:provider protocol="dubbo" />
    <~-- Set service protocol -->
    <dubbo:service protocol="dubbo" />
    <!-- Multi port -->
    <dubbo:protocol id="dubbo1" name="dubbo" port="20880" />
    <dubbo:protocol id="dubbo2" name="dubbo" port="20881" />.
    <!-- Dubbo protocol options: -->
    <dubbo:protocol name=“dubbo” port=“9090” server=“netty” client=“netty” codec=“dubbo”
    serialization=“hessian2” charset=“UTF-8” threadpool=“fixed” threads=“100” queues=“0” iothreads=“9”
    buffer=“8192” accepts=“1000” payload=“8388608” />

    3.Dubbo协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接。
    <dubbo:protocol name="dubbo" connections="2" />
    4.为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护
    <dubbo:protocol name="dubbo" accepts="1000" />

  • rmi协议
    RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。
    连接个数:多连接
    连接方式:短连接
    传输协议:TCP
    传输方式:同步传输
    序列化:Java标准二进制序列化
    适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
    适用场景:常规远程服务方法调用,与原生RMI服务互操作

  • Hessian协议
    基于Hessian的远程调用协议。
    连接个数:多连接
    连接方式:短连接
    传输协议:TCP
    传输方式:同步传输
    序列化:表单序列化
    适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
    适用场景:需同时给应用程序和浏览器JS使用的服务。

  • HTTP协议
    基于http表单的远程调用协议。
    连接个数:多连接
    连接方式:短连接
    传输协议:TCP
    传输方式:同步传输
    序列化:表单序列化
    适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
    适用场景:需同时给应用程序和浏览器JS使用的服务。

  • webservice协议
    基于WebService的远程调用协议。
    连接个数:多连接
    连接方式:短连接
    传输协议:TCP
    传输方式:同步传输
    序列化:SOAP文本序列化
    适用场景:系统集成,跨语言调用

  • thrift协议

  • memcached协议

  • redis协议

4.Dubbo支持的序列化协议
dubbo 支持 hessian、Java 二进制序列化、json、SOAP 文本序列化多种序列化协议。但是 hessian 是其默认的序列化协议。
5.说一下Hessian的数据结构
Hessian 的对象序列化机制有 8 种原始类型:

  • 原始二进制数据
  • boolean
  • 64-bit date(64 位毫秒值的日期)
  • 64-bit double
  • 32-bit int
  • 64-bit long
  • null
  • UTF-8 编码的 string

另外还包括 3 种递归类型:

  • list for lists and arrays
  • map for maps and dictionaries
  • object for objects

还有一种特殊的类型:

  • ref:用来表示对共享对象的引用。