You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by il...@apache.org on 2019/03/20 10:30:54 UTC

[incubator-dubbo-website] branch asf-site updated: add blog for dubbo local call, and rebuild website

This is an automated email from the ASF dual-hosted git repository.

iluo pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new ac6efa9  add blog for dubbo local call, and rebuild website
ac6efa9 is described below

commit ac6efa96a914c04197e540e4a191da5cabb2fc9e
Author: Ian Luo <ia...@gmail.com>
AuthorDate: Wed Mar 20 18:30:31 2019 +0800

    add blog for dubbo local call, and rebuild website
---
 blog/zh-cn/dubbo-local-call.md       | 139 +++++++++++++++++++++++++++++++++++
 build/blog.js                        |   2 +-
 en-us/blog/dubbo-fescar.html         |   9 ++-
 en-us/blog/dubbo-fescar.json         |   2 +-
 en-us/blog/dubbo-new-async.html      |   8 +-
 en-us/blog/dubbo-new-async.json      |   2 +-
 img/blog/dubbo-local-call-filter.png | Bin 0 -> 29167 bytes
 md_json/blog.json                    |   5 ++
 site_config/blog.js                  |   7 ++
 zh-cn/blog/dubbo-fescar.html         |   9 ++-
 zh-cn/blog/dubbo-fescar.json         |   2 +-
 zh-cn/blog/dubbo-local-call.html     |  85 +++++++++++++++++++++
 zh-cn/blog/dubbo-local-call.json     |   6 ++
 zh-cn/blog/dubbo-new-async.html      |   4 +-
 zh-cn/blog/dubbo-new-async.json      |   2 +-
 zh-cn/blog/index.html                |   2 +-
 16 files changed, 264 insertions(+), 20 deletions(-)

