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 2026/08/17 11:08:27 UTC

(dubbo-website) branch cn-site updated: deploy: a394ceb44cdaa858b35721998ebf43745811e388

This is an automated email from the ASF dual-hosted git repository.

github-actions[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 a1544e4914e deploy: a394ceb44cdaa858b35721998ebf43745811e388
a1544e4914e is described below

commit a1544e4914ee8be1e51f553623915d04dd7cd4cf
Author: Alanxtl <Al...@users.noreply.github.com>
AuthorDate: Mon Aug 17 11:08:20 2026 +0000

    deploy: a394ceb44cdaa858b35721998ebf43745811e388
---
 css/app.css                                        |   2 +-
 css/chunk-vendors.css                              |   2 +-
 en/index.xml                                       |  41 +++-
 .../mannual/golang-sdk/tutorial/rpc/index.html     |   2 +-
 .../mannual/golang-sdk/tutorial/rpc/index.xml      |  41 +++-
 .../golang-sdk/tutorial/rpc/streaming/index.html   | 268 ++++++++++-----------
 en/sitemap.xml                                     |   2 +-
 js/app.js                                          |   3 +-
 js/chunk-vendors.js                                |  61 +----
 sitemap.xml                                        |   2 +-
 zh-cn/index.xml                                    | 112 ++++-----
 .../mannual/golang-sdk/tutorial/rpc/index.xml      | 112 ++++-----
 .../golang-sdk/tutorial/rpc/streaming/index.html   | 268 ++++++++++-----------
 zh-cn/sitemap.xml                                  |   2 +-
 14 files changed, 430 insertions(+), 488 deletions(-)

diff --git a/css/app.css b/css/app.css
index 44c2a2c2469..b9457c8de14 100644
--- a/css/app.css
+++ b/css/app.css
@@ -1 +1 @@
-h3[data-v-76eccb7f]{margin:40px 0 0}ul[data-v-76eccb7f]{list-style-type:none;padding:0}li[data-v-76eccb7f]{display:inline-block;margin:0 10px}a[data-v-76eccb7f]{color:#42b983}.form-layout[data-v-76eccb7f]{display:flex;justify-content:space-between;align-items:flex-start}.left-form[data-v-76eccb7f]{flex:1;max-width:calc(50% - 20px);margin-right:20px}.right-text[data-v-76eccb7f]{flex-shrink:0;width:calc(50% - 20px)}.left-form .el-form-item__label[data-v-76eccb7f]{text-align:left}.left-form [...]
\ No newline at end of file
+/*Respond to static link checks, which will be dynamically replaced at build time*/
\ No newline at end of file
diff --git a/css/chunk-vendors.css b/css/chunk-vendors.css
index 61c66238ea8..b9457c8de14 100644
--- a/css/chunk-vendors.css
+++ b/css/chunk-vendors.css
@@ -1 +1 @@
-@font-face{font-family:element-icons;src:url(../fonts/element-icons.ff18efd1.woff) format("woff"),url(../fonts/element-icons.f1a45d74.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:gr [...]
\ No newline at end of file
+/*Respond to static link checks, which will be dynamically replaced at build time*/
\ No newline at end of file
diff --git a/en/index.xml b/en/index.xml
index 1e2c9764b54..ab641918604 100644
--- a/en/index.xml
+++ b/en/index.xml
@@ -1641,13 +1641,40 @@ Therefore, it should be used sparingly in production environments.&lt;/p&gt;</de
  &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;</description></item><item><title>Streaming Communication</title><link>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/</guid><description>&lt;p&gt;Sample source: &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/streaming" target="_blank"&gt;dubbo-go-samples/streaming&lt;/a&gt;.&lt;/p&gt;
-&lt;p&gt;Streaming communication is a new RPC data transfer mode offered by Dubbo3, suitable for the following scenarios:&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;Interfaces that need to send large amounts of data that cannot be placed in a single RPC request or response, requiring batch sending. However, traditional multiple RPC calls cannot resolve issues of order and performance, and if order is to be guaranteed, they must be sent serially.&lt;/li&gt;
-&lt;li&gt;Streaming scenarios where data needs to be processed in the order sent, and the data itself has no definite boundaries.&lt;/li&gt;
-&lt;li&gt;Push scenarios where multiple messages are sent and processed within the same call context.&lt;/li&gt;
-&lt;/ul&gt;
-&lt;p&gt;There are three types of Streaming communication:&lt;/p&gt;</description></item><item><title>Tag Router</title><link>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/traffic/tag_router/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/traffic/tag_router/</guid><description>&lt;p&gt;Related samples:&lt;/p&gt;
+&lt;p&gt;A unary RPC has one request and one response. Triple streaming allows a single RPC to carry a sequence of messages, which is useful for chunked data, server push, and real-time communication.&lt;/p&gt;
+&lt;h2 id="streaming-types"&gt;Streaming types&lt;/h2&gt;
+&lt;p&gt;In a &lt;code&gt;.proto&lt;/code&gt; method, the side marked with &lt;code&gt;stream&lt;/code&gt; can send more than one message:&lt;/p&gt;
+&lt;table&gt;
+ &lt;thead&gt;
+ &lt;tr&gt;
+ &lt;th&gt;Type&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;Requests&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;Responses&lt;/th&gt;
+ &lt;th&gt;Definition&lt;/th&gt;
+ &lt;/tr&gt;
+ &lt;/thead&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Server streaming&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Client streaming&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Bidirectional streaming&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+&lt;/table&gt;
+&lt;p&gt;Server streaming works well for event push and large downloads. Client streaming is commonly used for chunked uploads or server-side aggregation. In a bidirectional stream, sending and receiving are independent, making it suitable for chat and real-time control. The sample echoes each request immediately, but that is an application choice rather than a protocol requirement.&lt;/p&gt;</description></item><item><title>Tag Router</title><link>https://cn.dubbo.apache.org/en/overview [...]
 &lt;ul&gt;
 &lt;li&gt;Dynamic tag router: &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/tag" target="_blank"&gt;dubbo-go-samples/router/tag&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;Static tag router: &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/router/static_config/tag" target="_blank"&gt;dubbo-go-samples/router/static_config/tag&lt;/a&gt;&lt;/li&gt;
diff --git a/en/overview/mannual/golang-sdk/tutorial/rpc/index.html b/en/overview/mannual/golang-sdk/tutorial/rpc/index.html
index ea30f21df50..150ff5b6b95 100644
--- a/en/overview/mannual/golang-sdk/tutorial/rpc/index.html
+++ b/en/overview/mannual/golang-sdk/tutorial/rpc/index.html
@@ -693,7 +693,7 @@
 <label for=m-enoverviewnoticesprotocol-check><a href=/en/overview/notices/protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesprotocol><span>RPC Protocol Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesregistry-li><input type=checkbox id=m-enoverviewnoticesregistry-check>
 <label for=m-enoverviewnoticesregistry-check><a href=/en/overview/notices/registry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesregistry><span>Registry Center Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesadmin-li><input type=checkbox id=m-enoverviewnoticesadmin-check>
 <label for=m-enoverviewnoticesadmin-check><a href=/en/overview/notices/admin/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesadmin><span>Dubbo Admin Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticeslog4j-li><input type=checkbox id=m-enoverviewnoticeslog4j-check>
-<label for=m-enoverviewnoticeslog4j-check><a href=/en/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticeslog4j><span>Log4j Vulnerability Impact</span></a></label></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=/en/overview/>Documentation</a></li><li class=breadcrumb-item><a  [...]
+<label for=m-enoverviewnoticeslog4j-check><a href=/en/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticeslog4j><span>Log4j Vulnerability Impact</span></a></label></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=/en/overview/>Documentation</a></li><li class=breadcrumb-item><a  [...]
 <button class="btn btn-primary mb-4 feedback--no">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__disable [...]
 <a href="https://github.com/apache/dubbo-website/new/master/content/en//overview/mannual/golang-sdk/tutorial/rpc?filename=change-me.md&amp;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%60%0A%2A+Edit+the+%22front+mat [...]
 <a href="https://github.com/apache/dubbo-website/issues/new?title=RPC%20Framework" target=_blank><i class="fab fa-github fa-fw"></i> Create an issue</a>
diff --git a/en/overview/mannual/golang-sdk/tutorial/rpc/index.xml b/en/overview/mannual/golang-sdk/tutorial/rpc/index.xml
index 57731340f06..3c49506f1fb 100644
--- a/en/overview/mannual/golang-sdk/tutorial/rpc/index.xml
+++ b/en/overview/mannual/golang-sdk/tutorial/rpc/index.xml
@@ -1,11 +1,38 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RPC Framework on Apache Dubbo</title><link>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/</link><description>Recent content in RPC Framework on Apache Dubbo</description><generator>Hugo</generator><language>en</language><atom:link href="https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/index.xml" rel="self" type [...]
-&lt;p&gt;Streaming communication is a new RPC data transfer mode offered by Dubbo3, suitable for the following scenarios:&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;Interfaces that need to send large amounts of data that cannot be placed in a single RPC request or response, requiring batch sending. However, traditional multiple RPC calls cannot resolve issues of order and performance, and if order is to be guaranteed, they must be sent serially.&lt;/li&gt;
-&lt;li&gt;Streaming scenarios where data needs to be processed in the order sent, and the data itself has no definite boundaries.&lt;/li&gt;
-&lt;li&gt;Push scenarios where multiple messages are sent and processed within the same call context.&lt;/li&gt;
-&lt;/ul&gt;
-&lt;p&gt;There are three types of Streaming communication:&lt;/p&gt;</description></item><item><title>Timeout Duration</title><link>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/timeout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/timeout/</guid><description>&lt;h2 id="1-introduction"&gt;1. Introduction&lt;/h2&gt;
+&lt;p&gt;A unary RPC has one request and one response. Triple streaming allows a single RPC to carry a sequence of messages, which is useful for chunked data, server push, and real-time communication.&lt;/p&gt;
+&lt;h2 id="streaming-types"&gt;Streaming types&lt;/h2&gt;
+&lt;p&gt;In a &lt;code&gt;.proto&lt;/code&gt; method, the side marked with &lt;code&gt;stream&lt;/code&gt; can send more than one message:&lt;/p&gt;
+&lt;table&gt;
+ &lt;thead&gt;
+ &lt;tr&gt;
+ &lt;th&gt;Type&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;Requests&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;Responses&lt;/th&gt;
+ &lt;th&gt;Definition&lt;/th&gt;
+ &lt;/tr&gt;
+ &lt;/thead&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Server streaming&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Client streaming&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Bidirectional streaming&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+&lt;/table&gt;
+&lt;p&gt;Server streaming works well for event push and large downloads. Client streaming is commonly used for chunked uploads or server-side aggregation. In a bidirectional stream, sending and receiving are independent, making it suitable for chat and real-time control. The sample echoes each request immediately, but that is an application choice rather than a protocol requirement.&lt;/p&gt;</description></item><item><title>Timeout Duration</title><link>https://cn.dubbo.apache.org/en/ov [...]
 &lt;p&gt;This example demonstrates how to set the request timeout duration when initiating a call from the Dubbo-go client. You can view the &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/timeout" target="_blank"&gt;complete example source code&lt;/a&gt; here.&lt;/p&gt;
 &lt;h2 id="2-how-to-set-the-request-timeout-duration"&gt;2. How to Set the Request Timeout Duration&lt;/h2&gt;
 &lt;p&gt;When creating a client, you can set a global timeout using the &lt;code&gt;client.WithRequestTimeout()&lt;/code&gt; method (shared by all service proxies using this client).&lt;/p&gt;
diff --git a/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html b/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html
index b5a96fe12dd..76bc67cb3cb 100644
--- a/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html
+++ b/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html
@@ -1,4 +1,4 @@
-<!doctype html><html lang=en class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=alternate hreflang=zh-cn href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/><link rel=canonical href=https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq. [...]
+<!doctype html><html lang=en class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=alternate hreflang=zh-cn href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/><link rel=canonical href=https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq. [...]
 <a class=dropdown-item href=/en/overview/notices/>Security Notices</a>
 <a class=dropdown-item href=/en/contact/>Contributor's Guide</a></div></li><li class="nav-item nav-item-line px-2 mb-2 mb-lg-0"><a class=nav-link href=/en/blog/><span>Blog</span></a></li><li class="nav-item nav-item-line px-2 mb-2 mb-lg-0"><a class=nav-link href=/en/download/><span>DOWNLOAD</span></a></li><li class="nav-item dropdown d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>ECOSYSTEM</ [...]
 <a class=dropdown-item href=/zh-cn/overview/mannual/control-plane/>Visualizable Console</a>
@@ -693,27 +693,45 @@
 <label for=m-enoverviewnoticesprotocol-check><a href=/en/overview/notices/protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesprotocol><span>RPC Protocol Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesregistry-li><input type=checkbox id=m-enoverviewnoticesregistry-check>
 <label for=m-enoverviewnoticesregistry-check><a href=/en/overview/notices/registry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesregistry><span>Registry Center Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticesadmin-li><input type=checkbox id=m-enoverviewnoticesadmin-check>
 <label for=m-enoverviewnoticesadmin-check><a href=/en/overview/notices/admin/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticesadmin><span>Dubbo Admin Security</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enoverviewnoticeslog4j-li><input type=checkbox id=m-enoverviewnoticeslog4j-check>
-<label for=m-enoverviewnoticeslog4j-check><a href=/en/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticeslog4j><span>Log4j Vulnerability Impact</span></a></label></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=/en/overview/>Documentation</a></li><li class=breadcrumb-item><a  [...]
-and generate the corresponding files using <code>protoc-gen-go-triple</code>.</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-protobuf data-lang=protobuf><span style=display:flex><span><span style=color:#268bd2>service</span> GreetService {
+<label for=m-enoverviewnoticeslog4j-check><a href=/en/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enoverviewnoticeslog4j><span>Log4j Vulnerability Impact</span></a></label></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=/en/overview/>Documentation</a></li><li class=breadcrumb-item><a  [...]
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#719e07>package</span> greet;
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#719e07>option</span> go_package <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;github.com/apache/dubbo-go-samples/streaming/proto;greet&#34;</span>;
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#268bd2>service</span> GreetService {
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> Greet(GreetRequest) <span style=color:#719e07>returns</span> (GreetResponse) {}
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> GreetStream(stream GreetStreamRequest) <span style=color:#719e07>returns</span> (stream GreetStreamResponse) {}
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> GreetClientStream(stream GreetClientStreamRequest) <span style=color:#719e07>returns</span> (GreetClientStreamResponse) {}
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> GreetServerStream(GreetServerStreamRequest) <span style=color:#719e07>returns</span> (stream GreetServerStreamResponse) {}
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>Write the server handler file.</p><p>Source file path: dubbo-go-sample/streaming/go-server/cmd/server.go</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>type</span> GreetTripleServer <span style=color:#268bd2>struct</span> {
+</span></span></code></pre></div><p>Messages are defined in the same way as for unary RPCs; <code>stream</code> on the method signature provides the streaming semantics. After installing <code>protoc-gen-go</code> and <code>protoc-gen-go-triple</code>, generate the Go code from the <code>streaming</code> directory:</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-bash data-lang=bash><span st [...]
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go_out<span style=color:#719e07>=</span>. <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go_opt<span style=color:#719e07>=</span><span style=color:#268bd2>paths</span><span style=color:#719e07>=</span>source_relative <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go-triple_out<span style=color:#719e07>=</span>. <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go-triple_opt<span style=color:#719e07>=</span><span style=color:#268bd2>paths</span><span style=color:#719e07>=</span>source_relative <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  ./proto/greet.proto
+</span></span></code></pre></div><p>This creates <code>greet.pb.go</code> for the messages and <code>greet.triple.go</code> for the client, server, and registration APIs.</p><h2 id=server>Server</h2><p>The complete server is in <a href=https://github.com/apache/dubbo-go-samples/blob/main/streaming/go-server/cmd/server.go><code>streaming/go-server/cmd/server.go</code></a>. It listens on port <code>20000</code> and registers the generated <code>GreetService</code> handler:</p><div class=hi [...]
+</span></span><span style=display:flex><span>	server.<span style=color:#268bd2>WithServerProtocol</span>(protocol.<span style=color:#268bd2>WithPort</span>(<span style=color:#2aa198>20000</span>)),
+</span></span><span style=display:flex><span>)
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>Greet</span>(ctx context.Context, req <span style=color:#719e07>*</span>greet.GreetRequest) (<span style=color:#719e07>*</span>greet.GreetResponse, <span style=color:#dc322f>error</span>) {
-</span></span><span style=display:flex><span>	resp <span style=color:#719e07>:=</span> <span style=color:#719e07>&amp;</span>greet.GreetResponse{Greeting: req.Name}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> resp, <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> greet.<span style=color:#268bd2>RegisterGreetServiceHandler</span>(srv, <span style=color:#719e07>&amp;</span>GreetTripleServer{}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetStream</span>(ctx context.Context, stream greet.GreetService_GreetStreamServer) <span style=color:#dc322f>error</span> {
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> srv.<span style=color:#268bd2>Serve</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Error</span>(err)
+</span></span><span style=display:flex><span>}
+</span></span></code></pre></div><h3 id=bidirectional-streaming>Bidirectional streaming</h3><p><code>Recv()</code> reads a request and <code>Send()</code> writes a response. Once the client closes its request side, <code>Recv()</code> reports the end of the stream. <code>triple.IsEnded</code> distinguishes that normal condition from a transport error.</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= [...]
+</span></span><span style=display:flex><span>	ctx context.Context,
+</span></span><span style=display:flex><span>	stream greet.GreetService_GreetStreamServer,
+</span></span><span style=display:flex><span>) <span style=color:#dc322f>error</span> {
 </span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> {
 </span></span><span style=display:flex><span>		req, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>()
 </span></span><span style=display:flex><span>		<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>			<span style=color:#719e07>if</span> triple.<span style=color:#268bd2>IsEnded</span>(err) {
-</span></span><span style=display:flex><span>				<span style=color:#719e07>break</span>
+</span></span><span style=display:flex><span>				<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>			}
 </span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple BidiStream recv error: %s&#34;</span>, err)
 </span></span><span style=display:flex><span>		}
@@ -721,82 +739,48 @@ and generate the corresponding files using <code>protoc-gen-go-triple</code>.</p
 </span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple BidiStream send error: %s&#34;</span>, err)
 </span></span><span style=display:flex><span>		}
 </span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetClientStream</span>(ctx context.Context, stream greet.GreetService_GreetClientStreamServer) (<span style=color:#719e07>*</span>greet.GreetClientStreamResponse, <span style=color:#dc322f>error</span>) {
-</span></span><span style=display:flex><span>	<span style=color:#268bd2>var</span> reqs []<span style=color:#dc322f>string</span>
+</span></span></code></pre></div><h3 id=client-streaming>Client streaming</h3><p>The server reads all requests, joins their names, and returns one response. When using the iterator-style <code>Recv()</code>, check <code>Err()</code> after the loop.</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span  [...]
+</span></span><span style=display:flex><span>	ctx context.Context,
+</span></span><span style=display:flex><span>	stream greet.GreetService_GreetClientStreamServer,
+</span></span><span style=display:flex><span>) (<span style=color:#719e07>*</span>greet.GreetClientStreamResponse, <span style=color:#dc322f>error</span>) {
+</span></span><span style=display:flex><span>	<span style=color:#268bd2>var</span> names []<span style=color:#dc322f>string</span>
 </span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> stream.<span style=color:#268bd2>Recv</span>() {
-</span></span><span style=display:flex><span>		reqs = <span style=color:#b58900>append</span>(reqs, stream.<span style=color:#268bd2>Msg</span>().Name)
+</span></span><span style=display:flex><span>		names = <span style=color:#b58900>append</span>(names, stream.<span style=color:#268bd2>Msg</span>().Name)
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> stream.<span style=color:#268bd2>Err</span>() <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> <span style=color:#719e07>&amp;&amp;</span> !triple.<span style=color:#268bd2>IsEnded</span>(stream.<span style=color:#268bd2>Err</span>()) {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>, fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ClientStream recv err: %s&#34;</span>, stream.<span style=color:#268bd2>Err</span>())
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	resp <span style=color:#719e07>:=</span> <span style=color:#719e07>&amp;</span>greet.GreetClientStreamResponse{
-</span></span><span style=display:flex><span>		Greeting: strings.<span style=color:#268bd2>Join</span>(reqs, <span style=color:#2aa198>&#34;,&#34;</span>),
+</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>, fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ClientStream recv error: %s&#34;</span>, stream.<span style=color:#268bd2>Err</span>())
 </span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> resp, <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#719e07>&amp;</span>greet.GreetClientStreamResponse{
+</span></span><span style=display:flex><span>		Greeting: strings.<span style=color:#268bd2>Join</span>(names, <span style=color:#2aa198>&#34;,&#34;</span>),
+</span></span><span style=display:flex><span>	}, <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetServerStream</span>(ctx context.Context, req <span style=color:#719e07>*</span>greet.GreetServerStreamRequest, stream greet.GreetService_GreetServerStreamServer) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>5</span>; i<span style=color:#719e07>++</span> {
+</span></span></code></pre></div><h3 id=server-streaming>Server streaming</h3><p>A server-streaming handler receives one request but may call <code>Send()</code> more than once. Returning from the handler ends the response stream.</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e0 [...]
+</span></span><span style=display:flex><span>	ctx context.Context,
+</span></span><span style=display:flex><span>	req <span style=color:#719e07>*</span>greet.GreetServerStreamRequest,
+</span></span><span style=display:flex><span>	stream greet.GreetService_GreetServerStreamServer,
+</span></span><span style=display:flex><span>) <span style=color:#dc322f>error</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>10</span>; i<span style=color:#719e07>++</span> {
 </span></span><span style=display:flex><span>		<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetServerStreamResponse{Greeting: req.Name}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ServerStream send err: %s&#34;</span>, err)
