mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-17 22:53:43 +08:00
fix img
This commit is contained in:
@@ -332,10 +332,10 @@ function hide_canvas() {
|
||||
}
|
||||
</code></pre>
|
||||
<p>当使用独享连接的时候,对每个 Service 建立固定数量的 Client,每个 Client 维护一个底层连接。如下图所示,就是针对每个 Service 都启动了两个独享连接:</p>
|
||||
<p><img src="assets/CgqCHl-OqnqAD_WFAAGYtk5Nou4688.png" alt="Lark20201020-171207.png" /></p>
|
||||
<p><img src="assets/CgqCHl-OqnqAD_WFAAGYtk5Nou4688.png" alt="png" /></p>
|
||||
<p>Service 独享连接示意图</p>
|
||||
<p>当使用共享连接的时候,会区分不同的网络地址(host:port),一个地址只建立固定数量的共享连接。如下图所示,Provider 1 暴露了多个服务,Consumer 引用了 Provider 1 中的多个服务,共享连接是说 Consumer 调用 Provider 1 中的多个服务时,是通过固定数量的共享 TCP 长连接进行数据传输,这样就可以达到减少服务端连接数的目的。</p>
|
||||
<p><img src="assets/Ciqc1F-OqoOAHURKAAF2m0HX5qU972.png" alt="Lark20201020-171159.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-OqoOAHURKAAF2m0HX5qU972.png" alt="png" /></p>
|
||||
<p>Service 共享连接示意图</p>
|
||||
<p>那怎么去创建共享连接呢?<strong>创建共享连接的实现细节是在 getSharedClient() 方法中</strong>,它首先从 referenceClientMap 缓存(Map<String, List<code><ReferenceCountExchangeClient></code>> 类型)中查询 Key(host 和 port 拼接成的字符串)对应的共享 Client 集合,如果查找到的 Client 集合全部可用,则直接使用这些缓存的 Client,否则要创建新的 Client 来补充替换缓存中不可用的 Client。示例代码如下:</p>
|
||||
<pre><code>private List<ReferenceCountExchangeClient> getSharedClient(URL url, int connectNum) {
|
||||
@@ -379,7 +379,7 @@ function hide_canvas() {
|
||||
</code></pre>
|
||||
<p>这里使用的 ExchangeClient 实现是 ReferenceCountExchangeClient,它是 ExchangeClient 的一个装饰器,在原始 ExchangeClient 对象基础上添加了引用计数的功能。</p>
|
||||
<p>ReferenceCountExchangeClient 中除了持有被修饰的 ExchangeClient 对象外,还有一个 referenceCount 字段(AtomicInteger 类型),用于记录该 Client 被应用的次数。从下图中我们可以看到,在 ReferenceCountExchangeClient 的构造方法以及 incrementAndGetCount() 方法中会增加引用次数,在 close() 方法中则会减少引用次数。</p>
|
||||
<p><img src="assets/Ciqc1F-OqqeAHAStAAF3BXy1LnA608.png" alt="Drawing 2.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-OqqeAHAStAAF3BXy1LnA608.png" alt="png" /></p>
|
||||
<p>referenceCount 修改调用栈</p>
|
||||
<p>这样,对于同一个地址的共享连接,就可以满足两个基本需求:</p>
|
||||
<ol>
|
||||
@@ -417,7 +417,7 @@ private void replaceWithLazyClient() {
|
||||
}
|
||||
</code></pre>
|
||||
<p>LazyConnectExchangeClient 也是 ExchangeClient 的装饰器,它会在原有 ExchangeClient 对象的基础上添加懒加载的功能。LazyConnectExchangeClient 在构造方法中不会创建底层持有连接的 Client,而是在需要发送请求的时候,才会调用 initClient() 方法进行 Client 的创建,如下图调用关系所示:</p>
|
||||
<p><img src="assets/CgqCHl-OqrqAHcvUAAC9KpqKEBQ887.png" alt="Drawing 3.png" /></p>
|
||||
<p><img src="assets/CgqCHl-OqrqAHcvUAAC9KpqKEBQ887.png" alt="png" /></p>
|
||||
<p>initClient() 方法的调用位置</p>
|
||||
<p>initClient() 方法的具体实现如下:</p>
|
||||
<pre><code>private void initClient() throws RemotingException {
|
||||
|
||||
Reference in New Issue
Block a user