<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>流量管控 on Apache Dubbo</title><link>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/</link><description>Recent content in 流量管控 on Apache Dubbo</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/index.xml" rel="self" type="application/rss+xml"/><item><title>标签路由</title><link>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/tag_router/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/tag_router/</guid><description>&lt;p>相关示例：&lt;/p>
&lt;ul>
&lt;li>动态 tag router：&lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/tag" target="_blank">dubbo-go-samples/router/tag&lt;/a>&lt;/li>
&lt;li>静态 tag router：&lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/static_config/tag" target="_blank">dubbo-go-samples/router/static_config/tag&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="使用方法">使用方法&lt;/h2>
&lt;h3 id="前置准备">前置准备&lt;/h3>
&lt;ul>
&lt;li>Docker 以及 Docker compose 环境来部署Nacos配置中心。&lt;/li>
&lt;li>Nacos 2.x+&lt;/li>
&lt;li>Go 1.23+&lt;/li>
&lt;/ul>
&lt;h4 id="启动nacos配置中心">启动Nacos配置中心&lt;/h4>
&lt;p>参考这个教程来&lt;a href="https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/nacos/">启动Nacos&lt;/a>。&lt;/p>
&lt;h3 id="tag-router-介绍">Tag router 介绍&lt;/h3>
&lt;p>Tag router可以通过标签对流量进行管控，常用于灰度发布（新版本实例打上灰度标签，只有携带该标签的请求会路由过去）、环境隔离（不同泳道的实例用标签区分，避免流量串环境）等场景。以下为示例代码。&lt;/p>
&lt;p>服务端部分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ins, err &lt;span style="color:#719e07">:=&lt;/span> dubbo.&lt;span style="color:#268bd2">NewInstance&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		dubbo.&lt;span style="color:#268bd2">WithName&lt;/span>(&lt;span style="color:#2aa198">&amp;#34;tag-server&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		dubbo.&lt;span style="color:#268bd2">WithTag&lt;/span>(&lt;span style="color:#2aa198">&amp;#34;test-tag&amp;#34;&lt;/span>), &lt;span style="color:#586e75">// set application&amp;#39;s tag
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">&lt;/span>		dubbo.&lt;span style="color:#268bd2">WithRegistry&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			registry.&lt;span style="color:#268bd2">WithNacos&lt;/span>(),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			registry.&lt;span style="color:#268bd2">WithAddress&lt;/span>(RegistryAddress),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		dubbo.&lt;span style="color:#268bd2">WithProtocol&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			protocol.&lt;span style="color:#268bd2">WithTriple&lt;/span>(),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			protocol.&lt;span style="color:#268bd2">WithPort&lt;/span>(&lt;span style="color:#2aa198">20001&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数：&lt;/p>
&lt;ul>
&lt;li>dubbo.WithTag: 设置该实例携带的tag，用于标记该实例（例如为灰度环境等）。标签会写入注册中心的实例元数据（&lt;code>dubbo.tag&lt;/code>）。标签匹配区分大小写，需与客户端携带的标签写法完全一致。&lt;/li>
&lt;/ul>
&lt;p>客户端部分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>atta &lt;span style="color:#719e07">:=&lt;/span> &lt;span style="color:#268bd2">map&lt;/span>[&lt;span style="color:#dc322f">string&lt;/span>]&lt;span style="color:#dc322f">string&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	constant.Tagkey: &lt;span style="color:#2aa198">&amp;#34;test-tag&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	constant.ForceUseTag: &lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span>, &lt;span style="color:#586e75">// 使用string类型
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ctx &lt;span style="color:#719e07">:=&lt;/span> context.&lt;span style="color:#268bd2">WithValue&lt;/span>(context.&lt;span style="color:#268bd2">Background&lt;/span>(), constant.AttachmentKey, atta)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>resp, err &lt;span style="color:#719e07">:=&lt;/span> svc.&lt;span style="color:#268bd2">Greet&lt;/span>(ctx, &lt;span style="color:#719e07">&amp;amp;&lt;/span>greet.GreetRequest{Name: name})
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数:&lt;/p></description></item><item><title>脚本路由</title><link>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/script_router/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/script_router/</guid><description>&lt;p>示例源码：&lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/script" target="_blank">dubbo-go-samples/router/script&lt;/a>。&lt;/p>
&lt;p>Script Router 在消费端通过 JavaScript 脚本筛选候选 Provider，目前支持应用级动态规则。它适合根据 Provider URL、RPC 方法、调用附件等运行时信息实现自定义路由，例如将流量固定到指定端口、按租户或灰度标识选择实例。&lt;/p>
&lt;p>对于只需按地址、方法或应用名进行简单匹配的场景，优先使用 Condition Router。Script Router 的表达能力更强，但脚本执行和维护成本更高，生产环境应限制脚本复杂度，并验证脚本始终返回可调用的 Provider 列表。&lt;/p>
&lt;h2 id="前置准备">前置准备&lt;/h2>
&lt;ul>
&lt;li>Docker 和 Docker Compose，用于运行 Nacos。&lt;/li>
&lt;li>Nacos 2.x+。&lt;/li>
&lt;li>Go 1.23+。&lt;/li>
&lt;li>已下载 &lt;code>dubbo-go-samples/router/script&lt;/code> 示例。&lt;/li>
&lt;/ul>
&lt;h3 id="启动-nacos">启动 Nacos&lt;/h3>
&lt;p>按照 &lt;a href="https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/nacos/">Nacos 快速开始&lt;/a> 启动 Nacos。示例中的注册中心和配置中心地址均为 &lt;code>127.0.0.1:8848&lt;/code>。&lt;/p>
&lt;h2 id="脚本入参">脚本入参&lt;/h2>
&lt;p>路由脚本以 &lt;code>invokers&lt;/code>、&lt;code>invocation&lt;/code>、&lt;code>context&lt;/code> 三个参数执行，必须返回由原始候选项组成的数组。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">入参&lt;/th>
 &lt;th style="text-align: left">含义&lt;/th>
 &lt;th style="text-align: left">常见用法&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>invokers&lt;/code>&lt;/td>
 &lt;td style="text-align: left">当前可用的候选 Provider 列表。每项可通过 &lt;code>GetURL()&lt;/code> 获取服务 URL。&lt;/td>
 &lt;td style="text-align: left">根据 URL 的端口、地址或参数过滤实例。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>invocation&lt;/code>&lt;/td>
 &lt;td style="text-align: left">当前 RPC 调用信息。&lt;/td>
 &lt;td style="text-align: left">根据方法名、参数或 attachments 实现按调用维度的路由。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">&lt;code>context&lt;/code>&lt;/td>
 &lt;td style="text-align: left">当前调用上下文。&lt;/td>
 &lt;td style="text-align: left">在脚本需要时读取调用链路中的上下文信息。&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>下面的脚本只保留端口为 &lt;code>20000&lt;/code> 的 Provider：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>(&lt;span style="color:#268bd2">function&lt;/span>(invokers, invocation, context) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">if&lt;/span> (&lt;span style="color:#719e07">!&lt;/span>invokers &lt;span style="color:#719e07">||&lt;/span> invokers.length &lt;span style="color:#719e07">===&lt;/span> &lt;span style="color:#2aa198">0&lt;/span>) &lt;span style="color:#719e07">return&lt;/span> [];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> invokers.filter(&lt;span style="color:#268bd2">function&lt;/span>(invoker) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">var&lt;/span> url &lt;span style="color:#719e07">=&lt;/span> invoker.GetURL();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">return&lt;/span> url &lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> url.Port &lt;span style="color:#719e07">===&lt;/span> &lt;span style="color:#2aa198">&amp;#34;20000&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>})(invokers, invocation, context);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="配置-script-router">配置 Script Router&lt;/h2>
&lt;p>示例 consumer 通过 &lt;code>dubbo.WithConfigCenter&lt;/code> 连接 Nacos 配置中心。启动 Provider 后，Script Router 会按照 Provider 的应用名订阅规则。&lt;/p></description></item><item><title>条件路由</title><link>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/condition_router/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/condition_router/</guid><description>&lt;p>相关示例：&lt;/p>
&lt;ul>
&lt;li>动态 condition router：&lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/condition" target="_blank">dubbo-go-samples/router/condition&lt;/a>&lt;/li>
&lt;li>静态 condition router：&lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/static_config/condition" target="_blank">dubbo-go-samples/router/static_config/condition&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="使用方法">使用方法&lt;/h2>
&lt;h3 id="前置准备">前置准备&lt;/h3>
&lt;ul>
&lt;li>Docker 以及 Docker compose 环境来部署Nacos配置中心。&lt;/li>
&lt;li>Nacos 2.x+&lt;/li>
&lt;li>Go 1.23+&lt;/li>
&lt;/ul>
&lt;h4 id="启动nacos配置中心">启动Nacos配置中心&lt;/h4>
&lt;p>参考这个教程来&lt;a href="https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/nacos/">启动Nacos&lt;/a>。&lt;/p>
&lt;h3 id="condition-router-介绍">Condition router 介绍&lt;/h3>
&lt;p>Condition router 与 Tag router 类似，但是提供了更强大的流量管控功能，可以通过表达式&lt;code>consumer =&amp;gt; provider&lt;/code>，
对服务端以及客户端进行流量管控。&lt;/p>
&lt;p>匹配表达式示例:&lt;/p>
&lt;p>&lt;code>host = 127.0.0.1 =&amp;gt; host = 127.0.0.1, 192.168.1.1&lt;/code>&lt;/p>
&lt;blockquote>
&lt;p>可以使用 = 以及 != 等符号进行匹配，使用逗号进行多选择匹配。&lt;/p>
&lt;/blockquote>
&lt;p>示例代码:&lt;/p>
&lt;p>服务端部分:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ins, err &lt;span style="color:#719e07">:=&lt;/span> dubbo.&lt;span style="color:#268bd2">NewInstance&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		dubbo.&lt;span style="color:#268bd2">WithName&lt;/span>(&lt;span style="color:#2aa198">&amp;#34;condition-server&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		dubbo.&lt;span style="color:#268bd2">WithRegistry&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			registry.&lt;span style="color:#268bd2">WithNacos&lt;/span>(),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			registry.&lt;span style="color:#268bd2">WithAddress&lt;/span>(RegistryAddress),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		dubbo.&lt;span style="color:#268bd2">WithProtocol&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			protocol.&lt;span style="color:#268bd2">WithTriple&lt;/span>(),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			protocol.&lt;span style="color:#268bd2">WithPort&lt;/span>(TriPort),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>客户端部分:&lt;/p></description></item><item><title>Sentinel限流降级</title><link>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/sentinel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/sentinel/</guid><description>&lt;p>Dubbo-go 中提供了内置的限流组件，用户可根据自己的业务场景调整限流值、限流后的行为等，具体可 &lt;a href="https://github.com/apache/dubbo-go/blob/main/filter/tps_limiter.go#L52">TpsLimiter&lt;/a> 定义与具体实现。用户可通过类似以下方式在服务端设置简单的限流策略：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>server.&lt;span style="color:#268bd2">WithTpsLimiter&lt;/span>(&lt;span style="color:#2aa198">&amp;#34;method-service&amp;#34;&lt;/span>) &lt;span style="color:#586e75">// 目前支持 method-service、polaris 等几个实现
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">&lt;/span>server.&lt;span style="color:#268bd2">WithTpsLimiterXxx&lt;/span>() &lt;span style="color:#586e75">// 设置限流相关阈值，请根据具体方法填写
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">//tps.limit.strategy: &amp;#34;slidingWindow&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">//tps.limit.rejected.handler: &amp;#34;default&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">//tps.limit.interval: 1000
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">//tps.limit.rate: 3
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dubbo-go 内置限流策略相对简单，对于一些更复杂的场景，我们建议通过使用 Sentinel 等专业的第三方框架可以实现更丰富、更灵活的限流策略。&lt;/p>
&lt;p>可在此查看 &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/filter/sentinel">本示例完整源码&lt;/a>，也可以参考 &lt;a href="https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/java-sdk/tasks/rate-limit/sentinel/">Dubbo+Sentinel 的 Java 示例&lt;/a> 获得更多灵感。&lt;/p>
&lt;h2 id="provider-限流">Provider 限流&lt;/h2>
&lt;h3 id="基于-qps-限流">基于 QpS 限流&lt;/h3>
&lt;h3 id="基于并发任务数限流当前在运行任务数">基于并发任务数限流(当前在运行任务数)&lt;/h3>
&lt;h2 id="consumer-限流">Consumer 限流&lt;/h2>
&lt;h3 id="熔断策略">熔断策略&lt;/h3>
&lt;h3 id="基于并发请求数限流未收到响应的请求数">基于并发请求数限流(未收到响应的请求数)&lt;/h3></description></item><item><title/><link>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/affinity_router/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-3229--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/affinity_router/</guid><description/></item></channel></rss>