diff --git a/blog/zh-cn/dubbo-local-call.md b/blog/zh-cn/dubbo-local-call.md
new file mode 100644
index 0000000..a4ff93c
--- /dev/null
+++ b/blog/zh-cn/dubbo-local-call.md
@@ -0,0 +1,139 @@
+# 本地调用
+
+### 本地调用介绍
+
+当一个应用既是一个服务的提供者,同时也是这个服务的消费者的时候,可以直接对本机提供的服务发起本地调用。从 `2.2.0` 版本开始,Dubbo 默认在本地以 *injvm* 的方式暴露服务,这样的话,在同一个进程里对这个服务的调用会优先走本地调用。
+
+
+
+与本地对象上方法调用不同的是,Dubbo 本地调用会经过 Filter 链,其中包括了 Consumer 端的 Filter 链以及 Provider 端的 Filter 链。通过这样的机制,本地消费者和其他消费者都是统一对待,统一监控,服务统一进行治理。
+
+
+
+![filter-chain](../../img/blog/dubbo-local-call-filter.png)
+
+
+
+
+
+同时,相比于远程调用来说,Dubbo 本地调用性能较优,省去了请求、响应的编解码及网络传输的过程。
+
+
+
+要使用 Dubbo 本地调用不需做特殊配置,按正常 Dubbo 服务暴露服务即可。任一服务在暴露远程服务的同时,也会同时以 *injvm* 的协议暴露本地服务。*injvm* 是一个伪协议,不会像其他协议那样对外开启端口,只用于本地调用的目的。
+
+
+
+以下面的 XML 配置为例:
+
+
+
+```xml
+<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
+<dubbo:protocol name="dubbo" port="20800"/>
+
+<bean id="demoServiceTarget" class="org.apache.dubbo.samples.local.impl.DemoServiceImpl"/>
+
+<dubbo:service interface="org.apache.dubbo.samples.local.api.DemoService" ref="demoServiceTarget"/>
+<dubbo:reference id="demoService" interface="org.apache.dubbo.samples.local.api.DemoService"/>
+```
+
+
+
+这里同时配置了同一服务 *DemoService* 的提供者以及消费者。在这种情况下,该应用中的 *DemoService* 的消费方会优先使用 *injvm* 协议进行本地调用。上述的例子可以在 dubbo-samples 工程中找到源码:https://github.com/apache/incubator-dubbo-samples/blob/master/dubbo-samples-local
+
+
+
+### 细粒度控制本地调用
+
+本地调用是可以显示关闭的,通过这种方式,服务提供者可以做到对远端服务消费者和本地消费者一视同仁。具体做法是通过 *scope="remote"* 来关闭 *injvm* 协议的暴露,这样,即使是本地调用者,也需要从注册中心上获取服务地址列表,然后才能发起调用,而这个时候的调用过程,与远端的服务消费者的过程是一致的。
+
+
+
+```xml
+<bean id="target" class="org.apache.dubbo.samples.local.impl.DemoServiceImpl"/>
+<!-- 服务提供者指定 scope="remote" -->
+<dubbo:service interface="org.apache.dubbo.samples.local.api.DemoService" ref="target" scope="remote"/>
+<dubbo:reference id="demoService" interface="org.apache.dubbo.samples.local.api.DemoService"/>
+```
+
+
+
+同样的,服务消费者也支持通过 *scope* 来限定发起调用优先走本地,还是只走远程。比如,可以通过以下的方式强制消费端通过**远程调用**的方式来发起 dubbo 调用:
+
+
+
+```xml
+<!-- 服务消费者指定 scope="remote" -->
+<dubbo:reference id="demoService" interface="org.apache.dubbo.samples.local.api.DemoService" scope="remote"/>
+```
+
+
+
+如果同时服务提供方限定了 *scope="local"* 的话,
+
+
+
+```xml
+<!-- 服务提供者指定 scope="remote" -->
+<dubbo:service interface="org.apache.dubbo.samples.local.api.DemoService" ref="target" scope="remote"/>
+<!-- 服务消费者指定 scope="local" -->
+<dubbo:reference id="demoService" interface="org.apache.dubbo.samples.local.api.DemoService" scope="local"/>
+```
+
+
+
+那么该程序中的 dubbo 调用将会失败,原因是服务提供方只暴露了远程服务到注册中心上,并没有暴露 *injvm* 协议的服务,而出于同一个进程中的服务消费者查找不到 *injvm* 协议的服务,也不会去远程的注册中心上订阅服务地址。同样的,当服务提供者限定 *scope="local"* 而服务消费者限定 *scope="remote"* 也会因为相同的原因导致调用失败。出错信息如下:
+
+
+
+```sh
+[20/03/19 05:03:18:018 CST] main  INFO config.AbstractConfig:  [DUBBO] Using injvm service org.apache.dubbo.samples.local.api.DemoService, dubbo version: 2.7.1, current host: 169.254.146.168
+Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demoService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: Failed to check the status of the service org.apache.dubbo.samples.local.api.DemoService. No provider available for the service org.apache.dubbo.samples.local.api.DemoService from the url injvm://127.0.0.1/org.apache.dubbo.samples.local.api.DemoService?applicati [...]
+```
+
+
+
+### 何时无法使用本地调用
+
+默认情况下,本地调用是自动开启的,不需要做额外的配置。只有当需要关闭的时候,才需要通过 *scope* 的配置来显式的关闭。
+
+
+
+但是,特别需要指出的是,在下面的几种情况下,本地调用是无法使用的:
+
+第一,泛化调用的时候无法使用本地调用。
+
+第二,消费者明确指定 URL 发起直连调用。当然,如果消费者指定的是 *injvm* 的 URL,最终的调用也是走本地调用的,比如:
+
+
+
+```xml
+<dubbo:reference id="demoService" interface="org.apache.dubbo.samples.local.api.DemoService" url="injvm://127.0.0.1/org.apache.dubbo.samples.local.api.DemoService"/>
+```
+
+
+
+### 强制打开本地调用
+
+除了通过 *scope* 来控制本地调用的行为之外,也可以通过 *injvm* 这个配置来强制打开或者禁用本地调用。
+
+
+
+```xml
+<dubbo:consumer injvm="false" .../>
+<dubbo:provider injvm="true" .../>
+```
+
+
+
+但是通过 *injvm* 来配置本地调用的方式已经被废弃。通过 *scope* 的方式来控制是官方推荐的。
+
+
+
+### 总结
+
+本文介绍了本地调用的概念以及带来的好处,并进一步的揭示了 dubbo 本地调用实际上是在当前进程中暴露了 *injvm* 的协议,而该协议并不会对外暴露端口,然后讨论了如何通过 *scope* 来细粒度的控制本地调用的行为,并强调了通过 *invjm* 来配置的方式已经被废弃,在未来版本中可能会被删除。
+
+
+
diff --git a/build/blog.js b/build/blog.js
index 296d9cf..513e61a 100644
--- a/build/blog.js
+++ b/build/blog.js
@@ -3,4 +3,4 @@
   Licensed under the MIT License (MIT), see
   http://jedwatson.github.io/classnames
 */
