| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – 快速开始</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/quickstart/</link><description>Recent content in 快速开始 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/quickstart/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: Dubbo-go 协议快速开始</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/quickstart/quickstart_dubbo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/quickstart/quickstart_dubbo/</guid><description> |
| <div class="pageinfo pageinfo-primary"> |
| <p>此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅<a href="https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple/">最新版本</a>。</p> |
| </div> |
| <h1 id="dubbo-go-协议快速开始">Dubbo-go 协议快速开始</h1> |
| <h2 id="1-环境安装">1. 环境安装</h2> |
| <h3 id="11-安装-go-语言环境">1.1 安装 Go 语言环境</h3> |
| <p>建议使用最新版 go 1.17</p> |
| <p>go version &gt;= go 1.15</p> |
| <p><a href="https://golang.google.cn/">【Go 语言官网下载地址】</a></p> |
| <p>构建如下文件目录,使用命令 <code>go mod init dubbo3-demo </code> 初始化 go module。</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>quickstart |
| </span></span><span style="display:flex;"><span>├── api |
| </span></span><span style="display:flex;"><span>│ └── api.go |
| </span></span><span style="display:flex;"><span>├── client |
| </span></span><span style="display:flex;"><span>│ ├── client.go |
| </span></span><span style="display:flex;"><span>│ └── dubbogo.yml |
| </span></span><span style="display:flex;"><span>├── go.mod |
| </span></span><span style="display:flex;"><span>└── server |
| </span></span><span style="display:flex;"><span> ├── dubbogo.yml |
| </span></span><span style="display:flex;"><span> └── server.go |
| </span></span></code></pre></div><h3 id="12-启动zookeeper">1.2 启动zookeeper</h3> |
| <p>选择您喜欢的方式启动zk,如您安装docker-compose可直接从文件启动:</p> |
| <p>zookeeper.yml:</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-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">version</span>: <span style="color:#2aa198">&#39;3&#39;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">services</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zookeeper</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">image</span>: zookeeper |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#2aa198">2181</span>:<span style="color:#2aa198">2181</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">restart</span>: <span style="color:#cb4b16">on</span>-failure |
| </span></span></code></pre></div><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>docker-compose -f ./zookeeper.yml up -d |
| </span></span></code></pre></div><h2 id="2-编写客户端服务端的接口和实现">2. 编写客户端服务端的接口和实现</h2> |
| <h3 id="21-定义接口和传输结构位于apiapigo">2.1 定义接口和传输结构,位于api/api.go</h3> |
| <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> api |
| </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">&#34;context&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/config&#34;</span> |
| </span></span><span style="display:flex;"><span> hessian <span style="color:#2aa198">&#34;github.com/apache/dubbo-go-hessian2&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;time&#34;</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:#586e75">//1. 定义传输结构, 如需 Java 互通,字段需要与 Java 侧对应,首字母大写 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></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> |
| </span></span><span style="display:flex;"><span> Age <span style="color:#dc322f">int32</span> |
| </span></span><span style="display:flex;"><span> Time time.Time |
| </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> (u <span style="color:#719e07">*</span>User) <span style="color:#268bd2">JavaClassName</span>() <span style="color:#dc322f">string</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#2aa198">&#34;org.apache.dubbo.User&#34;</span> <span style="color:#586e75">// 如果与 Java 互通,需要与 Java 侧 User class全名对应, |
| </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> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">var</span> ( |
| </span></span><span style="display:flex;"><span> UserProviderClient = <span style="color:#719e07">&amp;</span>UserProvider{} <span style="color:#586e75">// 客户端指针 |
| </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><span style="color:#586e75">// 2。 定义客户端存根类:UserProvider |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">type</span> UserProvider <span style="color:#268bd2">struct</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// dubbo标签,用于适配go侧客户端大写方法名 -&gt; java侧小写方法名,只有 dubbo 协议客户端才需要使用 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> GetUser <span style="color:#268bd2">func</span>(ctx context.Context, req <span style="color:#dc322f">int32</span>) (<span style="color:#719e07">*</span>User, <span style="color:#dc322f">error</span>) <span style="color:#586e75">//`dubbo:&#34;getUser&#34;` |
| </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><span style="color:#268bd2">func</span> <span style="color:#268bd2">init</span>(){ |
| </span></span><span style="display:flex;"><span> hessian.<span style="color:#268bd2">RegisterPOJO</span>(<span style="color:#719e07">&amp;</span>User{}) <span style="color:#586e75">// 注册传输结构到 hessian 库 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// 注册客户端存根类到框架,实例化客户端接口指针 userProvider |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> config.<span style="color:#268bd2">SetConsumerService</span>(UserProviderClient) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="22-编写-go-server-配置和代码">2.2 编写 Go-Server 配置和代码</h3> |
| <p>server/dubbogo.yml</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-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">dubbo</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">registries</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">demoZK</span>: <span style="color:#586e75"># 定义服务注册发现中心</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: zookeeper |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">address</span>: <span style="color:#2aa198">127.0.0.1</span>:<span style="color:#2aa198">2181</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocols</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">dubbo</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo <span style="color:#586e75"># 协议名 dubbo</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20000</span> <span style="color:#586e75"># 监听端口</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">provider</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">services</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">UserProvider</span>: <span style="color:#586e75"># 服务提供结构类名</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: org.apache.dubbo.UserProvider <span style="color:#586e75"># 接口需要与 go/java 客户端对应</span> |
| </span></span></code></pre></div><p>server/server.go</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#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">&#34;context&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/common/logger&#34;</span> <span style="color:#586e75">// dubbogo 框架日志 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/config&#34;</span> |
| </span></span><span style="display:flex;"><span> _ <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/imports&#34;</span> <span style="color:#586e75">// dubbogo 框架依赖,所有dubbogo进程都需要隐式引入一次 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#2aa198">&#34;dubbo3-demo/api&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;strconv&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;time&#34;</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> UserProvider <span style="color:#268bd2">struct</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:#586e75">// 实现接口方法 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">func</span> (u <span style="color:#719e07">*</span>UserProvider) <span style="color:#268bd2">GetUser</span>(ctx context.Context, req <span style="color:#dc322f">int32</span>) (<span style="color:#719e07">*</span>api.User, <span style="color:#dc322f">error</span>) { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">var</span> err <span style="color:#dc322f">error</span> |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;req:%#v&#34;</span>, req) |
| </span></span><span style="display:flex;"><span> user <span style="color:#719e07">:=</span> <span style="color:#719e07">&amp;</span>api.User{} |
| </span></span><span style="display:flex;"><span> user.ID = strconv.<span style="color:#268bd2">Itoa</span>(<span style="color:#b58900">int</span>(req)) |
| </span></span><span style="display:flex;"><span> user.Name = <span style="color:#2aa198">&#34;laurence&#34;</span> |
| </span></span><span style="display:flex;"><span> user.Age = <span style="color:#2aa198">22</span> |
| </span></span><span style="display:flex;"><span> user.Time = time.<span style="color:#268bd2">Now</span>() |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> user, err |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">//// MethodMapper 定义方法名映射,从 Go 的方法名映射到 Java 小写方法名,只有 dubbo 协议服务接口才需要使用 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">//// go -&gt; go 互通无需使用 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">//func (s *UserProvider) MethodMapper() map[string]string { |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// return map[string]string{ |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// &#34;GetUser&#34;: &#34;getUser&#34;, |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// } |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">//} |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">func</span> <span style="color:#268bd2">init</span>(){ |
| </span></span><span style="display:flex;"><span> config.<span style="color:#268bd2">SetProviderService</span>(<span style="color:#719e07">&amp;</span>UserProvider{}) <span style="color:#586e75">// 注册服务提供者类,类名与配置文件中的 service 对应 |
| </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><span style="color:#586e75">// export DUBBO_GO_CONFIG_PATH=dubbogo.yml 运行前需要设置环境变量,指定配置文件位置 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">func</span> <span style="color:#268bd2">main</span>() { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">Load</span>(); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">select</span> {} |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="23-编写-go-client-配置和代码">2.3 编写 Go-Client 配置和代码</h3> |
| <p>client/dubbogo.yml</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-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">dubbo</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">registries</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">demoZK</span>: <span style="color:#586e75"># 定义服务注册发现中心</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: zookeeper |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">address</span>: <span style="color:#2aa198">127.0.0.1</span>:<span style="color:#2aa198">2181</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">consumer</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">references</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">UserProvider</span>: <span style="color:#586e75"># 存根类名</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: dubbo <span style="color:#586e75"># dubbo 协议,默认 hessian2 序列化方式</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: org.apache.dubbo.UserProvider <span style="color:#586e75"># 接口需要与 go/java 客户端对应</span> |
| </span></span></code></pre></div><p>client/client.go</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#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">&#34;context&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/common/logger&#34;</span> <span style="color:#586e75">// dubbogo 框架日志 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/config&#34;</span> |
| </span></span><span style="display:flex;"><span> _ <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/imports&#34;</span> <span style="color:#586e75">// dubbogo 框架依赖,所有dubbogo进程都需要隐式引入一次 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#2aa198">&#34;dubbo3-demo/api&#34;</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:#586e75">// export DUBBO_GO_CONFIG_PATH=dubbogo.yml 运行前需要设置环境变量,指定配置文件位置 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">func</span> <span style="color:#268bd2">main</span>(){ |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// 启动框架 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">Load</span>(); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">var</span> i <span style="color:#dc322f">int32</span> = <span style="color:#2aa198">1</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// 发起调用 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> user, err <span style="color:#719e07">:=</span> api.UserProviderClient.<span style="color:#268bd2">GetUser</span>(context.<span style="color:#268bd2">TODO</span>(), i) |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;response result: %+v&#34;</span>, user) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h2 id="3-启动服务">3. 启动服务</h2> |
| <p>开启两个终端,分别进入server client 目录</p> |
| <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">export</span> <span style="color:#268bd2">DUBBO_GO_CONFIG_PATH</span><span style="color:#719e07">=</span>dubbogo.yml |
| </span></span><span style="display:flex;"><span>go run . |
| </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>response result: &amp;<span style="color:#719e07">{</span>ID:1 Name:laurence Age:22 Time:2021-11-12 17:59:39.185 +0800 CST<span style="color:#719e07">}</span> |
| </span></span></code></pre></div><p>获得调用结果成功</p></description></item><item><title>Docs: Triple 协议快速开始</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/quickstart/quickstart_triple/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/quickstart/quickstart_triple/</guid><description> |
| <div class="pageinfo pageinfo-primary"> |
| <p>此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅<a href="https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple/">最新版本</a>。</p> |
| </div> |
| <h1 id="triple-协议快速开始">Triple 协议快速开始</h1> |
| <h2 id="1-环境安装">1. 环境安装</h2> |
| <h3 id="11-安装go语言环境">1.1 安装Go语言环境</h3> |
| <p>建议使用最新版 go 1.17</p> |
| <p>go version &gt;= go 1.15</p> |
| <p><a href="https://golang.google.cn/">【Go 语言官网下载地址】</a></p> |
| <p>将 $GOPATH/bin 加入环境变量</p> |
| <h3 id="12-安装序列化工具protoc">1.2 安装序列化工具protoc</h3> |
| <p><a href="https://github.com/protocolbuffers/protobuf/releases">【protoc 下载地址】</a></p> |
| <h3 id="13-安装-protoc-gen-go-proto-gen-go-triple-编译插件">1.3 安装 protoc-gen-go, proto-gen-go-triple 编译插件</h3> |
| <p>本章 quick start 按照最新版示例和组件进行介绍。</p> |
| <table> |
| <thead> |
| <tr> |
| <th>依赖</th> |
| <th>Dubbo-go</th> |
| <th>Triple</th> |
| <th>protoc-gen-go-triple</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>适配版本号</td> |
| <td>v3.0.0-rc4-1</td> |
| <td>v1.1.3</td> |
| <td>v1.0.2</td> |
| </tr> |
| <tr> |
| <td>适配版本号</td> |
| <td>v3.0.0-rc3</td> |
| <td>v1.0.9</td> |
| <td>v1.0.0</td> |
| </tr> |
| </tbody> |
| </table> |
| <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">export</span> <span style="color:#268bd2">GO111MODULE</span><span style="color:#719e07">=</span><span style="color:#2aa198">&#34;on&#34;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">export</span> <span style="color:#268bd2">GOPROXY</span><span style="color:#719e07">=</span><span style="color:#2aa198">&#34;https://goproxy.cn&#34;</span> |
| </span></span><span style="display:flex;"><span>go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26.0 |
| </span></span><span style="display:flex;"><span>go install github.com/dubbogo/tools/cmd/protoc-gen-go-triple@v1.0.2 |
| </span></span></code></pre></div><p>确保上述protoc 和安装的 protoc-gen-go-triple 位于$(GOPATH)/bin, 在系统环境变量内</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 --version |
| </span></span><span style="display:flex;"><span>libprotoc 3.14.0 |
| </span></span><span style="display:flex;"><span>$ protoc-gen-go --version |
| </span></span><span style="display:flex;"><span>protoc-gen-go v1.26.0 |
| </span></span><span style="display:flex;"><span>$ protoc-gen-go-triple --version |
| </span></span><span style="display:flex;"><span>protoc-gen-go-triple 1.0.2 |
| </span></span></code></pre></div><h3 id="14-启动zookeeper">1.4 启动zookeeper</h3> |
| <p>选择您喜欢的方式启动zk,如您安装docker-compose可直接从文件启动:</p> |
| <p>zookeeper.yml:</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-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">version</span>: <span style="color:#2aa198">&#39;3&#39;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">services</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zookeeper</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">image</span>: zookeeper |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">ports</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#2aa198">2181</span>:<span style="color:#2aa198">2181</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">restart</span>: <span style="color:#cb4b16">on</span>-failure |
| </span></span></code></pre></div><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>docker-compose -f ./zookeeper.yml up -d |
| </span></span></code></pre></div><h2 id="2-编译接口">2. 编译接口</h2> |
| <h3 id="21-编写接口描述文件-helloworldproto">2.1 编写接口描述文件 helloworld.proto</h3> |
| <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:#2aa198">&#34;proto3&#34;</span>; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">option</span> go_package<span style="color:#719e07">=</span><span style="color:#2aa198">&#34;./;api&#34;</span>; <span style="color:#586e75">// 必须填写,这里的意义为:生成代码在./(当前目录) 使用&#39;api&#39;作为package名 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// The greeting service definition. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">service</span> Greeter { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">rpc</span> SayHello (HelloRequest) <span style="color:#719e07">returns</span> (User) {} |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">rpc</span> SayHelloStream (stream HelloRequest) <span style="color:#719e07">returns</span> (stream 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:#586e75">// The request message |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">message</span> <span style="color:#268bd2">HelloRequest</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#dc322f">string</span> name <span style="color:#719e07">=</span> <span style="color:#2aa198">1</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:#586e75">// The response message |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">message</span> <span style="color:#268bd2">User</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#dc322f">string</span> name <span style="color:#719e07">=</span> <span style="color:#2aa198">1</span>; |
| </span></span><span style="display:flex;"><span> <span style="color:#dc322f">string</span> id <span style="color:#719e07">=</span> <span style="color:#2aa198">2</span>; |
| </span></span><span style="display:flex;"><span> <span style="color:#dc322f">int32</span> age <span style="color:#719e07">=</span> <span style="color:#2aa198">3</span>; |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="22-使用安装好的编译工具编译接">2.2 使用安装好的编译工具编译接</h3> |
| <p>参数意义:<code>--go_out=.</code> 使用上述安装的 <code>protoc-gen-go</code> 插件,生成文件到当前目录,<code>--go-triple_out=.</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="color:#719e07">=</span>. --go-triple_out<span style="color:#719e07">=</span>. ./helloworld.proto |
| </span></span></code></pre></div><p>执行该指令后,会生成两个文件,分别是helloworld.pb (包含 proto 结构) 和 helloworld_triple.pb.go (包含 triple 协议接口)。</p> |
| <p>代码生成和使用方式与 grpc 类似。</p> |
| <h2 id="3-开启一次rpc调用">3. 开启一次RPC调用</h2> |
| <p>建立如下文件目录:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>quickstart |
| </span></span><span style="display:flex;"><span>├── api |
| </span></span><span style="display:flex;"><span>│ ├── helloworld.pb.go |
| </span></span><span style="display:flex;"><span>│ ├── helloworld.proto |
| </span></span><span style="display:flex;"><span>│ └── helloworld_triple.pb.go |
| </span></span><span style="display:flex;"><span>├── client |
| </span></span><span style="display:flex;"><span>│ └── client.go |
| </span></span><span style="display:flex;"><span>└── server |
| </span></span><span style="display:flex;"><span> └── server.go |
| </span></span></code></pre></div><p>client.go文件:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#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">&#34;context&#34;</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">import</span> ( |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/common/logger&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/config&#34;</span> |
| </span></span><span style="display:flex;"><span> _ <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/imports&#34;</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">import</span> ( |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo3-demo/api&#34;</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">var</span> greeterProvider = <span style="color:#719e07">&amp;</span>api.GreeterClientImpl{} |
| </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">init</span>() { |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// validate consumer greeterProvider ptr |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> config.<span style="color:#268bd2">SetConsumerService</span>(greeterProvider) |
| </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> <span style="color:#586e75">// init rootConfig with config api |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(config.<span style="color:#268bd2">NewConsumerConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddReference</span>(<span style="color:#2aa198">&#34;GreeterClientImpl&#34;</span>, config.<span style="color:#268bd2">NewReferenceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>)). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// start dubbo-go framework with configuration |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">Load</span>(config.<span style="color:#268bd2">WithRootConfig</span>(rc)); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// run rpc invocation |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">testSayHello</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">testSayHello</span>() { |
| </span></span><span style="display:flex;"><span> ctx <span style="color:#719e07">:=</span> context.<span style="color:#268bd2">Background</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> req <span style="color:#719e07">:=</span> api.HelloRequest{ |
| </span></span><span style="display:flex;"><span> Name: <span style="color:#2aa198">&#34;laurence&#34;</span>, |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> user, err <span style="color:#719e07">:=</span> greeterProvider.<span style="color:#268bd2">SayHello</span>(ctx, <span style="color:#719e07">&amp;</span>req) |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;Receive user = %+v\n&#34;</span>, user) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>server.go文件:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#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">&#34;context&#34;</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">import</span> ( |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/common/logger&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/config&#34;</span> |
| </span></span><span style="display:flex;"><span> _ <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/imports&#34;</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">import</span> ( |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;dubbo3-demo/api&#34;</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> config.<span style="color:#268bd2">SetProviderService</span>(<span style="color:#719e07">&amp;</span>GreeterProvider{}) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProvider</span>(config.<span style="color:#268bd2">NewProviderConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddService</span>(<span style="color:#2aa198">&#34;GreeterProvider&#34;</span>, config.<span style="color:#268bd2">NewServiceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddProtocol</span>(<span style="color:#2aa198">&#34;tripleProtocolKey&#34;</span>, config.<span style="color:#268bd2">NewProtocolConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetName</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;registryKey&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>)). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// start dubbo-go framework with configuration |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">Load</span>(config.<span style="color:#268bd2">WithRootConfig</span>(rc)); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">select</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> GreeterProvider <span style="color:#268bd2">struct</span> { |
| </span></span><span style="display:flex;"><span> api.UnimplementedGreeterServer |
| </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> (s <span style="color:#719e07">*</span>GreeterProvider) <span style="color:#268bd2">SayHelloStream</span>(svr api.Greeter_SayHelloStreamServer) <span style="color:#dc322f">error</span> { |
| </span></span><span style="display:flex;"><span> c, err <span style="color:#719e07">:=</span> svr.<span style="color:#268bd2">Recv</span>() |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> err |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;Dubbo-go GreeterProvider recv 1 user, name = %s\n&#34;</span>, c.Name) |
| </span></span><span style="display:flex;"><span> c2, err <span style="color:#719e07">:=</span> svr.<span style="color:#268bd2">Recv</span>() |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> err |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;Dubbo-go GreeterProvider recv 2 user, name = %s\n&#34;</span>, c2.Name) |
| </span></span><span style="display:flex;"><span> c3, err <span style="color:#719e07">:=</span> svr.<span style="color:#268bd2">Recv</span>() |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> err |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;Dubbo-go GreeterProvider recv 3 user, name = %s\n&#34;</span>, c3.Name) |
| </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> svr.<span style="color:#268bd2">Send</span>(<span style="color:#719e07">&amp;</span>api.User{ |
| </span></span><span style="display:flex;"><span> Name: <span style="color:#2aa198">&#34;hello &#34;</span> <span style="color:#719e07">+</span> c.Name, |
| </span></span><span style="display:flex;"><span> Age: <span style="color:#2aa198">18</span>, |
| </span></span><span style="display:flex;"><span> Id: <span style="color:#2aa198">&#34;123456789&#34;</span>, |
| </span></span><span style="display:flex;"><span> }); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> err |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> svr.<span style="color:#268bd2">Send</span>(<span style="color:#719e07">&amp;</span>api.User{ |
| </span></span><span style="display:flex;"><span> Name: <span style="color:#2aa198">&#34;hello &#34;</span> <span style="color:#719e07">+</span> c2.Name, |
| </span></span><span style="display:flex;"><span> Age: <span style="color:#2aa198">19</span>, |
| </span></span><span style="display:flex;"><span> Id: <span style="color:#2aa198">&#34;123456789&#34;</span>, |
| </span></span><span style="display:flex;"><span> }); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> err |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#cb4b16">nil</span> |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">func</span> (s <span style="color:#719e07">*</span>GreeterProvider) <span style="color:#268bd2">SayHello</span>(ctx context.Context, in <span style="color:#719e07">*</span>api.HelloRequest) (<span style="color:#719e07">*</span>api.User, <span style="color:#dc322f">error</span>) { |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Infof</span>(<span style="color:#2aa198">&#34;Dubbo3 GreeterProvider get user name = %s\n&#34;</span>, in.Name) |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#719e07">&amp;</span>api.User{Name: <span style="color:#2aa198">&#34;Hello &#34;</span> <span style="color:#719e07">+</span> in.Name, Id: <span style="color:#2aa198">&#34;12345&#34;</span>, Age: <span style="color:#2aa198">21</span>}, <span style="color:#cb4b16">nil</span> |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>quickstart 目录下,执行 <code>go mod init dubbo3-demo</code></p> |
| <p>如果弹出 go mod detected 弹窗,需要勾选 Enable Go modules integration ,设置GOPROXY,保证 Goland 可以正确拉取到依赖,方便开发。</p> |
| <p>命令行执行 <code>export GOPROXY=&quot;https://goproxy.cn&quot; </code>设置PROXY</p> |
| <p>执行<code>go mod tidy</code></p> |
| <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>module dubbo3<span style="color:#719e07">-</span>demo |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">go</span> <span style="color:#2aa198">1.17</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">require</span> ( |
| </span></span><span style="display:flex;"><span> dubbo.apache.org<span style="color:#719e07">/</span>dubbo<span style="color:#719e07">-</span><span style="color:#719e07">go</span><span style="color:#719e07">/</span>v3 v3<span style="color:#2aa198">.0.0</span><span style="color:#719e07">-</span>rc4<span style="color:#719e07">-</span><span style="color:#2aa198">1</span> |
| </span></span><span style="display:flex;"><span> github.com<span style="color:#719e07">/</span>dubbogo<span style="color:#719e07">/</span>grpc<span style="color:#719e07">-</span><span style="color:#719e07">go</span> v1<span style="color:#2aa198">.42.5</span><span style="color:#719e07">-</span>triple |
| </span></span><span style="display:flex;"><span> github.com<span style="color:#719e07">/</span>dubbogo<span style="color:#719e07">/</span>triple v1<span style="color:#2aa198">.1.3</span> |
| </span></span><span style="display:flex;"><span> github.com<span style="color:#719e07">/</span>golang<span style="color:#719e07">/</span>protobuf v1<span style="color:#2aa198">.5.2</span> |
| </span></span><span style="display:flex;"><span> google.golang.org<span style="color:#719e07">/</span>protobuf v1<span style="color:#2aa198">.27.1</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">require</span> ( |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">...</span> |
| </span></span><span style="display:flex;"><span>) |
| </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>quickstart |
| </span></span><span style="display:flex;"><span>├── api |
| </span></span><span style="display:flex;"><span>│ ├── helloworld.pb.go |
| </span></span><span style="display:flex;"><span>│ ├── helloworld.proto |
| </span></span><span style="display:flex;"><span>│ └── helloworld_triple.pb.go |
| </span></span><span style="display:flex;"><span>├── client |
| </span></span><span style="display:flex;"><span>│ └── client.go |
| </span></span><span style="display:flex;"><span>├── go.mod |
| </span></span><span style="display:flex;"><span>├── go.sum |
| </span></span><span style="display:flex;"><span>└── server |
| </span></span><span style="display:flex;"><span> └── server.go |
| </span></span></code></pre></div><p>先后启动服务端和客户端(在 server 和 client 文件夹下分别执行 <code>go run .</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> Receive <span style="color:#268bd2">user</span> <span style="color:#719e07">=</span> <span style="color:#719e07">{</span>Name:Hello laurence Id:12345 Age:21 ...<span style="color:#719e07">}</span> |
| </span></span></code></pre></div><p>获得调用结果成功</p> |
| <h2 id="4-更多">4. 更多</h2> |
| <p>细心的读者可以发现,以上例子编写的的服务端可以接受来自客户端的普通RPC、流式RPC调用请求。目前只编写了普通调用的Client,读者可以根据samples库中的例子来尝试编写流式客户端发起调用。</p></description></item></channel></rss> |