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/04/22 06:22:24 UTC
(dubbo-website) branch cn-site updated: deploy: 1f54f570258972f76bc353d293e1f807e0d7aba8
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 e304f28f823 deploy: 1f54f570258972f76bc353d293e1f807e0d7aba8
e304f28f823 is described below
commit e304f28f823c9d8092ad8dbeb54c08983dbc6467
Author: Alanxtl <Al...@users.noreply.github.com>
AuthorDate: Wed Apr 22 06:22:17 2026 +0000
deploy: 1f54f570258972f76bc353d293e1f807e0d7aba8
---
css/app.css | 2 +-
css/chunk-vendors.css | 2 +-
en/index.xml | 9 +---
.../mannual/golang-sdk/refer/generic/index.html | 48 ++++++++++++++---
en/overview/mannual/golang-sdk/refer/index.xml | 9 +---
en/sitemap.xml | 2 +-
js/app.js | 3 +-
js/chunk-vendors.js | 61 +---------------------
sitemap.xml | 2 +-
zh-cn/index.xml | 11 +---
.../mannual/golang-sdk/refer/generic/index.html | 48 ++++++++++++++---
zh-cn/overview/mannual/golang-sdk/refer/index.xml | 11 +---
zh-cn/sitemap.xml | 2 +-
13 files changed, 93 insertions(+), 117 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 bd0978ecb8f..431a44355db 100644
--- a/en/index.xml
+++ b/en/index.xml
@@ -2603,14 +2603,7 @@ This example will demonstrate how to compile the dubbo-pilot control plane and h
</li>
<li>
<p>Event (1 bit)</p></description></item><item><title>Filter</title><link>https://cn.dubbo.apache.org/en/overview/mannual/java-sdk/tasks/extensibility/filter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/en/overview/mannual/java-sdk/tasks/extensibility/filter/</guid><description><p>In the section <a href="../../framework/filter/">RPC Framework - Filter Request Interception</a>, we learned about the working mechani [...]
-<p>The complete source code for this example can be found at <a href="https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/">dubbo-samples-extensibility</a>. In addition to this example, many Filter implementations in the Dubbo core repository apache/dubbo and the extension library <a href="https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-filter-extensions/">apache/dubbo-spi-extensions</a> can serve as refer [...]
-<h4 class="alert-heading">Deprecation Warning</h4>
-
- dubbo-go generic invocation is only applicable to the dubbo2 protocol, not the triple protocol
-
-</div>
-
-<p>Generic invocation is a special way of calling in Dubbo-Go that allows intermediary nodes to pass call information without interface information, commonly used in testing and gateway scenarios. Generic invocation supports both Dubbo and Triple protocols, but currently, the serialization scheme only supports Hessian.</p>
+<p>The complete source code for this example can be found at <a href="https://github.com/apache/dubbo-samples/blob/master/10-task/dubbo-samples-extensibility/">dubbo-samples-extensibility</a>. In addition to this example, many Filter implementations in the Dubbo core repository apache/dubbo and the extension library <a href="https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-filter-extensions/">apache/dubbo-spi-extensions</a> can serve as refer [...]
<h2 id="background">Background</h2>
<p>For better understanding, this document introduces generic invocation with a gateway usage scenario. Let&rsquo;s first consider a normal invocation (non-generic invocation). The diagram below includes two key roles: consumer and provider (hereinafter referred to as endpoint, representing either a consumer or a provider), each having a definition of the org.apache.dubbo.sample.User interface. Suppose the org.apache.dubbo.sample.User interface needs to be used in the calling b [...]
<h2 id="configuring-visual-dashboards">Configuring Visual Dashboards</h2>
diff --git a/en/overview/mannual/golang-sdk/refer/generic/index.html b/en/overview/mannual/golang-sdk/refer/generic/index.html
index a2e9442d03e..ce19d6215d8 100644
--- a/en/overview/mannual/golang-sdk/refer/generic/index.html
+++ b/en/overview/mannual/golang-sdk/refer/generic/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/refer/generic/><link rel=canonical href=https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/refer/generic/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageVi [...]
+<!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/refer/generic/><link rel=canonical href=https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/refer/generic/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageVi [...]
<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>
@@ -682,7 +682,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 [...]
</span></span><span style=display:flex><span><span style=color:#268bd2>type</span> User <span style=color:#268bd2>struct</span> {
</span></span><span style=display:flex><span> ID <span style=color:#dc322f>string</span>
</span></span><span style=display:flex><span> Name <span style=color:#dc322f>string</span>
@@ -704,8 +704,27 @@
</span></span><span style=display:flex><span> <span style=color:#2aa198>"age"</span>: <span style=color:#2aa198>20</span>,
</span></span><span style=display:flex><span> <span style=color:#2aa198>"class"</span>: <span style=color:#2aa198>"org.apache.dubbo.sample.User"</span>,
</span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>Note that:</p><ul><li>The Map generic invocation will automatically convert the first letter to lowercase, so ID will become iD. If you need to align with Dubbo-Java, consider changing ID to Id;</li><li>A class field will be automatically inserted into the Map to identify the original interface class.</li></ul><h2 id=usage>Usage</h2><p>Generic invocation is transparent to the provider side, meaning the provider does not need any explicit configuration [...]
-</span></span></code></pre></div><p>The semantics expressed by this Dubbo URL are:</p><ul><li>The RPC protocol is dubbo;</li><li>The org.apache.dubbo.sample.UserProvider interface is located at 127.0.0.1:20000;</li><li>Using generic invocation (generic=true).</li></ul><p>The consumer’s Filter will automatically convert normal calls to generic calls based on the configuration carried by the Dubbo URL, but note that in this method, response results will return in generic format and w [...]
+</span></span></code></pre></div><p>Note that:</p><ul><li>The Map generic invocation will automatically convert the first letter to lowercase, so ID will become iD. If you need to align with Dubbo-Java, consider changing ID to Id;</li><li>To precisely control the key names in the Map, you can use the <code>m</code> struct tag. For example, <code>Name string `m:"userName"`</code> will set the key to <code>userName</code> instead of the default <code>name</code>;</li><li>When the struct im [...]
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>cli, err <span style=color:#719e07>:=</span> ins.<span style=color:#268bd2>NewClient</span>(
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithClientProtocolTriple</span>(),
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithClientSerialization</span>(constant.Hessian2Serialization),
+</span></span><span style=display:flex><span>)
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>genericService, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>NewGenericService</span>(
+</span></span><span style=display:flex><span> <span style=color:#2aa198>"org.apache.dubbo.samples.UserProvider"</span>,
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithURL</span>(<span style=color:#2aa198>"tri://127.0.0.1:50052"</span>),
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithVersion</span>(<span style=color:#2aa198>"1.0.0"</span>),
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithGroup</span>(<span style=color:#2aa198>"triple"</span>),
+</span></span><span style=display:flex><span>)
+</span></span></code></pre></div><p>The <code>NewGenericService</code> method accepts the following parameters:</p><ul><li>Service interface name;</li><li><code>client.WithURL</code>: direct connection address, using the <code>tri://</code> protocol prefix;</li><li><code>client.WithVersion</code>: service version;</li><li><code>client.WithGroup</code>: service group.</li></ul><p>Then you can make a generic invocation on the service:</p><div class=highlight><pre tabindex=0 style=color:#93 [...]
+</span></span><span style=display:flex><span> context.<span style=color:#268bd2>Background</span>(),
+</span></span><span style=display:flex><span> <span style=color:#2aa198>"GetUser1"</span>,
+</span></span><span style=display:flex><span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>"java.lang.String"</span>},
+</span></span><span style=display:flex><span> []hessian.Object{<span style=color:#2aa198>"A003"</span>},
+</span></span><span style=display:flex><span>)
+</span></span></code></pre></div><h3 id=based-on-dubbo-url-generic-invocation>Based on Dubbo URL Generic Invocation</h3><p>The generic invocation based on Filter is transparent to the consumer, and a typical application scenario is a gateway. This method requires that the Dubbo URL contains a generic invocation identifier, as follows.</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-plain da [...]
+</span></span></code></pre></div><p>The semantics expressed by this Dubbo URL are:</p><ul><li>The RPC protocol is dubbo;</li><li>The org.apache.dubbo.sample.UserProvider interface is located at 127.0.0.1:20000;</li><li>Using generic invocation (generic=true).</li></ul><p>The consumer’s Filter will automatically convert normal calls to generic calls based on the configuration carried by the Dubbo URL. When <code>inv.Reply()</code> is set to a target struct pointer, the consumer-side [...]
</span></span><span style=display:flex><span> registryConfig <span style=color:#719e07>:=</span> <span style=color:#719e07>&</span>config.RegistryConfig{
</span></span><span style=display:flex><span> Protocol: <span style=color:#2aa198>"zookeeper"</span>,
</span></span><span style=display:flex><span> Address: <span style=color:#2aa198>"127.0.0.1:2181"</span>,
@@ -735,7 +754,7 @@
</span></span><span style=display:flex><span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>"java.lang.String"</span>},
</span></span><span style=display:flex><span> []hessian.Object{<span style=color:#2aa198>"A003"</span>},
</span></span><span style=display:flex><span> )
-</span></span></code></pre></div><p>The Invoke method of GenericService takes four parameters:</p><ul><li>context;</li><li>method name: in this example, it refers to calling the GetUser method;</li><li>parameter types: GetUser method accepts a string type parameter. If the target method accepts multiple parameters, you can write it as <code>[]string{"type1", "type2", ...}</code>. If the method is parameterless, you need to fill in an empty array <code>[]string{}</code>;</li><li>actual pa [...]
+</span></span></code></pre></div><p>The Invoke method of GenericService takes four parameters:</p><ul><li>context;</li><li>method name: in this example, it refers to calling the GetUser method;</li><li>parameter types: GetUser method accepts a string type parameter. If the target method accepts multiple parameters, you can write it as <code>[]string{"type1", "type2", ...}</code>. If the method is parameterless, you need to fill in an empty array <code>[]string{}</code>;</li><li>actual pa [...]
</span></span><span style=display:flex><span><span style=color:#268bd2>type</span> User <span style=color:#268bd2>struct</span> {
</span></span><span style=display:flex><span> ID <span style=color:#dc322f>string</span>
</span></span><span style=display:flex><span> Name <span style=color:#dc322f>string</span>
@@ -744,6 +763,19 @@
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#268bd2>var</span> user User
</span></span><span style=display:flex><span><span style=color:#586e75>// Deserialize the result directly into the user struct</span>
+</span></span><span style=display:flex><span>err <span style=color:#719e07>:=</span> genericService.<span style=color:#268bd2>InvokeWithType</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:#2aa198>"GetUser1"</span>,
+</span></span><span style=display:flex><span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>"java.lang.String"</span>},
+</span></span><span style=display:flex><span> []hessian.Object{<span style=color:#2aa198>"A003"</span>},
+</span></span><span style=display:flex><span> <span style=color:#719e07>&</span>user,
+</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:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span> <span style=color:#586e75>// Handle error</span>
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>fmt.<span style=color:#268bd2>Println</span>(user.Name)
+</span></span></code></pre></div><p>When using the legacy <code>config.ReferenceConfig</code> approach, the calling method is as follows:</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>var</span> user User
</span></span><span style=display:flex><span>err <span style=color:#719e07>:=</span> refConf.
</span></span><span style=display:flex><span> <span style=color:#268bd2>GetRPCService</span>().(<span style=color:#719e07>*</span>generic.GenericService).
</span></span><span style=display:flex><span> <span style=color:#268bd2>InvokeWithType</span>(
@@ -758,7 +790,7 @@
</span></span><span style=display:flex><span> <span style=color:#586e75>// Handle error</span>
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span>fmt.<span style=color:#268bd2>Println</span>(user.Name)
-</span></span></code></pre></div><p>Note: <code>InvokeWithType</code> currently only supports the default Map generic invocation.</p><h2 id=cross-language-rpc-contract-guidance>Cross-language RPC contract guidance</h2><p>In generic invocation or cross-language scenarios, Go variadic method signatures such as <code>args ...string</code> can introduce contract ambiguity.
+</span></span></code></pre></div><p>Note: <code>InvokeWithType</code> currently only supports the default Map generic invocation.</p><h2 id=generic-mode-selection>Generic Mode Selection</h2><p>Dubbo-go supports the following four generic invocation modes, distinguished by the <code>generic</code> parameter value:</p><table><thead><tr><th>Mode</th><th>Parameter Value</th><th>Generalized Format</th><th>Use Case</th></tr></thead><tbody><tr><td>Map (default)</td><td><code>true</code></td><td [...]
Existing variadic services remain supported, but <code>...T</code> is not recommended in new RPC contracts for cross-language or generic-invocation-facing services.</p><p>The reason is that variadic parameters have special semantics in Go, while cross-language invocation, dynamic argument assembly, generic invocation, and serialization usually represent them as ordinary arrays or lists.
This increases the risk that callers and providers interpret the argument shape differently.</p><h3 id=recommended-patterns>Recommended patterns</h3><p>For new service contracts, prefer the following patterns:</p><ul><li>Use <code>[]T</code> instead of <code>...T</code> for repeated values of the same type</li><li>Use request/response structs when the input shape may evolve over time</li><li>Use Triple + Protobuf IDL for new cross-language services, and model repeated inputs with <code>r [...]
</span></span></code></pre></div><p>Prefer a slice parameter instead:</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>MultiArgs</span>(ctx context.Context, args []<span style=color:#dc322f>string</span>) <span style=color:#dc322f>error</span>
@@ -772,10 +804,10 @@ This increases the risk that callers and providers interpret the argument shape
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=compatibility-note>Compatibility note</h3><p>Existing variadic services remain supported. This guidance is mainly intended for new service contract design.
If a service is expected to support cross-language consumers, gateway forwarding, or generic invocation, it is better not to expose variadic parameters as part of the public RPC contract.</p><p>In general, business inputs should be modeled explicitly as structured fields. Non-business context should be passed through attachments or IDL metadata instead of variadic parameters.</p><p>Related reading: <a href=https://blog.csdn.net/weixin_39860915/article/details/122738548>【Dubbo-go Service [...]
-<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/refer/generic?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+ma [...]
<a href="https://github.com/apache/dubbo-website/issues/new?title=Generic%20Invocation" 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=#background>Background</a></li><li><a href=#principle>Principle</a></li><li><a href=#usage>Usage</a><ul><li><a href=#based-on-dubbo-url-generic-invocation>Based on Dubbo URL Generic Invocation</a></li><li><a href=#manual-generic-invocation>Manual Generic Invocation</a></li><li><a href=#automatic-deserialization-with-invo [...]
+<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=#background>Background</a></li><li><a href=#principle>Principle</a></li><li><a href=#usage>Usage</a><ul><li><a href=#generic-invocation-over-triple-protocol>Generic Invocation over Triple Protocol</a></li><li><a href=#based-on-dubbo-url-generic-invocation>Based on Dubbo URL Generic Invocation</a></li><li><a href=#manual- [...]
<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/overview/mannual/golang-sdk/refer/index.xml b/en/overview/mannual/golang-sdk/refer/index.xml
index 7fadb9efb31..d8e4e76c235 100644
--- a/en/overview/mannual/golang-sdk/refer/index.xml
+++ b/en/overview/mannual/golang-sdk/refer/index.xml
@@ -22,14 +22,7 @@
<li>tracing: Link tracing example</li>
</ul>
<h3 id="dubbo-go-pixiu">Dubbo-go-pixiu</h3>
-<p><a href="https://github.com/apache/dubbo-go-pixiu">github.com/apache/dubbo-go-pixiu</a></p></description></item><item><title>Generic Invocation</title><link>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/refer/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/refer/generic/</guid><description><div class="alert alert-warning" role="alert">
-<h4 class="alert-heading">Deprecation Warning</h4>
-
- dubbo-go generic invocation is only applicable to the dubbo2 protocol, not the triple protocol
-
-</div>
-
-<p>Generic invocation is a special way of calling in Dubbo-Go that allows intermediary nodes to pass call information without interface information, commonly used in testing and gateway scenarios. Generic invocation supports both Dubbo and Triple protocols, but currently, the serialization scheme only supports Hessian.</p>
+<p><a href="https://github.com/apache/dubbo-go-pixiu">github.com/apache/dubbo-go-pixiu</a></p></description></item><item><title>Generic Invocation</title><link>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/refer/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/en/overview/mannual/golang-sdk/refer/generic/</guid><description><p>Generic invocation is a special way of calling in Dubbo-Go that allows [...]
<h2 id="background">Background</h2>
<p>For better understanding, this document introduces generic invocation with a gateway usage scenario. Let&rsquo;s first consider a normal invocation (non-generic invocation). The diagram below includes two key roles: consumer and provider (hereinafter referred to as endpoint, representing either a consumer or a provider), each having a definition of the org.apache.dubbo.sample.User interface. Suppose the org.apache.dubbo.sample.User interface needs to be used in the calling b [...]
<h4 class="alert-heading">Deprecation Warning</h4>
diff --git a/en/sitemap.xml b/en/sitemap.xml
index a49b02c75e7..8b235b8610f 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 a34f1b19f64..069248774b1 100644
--- a/js/app.js
+++ b/js/app.js
@@ -1,2 +1 @@
-(function(){"use strict";var t={9763:function(t,e,s){var r=s(2856),l=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.224b2db7.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 fd2d7db2025..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.c6697c66.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 3d98732a315..6007d83025a 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-04-18T11:10:25+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2026-04-18T11:10:25+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-04-22T14:15:39+08:00</lastmod></sitemap><sitemap><loc>https://cn.dubbo.apache.org/en/sitemap.xml</loc><lastmod>2026-04-22T14:15:39+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
diff --git a/zh-cn/index.xml b/zh-cn/index.xml
index e2fffdb930d..d9e9416b00e 100644
--- a/zh-cn/index.xml
+++ b/zh-cn/index.xml
@@ -12091,14 +12091,7 @@ Istio 安装文档(<a href="https://istio.io/latest/docs/setup/getting-starte
</ul>
<h4 id="apollo">Apollo</h4>
<div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#268bd2">&lt;dubbo:config-center</span> protocol=<span style="color:#2aa198">&#34;apollo&#34;</span> address=<span style="color:#2aa198">&#34;127.0.0.1:2181&#34;</span><span sty [...]
-</span></span></code></pre></div><p>Apollo中的一个核心概念是命名空间 - namespace(和上面zookeeper的namespace概念不同),在这里全局和应用级别配置就是通过命名空间来区分的。</p></description></item><item><title>泛化调用</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</guid><description><div class="alert alert-warning" ro [...]
-<h4 class="alert-heading">废弃警告</h4>
-
- dubbo-go 泛化调用仅适用于 dubbo2 协议,不适用 triple 协议
-
-</div>
-
-<p>泛化调用是一种 Dubbo-Go 的特殊调用方式,它允许中间节点在没有接口信息的情况下传递调用信息,常被用于测试、网关的场景下。泛化调用支持 Dubbo 和 Triple 协议,但是目前序列化方案只支持 Hessian。</p>
+</span></span></code></pre></div><p>Apollo中的一个核心概念是命名空间 - namespace(和上面zookeeper的namespace概念不同),在这里全局和应用级别配置就是通过命名空间来区分的。</p></description></item><item><title>泛化调用</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</guid><description><p>泛化调用是一种 Dubbo-Go 的特殊调用方式,它允许中 [...]
<h2 id="背景">背景</h2>
<p>为了便于理解,这篇文档中以网关使用场景介绍泛化调用。我们先来考虑普通调用(非泛化调用)。下图包含了 consumer 和 provider 两个关键角色(后文中用 endpoint 代表一个 consumer 或一个 provider),各自都有一份关于 org.apache.dubbo.sample.User 接口的定义。假定在调用行为中需要使用 org.apache.dubbo.sample.User 接口。</p>
<p><img src="https://cn.dubbo.apache.org/imgs/docs3-v2/golang-sdk/concept/rpc/generic/1631941941270-86ce9845-5a88-4cb5-8c8a-da8ae7eeb4d5.png" alt="img"></p>
@@ -12107,7 +12100,7 @@ Istio 安装文档(<a href="https://istio.io/latest/docs/setup/getting-starte
<h2 id="原理">原理</h2>
<p>泛化调用本质上就是把复杂结构转化为通用结构,这里说的通用结构是指 map、string 等,网关是可以顺利解析并传递这些通用结构的。</p>
<p><img src="https://cn.dubbo.apache.org/imgs/docs3-v2/golang-sdk/concept/rpc/generic/1632207075184-25939db4-f384-452e-a0b8-e1deff7971de.png" alt="img"></p>
-<p>目前,Dubbo-go v3 只支持 Map 泛化方式(default)。我们以 User 接口为例,其定义如下所示。</p>
+<p>Dubbo-go v3 支持多种泛化方式,包括 Map(默认)、Gson、Protobuf-JSON 和 Bean。其中 Map 泛化方式最为常用,下面以此为例进行说明。以 User 接口为例,其定义如下所示。</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:#586e75">// definition</span>
</span></span><span style="display:flex;"><span><span style="color:#268bd2">type</span> User <span style="color:#268bd2">struct</span> {
</span></span><span style="display:flex;"><span> ID <span style="color:#dc322f">string</span>
diff --git a/zh-cn/overview/mannual/golang-sdk/refer/generic/index.html b/zh-cn/overview/mannual/golang-sdk/refer/generic/index.html
index 1cd22dffc71..b690a3af060 100644
--- a/zh-cn/overview/mannual/golang-sdk/refer/generic/index.html
+++ b/zh-cn/overview/mannual/golang-sdk/refer/generic/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/refer/generic/><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageVi [...]
+<!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/refer/generic/><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/><script>var _paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageVi [...]
<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>
@@ -677,7 +677,7 @@
<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 [...]
+<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 style=color:#268bd2>type</span> User <span style=color:#268bd2>struct</span> {
</span></span><span style=display:flex><span> ID <span style=color:#dc322f>string</span>
</span></span><span style=display:flex><span> Name <span style=color:#dc322f>string</span>
@@ -699,8 +699,27 @@
</span></span><span style=display:flex><span> <span style=color:#2aa198>"age"</span>: <span style=color:#2aa198>20</span>,
</span></span><span style=display:flex><span> <span style=color:#2aa198>"class"</span>: <span style=color:#2aa198>"org.apache.dubbo.sample.User"</span>,
</span></span><span style=display:flex><span>}
-</span></span></code></pre></div><p>需要注意的是:</p><ul><li>Map 泛化方式会自动将首字母小写,即 ID 会被转换为 iD,如果需要对齐 Dubbo-Java 请考虑将 ID 改为 Id;</li><li>在 Map 中会自动插入 class 字段,用于标识原有接口类。</li></ul><h2 id=使用>使用</h2><p>泛化调用对 provider 端是透明的,即 provider 端不需要任何显式配置就可以正确处理泛化请求。</p><h3 id=基于-dubbo-url-泛化调用>基于 Dubbo URL 泛化调用</h3><p>基于 Filter 泛化调用对 consumer 是透明的,典型应用场景是网关。这种方式需要要求 Dubbo URL 中包含泛化调用标识,如下所示。</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab- [...]
-</span></span></code></pre></div><p>这个 Dubbo URL 表达的语意是:</p><ul><li>RPC 协议为 dubbo;</li><li>org.apache.dubbo.sample.UserProvider 接口位于 127.0.0.1:20000;</li><li>使用泛化调用(generic=true)。</li></ul><p>Consumer 端的 Filter 会自动根据 Dubbo URL 携带的配置自动将普通调用转化为泛化调用,但是需要注意的是,在这种方式下响应结果是以泛化格式返回,不会自动转化为相应的对象。举个例子,在 map 泛化方式下,如果需要返回 User 类,那么 consumer 获得的相应是一个 User 类对应的 map。</p><h3 id=手动泛化调用>手动泛化调用</h3><p>手动泛化调用发起的请求不经过 filter,所以需要 consumer 端显式地发起泛化调用,典型应用场景是测试。在 <a href=https://github.com/apache/dubbo-go-samp [...]
+</span></span></code></pre></div><p>需要注意的是:</p><ul><li>Map 泛化方式会自动将首字母小写,即 ID 会被转换为 iD,如果需要对齐 Dubbo-Java 请考虑将 ID 改为 Id;</li><li>如果需要精确控制 Map 中的 key 名称,可以通过 <code>m</code> struct tag 显式指定。例如 <code>Name string `m:"userName"`</code> 会使 key 变为 <code>userName</code> 而非默认的 <code>name</code>;</li><li>当结构体实现了 <code>hessian.POJO</code> 接口时,泛化结果中会自动插入 <code>class</code> 字段,用于标识原有接口类。可通过配置 <code>generic.include.class=false</code> 关闭此行为,适用于纯 Go 服务间的泛化调用场景。</li></ul><h2 id=使用>使用</h2><p>泛化调用对 provider [...]
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>cli, err <span style=color:#719e07>:=</span> ins.<span style=color:#268bd2>NewClient</span>(
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithClientProtocolTriple</span>(),
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithClientSerialization</span>(constant.Hessian2Serialization),
+</span></span><span style=display:flex><span>)
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span>genericService, err <span style=color:#719e07>:=</span> cli.<span style=color:#268bd2>NewGenericService</span>(
+</span></span><span style=display:flex><span> <span style=color:#2aa198>"org.apache.dubbo.samples.UserProvider"</span>,
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithURL</span>(<span style=color:#2aa198>"tri://127.0.0.1:50052"</span>),
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithVersion</span>(<span style=color:#2aa198>"1.0.0"</span>),
+</span></span><span style=display:flex><span> client.<span style=color:#268bd2>WithGroup</span>(<span style=color:#2aa198>"triple"</span>),
+</span></span><span style=display:flex><span>)
+</span></span></code></pre></div><p><code>NewGenericService</code> 方法接收的参数分别是:</p><ul><li>服务接口名;</li><li><code>client.WithURL</code>: 直连地址,使用 <code>tri://</code> 协议前缀;</li><li><code>client.WithVersion</code>: 服务版本;</li><li><code>client.WithGroup</code>: 服务分组。</li></ul><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>resp, err < [...]
+</span></span><span style=display:flex><span> context.<span style=color:#268bd2>Background</span>(),
+</span></span><span style=display:flex><span> <span style=color:#2aa198>"GetUser1"</span>,
+</span></span><span style=display:flex><span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>"java.lang.String"</span>},
+</span></span><span style=display:flex><span> []hessian.Object{<span style=color:#2aa198>"A003"</span>},
+</span></span><span style=display:flex><span>)
+</span></span></code></pre></div><h3 id=基于-dubbo-url-泛化调用>基于 Dubbo URL 泛化调用</h3><p>基于 Filter 泛化调用对 consumer 是透明的,典型应用场景是网关。这种方式需要要求 Dubbo URL 中包含泛化调用标识,如下所示。</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-plain data-lang=plain><span style=display:flex><span>dubbo://127.0.0.1:20000/org.apache.dubbo.sample.UserProvider?generic=true&...
+</span></span></code></pre></div><p>这个 Dubbo URL 表达的语意是:</p><ul><li>RPC 协议为 dubbo;</li><li>org.apache.dubbo.sample.UserProvider 接口位于 127.0.0.1:20000;</li><li>使用泛化调用(generic=true)。</li></ul><p>Consumer 端的 Filter 会自动根据 Dubbo URL 携带的配置将普通调用转化为泛化调用。当 <code>inv.Reply()</code> 设置了目标结构体指针时,consumer 侧 Filter 会在 <code>OnResponse</code> 阶段自动将 map 结果反序列化为相应的对象;若未设置,则响应结果仍以泛化格式(如 map)返回。</p><h3 id=手动泛化调用传统方式>手动泛化调用(传统方式)</h3><blockquote><p>推荐使用上文中 <code>client.NewGenericService</code> 的方式进行泛化调用,以下为基 [...]
</span></span><span style=display:flex><span> registryConfig <span style=color:#719e07>:=</span> <span style=color:#719e07>&</span>config.RegistryConfig{
</span></span><span style=display:flex><span> Protocol: <span style=color:#2aa198>"zookeeper"</span>,
</span></span><span style=display:flex><span> Address: <span style=color:#2aa198>"127.0.0.1:2181"</span>,
@@ -730,7 +749,7 @@
</span></span><span style=display:flex><span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>"java.lang.String"</span>},
</span></span><span style=display:flex><span> []hessian.Object{<span style=color:#2aa198>"A003"</span>},
</span></span><span style=display:flex><span> )
-</span></span></code></pre></div><p>GenericService 的 Invoke 方法接收四个参数,分别是:</p><ul><li>context;</li><li>方法名: 在这个例子中表示调用 GetUser 方法;</li><li>参数类型: GetUser 方法接收一个 string 类型的参数,如果目标方法接收多个参数,可以写为 <code>[]string{"type1", "type2", ...}</code>,如果目前方法是无参的,则需要填入一个空数组 <code>[]string{}</code>;</li><li>实参: 写法同参数类型,如果是无参函数,依然要填入一个空数组 <code>[]hessian.Object{}</code> 占位。</li></ul><p>注意:在目前版本中,无参调用会出现崩溃问题。</p><h3 id=泛化调用获取结果自动反序列化>泛化调用获取结果自动反序列化</h3><p>在 <code>Invoke</code> 方法中,返回值 <code>resp</code> 是一个 < [...]
+</span></span></code></pre></div><p>GenericService 的 Invoke 方法接收四个参数,分别是:</p><ul><li>context;</li><li>方法名: 在这个例子中表示调用 GetUser 方法;</li><li>参数类型: GetUser 方法接收一个 string 类型的参数,如果目标方法接收多个参数,可以写为 <code>[]string{"type1", "type2", ...}</code>,如果目前方法是无参的,则需要填入一个空数组 <code>[]string{}</code>;</li><li>实参: 写法同参数类型,如果是无参函数,依然要填入一个空数组 <code>[]hessian.Object{}</code> 占位。</li></ul><h3 id=泛化调用获取结果自动反序列化>泛化调用获取结果自动反序列化</h3><p>在 <code>Invoke</code> 方法中,返回值 <code>resp</code> 是一个 <code>map</code> 类型(对于 <code>M [...]
</span></span><span style=display:flex><span><span style=color:#268bd2>type</span> User <span style=color:#268bd2>struct</span> {
</span></span><span style=display:flex><span> ID <span style=color:#dc322f>string</span>
</span></span><span style=display:flex><span> Name <span style=color:#dc322f>string</span>
@@ -739,6 +758,19 @@
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#268bd2>var</span> user User
</span></span><span style=display:flex><span><span style=color:#586e75>// 直接将结果反序列化到 user 结构体中</span>
+</span></span><span style=display:flex><span>err <span style=color:#719e07>:=</span> genericService.<span style=color:#268bd2>InvokeWithType</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:#2aa198>"GetUser1"</span>,
+</span></span><span style=display:flex><span> []<span style=color:#dc322f>string</span>{<span style=color:#2aa198>"java.lang.String"</span>},
+</span></span><span style=display:flex><span> []hessian.Object{<span style=color:#2aa198>"A003"</span>},
+</span></span><span style=display:flex><span> <span style=color:#719e07>&</span>user,
+</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:#cb4b16>nil</span> {
+</span></span><span style=display:flex><span> <span style=color:#586e75>// 处理错误</span>
+</span></span><span style=display:flex><span>}
+</span></span><span style=display:flex><span>fmt.<span style=color:#268bd2>Println</span>(user.Name)
+</span></span></code></pre></div><p>如果使用传统的 <code>config.ReferenceConfig</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>var</span> user User
</span></span><span style=display:flex><span>err <span style=color:#719e07>:=</span> refConf.
</span></span><span style=display:flex><span> <span style=color:#268bd2>GetRPCService</span>().(<span style=color:#719e07>*</span>generic.GenericService).
</span></span><span style=display:flex><span> <span style=color:#268bd2>InvokeWithType</span>(
@@ -753,7 +785,7 @@
</span></span><span style=display:flex><span> <span style=color:#586e75>// 处理错误</span>
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span>fmt.<span style=color:#268bd2>Println</span>(user.Name)
-</span></span></code></pre></div><p>注意:<code>InvokeWithType</code> 目前仅支持默认的 Map 泛化方式。</p><h2 id=跨语言-rpc-接口定义建议>跨语言 RPC 接口定义建议</h2><p>在泛化调用或跨语言调用场景下,Go 的 variadic 方法签名(例如 <code>args ...string</code>)容易引入额外的接口定义歧义。
+</span></span></code></pre></div><p>注意:<code>InvokeWithType</code> 目前仅支持默认的 Map 泛化方式。</p><h2 id=泛化方式选择>泛化方式选择</h2><p>Dubbo-go 支持以下四种泛化方式,通过 <code>generic</code> 参数值区分:</p><table><thead><tr><th>泛化方式</th><th>参数值</th><th>泛化格式</th><th>适用场景</th></tr></thead><tbody><tr><td>Map(默认)</td><td><code>true</code></td><td><code>map[string]any</code></td><td>通用场景,Go 与 Java 互通</td></tr><tr><td>Gson</td><td><code>gson</code></td><td>JSON 字符串</td><td>需要 JSON 格式交互的场景</td></tr><tr><td>Protobuf-JSON</td><td> [...]
现有 variadic 服务仍保持兼容,但对于新的跨语言服务或需要面向泛化调用的服务,不建议继续将 <code>...T</code> 作为 RPC 接口定义的一部分。</p><p>这是因为 variadic 参数在 Go 中具有特殊语义,而在跨语言调用、动态参数组装、泛化调用和序列化过程中,通常只能被表示为普通数组或列表。
这会增加调用侧与服务侧对参数形态理解不一致的风险。</p><h3 id=推荐模式>推荐模式</h3><p>对于新的服务接口定义,建议优先采用以下方式:</p><ul><li>对于“多个同类型参数”的场景,使用 <code>[]T</code> 替代 <code>...T</code></li><li>对于参数可能继续演进的场景,使用 request/response struct</li><li>对于新的跨语言服务,优先使用 Triple + Protobuf IDL,并通过 <code>repeated</code> 字段表达重复参数</li></ul><h3 id=迁移示例>迁移示例</h3><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><spa [...]
</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><span style=color:#268bd2>func</span> <span style=color:#268bd2>MultiArgs</span>(ctx context.Context, args []<span style=color:#dc322f>string</span>) <span style=color:#dc322f>error</span>
@@ -767,10 +799,10 @@
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=边界说明>边界说明</h3><p>现有 variadic 服务仍保持兼容,这里的建议主要面向新的服务接口定义设计。
如果服务需要面向跨语言消费者、网关转发或泛化调用,建议尽量避免将 variadic 参数作为公开 RPC 接口定义的一部分。</p><p>通常情况下,业务输入应尽量显式建模为结构化字段;非业务上下文信息应通过 attachments 或 IDL metadata 传递,而不是依赖 variadic 参数表达。</p><p>相关阅读:<a href=https://blog.csdn.net/weixin_39860915/article/details/122738548>【Dubbo-go 服务代理模型】</a></p><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/refer/generic?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front [...]
<a href="https://github.com/apache/dubbo-website/issues/new?title=%e6%b3%9b%e5%8c%96%e8%b0%83%e7%94%a8" target=_blank><i class="fab fa-github fa-fw"></i> 登记问题</a>
-<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> 提交项目问题</a></div><nav id=TableOfContents><ul><li><a href=#背景>背景</a></li><li><a href=#原理>原理</a></li><li><a href=#使用>使用</a><ul><li><a href=#基于-dubbo-url-泛化调用>基于 Dubbo URL 泛化调用</a></li><li><a href=#手动泛化调用>手动泛化调用</a></li><li><a href=#泛化调用获取结果自动反序列化>泛化调用获取结果自动反序列化</a></li></ul></li><li><a href=#跨语言-rpc-接口定义建议>跨语言 RPC 接口定义建议</a><ul><li><a href=#推荐模式>推荐模式</a></li><li><a href=#迁移示例>迁移示例</a></li><li [...]
+<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=#基于-triple-协议泛化调用>基于 Triple 协议泛化调用</a></li><li><a href=#基于-dubbo-url-泛化调用>基于 Dubbo URL 泛化调用</a></li><li><a href=#手动泛化调用传统方式>手动泛化调用(传统方式)</a></li><li><a href=#泛化调用获取结果自动反序列化>泛化调用获取结果自动反序列化</a></li></ul></li><li><a href=#泛化方式选择>泛化方式选择</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/overview/mannual/golang-sdk/refer/index.xml b/zh-cn/overview/mannual/golang-sdk/refer/index.xml
index 1a3898f4918..77bf9a68d46 100644
--- a/zh-cn/overview/mannual/golang-sdk/refer/index.xml
+++ b/zh-cn/overview/mannual/golang-sdk/refer/index.xml
@@ -29,14 +29,7 @@
<p>dubbo-getty 是一个Go语言异步网络 io 库,支持 tcp/udp/websocket 协议。</p>
<h3 id="dubbo-go-hessian2">Dubbo-go-hessian2</h3>
<p><a href="https://github.com/apache/dubbo-go-hessian2">github.com/apache/dubbo-go-hessian2</a></p>
-<p>Dubbo-go-hessian2 是一个Go语言 hessian2 序列化协议库</p></description></item><item><title>泛化调用</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</guid><description><div class="alert alert-warning" role="alert">
-<h4 class="alert-heading">废弃警告</h4>
-
- dubbo-go 泛化调用仅适用于 dubbo2 协议,不适用 triple 协议
-
-</div>
-
-<p>泛化调用是一种 Dubbo-Go 的特殊调用方式,它允许中间节点在没有接口信息的情况下传递调用信息,常被用于测试、网关的场景下。泛化调用支持 Dubbo 和 Triple 协议,但是目前序列化方案只支持 Hessian。</p>
+<p>Dubbo-go-hessian2 是一个Go语言 hessian2 序列化协议库</p></description></item><item><title>泛化调用</title><link>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/refer/generic/</guid><description><p>泛化调用是一种 Dubbo-Go 的特殊调用方式,它允许中间节点在没有接口信息的情况下传递调用信息,常被用于测试、网关的场景下。泛化调用支持 Dubbo 和 Triple 协议。通过 <code>client.NewGenericService</cod [...]
<h2 id="背景">背景</h2>
<p>为了便于理解,这篇文档中以网关使用场景介绍泛化调用。我们先来考虑普通调用(非泛化调用)。下图包含了 consumer 和 provider 两个关键角色(后文中用 endpoint 代表一个 consumer 或一个 provider),各自都有一份关于 org.apache.dubbo.sample.User 接口的定义。假定在调用行为中需要使用 org.apache.dubbo.sample.User 接口。</p>
<p><img src="https://cn.dubbo.apache.org/imgs/docs3-v2/golang-sdk/concept/rpc/generic/1631941941270-86ce9845-5a88-4cb5-8c8a-da8ae7eeb4d5.png" alt="img"></p>
@@ -45,7 +38,7 @@
<h2 id="原理">原理</h2>
<p>泛化调用本质上就是把复杂结构转化为通用结构,这里说的通用结构是指 map、string 等,网关是可以顺利解析并传递这些通用结构的。</p>
<p><img src="https://cn.dubbo.apache.org/imgs/docs3-v2/golang-sdk/concept/rpc/generic/1632207075184-25939db4-f384-452e-a0b8-e1deff7971de.png" alt="img"></p>
-<p>目前,Dubbo-go v3 只支持 Map 泛化方式(default)。我们以 User 接口为例,其定义如下所示。</p>
+<p>Dubbo-go v3 支持多种泛化方式,包括 Map(默认)、Gson、Protobuf-JSON 和 Bean。其中 Map 泛化方式最为常用,下面以此为例进行说明。以 User 接口为例,其定义如下所示。</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:#586e75">// definition</span>
</span></span><span style="display:flex;"><span><span style="color:#268bd2">type</span> User <span style="color:#268bd2">struct</span> {
</span></span><span style="display:flex;"><span> ID <span style="color:#dc322f">string</span>
diff --git a/zh-cn/sitemap.xml b/zh-cn/sitemap.xml
index a6bec60c40e..6b411451b0d 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