You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by gi...@apache.org on 2023/06/01 07:45:30 UTC
[dubbo-website] branch cn-site updated: deploy: 56e547b006b3620387203b5512a0b687f742cf06
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch cn-site
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git
The following commit(s) were added to refs/heads/cn-site by this push:
new ac099a8f2d deploy: 56e547b006b3620387203b5512a0b687f742cf06
ac099a8f2d is described below
commit ac099a8f2dee13ce8df2cc3b6ea6ff910f284f73
Author: AlbumenJ <Al...@users.noreply.github.com>
AuthorDate: Thu Jun 1 07:45:23 2023 +0000
deploy: 56e547b006b3620387203b5512a0b687f742cf06
---
.../metrics-source-blog/event-dispatch-simple.png | Bin 50473 -> 43389 bytes
sitemap.xml | 2 +-
.../index.html" | 16 +++++------
.../index.html" | 4 +--
zh-cn/blog/index.xml | 31 ++++++++++-----------
zh-cn/blog/java/codeanalysis/metrics/index.xml | 29 ++++++++++---------
zh-cn/blog/proposals/index.xml | 2 +-
zh-cn/index.xml | 31 ++++++++++-----------
.../adaptive-concurrency-control/index.html | 6 ++--
.../performance/index.xml | 2 +-
.../java-sdk/reference-manual/qos/index.xml | 1 +
.../qos/service-management/index.html | 6 ++--
zh-cn/sitemap.xml | 2 +-
zh-cn/tags/java/index.xml | 29 ++++++++++---------
.../index.xml" | 29 ++++++++++---------
15 files changed, 93 insertions(+), 97 deletions(-)
diff --git a/imgs/blog/metrics-source-blog/event-dispatch-simple.png b/imgs/blog/metrics-source-blog/event-dispatch-simple.png
index 41c521aa76..e72b2fe281 100644
Binary files a/imgs/blog/metrics-source-blog/event-dispatch-simple.png and b/imgs/blog/metrics-source-blog/event-dispatch-simple.png differ
diff --git a/sitemap.xml b/sitemap.xml
index 6b5a1cd909..31a0397bdd 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>https://cn.dubbo.apache.org/zh-cn/sitemap.xml</loc><lastmod>2023-06-01T15:40:02+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2023-05-10T11:59:30+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>https://cn.dubbo.apache.org/zh-cn/sitemap.xml</loc><lastmod>2023-06-01T15:40:57+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2023-05-10T11:59:30+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
diff --git "a/zh-cn/blog/2023/04/28/2-\346\214\207\346\240\207\346\224\266\351\233\206\345\231\250\347\232\204\346\214\207\346\240\207\351\207\207\351\233\206\346\265\201\347\250\213/index.html" "b/zh-cn/blog/2023/04/28/2-\346\214\207\346\240\207\346\224\266\351\233\206\345\231\250\347\232\204\346\214\207\346\240\207\351\207\207\351\233\206\346\265\201\347\250\213/index.html"
index 7130406b2a..b2403b57d3 100644
--- "a/zh-cn/blog/2023/04/28/2-\346\214\207\346\240\207\346\224\266\351\233\206\345\231\250\347\232\204\346\214\207\346\240\207\351\207\207\351\233\206\346\265\201\347\250\213/index.html"
+++ "b/zh-cn/blog/2023/04/28/2-\346\214\207\346\240\207\346\224\266\351\233\206\345\231\250\347\232\204\346\214\207\346\240\207\351\207\207\351\233\206\346\265\201\347\250\213/index.html"
@@ -1,4 +1,4 @@
-<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/blog/2023/04/28/2-%E6%8C%87%E6%A0%87%E6%94%B6%E9%9B%86%E5%99%A8%E7%9A%84%E6%8C%87%E6%A0%87%E9%87%87%E9%9B%86%E6%B5%81%E7%A8%8B/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBe [...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/blog/2023/04/28/2-%E6%8C%87%E6%A0%87%E6%94%B6%E9%9B%86%E5%99%A8%E7%9A%84%E6%8C%87%E6%A0%87%E9%87%87%E9%9B%86%E6%B5%81%E7%A8%8B/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBe [...]
<script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css as=style><link href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/a [...]
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@docsearch/css@3><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="Dubbo 指标模块源码分析-指标收集器的指标采集流程"><meta property="og:description" content="Dubbo 指标模块源码分析-指标收集器的指标采集流程"><meta name=twitter:description content="Dubbo 指标模块源码分析-指标收集器的指标采集流程"><meta property="og:url" content="https://cn.dubbo.apache.org/zh-cn/blog/2023/04/28/2-%E6%8C%87%E6%A0%87%E6%94%B6%E9%9B%86%E5%99%A [...]
<link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/zh-cn/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class=" [...]
@@ -217,7 +217,7 @@
</span></span><span style=display:flex><span> stats<span style=color:#719e07>.</span>calcServiceKeyRt<span style=color:#719e07>(</span>applicationName<span style=color:#719e07>,</span> serviceKey<span style=color:#719e07>,</span> registryOpType<span style=color:#719e07>,</span> responseTime<span style=color:#719e07>);</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
</span></span><span style=display:flex><span><span style=color:#719e07>...</span>
-</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p><p>setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的 子Composite),这个方法实质上是对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</p><p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口仅作为常量类使用,初始化时进行了以下操作:</p><div class=highlight><pre tabindex=0 style=color:#93a [...]
+</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p><p>其在<strong>数据聚合器层面的调用链路</strong>可以总结为:setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的子聚合器),这个方法实质上是<strong>对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</strong></p><p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口本身作为常量类使用,并在初始化时<strong>注册真正的指标 [...]
</span></span></span><span style=display:flex><span><span style=color:#586e75></span>MetricsCat APPLICATION_NOTIFY_FINISH <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> MetricsCat<span style=color:#719e07>(</span>MetricsKey<span style=color:#719e07>.</span>NOTIFY_METRIC_NUM_LAST<span style=color:#719e07>,</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>(</span>key<span style=color:#719e07>,</span> placeType<span style=color:#719e07>,</span> collector<span style=color:#719e07>)</span> <span style=color:#719e07>-></span> AbstractMetricsListener<span style=color:#719e07>.</span>onFinish<span style=color:#719e07>(</span>key<span style=color:#719e07>,</span>
</span></span><span style=display:flex><span> event <span style=color:#719e07>-></span> <span style=color:#719e07>{</span>
@@ -239,7 +239,7 @@
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>));</span>
</span></span><span style=display:flex><span><span style=color:#586e75>//...
-</span></span></span></code></pre></div><p>看上去很混乱。我们需要先搞清楚此处的 MetricsCat 到底是什么 ?</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>MetricsCat</span> <span style=color:#719e07>{</span>
+</span></span></span></code></pre></div><p>此处声明的指标常量都是 MetricsCat 类型的。其中部分常量在创建时还传入了该指标的收集逻辑,如Key 为 NOTIFY_METRIC_NUM_LAST 的常量。以下为 MetricsCat 的定义:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>MetricsCat</span> <span style=color:#719e0 [...]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> MetricsPlaceType placeType<span style=color:#719e07>;</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#268bd2>final</span> Function<span style=color:#719e07><</span>CombMetricsCollector<span style=color:#719e07><</span>TimeCounterEvent<span style=color:#719e07>>,</span> AbstractMetricsListener<span style=color:#719e07>></span> eventFunc<span style=color:#719e07>;</span>
@@ -267,7 +267,7 @@
</span></span><span style=display:flex><span> R <span style=color:#268bd2>apply</span><span style=color:#719e07>(</span>T t<span style=color:#719e07>,</span> U u<span style=color:#719e07>,</span> K k<span style=color:#719e07>);</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
</span></span><span style=display:flex><span><span style=color:#719e07>}</span>
-</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,分别是获取其内部属性的,可以认为它本身只是 eventFunc 字段的载体。而这个eventFunc 负责生产 <code>AbstractMetricsListener</code>(指标监听器),因此 <code>MetricsCat</code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,不过用户需要传入这个监听器的处理逻辑。</p><p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector<TimeCounterEvent></code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code [...]
+</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,都是获取其内部属性的。</p><p>其实质上 eventFunc 字段的载体,提供了为特定指标生产监听器的逻辑,因此 <code>MetricsCat</code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,用户在创建时传入这个监听器的处理逻辑。</p><p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector<TimeCounterEvent></code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供,借此实现延迟初始化。</p> [...]
</span></span></span><span style=display:flex><span><span style=color:#586e75></span><span style=color:#719e07>new</span> MetricsCat<span style=color:#719e07>(</span>MetricsKey<span style=color:#719e07>.</span>NOTIFY_METRIC_NUM_LAST<span style=color:#719e07>,</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>(</span>key<span style=color:#719e07>,</span> placeType<span style=color:#719e07>,</span> collector<span style=color:#719e07>)</span> <span style=color:#719e07>-></span> AbstractMetricsListener<span style=color:#719e07>.</span>onFinish<span style=color:#719e07>(</span>key<span style=color:#719e07>,</span>
</span></span><span style=display:flex><span> event <span style=color:#719e07>-></span> <span style=color:#719e07>{</span>
@@ -422,15 +422,15 @@
</span></span></span><span style=display:flex><span><span style=color:#586e75></span> sampleConfigure<span style=color:#719e07>.</span>getFireEventHandler<span style=color:#719e07>().</span>accept<span style=color:#719e07>(</span>sampleConfigure<span style=color:#719e07>);</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
-</span></span></code></pre></div><p><code>doExecute</code> 做了三件事:</p><p>1,判断当前指标是否存在,如果不存在就放到容器中</p><p>2,调用提供的counter函数对指标进行修改</p><p>3,如果需要发布事件,通过子类重写方法提供的事件发布函数发布事件</p><p>具体地,<code>doExecute</code> 通过 <strong><code>countConfigure</code></strong> 方法为 SampleConfigure 设置事件发布函数,对应的是 SampleConfigure 实例内部的 fireEventHandler 字段。</p><p>截至本文发布为止,fireEventHandler 均使用一个默认空实现,即什么也不做。也就是说,目前实现自 SimpleMetricsCountSampler 的采样器都不会发布事件,此处的设计是为以后可能发布事件的其它采样器预留的。</p><ul><li>DefaultMetricsCollector 中 Simple [...]
+</span></span></code></pre></div><p><code>doExecute</code> 做了两件事:</p><p>1,判断当前指标是否存在,如果不存在就放到容器中。</p><p>2,调用提供的计数函数对指标进行修改,对应 counter 字段。</p><p>以下为各采样器在 countConfigure 方法中提供的创建指标实例的逻辑:</p><ul><li>DefaultMetricsCollector 中 SimpleMetricsCountSampler 的匿名实现 (applicationSampler)提供的<code>countConfigure</code> 方法:</li></ul><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span styl [...]
</span></span><span style=display:flex><span> <span style=color:#268bd2>protected</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>countConfigure</span><span style=color:#719e07>(</span>
</span></span><span style=display:flex><span> MetricsCountSampleConfigurer<span style=color:#719e07><</span>String<span style=color:#719e07>,</span> MetricsEvent<span style=color:#719e07>.</span>Type<span style=color:#719e07>,</span> ApplicationMetric<span style=color:#719e07>></span> sampleConfigure<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
-</span></span><span style=display:flex><span> <span style=color:#586e75>//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style=display:flex><span> <span style=color:#586e75>//提供根据 configure 创建指标实例的函数
</span></span></span><span style=display:flex><span><span style=color:#586e75></span> sampleConfigure<span style=color:#719e07>.</span>configureMetrics<span style=color:#719e07>(</span>configure <span style=color:#719e07>-></span> <span style=color:#719e07>new</span> ApplicationMetric<span style=color:#719e07>(</span>sampleConfigure<span style=color:#719e07>.</span>getSource<span style=color:#719e07>()));</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
</span></span></code></pre></div><ul><li>ThreadRejectMetricsCountSampler 中提供的 <code>countConfigure</code> 方法:</li></ul><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>protected</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>countConfigure</span><span style=color:#719e07>(</span>MetricsCountSampleConfigurer<span style=color:#719e07><</span>String<span style=color:#719e07>,</span> String<span style=color:#719e07>,</span> ThreadPoolRejectMetric<span style=color:#719e07>></span> sampleConfigure<span style=color:#719e07>)</span> <span style=color:#719e0 [...]
-</span></span><span style=display:flex><span> <span style=color:#586e75>//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style=display:flex><span> <span style=color:#586e75>//提供根据 configure 创建指标实例的函数
</span></span></span><span style=display:flex><span><span style=color:#586e75></span> sampleConfigure<span style=color:#719e07>.</span>configureMetrics<span style=color:#719e07>(</span>configure <span style=color:#719e07>-></span> <span style=color:#719e07>new</span> ThreadPoolRejectMetric<span style=color:#719e07>(</span>collector<span style=color:#719e07>.</span>getApplicationName<span style=color:#719e07>(),</span>configure<span style=color:#719e07>.</span>getSource<span sty [...]
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
</span></span></code></pre></div><hr><p>默认指标收集器继承自 CombMetricsCollector,内部包含一个 DefaultSubDispatcher,因此它自身也可以作为指标事件的转发器,接受其它指标监听器的注册。</p><p>在之前,我们发现了 AggregateMetricsCollector(聚合指标收集器)会将自己注册为 DefaultMetricsCollector 的监听器:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#268bd2>Aggr [...]
@@ -451,7 +451,7 @@
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>registerListener</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span> applicationModel<span style=color:#719e07>.</span>getBeanFactory<span style=color:#719e07>().</span>getBean<span style=color:#719e07>(</span>DefaultMetricsCollector<span style=color:#719e07>.</span>class<span style=color:#719e07>).</span [...]
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
-</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(RPC请求失败事件)。</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
+</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(请求前失败事件:实际请求发送之前在 ClusterFilter 中产生的异常)。</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#dc322f>boolean</span> <span style=color:#268bd2>isSupport</span><span style=color:#719e07>(</span>MetricsEvent event<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> event <span style=color:#719e07>instanceof</span> RequestEvent <span style=color:#719e07>||</span> event <span style=color:#719e07>instanceof</span> RequestBeforeEvent<span style=color:#719e07>;</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>}</span>
diff --git "a/zh-cn/blog/2023/05/26/google-paper-\351\235\242\345\220\221\344\272\221\346\227\266\344\273\243\347\232\204\345\272\224\347\224\250\345\274\200\345\217\221\346\226\260\346\250\241\345\274\217/index.html" "b/zh-cn/blog/2023/05/26/google-paper-\351\235\242\345\220\221\344\272\221\346\227\266\344\273\243\347\232\204\345\272\224\347\224\250\345\274\200\345\217\221\346\226\260\346\250\241\345\274\217/index.html"
index 3ea756ae84..dd8afcb176 100644
--- "a/zh-cn/blog/2023/05/26/google-paper-\351\235\242\345\220\221\344\272\221\346\227\266\344\273\243\347\232\204\345\272\224\347\224\250\345\274\200\345\217\221\346\226\260\346\250\241\345\274\217/index.html"
+++ "b/zh-cn/blog/2023/05/26/google-paper-\351\235\242\345\220\221\344\272\221\346\227\266\344\273\243\347\232\204\345\272\224\347\224\250\345\274\200\345\217\221\346\226\260\346\250\241\345\274\217/index.html"
@@ -1,4 +1,4 @@
-<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/blog/2023/05/26/google-paper-%E9%9D%A2%E5%90%91%E4%BA%91%E6%97%B6%E4%BB%A3%E7%9A%84%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%96%B0%E6%A8%A1%E5%BC%8F/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e [...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/blog/2023/05/26/google-paper-%E9%9D%A2%E5%90%91%E4%BA%91%E6%97%B6%E4%BB%A3%E7%9A%84%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%96%B0%E6%A8%A1%E5%BC%8F/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e [...]
<script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css as=style><link href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/a [...]
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@docsearch/css@3><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="面向云时代的应用开发新模式:谷歌发布的关于单体&微服务开发与部署的论文,文中原型实现为 Service Weaver"><meta property="og:description" content="面向云时代的应用开发新模式:谷歌发布的关于单体&微服务开发与部署的论文,文中原型实现为 Service Weaver"><meta name=twitter:description content="面向云时代的应用开发新模式:谷歌发布的关于单体&微服务开发与部署的论文,文中原型实现为 Service Weaver"><meta property="og:url" content="htt [...]
<link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/zh-cn/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class=" [...]
@@ -201,7 +201,7 @@ HOTOS ’23, June 22–24, 2023, Providence, RI, USA
ACM ISBN 979-8-4007-0195-5/23/06.
<a href=https://doi.org/10.1145/3593856.3595909>https://doi.org/10.1145/3593856.3595909</a></p></blockquote><h2 id=摘要>摘要</h2><p>在编写分布式应用程序时,传统的明智做法是将您的应用程序拆分为可以分别拉起的独立服务。这种方式的用意是好的,但像这样基于微服务的架构经常会适得其反,带来的挑战抵消了架构试图实现的好处。从根本上说,这是因为微服务将逻辑边界(代码的编写方式)与物理边界(代码的部署方式)混为一谈。在本文中,我们提出了一种不同的编程方法,将两者(代码编写与部署方式)分离以解决这些挑战。通过我们的方法,开发人员将他们的应用程序编写为逻辑上的单体,将有关如何分发和运行应用程序的决策放到一套自动化运行时 (runtime),并以原子方式部署应用程序。与当前的微服务开发模式相比,我们的原型应用最多可减少延迟 15 倍、�
��本最多减少了 9 倍。</p><p>ACM 参考格式:
Sanjay Ghemawat, Robert Grandl, Srdjan Petrovic, Michael Whit-taker, Parveen Patel, Ivan Posva, Amin Vahdat. 2023. Towards Mod-ern Development of Cloud Applications. In Workshop on Hot Topics in Operating Systems (HOTOS ’23), June 22–24, 2023, Providence, RI, USA. ACM, New York, NY, USA, 8 pages. <a href=https://doi.org/10.1145/3593856.3595909>https://doi.org/10.1145/3593856.3595909</a></p><h2 id=1-介绍>1 介绍</h2><p>近年来,云计算出现了前所未有的增长。编写和部署可扩展到数百万用户的分布式应用程序从未如此简单,这在很大程度上归功于 Kubernetes [25] 等 [...]
-通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制报可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
+通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制包可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
然而,将应用程序拆分为可独立部署的微服务并非没有挑战,其中一些直接与收益相矛盾。</p><ul><li>C1:影响性能。序列化数据并通过网络发送数据的开销越来越成为瓶颈 [72]。当开发人员过度拆分他们的应用程序时,这些开销也会增加 [55]。</li><li>C2:损害正确性。推断每个微服务的每个已部署版本之间的交互是极具挑战性的。在对八个广泛使用的系统的 100 多个灾难性故障进行的案例研究中,三分之二的故障是由系统的多个版本之间的交互引起的 [78]。</li><li>C3:很难管理。开发人员必须按照自己的发布计划管理不同的二进制包,而不是使用一个二进制文件来构建、测试和部署。如果在本地运行一个应用程序,同时需要执行端到端的集成测试,那可是一个不小的工程。</li><li>C4:API 冻结。一旦微服务建立了 API,就很难在不破坏使用该 API 的其他�
�务的情况下进行更改。遗留的 API 不得不长期存在,只能不停的在上面打补丁。</li><li>C5:降低应用程序的开发速度。当开发活动影响多个微服务的更改时,开发人员无法以原子方式实施和部署更改。</li></u [...]
API 的实现者是运行时,它负责所有控制平面操作。运行时决定 <code>proclet</code> 应该如何运行以及在何处运行。例如,多进程运行时可以运行子进程中的每个 <code>proclet</code>; SSH 运行时可以通过 SSH 运行 <code>proclet</code>;云运行时可以将 <code>proclet</code> 作为 Kubernetes pod [25、28] 运行。</p><p>具体而言,<code>proclet</code> 通过 Unix Pipeline 与运行时交互。例如,当构造一个 <code>proclet</code> 时,它会通过管道发送一条 <code>RegisterReplica</code> 消息,以将自己标记为活动和就绪。它定期发出 <code>ComponentsToHost</code> 请求以了解它应该运行哪些组件。如果组件调用不同组件的方法,<code>proclet</code> 会发出 <code>StartComponent</code> 请求以确保它已启动。</p><p>运行时以对 [...]
为了解决这些复杂性,我们提出了一种不同的方法。运行时确保应用程序版本以原子方式推出,这意味着所有组件通信都发生在应用程序的单个版本中。运行时逐渐将流量从旧版本转移到新版本,但是一旦用户请求转发到特定版本,它就会完全在该版本内处理。原子部署的一种流行实现是使用蓝/绿部署[9]。</p><h2 id=5-启用创新>5 启用创新</h2><h3 id=51-传输transport放置placement和缩容scaling>5.1 传输(Transport)、放置(Placement)和缩容(Scaling)</h3><p>运行时可以鸟瞰应用程序执行,这为性能优化开辟了新途径。例如,我们的框架可以在组件之间构建一个细粒度的调用图,并用它来识别关键的路径路径、瓶颈组件、频繁交互型组件等。使用这些信息,运行时可以做出更智能的扩缩容、独立部署和组合部署决策。此外,由于序列化和传输机制对开发者透明(Co
de Generate 机制自动实现),运行时可以自由地优化它们。例如,对于网络瓶颈应用程序,运行时可能决定压缩网络上的消息,对于某些部署,传输可能会利用 RDMA [32] 等技术。< [...]
diff --git a/zh-cn/blog/index.xml b/zh-cn/blog/index.xml
index 8dde84e64a..a2c91871f0 100644
--- a/zh-cn/blog/index.xml
+++ b/zh-cn/blog/index.xml
@@ -1687,7 +1687,7 @@ ACM ISBN 979-8-4007-0195-5/23/06.
Sanjay Ghemawat, Robert Grandl, Srdjan Petrovic, Michael Whit-taker, Parveen Patel, Ivan Posva, Amin Vahdat. 2023. Towards Mod-ern Development of Cloud Applications. In Workshop on Hot Topics in Operating Systems (HOTOS ’23), June 22–24, 2023, Providence, RI, USA. ACM, New York, NY, USA, 8 pages. <a href="https://doi.org/10.1145/3593856.3595909">https://doi.org/10.1145/3593856.3595909</a></p>
<h2 id="1-介绍">1 介绍</h2>
<p>近年来,云计算出现了前所未有的增长。编写和部署可扩展到数百万用户的分布式应用程序从未如此简单,这在很大程度上归功于 Kubernetes [25] 等框架,[7, 18, 31, 33, 40, 60] 等消息传递解决方案,以及数据格式如 [5,6, 23, 30]。使用这些技术时,普遍的做法是手动将您的应用程序拆分为可以独立部署的独立微服务。
-通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制报可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
+通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制包可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
然而,将应用程序拆分为可独立部署的微服务并非没有挑战,其中一些直接与收益相矛盾。</p>
<ul>
<li>C1:影响性能。序列化数据并通过网络发送数据的开销越来越成为瓶颈 [72]。当开发人员过度拆分他们的应用程序时,这些开销也会增加 [55]。</li>
@@ -2074,8 +2074,8 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">...</span>
</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p>
-<p>setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的 子Composite),这个方法实质上是对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</p>
-<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口仅作为常量类使用,初始化时进行了以下操作:</p>
+<p>其在<strong>数据聚合器层面的调用链路</strong>可以总结为:setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的子聚合器),这个方法实质上是<strong>对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</strong></p>
+<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口本身作为常量类使用,并在初始化时<strong>注册真正的指标常量</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>MetricsCat APPLICATION_NOTIFY_FINISH <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -2098,7 +2098,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">));</span>
</span></span><span style="display:flex;"><span><span style="color:#586e75">//...
-</span></span></span></code></pre></div><p>看上去很混乱。我们需要先搞清楚此处的 MetricsCat 到底是什么 ?</p>
+</span></span></span></code></pre></div><p>此处声明的指标常量都是 MetricsCat 类型的。其中部分常量在创建时还传入了该指标的收集逻辑,如Key 为 NOTIFY_METRIC_NUM_LAST 的常量。以下为 MetricsCat 的定义:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">MetricsCat</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> MetricsPlaceType placeType<span style="color:#719e07">;</span>
@@ -2127,9 +2127,10 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> R <span style="color:#268bd2">apply</span><span style="color:#719e07">(</span>T t<span style="color:#719e07">,</span> U u<span style="color:#719e07">,</span> K k<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">}</span>
-</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,分别是获取其内部属性的,可以认为它本身只是 eventFunc 字段的载体。而这个eventFunc 负责生产 <code>AbstractMetricsListener</code>(指标监听器),因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,不过用户需要传入这个监听器的处理逻辑。</p>
-<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供。</p>
-<p>回到两个常量的初始化,它们在注册的 <code>TpFunction</code> 中定义的操作为:返回通过 <code>AbstractMetricsListener.onFinish</code> 获取的事件完成监听器。当指定 <code>MetricsKey</code> 的指标统计事件完成时,这个监听器中的 <code>onEventFinish</code> 方法就会被调用。 而 <code>MetricsCat</code> 构造时传入的 <code>MetricsKey</code> 会被作为 <code>AbstractMetricsListener</code> 的构造参数,用于指定监听的指标。</p>
+</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,都是获取其内部属性的。</p>
+<p>其实质上 eventFunc 字段的载体,提供了为特定指标生产监听器的逻辑,因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,用户在创建时传入这个监听器的处理逻辑。</p>
+<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供,借此实现延迟初始化。</p>
+<p>回到之前两个<strong>在 MCat 中定义了监听器生产方法</strong>的两个常量的初始化流程:它们在创建 MetricsCat 时传入的TpFunction中定义的操作为:返回通过 AbstractMetricsListener.onFinish获取的事件完成监听器。当指定MetricsKey 的指标统计事件完成时,这个监听器中的 onEventFinish 方法就会被调用。 而 MetricsCat 构造时传入的 MetricsKey 会被作为 AbstractMetricsListener 的构造参数,用于指定监听的指标。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -2321,19 +2322,17 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>getFireEventHandler<span style="color:#719e07">().</span>accept<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><code>doExecute</code> 做了三件事:</p>
-<p>1,判断当前指标是否存在,如果不存在就放到容器中</p>
-<p>2,调用提供的counter函数对指标进行修改</p>
-<p>3,如果需要发布事件,通过子类重写方法提供的事件发布函数发布事件</p>
-<p>具体地,<code>doExecute</code> 通过 <strong><code>countConfigure</code></strong> 方法为 SampleConfigure 设置事件发布函数,对应的是 SampleConfigure 实例内部的 fireEventHandler 字段。</p>
-<p>截至本文发布为止,fireEventHandler 均使用一个默认空实现,即什么也不做。也就是说,目前实现自 SimpleMetricsCountSampler 的采样器都不会发布事件,此处的设计是为以后可能发布事件的其它采样器预留的。</p>
+</span></span></code></pre></div><p><code>doExecute</code> 做了两件事:</p>
+<p>1,判断当前指标是否存在,如果不存在就放到容器中。</p>
+<p>2,调用提供的计数函数对指标进行修改,对应 counter 字段。</p>
+<p>以下为各采样器在 countConfigure 方法中提供的创建指标实例的逻辑:</p>
<ul>
<li>DefaultMetricsCollector 中 SimpleMetricsCountSampler 的匿名实现 (applicationSampler)提供的<code>countConfigure</code> 方法:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>
</span></span><span style="display:flex;"><span> MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> MetricsEvent<span style="color:#719e07">.</span>Type<span style="color:#719e07">,</span> ApplicationMetric<span style="color:#719e07">&gt;</span> sampleConfigure<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ApplicationMetric<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">.</span>getSource<span style="color:#719e07">()) [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><ul>
@@ -2341,7 +2340,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> String<span style="color:#719e07">,</span> ThreadPoolRejectMetric<span style="color:#719e07">&gt;& [...]
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ThreadPoolRejectMetric<span style="color:#719e07">(</span>collector<span style="color:#719e07">.</span>getApplicationName<span style="color:#719 [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><hr>
@@ -2366,7 +2365,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">registerListener</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> applicationModel<span style="color:#719e07">.</span>getBeanFactory<span style="color:#719e07">().</span>getBean<span style="color:#719e07">(</span>DefaultMetricsCollector< [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(RPC请求失败事件)。</p>
+</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(请求前失败事件:实际请求发送之前在 ClusterFilter 中产生的异常)。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#dc322f">boolean</span> <span style="color:#268bd2">isSupport</span><span style="color:#719e07">(</span>MetricsEvent event<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> event <span style="color:#719e07">instanceof</span> RequestEvent <span style="color:#719e07">||</span> event <span style="color:#719e07">instanceof</span> RequestBeforeEvent<span style="color:#719e07">;</span>
diff --git a/zh-cn/blog/java/codeanalysis/metrics/index.xml b/zh-cn/blog/java/codeanalysis/metrics/index.xml
index 8544541cd5..23c9777d51 100644
--- a/zh-cn/blog/java/codeanalysis/metrics/index.xml
+++ b/zh-cn/blog/java/codeanalysis/metrics/index.xml
@@ -126,8 +126,8 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">...</span>
</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p>
-<p>setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的 子Composite),这个方法实质上是对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</p>
-<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口仅作为常量类使用,初始化时进行了以下操作:</p>
+<p>其在<strong>数据聚合器层面的调用链路</strong>可以总结为:setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的子聚合器),这个方法实质上是<strong>对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</strong></p>
+<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口本身作为常量类使用,并在初始化时<strong>注册真正的指标常量</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>MetricsCat APPLICATION_NOTIFY_FINISH <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -150,7 +150,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">));</span>
</span></span><span style="display:flex;"><span><span style="color:#586e75">//...
-</span></span></span></code></pre></div><p>看上去很混乱。我们需要先搞清楚此处的 MetricsCat 到底是什么 ?</p>
+</span></span></span></code></pre></div><p>此处声明的指标常量都是 MetricsCat 类型的。其中部分常量在创建时还传入了该指标的收集逻辑,如Key 为 NOTIFY_METRIC_NUM_LAST 的常量。以下为 MetricsCat 的定义:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">MetricsCat</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> MetricsPlaceType placeType<span style="color:#719e07">;</span>
@@ -179,9 +179,10 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> R <span style="color:#268bd2">apply</span><span style="color:#719e07">(</span>T t<span style="color:#719e07">,</span> U u<span style="color:#719e07">,</span> K k<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">}</span>
-</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,分别是获取其内部属性的,可以认为它本身只是 eventFunc 字段的载体。而这个eventFunc 负责生产 <code>AbstractMetricsListener</code>(指标监听器),因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,不过用户需要传入这个监听器的处理逻辑。</p>
-<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供。</p>
-<p>回到两个常量的初始化,它们在注册的 <code>TpFunction</code> 中定义的操作为:返回通过 <code>AbstractMetricsListener.onFinish</code> 获取的事件完成监听器。当指定 <code>MetricsKey</code> 的指标统计事件完成时,这个监听器中的 <code>onEventFinish</code> 方法就会被调用。 而 <code>MetricsCat</code> 构造时传入的 <code>MetricsKey</code> 会被作为 <code>AbstractMetricsListener</code> 的构造参数,用于指定监听的指标。</p>
+</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,都是获取其内部属性的。</p>
+<p>其实质上 eventFunc 字段的载体,提供了为特定指标生产监听器的逻辑,因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,用户在创建时传入这个监听器的处理逻辑。</p>
+<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供,借此实现延迟初始化。</p>
+<p>回到之前两个<strong>在 MCat 中定义了监听器生产方法</strong>的两个常量的初始化流程:它们在创建 MetricsCat 时传入的TpFunction中定义的操作为:返回通过 AbstractMetricsListener.onFinish获取的事件完成监听器。当指定MetricsKey 的指标统计事件完成时,这个监听器中的 onEventFinish 方法就会被调用。 而 MetricsCat 构造时传入的 MetricsKey 会被作为 AbstractMetricsListener 的构造参数,用于指定监听的指标。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -373,19 +374,17 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>getFireEventHandler<span style="color:#719e07">().</span>accept<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><code>doExecute</code> 做了三件事:</p>
-<p>1,判断当前指标是否存在,如果不存在就放到容器中</p>
-<p>2,调用提供的counter函数对指标进行修改</p>
-<p>3,如果需要发布事件,通过子类重写方法提供的事件发布函数发布事件</p>
-<p>具体地,<code>doExecute</code> 通过 <strong><code>countConfigure</code></strong> 方法为 SampleConfigure 设置事件发布函数,对应的是 SampleConfigure 实例内部的 fireEventHandler 字段。</p>
-<p>截至本文发布为止,fireEventHandler 均使用一个默认空实现,即什么也不做。也就是说,目前实现自 SimpleMetricsCountSampler 的采样器都不会发布事件,此处的设计是为以后可能发布事件的其它采样器预留的。</p>
+</span></span></code></pre></div><p><code>doExecute</code> 做了两件事:</p>
+<p>1,判断当前指标是否存在,如果不存在就放到容器中。</p>
+<p>2,调用提供的计数函数对指标进行修改,对应 counter 字段。</p>
+<p>以下为各采样器在 countConfigure 方法中提供的创建指标实例的逻辑:</p>
<ul>
<li>DefaultMetricsCollector 中 SimpleMetricsCountSampler 的匿名实现 (applicationSampler)提供的<code>countConfigure</code> 方法:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>
</span></span><span style="display:flex;"><span> MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> MetricsEvent<span style="color:#719e07">.</span>Type<span style="color:#719e07">,</span> ApplicationMetric<span style="color:#719e07">&gt;</span> sampleConfigure<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ApplicationMetric<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">.</span>getSource<span style="color:#719e07">()) [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><ul>
@@ -393,7 +392,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> String<span style="color:#719e07">,</span> ThreadPoolRejectMetric<span style="color:#719e07">&gt;& [...]
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ThreadPoolRejectMetric<span style="color:#719e07">(</span>collector<span style="color:#719e07">.</span>getApplicationName<span style="color:#719 [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><hr>
@@ -418,7 +417,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">registerListener</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> applicationModel<span style="color:#719e07">.</span>getBeanFactory<span style="color:#719e07">().</span>getBean<span style="color:#719e07">(</span>DefaultMetricsCollector< [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(RPC请求失败事件)。</p>
+</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(请求前失败事件:实际请求发送之前在 ClusterFilter 中产生的异常)。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#dc322f">boolean</span> <span style="color:#268bd2">isSupport</span><span style="color:#719e07">(</span>MetricsEvent event<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> event <span style="color:#719e07">instanceof</span> RequestEvent <span style="color:#719e07">||</span> event <span style="color:#719e07">instanceof</span> RequestBeforeEvent<span style="color:#719e07">;</span>
diff --git a/zh-cn/blog/proposals/index.xml b/zh-cn/blog/proposals/index.xml
index 481df00981..bc5a6475cc 100644
--- a/zh-cn/blog/proposals/index.xml
+++ b/zh-cn/blog/proposals/index.xml
@@ -21,7 +21,7 @@ ACM ISBN 979-8-4007-0195-5/23/06.
Sanjay Ghemawat, Robert Grandl, Srdjan Petrovic, Michael Whit-taker, Parveen Patel, Ivan Posva, Amin Vahdat. 2023. Towards Mod-ern Development of Cloud Applications. In Workshop on Hot Topics in Operating Systems (HOTOS ’23), June 22–24, 2023, Providence, RI, USA. ACM, New York, NY, USA, 8 pages. <a href="https://doi.org/10.1145/3593856.3595909">https://doi.org/10.1145/3593856.3595909</a></p>
<h2 id="1-介绍">1 介绍</h2>
<p>近年来,云计算出现了前所未有的增长。编写和部署可扩展到数百万用户的分布式应用程序从未如此简单,这在很大程度上归功于 Kubernetes [25] 等框架,[7, 18, 31, 33, 40, 60] 等消息传递解决方案,以及数据格式如 [5,6, 23, 30]。使用这些技术时,普遍的做法是手动将您的应用程序拆分为可以独立部署的独立微服务。
-通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制报可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
+通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制包可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
然而,将应用程序拆分为可独立部署的微服务并非没有挑战,其中一些直接与收益相矛盾。</p>
<ul>
<li>C1:影响性能。序列化数据并通过网络发送数据的开销越来越成为瓶颈 [72]。当开发人员过度拆分他们的应用程序时,这些开销也会增加 [55]。</li>
diff --git a/zh-cn/index.xml b/zh-cn/index.xml
index 9848163644..198bdb0b01 100644
--- a/zh-cn/index.xml
+++ b/zh-cn/index.xml
@@ -1687,7 +1687,7 @@ ACM ISBN 979-8-4007-0195-5/23/06.
Sanjay Ghemawat, Robert Grandl, Srdjan Petrovic, Michael Whit-taker, Parveen Patel, Ivan Posva, Amin Vahdat. 2023. Towards Mod-ern Development of Cloud Applications. In Workshop on Hot Topics in Operating Systems (HOTOS ’23), June 22–24, 2023, Providence, RI, USA. ACM, New York, NY, USA, 8 pages. <a href="https://doi.org/10.1145/3593856.3595909">https://doi.org/10.1145/3593856.3595909</a></p>
<h2 id="1-介绍">1 介绍</h2>
<p>近年来,云计算出现了前所未有的增长。编写和部署可扩展到数百万用户的分布式应用程序从未如此简单,这在很大程度上归功于 Kubernetes [25] 等框架,[7, 18, 31, 33, 40, 60] 等消息传递解决方案,以及数据格式如 [5,6, 23, 30]。使用这些技术时,普遍的做法是手动将您的应用程序拆分为可以独立部署的独立微服务。
-通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制报可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
+通过对各种基础设施团队的内部调查,我们发现大多数开发人员出于以下原因之一将他们的应用程序拆分为多个二进制包:(1) 提升性能。单独的二进制包可以独立扩展,从而提高资源利用率。 (2) 提升容错能力。一个微服务的崩溃不会导致其他微服务崩溃,从而限制了错误的传播范围。 (3) 改进抽象边界。微服务需要清晰明确的 API,并且代码纠缠的可能性会大大降低。 (4) 允许灵活的滚动发布。不同的二进制包可以以不同的速率发布,从而导致更敏捷的代码升级。
然而,将应用程序拆分为可独立部署的微服务并非没有挑战,其中一些直接与收益相矛盾。</p>
<ul>
<li>C1:影响性能。序列化数据并通过网络发送数据的开销越来越成为瓶颈 [72]。当开发人员过度拆分他们的应用程序时,这些开销也会增加 [55]。</li>
@@ -2074,8 +2074,8 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">...</span>
</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p>
-<p>setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的 子Composite),这个方法实质上是对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</p>
-<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口仅作为常量类使用,初始化时进行了以下操作:</p>
+<p>其在<strong>数据聚合器层面的调用链路</strong>可以总结为:setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的子聚合器),这个方法实质上是<strong>对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</strong></p>
+<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口本身作为常量类使用,并在初始化时<strong>注册真正的指标常量</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>MetricsCat APPLICATION_NOTIFY_FINISH <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -2098,7 +2098,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">));</span>
</span></span><span style="display:flex;"><span><span style="color:#586e75">//...
-</span></span></span></code></pre></div><p>看上去很混乱。我们需要先搞清楚此处的 MetricsCat 到底是什么 ?</p>
+</span></span></span></code></pre></div><p>此处声明的指标常量都是 MetricsCat 类型的。其中部分常量在创建时还传入了该指标的收集逻辑,如Key 为 NOTIFY_METRIC_NUM_LAST 的常量。以下为 MetricsCat 的定义:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">MetricsCat</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> MetricsPlaceType placeType<span style="color:#719e07">;</span>
@@ -2127,9 +2127,10 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> R <span style="color:#268bd2">apply</span><span style="color:#719e07">(</span>T t<span style="color:#719e07">,</span> U u<span style="color:#719e07">,</span> K k<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">}</span>
-</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,分别是获取其内部属性的,可以认为它本身只是 eventFunc 字段的载体。而这个eventFunc 负责生产 <code>AbstractMetricsListener</code>(指标监听器),因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,不过用户需要传入这个监听器的处理逻辑。</p>
-<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供。</p>
-<p>回到两个常量的初始化,它们在注册的 <code>TpFunction</code> 中定义的操作为:返回通过 <code>AbstractMetricsListener.onFinish</code> 获取的事件完成监听器。当指定 <code>MetricsKey</code> 的指标统计事件完成时,这个监听器中的 <code>onEventFinish</code> 方法就会被调用。 而 <code>MetricsCat</code> 构造时传入的 <code>MetricsKey</code> 会被作为 <code>AbstractMetricsListener</code> 的构造参数,用于指定监听的指标。</p>
+</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,都是获取其内部属性的。</p>
+<p>其实质上 eventFunc 字段的载体,提供了为特定指标生产监听器的逻辑,因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,用户在创建时传入这个监听器的处理逻辑。</p>
+<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供,借此实现延迟初始化。</p>
+<p>回到之前两个<strong>在 MCat 中定义了监听器生产方法</strong>的两个常量的初始化流程:它们在创建 MetricsCat 时传入的TpFunction中定义的操作为:返回通过 AbstractMetricsListener.onFinish获取的事件完成监听器。当指定MetricsKey 的指标统计事件完成时,这个监听器中的 onEventFinish 方法就会被调用。 而 MetricsCat 构造时传入的 MetricsKey 会被作为 AbstractMetricsListener 的构造参数,用于指定监听的指标。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -2321,19 +2322,17 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>getFireEventHandler<span style="color:#719e07">().</span>accept<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><code>doExecute</code> 做了三件事:</p>
-<p>1,判断当前指标是否存在,如果不存在就放到容器中</p>
-<p>2,调用提供的counter函数对指标进行修改</p>
-<p>3,如果需要发布事件,通过子类重写方法提供的事件发布函数发布事件</p>
-<p>具体地,<code>doExecute</code> 通过 <strong><code>countConfigure</code></strong> 方法为 SampleConfigure 设置事件发布函数,对应的是 SampleConfigure 实例内部的 fireEventHandler 字段。</p>
-<p>截至本文发布为止,fireEventHandler 均使用一个默认空实现,即什么也不做。也就是说,目前实现自 SimpleMetricsCountSampler 的采样器都不会发布事件,此处的设计是为以后可能发布事件的其它采样器预留的。</p>
+</span></span></code></pre></div><p><code>doExecute</code> 做了两件事:</p>
+<p>1,判断当前指标是否存在,如果不存在就放到容器中。</p>
+<p>2,调用提供的计数函数对指标进行修改,对应 counter 字段。</p>
+<p>以下为各采样器在 countConfigure 方法中提供的创建指标实例的逻辑:</p>
<ul>
<li>DefaultMetricsCollector 中 SimpleMetricsCountSampler 的匿名实现 (applicationSampler)提供的<code>countConfigure</code> 方法:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>
</span></span><span style="display:flex;"><span> MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> MetricsEvent<span style="color:#719e07">.</span>Type<span style="color:#719e07">,</span> ApplicationMetric<span style="color:#719e07">&gt;</span> sampleConfigure<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ApplicationMetric<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">.</span>getSource<span style="color:#719e07">()) [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><ul>
@@ -2341,7 +2340,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> String<span style="color:#719e07">,</span> ThreadPoolRejectMetric<span style="color:#719e07">&gt;& [...]
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ThreadPoolRejectMetric<span style="color:#719e07">(</span>collector<span style="color:#719e07">.</span>getApplicationName<span style="color:#719 [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><hr>
@@ -2366,7 +2365,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">registerListener</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> applicationModel<span style="color:#719e07">.</span>getBeanFactory<span style="color:#719e07">().</span>getBean<span style="color:#719e07">(</span>DefaultMetricsCollector< [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(RPC请求失败事件)。</p>
+</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(请求前失败事件:实际请求发送之前在 ClusterFilter 中产生的异常)。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#dc322f">boolean</span> <span style="color:#268bd2">isSupport</span><span style="color:#719e07">(</span>MetricsEvent event<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> event <span style="color:#719e07">instanceof</span> RequestEvent <span style="color:#719e07">||</span> event <span style="color:#719e07">instanceof</span> RequestBeforeEvent<span style="color:#719e07">;</span>
diff --git a/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/index.html b/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/index.html
index b833db9f32..371179576a 100644
--- a/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/index.html
+++ b/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/index.html
@@ -1,4 +1,4 @@
-<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta char [...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta char [...]
<script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css as=style><link href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/a [...]
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@docsearch/css@3><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="自适应限流"><meta property="og:description" content="自适应限流"><meta name=twitter:description content="自适应限流"><meta property="og:url" content="https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control/"><meta property="og:title" conte [...]
<link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/zh-cn/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class=" [...]
@@ -668,13 +668,13 @@
<label for=m-zh-cnoverviewreferenceprotocols-check><a href=/zh-cn/overview/reference/protocols/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnoverviewreferenceprotocols><span>协议规范</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewreferenceprotocolstriple-li><input type=checkbox id=m-zh-cnoverviewreferenceprotocolstriple-check>
<label for=m-zh-cnoverviewreferenceprotocolstriple-check><a href=/zh-cn/overview/reference/protocols/triple/ title="Triple 协议设计理念与规范" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolstriple><span>Triple 协议规范</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewreferenceprotocolstcp-li><input type=checkbox id=m-zh-cnoverviewreferenceprotocolstcp-check>
<label for=m-zh-cnoverviewreferenceprotocolstcp-check><a href=/zh-cn/overview/reference/protocols/tcp/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolstcp><span>Dubbo2 协议规范</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewreferenceprotocolshttp-li><input type=checkbox id=m-zh-cnoverviewreferenceprotocolshttp-check>
-<label for=m-zh-cnoverviewreferenceprotocolshttp-check><a href=/zh-cn/overview/reference/protocols/http/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolshttp><span>HTTP 协议规范</span></a></label></li></ul></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-c [...]
+<label for=m-zh-cnoverviewreferenceprotocolshttp-check><a href=/zh-cn/overview/reference/protocols/http/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolshttp><span>HTTP 协议规范</span></a></label></li></ul></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-c [...]
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=display:flex><span><span style=color:#268bd2><dubbo:provider</span> flowcontrol=<span style=color:#2aa198>"heuristicSmoothingFlowControl"</span> <span style=color:#268bd2>/></span>
</span></span></code></pre></div><h3 id=示例二使用-autoconcurrencylimiter-自适应限流算法>示例二:使用 autoConcurrencyLimiter 自适应限流算法</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-properties data-lang=properties><span style=display:flex><span>dubbo.provider.flowcontrol<span style=color:#719e07>=</span><span style=color:#2aa198>autoConcurrencyLimiter</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=display:flex><span><span style=color:#268bd2><dubbo:provider</span> flowcontrol=<span style=color:#2aa198>"autoConcurrencyLimiter"</span> <span style=color:#268bd2>/></span>
</span></span></code></pre></div><h3 id=示例三设置服务粒度的-heuristicsmoothingflowcontrol-自适应限流>示例三:设置服务粒度的 heuristicSmoothingFlowControl 自适应限流</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=display:flex><span><span style=color:#268bd2><dubbo:service</span> interface=<span style=color:#2aa198>"com.foo.BarService"</span> flowcontrol=<span style=color:#2aa198 [...]
</span></span></code></pre></div><div id=pre-footer><h2>反馈</h2><p class=feedback--prompt>此页是否对您有帮助?</p><button class="btn btn-primary mb-4 feedback--yes">是</button>
-<button class="btn btn-primary mb-4 feedback--no">否</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled [...]
+<button class="btn btn-primary mb-4 feedback--no">否</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled [...]
<a href="https://github.com/apache/dubbo-website/new/master/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/adaptive-concurrency-control.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+ [...]
<a href="https://github.com/apache/dubbo-website/issues/new?title=%e8%87%aa%e9%80%82%e5%ba%94%e9%99%90%e6%b5%81" target=_blank><i class="fab fa-github fa-fw"></i> 登记问题</a>
<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> 提交项目问题</a></div><nav id=TableOfContents><ul><li><a href=#功能说明>功能说明</a></li><li><a href=#使用场景>使用场景</a></li><li><a href=#使用方式>使用方式</a><ul><li><a href=#示例一使用-heuristicsmoothingflowcontrol-自适应限流算法>示例一:使用 heuristicSmoothingFlowControl 自适应限流算法</a></li><li><a href=#示例二使用-autoconcurrencylimiter-自适应限流算法>示例二:使用 autoConcurrencyLimiter 自适应限流算法</a></li><li><a href=#示例三设置服务粒度的-heuristicsmoothingflowcont [...]
diff --git a/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/index.xml b/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/index.xml
index 892571c647..6309a9fe03 100644
--- a/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/index.xml
+++ b/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/performance/index.xml
@@ -767,7 +767,7 @@
<p>设置方法与静态的最大并发值设置类似,只需在服务端设置 flowcontrol 参数即可,可选值有以下两种:</p>
<ul>
<li>heuristicSmoothingFlowControl。当服务端收到一个请求时,首先判断CPU的使用率是否超过50%。如果没有超过50%,则接受这个请求进行处理。如果超过50%,说明当前的负载较高,便从 HeuristicSmoothingFlowControl 算法中获得当前的 maxConcurrency 值。如果当前正在处理的请求数量超过了 maxConcurrency,则拒绝该请求。</li>
-<li>autoConcurrencyLimier。与 HeuristicSmoothingFlowControl 的最大区别是,AutoConcurrencyLimier 是基于窗口的,每当窗口内积累了一定量的采样数据时,才利用窗口内的数据来更新得到 maxConcurrency,其次,利用exploreRatio来对剩余的容量进行探索。</li>
+<li>autoConcurrencyLimiter。与 HeuristicSmoothingFlowControl 的最大区别是,AutoConcurrencyLimiter 是基于窗口的,每当窗口内积累了一定量的采样数据时,才利用窗口内的数据来更新得到 maxConcurrency,其次,利用exploreRatio来对剩余的容量进行探索。</li>
</ul>
<blockquote>
<p>在确保服务端存在多个节点,并且消费端开启重试策略的前提下,限流功能才能更好的发挥作用。</p>
diff --git a/zh-cn/overview/mannual/java-sdk/reference-manual/qos/index.xml b/zh-cn/overview/mannual/java-sdk/reference-manual/qos/index.xml
index 5ca8e6530d..9b27789a56 100644
--- a/zh-cn/overview/mannual/java-sdk/reference-manual/qos/index.xml
+++ b/zh-cn/overview/mannual/java-sdk/reference-manual/qos/index.xml
@@ -231,6 +231,7 @@
</span></span><span style="display:flex;"><span>BYE!
</span></span><span style="display:flex;"><span>Connection closed by foreign host.
</span></span></code></pre></div></description></item><item><title>Overview: 服务管理命令</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/</guid><description>
+<p>服务管理功能提供了一系列的命令对 Dubbo 服务进行管理。</p>
<h2 id="服务管理">服务管理</h2>
<h3 id="ls-命令">ls 命令</h3>
<p>列出消费者和提供者</p>
diff --git a/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/index.html b/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/index.html
index 66d8f7fc2b..778e937e36 100644
--- a/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/index.html
+++ b/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/index.html
@@ -1,4 +1,4 @@
-<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta charset=utf-8><meta name=viewport [...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta charset=utf-8><meta name=viewport [...]
<script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css as=style><link href=/scss/main.min.7fa6d3c7f521df6fedf4e016ce03c86424bbf48f7b0d070a25f450054a7fcfeb.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/a [...]
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@docsearch/css@3><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="服务管理命令"><meta property="og:description" content="服务管理命令"><meta name=twitter:description content="服务管理命令"><meta property="og:url" content="https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/"><meta property="og:title" content="服务管理命令"><meta name=twi [...]
<link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/zh-cn/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class=" [...]
@@ -668,7 +668,7 @@
<label for=m-zh-cnoverviewreferenceprotocols-check><a href=/zh-cn/overview/reference/protocols/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnoverviewreferenceprotocols><span>协议规范</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewreferenceprotocolstriple-li><input type=checkbox id=m-zh-cnoverviewreferenceprotocolstriple-check>
<label for=m-zh-cnoverviewreferenceprotocolstriple-check><a href=/zh-cn/overview/reference/protocols/triple/ title="Triple 协议设计理念与规范" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolstriple><span>Triple 协议规范</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewreferenceprotocolstcp-li><input type=checkbox id=m-zh-cnoverviewreferenceprotocolstcp-check>
<label for=m-zh-cnoverviewreferenceprotocolstcp-check><a href=/zh-cn/overview/reference/protocols/tcp/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolstcp><span>Dubbo2 协议规范</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewreferenceprotocolshttp-li><input type=checkbox id=m-zh-cnoverviewreferenceprotocolshttp-check>
-<label for=m-zh-cnoverviewreferenceprotocolshttp-check><a href=/zh-cn/overview/reference/protocols/http/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolshttp><span>HTTP 协议规范</span></a></label></li></ul></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-c [...]
+<label for=m-zh-cnoverviewreferenceprotocolshttp-check><a href=/zh-cn/overview/reference/protocols/http/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewreferenceprotocolshttp><span>HTTP 协议规范</span></a></label></li></ul></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-c [...]
</span></span><span style=display:flex><span>As Provider side:
</span></span><span style=display:flex><span>+------------------------------------------------------------------------+---------------------+
</span></span><span style=display:flex><span>| Provider Service Name | PUB |
@@ -698,7 +698,7 @@
</span></span><span style=display:flex><span>dubbo>offline com.*
</span></span><span style=display:flex><span>OK
</span></span></code></pre></div><div id=pre-footer><h2>反馈</h2><p class=feedback--prompt>此页是否对您有帮助?</p><button class="btn btn-primary mb-4 feedback--yes">是</button>
-<button class="btn btn-primary mb-4 feedback--no">否</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled [...]
+<button class="btn btn-primary mb-4 feedback--no">否</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled [...]
<a href="https://github.com/apache/dubbo-website/new/master/content/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md% [...]
<a href="https://github.com/apache/dubbo-website/issues/new?title=%e6%9c%8d%e5%8a%a1%e7%ae%a1%e7%90%86%e5%91%bd%e4%bb%a4" target=_blank><i class="fab fa-github fa-fw"></i> 登记问题</a>
<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> 提交项目问题</a></div><nav id=TableOfContents><ul><li><a href=#服务管理>服务管理</a><ul><li><a href=#ls-命令>ls 命令</a></li></ul></li><li><a href=#上线>上线</a><ul><li><a href=#online-命令>online 命令</a></li></ul></li><li><a href=#下线>下线</a><ul><li><a href=#offline-命令>offline 命令</a></li></ul></li></ul></nav></div></div></div></div><footer class="bg-dark py-5 row d-print-none footer-margin-0"><div class="container- [...]
diff --git a/zh-cn/sitemap.xml b/zh-cn/sitemap.xml
index a98c0302f7..9b98971bc4 100644
--- a/zh-cn/sitemap.xml
+++ b/zh-cn/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>https://cn.dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%8D%87%E7%BA%A7-dubbo3-%E5%85%A8%E9%9D%A2%E5%8F%96%E4%BB%A3-hsf2/</loc><lastmod>2023-02-22T15:03:22+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://cn.dubbo.apache.org/zh-cn/overview/mannu [...]
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>https://cn.dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%8D%87%E7%BA%A7-dubbo3-%E5%85%A8%E9%9D%A2%E5%8F%96%E4%BB%A3-hsf2/</loc><lastmod>2023-02-22T15:03:22+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url><url><loc>https://cn.dubbo.apache.org/zh-cn/overview/mannu [...]
\ No newline at end of file
diff --git a/zh-cn/tags/java/index.xml b/zh-cn/tags/java/index.xml
index 8220bcb933..413024610b 100644
--- a/zh-cn/tags/java/index.xml
+++ b/zh-cn/tags/java/index.xml
@@ -126,8 +126,8 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">...</span>
</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p>
-<p>setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的 子Composite),这个方法实质上是对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</p>
-<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口仅作为常量类使用,初始化时进行了以下操作:</p>
+<p>其在<strong>数据聚合器层面的调用链路</strong>可以总结为:setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的子聚合器),这个方法实质上是<strong>对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</strong></p>
+<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口本身作为常量类使用,并在初始化时<strong>注册真正的指标常量</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>MetricsCat APPLICATION_NOTIFY_FINISH <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -150,7 +150,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">));</span>
</span></span><span style="display:flex;"><span><span style="color:#586e75">//...
-</span></span></span></code></pre></div><p>看上去很混乱。我们需要先搞清楚此处的 MetricsCat 到底是什么 ?</p>
+</span></span></span></code></pre></div><p>此处声明的指标常量都是 MetricsCat 类型的。其中部分常量在创建时还传入了该指标的收集逻辑,如Key 为 NOTIFY_METRIC_NUM_LAST 的常量。以下为 MetricsCat 的定义:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">MetricsCat</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> MetricsPlaceType placeType<span style="color:#719e07">;</span>
@@ -179,9 +179,10 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> R <span style="color:#268bd2">apply</span><span style="color:#719e07">(</span>T t<span style="color:#719e07">,</span> U u<span style="color:#719e07">,</span> K k<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">}</span>
-</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,分别是获取其内部属性的,可以认为它本身只是 eventFunc 字段的载体。而这个eventFunc 负责生产 <code>AbstractMetricsListener</code>(指标监听器),因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,不过用户需要传入这个监听器的处理逻辑。</p>
-<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供。</p>
-<p>回到两个常量的初始化,它们在注册的 <code>TpFunction</code> 中定义的操作为:返回通过 <code>AbstractMetricsListener.onFinish</code> 获取的事件完成监听器。当指定 <code>MetricsKey</code> 的指标统计事件完成时,这个监听器中的 <code>onEventFinish</code> 方法就会被调用。 而 <code>MetricsCat</code> 构造时传入的 <code>MetricsKey</code> 会被作为 <code>AbstractMetricsListener</code> 的构造参数,用于指定监听的指标。</p>
+</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,都是获取其内部属性的。</p>
+<p>其实质上 eventFunc 字段的载体,提供了为特定指标生产监听器的逻辑,因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,用户在创建时传入这个监听器的处理逻辑。</p>
+<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供,借此实现延迟初始化。</p>
+<p>回到之前两个<strong>在 MCat 中定义了监听器生产方法</strong>的两个常量的初始化流程:它们在创建 MetricsCat 时传入的TpFunction中定义的操作为:返回通过 AbstractMetricsListener.onFinish获取的事件完成监听器。当指定MetricsKey 的指标统计事件完成时,这个监听器中的 onEventFinish 方法就会被调用。 而 MetricsCat 构造时传入的 MetricsKey 会被作为 AbstractMetricsListener 的构造参数,用于指定监听的指标。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -373,19 +374,17 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>getFireEventHandler<span style="color:#719e07">().</span>accept<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><code>doExecute</code> 做了三件事:</p>
-<p>1,判断当前指标是否存在,如果不存在就放到容器中</p>
-<p>2,调用提供的counter函数对指标进行修改</p>
-<p>3,如果需要发布事件,通过子类重写方法提供的事件发布函数发布事件</p>
-<p>具体地,<code>doExecute</code> 通过 <strong><code>countConfigure</code></strong> 方法为 SampleConfigure 设置事件发布函数,对应的是 SampleConfigure 实例内部的 fireEventHandler 字段。</p>
-<p>截至本文发布为止,fireEventHandler 均使用一个默认空实现,即什么也不做。也就是说,目前实现自 SimpleMetricsCountSampler 的采样器都不会发布事件,此处的设计是为以后可能发布事件的其它采样器预留的。</p>
+</span></span></code></pre></div><p><code>doExecute</code> 做了两件事:</p>
+<p>1,判断当前指标是否存在,如果不存在就放到容器中。</p>
+<p>2,调用提供的计数函数对指标进行修改,对应 counter 字段。</p>
+<p>以下为各采样器在 countConfigure 方法中提供的创建指标实例的逻辑:</p>
<ul>
<li>DefaultMetricsCollector 中 SimpleMetricsCountSampler 的匿名实现 (applicationSampler)提供的<code>countConfigure</code> 方法:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>
</span></span><span style="display:flex;"><span> MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> MetricsEvent<span style="color:#719e07">.</span>Type<span style="color:#719e07">,</span> ApplicationMetric<span style="color:#719e07">&gt;</span> sampleConfigure<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ApplicationMetric<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">.</span>getSource<span style="color:#719e07">()) [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><ul>
@@ -393,7 +392,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> String<span style="color:#719e07">,</span> ThreadPoolRejectMetric<span style="color:#719e07">&gt;& [...]
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ThreadPoolRejectMetric<span style="color:#719e07">(</span>collector<span style="color:#719e07">.</span>getApplicationName<span style="color:#719 [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><hr>
@@ -418,7 +417,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">registerListener</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> applicationModel<span style="color:#719e07">.</span>getBeanFactory<span style="color:#719e07">().</span>getBean<span style="color:#719e07">(</span>DefaultMetricsCollector< [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(RPC请求失败事件)。</p>
+</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(请求前失败事件:实际请求发送之前在 ClusterFilter 中产生的异常)。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#dc322f">boolean</span> <span style="color:#268bd2">isSupport</span><span style="color:#719e07">(</span>MetricsEvent event<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> event <span style="color:#719e07">instanceof</span> RequestEvent <span style="color:#719e07">||</span> event <span style="color:#719e07">instanceof</span> RequestBeforeEvent<span style="color:#719e07">;</span>
diff --git "a/zh-cn/tags/\346\272\220\347\240\201\350\247\243\346\236\220/index.xml" "b/zh-cn/tags/\346\272\220\347\240\201\350\247\243\346\236\220/index.xml"
index 45fa4d8afb..bbfd15a07d 100644
--- "a/zh-cn/tags/\346\272\220\347\240\201\350\247\243\346\236\220/index.xml"
+++ "b/zh-cn/tags/\346\272\220\347\240\201\350\247\243\346\236\220/index.xml"
@@ -126,8 +126,8 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">...</span>
</span></span></code></pre></div><p>由于几个方法实际上的调用链路类似,我们选择从其中的 setNum 方法开始分析。</p>
-<p>setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的 子Composite),这个方法实质上是对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</p>
-<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口仅作为常量类使用,初始化时进行了以下操作:</p>
+<p>其在<strong>数据聚合器层面的调用链路</strong>可以总结为:setNum 方法调用基本数据聚合器的 setServiceKey 方法,该方法又会调用服务数据聚合器(ServiceStatComposite)的同名 setServiceKey 方法(我们已经知道基本数据聚合器内封装了四个不同类型的子聚合器),这个方法实质上是<strong>对应用层面的特定指标(由指标Key决定)进行注册并赋初始值(参数中的 num)。</strong></p>
+<p>setNum 的用法均位于注册中心事件多播器(RegistryMetricsEventMulticaster)中声明的 MCat 接口中,在 APPLICATION_NOTIFY_FINISH 和 APPLICATION_DIRECTORY_POST 两个常量初始化时被调用。MCat 接口本身作为常量类使用,并在初始化时<strong>注册真正的指标常量</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>MetricsCat APPLICATION_NOTIFY_FINISH <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -150,7 +150,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">));</span>
</span></span><span style="display:flex;"><span><span style="color:#586e75">//...
-</span></span></span></code></pre></div><p>看上去很混乱。我们需要先搞清楚此处的 MetricsCat 到底是什么 ?</p>
+</span></span></span></code></pre></div><p>此处声明的指标常量都是 MetricsCat 类型的。其中部分常量在创建时还传入了该指标的收集逻辑,如Key 为 NOTIFY_METRIC_NUM_LAST 的常量。以下为 MetricsCat 的定义:</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">MetricsCat</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> MetricsPlaceType placeType<span style="color:#719e07">;</span>
@@ -179,9 +179,10 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span> R <span style="color:#268bd2">apply</span><span style="color:#719e07">(</span>T t<span style="color:#719e07">,</span> U u<span style="color:#719e07">,</span> K k<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span><span style="color:#719e07">}</span>
-</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,分别是获取其内部属性的,可以认为它本身只是 eventFunc 字段的载体。而这个eventFunc 负责生产 <code>AbstractMetricsListener</code>(指标监听器),因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,不过用户需要传入这个监听器的处理逻辑。</p>
-<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供。</p>
-<p>回到两个常量的初始化,它们在注册的 <code>TpFunction</code> 中定义的操作为:返回通过 <code>AbstractMetricsListener.onFinish</code> 获取的事件完成监听器。当指定 <code>MetricsKey</code> 的指标统计事件完成时,这个监听器中的 <code>onEventFinish</code> 方法就会被调用。 而 <code>MetricsCat</code> 构造时传入的 <code>MetricsKey</code> 会被作为 <code>AbstractMetricsListener</code> 的构造参数,用于指定监听的指标。</p>
+</span></span></code></pre></div><p>MetricsCat 类除了构造器,只提供了两个public方法,都是获取其内部属性的。</p>
+<p>其实质上 eventFunc 字段的载体,提供了为特定指标生产监听器的逻辑,因此 <code>MetricsCat </code> 可以看做<strong>为特定指标生产指标监听器的工厂</strong>,用户在创建时传入这个监听器的处理逻辑。</p>
+<p>通过泛型,我们可以知道它构造时使用的两个参数分别为 MetricsKey(指标Key)和一个接受 <code>MetricsKey, MetricsPlaceType, CombMetricsCollector&lt;TimeCounterEvent&gt;</code> 三个参数,返回一个 <code>AbstractMetricsListener</code> 的函数。之所以要多封装一层函数,是因为 <code>placeType</code> 字段在 <code>MetricsKey</code> 实例构造之后才会提供,借此实现延迟初始化。</p>
+<p>回到之前两个<strong>在 MCat 中定义了监听器生产方法</strong>的两个常量的初始化流程:它们在创建 MetricsCat 时传入的TpFunction中定义的操作为:返回通过 AbstractMetricsListener.onFinish获取的事件完成监听器。当指定MetricsKey 的指标统计事件完成时,这个监听器中的 onEventFinish 方法就会被调用。 而 MetricsCat 构造时传入的 MetricsKey 会被作为 AbstractMetricsListener 的构造参数,用于指定监听的指标。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//RegistryMetricsEventMulticaster.MCat
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">new</span> MetricsCat<span style="color:#719e07">(</span>MetricsKey<span style="color:#719e07">.</span>NOTIFY_METRIC_NUM_LAST<span style="color:#719e07">,</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">(</span>key<span style="color:#719e07">,</span> placeType<span style="color:#719e07">,</span> collector<span style="color:#719e07">)</span> <span style="color:#719e07">-&gt;</span> AbstractMetricsListener<span style="color:#719e07">.</span>onFinish<span style="color:#719e07">(</span>key<span style="color:#719e07">,</span>
@@ -373,19 +374,17 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>getFireEventHandler<span style="color:#719e07">().</span>accept<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">);</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><code>doExecute</code> 做了三件事:</p>
-<p>1,判断当前指标是否存在,如果不存在就放到容器中</p>
-<p>2,调用提供的counter函数对指标进行修改</p>
-<p>3,如果需要发布事件,通过子类重写方法提供的事件发布函数发布事件</p>
-<p>具体地,<code>doExecute</code> 通过 <strong><code>countConfigure</code></strong> 方法为 SampleConfigure 设置事件发布函数,对应的是 SampleConfigure 实例内部的 fireEventHandler 字段。</p>
-<p>截至本文发布为止,fireEventHandler 均使用一个默认空实现,即什么也不做。也就是说,目前实现自 SimpleMetricsCountSampler 的采样器都不会发布事件,此处的设计是为以后可能发布事件的其它采样器预留的。</p>
+</span></span></code></pre></div><p><code>doExecute</code> 做了两件事:</p>
+<p>1,判断当前指标是否存在,如果不存在就放到容器中。</p>
+<p>2,调用提供的计数函数对指标进行修改,对应 counter 字段。</p>
+<p>以下为各采样器在 countConfigure 方法中提供的创建指标实例的逻辑:</p>
<ul>
<li>DefaultMetricsCollector 中 SimpleMetricsCountSampler 的匿名实现 (applicationSampler)提供的<code>countConfigure</code> 方法:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>
</span></span><span style="display:flex;"><span> MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> MetricsEvent<span style="color:#719e07">.</span>Type<span style="color:#719e07">,</span> ApplicationMetric<span style="color:#719e07">&gt;</span> sampleConfigure<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ApplicationMetric<span style="color:#719e07">(</span>sampleConfigure<span style="color:#719e07">.</span>getSource<span style="color:#719e07">()) [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><ul>
@@ -393,7 +392,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</ul>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">protected</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">countConfigure</span><span style="color:#719e07">(</span>MetricsCountSampleConfigurer<span style="color:#719e07">&lt;</span>String<span style="color:#719e07">,</span> String<span style="color:#719e07">,</span> ThreadPoolRejectMetric<span style="color:#719e07">&gt;& [...]
-</span></span><span style="display:flex;"><span> <span style="color:#586e75">//仅提供了根据 configure 创建指标实例的函数,它不发布事件
+</span></span><span style="display:flex;"><span> <span style="color:#586e75">//提供根据 configure 创建指标实例的函数
</span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> sampleConfigure<span style="color:#719e07">.</span>configureMetrics<span style="color:#719e07">(</span>configure <span style="color:#719e07">-&gt;</span> <span style="color:#719e07">new</span> ThreadPoolRejectMetric<span style="color:#719e07">(</span>collector<span style="color:#719e07">.</span>getApplicationName<span style="color:#719 [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
</span></span></code></pre></div><hr>
@@ -418,7 +417,7 @@ dubbo-metrics 指标模块旨在将 dubbo 内部零散的 Metrics 相关类综
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">registerListener</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> applicationModel<span style="color:#719e07">.</span>getBeanFactory<span style="color:#719e07">().</span>getBean<span style="color:#719e07">(</span>DefaultMetricsCollector< [...]
</span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span>
-</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(RPC请求失败事件)。</p>
+</span></span></code></pre></div><p><strong>因此,聚合指标收集器和直方图指标收集器的指标事件来源于默认指标收集器转发的指标事件</strong>。通过默认指标转发器的 isSupport 方法,还可以发现这些指标事件的类型是 RequestEvent (RPC请求事件)或 RequestBeforeEvent(请求前失败事件:实际请求发送之前在 ClusterFilter 中产生的异常)。</p>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span>
</span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#dc322f">boolean</span> <span style="color:#268bd2">isSupport</span><span style="color:#719e07">(</span>MetricsEvent event<span style="color:#719e07">)</span> <span style="color:#719e07">{</span>
</span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> event <span style="color:#719e07">instanceof</span> RequestEvent <span style="color:#719e07">||</span> event <span style="color:#719e07">instanceof</span> RequestBeforeEvent<span style="color:#719e07">;</span>