| <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/features/</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/features/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview: 使用配置 API 启动应用</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/config_api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/config_api/</guid><description> |
| <h2 id="1-准备工作">1. 准备工作</h2> |
| <ul> |
| <li>dubbo-go cli 工具和依赖工具已安装</li> |
| <li>创建一个新的 demo 应用</li> |
| </ul> |
| <h2 id="2-使用配置-api-启动应用">2. 使用配置 API 启动应用</h2> |
| <p>用户无需使用配置文件,可直接在代码中以 API 的调用的形式写入配置</p> |
| <h3 id="21-修改服务端代码">2.1 修改服务端代码:</h3> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">func</span> <span style="color:#268bd2">main</span>() { |
| </span></span><span style="display:flex;"><span> config.<span style="color:#268bd2">SetProviderService</span>(<span style="color:#719e07">&amp;</span>GreeterProvider{}) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> protocolConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewProtocolConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetPort</span>(<span style="color:#2aa198">&#34;20000&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetName</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> serviceConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewServiceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;&#34;</span>). <span style="color:#586e75">// read interface from pb |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> providerConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewProviderConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddService</span>(<span style="color:#2aa198">&#34;GreeterProvider&#34;</span>, serviceConfig). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> rootConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddProtocol</span>(<span style="color:#2aa198">&#34;triple-protocol-id&#34;</span>, protocolConfig). <span style="color:#586e75">// add protocol, key is custom |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">SetProvider</span>(providerConfig).<span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">Load</span>(config.<span style="color:#268bd2">WithRootConfig</span>(rootConfig)); 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><p>配置 API 看上去写法较为复杂,但单个配置结构的构造过程都是一致的,参考 Java Builder 的设计,我们在配置 API 模块选用 <code>New().SetA().SetB().Build()</code>的方式来逐层构造单个配置结构。</p> |
| <p>完成后,可删除掉go-server/conf 文件夹。</p> |
| <h3 id="22-修改客户端代码">2.2 修改客户端代码:</h3> |
| <p>go-client/cmd/client.go</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">func</span> <span style="color:#268bd2">main</span>() { |
| </span></span><span style="display:flex;"><span> config.<span style="color:#268bd2">SetConsumerService</span>(grpcGreeterImpl) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> referenceConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewReferenceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetURL</span>(<span style="color:#2aa198">&#34;tri://localhost:20000&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;&#34;</span>). <span style="color:#586e75">// read interface name from pb |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> consumerConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewConsumerConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddReference</span>(<span style="color:#2aa198">&#34;GreeterClientImpl&#34;</span>, referenceConfig). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> rootConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(consumerConfig).<span style="color:#268bd2">Build</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>(config.<span style="color:#268bd2">WithRootConfig</span>(rootConfig)); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> logger.<span style="color:#268bd2">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><p>完成后,可删除掉go-client/conf 文件夹。</p> |
| <h3 id="23-验证-config-api">2.3 验证 Config API</h3> |
| <p>分别启动 server 和 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-fallback" data-lang="fallback"><span style="display:flex;"><span>INFO cmd/client.go:62 client response result: name:&#34;Hello laurence&#34; id:&#34;12345&#34; age:21 |
| </span></span></code></pre></div></description></item><item><title>Overview: 日志</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/custom-logger/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/custom-logger/</guid><description> |
| <p>参考samples <a href="https://github.com/apache/dubbo-go-samples/tree/master/logger">dubbo-go-samples/logger</a></p> |
| <h2 id="1-日志配置">1. 日志配置</h2> |
| <p>dubbogo 3.0 默认采用 zap 日志库,在配置文件中不添加 logger 配置,日志将会打印到控制默认级别为debug。您也可在配置文件中配置日志级别、, 可参照如下方式来配置zap-config和lumberjack-config,从而定制化日志输出。</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">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>: debug <span style="color:#586e75"># 日志级别</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">development</span>: <span style="color:#cb4b16">false</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">disableCaller</span>: <span style="color:#cb4b16">false</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">disableStacktrace</span>: <span style="color:#cb4b16">false</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">encoding</span>: <span style="color:#2aa198">&#34;console&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># zap encoder 配置</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">encoderConfig</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">messageKey</span>: <span style="color:#2aa198">&#34;message&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">levelKey</span>: <span style="color:#2aa198">&#34;level&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">timeKey</span>: <span style="color:#2aa198">&#34;time&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">nameKey</span>: <span style="color:#2aa198">&#34;logger&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">callerKey</span>: <span style="color:#2aa198">&#34;caller&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">stacktraceKey</span>: <span style="color:#2aa198">&#34;stacktrace&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">lineEnding</span>: <span style="color:#2aa198">&#34;&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">levelEncoder</span>: <span style="color:#2aa198">&#34;capitalColor&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">timeEncoder</span>: <span style="color:#2aa198">&#34;iso8601&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">durationEncoder</span>: <span style="color:#2aa198">&#34;seconds&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">callerEncoder</span>: <span style="color:#2aa198">&#34;short&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">nameEncoder</span>: <span style="color:#2aa198">&#34;&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">outputPaths</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#2aa198">&#34;stderr&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">errorOutputPaths</span>: |
| </span></span><span style="display:flex;"><span> - <span style="color:#2aa198">&#34;stderr&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">lumberjack-config</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># 写日志的文件名称</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">filename</span>: <span style="color:#2aa198">&#34;logs.log&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">maxSize</span>: <span style="color:#2aa198">1</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># 日志保留的最大天数(只保留最近多少天的日志)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">maxAge</span>: <span style="color:#2aa198">3</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># 只保留最近多少个日志文件,用于控制程序总日志的大小</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">maxBackups</span>: <span style="color:#2aa198">5</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># 是否使用本地时间,默认使用 UTC 时间</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">localTime</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># 是否压缩日志文件,压缩方法 gzip</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">compress</span>: <span style="color:#cb4b16">false</span> |
| </span></span></code></pre></div><h2 id="2-日志api-和-自定义日志">2. 日志API 和 自定义日志</h2> |
| <p>日志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-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">type</span> Logger <span style="color:#268bd2">interface</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Info</span>(args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Warn</span>(args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Error</span>(args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Debug</span>(args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Fatal</span>(args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Infof</span>(fmt <span style="color:#dc322f">string</span>, args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Warnf</span>(fmt <span style="color:#dc322f">string</span>, args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Errorf</span>(fmt <span style="color:#dc322f">string</span>, args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Debugf</span>(fmt <span style="color:#dc322f">string</span>, args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Fatalf</span>(fmt <span style="color:#dc322f">string</span>, args <span style="color:#719e07">...</span><span style="color:#268bd2">interface</span>{}) |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>日志API</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#719e07">import</span> <span style="color:#2aa198">&#34;dubbo.apache.org/dubbo-go/v3/common/logger&#34;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>logger.<span style="color:#268bd2">SetLoggerLevel</span>(warn) <span style="color:#586e75">// 在 main 函数中设置日志级别 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>logger.<span style="color:#268bd2">SetLogger</span>(myLogger) <span style="color:#586e75">// 在 main 函数中设置自定义logger |
| </span></span></span></code></pre></div><ul> |
| <li>日志API不可以在Init 阶段使用,否则可能会发生意料之外的问题。</li> |
| </ul></description></item><item><title>Overview: 使用 ctx 传递上下文信息</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/context/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/context/</guid><description> |
| <h2 id="1-准备工作">1. 准备工作</h2> |
| <ul> |
| <li>dubbo-go cli 工具和依赖工具已安装</li> |
| <li>创建一个新的 demo 应用</li> |
| </ul> |
| <h2 id="2-使用-context-传递附加信息">2. 使用 context 传递附加信息</h2> |
| <p>参考 <a href="https://github.com/apache/dubbo-go-samples/tree/master/context">dubbo-go-samples/context</a></p></description></item><item><title>Overview: 泛化调用</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/generic/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/generic/</guid><description> |
| <h2 id="1-dubbo-go-泛化调用-java-server">1. Dubbo-go 泛化调用 Java Server</h2> |
| <p>使用 Triple 协议 + hessian2 序列化方案</p> |
| <h3 id="11-java-server启动">1.1 Java-Server启动</h3> |
| <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-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:#719e07">import</span> java.io.Serializable; |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.Date; |
| </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></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String id; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String name; |
| </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></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></span><span style="display:flex;"><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-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:#719e07">import</span> java.util.ArrayList; |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.List; |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.Map; |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">//import org.apache.dubbo.rpc.filter.GenericFilter;</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">UserProvider</span> { |
| </span></span><span style="display:flex;"><span> User <span style="color:#268bd2">GetUser1</span>(String userId); |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="12-go-client-泛化调用">1.2 Go-Client 泛化调用</h3> |
| <p>此处展示以 API 的形式构造泛化接口引用</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#586e75">// 初始化 Reference 配置 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>refConf <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewReferenceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;zk&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(tripleConst.TRIPLE). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetGeneric</span>(<span style="color:#cb4b16">true</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetSerialization</span>(<span style="color:#2aa198">&#34;hessian2&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// 构造 Root 配置,引入注册中心模块 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>rootConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;zk&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>)). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// Reference 配置初始化,因为需要使用注册中心进行服务发现,需要传入经过配置的 rootConfig |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> refConf.<span style="color:#268bd2">Init</span>(rootConfig); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// 泛化调用加载、服务发现 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>refConf.<span style="color:#268bd2">GenericLoad</span>(appName) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>time.<span style="color:#268bd2">Sleep</span>(time.Second) |
| </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>resp, err <span style="color:#719e07">:=</span> refConf.<span style="color:#268bd2">GetRPCService</span>().(<span style="color:#719e07">*</span>generic.GenericService).<span style="color:#268bd2">Invoke</span>( |
| </span></span><span style="display:flex;"><span> context.<span style="color:#268bd2">TODO</span>(), |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;getUser1&#34;</span>, |
| </span></span><span style="display:flex;"><span> []<span style="color:#dc322f">string</span>{<span style="color:#2aa198">&#34;java.lang.String&#34;</span>}, |
| </span></span><span style="display:flex;"><span> []hessian.Object{<span style="color:#2aa198">&#34;A003&#34;</span>}, |
| </span></span><span style="display:flex;"><span>) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">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;GetUser1(userId string) res: %+v&#34;</span>, resp) |
| </span></span></code></pre></div><p>GenericService 的 Invoke 方法包括三个参数:context.Context, []string, []hessian.Object,</p> |
| <p>其中第二个参数为对应参数的 Java 类名,例如java.lang.String、org.apache.dubbo.User,第三个参数为参数列表,hessian.Object 即为 interface。第二、第三个参数应与方法签名一致,按顺序对应。</p> |
| <p>获得map结构的返回结果</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>INFO cmd/client.go:89 GetUser1(userId string) res: map[age:48 class:org.apache.dubbo.User id:A003 name:Joe sex:MAN time:2021-10-04 14:03:03.37 +0800 CST] |
| </span></span></code></pre></div></description></item><item><title>Overview: 泛化调用</title><link>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/generic-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/features/generic-2/</guid><description> |
| <h2 id="1-dubbogo-泛化调用-java-server">1. Dubbogo 泛化调用 Java Server</h2> |
| <p>使用 Triple 协议 + hessian2 序列化方案</p> |
| <p>可参考Dubbogo 3.0 <a href="https://www.yuque.com/docs/share/f4e72670-74ab-45b9-bc0c-4b42249ed953?#">泛化调用文档</a></p> |
| <h3 id="11-java-server启动">1.1 Java-Server启动</h3> |
| <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-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:#719e07">import</span> java.io.Serializable; |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.Date; |
| </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></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String id; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String name; |
| </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></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></span><span style="display:flex;"><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-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:#719e07">import</span> java.util.ArrayList; |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.List; |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> java.util.Map; |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">//import org.apache.dubbo.rpc.filter.GenericFilter;</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">UserProvider</span> { |
| </span></span><span style="display:flex;"><span> User <span style="color:#268bd2">GetUser1</span>(String userId); |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><h3 id="12-go-client-泛化调用">1.2 Go-Client 泛化调用</h3> |
| <p>此处展示以 API 的形式构造泛化接口引用</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#586e75">// 初始化 Reference 配置 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>refConf <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewReferenceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;zk&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(tripleConst.TRIPLE). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetGeneric</span>(<span style="color:#cb4b16">true</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetSerialization</span>(<span style="color:#2aa198">&#34;hessian2&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// 构造 Root 配置,引入注册中心模块 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>rootConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;zk&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>)). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// Reference 配置初始化,因为需要使用注册中心进行服务发现,需要传入经过配置的 rootConfig |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> refConf.<span style="color:#268bd2">Init</span>(rootConfig); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// 泛化调用加载、服务发现 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>refConf.<span style="color:#268bd2">GenericLoad</span>(appName) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>time.<span style="color:#268bd2">Sleep</span>(time.Second) |
| </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>resp, err <span style="color:#719e07">:=</span> refConf.<span style="color:#268bd2">GetRPCService</span>().(<span style="color:#719e07">*</span>generic.GenericService).<span style="color:#268bd2">Invoke</span>( |
| </span></span><span style="display:flex;"><span> context.<span style="color:#268bd2">TODO</span>(), |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;getUser1&#34;</span>, |
| </span></span><span style="display:flex;"><span> []<span style="color:#dc322f">string</span>{<span style="color:#2aa198">&#34;java.lang.String&#34;</span>}, |
| </span></span><span style="display:flex;"><span> []hessian.Object{<span style="color:#2aa198">&#34;A003&#34;</span>}, |
| </span></span><span style="display:flex;"><span>) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">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;GetUser1(userId string) res: %+v&#34;</span>, resp) |
| </span></span></code></pre></div><p>GenericService 的 Invoke 方法包括三个参数:context.Context, []string, []hessian.Object,</p> |
| <p>其中第二个参数为对应参数的 Java 类名,例如java.lang.String、org.apache.dubbo.User,第三个参数为参数列表,hessian.Object 即为 interface。第二、第三个参数应与方法签名一致,按顺序对应。</p> |
| <p>获得map结构的返回结果</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>INFO cmd/client.go:89 GetUser1(userId string) res: map[age:48 class:org.apache.dubbo.User id:A003 name:Joe sex:MAN time:2021-10-04 14:03:03.37 +0800 CST] |
| </span></span></code></pre></div></description></item></channel></rss> |