-!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r)&&r.length){var a=n.apply(null,r);a&&e.push(a)}else if("object"===o)for(var u in r)i.call(r,u)&&r[u]&&e.push(u)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";funct [...]
\ No newline at end of file
+!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r)&&r.length){var a=n.apply(null,r);a&&e.push(a)}else if("object"===o)for(var u in r)i.call(r,u)&&r[u]&&e.push(u)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";funct [...]
\ No newline at end of file
diff --git a/en-us/blog/dubbo-fescar.html b/en-us/blog/dubbo-fescar.html
index 2ce762b..0e96295 100644
--- a/en-us/blog/dubbo-fescar.html
+++ b/en-us/blog/dubbo-fescar.html
@@ -125,9 +125,10 @@ dubbo-storage-service.xml</p>
     <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xxx"</span> /&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xxx"</span> /&gt;</span>
 </code></pre>
-<h3>Step 2: Create UNDO_LOG table for Fescar</h3>
+<h3>Step 2: Create undo_log table for Fescar</h3>
 <p><code>UNDO_LOG</code> table is required by Fescar AT mode.</p>
-<pre><code class="language-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`undo_log`</span> (
+<pre><code class="language-sql"><span class="hljs-comment">-- Note that when Fescar version is upgraded to 0.3.0+, it is changed from the previous normal index to the unique index.</span>
+<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`undo_log`</span> (
   <span class="hljs-string">`id`</span> <span class="hljs-built_in">bigint</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
   <span class="hljs-string">`branch_id`</span> <span class="hljs-built_in">bigint</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
   <span class="hljs-string">`xid`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
@@ -137,8 +138,8 @@ dubbo-storage-service.xml</p>
   <span class="hljs-string">`log_modified`</span> datetime <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
   <span class="hljs-string">`ext`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
   PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>),
-  <span class="hljs-keyword">KEY</span> <span class="hljs-string">`idx_unionkey`</span> (<span class="hljs-string">`xid`</span>,<span class="hljs-string">`branch_id`</span>)
-) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">159</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8
+  <span class="hljs-keyword">UNIQUE</span> <span class="hljs-keyword">KEY</span> <span class="hljs-string">`ux_undo_log`</span> (<span class="hljs-string">`xid`</span>,<span class="hljs-string">`branch_id`</span>)
+) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">1</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;
 </code></pre>
 <h3>Step 3: Create tables for example business</h3>
 <pre><code class="language-sql">
