目录
zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?
-
dubbo 提供了几种均衡策略?
-
废话不多说,首先概览官方文档:Dubbo「负载均衡」;UML图如下
浏览了许多,还是直接上官网的负载均衡源码详解。
-
dubbo各通信协议对比?
- Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
- RMI 协议采用 JDK 标准的
java.rmi.*
实现,采用阻塞式短连接和 JDK 标准序列化方式。 - Hessian协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
- 基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现。
- 基于 WebService 的远程调用协议,基于 Apache CXF 的
frontend-simple
和transports-http
实现 。
dubbo:// | rmi:// | hessian:// | http:// | webservice:// | |
---|---|---|---|---|---|
连接个数 | 单连接 | 多连接 | 多连接 | 多连接 | 多连接 |
连接方式 | 长连接 | 短连接 | 短连接 | 短连接 | 短连接 |
传输协议 | TCP | TCP | HTTP | HTTP | HTTP |
传输方式 | 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:此图基于「官网源码分析」配合官网开车效果更好.....