This is an automated email from the ASF dual-hosted git repository. git-site-role pushed a commit to branch asf-site in repository https://gitbox.apache.org/repos/asf/dubbo-website.git
The following commit(s) were added to refs/heads/asf-site by this push: new 28f9a05 Website updated with ef991ad2e93c26914bc3976fb0df1f13c911e95e 28f9a05 is described below commit 28f9a0535755a3b5a7ddfd01a12d34308925569b Author: jenkins <us...@infra.apache.org> AuthorDate: Thu Jun 27 13:01:18 2019 +0000 Website updated with ef991ad2e93c26914bc3976fb0df1f13c911e95e --- COMMIT_ID | 2 +- md_json/docs.json | 5 + .../configcenter/design.html} | 150 +++++++++------------ zh-cn/docs/dev/configcenter/design.json | 6 + zh-cn/docs/user/configuration/config-center.html | 4 +- zh-cn/docs/user/configuration/config-center.json | 2 +- 6 files changed, 77 insertions(+), 92 deletions(-) diff --git a/COMMIT_ID b/COMMIT_ID index 76844fd..783218c 100644 --- a/COMMIT_ID +++ b/COMMIT_ID @@ -1 +1 @@ -d5b2314946d78ebc3fd84e053067ee2edb14ac66 +ef991ad2e93c26914bc3976fb0df1f13c911e95e diff --git a/md_json/docs.json b/md_json/docs.json index bc30b12..a2ba31e 100644 --- a/md_json/docs.json +++ b/md_json/docs.json @@ -1086,6 +1086,11 @@ "meta": {} }, { + "filename": "design.md", + "link": "/zh-cn/docs/dev/configcenter/design.html", + "meta": {} + }, + { "filename": "contract.md", "link": "/zh-cn/docs/dev/contract.html", "meta": {} diff --git a/zh-cn/docs/user/configuration/config-center.html b/zh-cn/docs/dev/configcenter/design.html similarity index 78% copy from zh-cn/docs/user/configuration/config-center.html copy to zh-cn/docs/dev/configcenter/design.html index 29f69d3..7abf64a 100644 --- a/zh-cn/docs/user/configuration/config-center.html +++ b/zh-cn/docs/dev/configcenter/design.html @@ -4,111 +4,85 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - <meta name="keywords" content="config-center" /> - <meta name="description" content="config-center" /> + <meta name="keywords" content="design" /> + <meta name="description" content="design" /> <!-- 网页标签标题 --> - <title>config-center</title> + <title>design</title> <link rel="shortcut icon" href="/img/dubbo.ico"/> <link rel="stylesheet" href="/build/documentation.css" /> </head> <body> - <div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...] -<p>配置中心(v2.7.0)在Dubbo中承担两个职责:</p> + <div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...] +<h2>设计目的</h2> +<p>配置中心的核心功能是作为Key-Value存储,Dubbo框架告知配置中心其关心的key,配置中心返回该key对应的value值。</p> +<p>按照应用场景划分,配置中心在Dubbo框架中主要承担以下职责:</p> +<ul> +<li>作为外部化配置中心,即存储dubbo.properties配置文件,此时,key值通常为文件名如dubbo.properties,value则为配置文件内容。</li> +<li>存储单个配置项,如各种开关项、常量值等。</li> +<li>存储服务治理规则,此时key通常按照"服务名+规则类型"的格式来组织,而value则为具体的治理规则。</li> +</ul> +<p>为了进一步实现对key-value的分组管理,Dubbo的配置中心还加入了namespace、group的概念,这些概念在很多专业的第三方配置中心中都有体现,通常情况下,namespace用来隔离不同的租户,group用来对统一租户的key集合做分组。</p> +<p>当前,Dubbo配置中心实现了对Zookeeper、Nacos、Etcd、Consul、Apollo的对接,接下来我们具体看一下Dubbo抽象的配置中心是怎么映射到具体的第三方实现中的。</p> +<h2>实现原理</h2> +<h3>Zookeeper</h3> +<p>zookeeper提供了一个树状的存储模型,其实现原理如下:</p> +<p><img src="/img/configcenter_zk_model.jpg" alt="image-20190127225608553"></p> +<p>namespace, group, key等分别对应不同层级的ZNode节点,而value则作为根ZNode节点的值存储。</p> <ol> -<li>外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。</li> -<li>服务治理。服务治理规则的存储与通知。</li> -</ol> -<p>启用动态配置(以Zookeeper为例,可查看<a href="../references/xml/dubbo-config-center.md">动态配置配置项详解</a>):</p> -<pre><code class="language-xml"><span class="hljs-tag"><<span class="hljs-name">dubbo:config-center</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/></span> -</code></pre> -<p>或者</p> -<pre><code class="language-properties"><span class="hljs-meta">dubbo.config-center.address</span>=<span class="hljs-string">zookeeper://127.0.0.1:2181</span> -</code></pre> -<p>或者</p> -<pre><code class="language-java">ConfigCenterConfig configCenter = <span class="hljs-keyword">new</span> ConfigCenterConfig(); -configCenter.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>); -</code></pre> -<blockquote> -<p>为了兼容2.6.x版本配置,在使用Zookeeper作为注册中心,且没有显示配置配置中心的情况下,Dubbo框架会默认将此Zookeeper用作配置中心,但将只作服务治理用途。</p> -</blockquote> -<h2>外部化配置</h2> -<p>外部化配置目的之一是实现配置的集中式管理,这部分业界已经有很多成熟的专业配置系统如Apollo, Nacos等,Dubbo所做的主要是保证能配合这些系统正常工作。</p> -<p>外部化配置和其他本地配置在内容和格式上并无区别,可以简单理解为<code>dubbo.properties</code>的外部化存储,配置中心更适合将一些公共配置如注册中心、元数据中心配置等抽取以便做集中管理。</p> -<pre><code class="language-properties"><span class="hljs-comment"># 将注册中心地址、元数据中心地址等配置集中管理,可以做到统一环境、减少开发侧感知。</span> -<span class="hljs-meta">dubbo.registry.address</span>=<span class="hljs-string">zookeeper://127.0.0.1:2181</span> -<span class="hljs-meta">dubbo.registry.simplified</span>=<span class="hljs-string">true</span> - -<span class="hljs-meta">dubbo.metadataReport.address</span>=<span class="hljs-string">zookeeper://127.0.0.1:2181</span> - -<span class="hljs-meta">dubbo.protocol.name</span>=<span class="hljs-string">dubbo</span> -<span class="hljs-meta">dubbo.protocol.port</span>=<span class="hljs-string">20880</span> - -<span class="hljs-meta">dubbo.application.qos.port</span>=<span class="hljs-string">33333</span> -</code></pre> +<li> +<p>外部化配置中心 dubbo.properties</p> +<p><img src="/img/configcenter_zk_properties.jpg" alt="image-20190127225608553"></p> +<p>上图展示了两个不同作用域的dubbo.properties文件在zookeeper中的存储结构:</p> <ul> -<li>优先级</li> +<li>命名空间namespace都为:dubbo</li> +<li>分组group:全局级别为dubbo,所有应用共享;应用级别为应用名demo-provider,只对改应用生效</li> +<li>key:dubbo.properties</li> </ul> -<p>外部化配置默认较本地配置有更高的优先级,因此这里配置的内容会覆盖本地配置值,关于<a href="./configuration-load-process.md">各配置形式间的覆盖关系</a>有单独一章说明,你也可通过以下选项调整配置中心的优先级:</p> -<pre><code class="language-properties"><span class="hljs-meta">-Ddubbo.configCenter.highestPriority</span>=<span class="hljs-string">false</span> -</code></pre> +</li> +<li> +<p>单个配置项</p> +<p><img src="/img/configcenter_zk_singleitem.jpg" alt="image-20190127225608553"></p> +<p>设置优雅停机事件为15000:</p> <ul> -<li>作用域</li> +<li>命名空间namespace:dubbo</li> +<li>分组group:dubbo</li> +<li>key:dubbo.service.shutdown.wait=15000</li> </ul> -<p>外部化配置有全局和应用两个级别,全局配置是所有应用共享的,应用级配置是由每个应用自己维护且只对自身可见的。</p> -<p>当前已支持的扩展实现有Zookeeper、Apollo。</p> -<h4>Zookeeper</h4> -<pre><code class="language-xml"><span class="hljs-tag"><<span class="hljs-name">dubbo:config-center</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/></span> -</code></pre> -<p>默认所有的配置都存储在<code>/dubbo/config</code>节点,具体节点结构图如下:</p> -<p><img src="/img/zk-configcenter.jpg" alt="image-20190127225608553"></p> +</li> +<li> +<p>服务治理规则</p> +<p><img src="/img/configcenter_zk_rule.jpg" alt="image-20190127225608553"></p> +<p>上图展示了一条应用级别的条件路由规则:</p> <ul> -<li>namespace,用于不同配置的环境隔离。</li> -<li>config,Dubbo约定的固定节点,不可更改,所有配置和服务治理规则都存储在此节点下。</li> -<li>dubbo/application,分别用来隔离全局配置、应用级别配置:dubbo是默认group值,application对应应用名</li> -<li>dubbo.properties,此节点的node value存储具体配置内容</li> +<li>命名空间namespace:dubbo</li> +<li>分组group:dubbo</li> +<li>key:governance-conditionrouter-consumer.condition-router,其中governance-conditionrouter-consumer为应用名,condition-router代表条件路由</li> </ul> -<h4>Apollo</h4> -<pre><code class="language-xml"><span class="hljs-tag"><<span class="hljs-name">dubbo:config-center</span> <span class="hljs-attr">protocol</span>=<span class="hljs-string">"apollo"</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"127.0.0.1:2181"</span>/></span> -</code></pre> -<p>Apollo中的一个核心概念是命名空间 - namespace(和上面zookeeper的namespace概念不同),在这里全局和应用级别配置就是通过命名空间来区分的。</p> -<p>默认情况下,Dubbo会从名叫<code>dubbo</code>的命名空间中读取全局配置(<code><dubbo:config-center namespace="your namespace"></code>)</p> -<p><img src="/img/apollo-configcenter-dubbo.jpg" alt="image-20190128095444169"></p> -<p>而应用自有的配置,会从<code>application</code>命名空间读取</p> -<p><img src="/img/apollo-configcenter-application.jpg" alt="image-20190128095659517"></p> <blockquote> -<p>注意:当前dubbo.properties是作为一个key存储在Apollo namespace中,为更好的适应Apollo的设计理念,在接下来的版本中可能会调整为</p> -<p><img src="/img/apollo-configcenter-enhance.jpg" alt="image-20190128100058755"></p> -</blockquote> -<h4>自己加载外部化配置</h4> -<p>所谓Dubbo对配置中心的支持,本质上就是把<code>.properties</code>从远程拉取到本地,然后和本地的配置做一次融合。理论上只要Dubbo框架能拿到需要的配置就可以正常的启动,它并不关心这些配置是自己加载到的还是应用直接塞给它的,所以Dubbo还提供了以下API,让用户将自己组织好的配置塞给Dubbo框架(配置加载的过程是用户要完成的),这样Dubbo框架就不再直接和Apollo或Zookeeper做读取配置交互。</p> -<pre><code class="language-java"><span class="hljs-comment">// 应用自行加载配置</span> -Map<String, String> dubboConfigurations = <span class="hljs-keyword">new</span> HashMap<>(); -dubboConfigurations.put(<span class="hljs-string">"dubbo.registry.address"</span>, <span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>); -dubboConfigurations.put(<span class="hljs-string">"dubbo.registry.simplified"</span>, <span class="hljs-string">"true"</span>); - -<span class="hljs-comment">//将组织好的配置塞给Dubbo框架</span> -ConfigCenterConfig configCenter = <span class="hljs-keyword">new</span> ConfigCenterConfig(); -configCenter.setExternalConfig(dubboConfigurations); -</code></pre> -<h2>服务治理</h2> -<h4>Zookeeper</h4> -<p>默认节点结构:</p> -<p><img src="/img/zk-configcenter-governance.jpg" alt="image-20190128101129591"></p> +<p>注意:</p> +<p>Dubbo同时支持应用、服务两种粒度的服务治理规则,对于这两种粒度,其key取值规则如下:</p> <ul> -<li>namespace,用于不同配置的环境隔离。</li> -<li>config,Dubbo约定的固定节点,不可更改,所有配置和服务治理规则都存储在此节点下。</li> -<li>dubbo,所有服务治理规则都是全局性的,dubbo为默认节点</li> -<li>configurators/tag-router/condition-router,不同的服务治理规则类型,node value存储具体规则内容</li> +<li>应用粒度 {应用名 + 规则后缀}。如: <code>demo-application.configurators</code>、<code>demo-application.tag-router</code>等</li> +<li>服务粒度 {服务接口名:[服务版本]:[服务分组] + 规则后缀},其中服务版本、服务分组是可选的,如果它们有配置则在key中体现,没被配置则用":"占位。如 +<code>org.apache.dubbo.demo.DemoService::.configurators</code>、<code>org.apache.dubbo.demo.DemoService:1.0.0:group1.configurators</code></li> </ul> -<h4>Apollo</h4> -<p>所有的服务治理规则都是全局性的,默认从公共命名空间<code>dubbo</code>读取和订阅:</p> -<p><img src="/img/apollo-configcenter-governance.jpg" alt="image-20190128100600055"></p> -<p>不同的规则以不同的key后缀区分:</p> +</blockquote> +</li> +</ol> +<h3>Etcd & Consul</h3> +<p>Etcd和Consul本质上也是一种类似zookeeper的树状存储结构,实现请参考zookeeper。</p> +<h3>Nacos</h3> +<p>Nacos作为一个专业的第三方配置中心,拥有专门为配置中心设计的存储结构,包括内置的namespace、group、dataid等概念。并且这几个概念基本上与Dubbo框架抽象的配置中心是一一对应的。</p> +<p>与Zookeeper实现的对应关系如下:</p> +<p><img src="/img/configcenter_nacos_model.jpg" alt="image-20190127225608553"></p> +<p>参考上文关于zookeeper实现中描述的示例,这里的dataid可能为:</p> <ul> -<li>configurators,<a href="../demos/config-rule.md">覆盖规则</a></li> -<li>tag-router,<a href="../demos/routing-rule.md">标签路由</a></li> -<li>condition-router,<a href="../demos/routing-rule.md">条件路由</a></li> +<li>外部化配置中心:dubbo.properties</li> +<li>单个配置项:dubbo.service.shutdown.wait</li> +<li>服务治理规则:org.apache.dubbo.demo.DemoService:1.0.0:group1.configurators</li> </ul> +<h3>Apollo</h3> +<p>Apollo与Nacos类似,请参考动态配置中心使用文档中关于Apollo部分的描述。</p> </div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3></h3><p></p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">基金会</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">证书</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">事件</a></dd><dd><a [...] <script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script> <script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script> diff --git a/zh-cn/docs/dev/configcenter/design.json b/zh-cn/docs/dev/configcenter/design.json new file mode 100644 index 0000000..3c8bfbd --- /dev/null +++ b/zh-cn/docs/dev/configcenter/design.json @@ -0,0 +1,6 @@ +{ + "filename": "design.md", + "__html": "<h1>Dubbo配置中心</h1>\n<h2>设计目的</h2>\n<p>配置中心的核心功能是作为Key-Value存储,Dubbo框架告知配置中心其关心的key,配置中心返回该key对应的value值。</p>\n<p>按照应用场景划分,配置中心在Dubbo框架中主要承担以下职责:</p>\n<ul>\n<li>作为外部化配置中心,即存储dubbo.properties配置文件,此时,key值通常为文件名如dubbo.properties,value则为配置文件内容。</li>\n<li>存储单个配置项,如各种开关项、常量值等。</li>\n<li>存储服务治理规则,此时key通常按照"服务名+规则类型"的格式来组织,而value则为具体的治理规则。</li>\n</ul>\n<p>为了进一步实现对key-value的分组管理,Dubbo的配置中心还加入了namespace、group的概念,这些概念在很多专业的第三方配置中心中都有体现,通常情况下,namespace用来隔离不同的租户,group用来对统一租户的key集 [...] + "link": "/zh-cn/docs/dev/configcenter/design.html", + "meta": {} +} \ No newline at end of file diff --git a/zh-cn/docs/user/configuration/config-center.html b/zh-cn/docs/user/configuration/config-center.html index 29f69d3..81f27ca 100644 --- a/zh-cn/docs/user/configuration/config-center.html +++ b/zh-cn/docs/user/configuration/config-center.html @@ -38,7 +38,7 @@ configCenter.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</ <span class="hljs-meta">dubbo.registry.address</span>=<span class="hljs-string">zookeeper://127.0.0.1:2181</span> <span class="hljs-meta">dubbo.registry.simplified</span>=<span class="hljs-string">true</span> -<span class="hljs-meta">dubbo.metadataReport.address</span>=<span class="hljs-string">zookeeper://127.0.0.1:2181</span> +<span class="hljs-meta">dubbo.metadata-report.address</span>=<span class="hljs-string">zookeeper://127.0.0.1:2181</span> <span class="hljs-meta">dubbo.protocol.name</span>=<span class="hljs-string">dubbo</span> <span class="hljs-meta">dubbo.protocol.port</span>=<span class="hljs-string">20880</span> @@ -49,7 +49,7 @@ configCenter.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</ <li>优先级</li> </ul> <p>外部化配置默认较本地配置有更高的优先级,因此这里配置的内容会覆盖本地配置值,关于<a href="./configuration-load-process.md">各配置形式间的覆盖关系</a>有单独一章说明,你也可通过以下选项调整配置中心的优先级:</p> -<pre><code class="language-properties"><span class="hljs-meta">-Ddubbo.configCenter.highestPriority</span>=<span class="hljs-string">false</span> +<pre><code class="language-properties"><span class="hljs-meta">-Ddubbo.config-center.highest-priority</span>=<span class="hljs-string">false</span> </code></pre> <ul> <li>作用域</li> diff --git a/zh-cn/docs/user/configuration/config-center.json b/zh-cn/docs/user/configuration/config-center.json index e06ba3e..3d4dbdc 100644 --- a/zh-cn/docs/user/configuration/config-center.json +++ b/zh-cn/docs/user/configuration/config-center.json @@ -1,6 +1,6 @@ { "filename": "config-center.md", - "__html": "<h1>动态配置中心</h1>\n<p>配置中心(v2.7.0)在Dubbo中承担两个职责:</p>\n<ol>\n<li>外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。</li>\n<li>服务治理。服务治理规则的存储与通知。</li>\n</ol>\n<p>启用动态配置(以Zookeeper为例,可查看<a href=\"../references/xml/dubbo-config-center.md\">动态配置配置项详解</a>):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\"><<span class=\"hljs-name\">dubbo:config-center</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>/> [...] + "__html": "<h1>动态配置中心</h1>\n<p>配置中心(v2.7.0)在Dubbo中承担两个职责:</p>\n<ol>\n<li>外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。</li>\n<li>服务治理。服务治理规则的存储与通知。</li>\n</ol>\n<p>启用动态配置(以Zookeeper为例,可查看<a href=\"../references/xml/dubbo-config-center.md\">动态配置配置项详解</a>):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\"><<span class=\"hljs-name\">dubbo:config-center</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>/> [...] "link": "/zh-cn/docs/user/configuration/config-center.html", "meta": {} } \ No newline at end of file