diff --git a/en-us/blog/dubbo-fescar.json b/en-us/blog/dubbo-fescar.json
index 03c119c..cc8023a 100644
--- a/en-us/blog/dubbo-fescar.json
+++ b/en-us/blog/dubbo-fescar.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-fescar.md",
-  "__html": "<h1>How to use Fescar to ensure consistency between Dubbo Microservices</h1>\n<h2>Use case</h2>\n<p>A business logic for user purchasing commodities. The whole business logic is powered by 3 microservices:</p>\n<ul>\n<li>Storage service: deduct storage count on given commodity.</li>\n<li>Order service: create order according to purchase request.</li>\n<li>Account service: debit the balance of user's account.</li>\n</ul>\n<h3>Architecture</h3>\n<p><img src=\"../../img/blog/fe [...]
+  "__html": "<h1>How to use Fescar to ensure consistency between Dubbo Microservices</h1>\n<h2>Use case</h2>\n<p>A business logic for user purchasing commodities. The whole business logic is powered by 3 microservices:</p>\n<ul>\n<li>Storage service: deduct storage count on given commodity.</li>\n<li>Order service: create order according to purchase request.</li>\n<li>Account service: debit the balance of user's account.</li>\n</ul>\n<h3>Architecture</h3>\n<p><img src=\"../../img/blog/fe [...]
   "link": "/en-us/blog/dubbo-fescar.html",
   "meta": {
     "title": "How to use Fescar to ensure consistency between Dubbo Microservices",
diff --git a/en-us/blog/dubbo-new-async.html b/en-us/blog/dubbo-new-async.html
index 2c93556..7d64b95 100644
--- a/en-us/blog/dubbo-new-async.html
+++ b/en-us/blog/dubbo-new-async.html
@@ -13,7 +13,7 @@
 </head>
 <body>
 	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/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">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a hr [...]
-<p>Implementing the full asynchronous programming based on Dubbo, which is a new feature introduced in version 2.7.0 after the enhancement of the existing asynchronous mode.This article first reviews the supported functions and existing problems of asynchronization in 2.6.x and earlier versions, and introduces the targeted enhancements based on CompletableFuture in version 2.7.0. Then, the use of enhanced asynchronous programming is elaborated through several examples. Finally, it summar [...]
+<p>Implementing the full asynchronous programming based on Dubbo, which is a new feature introduced in version 2.7.0 after the enhancement of the existing asynchronous mode.This article first reviews the supported functions and existing problems of asynchronization in 2.6.x and earlier versions, and introduces the targeted enhancements based on CompletableFuture in version 2.7.0. Then, the use of enhanced asynchronous programming is elaborated through several examples. Finally, it summar [...]
 <h2>Asynchronous mode before version 2.6.x</h2>
 <p>Dubbo Provides some asynchronous programming capabilities in 2.6.x and earlier versions, including <a href="http://dubbo.apache.org/zh-cn/docs/user/demos/async-call.html">Asynchronous Call</a>, <a href="http://dubbo.apache.org/zh-cn/docs/user/demos/callback-parameter.html">Parameter Callback</a> and <a href="http://dubbo.apache.org/zh-cn/docs/user/demos/events-notify.html">Event Notification</a> on Consumer side. There are some brief introductions to the usage and Demo in the above do [...]
 <p>But the current asynchronous method has the following problems:</p>
@@ -118,7 +118,7 @@ public interface GrettingServiceAsync extends GreetingsService {
 <p>All of the above enhancements are based on the compatibility with existing asynchronous programming, so asynchronous programs written based on 2.6.x versions can be successfully compiled without any modification.</p>
 <p>Next, let's illustrate how to implement a fully asynchronous Dubbo service call chain through a few examples.</p>
 <h2>example 1:CompletableFuture interface</h2>
-<p>CompletableFuture interface can be used both for a synchronous call and for an asynchronous call on Consumer or Provider side. This example implements asynchronous calls between Consumer and Provider sides. Code link <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async-original-future">dubbo-samples-async-original-future</a>.</p>
+<p>CompletableFuture interface can be used both for a synchronous call and for an asynchronous call on Consumer or Provider side. This example implements asynchronous calls between Consumer and Provider sides. Code link <a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-original-future">dubbo-samples-async-original-future</a>.</p>
 <ol>
 <li>
 <p>Interface definition</p>
@@ -189,7 +189,7 @@ public interface GrettingServiceAsync extends GreetingsService {
 </li>
 </ol>
 <h2>Example 2:Synchronous interface uses Annotation Processor</h2>
-<p>This example demonstrates how to implement the Consumer-side asynchronous service call using the Annotation Processor based on the original synchronous interface. Code link <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future</a>.</p>
+<p>This example demonstrates how to implement the Consumer-side asynchronous service call using the Annotation Processor based on the original synchronous interface. Code link <a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future</a>.</p>
 <ol>
 <li>
 <p>Interface definition</p>
@@ -279,7 +279,7 @@ CompletableFuture&lt;java.lang.String&gt; sayHiAsync(java.lang.String name);
 </li>
 </ol>
 <h2>Example 3:Use AsyncContext</h2>
-<p>This example demonstrates how to implement the Provider-side asynchronous execution through AsyncContext based on the original synchronous interface. Code link <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async-provider">dubbo-samples-async-provider</a>.</p>
+<p>This example demonstrates how to implement the Provider-side asynchronous execution through AsyncContext based on the original synchronous interface. Code link <a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-provider">dubbo-samples-async-provider</a>.</p>
 <ol>
 <li>
 <p>Interface definition</p>
diff --git a/en-us/blog/dubbo-new-async.json b/en-us/blog/dubbo-new-async.json
index 970aa1e..cfa4d89 100644
--- a/en-us/blog/dubbo-new-async.json
+++ b/en-us/blog/dubbo-new-async.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-new-async.md",
-  "__html": "<h1>How to implement a fully asynchronous calls chain based on Dubbo</h1>\n<p>Implementing the full asynchronous programming based on Dubbo, which is a new feature introduced in version 2.7.0 after the enhancement of the existing asynchronous mode.This article first reviews the supported functions and existing problems of asynchronization in 2.6.x and earlier versions, and introduces the targeted enhancements based on CompletableFuture in version 2.7.0. Then, the use of enha [...]
+  "__html": "<h1>How to implement a fully asynchronous calls chain based on Dubbo</h1>\n<p>Implementing the full asynchronous programming based on Dubbo, which is a new feature introduced in version 2.7.0 after the enhancement of the existing asynchronous mode.This article first reviews the supported functions and existing problems of asynchronization in 2.6.x and earlier versions, and introduces the targeted enhancements based on CompletableFuture in version 2.7.0. Then, the use of enha [...]
   "link": "/en-us/blog/dubbo-new-async.html",
   "meta": {
     "title": "How to implement a fully asynchronous calls chain based on Dubbo",
diff --git a/img/blog/dubbo-local-call-filter.png b/img/blog/dubbo-local-call-filter.png
new file mode 100644
index 0000000..0e45d34
Binary files /dev/null and b/img/blog/dubbo-local-call-filter.png differ
diff --git a/md_json/blog.json b/md_json/blog.json
index 204523a..6a4f077 100644
--- a/md_json/blog.json
+++ b/md_json/blog.json
@@ -417,6 +417,11 @@
       }
     },
     {
+      "filename": "dubbo-local-call.md",
+      "link": "/zh-cn/blog/dubbo-local-call.html",
+      "meta": {}
+    },
+    {
       "filename": "dubbo-meet-arthas.md",
       "link": "/zh-cn/blog/dubbo-meet-arthas.html",
       "meta": {
diff --git a/site_config/blog.js b/site_config/blog.js
index 9298428..e853fe8 100644
--- a/site_config/blog.js
+++ b/site_config/blog.js
@@ -163,6 +163,13 @@ export default {
     barText: '博客',
     postsTitle: '所有文章',
     list: [
+      {
+        title: 'Dubbo 本地调用',
+        author: '@beiwei30',
+        dateStr: 'Mar 20th, 2019',
+        desc: 'Dubbo 本地调用的概念和用法',
+        link: '/zh-cn/blog/dubbo-local-call.html',
+    },
         {
             title: 'Dubbo优雅停机介绍',
             author: '@guohao',
diff --git a/zh-cn/blog/dubbo-fescar.html b/zh-cn/blog/dubbo-fescar.html
index 333f8e2..d71588a 100644
--- a/zh-cn/blog/dubbo-fescar.html
+++ b/zh-cn/blog/dubbo-fescar.html
@@ -125,9 +125,10 @@ dubbo-storage-service.xml</p>
     <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xxx"</span> /&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xxx"</span> /&gt;</span>
 </code></pre>
-<h3>Step 2: 为 Fescar 创建 UNDO_LOG 表</h3>
+<h3>Step 2: 为 Fescar 创建 undo_log 表</h3>
 <p><code>UNDO_LOG</code> 此表用于 Fescar 的AT模式。</p>
-<pre><code class="language-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`undo_log`</span> (
+<pre><code class="language-sql"><span class="hljs-comment">-- 注意当 Fescar 版本升级至 0.3.0+ 将由之前的普通索引变更为唯一索引。</span>
+<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`undo_log`</span> (
   <span class="hljs-string">`id`</span> <span class="hljs-built_in">bigint</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
   <span class="hljs-string">`branch_id`</span> <span class="hljs-built_in">bigint</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
   <span class="hljs-string">`xid`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
@@ -137,8 +138,8 @@ dubbo-storage-service.xml</p>
   <span class="hljs-string">`log_modified`</span> datetime <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
   <span class="hljs-string">`ext`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
   PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>),
-  <span class="hljs-keyword">KEY</span> <span class="hljs-string">`idx_unionkey`</span> (<span class="hljs-string">`xid`</span>,<span class="hljs-string">`branch_id`</span>)
-) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">159</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8
+  <span class="hljs-keyword">UNIQUE</span> <span class="hljs-keyword">KEY</span> <span class="hljs-string">`ux_undo_log`</span> (<span class="hljs-string">`xid`</span>,<span class="hljs-string">`branch_id`</span>)
+) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">1</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;
 </code></pre>
 <h3>Step 3: 创建相关业务表</h3>
 <pre><code class="language-sql">
diff --git a/zh-cn/blog/dubbo-fescar.json b/zh-cn/blog/dubbo-fescar.json
index 02370c2..26b1384 100644
--- a/zh-cn/blog/dubbo-fescar.json
+++ b/zh-cn/blog/dubbo-fescar.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-fescar.md",
-  "__html": "<h1>如何使用Fescar保证Dubbo微服务间的一致性</h1>\n<h2>案例</h2>\n<p>用户采购商品业务,整个业务包含3个微服务:</p>\n<ul>\n<li>库存服务: 扣减给定商品的库存数量。</li>\n<li>订单服务: 根据采购请求生成订单。</li>\n<li>账户服务: 用户账户金额扣减。</li>\n</ul>\n<h3>业务结构图</h3>\n<p><img src=\"../../img/blog/fescar/fescar-1.png\" alt=\"Architecture\"></p>\n<h3>StorageService</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Storage [...]
+  "__html": "<h1>如何使用Fescar保证Dubbo微服务间的一致性</h1>\n<h2>案例</h2>\n<p>用户采购商品业务,整个业务包含3个微服务:</p>\n<ul>\n<li>库存服务: 扣减给定商品的库存数量。</li>\n<li>订单服务: 根据采购请求生成订单。</li>\n<li>账户服务: 用户账户金额扣减。</li>\n</ul>\n<h3>业务结构图</h3>\n<p><img src=\"../../img/blog/fescar/fescar-1.png\" alt=\"Architecture\"></p>\n<h3>StorageService</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Storage [...]
   "link": "/zh-cn/blog/dubbo-fescar.html",
   "meta": {
     "title": "如何使用Fescar保证Dubbo微服务间的一致性",
diff --git a/zh-cn/blog/dubbo-local-call.html b/zh-cn/blog/dubbo-local-call.html
new file mode 100644
index 0000000..e469bba
--- /dev/null
+++ b/zh-cn/blog/dubbo-local-call.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<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="dubbo-local-call" />
+	<meta name="description" content="dubbo-local-call" />
+	<!-- 网页标签标题 -->
+	<title>dubbo-local-call</title>
+	<link rel="shortcut icon" href="/img/dubbo.ico"/>
+	<link rel="stylesheet" href="/build/blogDetail.css" />
+</head>
+<body>
+	<div id="root"><div class="blog-detail-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 h [...]
+<h3>本地调用介绍</h3>
+<p>当一个应用既是一个服务的提供者,同时也是这个服务的消费者的时候,可以直接对本机提供的服务发起本地调用。从 <code>2.2.0</code> 版本开始,Dubbo 默认在本地以 <em>injvm</em> 的方式暴露服务,这样的话,在同一个进程里对这个服务的调用会优先走本地调用。</p>
+<p>与本地对象上方法调用不同的是,Dubbo 本地调用会经过 Filter 链,其中包括了 Consumer 端的 Filter 链以及 Provider 端的 Filter 链。通过这样的机制,本地消费者和其他消费者都是统一对待,统一监控,服务统一进行治理。</p>
+<p><img src="../../img/blog/dubbo-local-call-filter.png" alt="filter-chain"></p>
+<p>同时,相比于远程调用来说,Dubbo 本地调用性能较优,省去了请求、响应的编解码及网络传输的过程。</p>
+<p>要使用 Dubbo 本地调用不需做特殊配置,按正常 Dubbo 服务暴露服务即可。任一服务在暴露远程服务的同时,也会同时以 <em>injvm</em> 的协议暴露本地服务。<em>injvm</em> 是一个伪协议,不会像其他协议那样对外开启端口,只用于本地调用的目的。</p>
+<p>以下面的 XML 配置为例:</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:protocol</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dubbo"</span> <span class="hljs-attr">port</span>=<span class="hljs-string">"20800"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoServiceTarget"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.impl.DemoServiceImpl"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"demoServiceTarget"</span>/&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span>/&gt;</span>
+</code></pre>
+<p>这里同时配置了同一服务 <em>DemoService</em> 的提供者以及消费者。在这种情况下,该应用中的 <em>DemoService</em> 的消费方会优先使用 <em>injvm</em> 协议进行本地调用。上述的例子可以在 dubbo-samples 工程中找到源码:<a href="https://github.com/apache/incubator-dubbo-samples/blob/master/dubbo-samples-local">https://github.com/apache/incubator-dubbo-samples/blob/master/dubbo-samples-local</a></p>
+<h3>细粒度控制本地调用</h3>
+<p>本地调用是可以显示关闭的,通过这种方式,服务提供者可以做到对远端服务消费者和本地消费者一视同仁。具体做法是通过 <em>scope=&quot;remote&quot;</em> 来关闭 <em>injvm</em> 协议的暴露,这样,即使是本地调用者,也需要从注册中心上获取服务地址列表,然后才能发起调用,而这个时候的调用过程,与远端的服务消费者的过程是一致的。</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"target"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.impl.DemoServiceImpl"</span>/&gt;</span>
+<span class="hljs-comment">&lt;!-- 服务提供者指定 scope="remote" --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"target"</span> <span class="hljs-attr">scope</span>=<span class="hljs-string">"remote"</span>/&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span>/&gt;</span>
+</code></pre>
+<p>同样的,服务消费者也支持通过 <em>scope</em> 来限定发起调用优先走本地,还是只走远程。比如,可以通过以下的方式强制消费端通过<strong>远程调用</strong>的方式来发起 dubbo 调用:</p>
+<pre><code class="language-xml"><span class="hljs-comment">&lt;!-- 服务消费者指定 scope="remote" --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span> <span class="hljs-attr">scope</span>=<span class="hljs-string">"remote"</span>/&gt;</span>
+</code></pre>
+<p>如果同时服务提供方限定了 <em>scope=&quot;local&quot;</em> 的话,</p>
+<pre><code class="language-xml"><span class="hljs-comment">&lt;!-- 服务提供者指定 scope="remote" --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"target"</span> <span class="hljs-attr">scope</span>=<span class="hljs-string">"remote"</span>/&gt;</span>
+<span class="hljs-comment">&lt;!-- 服务消费者指定 scope="local" --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span> <span class="hljs-attr">scope</span>=<span class="hljs-string">"local"</span>/&gt;</span>
+</code></pre>
+<p>那么该程序中的 dubbo 调用将会失败,原因是服务提供方只暴露了远程服务到注册中心上,并没有暴露 <em>injvm</em> 协议的服务,而出于同一个进程中的服务消费者查找不到 <em>injvm</em> 协议的服务,也不会去远程的注册中心上订阅服务地址。同样的,当服务提供者限定 <em>scope=&quot;local&quot;</em> 而服务消费者限定 <em>scope=&quot;remote&quot;</em> 也会因为相同的原因导致调用失败。出错信息如下:</p>
+<pre><code class="language-sh">[20/03/19 05:03:18:018 CST] main  INFO config.AbstractConfig:  [DUBBO] Using injvm service org.apache.dubbo.samples.local.api.DemoService, dubbo version: 2.7.1, current host: 169.254.146.168
+Exception <span class="hljs-keyword">in</span> thread <span class="hljs-string">"main"</span> org.springframework.beans.factory.BeanCreationException: Error creating bean with name <span class="hljs-string">'demoService'</span>: FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: Failed to check the status of the service org.apache.dubbo.samples.local.api.DemoService. No provider available <span class="hljs-keyword">for</span> the service  [...]
+</code></pre>
+<h3>何时无法使用本地调用</h3>
+<p>默认情况下,本地调用是自动开启的,不需要做额外的配置。只有当需要关闭的时候,才需要通过 <em>scope</em> 的配置来显式的关闭。</p>
+<p>但是,特别需要指出的是,在下面的几种情况下,本地调用是无法使用的:</p>
+<p>第一,泛化调用的时候无法使用本地调用。</p>
+<p>第二,消费者明确指定 URL 发起直连调用。当然,如果消费者指定的是 <em>injvm</em> 的 URL,最终的调用也是走本地调用的,比如:</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.samples.local.api.DemoService"</span> <span class="hljs-attr">url</span>=<span class="hljs-string">"injvm://127.0.0.1/org.apache.dubbo.samples.local.api.DemoService"</span>/&gt;</span>
+</code></pre>
+<h3>强制打开本地调用</h3>
+<p>除了通过 <em>scope</em> 来控制本地调用的行为之外,也可以通过 <em>injvm</em> 这个配置来强制打开或者禁用本地调用。</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:consumer</span> <span class="hljs-attr">injvm</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">...</span>/&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:provider</span> <span class="hljs-attr">injvm</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">...</span>/&gt;</span>
+</code></pre>
+<p>但是通过 <em>injvm</em> 来配置本地调用的方式已经被废弃。通过 <em>scope</em> 的方式来控制是官方推荐的。</p>
+<h3>总结</h3>
+<p>本文介绍了本地调用的概念以及带来的好处,并进一步的揭示了 dubbo 本地调用实际上是在当前进程中暴露了 <em>injvm</em> 的协议,而该协议并不会对外暴露端口,然后讨论了如何通过 <em>scope</em> 来细粒度的控制本地调用的行为,并强调了通过 <em>invjm</em> 来配置的方式已经被废弃,在未来版本中可能会被删除。</p>
+</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>Disclaimer</h3><p>Apache Dubbo is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making proce [...]
+	<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>
+	<script>
+		window.rootPath = '';
+  </script>
+  <script src="/build/blogDetail.js"></script>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112489517-1"></script>
+	<script>
+		window.dataLayer = window.dataLayer || [];
+		function gtag(){dataLayer.push(arguments);}
+		gtag('js', new Date());
+
+		gtag('config', 'UA-112489517-1');
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-local-call.json b/zh-cn/blog/dubbo-local-call.json
new file mode 100644
index 0000000..a5cbb6e
--- /dev/null
+++ b/zh-cn/blog/dubbo-local-call.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-local-call.md",
+  "__html": "<h1>本地调用</h1>\n<h3>本地调用介绍</h3>\n<p>当一个应用既是一个服务的提供者,同时也是这个服务的消费者的时候,可以直接对本机提供的服务发起本地调用。从 <code>2.2.0</code> 版本开始,Dubbo 默认在本地以 <em>injvm</em> 的方式暴露服务,这样的话,在同一个进程里对这个服务的调用会优先走本地调用。</p>\n<p>与本地对象上方法调用不同的是,Dubbo 本地调用会经过 Filter 链,其中包括了 Consumer 端的 Filter 链以及 Provider 端的 Filter 链。通过这样的机制,本地消费者和其他消费者都是统一对待,统一监控,服务统一进行治理。</p>\n<p><img src=\"../../img/blog/dubbo-local-call-filter.png\" alt=\"filter-chain\"></p>\n<p>同时,相比于远程调用来说,Dubbo 本地调用性能较优,省去了请求、响应的编解码及网络传输的过程。</p>\n<p>要使用 Dubbo 本地 [...]
+  "link": "/zh-cn/blog/dubbo-local-call.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-new-async.html b/zh-cn/blog/dubbo-new-async.html
index ccc14a8..7322b02 100644
--- a/zh-cn/blog/dubbo-new-async.html
+++ b/zh-cn/blog/dubbo-new-async.html
@@ -189,7 +189,7 @@ public interface GrettingServiceAsync extends GreetingsService {
 </li>
 </ol>
 <h2>示例2:同步接口使用Annotation Processor</h2>
-<p>这个示例演示了如何在只定义同步接口的基础上,使用Annotation Processor实现Consumer端异步方服务调用,具体代码参见地址<a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future</a></p>
+<p>这个示例演示了如何在只定义同步接口的基础上,使用Annotation Processor实现Consumer端异步方服务调用,具体代码参见地址<a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future</a></p>
 <ol>
 <li>
 <p>定义接口</p>
@@ -279,7 +279,7 @@ CompletableFuture&lt;java.lang.String&gt; sayHiAsync(java.lang.String name);
 </li>
 </ol>
 <h2>示例3:使用AsyncContext</h2>
-<p>本示例演示了如何在同步接口的基础上,通过AsyncContext实现Provider端异步执行,示例代码参见<a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async-provider">dubbo-samples-async-provider</a>。</p>
+<p>本示例演示了如何在同步接口的基础上,通过AsyncContext实现Provider端异步执行,示例代码参见<a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-provider">dubbo-samples-async-provider</a>。</p>
 <ol>
 <li>
 <p>定义接口</p>
diff --git a/zh-cn/blog/dubbo-new-async.json b/zh-cn/blog/dubbo-new-async.json
index 82d6082..7283297 100644
--- a/zh-cn/blog/dubbo-new-async.json
+++ b/zh-cn/blog/dubbo-new-async.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-new-async.md",
-  "__html": "<h1>如何基于Dubbo实现全异步调用链</h1>\n<p>基于Dubbo实现全异步编程,是在2.7.0版本中对现有异步方式增强后新引入的功能。本文先是回顾2.6.x及之前版本对异步的支持情况及存在的问题,引出了2.7.0版本基于CompletableFuture做了哪些针对性的增强,通过几个示例详细阐述了增强后的异步编程的使用方式,最后总结了引入异步模式带来的新问题及Dubbo的解决方法。通过阅读这篇文章,可以很容易的基于Dubbo2.7.0+版本实现一个全异步的远程服务调用链路。</p>\n<h2>2.6.x版本之前的异步方式</h2>\n<p>在2.6.x及之前的版本提供了一定的异步编程能力,包括Consumer端<a href=\"http://dubbo.apache.org/zh-cn/docs/user/demos/async-call.html\">异步调用</a>、<a href=\"http://dubbo.apache.org/zh-cn/docs/user/demos/callback-parameter.html\" [...]
+  "__html": "<h1>如何基于Dubbo实现全异步调用链</h1>\n<p>基于Dubbo实现全异步编程,是在2.7.0版本中对现有异步方式增强后新引入的功能。本文先是回顾2.6.x及之前版本对异步的支持情况及存在的问题,引出了2.7.0版本基于CompletableFuture做了哪些针对性的增强,通过几个示例详细阐述了增强后的异步编程的使用方式,最后总结了引入异步模式带来的新问题及Dubbo的解决方法。通过阅读这篇文章,可以很容易的基于Dubbo2.7.0+版本实现一个全异步的远程服务调用链路。</p>\n<h2>2.6.x版本之前的异步方式</h2>\n<p>在2.6.x及之前的版本提供了一定的异步编程能力,包括Consumer端<a href=\"http://dubbo.apache.org/zh-cn/docs/user/demos/async-call.html\">异步调用</a>、<a href=\"http://dubbo.apache.org/zh-cn/docs/user/demos/callback-parameter.html\" [...]
   "link": "/zh-cn/blog/dubbo-new-async.html",
   "meta": {
     "title": "如何基于Dubbo实现全异步调用链",
diff --git a/zh-cn/blog/index.html b/zh-cn/blog/index.html
index fb26f85..b999a85 100644
--- a/zh-cn/blog/index.html
+++ b/zh-cn/blog/index.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/blog.css" />
 </head>
 <body>
-	<div id="root"><div class="blog-list-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 hre [...]
+	<div id="root"><div class="blog-list-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 hre [...]
 	<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>
 	<script>