| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – 基本概念</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/</link><description>Recent content in 基本概念 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: Dubbo-go 的应用和接口</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/app_and_interface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/app_and_interface/</guid><description> |
| <div class="pageinfo pageinfo-primary"> |
| <p>此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅<a href="https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/preface/design/app_and_interface/">最新版本</a>。</p> |
| </div> |
| <h1 id="dubbo-go-服务层级">Dubbo-go 服务层级</h1> |
| <p>Dubbo-go 服务层级为两个级别:分别是应用级别(App Level)和接口级别(Interface Level),该服务分层与<strong>框架配置</strong>结构息息相关。</p> |
| <p>如下图所示,可以看到,应用级别的组件以浅红色标注,接建立如下文件目录口级别的组件以浅蓝色标注:</p> |
| <p><img src="https://dubbo.apache.org/imgs/golang/3.0/dubbogo-concept.png" alt="img"></p> |
| <h2 id="1-应用级别组件">1. 应用级别组件</h2> |
| <p>应用级别组件的特点:被当前应用的所有接口级别组件共用。</p> |
| <p>应用级别的主要组件如下:</p> |
| <ul> |
| <li> |
| <p>应用信息模块</p> |
| <p>包含应用维度相关信息,包括应用名、版本号、数据上报方式等</p> |
| </li> |
| <li> |
| <p>Consumer 模块</p> |
| <p>Consumer 模块负责客户端相关信息,包括一个或多个引用(Reference)结构,以及超时、客户端过滤器(consumer filter)等相关信息。</p> |
| </li> |
| <li> |
| <p>Provider 模块</p> |
| <p>Provider 模块负责服务端相关信息,包括一个或多个服务(Service)结构、服务端过滤器(provider filter)等相关信息。</p> |
| </li> |
| <li> |
| <p>注册中心(Registry)模块</p> |
| <p>注册中心模块负责定义好所要使用的一系列注册中心,例如框架支持的ZK、<a href="https://nacos.io/">Nacos</a>、ETCD等中间件。应用级别的注册模块只负责声明,由接口级别的组件进行引用,引用时以用户自定义的注册中心ID(registryID) 作为索引。</p> |
| </li> |
| <li> |
| <p>协议(Protocol)模块</p> |
| <p>协议模块只存在于服务端。</p> |
| <p>协议模块关心服务的暴露信息,例如协议名、服务监听IP、端口号等信息。协议模块属于应用级别,只负责声明,由接口级别的组件进行引用,引用时以用户自定义的协议ID(protocolID) 作为索引。</p> |
| </li> |
| <li> |
| <p>元数据中心模块</p> |
| <p>元数据中心类似于注册中心模块,负责声明框架需要使用的元数据中心,从而将元数据成功上报。</p> |
| </li> |
| <li> |
| <p>配置中心模块</p> |
| </li> |
| <li> |
| <p>路由模块</p> |
| </li> |
| <li> |
| <p>日志模块</p> |
| </li> |
| <li> |
| <p>监控模块</p> |
| </li> |
| </ul> |
| <h2 id="2-接口级别组件">2. 接口级别组件</h2> |
| <ul> |
| <li> |
| <p>服务(Service)模块</p> |
| <p>服务模块被使用于任何暴露的服务,声明接口暴露所需的信息,包括例如接口名、协议、序列化方式等,负责单个服务接口的暴露。</p> |
| </li> |
| <li> |
| <p>引用(Reference)模块</p> |
| <p>饮用模块被使用于需要调用的远程服务的客户端,其声明了需要请求接口所需的信息,包括例如接口名、协议、序列化方式等、负责特定协议的抽象,参与客户端的生成。</p> |
| </li> |
| </ul> |
| <h2 id="3-说明">3. 说明</h2> |
| <p>暴露的服务是接口级别的,一个用户定义的 Provider Struct/一个用户定义的Consumer Struct,对应一个Service/Reference 模块,一个应用可以同时存在Consumer 模块和 Provider 模块,因此可以同时存在多个Service/Reference 模块。</p></description></item><item><title>Docs: Dubbo-go的配置</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/configuration/</guid><description> |
| <div class="pageinfo pageinfo-primary"> |
| <p>此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅<a href="https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/config-center/">最新版本</a>。</p> |
| </div> |
| <h1 id="dubbo-go-配置项">Dubbo-go 配置项</h1> |
| <h2 id="1-配置结构">1. 配置结构</h2> |
| <h3 id="11-框架配置结构">1.1 框架配置结构</h3> |
| <ul> |
| <li>根配置</li> |
| </ul> |
| <p><img src="https://dubbo.apache.org/imgs/golang/3.0/config-root-config.png" alt="img"></p> |
| <ul> |
| <li>ProviderConfig</li> |
| </ul> |
| <p><img src="https://dubbo.apache.org/imgs/golang/3.0/config-provider-config.png" alt="img"></p> |
| <ul> |
| <li>ConsumerConfig</li> |
| </ul> |
| <p><img src="https://dubbo.apache.org/imgs/golang/3.0/config-consumer-config.png" alt="img"></p> |
| <h3 id="12-配置例子">1.2 配置例子</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-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">application</span>: <span style="color:#586e75"># 应用配置</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: dubbo-go |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">module</span>: local |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">1.0.0</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">owner</span>: zhaoyunxing |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">organization</span>: dubbo-go |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">metadata-type</span>: local <span style="color:#586e75"># 元数据上报方式,默认为本地</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">metadata-report</span>: <span style="color:#586e75"># 元数据上报配置, 不包含此字段则不开启元数据上报,应用级服务发现依赖此字段,参考例子:https://github.com/apache/dubbo-go-samples/tree/master/registry/servicediscovery</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: nacos <span style="color:#586e75"># 元数据上报方式,支持nacos/zookeeper </span> |
| </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">8848</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">username</span>: <span style="color:#2aa198">&#34;&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">password</span>: <span style="color:#2aa198">&#34;&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">timeout</span>: <span style="color:#2aa198">&#34;3s&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">group</span>: <span style="color:#2aa198">&#34;dubbo&#34;</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">tripleProtocol</span>: <span style="color:#586e75"># triple协议定义,参考例子https://github.com/apache/dubbo-go-samples/tree/master/rpc/tri</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: tri <span style="color:#586e75"># 网络协议,支持tri/dubbo/jsonrpc/grpc</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20001</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">dubboProtocol</span>: <span style="color:#586e75"># dubbo协议定义,参考例子https://github.com/apache/dubbo-go-samples/tree/master/rpc/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">params</span>: <span style="color:#586e75"># dubbo 传输层配置,此字段不配置则使用协议默认值</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">reconnect-interval</span>: <span style="color:#2aa198">0</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">connection-number</span>: <span style="color:#2aa198">1</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">heartbeat-period</span>: 5s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">session-timeout</span>: 180s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">pool-size</span>: <span style="color:#2aa198">64</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">pool-ttl</span>: <span style="color:#2aa198">600</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">getty-session-param</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">compress-encoding</span>: <span style="color:#cb4b16">false</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tcp-no-delay</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tcp-keep-alive</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">keep-alive-period</span>: 120s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tcp-r-buf-size</span>: <span style="color:#2aa198">262144</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tcp-w-buf-size</span>: <span style="color:#2aa198">65536</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">pkg-rq-size</span>: <span style="color:#2aa198">1024</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">pkg-wq-size</span>: <span style="color:#2aa198">512</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tcp-read-timeout</span>: 1s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tcp-write-timeout</span>: 5s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">wait-timeout</span>: 1s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">max-msg-len</span>: <span style="color:#2aa198">1024000</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">session-name</span>: client |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">config-center</span>: <span style="color:#586e75"># 配置中心,参考例子:https://github.com/apache/dubbo-go-samples/tree/master/configcenter</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: nacos <span style="color:#586e75"># 支持 nacos/zookeeper/apollo</span> |
| </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">8848</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">group</span>: dubbo |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">timeout</span>: 10s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">params</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">username</span>: nacos |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">password</span>: <span style="color:#2aa198">123456</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">registries</span>: <span style="color:#586e75"># 注册中心配置,参考例子 https://github.com/apache/dubbo-go-samples/tree/master/metrics</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zk</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">nacos</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">timeout</span>: 5s |
| </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">8848</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">etcd</span>: |
| </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">2379</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">consumer</span>: <span style="color:#586e75"># 客户端配置</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">request_timeout</span>: 3s |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">filter</span>: myClientFilter <span style="color:#586e75"># 客户端 filters name,多个则逗号隔开</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">registry-ids</span>: zk <span style="color:#586e75"># 使用上面定义的注册中心id</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">max-wait-time-for-service-discovery</span>: 3s <span style="color:#586e75"># 服务发现最长等待时间</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">GreeterImpl</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: dubboProtocol |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">serialization</span>: hessian2 <span style="color:#586e75"># 序列化方式</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter <span style="color:#586e75"># 接口名,需要与服务端一致</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">provider</span>: <span style="color:#586e75"># 服务端配置</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">registry-ids</span>: zk <span style="color:#586e75"># 使用上面定义的注册中心id</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">DubboGreeterImpl</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">filter</span>: myServerFilter, myServerFilter2 <span style="color:#586e75"># server filters name </span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol-ids</span>: dubboProtocol <span style="color:#586e75"># 使用上面定义的协议id</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">serialization</span>: hessian2 <span style="color:#586e75"># hessian 序列化方式</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter <span style="color:#586e75"># 接口名,需要与客户端一致</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">TripleGreeterImpl</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol-ids</span>: tripleProtocol <span style="color:#586e75"># 使用上面定义的协议id</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">serialization</span>: protobuf <span style="color:#586e75"># pb 序列化方式</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.TripleService <span style="color:#586e75"># 接口名,需要与客户端一致</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">logger</span>: <span style="color:#586e75"># 日志配置,参考例子:https://github.com/apache/dubbo-go-samples/tree/master/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><span style="display:flex;"><span> <span style="color:#268bd2">lumberjack-config</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">filename</span>: logs.log <span style="color:#586e75"># 文件输出目录</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:#268bd2">maxAge</span>: <span style="color:#2aa198">3</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:#268bd2">localTime</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">compress</span>: <span style="color:#cb4b16">false</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">metrics</span>: <span style="color:#586e75"># 数据上报配置,参考例子:https://github.com/apache/dubbo-go-samples/tree/master/metrics</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enable</span>: <span style="color:#cb4b16">true</span> <span style="color:#586e75"># 数据上报开关,默认开启</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">path</span>: /custom-metrics-path <span style="color:#586e75"># 拉模式数据上报本地监听path 默认/metrics</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">9091</span> <span style="color:#586e75"># 拉模式数据上报本地监听端口,默认9090</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span></code></pre></div><h2 id="2-框架读取配置方式">2. 框架读取配置方式</h2> |
| <h3 id="21-从文件读取">2.1 从文件读取</h3> |
| <ol> |
| <li>需要按照上述配置结构,定义 dubbogo.yml 文件,并在应用启动之前设置环境变量 <code>DUBBO_GO_CONFIG_PATH</code>为 dubbogo.yml 的位置。</li> |
| <li>在代码中,调用 config.Load 方法,启动框架。一个例子如下:</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= PATH_TO_SAMPLES/helloworld/go-client/conf/dubbogo.yml |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">func</span> <span style="color:#268bd2">main</span>() { |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// set consumer struct if needed |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> config.<span style="color:#268bd2">SetConsumerService</span>(grpcGreeterImpl) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// config loader start |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#719e07">if</span> err <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">Load</span>(); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></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> <span style="color:#586e75">// do RPC invocation |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></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><h3 id="22-配置-api">2.2 配置 API</h3> |
| <p>用户无需使用配置文件,可直接在代码中以 API 的调用的形式写入配置,如前面&quot;快速开始&quot;部分所提供的例子:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#268bd2">func</span> <span style="color:#268bd2">main</span>() { |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// init rootConfig with config api |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(config.<span style="color:#268bd2">NewConsumerConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddReference</span>(<span style="color:#2aa198">&#34;GreeterClientImpl&#34;</span>, config.<span style="color:#268bd2">NewReferenceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>)). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// validate consumer greeterProvider |
| </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> rc.<span style="color:#268bd2">Init</span>(); err <span style="color:#719e07">!=</span> <span style="color:#cb4b16">nil</span>{ |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">panic</span>(err) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// run rpc invocation |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">testSayHello</span>() |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>配置 API 看上去写法较为复杂,但单个配置结构的构造过程都是一致的,参考 Java Builder 的设计,我们在配置 API 模块选用 <code>New().SetA().SetB().Build()</code>的方式来构造单个配置结构。</p> |
| <p>将上述例子中的 rootConfig 构造过程,可以拆解为:</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>referenceConfig <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">SetProtocol</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> |
| </span></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">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</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>registryConfig <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>) |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(consumerConfig). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>, registryConfig). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span></code></pre></div><h3 id="23-从配置中心读取">2.3 从配置中心读取</h3> |
| <p>Dubbo-go 服务框架支持将配置文件 &lsquo;dubbogo.yml&rsquo; 的内容预先放入配置中心,再通过配置注册中心的地址。在本地 dubbogo.yml 配置文件内只需写入配置中心的信息即可,目前支持作为配置中心的中间件有:apollo、<a href="https://nacos.io/">Nacos</a>、zookeeper</p> |
| <p>可参考<a href="https://github.com/apache/dubbo-go-samples/tree/master/configcenter">配置中心Samples</a>,凡是正确配置了config-center 配置的服务,都会优先从配置中心加载整个配置文件。</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">config-center</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: apollo |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">address</span>: localhost:8080 |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">app-id</span>: demo_server |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">cluster</span>: default |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: demo-provider-config |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 框架从 apollo 配置中最更新对应位置加载配置文件,并根据该配置文件启动</span> |
| </span></span></code></pre></div></description></item><item><title>Docs: Dubbo-go 的网络协议</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/protocol/</guid><description> |
| <div class="pageinfo pageinfo-primary"> |
| <p>此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅<a href="https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/preface/concept/protocol/">最新版本</a>。</p> |
| </div> |
| <h1 id="网络协议">网络协议</h1> |
| <h2 id="1-网络协议是什么">1. 网络协议是什么</h2> |
| <p>对于 Dubbo-go 微服务框架,网络协议为远程过程调用中负责网络通信的模块,负责应用层到网络层的数据序列化、打包、请求发起、网络端口监听等功能。Dubbo-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">type</span> Protocol <span style="color:#268bd2">interface</span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Export service for remote invocation |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Export</span>(invoker Invoker) Exporter |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Refer a remote service |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Refer</span>(url <span style="color:#719e07">*</span>common.URL) Invoker |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Destroy will destroy all invoker and exporter, so it only is called once. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Destroy</span>() |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>该接口包含三个方法。其中 Export 方法负责服务的暴露过程。入参 invoker 为dubbo 的概念,其封装了一个可以被调用的实例。在具体网络协议(例如Triple)实现的 Export 方法中,会针对特定的协议,将封装有一定逻辑的可调用实例 Invoker 以网络端口监听的形式暴露给外部服务,来自外部针对该网络端口的请求将会被 Export 方法开启的监听协程获取,进而根据网络协议进行拆解包和反序列化,得到解析后的请求数据。</p> |
| <p>Refer 方法负责服务的引用过程,其入参 url 为 dubbo 框架通用的结构,可以描述一个希望引用的服务,url 参数中包含了多个希望引用服务的参数,例如对应服务的接口名(interface),版本号(version),使用协议(protocol) 等等。在具体网络协议(例如Triple)实现的 Refer 方法中,会将特定的网络协议封装到 Invoker 可调用实例的方法中,用户层发起的 RPC 调用即可直接通过返回的 Invoker 对象,发起特定协议的网络请求。</p> |
| <p>Destroy 方法作用为销毁当前暴露的服务,用于服务下线场景。Dubbo-go 框架有优雅下线机制,可以在服务进程终止前以监听信号的形式,下线所有已启动的服务。</p> |
| <h2 id="2-dubbo-go-30-支持的网络协议">2. Dubbo-go 3.0 支持的网络协议</h2> |
| <p>Dubbo-go 3.0 版本支持的网络协议和序列化方式如下:</p> |
| <table> |
| <thead> |
| <tr> |
| <th>协议</th> |
| <th>协议名 (用于配置)</th> |
| <th style="text-align:center">序列化方式</th> |
| <th>默认序列化方式</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>Triple</td> |
| <td>tri</td> |
| <td style="text-align:center">pb hessian2 msgpack custome</td> |
| <td>pb</td> |
| </tr> |
| <tr> |
| <td>Dubbo</td> |
| <td>dubbbo</td> |
| <td style="text-align:center">hessian2</td> |
| <td>hessian2</td> |
| </tr> |
| <tr> |
| <td>gRPC</td> |
| <td>grpc</td> |
| <td style="text-align:center">pb</td> |
| <td>pb</td> |
| </tr> |
| <tr> |
| <td>jsonRPC</td> |
| <td>jsonrpc</td> |
| <td style="text-align:center">json</td> |
| <td>json</td> |
| </tr> |
| </tbody> |
| </table> |
| <h2 id="3-如何配置网络协议">3. 如何配置网络协议</h2> |
| <p>在快速开始章节可以看到,在配置的过程中将 Protocol 设置为 tri,表明使用 Triple 协议进行服务暴露和服务调用。快速开始章节使用的配置 API 进行配置的写入,这样的好处是无需使用配置文件。我们摘取出和网络协议相关的内容进行说明。</p> |
| <h3 id="使用配置-api">使用配置 API</h3> |
| <ul> |
| <li>客户端使用配置 API 设置网络协议</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-go" data-lang="go"><span style="display:flex;"><span>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(config.<span style="color:#268bd2">NewConsumerConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddReference</span>(<span style="color:#2aa198">&#34;GreeterClientImpl&#34;</span>, config.<span style="color:#268bd2">NewReferenceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). <span style="color:#586e75">// set reference protcol to triple |
| </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 style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span></code></pre></div><ul> |
| <li>服务端使用配置 API 设置网络协议</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-go" data-lang="go"><span style="display:flex;"><span>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProvider</span>(config.<span style="color:#268bd2">NewProviderConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddService</span>(<span style="color:#2aa198">&#34;GreeterProvider&#34;</span>, config.<span style="color:#268bd2">NewServiceConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetInterface</span>(<span style="color:#2aa198">&#34;org.apache.dubbo.UserProvider&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocolIDs</span>(<span style="color:#2aa198">&#34;tripleProtocolKey&#34;</span>). <span style="color:#586e75">// use protocolID &#39;tripleProtocolKey&#39; |
| </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 style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddProtocol</span>(<span style="color:#2aa198">&#34;tripleProtocolKey&#34;</span>, config.<span style="color:#268bd2">NewProtocolConfigBuilder</span>(). <span style="color:#586e75">// define protocol config with protocolID &#39;tripleProtocolKey&#39; |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">SetName</span>(<span style="color:#2aa198">&#34;tri&#34;</span>). <span style="color:#586e75">// set service protocol to triple |
| </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 style="color:#268bd2">Build</span>() |
| </span></span></code></pre></div><h3 id="使用配置文件">使用配置文件</h3> |
| <p>参考 samples/helloworld</p> |
| <ul> |
| <li>客户端使用配置文件设置网络协议</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-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">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 style="color:#586e75"># set protcol to tri</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter |
| </span></span></code></pre></div><ul> |
| <li>服务端使用配置文件设置网络协议</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-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">protocols</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">triple</span>: <span style="color:#586e75"># define protcol-id &#39;triple&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">name</span>: tri <span style="color:#586e75"># set protcol to tri</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">20000</span> <span style="color:#586e75"># set port to be listened</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">protocol-ids</span>: triple <span style="color:#586e75"># use protocol-ids named &#39;triple&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter |
| </span></span></code></pre></div></description></item><item><title>Docs: Dubbo-go 的注册中心</title><link>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/registry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docs/languages/golang/dubbo-go-3.0/concept/registry/</guid><description> |
| <div class="pageinfo pageinfo-primary"> |
| <p>此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅<a href="https://dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/registry/">最新版本</a>。</p> |
| </div> |
| <h1 id="注册中心">注册中心</h1> |
| <h2 id="1-dubbo-的注册中心是什么">1. Dubbo 的注册中心是什么</h2> |
| <p>对于 Dubbo-go 微服务框架,注册中心在 RPC 场景下复杂保存 Provider 应用的服务信息。Provider 注册地址到注册中心,Consumer 从注册中心读取和订阅 Provider 地址列表。如图所示:</p> |
| <p><img src="https://dubbo.apache.org/imgs/architecture.png" alt="img"></p> |
| <p>关于 Dubbo 服务发现细节,详情可参考 <a href="https://dubbo.apache.org/zh-cn/docs/concepts/service-discovery/">Dubbo 官网的概念介绍</a></p> |
| <p>Dubbo-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:#586e75">// Registry Extension - Registry |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">type</span> Registry <span style="color:#268bd2">interface</span> { |
| </span></span><span style="display:flex;"><span> common.Node |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Register is used for service provider calling, register services |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// to registry. And it is also used for service consumer calling, register |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// services cared about, for dubbo&#39;s admin monitoring. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Register</span>(url <span style="color:#719e07">*</span>common.URL) <span style="color:#dc322f">error</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// UnRegister is required to support the contract: |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// 1. If it is the persistent stored data of dynamic=false, the |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// registration data can not be found, then the IllegalStateException |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// is thrown, otherwise it is ignored. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// 2. Unregister according to the full url match. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// url Registration information, is not allowed to be empty, e.g: |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// dubbo://10.20.153.10/org.apache.dubbo.foo.BarService?version=1.0.0&amp;application=kylin |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">UnRegister</span>(url <span style="color:#719e07">*</span>common.URL) <span style="color:#dc322f">error</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// Subscribe is required to support the contract: |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// When creating new registry extension, pls select one of the |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// following modes. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// Will remove in dubbogo version v1.1.0 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// mode1: return Listener with Next function which can return |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// subscribe service event from registry |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// Deprecated! |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// subscribe(event.URL) (Listener, error) |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// Will replace mode1 in dubbogo version v1.1.0 |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// mode2: callback mode, subscribe with notify(notify listener). |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">Subscribe</span>(<span style="color:#719e07">*</span>common.URL, NotifyListener) <span style="color:#dc322f">error</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75">// UnSubscribe is required to support the contract: |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// 1. If don&#39;t subscribe, ignore it directly. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// 2. Unsubscribe by full URL match. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// url Subscription condition, not allowed to be empty, e.g. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// consumer://10.20.153.10/org.apache.dubbo.foo.BarService?version=1.0.0&amp;application=kylin |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#586e75">// listener A listener of the change event, not allowed to be empty |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">UnSubscribe</span>(<span style="color:#719e07">*</span>common.URL, NotifyListener) <span style="color:#dc322f">error</span> |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>该接口主要包含四个方法,分别是注册、反注册、订阅、取消订阅。顾名思义,概括了客户端和服务端与注册中心交互的动作。针对普通接口级服务注册发现场景,在Provider 服务启动时,会将自身服务接口信息抽象为一个 url,该 url 包含了客户端发起调用所需的所有信息(ip、端口、协议等),服务端的注册中心组件会将该 url 写入注册中心(例如zk)。客户端启动后,在服务引用 Refer 步骤会通过注册中心组件订阅(Subscribe)需要的服务信息,获取到的服务信息以异步事件更新的形式写入客户端缓存,从而在服务发现成功后,可以根据拿到的服务 url 参数,向对应服务提供者发起调用。</p> |
| <h2 id="2-dubbo-go-30-支持的注册中心类型">2. Dubbo-go 3.0 支持的注册中心类型</h2> |
| <p>Dubbogo 3.0 版本支持的注册中心类型如下:</p> |
| <table> |
| <thead> |
| <tr> |
| <th>注册中心</th> |
| <th>注册中心名(用于配置)</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>Zookeeper</td> |
| <td>zookeeper</td> |
| </tr> |
| <tr> |
| <td>Nacos</td> |
| <td>nacos</td> |
| </tr> |
| <tr> |
| <td>Etcd</td> |
| <td>etcd</td> |
| </tr> |
| <tr> |
| <td>Consul</td> |
| <td>consul</td> |
| </tr> |
| </tbody> |
| </table> |
| <h2 id="3-如何配置注册中心">3. 如何配置注册中心</h2> |
| <h3 id="使用配置-api">使用配置 API</h3> |
| <ul> |
| <li>客户端使用配置 API 设置注册中心</li> |
| </ul> |
| <p>可通过调用config.NewRegistryConfigWithProtocolDefaultPort方法,快速设置用于调试的注册中心,支持zookeeper(127.0.0.1:2181) 和nacos(127.0.0.1:8848)</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>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(config.<span style="color:#268bd2">NewConsumerConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;zookeeperID&#34;</span>). <span style="color:#586e75">// use defined registryID |
| </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 style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;zookeeperID&#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></code></pre></div><p>全部接口:可通过调用RegistryConfigBuilder提供的丰富接口进行配置。</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>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetConsumer</span>(config.<span style="color:#268bd2">NewConsumerConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;nacosRegistryID&#34;</span>). <span style="color:#586e75">// use defined registryID |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span> <span style="color:#268bd2">AddReference</span>(<span style="color:#2aa198">&#34;GreeterClientImpl&#34;</span>,<span style="color:#586e75">/*...*/</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;nacosRegistryID&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(<span style="color:#2aa198">&#34;nacos&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetAddress</span>(<span style="color:#2aa198">&#34;127.0.0.1:8848&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetGroup</span>(<span style="color:#2aa198">&#34;dubbo-go&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetNamespace</span>(<span style="color:#2aa198">&#34;dubbo&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetUsername</span>(<span style="color:#2aa198">&#34;admin&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetPassword</span>(<span style="color:#2aa198">&#34;admin&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetTimeout</span>(<span style="color:#2aa198">&#34;3s&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span></code></pre></div><ul> |
| <li>服务端使用配置 API 设置配置中心</li> |
| </ul> |
| <p>简易接口 config.NewRegistryConfigWithProtocolDefaultPort</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>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProvider</span>(config.<span style="color:#268bd2">NewProviderConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddService</span>(<span style="color:#2aa198">&#34;GreeterProvider&#34;</span>, <span style="color:#586e75">/*...*/</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;registryKey&#34;</span>). <span style="color:#586e75">// use defined registryID |
| </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 style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;registryKey&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigWithProtocolDefaultPort</span>(<span style="color:#2aa198">&#34;zookeeper&#34;</span>)). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span></code></pre></div><p>全部接口:可通过调用RegistryConfigBuilder提供的丰富接口进行配置。</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>rc <span style="color:#719e07">:=</span> config.<span style="color:#268bd2">NewRootConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProvider</span>(config.<span style="color:#268bd2">NewProviderConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">AddService</span>(<span style="color:#2aa198">&#34;GreeterProvider&#34;</span>,<span style="color:#586e75">/*...*/</span>) |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetRegistryIDs</span>(<span style="color:#2aa198">&#34;registryKey&#34;</span>). <span style="color:#586e75">// use defined registryID |
| </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 style="color:#268bd2">AddRegistry</span>(<span style="color:#2aa198">&#34;registryKey&#34;</span>, config.<span style="color:#268bd2">NewRegistryConfigBuilder</span>(). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetProtocol</span>(<span style="color:#2aa198">&#34;nacos&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetAddress</span>(<span style="color:#2aa198">&#34;127.0.0.1:8848&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetGroup</span>(<span style="color:#2aa198">&#34;dubbo-go&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetNamespace</span>(<span style="color:#2aa198">&#34;dubbo&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetUsername</span>(<span style="color:#2aa198">&#34;admin&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetPassword</span>(<span style="color:#2aa198">&#34;admin&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">SetTimeout</span>(<span style="color:#2aa198">&#34;3s&#34;</span>). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>()). |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">Build</span>() |
| </span></span></code></pre></div><h3 id="使用配置文件">使用配置文件</h3> |
| <ul> |
| <li>客户端/服务端</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-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"># define registry-id &#39;demoZK&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol</span>: zookeeper <span style="color:#586e75"># set registry protocol</span> |
| </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">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">registry-ids</span>: |
| </span></span><span style="display:flex;"><span> - demoZK <span style="color:#586e75"># use registry-id &#39;demoZK&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">services</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">GreeterProvider</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">protocol-ids</span>: triple |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">interface</span>: com.apache.dubbo.sample.basic.IGreeter |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">consumer</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">registry-ids</span>: |
| </span></span><span style="display:flex;"><span> - demoZK <span style="color:#586e75"># use registry-id &#39;demoZK&#39;</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></span></code></pre></div></description></item></channel></rss> |