This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch asf-site-v2
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git
The following commit(s) were added to refs/heads/asf-site-v2 by this push:
new 227f12cea82 deploy: 8da99c6eb6683261a00a81b5805f4ddabc087959
227f12cea82 is described below
commit 227f12cea824be86047ebf7d3d615c1405b3201b
Author: Alanxtl <[email protected]>
AuthorDate: Fri Aug 7 12:58:59 2026 +0000
deploy: 8da99c6eb6683261a00a81b5805f4ddabc087959
---
.../mannual/golang-sdk/quickstart/rpc/index.html | 108 ++++++++++++++-------
en/sitemap.xml | 2 +-
sitemap.xml | 2 +-
zh-cn/index.xml | 10 +-
.../mannual/golang-sdk/quickstart/index.xml | 10 +-
.../mannual/golang-sdk/quickstart/rpc/index.html | 108 ++++++++++++++-------
zh-cn/sitemap.xml | 2 +-
7 files changed, 157 insertions(+), 85 deletions(-)
diff --git a/en/overview/mannual/golang-sdk/quickstart/rpc/index.html
b/en/overview/mannual/golang-sdk/quickstart/rpc/index.html
index 7f2e0af3a7b..e1c311cf4e6 100644
--- a/en/overview/mannual/golang-sdk/quickstart/rpc/index.html
+++ b/en/overview/mannual/golang-sdk/quickstart/rpc/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://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/><link
rel=canonical
href=https://dubbo.apache.org/en/overview/mannual/golang-sdk/quickstart/rpc/><script>var
_paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageView"]
[...]
+<!doctype html><html lang=en class=no-js><head><meta name=ROBOTS
content="INDEX, FOLLOW"><link rel=alternate hreflang=zh-cn
href=https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/><link
rel=canonical
href=https://dubbo.apache.org/en/overview/mannual/golang-sdk/quickstart/rpc/><script>var
_paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageView"]
[...]
<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>
@@ -696,25 +696,23 @@
<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>git clone --depth <span
style=color:#2aa198>1</span> https://github.com/apache/dubbo-go.git
-</span></span><span style=display:flex><span><span
style=color:#b58900>cd</span> dubbo-go/tools/protoc-gen-go-triple
-</span></span><span style=display:flex><span>go install .
-</span></span></code></pre></div><p>Make sure <code>protoc-gen-go</code> and
<code>protoc-gen-go-triple</code> are in your <code>PATH</code>. You can verify
this with <code>which protoc-gen-go</code>. If that command does not work,
please execute the following commands:</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-shell data-lang=shell><span style=display:flex><span><span
style=color:#71 [...]
+</span></span><span style=display:flex><span><span
style=color:#719e07>(</span><span style=color:#b58900>cd</span>
dubbo-go/tools/protoc-gen-go-triple <span style=color:#719e07>&&</span>
go install .<span style=color:#719e07>)</span>
+</span></span></code></pre></div><p>Make sure <code>protoc-gen-go</code> and
<code>protoc-gen-go-triple</code> are in your <code>PATH</code>. You can verify
this with <code>which protoc-gen-go</code> and <code>which
protoc-gen-go-triple</code>. If either command does not work, run:</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-shell data-lang=shell><span style=display:flex><span><span sty
[...]
</span></span><span style=display:flex><span><span
style=color:#719e07>[</span> -n <span style=color:#2aa198>"</span><span
style=color:#719e07>$(</span>go env GOPATH<span
style=color:#719e07>)</span><span style=color:#2aa198>"</span> <span
style=color:#719e07>]</span> <span style=color:#719e07>&&</span> <span
style=color:#b58900>export</span> <span style=color:#268bd2>PATH</span><span
style=color:#719e07>=</span><span style=color:#2aa198>"</span><span
style=color:#719 [...]
</span></span></code></pre></div><p><code>protoc-gen-go-triple</code> is now
maintained in the dubbo-go repository under
<a
href=https://github.com/apache/dubbo-go/tree/main/tools/protoc-gen-go-triple
target=_blank>tools/protoc-gen-go-triple</a>.
Install it from that directory, and keep the generated
<code>*.triple.go</code> files in sync when you change the <code>.proto</code>
-service definition.</p></li></ol><h2 id=quick-run-example>Quick Run
Example</h2><h3 id=download-example-source-code>Download Example Source
Code</h3><p>We maintain a series of dubbo-go usage examples in the <a
href=https://github.com/apache/dubbo-go-samples/
target=_blank>apache/dubbo-go-samples</a> repository to help users quickly
learn how to use dubbo-go.</p><p>You can <a
href=https://github.com/apache/dubbo-go-samples/archive/refs/heads/main.zip
target=_blank>download the example zip [...]
-</span></span></code></pre></div><p>Switch to the quick start example
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-shell data-lang=shell><span style=display:flex><span>$ <span
style=color:#b58900>cd</span> dubbo-go-samples/helloworld
-</span></span></code></pre></div><h3 id=run-server>Run Server</h3><p>In the
<code>go-server/cmd</code> directory:</p><p>Run the following command to 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=language-shell data-lang=shell><span style=display:flex><span>$ go run
server.go
-</span></span></code></pre></div><p>Use <code>cURL</code> to verify that the
server has been started correctly:</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-shell data-lang=shell><span style=display:flex><span>$ curl
<span style=color:#cb4b16>\
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --header <span
style=color:#2aa198>"Content-Type: application/json"</span> <span
style=color:#cb4b16>\
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --data <span
style=color:#2aa198>'{"name": "Dubbo"}'</span> <span
style=color:#cb4b16>\
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> http://localhost:20000/greet.GreetService/Greet
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>Greeting: Hello world
-</span></span></code></pre></div><h3 id=run-client>Run Client</h3><p>Open a
new terminal and run the following command in the <code>go-client/cmd</code>
directory to 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-shell data-lang=shell><span style=display:flex><span>$ go run
client.go
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>Greeting: Hello world
+service definition.</p></li></ol><h2 id=quick-run-example>Quick Run
Example</h2><h3 id=download-example-source-code>Download Example Source
Code</h3><p>We maintain a series of dubbo-go usage examples in the <a
href=https://github.com/apache/dubbo-go-samples/
target=_blank>apache/dubbo-go-samples</a> repository to help users quickly
learn how to use dubbo-go.</p><p>You can <a
href=https://github.com/apache/dubbo-go-samples/archive/refs/heads/main.zip
target=_blank>download the example zip [...]
+</span></span><span style=display:flex><span><span
style=color:#b58900>cd</span> dubbo-go-samples/helloworld
+</span></span></code></pre></div><h3 id=run-server>Run Server</h3><p>Run all
the following commands from the <code>helloworld</code> root directory. Start
the server with:</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-shell data-lang=shell><span style=display:flex><span>go run
./go-server/cmd/main.go
+</span></span></code></pre></div><p>Use <code>cURL</code> to verify that the
server has been started correctly:</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-shell data-lang=shell><span style=display:flex><span>curl <span
style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --header <span
style=color:#2aa198>"Content-Type: application/json"</span> <span
style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --data <span
style=color:#2aa198>'{"name":"Dubbo"}'</span> <span
style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> http://localhost:20000/greet.GreetService/Greet
+</span></span></code></pre></div><p>The response 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-json data-lang=json><span style=display:flex><span>{<span
style=color:#268bd2>"greeting"</span>:<span
style=color:#2aa198>"Dubbo"</span>}
+</span></span></code></pre></div><h3 id=run-client>Run Client</h3><p>Open
another terminal, return to the <code>helloworld</code> root 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-shell data-lang=shell><span style=display:flex><span><span
style=color:#b58900>cd</span> dubbo-go-samples/helloworld
+</span></span><span style=display:flex><span>go run ./go-client/cmd/main.go
+</span></span></code></pre></div><p>The logs include the following response
(prefixes such as the timestamp, log level, and call site vary by
environment):</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>Greet
response: hello world
</span></span></code></pre></div><p>This is a complete development process of
a dubbo-go RPC communication service.</p><h2 id=source-code-explanation>Source
Code Explanation</h2><p>Next, we will explain the source code of the
<code>dubbo-go-samples/helloworld</code> example.</p><h3
id=define-service>Define Service</h3><p>The example uses Protocol Buffer (IDL)
to define the Dubbo service.</p><div class=highlight><pre tabindex=0
style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4; [...]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span
style=color:#719e07>package</span> greet;
@@ -731,21 +729,43 @@ service definition.</p></li></ol><h2
id=quick-run-example>Quick Run Example</h2>
</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></span></code></pre></div><p>This file declares a service called
<code>GreetService</code>, defining the Greet method along with its request
parameter GreetRequest and return value GreetResponse.</p><h3
id=generate-code>Generate Code</h3><p>Before running the server or client, we
need to generate the relevant code using <code>protoc-gen-go</code> and
<code>protoc-gen-go-triple</code>.</p><div class=highlight><pre tabindex=0
style=color:#93a1a1;background-color:#002b36;-moz-tab-siz [...]
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --go-triple_out<span
style=color:#719e07>=</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> ./greet.proto
-</span></span></code></pre></div><p>After running the above command, you will
see the following generated files in the target 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-fallback data-lang=fallback><span style=display:flex><span>
proto
-</span></span><span style=display:flex><span> ├── greet.pb.go
-</span></span><span style=display:flex><span> ├── greet.proto
-</span></span><span style=display:flex><span> └── greet.triple.go
-</span></span></code></pre></div><p>In the proto/greet/v1 package, there are
two parts:</p><ul><li><code>greet.pb.go</code> is generated by Google’s
standard <code>protoc-gen-go</code>, which contains the structures of
<code>GreetRequest</code>, <code>GreetResponse</code>, and the
encoding/decoding rules.</li><li><code>greet.triple.go</code> is produced by
the custom Dubbo plugin <code>protoc-gen-go-triple</code> and includes key
information, including the generated interface <code [...]
+</span></span></code></pre></div><p><code>proto/greet.proto</code> declares
the <code>GreetService</code> service and defines the <code>Greet</code> RPC,
its <code>GreetRequest</code> request, and its <code>GreetResponse</code>
response.</p><h3 id=generate-code>Generate Code</h3><p>Before running the
server or client, generate the code with <code>protoc-gen-go</code> and
<code>protoc-gen-go-triple</code> from the <code>helloworld</code> root
directory:</p><div class=highlight><pre tabind [...]
+</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>After the command completes, the
<code>proto</code> directory has the following structure:</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>proto/
+</span></span><span style=display:flex><span>├── greet.proto
+</span></span><span style=display:flex><span>├── greet.pb.go
+</span></span><span style=display:flex><span>└── greet.triple.go
+</span></span></code></pre></div><p>The generated files have different
responsibilities:</p><ul><li><code>greet.pb.go</code> is generated by the
standard <code>protoc-gen-go</code> plugin. It primarily contains Protobuf
messages such as <code>GreetRequest</code> and <code>GreetResponse</code>,
together with their encoding and decoding
code.</li><li><code>greet.triple.go</code> is generated by
<code>protoc-gen-go-triple</code>. It primarily contains Triple server
registration, the client [...]
+</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>&</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></span></code></pre></div><h3 id=start-server>Start
Server</h3><p>Create a Server and register the <code>GreetTripleServer</code>
implementation with <code>RegisterGreetServiceHandler</code>. The Server
listens on port <code>20000</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:#719e07>package</span> main
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span
style=color:#719e07>import</span> (
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"context"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> _ <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/imports"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/protocol"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/server"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"github.com/dubbogo/gost/log/logger"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> greet <span
style=color:#2aa198>"github.com/apache/dubbo-go-samples/helloworld/proto"</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>type</span> GreetTripleServer <span
style=color:#268bd2>struct</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>&</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></span></code></pre></div><h3 id=start-server>Start
Server</h3><p>Create a new Server, register the <code>GreetTripleServer</code>
we implemented earlier, and then initialize and start the Server, which will
listen for requests on the specified port.</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> <s [...]
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span
style=color:#268bd2>func</span> <span style=color:#268bd2>main</span>() {
</span></span><span style=display:flex><span> srv, err <span
style=color:#719e07>:=</span> server.<span style=color:#268bd2>NewServer</span>(
</span></span><span style=display:flex><span> server.<span
style=color:#268bd2>WithServerProtocol</span>(
</span></span><span style=display:flex><span> protocol.<span
style=color:#268bd2>WithPort</span>(<span style=color:#2aa198>20000</span>),
@@ -753,37 +773,59 @@ service definition.</p></li></ol><h2
id=quick-run-example>Quick Run Example</h2>
</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:#b58900>panic</span>(err)
+</span></span><span style=display:flex><span> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
create server: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</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>if</span> err <span style=color:#719e07>:=</span>
greet.<span style=color:#268bd2>RegisterGreetServiceHandler</span>(srv, <span
style=color:#719e07>&</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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
register greet service handler: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</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>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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
serve: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=access-service>Access
Service</h3><p>The simplest way is to use an HTTP/1.1 POST request to access
the service, passing the parameters as standard JSON format in the HTTP
payload. Here is an example using a cURL command:</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-shell data-lang=shell><span style=display:flex><span>curl <span
style=color:#cb4b16>\
</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --header <span
style=color:#2aa198>"Content-Type: application/json"</span> <span
style=color:#cb4b16>\
</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --data <span
style=color:#2aa198>'{"name": "Dubbo"}'</span> <span
style=color:#cb4b16>\
</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> http://localhost:20000/greet.GreetService/Greet
-</span></span></code></pre></div><p>You can also use a Dubbo client to request
the service. First, obtain the service proxy from the generated code in the
<code>greet</code> package, specify the server address, and initialize it. Then
you can initiate an RPC call.</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</s [...]
+</span></span></code></pre></div><p>You can also use a Dubbo client to request
the service. First, obtain the service proxy from the generated code in the
<code>greet</code> package, specify the server address, and initialize it. Then
you can initiate an RPC call.</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:#719e07>package [...]
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span
style=color:#719e07>import</span> (
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"context"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"time"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/client"</span>
+</span></span><span style=display:flex><span> _ <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/imports"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"github.com/dubbogo/gost/log/logger"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> greet <span
style=color:#2aa198>"github.com/apache/dubbo-go-samples/helloworld/proto"</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> <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>"127.0.0.1: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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
create client: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
create greet service: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</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> svc.<span
style=color:#268bd2>Greet</span>(context.<span
style=color:#268bd2>Background</span>(), <span
style=color:#719e07>&</span>greet.GreetRequest{Name: <span
style=color:#2aa198>"hello world"</span>})
+</span></span><span style=display:flex><span> ctx, cancel <span
style=color:#719e07>:=</span> context.<span
style=color:#268bd2>WithTimeout</span>(context.<span
style=color:#268bd2>Background</span>(), time.Second)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>defer</span> <span style=color:#268bd2>cancel</span>()
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> resp, err <span
style=color:#719e07>:=</span> svc.<span style=color:#268bd2>Greet</span>(ctx,
<span style=color:#719e07>&</span>greet.GreetRequest{Name: <span
style=color:#2aa198>"hello world"</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> logger.<span
style=color:#268bd2>Error</span>(err)
+</span></span><span style=display:flex><span> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
greet: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</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>"Greet response:
%s"</span>, resp.Greeting)
</span></span><span style=display:flex><span>}
diff --git a/en/sitemap.xml b/en/sitemap.xml
index a89f86426d9..32e94c734bf 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://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://dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5
[...]
\ 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://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://dubbo.apache.org/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5
[...]
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
index a50280abdfd..f012bbfd14e 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://dubbo.apache.org/zh-cn/sitemap.xml</loc><lastmod>2026-07-29T17:42:13+08:00</lastmod></sitemap><sitemap><loc>https://dubbo.apache.org/en/sitemap.xml</loc><lastmod>2026-06-23T02:09:33+00: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://dubbo.apache.org/zh-cn/sitemap.xml</loc><lastmod>2026-08-07T20:51:37+08:00</lastmod></sitemap><sitemap><loc>https://dubbo.apache.org/en/sitemap.xml</loc><lastmod>2026-08-07T20:51:37+08:00</lastmod></sitemap></sitemapindex>
\ No newline at end of file
diff --git a/zh-cn/index.xml b/zh-cn/index.xml
index febfd4706ab..4819d9ba992 100644
--- a/zh-cn/index.xml
+++ b/zh-cn/index.xml
@@ -7797,14 +7797,8 @@ Zipkin: <a
href="https://github.com/openzipkin/zipkin-helm">https://github
<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-shell" data-lang="shell"><span
style="display:flex;"><span>go install
google.golang.org/protobuf/cmd/protoc-gen-go@latest
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>git
clone --depth <span style="color:#2aa198">1</span>
https://github.com/apache/dubbo-go.git
-</span></span><span
style="display:flex;"><span><span
style="color:#b58900">cd</span> dubbo-go/tools/protoc-gen-go-triple
-</span></span><span style="display:flex;"><span>go
install .
-</span></span></code></pre></div><p>确保
<code>protoc-gen-go</code>、<code>protoc-gen-go-triple</code>
在你的 <code>PATH</code> 中。这可以通过 <code>which
protoc-gen-go</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-shell" data-lang="shell"><span
style="display:flex;"><span><span
style="color:#719e07">[</span> -n <span
style="color:#2aa198">&#34;</span><span
style="color:#719e07">$(</span>go env GOBIN<span
style="color:#719e07">)</span><span style="color:#2aa198"> [...]
-</span></span><span
style="display:flex;"><span><span
style="color:#719e07">[</span> -n <span
style="color:#2aa198">&#34;</span><span
style="color:#719e07">$(</span>go env GOPATH<span
style="color:#719e07">)</span><span
style="color:#2aa198">&#34;</span> <span
style="color:#719e07">]</span> <span
style="color:#719e07">&amp;&amp;</span> <span
style="color:#b58900" [...]
-</span></span></code></pre></div><p><code>protoc-gen-go-triple</code>
现在维护在 dubbo-go 仓库的
-<a
href="https://github.com/apache/dubbo-go/tree/main/tools/protoc-gen-go-triple"
target="_blank">tools/protoc-gen-go-triple</a>
-目录下。请从该目录安装;修改 <code>.proto</code> 服务定义后,请同步重新生成
<code>*.triple.go</code>
文件。</p></description></item><item><title>可观测性</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/observability/console/</link><pubDate>Mon,
01 Jan 0001 00:00:00
+0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/observability/console/</guid><description><p>管理
Dubbo 最直接的方式就是通过 Dubbo 控制面(即 dubbo-control-plane)提供的可视化界面,之前我们在& [...]
+</span></span><span
style="display:flex;"><span><span
style="color:#719e07">(</span><span
style="color:#b58900">cd</span> dubbo-go/tools/protoc-gen-go-triple
<span style="color:#719e07">&amp;&amp;</span> go install
.<span style="color:#719e07">)</span>
+</span></span></code></pre></div><p>确保
<code>protoc-gen-go</code>、<code>protoc-gen-go-triple</code>
在你的 <code>PATH</code> 中。这可以通过 <code>which
protoc-gen-go</code> 和 <code>which
protoc-gen-go-triple</code>
验证。如果命令不能正常工作,请执行以下命令:</p></description></item><item><title>可观测性</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/observability/console/</link><pubDate>Mon,
0 [...]
<p><strong><code>dubbo-control-plane</code>
支持可视化的展示、监控集群状态,还支持实时下发流量管控规则。</strong></p>
<h2 id="安装控制台">安装控制台</h2>
<p>为了体验效果,我们首先需要安装 dubbo-control-plane,以下是在 Linux 环境下安装
dubbo-control-plane 的具体步骤:</p>
diff --git a/zh-cn/overview/mannual/golang-sdk/quickstart/index.xml
b/zh-cn/overview/mannual/golang-sdk/quickstart/index.xml
index dc3bebef74d..15fec7ee351 100644
--- a/zh-cn/overview/mannual/golang-sdk/quickstart/index.xml
+++ b/zh-cn/overview/mannual/golang-sdk/quickstart/index.xml
@@ -14,14 +14,8 @@
<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-shell" data-lang="shell"><span
style="display:flex;"><span>go install
google.golang.org/protobuf/cmd/protoc-gen-go@latest
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>git
clone --depth <span style="color:#2aa198">1</span>
https://github.com/apache/dubbo-go.git
-</span></span><span
style="display:flex;"><span><span
style="color:#b58900">cd</span> dubbo-go/tools/protoc-gen-go-triple
-</span></span><span style="display:flex;"><span>go
install .
-</span></span></code></pre></div><p>确保
<code>protoc-gen-go</code>、<code>protoc-gen-go-triple</code>
在你的 <code>PATH</code> 中。这可以通过 <code>which
protoc-gen-go</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-shell" data-lang="shell"><span
style="display:flex;"><span><span
style="color:#719e07">[</span> -n <span
style="color:#2aa198">&#34;</span><span
style="color:#719e07">$(</span>go env GOBIN<span
style="color:#719e07">)</span><span style="color:#2aa198"> [...]
-</span></span><span
style="display:flex;"><span><span
style="color:#719e07">[</span> -n <span
style="color:#2aa198">&#34;</span><span
style="color:#719e07">$(</span>go env GOPATH<span
style="color:#719e07">)</span><span
style="color:#2aa198">&#34;</span> <span
style="color:#719e07">]</span> <span
style="color:#719e07">&amp;&amp;</span> <span
style="color:#b58900" [...]
-</span></span></code></pre></div><p><code>protoc-gen-go-triple</code>
现在维护在 dubbo-go 仓库的
-<a
href="https://github.com/apache/dubbo-go/tree/main/tools/protoc-gen-go-triple"
target="_blank">tools/protoc-gen-go-triple</a>
-目录下。请从该目录安装;修改 <code>.proto</code> 服务定义后,请同步重新生成
<code>*.triple.go</code>
文件。</p></description></item><item><title>开发微服务</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/microservices/</link><pubDate>Mon,
01 Jan 0001 00:00:00
+0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/microservices/</guid><description><p>本示例演示了使用
dubbo-go 开发微服务应用,为应用增加包括服务发现、负载均衡、流量管控等微服务核心能力。</p>
+</span></span><span
style="display:flex;"><span><span
style="color:#719e07">(</span><span
style="color:#b58900">cd</span> dubbo-go/tools/protoc-gen-go-triple
<span style="color:#719e07">&amp;&amp;</span> go install
.<span style="color:#719e07">)</span>
+</span></span></code></pre></div><p>确保
<code>protoc-gen-go</code>、<code>protoc-gen-go-triple</code>
在你的 <code>PATH</code> 中。这可以通过 <code>which
protoc-gen-go</code> 和 <code>which
protoc-gen-go-triple</code>
验证。如果命令不能正常工作,请执行以下命令:</p></description></item><item><title>开发微服务</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/microservices/</link><pubDate>Mon,
0 [...]
<p>示例源码:<a
href="https://github.com/apache/dubbo-go-samples/tree/main/registry/nacos"
target="_blank">dubbo-go-samples/registry/nacos</a>。</p>
<h2 id="前置条件">前置条件</h2>
<p>本示例我们继续使用 Protobuf 开发微服务应用,请参考 <a href="../rpc">开发 rpc server 和
rpc client</a> 了解如何安装 protoc、protoc-gen-go-triple 等必须插件。</p>
diff --git a/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/index.html
b/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/index.html
index aa78d75d7d5..655a2e7c80e 100644
--- a/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/index.html
+++ b/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/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://dubbo.apache.org/en/overview/mannual/golang-sdk/quickstart/rpc/><link
rel=canonical
href=https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/><script>var
_paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageView"]
[...]
+<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS
content="INDEX, FOLLOW"><link rel=alternate hreflang=en
href=https://dubbo.apache.org/en/overview/mannual/golang-sdk/quickstart/rpc/><link
rel=canonical
href=https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/rpc/><script>var
_paq=window._paq=window._paq||[];_paq.push(["setDocumentTitle",document.domain+"/"+document.title]),_paq.push(["setCookieDomain","*.dubbo.apache.org"]),_paq.push(["trackPageView"]
[...]
<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>
@@ -691,24 +691,22 @@
<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>git clone --depth <span
style=color:#2aa198>1</span> https://github.com/apache/dubbo-go.git
-</span></span><span style=display:flex><span><span
style=color:#b58900>cd</span> dubbo-go/tools/protoc-gen-go-triple
-</span></span><span style=display:flex><span>go install .
-</span></span></code></pre></div><p>确保
<code>protoc-gen-go</code>、<code>protoc-gen-go-triple</code> 在你的
<code>PATH</code> 中。这可以通过 <code>which protoc-gen-go</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-shell data-lang=shell><span style=display:flex><span><span
style=color:#719e07>[</span> -n <span style=color:#2aa198>"</span><span
style=color:#719e07>$ [...]
+</span></span><span style=display:flex><span><span
style=color:#719e07>(</span><span style=color:#b58900>cd</span>
dubbo-go/tools/protoc-gen-go-triple <span style=color:#719e07>&&</span>
go install .<span style=color:#719e07>)</span>
+</span></span></code></pre></div><p>确保
<code>protoc-gen-go</code>、<code>protoc-gen-go-triple</code> 在你的
<code>PATH</code> 中。这可以通过 <code>which protoc-gen-go</code> 和 <code>which
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-shell data-lang=shell><span style=display:flex><span><span
style=color:#719e07>[</span> -n <span style=color:#2aa198> [...]
</span></span><span style=display:flex><span><span
style=color:#719e07>[</span> -n <span style=color:#2aa198>"</span><span
style=color:#719e07>$(</span>go env GOPATH<span
style=color:#719e07>)</span><span style=color:#2aa198>"</span> <span
style=color:#719e07>]</span> <span style=color:#719e07>&&</span> <span
style=color:#b58900>export</span> <span style=color:#268bd2>PATH</span><span
style=color:#719e07>=</span><span style=color:#2aa198>"</span><span
style=color:#719 [...]
</span></span></code></pre></div><p><code>protoc-gen-go-triple</code> 现在维护在
dubbo-go 仓库的
<a
href=https://github.com/apache/dubbo-go/tree/main/tools/protoc-gen-go-triple
target=_blank>tools/protoc-gen-go-triple</a>
-目录下。请从该目录安装;修改 <code>.proto</code> 服务定义后,请同步重新生成 <code>*.triple.go</code>
文件。</p></li></ol><h2 id=快速运行示例>快速运行示例</h2><h3 id=下载示例源码>下载示例源码</h3><p>我们在 <a
href=https://github.com/apache/dubbo-go-samples/
target=_blank>apache/dubbo-go-samples</a> 仓库维护了一系列 dubbo-go 使用示例,用来帮助用户快速学习
dubbo-go 使用方式。</p><p>你可以 <a
href=https://github.com/apache/dubbo-go-samples/archive/refs/heads/main.zip
target=_blank>下载示例 zip 包并解压</a>,或者克隆仓库:</p><div class=highlight><pre tabindex=0
style=color:#93a1a1;background-c [...]
-</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-shell data-lang=shell><span style=display:flex><span>$ <span
style=color:#b58900>cd</span> dubbo-go-samples/helloworld
-</span></span></code></pre></div><h3 id=运行-server>运行 server</h3><p>在
<code>go-server/cmd</code> 目录:</p><p>运行以下命令,启动 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=language-shell data-lang=shell><span style=display:flex><span>$ go run
server.go
-</span></span></code></pre></div><p>使用 <code>cURL</code> 验证 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=language-shell data-lang=shell><span style=display:flex><span>$ curl
<span style=color:#cb4b16>\
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --header <span
style=color:#2aa198>"Content-Type: application/json"</span> <span
style=color:#cb4b16>\
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --data <span
style=color:#2aa198>'{"name": "Dubbo"}'</span> <span
style=color:#cb4b16>\
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> http://localhost:20000/greet.GreetService/Greet
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>Greeting: Hello world
-</span></span></code></pre></div><h3 id=运行-client>运行 client</h3><p>打开一个新的
terminal,运行以下命令,在 <code>go-client/cmd</code> 目录运行以下命令,启动 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-shell data-lang=shell><span style=display:flex><span>$ go run
client.go
-</span></span><span style=display:flex><span>
-</span></span><span style=display:flex><span>Greeting: Hello world
+目录下。请从该目录安装;修改 <code>.proto</code> 服务定义后,请同步重新生成 <code>*.triple.go</code>
文件。</p></li></ol><h2 id=快速运行示例>快速运行示例</h2><h3 id=下载示例源码>下载示例源码</h3><p>我们在 <a
href=https://github.com/apache/dubbo-go-samples/
target=_blank>apache/dubbo-go-samples</a> 仓库维护了一系列 dubbo-go 使用示例,用来帮助用户快速学习
dubbo-go 使用方式。</p><p>你可以 <a
href=https://github.com/apache/dubbo-go-samples/archive/refs/heads/main.zip
target=_blank>下载示例 zip 包并解压</a>,或者克隆仓库:</p><div class=highlight><pre tabindex=0
style=color:#93a1a1;background-c [...]
+</span></span><span style=display:flex><span><span
style=color:#b58900>cd</span> dubbo-go-samples/helloworld
+</span></span></code></pre></div><h3 id=运行-server>运行 server</h3><p>以下命令均从
<code>helloworld</code> 根目录运行。启动 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=language-shell data-lang=shell><span style=display:flex><span>go run
./go-server/cmd/main.go
+</span></span></code></pre></div><p>使用 <code>cURL</code> 验证 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=language-shell data-lang=shell><span style=display:flex><span>curl <span
style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --header <span
style=color:#2aa198>"Content-Type: application/json"</span> <span
style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --data <span
style=color:#2aa198>'{"name":"Dubbo"}'</span> <span
style=color:#cb4b16>\
+</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> http://localhost:20000/greet.GreetService/Greet
+</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-json data-lang=json><span style=display:flex><span>{<span
style=color:#268bd2>"greeting"</span>:<span
style=color:#2aa198>"Dubbo"</span>}
+</span></span></code></pre></div><h3 id=运行-client>运行
client</h3><p>打开一个新的终端,重新进入 <code>helloworld</code> 根目录并启动 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-shell data-lang=shell><span style=display:flex><span><span
style=color:#b58900>cd</span> dubbo-go-samples/helloworld
+</span></span><span style=display:flex><span>go run ./go-client/cmd/main.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>Greet
response: hello world
</span></span></code></pre></div><p>以上就是一个完整的 dubbo-go RPC 通信服务开发过程。</p><h2
id=源码讲解>源码讲解</h2><p>接下来,我们将对 <code>dubbo-go-samples/helloworld</code>
示例进行源码层面的讲解。</p><h3 id=定义服务>定义服务</h3><p>示例使用 Protocol Buffer (IDL) 来定义 Dubbo
服务。</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>syntax <span style=color:#719e07>=</span> <span
style=color [...]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span
style=color:#719e07>package</span> greet;
@@ -725,21 +723,43 @@
</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></span></code></pre></div><p>这个文件声明了一个叫做 <code>GreetService</code>
的服务,为这个服务定义了 Greet 方法以及它的请求参数 GreetRequest 和返回值 GreetResponse。</p><h3
id=生成代码>生成代码</h3><p>在运行 server 或者 client 之前,我们需要使用
<code>protoc-gen-go</code>、<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-bash data-lang=bash><span style=display:flex><span>protoc
--go_out<span style=col [...]
-</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --go-triple_out<span
style=color:#719e07>=</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> ./greet.proto
-</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-fallback data-lang=fallback><span style=display:flex><span>
proto
-</span></span><span style=display:flex><span> ├── greet.pb.go
-</span></span><span style=display:flex><span> ├── greet.proto
-</span></span><span style=display:flex><span> └── greet.triple.go
-</span></span></code></pre></div><p>在 proto/greet/v1
包下有两部分内容:</p><ul><li><code>greet.pb.go</code> 是由谷歌标准的
<code>protoc-gen-go</code>生成,它包含
<code>GreetRequest</code>、<code>GreetResponse</code>
结构体和响应的编解码规则。</li><li><code>greet.triple.go</code> 是由 Dubbo
自定义的插件<code>protoc-gen-go-triple</code>成,其中关键的信息包括生成的接口
<code>GreetService</code>、构造器等。</li></ul><h3
id=实现服务>实现服务</h3><p>接下来我们就需要添加业务逻辑了,实现 <code>greet.GreetService</code>
接口即可。</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;b [...]
+</span></span></code></pre></div><p><code>proto/greet.proto</code> 声明了名为
<code>GreetService</code> 的服务,并定义了 RPC 方法 <code>Greet</code>、请求
<code>GreetRequest</code> 和响应 <code>GreetResponse</code>。</p><h3
id=生成代码>生成代码</h3><p>在运行 server 或 client 之前,需要在 <code>helloworld</code> 根目录使用
<code>protoc-gen-go</code> 和 <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=lang [...]
+</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>proto</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-text data-lang=text><span style=display:flex><span>proto/
+</span></span><span style=display:flex><span>├── greet.proto
+</span></span><span style=display:flex><span>├── greet.pb.go
+</span></span><span style=display:flex><span>└── greet.triple.go
+</span></span></code></pre></div><p>其中:</p><ul><li><code>greet.pb.go</code>
由标准的 <code>protoc-gen-go</code> 生成,主要包含
<code>GreetRequest</code>、<code>GreetResponse</code> 等 Protobuf
消息及编解码代码。</li><li><code>greet.triple.go</code> 由
<code>protoc-gen-go-triple</code> 生成,主要包含 Triple 服务端注册、客户端代理和 RPC 调用相关代码,例如
<code>RegisterGreetServiceHandler</code> 和
<code>NewGreetService</code>。</li></ul><p>修改 <code>proto/greet.proto</code>
后,需要重新运行上述命令,同时更新这两个生成文件。</p><h3 id=实现服务>实现服务</h3><p>接下来添加业务逻辑。<code [...]
+</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>&</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></span></code></pre></div><h3 id=启动-server>启动 Server</h3><p>创建
Server,并通过 <code>RegisterGreetServiceHandler</code> 注册上一步实现的
<code>GreetTripleServer</code>。Server 在 <code>20000</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:#719e07>package</span> main
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span
style=color:#719e07>import</span> (
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"context"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> _ <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/imports"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/protocol"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/server"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"github.com/dubbogo/gost/log/logger"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> greet <span
style=color:#2aa198>"github.com/apache/dubbo-go-samples/helloworld/proto"</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>type</span> GreetTripleServer <span
style=color:#268bd2>struct</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>&</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></span></code></pre></div><h3 id=启动-server>启动 Server</h3><p>创建一个新的
Server,把我们上一步中实现的 <code>GreeterServer</code>注册给它,接下来就可以直接初始化和启动 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=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>
+</span></span><span style=display:flex><span><span
style=color:#268bd2>func</span> <span style=color:#268bd2>main</span>() {
</span></span><span style=display:flex><span> srv, err <span
style=color:#719e07>:=</span> server.<span style=color:#268bd2>NewServer</span>(
</span></span><span style=display:flex><span> server.<span
style=color:#268bd2>WithServerProtocol</span>(
</span></span><span style=display:flex><span> protocol.<span
style=color:#268bd2>WithPort</span>(<span style=color:#2aa198>20000</span>),
@@ -747,37 +767,59 @@
</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:#b58900>panic</span>(err)
+</span></span><span style=display:flex><span> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
create server: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</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>if</span> err <span style=color:#719e07>:=</span>
greet.<span style=color:#268bd2>RegisterGreetServiceHandler</span>(srv, <span
style=color:#719e07>&</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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
register greet service handler: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</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>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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
serve: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=访问服务>访问服务</h3><p>最简单方式是使用 HTTP/1.1
POST 请求访问服务,参数则作以标准 JSON 格式作为 HTTP 负载传递。如下是使用 cURL 命令的访问示例:</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-shell data-lang=shell><span style=display:flex><span>curl <span
style=color:#cb4b16>\
</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --header <span
style=color:#2aa198>"Content-Type: application/json"</span> <span
style=color:#cb4b16>\
</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> --data <span
style=color:#2aa198>'{"name": "Dubbo"}'</span> <span
style=color:#cb4b16>\
</span></span></span><span style=display:flex><span><span
style=color:#cb4b16></span> http://localhost:20000/greet.GreetService/Greet
-</span></span></code></pre></div><p>也可以使用 Dubbo client 请求服务,我们首先需要从生成代码即
<code>greet</code> 包中获取服务代理,为它指定 server 地址并初始化,之后就可以发起 RPC 调用了。</p><div
class=highlight><pre tabindex=0
style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code
class=language-go data-lang=go><span style=display:flex><span><span
style=color:#268bd2>func</span> <span style=color:#268bd2>main</span>() {
+</span></span></code></pre></div><p>也可以使用 Dubbo client 请求服务,我们首先需要从生成代码即
<code>greet</code> 包中获取服务代理,为它指定 server 地址并初始化,之后就可以发起 RPC 调用了。</p><div
class=highlight><pre tabindex=0
style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code
class=language-go data-lang=go><span style=display:flex><span><span
style=color:#719e07>package</span> main
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span><span
style=color:#719e07>import</span> (
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"context"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"time"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/client"</span>
+</span></span><span style=display:flex><span> _ <span
style=color:#2aa198>"dubbo.apache.org/dubbo-go/v3/imports"</span>
+</span></span><span style=display:flex><span> <span
style=color:#2aa198>"github.com/dubbogo/gost/log/logger"</span>
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> greet <span
style=color:#2aa198>"github.com/apache/dubbo-go-samples/helloworld/proto"</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> <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>"127.0.0.1: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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
create client: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</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> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
create greet service: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</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> svc.<span
style=color:#268bd2>Greet</span>(context.<span
style=color:#268bd2>Background</span>(), <span
style=color:#719e07>&</span>greet.GreetRequest{Name: <span
style=color:#2aa198>"hello world"</span>})
+</span></span><span style=display:flex><span> ctx, cancel <span
style=color:#719e07>:=</span> context.<span
style=color:#268bd2>WithTimeout</span>(context.<span
style=color:#268bd2>Background</span>(), time.Second)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>defer</span> <span style=color:#268bd2>cancel</span>()
+</span></span><span style=display:flex><span>
+</span></span><span style=display:flex><span> resp, err <span
style=color:#719e07>:=</span> svc.<span style=color:#268bd2>Greet</span>(ctx,
<span style=color:#719e07>&</span>greet.GreetRequest{Name: <span
style=color:#2aa198>"hello world"</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> logger.<span
style=color:#268bd2>Error</span>(err)
+</span></span><span style=display:flex><span> logger.<span
style=color:#268bd2>Errorf</span>(<span style=color:#2aa198>"failed to
greet: %v"</span>, err)
+</span></span><span style=display:flex><span> <span
style=color:#719e07>return</span>
</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>"Greet response:
%s"</span>, resp.Greeting)
</span></span><span style=display:flex><span>}
diff --git a/zh-cn/sitemap.xml b/zh-cn/sitemap.xml
index aa2363c40a3..ec2ba7f4e34 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://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://dubbo.apach [...]
\ 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://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://dubbo.apach [...]
\ No newline at end of file