<?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-3203--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-3203--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-3203--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-3203--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/tag_router/</guid><description>&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">20000&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;/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>
&lt;ul>
&lt;li>&lt;code>constant.TagKey&lt;/code>: 设置客户端发送请求时所携带的tag标签。&lt;/li>
&lt;li>&lt;code>constant.ForceUseTag&lt;/code>: 设置是否强制匹配标签。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>未携带标签的流量只能打到未携带标签的服务，携带标签的流量则可以打到携带相应标签的服务以及不具有标签的服务（取决于是否配置force参数）。&lt;/p></description></item><item><title>脚本路由</title><link>https://deploy-preview-3203--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-3203--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/script_router/</guid><description>&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="script-router-介绍">Script router 介绍&lt;/h3>
&lt;p>Script router与condition router类似，都提供了使用表达式进行流量管控的功能。
但是Script router具有更强大的匹配功能，与此同时带来的是匹配消耗的资源更多，因此在生产环境中应当尽量少使用。&lt;/p>
&lt;p>Script router的示例代码与Condition router类似，在nacos配置上略有差别，这里仅提供nacos上的简单配置。&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-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">scope&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;application&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">key&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;script-server&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">enabled&lt;/span>: &lt;span style="color:#cb4b16">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">type&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;javascript&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">script&lt;/span>: |&lt;span style="color:#2aa198">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> (function(invokers, invocation, context) {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> if (!invokers || invokers.length === 0) return [];
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> return invokers.filter(function(invoker) {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> var url = invoker.GetURL();
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> return url &amp;amp;&amp;amp; url.Port === &amp;#34;20000&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> });
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#2aa198"> })(invokers, invocation, context);&lt;/span> 
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数说明:&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;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">type&lt;/td>
 &lt;td style="text-align: left">script的类型，目前仅可使用js&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">script&lt;/td>
 &lt;td style="text-align: left">script实际内容&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>完整示例请见: &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/script">本示例完整代码&lt;/a>。&lt;/p></description></item><item><title>条件路由</title><link>https://deploy-preview-3203--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-3203--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/condition_router/</guid><description>&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>
&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-client&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">WithConfigCenter&lt;/span>( &lt;span style="color:#586e75">// configure config center to enable condition router
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">&lt;/span>			config_center.&lt;span style="color:#268bd2">WithNacos&lt;/span>(),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			config_center.&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>	)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rep, err &lt;span style="color:#719e07">:=&lt;/span> srv.&lt;span style="color:#268bd2">Greet&lt;/span>(context.&lt;span style="color:#268bd2">Background&lt;/span>(), &lt;span style="color:#719e07">&amp;amp;&lt;/span>greet.GreetRequest{Name: &lt;span style="color:#2aa198">&amp;#34;hello world&amp;#34;&lt;/span>})
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>使用condition router必须在nacos等配置中心动态设置匹配规则。&lt;/p></description></item><item><title>Sentinel限流降级</title><link>https://deploy-preview-3203--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-3203--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-3203--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-3203--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-3203--dubbo.netlify.app/zh-cn/overview/mannual/golang-sdk/tutorial/traffic/affinity_router/</guid><description/></item></channel></rss>