Dubbo面试分析

目录

dubbo 提供了几种均衡策略?

dubbo各通信协议对比?

dubbo服务暴露流程?注册流程? 

zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?

dubbo 服务引用流程?


  • dubbo 提供了几种均衡策略?

  • 废话不多说,首先概览官方文档:Dubbo「负载均衡」;UML图如下

浏览了许多,还是直接上官网的负载均衡源码详解

  • dubbo各通信协议对比?

  1. Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
  2. RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。
  3. Hessian协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
  4. 基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现。
  5. 基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现 。
 dubbo://

rmi://

hessian://

http://

webservice://

连接个数

单连接多连接多连接多连接多连接
连接方式长连接短连接短连接短连接短连接
传输协议TCPTCPHTTPHTTPHTTP
传输方式NIO 异步传输同步传输同步传输同步传输同步传输
序列化Hessian 二进制序列化Java 标准二进制序列化Hessian二进制序列化表单序列化SOAP 文本序列化

适用范围

1⃣️传入传出参数数据包较小(建议小于100K)

2⃣️消费者比提供者个数多,单一消费者无法压满提供者

3⃣️尽量不要用dubbo协议传输大文件或超大字符串。

1⃣️传入传出参数数据包大小混合

2⃣️消费者与提供者个数差不多

3⃣️可传文件

1⃣️传入传出参数数据包较大

2⃣️提供者比消费者个数多,提供者压力较大

3⃣️可传文件

1⃣️传入传出参数数据包大小混合

2⃣️提供者比消费者个数多

3⃣️可用浏览器查看,可用表单或URL传入参数,暂不支持传文件

 

适用场景常规远程服务方法调用常规远程服务方法调用,与原生RMI服务互操作页面传输,文件传输,或与原生hessian服务互操作需同时给应用程序和浏览器 JS 使用的服务系统集成,跨语言调用

其余协议详见官网

 

  • dubbo服务暴露流程?注册流程? 

 

  • zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?

可以的:启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用。源码分析如下:

 

  • dubbo 服务引用流程?

· 引用方式

      · 本地(JVM)引用

      · 远程引用

              · 直连引用

              · 基于注册中心引用      

· 引用时机

      · 饿汉式,是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务。通过 <dubbo:reference init="true"> 设置。

package org.springframework.beans.factory;

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

 ReferenceBean 实现 InitializingBean

package com.alibaba.dubbo.config.spring;

public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean {

  public void afterPropertiesSet() throws Exception {
    // 省略.....
  }

}

       · 懒汉式(默认),在 ReferenceBean 对应的服务被注入到其他类中时引用 -> 调用 ReferenceBean 的 getObject  方法

package org.springframework.beans.factory;

public interface FactoryBean<T> {

    T getObject() throws Exception;

}

  ReferenceBean 实现 FactoryBean

package com.alibaba.dubbo.config.spring;

public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean {

    public Object getObject() throws Exception {
        return this.get();
    }
}

 · 引用流程分析:基于注册中心引用 + 懒汉式引用

pass:此图基于「官网源码分析」配合官网开车效果更好.....

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值