dubbo
<h2>1 dubbo工作原理</h2>
<p>dubbo是一个分布式服务治理框架,致力于提供高性能和透明化的RPC远程服务调用。</p>
<h3>1.1 dubbo层次结构</h3>
<ul>
<li>第一层:service 层,接口层,给服务提供者和消费者来实现的</li>
<li>第二层:config 层,配置层,主要是对 dubbo 进行各种配置的</li>
<li>第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信</li>
<li>第四层:registry 层,服务注册层,负责服务的注册与发现</li>
<li>第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务</li>
<li>第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控</li>
<li>第七层:protocal 层,远程调用层,封装 rpc 调用</li>
<li>第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步</li>
<li>第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口</li>
<li>第十层:serialize 层,数据序列化层</li>
</ul>
<h3>1.2 工作流程</h3>
<ul>
<li>第一步:provider 向注册中心去注册</li>
<li>第二步:consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务</li>
<li>第三步:consumer 调用 provider</li>
<li>第四步:consumer 和 provider 都异步通知监控中心</li>
</ul>
<p>注:注册中心挂了也可以继续通信,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信。</p>
<h3>1.3 dubbo序列化和通信协议</h3>
<p>序列化,就是把数据结构或者是一些对象,转换为二进制串的过程,而反序列化是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
<img src="https://s2.ax1x.com/2019/12/17/QIGjFU.png" alt="正反序列化" /></p>
<p>dubbo 支持 hession、Java 二进制序列化、json、SOAP 文本序列化多种序列化协议。但是 hessian 是其默认的序列化协议。</p>
<h4>1.3.1 Hessian 的数据类型</h4>
<p>8 种原始类型:</p>
<ul>
<li>原始二进制数据</li>
<li>boolean</li>
<li>64-bit date(64 位毫秒值的日期)</li>
<li>64-bit double</li>
<li>32-bit int</li>
<li>64-bit long</li>
<li>null</li>
<li>UTF-8 编码的 string</li>
</ul>
<p>还包括 3 种递归类型:</p>
<ul>
<li>list for lists and arrays</li>
<li>map for maps and dictionaries</li>
<li>object for objects</li>
</ul>
<p>还有一种特殊的类型:</p>
<ul>
<li>ref:用来表示对共享对象的引用。</li>
</ul>
<h4>1.3.2 支持的通信协议</h4>
<ul>
<li>dubbo 协议,默认就是走 dubbo 协议,单一长连接,进行的是 NIO 异步通信,
基于 hessian 作为序列化协议。使用的场景是:传输数据量小(每次请求在 100kb 以内),但是并发量很高。</li>
</ul>
<p>长连接,通俗点说,就是建立连接过后可以持续发送请求,无须再建立连接。
<img src="https://s2.ax1x.com/2019/12/17/QIGxW4.png" alt="长连接" /></p>
<p>而短连接,每次要发送请求之前,需要先重新建立一次连接。
<img src="https://s2.ax1x.com/2019/12/17/QIGvYF.png" alt="短连接" /></p>
<ul>
<li>rmi 协议,走 Java 二进制序列化,多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。</li>
<li>hessian 协议,走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多的情况,适用于文件的传输,一般较少用。</li>
<li>http 协议,走 json 序列化。</li>
<li>webservice,走 SOAP 文本序列化。
<h4>1.3.3 Protocol Buffer是什么</h4>
<p>Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,是 Google 出品的一种轻量并且高效的结构化数据存储格式,性能比 JSON、XML 要高很多。</p></li>
</ul>
<p>之所以性能如此好,主要得益于两个:第一,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,
应该比 XML 和 JSON 快上了 20~100 倍;第二,它的数据压缩效果好,就是说它序列化后的数据量体积小(比xml和json小3到10倍)。
因为体积小,传输起来带宽和速度上会有优化。</p>
<h2>2 dubbo策略</h2>