+</span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ServerStream send error: %s&#34;</span>, err)
 </span></span><span style=display:flex><span>		}
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>Write the client file.</p><p>Source file path: dubbo-go-sample/streaming/go-client/cmd/client.go</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>main</span>() {
-</span></span><span style=display:flex><span>	cli, err <span style=color:#719e07>:=</span> client.<span style=color:#268bd2>NewClient</span>(
-</span></span><span style=display:flex><span>		client.<span style=color:#268bd2>WithClientURL</span>(<span style=color:#2aa198>&#34;tri://127.0.0.1:20000&#34;</span>),
-</span></span><span style=display:flex><span>	)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#b58900>panic</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	svc, err <span style=color:#719e07>:=</span> greet.<span style=color:#268bd2>NewGreetService</span>(cli)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#b58900>panic</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#268bd2>TestClient</span>(svc)
+</span></span></code></pre></div><h2 id=client>Client</h2><p>The complete client is in <a href=https://github.com/apache/dubbo-go-samples/blob/main/streaming/go-client/cmd/client.go><code>streaming/go-client/cmd/client.go</code></a>. Connect to the server and create the generated proxy before opening a stream:</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-go data-lang=go><span style=displ [...]
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>TestClient</span>(cli greet.GreetService) {
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testUnary</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testBidiStream</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testClientStream</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testServerStream</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
+</span></span><span style=display:flex><span>svc, err <span style=color:#719e07>:=</span> greet.<span style=color:#268bd2>NewGreetService</span>(cli)
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testUnary</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE unary call&#34;</span>)
-</span></span><span style=display:flex><span>	resp, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>Greet</span>(context.<span style=color:#268bd2>Background</span>(), <span style=color:#719e07>&amp;</span>greet.GreetRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>})
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE unary call resp: %s&#34;</span>, resp.Greeting)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span></code></pre></div><p>For a bidirectional stream, the client can alternate between <code>Send()</code> and <code>Recv()</code>, as below, or run them concurrently in separate goroutines:</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetStream</span>( [...]
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testBidiStream</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE bidi stream&#34;</span>)
-</span></span><span style=display:flex><span>	stream, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>GreetStream</span>(context.<span style=color:#268bd2>Background</span>())
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> sendErr <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); sendErr <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span><span style=color:#719e07>for</span> _, name <span style=color:#719e07>:=</span> <span style=color:#719e07>range</span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>&#34;triple-1&#34;</span>, <span style=color:#2aa198>&#34;triple-2&#34;</span>, <span style=color:#2aa198>&#34;triple-3&#34;</span>} {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetStreamRequest{Name: name}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>()
@@ -804,82 +788,96 @@ and generate the corresponding files using <code>protoc-gen-go-triple</code>.</p
 </span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE bidi stream resp: %s&#34;</span>, resp.Greeting)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseRequest</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseResponse</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseRequest</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseResponse</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span></code></pre></div><p>For client streaming, <code>CloseAndRecv()</code> finishes sending and waits for the single response:</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetClientStream</span>(context.<span style=color:#268bd2>Background</span>())
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>5</span>; i<span style=color:#719e07>++</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetClientStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseAndRecv</span>()
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE client stream resp: %s&#34;</span>, resp.Greeting)
+</span></span></code></pre></div><p>A server-streaming request is sent when the stream is opened. The client then reads responses until the stream ends:</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetServerStream</span>(
+</span></span><span style=display:flex><span>	context.<span style=color:#268bd2>Background</span>(),
+</span></span><span style=display:flex><span>	<span style=color:#719e07>&amp;</span>greet.GreetServerStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>},
+</span></span><span style=display:flex><span>)
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>for</span> stream.<span style=color:#268bd2>Recv</span>() {
+</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE server stream resp: %s&#34;</span>, stream.<span style=color:#268bd2>Msg</span>().Greeting)
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Err</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Close</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span></code></pre></div><h2 id=closing-a-stream>Closing a stream</h2><p>The request and response sides of a bidirectional stream can be closed separately:</p><table><thead><tr><th>API</th><th>When to use it</th></tr></thead><tbody><tr><td><code>CloseRequest()</code></td><td>The client has finished sending. It may continue to receive responses afterward.</td></tr><tr><td><code>CloseResponse()</code></td><td>The client has read all responses, or no longer needs the remaining respo [...]
+</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>ResponseHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-status&#34;</span>, <span style=color:#2aa198>&#34;ready&#34;</span>)
+</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>ResponseTrailer</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-result&#34;</span>, <span style=color:#2aa198>&#34;completed&#34;</span>)
 </span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testClientStream</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE client stream&#34;</span>)
-</span></span><span style=display:flex><span>	stream, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>GreetClientStream</span>(context.<span style=color:#268bd2>Background</span>())
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>5</span>; i<span style=color:#719e07>++</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>if</span> sendErr <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetClientStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); sendErr <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>		}
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseAndRecv</span>()
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE client stream resp: %s&#34;</span>, resp.Greeting)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;request id: %s&#34;</span>, requestID)
+</span></span></code></pre></div><p>Set request headers before the first <code>Send()</code>. Read response headers after the first response arrives, and read trailers after the response stream ends.</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetStream</span>(c [...]
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>RequestHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-request-id&#34;</span>, <span style=color:#2aa198>&#34;stream-demo-001&#34;</span>)
 </span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testServerStream</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE server stream&#34;</span>)
-</span></span><span style=display:flex><span>	stream, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>GreetServerStream</span>(context.<span style=color:#268bd2>Background</span>(), <span style=color:#719e07>&amp;</span>greet.GreetServerStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>})
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> stream.<span style=color:#268bd2>Recv</span>() {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE server stream resp: %s&#34;</span>, stream.<span style=color:#268bd2>Msg</span>().Greeting)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> stream.<span style=color:#268bd2>Err</span>() <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Close</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>Streaming calls also expose Triple metadata through the generated stream APIs:</p><table><thead><tr><th>Side</th><th>API</th><th>Purpose</th></tr></thead><tbody><tr><td>Client stream and bidirectional client</td><td><code>RequestHeader()</code></td><td>Add request metadata before the first message is sent</td></tr><tr><td>Server stream and bidirectional client</td><td><code>ResponseHeader()</code></td><td>Read response headers returned by the server</t [...]
+</span></span><span style=display:flex><span>resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>()
 </span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>RequestHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-sample-token&#34;</span>, <span style=color:#2aa198>&#34;demo-token&#34;</span>)
-</span></span></code></pre></div><p>And on the server side you can return response metadata from a stream handler:</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetServerStream</span>(
-</span></span><span style=display:flex><span>	ctx context.Context,
-</span></span><span style=display:flex><span>	req <span style=color:#719e07>*</span>greet.GreetServerStreamRequest,
-</span></span><span style=display:flex><span>	stream greet.GreetService_GreetServerStreamServer,
-</span></span><span style=display:flex><span>) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	stream.<span style=color:#268bd2>ResponseHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-header&#34;</span>, <span style=color:#2aa198>&#34;ready&#34;</span>)
-</span></span><span style=display:flex><span>	stream.<span style=color:#268bd2>ResponseTrailer</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-trailer&#34;</span>, <span style=color:#2aa198>&#34;done&#34;</span>)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;response: %s&#34;</span>, resp.Greeting)
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;header: %s&#34;</span>, stream.<span style=color:#268bd2>ResponseHeader</span>().<span style=color:#268bd2>Get</span>(<span style=color:#2aa198>&#34;x-stream-status&#34;</span>))
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseRequest</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> _, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> <span style=color:#719e07>&amp;&amp;</span> !triple.<span style=color:#268bd2>IsEnded</span>(err) {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;trailer: %s&#34;</span>, stream.<span style=color:#268bd2>ResponseTrailer</span>().<span style=color:#268bd2>Get</span>(<span style=color:#2aa198>&#34;x-stream-result&#34;</span>))
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseResponse</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><h2 id=3-running-effect>3. Running Effect</h2><p>Run the server and client, and you will see the requests return normally.</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-fallback data-lang=fallback><span style=display:flex><span>[start to test TRIPLE unary call]
-</span></span><span style=display:flex><span>TRIPLE unary call resp: [triple]
-</span></span><span style=display:flex><span>[start to test TRIPLE bidi stream]
-</span></span><span style=display:flex><span>TRIPLE bidi stream resp: [triple]
-</span></span><span style=display:flex><span>[start to test TRIPLE client stream]
-</span></span><span style=display:flex><span>TRIPLE client stream resp: [triple,triple,triple,triple,triple]
-</span></span><span style=display:flex><span>[start to test TRIPLE server stream]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
+</span></span></code></pre></div><p>Metadata names beginning with <code>Triple-</code> or <code>Grpc-</code> are reserved by the protocol and should not be written by applications.</p><h2 id=run-the-sample>Run the sample</h2><p>In an existing <code>dubbo-go-samples</code> checkout, enter the <code>streaming</code> directory and start the server:</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=langua [...]
+</span></span><span style=display:flex><span>go run ./go-server/cmd/server.go
+</span></span></code></pre></div><p>Open another terminal, re-enter the <code>streaming</code> directory, and start the client:</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-bash data-lang=bash><span style=display:flex><span><span style=color:#b58900>cd</span> dubbo-go-samples/streaming
+</span></span><span style=display:flex><span>go run ./go-client/cmd/client.go
+</span></span></code></pre></div><p>The client runs the unary, bidirectional, client-streaming, and server-streaming calls in order. Ignoring log prefixes, the relevant output is:</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-text data-lang=text><span style=display:flex><span>start to test TRIPLE unary call
+</span></span><span style=display:flex><span>TRIPLE unary call resp: triple
+</span></span><span style=display:flex><span>start to test TRIPLE bidi stream
+</span></span><span style=display:flex><span>TRIPLE bidi stream resp: triple-1
+</span></span><span style=display:flex><span>TRIPLE bidi stream resp: triple-2
+</span></span><span style=display:flex><span>TRIPLE bidi stream resp: triple-3
+</span></span><span style=display:flex><span>start to test TRIPLE client stream
+</span></span><span style=display:flex><span>TRIPLE client stream resp: triple,triple,triple,triple,triple
+</span></span><span style=display:flex><span>start to test TRIPLE server stream
+</span></span><span style=display:flex><span>TRIPLE server stream resp #1: triple
+</span></span><span style=display:flex><span>TRIPLE server stream resp #2: triple
+</span></span><span style=display:flex><span>...
+</span></span><span style=display:flex><span>TRIPLE server stream resp #10: triple
 </span></span></code></pre></div><div id=pre-footer><h2>Feedback</h2><p class=feedback--prompt>Was this page helpful?</p><button class="btn btn-primary mb-4 feedback--yes">Yes</button>
-<button class="btn btn-primary mb-4 feedback--no">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__disable [...]
+<button class="btn btn-primary mb-4 feedback--no">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__disable [...]
 <a href="https://github.com/apache/dubbo-website/new/master/content/en//overview/mannual/golang-sdk/tutorial/rpc/streaming?filename=change-me.md&amp;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%60%0A%2A+Edit+the+%2 [...]
 <a href="https://github.com/apache/dubbo-website/issues/new?title=Streaming%20Communication" target=_blank><i class="fab fa-github fa-fw"></i> Create an issue</a>
-<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#1-introduction>1. Introduction</a></li><li><a href=#2-how-to-use-dubbo-go-streaming-communication>2. How to use Dubbo-go streaming communication</a></li><li><a href=#3-running-effect>3. Running Effect</a></li></ul></nav></div></div></div></div><footer><div class=footer-container><div class=footer-container-left><div cla [...]
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#streaming-types>Streaming types</a></li><li><a href=#define-the-service>Define the service</a></li><li><a href=#server>Server</a><ul><li><a href=#bidirectional-streaming>Bidirectional streaming</a></li><li><a href=#client-streaming>Client streaming</a></li><li><a href=#server-streaming>Server streaming</a></li></ul></li [...]
 <button class="contact-btn qr-container" onmouseover='showQRCode("dingding-qr")' onmouseout='hideQRCode("dingding-qr")'>DINGTALK CHANNEL<div class=qr-code id=dingding-qr style=display:none><img src=https://img.alicdn.com/imgextra/i4/O1CN01buuadT274Lj33QZWQ_!!6000000007743-0-tps-1170-1477.jpg alt="DingTalk QR Code"></div></button>
 <button class=contact-btn><a href=https://github.com/apache/dubbo/>GitHub</a></button></div></div><div class=footer-container-right><ul><li>DOCUMENTATION</li><li><a href=/en/overview/>Overview</a></li><li><a href=/en/overview/quickstart/>Quick Start</a></li><li><a href=/en/contact/contributor/software-donation-guide_dev/>Developer guide</a></li></ul><ul><li>RESOURCES</li><li><a href=/en/contact/>Community</a></li></ul></div></div><div style="width:85.125rem;height:0;border:1px solid #ddd [...]
 project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States
diff --git a/en/sitemap.xml b/en/sitemap.xml
index dd6ac646c46..4c03f4f5fa2 100644
--- a/en/sitemap.xml
+++ b/en/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/en/blog/2023/01/16/alibaba-upgrades-dubbo3-to-fully-replace-hsf2/</loc><lastmod>2024-09-30T17:53:33+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority><xhtml:link rel="alternate" hreflang="zh-cn" href="https://cn.dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7 [...]
\ 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/en/blog/2023/01/16/alibaba-upgrades-dubbo3-to-fully-replace-hsf2/</loc><lastmod>2024-09-30T17:53:33+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority><xhtml:link rel="alternate" hreflang="zh-cn" href="https://cn.dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7 [...]
\ No newline at end of file
diff --git a/js/app.js b/js/app.js
index ad5e9d04466..069248774b1 100644
--- a/js/app.js
+++ b/js/app.js
@@ -1,2 +1 @@
-(function(){"use strict";var t={5030:function(t,e,r){var n=r(2856),o=function(){var t=this,e=t._self._c;return e("div",{attrs:{id:"app"}},[e("el-row",[e("el-col",{attrs:{span:24}},[e("div",{staticStyle:{"font-size":"30px"}},[t._v("Dubbo 基准测试")])])],1),e("el-row",[e("el-col",{attrs:{span:24}},[e("div",{staticStyle:{"font-size":"15px","text-align":"right"}},[e("a",{attrs:{target:"_blank",href:"https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about- [...]
-//# sourceMappingURL=app.48d8cf2a.js.map
\ No newline at end of file
+// Respond to static link checks, which will be dynamically replaced at build time
\ No newline at end of file
diff --git a/js/chunk-vendors.js b/js/chunk-vendors.js
index d5ecf73f458..069248774b1 100644
--- a/js/chunk-vendors.js
+++ b/js/chunk-vendors.js
@@ -1,60 +1 @@
-(self["webpackChunkdubbo_benchmark"]=self["webpackChunkdubbo_benchmark"]||[]).push([[504],{1656:function(e,t,n){"use strict";function i(e,t,n,i,r,o,a,s){var l,u="function"===typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),i&&(u.functional=!0),o&&(u._scopeId="data-v-"+o),a?(l=function(e){e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,e||"undefined"===typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),r&& [...]
-/**
- * @license
- * Lodash <https://lodash.com/>
- * Copyright JS Foundation and other contributors <https://js.foundation/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */(function(){var o,a="4.17.10",s=200,l="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",u="Expected a function",c="__lodash_hash_undefined__",h=500,d="__lodash_placeholder__",p=1,f=2,g=4,v=1,m=2,y=1,b=2,_=4,x=8,w=16,S=32,C=64,k=128,M=256,T=512,D=30,I="...",O=800,A=16,E=1,P=2,L=3,N=1/0,R=9007199254740991,$=17976931348623157e292,z=NaN,V=4294967295,F=V-1,B=V>>>1,j=[["ary",k],["bind",y],["bindKey",b],["curry",x],["curryRight",w],["flip",T],["partial",S],["partialRight",C], [...]
-/**
- * @fileOverview Kickass library to create and place poppers near their reference elements.
- * @version {{version}}
- * @license
- * Copyright (c) 2016 Federico Zivolo and contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */(function(o,a){i=a,r="function"===typeof i?i.call(t,n,t,e):i,void 0===r||(e.exports=r)})(0,function(){var e=window,t={placement:"bottom",gpuAcceleration:!0,offset:0,boundariesElement:"viewport",boundariesPadding:5,preventOverflowOrder:["left","right","top","bottom"],flipBehavior:"flip",arrowElement:"[x-arrow]",arrowOffset:0,modifiers:["shift","offset","preventOverflow","keepTogether","arrow","flip","applyStyle"],modifiersIgnored:[],forceAbsolute:!1};function n(e,n,i){this._reference=e [...]
-/*!
- * jQuery JavaScript Library v3.7.1
- * https://jquery.com/
- *
- * Copyright OpenJS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2023-08-28T13:37Z
- */
-function(t,n){"use strict";"object"===typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!==typeof window?window:this,function(n,o){"use strict";var a=[],s=Object.getPrototypeOf,l=a.slice,u=a.flat?function(e){return a.flat.call(e)}:function(e){return a.concat.apply([],e)},c=a.push,h=a.indexOf,d={},p=d.toString,f=d.hasOwnProperty,g=f.toString,v=g.call(Object),m={},y=function(e){ [...]
-/**
- * Checks if an event is supported in the current execution environment.
- *
- * NOTE: This will not work correctly for non-generic events such as `change`,
- * `reset`, `load`, `error`, and `select`.
- *
- * Borrows from Modernizr.
- *
- * @param {string} eventNameSuffix Event name, e.g. "click".
- * @param {?boolean} capture Check if the capture phase is supported.
- * @return {boolean} True if the event is supported.
- * @internal
- * @license Modernizr 3.0.0pre (Custom Build) | MIT
- */
-function o(e,t){if(!r.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,o=n in document;if(!o){var a=document.createElement("div");a.setAttribute(n,"return;"),o="function"===typeof a[n]}return!o&&i&&"wheel"===e&&(o=document.implementation.hasFeature("Events.wheel","3.0")),o}r.canUseDOM&&(i=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")),e.exports=o},9030:function(e,t,n){"use strict";var i=n(8656),r=n(2021),o= [...]
-//# sourceMappingURL=chunk-vendors.d5312e18.js.map
\ No newline at end of file
+// Respond to static link checks, which will be dynamically replaced at build time
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
index 0b57d4a4ab1..31707b5c0bd 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>2026-08-17T14:08:54+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2026-08-17T14:08:54+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>2026-08-17T18:54:46+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2026-08-17T18:54:46+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
diff --git a/zh-cn/index.xml b/zh-cn/index.xml
index 3ae959bb66b..c39d203eeb3 100644
--- a/zh-cn/index.xml
+++ b/zh-cn/index.xml
@@ -8175,79 +8175,55 @@ Dubbo &amp;gt;= 3.1.6&lt;/p&gt;
 &lt;ul&gt;
 &lt;li&gt;
 &lt;p&gt;Span:基本工作单元。例如,发送 RPC 是一个新的 span,发送对 RPC 的响应也是如此。Span还有其他数据,例如description、带时间戳的事件、键值注释(标签)、导致它们的跨度的 ID 和进程 ID(通常是 IP 地址)。跨度可以启动和停止,并且它们会跟踪它们的时间信息。创建跨度后,您必须在将来的某个时间点停止它。&lt;/p&gt;</description></item><item><title>流式通信</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/</guid><description> [...]
-&lt;p&gt;Streaming 流式通信是 Dubbo3 新提供的一种 RPC 数据传输模式,适用于以下场景:&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;接口需要发送大量数据,这些数据无法被放在一个 RPC 的请求或响应中,需要分批发送,但应用层如果按照传统的多次 RPC 方式无法解决顺序和性能的问题,如果需要保证有序,则只能串行发送&lt;/li&gt;
-&lt;li&gt;流式场景,数据需要按照发送顺序处理, 数据本身是没有确定边界的&lt;/li&gt;
-&lt;li&gt;推送类场景,多个消息在同一个调用的上下文中被发送和处理&lt;/li&gt;
-&lt;/ul&gt;
-&lt;p&gt;Streaming 流式通信类型分为以下三种:&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;SERVER_STREAM(服务端流)&lt;/li&gt;
-&lt;li&gt;CLIENT_STREAM(客户端流)&lt;/li&gt;
-&lt;li&gt;BIDIRECTIONAL_STREAM(双向流)&lt;/li&gt;
-&lt;/ul&gt;
-&lt;h2 id="1介绍"&gt;1.介绍&lt;/h2&gt;
-&lt;p&gt;本文档演示如何在 Dubbo-go 中使用流式通信。&lt;/p&gt;
-&lt;h2 id="2如何使用dubbo-go流式通信"&gt;2.如何使用Dubbo-go流式通信&lt;/h2&gt;
-&lt;p&gt;在 proto 文件中,为需要流式通信的方法请求类型或响应类型添加 &lt;code&gt;stream&lt;/code&gt;,然后使用 &lt;code&gt;protoc-gen-go-triple&lt;/code&gt;
-生成对应代码。&lt;/p&gt;
-&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-protobuf" data-lang="protobuf"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;service&lt;/span&gt; GreetService {
+&lt;p&gt;普通 RPC 只有一个请求和一个响应。Triple 流式调用允许在一次 RPC 中连续收发多条消息,适合文件分片、消息推送和实时交互等场景。&lt;/p&gt;
+&lt;h2 id="流式调用的类型"&gt;流式调用的类型&lt;/h2&gt;
+&lt;p&gt;在 &lt;code&gt;.proto&lt;/code&gt; 中,&lt;code&gt;stream&lt;/code&gt; 写在哪一侧,就表示哪一侧可以发送多条消息:&lt;/p&gt;
+&lt;table&gt;
+ &lt;thead&gt;
+ &lt;tr&gt;
+ &lt;th&gt;类型&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;请求数&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;响应数&lt;/th&gt;
+ &lt;th&gt;定义形式&lt;/th&gt;
+ &lt;/tr&gt;
+ &lt;/thead&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;服务端流(server streaming)&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;客户端流(client streaming)&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;双向流(bidirectional streaming)&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+&lt;/table&gt;
+&lt;p&gt;服务端流常用于消息推送和大文件下载;客户端流适合分片上传或批量汇总;双向流的发送和接收彼此独立,适合聊天、实时控制等长连接场景。示例中的双向流采用 echo 方式逐条返回消息,这只是业务实现,并不是协议限制。&lt;/p&gt;
+&lt;h2 id="定义接口"&gt;定义接口&lt;/h2&gt;
+&lt;p&gt;示例在 &lt;a href="https://github.com/apache/dubbo-go-samples/blob/main/streaming/proto/greet.proto"&gt;&lt;code&gt;streaming/proto/greet.proto&lt;/code&gt;&lt;/a&gt; 中同时定义了三种流式方法:&lt;/p&gt;
+&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-protobuf" data-lang="protobuf"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;syntax &lt;span style="color:#719e07"&gt;=&lt;/span&gt; &lt;span style="color:#2aa198"&gt;&amp;#34;proto3&amp;#34;&lt;/span&gt;;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#719e07"&gt;package&lt;/span&gt; greet;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#719e07"&gt;option&lt;/span&gt; go_package &lt;span style="color:#719e07"&gt;=&lt;/span&gt; &lt;span style="color:#2aa198"&gt;&amp;#34;github.com/apache/dubbo-go-samples/streaming/proto;greet&amp;#34;&lt;/span&gt;;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;service&lt;/span&gt; GreetService {
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; Greet(GreetRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (GreetResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; GreetStream(stream GreetStreamRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (stream GreetStreamResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; GreetClientStream(stream GreetClientStreamRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (GreetClientStreamResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; GreetServerStream(GreetServerStreamRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (stream GreetServerStreamResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编写服务端handler文件&lt;/p&gt;
-&lt;p&gt;源文件路径: dubbo-go-sample/streaming/go-server/cmd/server.go&lt;/p&gt;
-&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;type&lt;/span&gt; GreetTripleServer &lt;span style="color:#268bd2"&gt;struct&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;Greet&lt;/span&gt;(ctx context.Context, req &lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetRequest) (&lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetResponse, &lt;span style="color:#dc322f"&gt;error&lt;/span&gt;) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	resp &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; &lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetResponse{Greeting: req.Name}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; resp, &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;GreetStream&lt;/span&gt;(ctx context.Context, stream greet.GreetService_GreetStreamServer) &lt;span style="color:#dc322f"&gt;error&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;for&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		req, err &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Recv&lt;/span&gt;()
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;if&lt;/span&gt; err &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;if&lt;/span&gt; triple.&lt;span style="color:#268bd2"&gt;IsEnded&lt;/span&gt;(err) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#719e07"&gt;break&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;return&lt;/span&gt; fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple BidiStream recv error: %s&amp;#34;&lt;/span&gt;, err)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;if&lt;/span&gt; err &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Send&lt;/span&gt;(&lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetStreamResponse{Greeting: req.Name}); err &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;return&lt;/span&gt; fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple BidiStream send error: %s&amp;#34;&lt;/span&gt;, err)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;GreetClientStream&lt;/span&gt;(ctx context.Context, stream greet.GreetService_GreetClientStreamServer) (&lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetClientStreamResponse, &lt;span style="color:#dc322f"&gt;error&lt;/span&gt;) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#268bd2"&gt;var&lt;/span&gt; reqs []&lt;span style="color:#dc322f"&gt;string&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;for&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Recv&lt;/span&gt;() {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		reqs = &lt;span style="color:#b58900"&gt;append&lt;/span&gt;(reqs, stream.&lt;span style="color:#268bd2"&gt;Msg&lt;/span&gt;().Name)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;if&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Err&lt;/span&gt;() &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; &lt;span style="color:#719e07"&gt;&amp;amp;&amp;amp;&lt;/span&gt; !triple.&lt;span style="color:#268bd2"&gt;IsEnded&lt;/span&gt;(stream.&lt;span style="color:#268bd2"&gt;Err&lt;/span&gt;()) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;return&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;, fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple ClientStream recv err: %s&amp;#34;&lt;/span&gt;, stream.&lt;span style="color:#268bd2"&gt;Err&lt;/span&gt;())
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	resp &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; &lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetClientStreamResponse{
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Greeting: strings.&lt;span style="color:#268bd2"&gt;Join&lt;/span&gt;(reqs, &lt;span style="color:#2aa198"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;),
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; resp, &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;GreetServerStream&lt;/span&gt;(ctx context.Context, req &lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetServerStreamRequest, stream greet.GreetService_GreetServerStreamServer) &lt;span style="color:#dc322f"&gt;error&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;for&lt;/span&gt; i &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; &lt;span style="color:#2aa198"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color:#2aa198"&gt;5&lt;/span&gt;; i&lt;span style="color:#719e07"&gt;++&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;if&lt;/span&gt; err &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Send&lt;/span&gt;(&lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetServerStreamResponse{Greeting: req.Name}); err &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;return&lt;/span&gt; fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple ServerStream send err: %s&amp;#34;&lt;/span&gt;, err)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编写客户端client文件&lt;/p&gt;</description></item><item><title>Dubbo 路由(router)机制及其如何实现流量管控介绍</title><link>https://cn.dubbo.apache.org/zh-cn/overview/what/core-features/traffic/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/what/core-features/traffic/introduction/</guid><description>&lt;p&gt;Dubbo 提供了丰富的流量管控策略&lt;/p&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;消息类型的写法与普通 RPC 相同,流式语义由方法签名中的 &lt;code&gt;stream&lt;/code&gt; 决定。安装 &lt;code&gt;protoc-gen-go&lt;/code&gt; 和 &lt;code&gt;protoc-gen-go-triple&lt;/code&gt; 后,可以在 &lt;code&gt;streaming&lt;/code&gt; 目录生成 Go 代码:&lt;/p&gt;</description></item><item><title>Dubbo 路由(router)机制及其如何实现流量管控介绍</title><link>https://cn.dubbo.apache.org/zh-cn/overview/what/core-features/traffic/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00  [...]
 &lt;ul&gt;
 &lt;li&gt;&lt;strong&gt;地址发现与负载均衡&lt;/strong&gt;,地址发现支持服务实例动态上下线,负载均衡确保流量均匀的分布到每个实例上。&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;基于路由规则的流量管控&lt;/strong&gt;,路由规则对每次请求进行条件匹配,并将符合条件的请求路由到特定的地址子集。&lt;/li&gt;
diff --git a/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/index.xml b/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/index.xml
index e604370487c..34ab9b0b8d0 100644
--- a/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/index.xml
+++ b/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/index.xml
@@ -1,77 +1,53 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RPC框架 on Apache Dubbo</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/</link><description>Recent content in RPC框架 on Apache Dubbo</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/index.xml" rel="self" type="appli [...]
-&lt;p&gt;Streaming 流式通信是 Dubbo3 新提供的一种 RPC 数据传输模式,适用于以下场景:&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;接口需要发送大量数据,这些数据无法被放在一个 RPC 的请求或响应中,需要分批发送,但应用层如果按照传统的多次 RPC 方式无法解决顺序和性能的问题,如果需要保证有序,则只能串行发送&lt;/li&gt;
-&lt;li&gt;流式场景,数据需要按照发送顺序处理, 数据本身是没有确定边界的&lt;/li&gt;
-&lt;li&gt;推送类场景,多个消息在同一个调用的上下文中被发送和处理&lt;/li&gt;
-&lt;/ul&gt;
-&lt;p&gt;Streaming 流式通信类型分为以下三种:&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;SERVER_STREAM(服务端流)&lt;/li&gt;
-&lt;li&gt;CLIENT_STREAM(客户端流)&lt;/li&gt;
-&lt;li&gt;BIDIRECTIONAL_STREAM(双向流)&lt;/li&gt;
-&lt;/ul&gt;
-&lt;h2 id="1介绍"&gt;1.介绍&lt;/h2&gt;
-&lt;p&gt;本文档演示如何在 Dubbo-go 中使用流式通信。&lt;/p&gt;
-&lt;h2 id="2如何使用dubbo-go流式通信"&gt;2.如何使用Dubbo-go流式通信&lt;/h2&gt;
-&lt;p&gt;在 proto 文件中,为需要流式通信的方法请求类型或响应类型添加 &lt;code&gt;stream&lt;/code&gt;,然后使用 &lt;code&gt;protoc-gen-go-triple&lt;/code&gt;
-生成对应代码。&lt;/p&gt;
-&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-protobuf" data-lang="protobuf"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;service&lt;/span&gt; GreetService {
+&lt;p&gt;普通 RPC 只有一个请求和一个响应。Triple 流式调用允许在一次 RPC 中连续收发多条消息,适合文件分片、消息推送和实时交互等场景。&lt;/p&gt;
+&lt;h2 id="流式调用的类型"&gt;流式调用的类型&lt;/h2&gt;
+&lt;p&gt;在 &lt;code&gt;.proto&lt;/code&gt; 中,&lt;code&gt;stream&lt;/code&gt; 写在哪一侧,就表示哪一侧可以发送多条消息:&lt;/p&gt;
+&lt;table&gt;
+ &lt;thead&gt;
+ &lt;tr&gt;
+ &lt;th&gt;类型&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;请求数&lt;/th&gt;
+ &lt;th style="text-align: right"&gt;响应数&lt;/th&gt;
+ &lt;th&gt;定义形式&lt;/th&gt;
+ &lt;/tr&gt;
+ &lt;/thead&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;服务端流(server streaming)&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;客户端流(client streaming)&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;1&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;双向流(bidirectional streaming)&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td style="text-align: right"&gt;N&lt;/td&gt;
+ &lt;td&gt;&lt;code&gt;rpc Method(stream Request) returns (stream Response)&lt;/code&gt;&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+&lt;/table&gt;
+&lt;p&gt;服务端流常用于消息推送和大文件下载;客户端流适合分片上传或批量汇总;双向流的发送和接收彼此独立,适合聊天、实时控制等长连接场景。示例中的双向流采用 echo 方式逐条返回消息,这只是业务实现,并不是协议限制。&lt;/p&gt;
+&lt;h2 id="定义接口"&gt;定义接口&lt;/h2&gt;
+&lt;p&gt;示例在 &lt;a href="https://github.com/apache/dubbo-go-samples/blob/main/streaming/proto/greet.proto"&gt;&lt;code&gt;streaming/proto/greet.proto&lt;/code&gt;&lt;/a&gt; 中同时定义了三种流式方法:&lt;/p&gt;
+&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-protobuf" data-lang="protobuf"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;syntax &lt;span style="color:#719e07"&gt;=&lt;/span&gt; &lt;span style="color:#2aa198"&gt;&amp;#34;proto3&amp;#34;&lt;/span&gt;;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#719e07"&gt;package&lt;/span&gt; greet;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#719e07"&gt;option&lt;/span&gt; go_package &lt;span style="color:#719e07"&gt;=&lt;/span&gt; &lt;span style="color:#2aa198"&gt;&amp;#34;github.com/apache/dubbo-go-samples/streaming/proto;greet&amp;#34;&lt;/span&gt;;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;service&lt;/span&gt; GreetService {
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; Greet(GreetRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (GreetResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; GreetStream(stream GreetStreamRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (stream GreetStreamResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; GreetClientStream(stream GreetClientStreamRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (GreetClientStreamResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#719e07"&gt;rpc&lt;/span&gt; GreetServerStream(GreetServerStreamRequest) &lt;span style="color:#719e07"&gt;returns&lt;/span&gt; (stream GreetServerStreamResponse) {}
 &lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编写服务端handler文件&lt;/p&gt;
-&lt;p&gt;源文件路径: dubbo-go-sample/streaming/go-server/cmd/server.go&lt;/p&gt;
-&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;type&lt;/span&gt; GreetTripleServer &lt;span style="color:#268bd2"&gt;struct&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;Greet&lt;/span&gt;(ctx context.Context, req &lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetRequest) (&lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetResponse, &lt;span style="color:#dc322f"&gt;error&lt;/span&gt;) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	resp &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; &lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetResponse{Greeting: req.Name}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; resp, &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;GreetStream&lt;/span&gt;(ctx context.Context, stream greet.GreetService_GreetStreamServer) &lt;span style="color:#dc322f"&gt;error&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;for&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		req, err &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Recv&lt;/span&gt;()
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;if&lt;/span&gt; err &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;if&lt;/span&gt; triple.&lt;span style="color:#268bd2"&gt;IsEnded&lt;/span&gt;(err) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#719e07"&gt;break&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;return&lt;/span&gt; fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple BidiStream recv error: %s&amp;#34;&lt;/span&gt;, err)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;if&lt;/span&gt; err &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Send&lt;/span&gt;(&lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetStreamResponse{Greeting: req.Name}); err &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;return&lt;/span&gt; fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple BidiStream send error: %s&amp;#34;&lt;/span&gt;, err)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;GreetClientStream&lt;/span&gt;(ctx context.Context, stream greet.GreetService_GreetClientStreamServer) (&lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetClientStreamResponse, &lt;span style="color:#dc322f"&gt;error&lt;/span&gt;) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#268bd2"&gt;var&lt;/span&gt; reqs []&lt;span style="color:#dc322f"&gt;string&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;for&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Recv&lt;/span&gt;() {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		reqs = &lt;span style="color:#b58900"&gt;append&lt;/span&gt;(reqs, stream.&lt;span style="color:#268bd2"&gt;Msg&lt;/span&gt;().Name)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;if&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Err&lt;/span&gt;() &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; &lt;span style="color:#719e07"&gt;&amp;amp;&amp;amp;&lt;/span&gt; !triple.&lt;span style="color:#268bd2"&gt;IsEnded&lt;/span&gt;(stream.&lt;span style="color:#268bd2"&gt;Err&lt;/span&gt;()) {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;return&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;, fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple ClientStream recv err: %s&amp;#34;&lt;/span&gt;, stream.&lt;span style="color:#268bd2"&gt;Err&lt;/span&gt;())
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	resp &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; &lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetClientStreamResponse{
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Greeting: strings.&lt;span style="color:#268bd2"&gt;Join&lt;/span&gt;(reqs, &lt;span style="color:#2aa198"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;),
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; resp, &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#268bd2"&gt;func&lt;/span&gt; (srv &lt;span style="color:#719e07"&gt;*&lt;/span&gt;GreetTripleServer) &lt;span style="color:#268bd2"&gt;GreetServerStream&lt;/span&gt;(ctx context.Context, req &lt;span style="color:#719e07"&gt;*&lt;/span&gt;greet.GreetServerStreamRequest, stream greet.GreetService_GreetServerStreamServer) &lt;span style="color:#dc322f"&gt;error&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;for&lt;/span&gt; i &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; &lt;span style="color:#2aa198"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color:#2aa198"&gt;5&lt;/span&gt;; i&lt;span style="color:#719e07"&gt;++&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#719e07"&gt;if&lt;/span&gt; err &lt;span style="color:#719e07"&gt;:=&lt;/span&gt; stream.&lt;span style="color:#268bd2"&gt;Send&lt;/span&gt;(&lt;span style="color:#719e07"&gt;&amp;amp;&lt;/span&gt;greet.GreetServerStreamResponse{Greeting: req.Name}); err &lt;span style="color:#719e07"&gt;!=&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt; {
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#719e07"&gt;return&lt;/span&gt; fmt.&lt;span style="color:#268bd2"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#2aa198"&gt;&amp;#34;triple ServerStream send err: %s&amp;#34;&lt;/span&gt;, err)
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#719e07"&gt;return&lt;/span&gt; &lt;span style="color:#cb4b16"&gt;nil&lt;/span&gt;
-&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
-&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编写客户端client文件&lt;/p&gt;</description></item><item><title>超时时间</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/timeout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/timeout/</guid><description>&lt;h2 id="1介绍"&gt;1.介绍&lt;/h2&gt;
+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;消息类型的写法与普通 RPC 相同,流式语义由方法签名中的 &lt;code&gt;stream&lt;/code&gt; 决定。安装 &lt;code&gt;protoc-gen-go&lt;/code&gt; 和 &lt;code&gt;protoc-gen-go-triple&lt;/code&gt; 后,可以在 &lt;code&gt;streaming&lt;/code&gt; 目录生成 Go 代码:&lt;/p&gt;</description></item><item><title>超时时间</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/timeout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https [...]
 &lt;p&gt;本示例演示如何在 Dubbo-go 客户端发起调用时设置请求超时时间。可在此查看 &lt;a href="https://github.com/apache/dubbo-go-samples/tree/main/timeout" target="_blank"&gt;完整示例源码地址&lt;/a&gt;&lt;/p&gt;
 &lt;h2 id="2如何设置请求超时时间"&gt;2.如何设置请求超时时间&lt;/h2&gt;
 &lt;p&gt;在创建客户端时,可以使用 &lt;code&gt;client.WithRequestTimeout()&lt;/code&gt; 方法设置全局超时时间(所有使用改 client 的服务代理共享)。&lt;/p&gt;
diff --git a/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html b/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html
index 0a4e1304c75..354a50241d8 100644
--- a/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html
+++ b/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/index.html
@@ -1,4 +1,4 @@
-<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=alternate hreflang=en href=https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq. [...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=alternate hreflang=en href=https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/tutorial/rpc/streaming/><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/rpc/streaming/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq. [...]
 <a class=dropdown-item href=/zh-cn/overview/notices/>安全公告</a>
 <a class=dropdown-item href=/zh-cn/contact/>贡献者指南</a></div></li><li class="nav-item nav-item-line px-2 mb-2 mb-lg-0"><a class=nav-link href=/zh-cn/blog/><span>博客</span></a></li><li class="nav-item nav-item-line px-2 mb-2 mb-lg-0"><a class=nav-link href=/zh-cn/download/><span>下载</span></a></li><li class="nav-item dropdown d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>生态</a><div class="dropdo [...]
 <a class=dropdown-item href=/zh-cn/overview/mannual/control-plane/>可视化控制台</a>
@@ -688,27 +688,45 @@
 <label for=m-zh-cnoverviewnoticesprotocol-check><a href=/zh-cn/overview/notices/protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewnoticesprotocol><span>RPC 协议安全</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewnoticesregistry-li><input type=checkbox id=m-zh-cnoverviewnoticesregistry-check>
 <label for=m-zh-cnoverviewnoticesregistry-check><a href=/zh-cn/overview/notices/registry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewnoticesregistry><span>注册中心安全</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewnoticesadmin-li><input type=checkbox id=m-zh-cnoverviewnoticesadmin-check>
 <label for=m-zh-cnoverviewnoticesadmin-check><a href=/zh-cn/overview/notices/admin/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewnoticesadmin><span>Dubbo Admin 安全</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnoverviewnoticeslog4j-li><input type=checkbox id=m-zh-cnoverviewnoticeslog4j-check>
-<label for=m-zh-cnoverviewnoticeslog4j-check><a href=/zh-cn/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewnoticeslog4j><span>Log4j 漏洞影响</span></a></label></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=/zh-cn/overview/>文档</a></li><li class=breadcrumb-item><a href=/zh-cn/ove [...]
-生成对应代码。</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-protobuf data-lang=protobuf><span style=display:flex><span><span style=color:#268bd2>service</span> GreetService {
+<label for=m-zh-cnoverviewnoticeslog4j-check><a href=/zh-cn/overview/notices/log4j/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnoverviewnoticeslog4j><span>Log4j 漏洞影响</span></a></label></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=/zh-cn/overview/>文档</a></li><li class=breadcrumb-item><a href=/zh-cn/ove [...]
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#719e07>package</span> greet;
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#719e07>option</span> go_package <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;github.com/apache/dubbo-go-samples/streaming/proto;greet&#34;</span>;
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#268bd2>service</span> GreetService {
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> Greet(GreetRequest) <span style=color:#719e07>returns</span> (GreetResponse) {}
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> GreetStream(stream GreetStreamRequest) <span style=color:#719e07>returns</span> (stream GreetStreamResponse) {}
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> GreetClientStream(stream GreetClientStreamRequest) <span style=color:#719e07>returns</span> (GreetClientStreamResponse) {}
 </span></span><span style=display:flex><span>  <span style=color:#719e07>rpc</span> GreetServerStream(GreetServerStreamRequest) <span style=color:#719e07>returns</span> (stream GreetServerStreamResponse) {}
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>编写服务端handler文件</p><p>源文件路径: dubbo-go-sample/streaming/go-server/cmd/server.go</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>type</span> GreetTripleServer <span style=color:#268bd2>struct</span> {
+</span></span></code></pre></div><p>消息类型的写法与普通 RPC 相同,流式语义由方法签名中的 <code>stream</code> 决定。安装 <code>protoc-gen-go</code> 和 <code>protoc-gen-go-triple</code> 后,可以在 <code>streaming</code> 目录生成 Go 代码:</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-bash data-lang=bash><span style=display:flex><span>protoc <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go_out<span style=color:#719e07>=</span>. <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go_opt<span style=color:#719e07>=</span><span style=color:#268bd2>paths</span><span style=color:#719e07>=</span>source_relative <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go-triple_out<span style=color:#719e07>=</span>. <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  --go-triple_opt<span style=color:#719e07>=</span><span style=color:#268bd2>paths</span><span style=color:#719e07>=</span>source_relative <span style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span style=color:#cb4b16></span>  ./proto/greet.proto
+</span></span></code></pre></div><p>生成的 <code>greet.pb.go</code> 包含消息类型,<code>greet.triple.go</code> 包含客户端、服务端接口和注册函数。</p><h2 id=服务端>服务端</h2><p>完整代码见 <a href=https://github.com/apache/dubbo-go-samples/blob/main/streaming/go-server/cmd/server.go><code>streaming/go-server/cmd/server.go</code></a>。服务端监听 <code>20000</code> 端口,并注册生成的 <code>GreetService</code> 处理函数:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><co [...]
+</span></span><span style=display:flex><span>	server.<span style=color:#268bd2>WithServerProtocol</span>(protocol.<span style=color:#268bd2>WithPort</span>(<span style=color:#2aa198>20000</span>)),
+</span></span><span style=display:flex><span>)
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>Greet</span>(ctx context.Context, req <span style=color:#719e07>*</span>greet.GreetRequest) (<span style=color:#719e07>*</span>greet.GreetResponse, <span style=color:#dc322f>error</span>) {
-</span></span><span style=display:flex><span>	resp <span style=color:#719e07>:=</span> <span style=color:#719e07>&amp;</span>greet.GreetResponse{Greeting: req.Name}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> resp, <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> greet.<span style=color:#268bd2>RegisterGreetServiceHandler</span>(srv, <span style=color:#719e07>&amp;</span>GreetTripleServer{}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetStream</span>(ctx context.Context, stream greet.GreetService_GreetStreamServer) <span style=color:#dc322f>error</span> {
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> srv.<span style=color:#268bd2>Serve</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Error</span>(err)
+</span></span><span style=display:flex><span>}
+</span></span></code></pre></div><h3 id=双向流>双向流</h3><p><code>Recv()</code> 接收一条请求,<code>Send()</code> 返回一条响应。客户端关闭请求侧后,<code>Recv()</code> 会返回流结束错误;这里用 <code>triple.IsEnded</code> 将正常结束与传输错误区分开。</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span s [...]
+</span></span><span style=display:flex><span>	ctx context.Context,
+</span></span><span style=display:flex><span>	stream greet.GreetService_GreetStreamServer,
+</span></span><span style=display:flex><span>) <span style=color:#dc322f>error</span> {
 </span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> {
 </span></span><span style=display:flex><span>		req, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>()
 </span></span><span style=display:flex><span>		<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>			<span style=color:#719e07>if</span> triple.<span style=color:#268bd2>IsEnded</span>(err) {
-</span></span><span style=display:flex><span>				<span style=color:#719e07>break</span>
+</span></span><span style=display:flex><span>				<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>			}
 </span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple BidiStream recv error: %s&#34;</span>, err)
 </span></span><span style=display:flex><span>		}
@@ -716,82 +734,48 @@
 </span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple BidiStream send error: %s&#34;</span>, err)
 </span></span><span style=display:flex><span>		}
 </span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetClientStream</span>(ctx context.Context, stream greet.GreetService_GreetClientStreamServer) (<span style=color:#719e07>*</span>greet.GreetClientStreamResponse, <span style=color:#dc322f>error</span>) {
-</span></span><span style=display:flex><span>	<span style=color:#268bd2>var</span> reqs []<span style=color:#dc322f>string</span>
+</span></span></code></pre></div><h3 id=客户端流>客户端流</h3><p>服务端读完所有请求后,将名字拼接成一个响应。使用迭代式 <code>Recv()</code> 时,应在循环结束后检查 <code>Err()</code>。</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetClientStream</span>(
+</span></span><span style=display:flex><span>	ctx context.Context,
+</span></span><span style=display:flex><span>	stream greet.GreetService_GreetClientStreamServer,
+</span></span><span style=display:flex><span>) (<span style=color:#719e07>*</span>greet.GreetClientStreamResponse, <span style=color:#dc322f>error</span>) {
+</span></span><span style=display:flex><span>	<span style=color:#268bd2>var</span> names []<span style=color:#dc322f>string</span>
 </span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> stream.<span style=color:#268bd2>Recv</span>() {
-</span></span><span style=display:flex><span>		reqs = <span style=color:#b58900>append</span>(reqs, stream.<span style=color:#268bd2>Msg</span>().Name)
+</span></span><span style=display:flex><span>		names = <span style=color:#b58900>append</span>(names, stream.<span style=color:#268bd2>Msg</span>().Name)
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> stream.<span style=color:#268bd2>Err</span>() <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> <span style=color:#719e07>&amp;&amp;</span> !triple.<span style=color:#268bd2>IsEnded</span>(stream.<span style=color:#268bd2>Err</span>()) {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>, fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ClientStream recv err: %s&#34;</span>, stream.<span style=color:#268bd2>Err</span>())
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	resp <span style=color:#719e07>:=</span> <span style=color:#719e07>&amp;</span>greet.GreetClientStreamResponse{
-</span></span><span style=display:flex><span>		Greeting: strings.<span style=color:#268bd2>Join</span>(reqs, <span style=color:#2aa198>&#34;,&#34;</span>),
+</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>, fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ClientStream recv error: %s&#34;</span>, stream.<span style=color:#268bd2>Err</span>())
 </span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> resp, <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#719e07>&amp;</span>greet.GreetClientStreamResponse{
+</span></span><span style=display:flex><span>		Greeting: strings.<span style=color:#268bd2>Join</span>(names, <span style=color:#2aa198>&#34;,&#34;</span>),
+</span></span><span style=display:flex><span>	}, <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetServerStream</span>(ctx context.Context, req <span style=color:#719e07>*</span>greet.GreetServerStreamRequest, stream greet.GreetService_GreetServerStreamServer) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>5</span>; i<span style=color:#719e07>++</span> {
+</span></span></code></pre></div><h3 id=服务端流>服务端流</h3><p>服务端流只接收一个请求,但可以多次调用 <code>Send()</code>。处理函数返回后,响应流随之结束。</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetServerStream</span>(
+</span></span><span style=display:flex><span>	ctx context.Context,
+</span></span><span style=display:flex><span>	req <span style=color:#719e07>*</span>greet.GreetServerStreamRequest,
+</span></span><span style=display:flex><span>	stream greet.GreetService_GreetServerStreamServer,
+</span></span><span style=display:flex><span>) <span style=color:#dc322f>error</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>10</span>; i<span style=color:#719e07>++</span> {
 </span></span><span style=display:flex><span>		<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetServerStreamResponse{Greeting: req.Name}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ServerStream send err: %s&#34;</span>, err)
+</span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> fmt.<span style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>&#34;triple ServerStream send error: %s&#34;</span>, err)
 </span></span><span style=display:flex><span>		}
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>编写客户端client文件</p><p>源文件路径: dubbo-go-sample/streaming/go-client/cmd/client.go</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>main</span>() {
-</span></span><span style=display:flex><span>	cli, err <span style=color:#719e07>:=</span> client.<span style=color:#268bd2>NewClient</span>(
-</span></span><span style=display:flex><span>		client.<span style=color:#268bd2>WithClientURL</span>(<span style=color:#2aa198>&#34;tri://127.0.0.1:20000&#34;</span>),
-</span></span><span style=display:flex><span>	)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#b58900>panic</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	svc, err <span style=color:#719e07>:=</span> greet.<span style=color:#268bd2>NewGreetService</span>(cli)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#b58900>panic</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#268bd2>TestClient</span>(svc)
+</span></span></code></pre></div><h2 id=客户端>客户端</h2><p>完整代码见 <a href=https://github.com/apache/dubbo-go-samples/blob/main/streaming/go-client/cmd/client.go><code>streaming/go-client/cmd/client.go</code></a>。连接服务端并创建代理后,就可以调用生成的流式方法:</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-go data-lang=go><span style=display:flex><span>cli, err <span style=color:#719e07>:=</span> client.<span style=c [...]
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>TestClient</span>(cli greet.GreetService) {
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testUnary</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testBidiStream</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testClientStream</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> <span style=color:#268bd2>testServerStream</span>(cli); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Error</span>(err)
-</span></span><span style=display:flex><span>	}
+</span></span><span style=display:flex><span>svc, err <span style=color:#719e07>:=</span> greet.<span style=color:#268bd2>NewGreetService</span>(cli)
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#b58900>panic</span>(err)
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testUnary</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE unary call&#34;</span>)
-</span></span><span style=display:flex><span>	resp, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>Greet</span>(context.<span style=color:#268bd2>Background</span>(), <span style=color:#719e07>&amp;</span>greet.GreetRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>})
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE unary call resp: %s&#34;</span>, resp.Greeting)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span></code></pre></div><p>双向流可以交替调用 <code>Send()</code> 和 <code>Recv()</code>,也可以在不同 goroutine 中并发收发:</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetStream</span>(context.<span style=color:#268bd2>Background</span>())
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testBidiStream</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE bidi stream&#34;</span>)
-</span></span><span style=display:flex><span>	stream, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>GreetStream</span>(context.<span style=color:#268bd2>Background</span>())
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> sendErr <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); sendErr <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span><span style=color:#719e07>for</span> _, name <span style=color:#719e07>:=</span> <span style=color:#719e07>range</span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>&#34;triple-1&#34;</span>, <span style=color:#2aa198>&#34;triple-2&#34;</span>, <span style=color:#2aa198>&#34;triple-3&#34;</span>} {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetStreamRequest{Name: name}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>()
@@ -799,82 +783,96 @@
 </span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>	}
 </span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE bidi stream resp: %s&#34;</span>, resp.Greeting)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseRequest</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseResponse</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseRequest</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseResponse</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span></code></pre></div><p>客户端流发送完所有请求后,通过 <code>CloseAndRecv()</code> 结束发送并等待唯一的响应:</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetClientStream</span>(context.<span style=color:#268bd2>Background</span>())
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>5</span>; i<span style=color:#719e07>++</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetClientStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
 </span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseAndRecv</span>()
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE client stream resp: %s&#34;</span>, resp.Greeting)
+</span></span></code></pre></div><p>服务端流在创建时发送请求,之后持续读取响应:</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetServerStream</span>(
+</span></span><span style=display:flex><span>	context.<span style=color:#268bd2>Background</span>(),
+</span></span><span style=display:flex><span>	<span style=color:#719e07>&amp;</span>greet.GreetServerStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>},
+</span></span><span style=display:flex><span>)
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>for</span> stream.<span style=color:#268bd2>Recv</span>() {
+</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE server stream resp: %s&#34;</span>, stream.<span style=color:#268bd2>Msg</span>().Greeting)
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Err</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Close</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span></code></pre></div><h2 id=关闭流>关闭流</h2><p>双向流的请求和响应可以分别关闭:</p><table><thead><tr><th>API</th><th>使用场景</th></tr></thead><tbody><tr><td><code>CloseRequest()</code></td><td>客户端发送完毕后关闭请求侧。调用后仍可继续接收响应。</td></tr><tr><td><code>CloseResponse()</code></td><td>客户端读取完响应,或确定不再需要后续响应时,关闭响应侧并释放资源。</td></tr><tr><td><code>CloseAndRecv()</code></td><td>用于客户端流:关闭请求侧,并等待服务端返回唯一响应。</td></tr></tbody></table><p>如果服务端在读完请求后还会继续发送数据,双向流客户端应先调用 <code>CloseRequest()</code>,继续 <code>Recv()</code> 直到响应结 [...]
+</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>ResponseHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-status&#34;</span>, <span style=color:#2aa198>&#34;ready&#34;</span>)
+</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>ResponseTrailer</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-result&#34;</span>, <span style=color:#2aa198>&#34;completed&#34;</span>)
 </span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testClientStream</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE client stream&#34;</span>)
-</span></span><span style=display:flex><span>	stream, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>GreetClientStream</span>(context.<span style=color:#268bd2>Background</span>())
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> i <span style=color:#719e07>:=</span> <span style=color:#2aa198>0</span>; i &lt; <span style=color:#2aa198>5</span>; i<span style=color:#719e07>++</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>if</span> sendErr <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetClientStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); sendErr <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>			<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>		}
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseAndRecv</span>()
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE client stream resp: %s&#34;</span>, resp.Greeting)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;request id: %s&#34;</span>, requestID)
+</span></span></code></pre></div><p>客户端必须在第一次 <code>Send()</code> 前设置 request header。Response header 在收到首条响应后即可读取;trailer 要等响应流结束后再读。</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-go data-lang=go><span style=display:flex><span>stream, err <span style=color:#719e07>:=</span> svc.<span style=color:#268bd2>GreetStream</span>(context.<span style=color:#268bd2>Background</span>())
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>RequestHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-request-id&#34;</span>, <span style=color:#2aa198>&#34;stream-demo-001&#34;</span>)
 </span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span><span style=color:#268bd2>func</span> <span style=color:#268bd2>testServerStream</span>(cli greet.GreetService) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	logger.<span style=color:#268bd2>Info</span>(<span style=color:#2aa198>&#34;start to test TRIPLE server stream&#34;</span>)
-</span></span><span style=display:flex><span>	stream, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>GreetServerStream</span>(context.<span style=color:#268bd2>Background</span>(), <span style=color:#719e07>&amp;</span>greet.GreetServerStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>})
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>for</span> stream.<span style=color:#268bd2>Recv</span>() {
-</span></span><span style=display:flex><span>		logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;TRIPLE server stream resp: %s&#34;</span>, stream.<span style=color:#268bd2>Msg</span>().Greeting)
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> stream.<span style=color:#268bd2>Err</span>() <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Close</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
-</span></span><span style=display:flex><span>		<span style=color:#719e07>return</span> err
-</span></span><span style=display:flex><span>	}
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Send</span>(<span style=color:#719e07>&amp;</span>greet.GreetStreamRequest{Name: <span style=color:#2aa198>&#34;triple&#34;</span>}); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>流式调用也可以通过生成的 stream API 读写 Triple metadata:</p><table><thead><tr><th>位置</th><th>API</th><th>用途</th></tr></thead><tbody><tr><td>客户端流和双向流 client</td><td><code>RequestHeader()</code></td><td>在发送第一条消息前写入请求 metadata</td></tr><tr><td>服务端流和双向流 client</td><td><code>ResponseHeader()</code></td><td>读取服务端返回的响应 header</td></tr><tr><td>服务端流和双向流 client</td><td><code>ResponseTrailer()</code></td><td>响应结束后读取服务端返回的 trailer</td></tr><tr><td>Provider 侧 stream handler</td [...]
+</span></span><span style=display:flex><span>resp, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>()
 </span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
 </span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span><span style=display:flex><span>stream.<span style=color:#268bd2>RequestHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-sample-token&#34;</span>, <span style=color:#2aa198>&#34;demo-token&#34;</span>)
-</span></span></code></pre></div><p>在服务端 stream handler 中,也可以返回响应 metadata:</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-go data-lang=go><span style=display:flex><span><span style=color:#268bd2>func</span> (srv <span style=color:#719e07>*</span>GreetTripleServer) <span style=color:#268bd2>GreetServerStream</span>(
-</span></span><span style=display:flex><span>	ctx context.Context,
-</span></span><span style=display:flex><span>	req <span style=color:#719e07>*</span>greet.GreetServerStreamRequest,
-</span></span><span style=display:flex><span>	stream greet.GreetService_GreetServerStreamServer,
-</span></span><span style=display:flex><span>) <span style=color:#dc322f>error</span> {
-</span></span><span style=display:flex><span>	stream.<span style=color:#268bd2>ResponseHeader</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-header&#34;</span>, <span style=color:#2aa198>&#34;ready&#34;</span>)
-</span></span><span style=display:flex><span>	stream.<span style=color:#268bd2>ResponseTrailer</span>().<span style=color:#268bd2>Set</span>(<span style=color:#2aa198>&#34;x-stream-trailer&#34;</span>, <span style=color:#2aa198>&#34;done&#34;</span>)
-</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> <span style=color:#cb4b16>nil</span>
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;response: %s&#34;</span>, resp.Greeting)
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;header: %s&#34;</span>, stream.<span style=color:#268bd2>ResponseHeader</span>().<span style=color:#268bd2>Get</span>(<span style=color:#2aa198>&#34;x-stream-status&#34;</span>))
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseRequest</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> _, err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>Recv</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> <span style=color:#719e07>&amp;&amp;</span> !triple.<span style=color:#268bd2>IsEnded</span>(err) {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>logger.<span style=color:#268bd2>Infof</span>(<span style=color:#2aa198>&#34;trailer: %s&#34;</span>, stream.<span style=color:#268bd2>ResponseTrailer</span>().<span style=color:#268bd2>Get</span>(<span style=color:#2aa198>&#34;x-stream-result&#34;</span>))
+</span></span><span style=display:flex><span><span style=color:#719e07>if</span> err <span style=color:#719e07>:=</span> stream.<span style=color:#268bd2>CloseResponse</span>(); err <span style=color:#719e07>!=</span> <span style=color:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span>	<span style=color:#719e07>return</span> err
 </span></span><span style=display:flex><span>}
-</span></span></code></pre></div><h2 id=3运行效果>3.运行效果</h2><p>运行服务端和客户端,可以看到请求正常返回</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-fallback data-lang=fallback><span style=display:flex><span>[start to test TRIPLE unary call]
-</span></span><span style=display:flex><span>TRIPLE unary call resp: [triple]
-</span></span><span style=display:flex><span>[start to test TRIPLE bidi stream]
-</span></span><span style=display:flex><span>TRIPLE bidi stream resp: [triple]
-</span></span><span style=display:flex><span>[start to test TRIPLE client stream]
-</span></span><span style=display:flex><span>TRIPLE client stream resp: [triple,triple,triple,triple,triple]
-</span></span><span style=display:flex><span>[start to test TRIPLE server stream]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
-</span></span><span style=display:flex><span>TRIPLE server stream resp: [triple]
+</span></span></code></pre></div><p><code>Triple-</code> 和 <code>Grpc-</code> 开头的 metadata 名称由协议保留,应用不应自行写入。</p><h2 id=运行示例>运行示例</h2><p>在已经下载的 <code>dubbo-go-samples</code> 仓库中,进入 <code>streaming</code> 目录并启动服务端:</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-bash data-lang=bash><span style=display:flex><span><span style=color:#b58900>cd</span> dubbo-go-samples/streaming
+</span></span><span style=display:flex><span>go run ./go-server/cmd/server.go
+</span></span></code></pre></div><p>打开另一个终端,重新进入 <code>streaming</code> 目录并启动客户端:</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-bash data-lang=bash><span style=display:flex><span><span style=color:#b58900>cd</span> dubbo-go-samples/streaming
+</span></span><span style=display:flex><span>go run ./go-client/cmd/client.go
+</span></span></code></pre></div><p>客户端会依次执行普通调用、双向流、客户端流和服务端流。忽略日志前缀后,关键输出如下:</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-text data-lang=text><span style=display:flex><span>start to test TRIPLE unary call
+</span></span><span style=display:flex><span>TRIPLE unary call resp: triple
+</span></span><span style=display:flex><span>start to test TRIPLE bidi stream
+</span></span><span style=display:flex><span>TRIPLE bidi stream resp: triple-1
+</span></span><span style=display:flex><span>TRIPLE bidi stream resp: triple-2
+</span></span><span style=display:flex><span>TRIPLE bidi stream resp: triple-3
+</span></span><span style=display:flex><span>start to test TRIPLE client stream
+</span></span><span style=display:flex><span>TRIPLE client stream resp: triple,triple,triple,triple,triple
+</span></span><span style=display:flex><span>start to test TRIPLE server stream
+</span></span><span style=display:flex><span>TRIPLE server stream resp #1: triple
+</span></span><span style=display:flex><span>TRIPLE server stream resp #2: triple
+</span></span><span style=display:flex><span>...
+</span></span><span style=display:flex><span>TRIPLE server stream resp #10: triple
 </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/golang-sdk/tutorial/rpc/streaming?filename=change-me.md&amp;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%60%0A%2A+Edit+the [...]
 <a href="https://github.com/apache/dubbo-website/issues/new?title=%e6%b5%81%e5%bc%8f%e9%80%9a%e4%bf%a1" 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=#1介绍>1.介绍</a></li><li><a href=#2如何使用dubbo-go流式通信>2.如何使用Dubbo-go流式通信</a></li><li><a href=#3运行效果>3.运行效果</a></li></ul></nav></div></div></div></div><footer><div class=footer-container><div class=footer-container-left><div class=footer-container-left-title>关注我们</div><div class=footer-container-left-des>请通过以下任一或多个渠道关注社区动态,与社区开发者保持密切沟通。</di [...]
+<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=#双向流>双向流</a></li><li><a href=#客户端流>客户端流</a></li><li><a href=#服务端流>服务端流</a></li></ul></li><li><a href=#客户端>客户端</a></li><li><a href=#关闭流>关闭流</a></li><li><a href=#metadataheader-和-trailer>Metadata、header 和 trailer</a></li><li><a href=#运行示例>运行示 [...]
 <button class="contact-btn qr-container" onmouseover='showQRCode("dingding-qr")' onmouseout='hideQRCode("dingding-qr")'>钉钉<div class=qr-code id=dingding-qr style=display:none><img src=https://img.alicdn.com/imgextra/i4/O1CN01buuadT274Lj33QZWQ_!!6000000007743-0-tps-1170-1477.jpg alt="DingTalk QR Code"></div></button>
 <button class=contact-btn><a href=https://github.com/apache/dubbo/>GitHub</a></button></div></div><div class=footer-container-right><ul><li>文档</li><li><a href=/zh-cn/overview/home/>概览</a></li><li><a href=/zh-cn/overview/quickstart/>快速开始</a></li><li><a href=/zh-cn/contact/contributor/software-donation-guide_dev/>开发者指南</a></li></ul><ul><li>资源</li><li><a href=/zh-cn/contact/>社区</a></li></ul></div></div><div style="width:85.125rem;height:0;border:1px solid #dddee4;margin-bottom:32px"></div>< [...]
 project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States
diff --git a/zh-cn/sitemap.xml b/zh-cn/sitemap.xml
index eea57747db1..49062addb66 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-11-28T15:14:12+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority><xhtml:link rel="alternate" hreflang="en" href="https://cn.dubbo [...]
\ 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-11-28T15:14:12+08:00</lastmod><changefreq>monthly</changefreq><priority>0.5</priority><xhtml:link rel="alternate" hreflang="en" href="https://cn.dubbo [...]
\ No newline at end of file