| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – 异构体系互通</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/interflow/</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/overview/mannual/golang-sdk/tutorial/develop/interflow/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview: 与 Java 应用跨语言互通</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/interflow/call_java/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/interflow/call_java/</guid><description> |
| <h2 id="准备工作">准备工作</h2> |
| <h3 id="环境">环境</h3> |
| <p>JDK 8,Golang &gt;= 1.15,Dubbo 3.0.2,zookeeper 启动,</p> |
| <h3 id="go--java-互通前提">Go- Java 互通前提</h3> |
| <ul> |
| <li> |
| <p>Go/Java 定义的传输结构一致</p> |
| <ul> |
| <li>PB 序列化</li> |
| </ul> |
| <p>proto for 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-protobuf" data-lang="protobuf"><span style="display:flex;"><span><span style="color:#586e75">// The response message containing the greetings |
| </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><p>proto for Java</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-protobuf" data-lang="protobuf"><span style="display:flex;"><span><span style="color:#586e75">// The response message containing the greetings |
| </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><ul> |
| <li>Hessian 序列化</li> |
| </ul> |
| <p>POJO for Go,需参考 <a href="https://www.yuque.com/docs/share/c698bd6e-e4d6-47db-bc1c-c757cc9b4f3e?">Dubbogo Hessian 序列化支持文档</a></p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><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>} |
| </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></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> hessian.<span style="color:#268bd2">RegisterPOJO</span>(<span style="color:#719e07">&amp;</span>User{}) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>POJO for Java</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.dubbo |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">User</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String id<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String name<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">int</span> age<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div></li> |
| <li> |
| <p>Java 需要互通的方法签名与 Go 一致</p> |
| <p>例如:</p> |
| <p>Java Interface</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">interface</span> <span style="color:#268bd2">IGreeter</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">/** |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> * &lt;pre&gt; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> * Sends a greeting |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> * &lt;/pre&gt; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> */</span> |
| </span></span><span style="display:flex;"><span> User <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span>HelloRequest request<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><p>Go client (由protoc-gen-go-triple 根据 proto 文件自动生成)</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">type</span> GreeterClientImpl <span style="color:#268bd2">struct</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Sends a greeting |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> SayHello <span style="color:#268bd2">func</span>(ctx context.Context, in <span style="color:#719e07">*</span>HelloRequest) (<span style="color:#719e07">*</span>User, <span style="color:#dc322f">error</span>) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>Go 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">type</span> GreeterProvider <span style="color:#268bd2">struct</span> { |
| </span></span><span style="display:flex;"><span> api.GreeterProviderBase |
| </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>Go 方法需要遵守 <a href="https://www.yuque.com/docs/share/eff9c51f-a7f4-47d6-87ff-11a2152bdffe?">Dubbogo 3.0 用户服务接口定义规范</a></p> |
| </li> |
| <li> |
| <p>Java 的三元组与Go service/reference 配置的 interface 一致</p> |
| <p>三元组,即为接口级别配置的:interface, group, version。<strong>其中需要注意,group 和 version 的概念为 dubbo 接口的 group 和vesion,在启动 dubbo-java 服务时配置于 spring cloud 的 properties 文件中,并非pom.xml 中 mvn 依赖的version。</strong> group 和version 默认为空,在 dubbo-go 框架中,可以在service/reference 的对应位置指定 group 和 version。</p> |
| <p>例如:</p> |
| <p>Java 的接口全名:com.apache.dubbo.sample.basic.IGreeter,接口 version 为v1.0.1, group 为</p> |
| <p>Go-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-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">references</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">GreeterClientImpl</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: tri |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter <span style="color:#586e75"># must be compatible with grpc or dubbo-java</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">group</span>: dubbogo <span style="color:#586e75"># 需要与服务端对应 默认为空</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: v1.0.1 <span style="color:#586e75"># 需要与服务端对应 默认为空</span> |
| </span></span></code></pre></div><p>Go-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-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#268bd2">services</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">GreeterProvider</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol-ids</span>: tripleProtocol |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter <span style="color:#586e75"># must be compatible with grpc or dubbo-java</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">group</span>: dubbogo <span style="color:#586e75"># 需要与服务端对应 默认为空</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: v1.0.1 <span style="color:#586e75"># 需要与服务端对应 默认为空</span> |
| </span></span></code></pre></div></li> |
| </ul> |
| <h2 id="1-基于-triple-协议互通-pb序列化">1. 基于 Triple 协议互通 (PB序列化)</h2> |
| <p>参考 <a href="https://github.com/apache/dubbo-go-samples/tree/master/helloworld">dubbo-go-samples/helloworld</a></p> |
| <h3 id="11-go-client---java-server">1.1 Go-Client -&gt; Java-Server</h3> |
| <h4 id="java-server-启动">Java-Server 启动</h4> |
| <ol> |
| <li>定义 Java 的 PB 文件,可参考 <a href="https://dubbo.apache.org/zh-cn/docs/quick-start/">Dubbo 快速开始</a></li> |
| </ol> |
| <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> java_package <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;org.apache.dubbo.sample.hello&#34;</span>; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">package</span> helloworld; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// The request message containing the user&#39;s name. |
| </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 containing the greetings |
| </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><p>该接口描述文件定义了将会生成的 Java 类 org.apache.dubbo.sample.hello.Helloworld,以及类中包含的传输结构 HelloRequest 和 User 类。</p> |
| <ol start="2"> |
| <li> |
| <p>定义服务接口:</p> |
| <p>com.apache.dubbo.sample.basic.IGreeter</p> |
| </li> |
| </ol> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.apache.dubbo.sample.basic<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// 引入根据 PB 生成的类 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">import</span> org.apache.dubbo.sample.hello.Helloworld.User<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.sample.hello.Helloworld.HelloRequest<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">interface</span> <span style="color:#268bd2">IGreeter</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">/** |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> * &lt;pre&gt; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> * Sends a greeting |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> * &lt;/pre&gt; |
| </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> User <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span>HelloRequest request<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><ol start="3"> |
| <li> |
| <p>实现服务接口:</p> |
| <p>IGreeter1Impl.java</p> |
| </li> |
| </ol> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.apache.dubbo.sample.basic<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.sample.hello.Helloworld.User<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.sample.hello.Helloworld.HelloRequest<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">IGreeter1Impl</span> <span style="color:#268bd2">implements</span> IGreeter <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> User <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span>HelloRequest request<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>out<span style="color:#719e07">.</span>println<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;receiv: &#34;</span> <span style="color:#719e07">+</span> request<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> User usr <span style="color:#719e07">=</span> User<span style="color:#719e07">.</span>newBuilder<span style="color:#719e07">()</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">.</span>setName<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;hello &#34;</span> <span style="color:#719e07">+</span> request<span style="color:#719e07">.</span>getName<span style="color:#719e07">())</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">.</span>setAge<span style="color:#719e07">(</span>18<span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">.</span>setId<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;12345&#34;</span><span style="color:#719e07">).</span>build<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> usr<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><ol start="4"> |
| <li> |
| <p>使用 Dubbo3 框架启动服务</p> |
| <p>ApiProvider.java</p> |
| </li> |
| </ol> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.apache.dubbo.sample.basic<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.common.constants.CommonConstants<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.config.ApplicationConfig<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.config.ProtocolConfig<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.config.RegistryConfig<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.config.ServiceConfig<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.concurrent.CountDownLatch<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">ApiProvider</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">main</span><span style="color:#719e07">(</span>String<span style="color:#719e07">[]</span> args<span style="color:#719e07">)</span> <span style="color:#268bd2">throws</span> InterruptedException <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> ServiceConfig<span style="color:#719e07">&lt;</span>IGreeter<span style="color:#719e07">&gt;</span> service <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> ServiceConfig<span style="color:#719e07">&lt;&gt;();</span> |
| </span></span><span style="display:flex;"><span> service<span style="color:#719e07">.</span>setInterface<span style="color:#719e07">(</span>IGreeter<span style="color:#719e07">.</span>class<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> service<span style="color:#719e07">.</span>setRef<span style="color:#719e07">(</span><span style="color:#719e07">new</span> IGreeter1Impl<span style="color:#719e07">());</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// 使用 Triple 协议 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> service<span style="color:#719e07">.</span>setProtocol<span style="color:#719e07">(</span><span style="color:#719e07">new</span> ProtocolConfig<span style="color:#719e07">(</span>CommonConstants<span style="color:#719e07">.</span>TRIPLE<span style="color:#719e07">,</span> 50051<span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> service<span style="color:#719e07">.</span>setApplication<span style="color:#719e07">(</span><span style="color:#719e07">new</span> ApplicationConfig<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;demo-provider&#34;</span><span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// 使用 ZK 作为注册中心 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> service<span style="color:#719e07">.</span>setRegistry<span style="color:#719e07">(</span><span style="color:#719e07">new</span> RegistryConfig<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;zookeeper://127.0.0.1:2181&#34;</span><span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> service<span style="color:#719e07">.</span>export<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>out<span style="color:#719e07">.</span>println<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;dubbo service started&#34;</span><span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">new</span> CountDownLatch<span style="color:#719e07">(</span>1<span style="color:#719e07">).</span>await<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><p>启动服务,可看到输出如下日志,代表 Java Triple 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-fallback" data-lang="fallback"><span style="display:flex;"><span>main INFO bootstrap.DubboBootstrap: [DUBBO] DubboBootstrap has started., dubbo version: 3.0.2, current host: 192.168.0.108 |
| </span></span><span style="display:flex;"><span>dubbo service started |
| </span></span></code></pre></div><h4 id="go-client-启动">Go-Client 启动</h4> |
| <p>对于已经启动的Dubbo服务,如需要开发与其对应的Go-client,需要进行如下步骤:</p> |
| <ol> |
| <li> |
| <p>编写与 Java 适配的 proto文件</p> |
| <p>samples_api.proto</p> |
| </li> |
| </ol> |
| <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 style="color:#719e07">package</span> api; <span style="color:#586e75">// pacakge 名随意指定 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// necessary |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">option</span> go_package <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;./;api&#34;</span>; |
| </span></span><span style="display:flex;"><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:#586e75">// Sends a greeting |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#719e07">rpc</span> SayHello (HelloRequest) <span style="color:#719e07">returns</span> (User) {} |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// The request message containing the user&#39;s name. |
| </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 containing the greetings |
| </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><ol start="2"> |
| <li>使用 protoc-gen-triple 生成接口文件</li> |
| </ol> |
| <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 -I . samples_api.proto --triple_out<span style="color:#719e07">=</span><span style="color:#268bd2">plugins</span><span style="color:#719e07">=</span>triple:. |
| </span></span></code></pre></div><ol start="3"> |
| <li>撰写配置文件: dubbogo.yml</li> |
| </ol> |
| <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></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">GreeterClientImpl</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: tri |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter <span style="color:#586e75"># must be compatible with grpc or dubbo-java</span> |
| </span></span></code></pre></div><ol start="4"> |
| <li>撰写 main.go 文件,发起调用</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#586e75">// 引入生成的接口结构 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">var</span> grpcGreeterImpl = <span style="color:#b58900">new</span>(api.GreeterClientImpl) |
| </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> config.<span style="color:#268bd2">SetConsumerService</span>(grpcGreeterImpl) |
| </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> time.<span style="color:#268bd2">Sleep</span>(<span style="color:#2aa198">3</span> <span style="color:#719e07">*</span> time.Second) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">Info</span>(<span style="color:#2aa198">&#34;start to test dubbo&#34;</span>) |
| </span></span><span style="display:flex;"><span> req <span style="color:#719e07">:=</span> <span style="color:#719e07">&amp;</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> reply, err <span style="color:#719e07">:=</span> grpcGreeterImpl.<span style="color:#268bd2">SayHello</span>(context.<span style="color:#268bd2">Background</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> logger.<span style="color:#268bd2">Error</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;client response result: %v\n&#34;</span>, reply) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><ol start="5"> |
| <li>可查看到调用成功的日志</li> |
| </ol> |
| <ul> |
| <li>go-client</li> |
| </ul> |
| <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>cmd/client.go:53 client response result: name:&#34;hello laurence&#34; id:&#34;12345&#34; age:18 |
| </span></span></code></pre></div><ul> |
| <li>java-server</li> |
| </ul> |
| <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>receiv: name: &#34;laurence&#34; |
| </span></span></code></pre></div><h3 id="12-java-client---go-server">1.2 Java-Client -&gt; Go-Server</h3> |
| <h4 id="go-server-启动">Go-Server 启动</h4> |
| <ol> |
| <li>定义配置文件</li> |
| </ol> |
| <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></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">triple</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: tri |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20000</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">GreeterProvider</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter <span style="color:#586e75"># must be compatible with grpc or dubbo-java</span> |
| </span></span></code></pre></div><ol start="2"> |
| <li>引入传输结构,定义服务</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">type</span> GreeterProvider <span style="color:#268bd2">struct</span> { |
| </span></span><span style="display:flex;"><span> api.GreeterProviderBase |
| </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><ol start="3"> |
| <li>启动服务</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#586e75">// 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> config.<span style="color:#268bd2">SetProviderService</span>(<span style="color:#719e07">&amp;</span>GreeterProvider{}) |
| </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><h4 id="java-client-启动">Java-Client 启动</h4> |
| <ol> |
| <li> |
| <p>proto 文件编写和接口生成参考上述 java-server 介绍</p> |
| </li> |
| <li> |
| <p>启动Consumer</p> |
| <p>ApiCnosumer.java</p> |
| </li> |
| </ol> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">ApiConsumer</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">main</span><span style="color:#719e07">(</span>String<span style="color:#719e07">[]</span> args<span style="color:#719e07">)</span> <span style="color:#268bd2">throws</span> InterruptedException<span style="color:#719e07">,</span> IOException <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> ReferenceConfig<span style="color:#719e07">&lt;</span>IGreeter<span style="color:#719e07">&gt;</span> ref <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> ReferenceConfig<span style="color:#719e07">&lt;&gt;();</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setInterface<span style="color:#719e07">(</span>IGreeter<span style="color:#719e07">.</span>class<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setCheck<span style="color:#719e07">(</span><span style="color:#cb4b16">false</span><span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setProtocol<span style="color:#719e07">(</span>CommonConstants<span style="color:#719e07">.</span>TRIPLE<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setLazy<span style="color:#719e07">(</span><span style="color:#cb4b16">true</span><span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setTimeout<span style="color:#719e07">(</span>100000<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setApplication<span style="color:#719e07">(</span><span style="color:#719e07">new</span> ApplicationConfig<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;demo-consumer&#34;</span><span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> ref<span style="color:#719e07">.</span>setRegistry<span style="color:#719e07">(</span><span style="color:#719e07">new</span> RegistryConfig<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;zookeeper://127.0.0.1:2181&#34;</span><span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">final</span> IGreeter iGreeter <span style="color:#719e07">=</span> ref<span style="color:#719e07">.</span>get<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>out<span style="color:#719e07">.</span>println<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;dubbo ref started&#34;</span><span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> Helloworld<span style="color:#719e07">.</span>HelloRequest req <span style="color:#719e07">=</span> Helloworld<span style="color:#719e07">.</span>HelloRequest<span style="color:#719e07">.</span>newBuilder<span style="color:#719e07">().</span>setName<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;laurence&#34;</span><span style="color:#719e07">).</span>build<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">try</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">final</span> Helloworld<span style="color:#719e07">.</span>User reply <span style="color:#719e07">=</span> iGreeter<span style="color:#719e07">.</span>sayHello<span style="color:#719e07">(</span>req<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> TimeUnit<span style="color:#719e07">.</span>SECONDS<span style="color:#719e07">.</span>sleep<span style="color:#719e07">(</span>1<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>out<span style="color:#719e07">.</span>println<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;Reply:&#34;</span> <span style="color:#719e07">+</span> reply<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> <span style="color:#719e07">catch</span> <span style="color:#719e07">(</span>Throwable t<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> t<span style="color:#719e07">.</span>printStackTrace<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>in<span style="color:#719e07">.</span>read<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><h2 id="2-基于-dubbo-协议互通-hessian2序列化">2. 基于 Dubbo 协议互通 (Hessian2序列化)</h2> |
| <p>参考 <a href="https://github.com/apache/dubbo-go-samples/tree/master/rpc/dubbo">dubbo-go-samples/rpc/dubbo</a></p> |
| <h3 id="21-go-client---java-server">2.1 Go-Client -&gt; Java-Server</h3> |
| <h4 id="java-server-启动-1">Java-Server 启动</h4> |
| <ol> |
| <li>定义 Java 接口、参数和返回值,可参考 <a href="https://dubbo.apache.org/zh-cn/docs/quick-start/">Dubbo 快速开始</a></li> |
| </ol> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.dubbo<span style="color:#719e07">;</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">public</span> <span style="color:#268bd2">interface</span> <span style="color:#268bd2">UserProvider</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> User <span style="color:#268bd2">getUser</span><span style="color:#719e07">(</span><span style="color:#dc322f">int</span> usercode<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.dubbo<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">User</span> <span style="color:#268bd2">implements</span> Serializable <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String id<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String name<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">int</span> age<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> Date time <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> Date<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">/* ... */</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><ol start="2"> |
| <li>实现服务接口:</li> |
| </ol> |
| <p>UserProviderImpl.java</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.dubbo<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">UserProviderImpl</span> <span style="color:#268bd2">implements</span> UserProvider <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> User <span style="color:#268bd2">getUser</span><span style="color:#719e07">(</span><span style="color:#dc322f">int</span> userCode<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#719e07">new</span> User<span style="color:#719e07">(</span>String<span style="color:#719e07">.</span>valueOf<span style="color:#719e07">(</span>userCode<span style="color:#719e07">),</span> <span style="color:#2aa198">&#34;userCode get&#34;</span><span style="color:#719e07">,</span> 48<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><ol start="3"> |
| <li>使用SpringBoot 启动</li> |
| </ol> |
| <p>Provider.java</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.dubbo<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// use when config by API |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#586e75">/* |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">import java.util.concurrent.CountDownLatch; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">import org.apache.dubbo.common.constants.CommonConstants; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">import org.apache.dubbo.config.ApplicationConfig; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">import org.apache.dubbo.config.ProtocolConfig; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">import org.apache.dubbo.config.RegistryConfig; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">import org.apache.dubbo.config.ServiceConfig; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">*/</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.context.support.ClassPathXmlApplicationContext<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">Provider</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// main function, config from spring boot |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">public</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">main</span><span style="color:#719e07">(</span>String<span style="color:#719e07">[]</span> args<span style="color:#719e07">)</span> <span style="color:#268bd2">throws</span> Exception <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> ClassPathXmlApplicationContext context <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> ClassPathXmlApplicationContext<span style="color:#719e07">(</span><span style="color:#719e07">new</span> String<span style="color:#719e07">[]{</span><span style="color:#2aa198">&#34;META-INF/spring/dubbo.provider.xml&#34;</span><span style="color:#719e07">});</span> |
| </span></span><span style="display:flex;"><span> context<span style="color:#719e07">.</span>start<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>in<span style="color:#719e07">.</span>read<span style="color:#719e07">();</span> <span style="color:#586e75">// press any key to exit |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#719e07">}</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">// config by API |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// public static void startComplexService() throws InterruptedException { |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// ServiceConfig&lt;ComplexProvider&gt; service = new ServiceConfig&lt;&gt;(); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// service.setInterface(ComplexProvider.class); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// service.setRef(new ComplexProviderImpl()); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// service.setProtocol(new ProtocolConfig(CommonConstants.DUBBO_PROTOCOL, 20001)); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// service.setApplication(new ApplicationConfig(&#34;demo-provider&#34;)); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// service.setRegistry(new RegistryConfig(&#34;zookeeper://127.0.0.1:2181&#34;)); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// service.export(); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// System.out.println(&#34;dubbo service started&#34;); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">// new CountDownLatch(1).await(); |
| </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">}</span> |
| </span></span></code></pre></div><ol start="4"> |
| <li> |
| <p>通过Spring 配置 Dubbo 参数</p> |
| <p>Resources/META-INF.spring/dubbo.provider.xml</p> |
| </li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#719e07">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">&lt;!-- |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> you may not use this file except in compliance with the License. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> You may obtain a copy of the License at |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> http://www.apache.org/licenses/LICENSE-2.0 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> Unless required by applicable law or agreed to in writing, software |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> distributed under the License is distributed on an &#34;AS IS&#34; BASIS, |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> See the License for the specific language governing permissions and |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> limitations under the License. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">--&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;beans</span> xmlns=<span style="color:#2aa198">&#34;http://www.springframework.org/schema/beans&#34;</span> |
| </span></span><span style="display:flex;"><span> xmlns:xsi=<span style="color:#2aa198">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span> |
| </span></span><span style="display:flex;"><span> xmlns:dubbo=<span style="color:#2aa198">&#34;http://code.alibabatech.com/schema/dubbo&#34;</span> |
| </span></span><span style="display:flex;"><span> xsi:schemaLocation=<span style="color:#2aa198">&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
| </span></span></span><span style="display:flex;"><span><span style="color:#2aa198"> http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 应用名 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:application</span> name=<span style="color:#2aa198">&#34;user-info-server&#34;</span><span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 连接到哪个本地注册中心 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:registry</span> id=<span style="color:#2aa198">&#34;dubbogo&#34;</span> address=<span style="color:#2aa198">&#34;zookeeper://127.0.0.1:2181&#34;</span> <span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 用dubbo协议在20880端口暴露服务 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:protocol</span> id=<span style="color:#2aa198">&#34;dubbo&#34;</span> name=<span style="color:#2aa198">&#34;dubbo&#34;</span> host=<span style="color:#2aa198">&#34;127.0.0.1&#34;</span> port=<span style="color:#2aa198">&#34;20010&#34;</span> <span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 声明需要暴露的服务接口 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:service</span> id=<span style="color:#2aa198">&#34;aaa&#34;</span> registry=<span style="color:#2aa198">&#34;dubbogo&#34;</span> timeout=<span style="color:#2aa198">&#34;3000&#34;</span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span> ref=<span style="color:#2aa198">&#34;demoService&#34;</span><span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:service</span> id=<span style="color:#2aa198">&#34;bbb&#34;</span> registry=<span style="color:#2aa198">&#34;dubbogo&#34;</span> timeout=<span style="color:#2aa198">&#34;3000&#34;</span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span> ref=<span style="color:#2aa198">&#34;otherService&#34;</span> version=<span style="color:#2aa198">&#34;2.0&#34;</span><span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:service</span> id=<span style="color:#2aa198">&#34;ccc&#34;</span> registry=<span style="color:#2aa198">&#34;dubbogo&#34;</span> timeout=<span style="color:#2aa198">&#34;3000&#34;</span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span> ref=<span style="color:#2aa198">&#34;otherService&#34;</span> group=<span style="color:#2aa198">&#34;as&#34;</span> version=<span style="color:#2aa198">&#34;2.0&#34;</span><span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;bean</span> id=<span style="color:#2aa198">&#34;demoService&#34;</span> class=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProviderImpl&#34;</span> <span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;bean</span> id=<span style="color:#2aa198">&#34;otherService&#34;</span> class=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProviderAnotherImpl&#34;</span><span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;/beans&gt;</span> |
| </span></span></code></pre></div><p>启动Provider类,可看到输出如下日志,代表 Dubbo 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-fallback" data-lang="fallback"><span style="display:flex;"><span>[DUBBO] DubboBootstrap is ready., dubbo version: 2.7.7, current host: 127.0.0.1 |
| </span></span><span style="display:flex;"><span>[DUBBO] DubboBootstrap has started., dubbo version: 2.7.7, current host: 127.0.0.1 |
| </span></span></code></pre></div><h4 id="go-client-启动-1">Go-Client 启动</h4> |
| <p>对于已经启动的Dubbo服务,如需要开发与其对应的Go-client,需要进行如下步骤:</p> |
| <ol> |
| <li>编写与 Java 适配的 POJO 类 User</li> |
| </ol> |
| <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">import</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></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// 字段需要与 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></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 侧 User 类名对应 |
| </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>pkg.User{}) <span style="color:#586e75">// 注册 POJO |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>} |
| </span></span></code></pre></div><ol start="2"> |
| <li> |
| <p>编写与 Java 侧一致的客户端存根类,其接口方法需要与Java侧对应</p> |
| <p>规定第一个参数必须为 context.Context,最后一个返回值必须为 error</p> |
| </li> |
| </ol> |
| <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">import</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></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> userProvider = <span style="color:#719e07">&amp;</span>pkg.UserProvider{} |
| </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">// 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:#2aa198">`dubbo:&#34;getUser&#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">init</span>(){ |
| </span></span><span style="display:flex;"><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>(userProvider) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><ol start="3"> |
| <li>撰写配置文件: dubbogo.yml</li> |
| </ol> |
| <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"># 定义注册中心ID</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">timeout</span>: 3s |
| </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"># 接口需要与Java侧对应</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">logger</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zap-config</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">level</span>: info <span style="color:#586e75"># 日志级别</span> |
| </span></span></code></pre></div><p>或者使用Triple + Hessian2 序列化请求Server。本例子如果跟Java Server互通则不能用Triple。</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></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: zookeeper |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">timeout</span>: 3s |
| </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></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: tri <span style="color:#586e75"># triple 协议</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">serialization</span>: hessian2 <span style="color:#586e75"># 序列化方式 hessian2,triple 协议默认为 pb 序列化,不配置会报错</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: org.apache.dubbo.UserProvider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">logger</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zap-config</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">level</span>: info |
| </span></span></code></pre></div><ol start="4"> |
| <li>撰写 main.go 文件,发起调用</li> |
| </ol> |
| <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> config.<span style="color:#268bd2">Load</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> user, err <span style="color:#719e07">:=</span> userProvider.<span style="color:#268bd2">GetUser2</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><ol start="5"> |
| <li>可查看到调用成功的日志,符合预期</li> |
| </ol> |
| <ul> |
| <li>go-client</li> |
| </ul> |
| <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>response result: User<span style="color:#719e07">{</span>ID:1, Name:userCode get, Age:48, Time:2021-10-21 20:25:26.009 +0800 CST<span style="color:#719e07">}</span> |
| </span></span></code></pre></div><h3 id="22-java-client---go-server">2.2 Java-Client -&gt; Go-Server</h3> |
| <h4 id="go-server-启动-1">Go-Server 启动</h4> |
| <ol> |
| <li>定义配置文件</li> |
| </ol> |
| <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></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></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20000</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></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: org.apache.dubbo.UserProvider |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">logger</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zap-config</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">level</span>: info |
| </span></span></code></pre></div><ol start="2"> |
| <li>引入传输结构,定义服务以及方法名映射</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">type</span> 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:#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>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>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> <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"></span><span style="color:#268bd2">func</span> (s <span style="color:#719e07">*</span>UserProvider) <span style="color:#268bd2">MethodMapper</span>() <span style="color:#268bd2">map</span>[<span style="color:#dc322f">string</span>]<span style="color:#dc322f">string</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#268bd2">map</span>[<span style="color:#dc322f">string</span>]<span style="color:#dc322f">string</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;GetUser&#34;</span>: <span style="color:#2aa198">&#34;getUser&#34;</span>, |
| </span></span><span style="display:flex;"><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">init</span>(){ |
| </span></span><span style="display:flex;"><span> config.<span style="color:#268bd2">SetProviderService</span>(<span style="color:#719e07">&amp;</span>pkg.UserProvider{}) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><ol start="3"> |
| <li>启动服务</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#586e75">// 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><h4 id="java-client-启动-1">Java-Client 启动</h4> |
| <ol> |
| <li> |
| <p>Java 客户端 Spring 配置</p> |
| <p>resources/META-INF.spring/dubbo.consumer.xml</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-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#719e07">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">&lt;!-- |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> you may not use this file except in compliance with the License. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> You may obtain a copy of the License at |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> http://www.apache.org/licenses/LICENSE-2.0 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> Unless required by applicable law or agreed to in writing, software |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> distributed under the License is distributed on an &#34;AS IS&#34; BASIS, |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> See the License for the specific language governing permissions and |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"> limitations under the License. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75">--&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;beans</span> xmlns=<span style="color:#2aa198">&#34;http://www.springframework.org/schema/beans&#34;</span> |
| </span></span><span style="display:flex;"><span> xmlns:xsi=<span style="color:#2aa198">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span> |
| </span></span><span style="display:flex;"><span> xmlns:dubbo=<span style="color:#2aa198">&#34;http://code.alibabatech.com/schema/dubbo&#34;</span> |
| </span></span><span style="display:flex;"><span> xsi:schemaLocation=<span style="color:#2aa198">&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd |
| </span></span></span><span style="display:flex;"><span><span style="color:#2aa198"> http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&#34;</span><span style="color:#268bd2">&gt;</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">&lt;!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:application</span> name=<span style="color:#2aa198">&#34;user-info-client&#34;</span> <span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 连接到哪个本地注册中心 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:registry</span> id=<span style="color:#2aa198">&#34;dubbogo&#34;</span> address=<span style="color:#2aa198">&#34;zookeeper://127.0.0.1:2181&#34;</span> <span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- dubbo.registry.address from dubbo.properties --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- dubbo:registry address=&#34;${dubbo.registry.address}&#34; / --&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 用dubbo协议在20880端口暴露服务 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:protocol</span> id=<span style="color:#2aa198">&#34;dubbo&#34;</span> name=<span style="color:#2aa198">&#34;dubbo&#34;</span> <span style="color:#268bd2">/&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!-- 声明需要使用的服务接口 --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:reference</span> registry=<span style="color:#2aa198">&#34;dubbogo&#34;</span> check=<span style="color:#2aa198">&#34;false&#34;</span> id=<span style="color:#2aa198">&#34;userProvider&#34;</span> protocol=<span style="color:#2aa198">&#34;dubbo&#34;</span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">&lt;!--&lt;dubbo:parameter key=&#34;heartbeat&#34; value=&#34;10000&#34;/ --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/dubbo:reference&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:reference</span> registry=<span style="color:#2aa198">&#34;dubbogo&#34;</span> check=<span style="color:#2aa198">&#34;false&#34;</span> id=<span style="color:#2aa198">&#34;userProvider1&#34;</span> protocol=<span style="color:#2aa198">&#34;dubbo&#34;</span> version=<span style="color:#2aa198">&#34;2.0&#34;</span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/dubbo:reference&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dubbo:reference</span> registry=<span style="color:#2aa198">&#34;dubbogo&#34;</span> check=<span style="color:#2aa198">&#34;false&#34;</span> id=<span style="color:#2aa198">&#34;userProvider2&#34;</span> protocol=<span style="color:#2aa198">&#34;dubbo&#34;</span> version=<span style="color:#2aa198">&#34;2.0&#34;</span> group=<span style="color:#2aa198">&#34;as&#34;</span> interface=<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/dubbo:reference&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;/beans&gt;</span> |
| </span></span></code></pre></div></li> |
| <li> |
| <p>发起调用</p> |
| </li> |
| </ol> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">Consumer</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Define a private variable (Required in Spring) |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">private</span> <span style="color:#268bd2">static</span> UserProvider userProvider<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">main</span><span style="color:#719e07">(</span>String<span style="color:#719e07">[]</span> args<span style="color:#719e07">)</span> <span style="color:#268bd2">throws</span> Exception <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> ClassPathXmlApplicationContext context <span style="color:#719e07">=</span> <span style="color:#719e07">new</span> ClassPathXmlApplicationContext<span style="color:#719e07">(</span><span style="color:#719e07">new</span> String<span style="color:#719e07">[]{</span><span style="color:#2aa198">&#34;META-INF/spring/dubbo.consumer.xml&#34;</span><span style="color:#719e07">});</span> |
| </span></span><span style="display:flex;"><span> userProvider <span style="color:#719e07">=</span> <span style="color:#719e07">(</span>UserProvider<span style="color:#719e07">)</span>context<span style="color:#719e07">.</span>getBean<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;userProvider&#34;</span><span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> testGetUser<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</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">private</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">testGetUser</span><span style="color:#719e07">()</span> <span style="color:#268bd2">throws</span> Exception <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> User user <span style="color:#719e07">=</span> userProvider<span style="color:#719e07">.</span>getUser<span style="color:#719e07">(</span>1<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span> System<span style="color:#719e07">.</span>out<span style="color:#719e07">.</span>println<span style="color:#719e07">(</span>user<span style="color:#719e07">.</span>getId<span style="color:#719e07">());</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div></description></item><item><title>Overview: 与 gRPC 应用互通</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/interflow/call_grpc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/interflow/call_grpc/</guid><description> |
| <h2 id="1-准备工作">1. 准备工作</h2> |
| <ul> |
| <li>dubbo-go cli 工具和依赖工具已安装</li> |
| <li>创建一个新的 demo 应用</li> |
| </ul> |
| <h2 id="2-dubbo-go-应用与-grpc-应用互通">2. Dubbo-go 应用与 gRPC 应用互通</h2> |
| <p>参考 <a href="https://github.com/apache/dubbo-go-samples/tree/master/rpc/triple/pb/dubbogo-grpc">dubbo-go-samples/rpc/triple/pb/dubbogo-grpc</a></p></description></item></channel></rss> |