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 2018/12/17 15:29:25 UTC

[incubator-dubbo-website] 01/03: update rest doc

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

commit 2ac9bc4e4a35afb81e0adb7cc3538332b4336605
Author: beiwei30 <ia...@gmail.com>
AuthorDate: Mon Dec 17 23:27:43 2018 +0800

    update rest doc
---
 build/blog.js                           |   6 +-
 build/blogDetail.js                     |   6 +-
 build/community.js                      |   6 +-
 build/documentation.js                  |   6 +-
 build/home.js                           |   6 +-
 docs/zh-cn/user/rest.md                 |  20 +-
 docs/zh-cn/user/sources/images/rest.jpg | Bin 0 -> 206610 bytes
 docs/zh-cn/user/sources/images/rt.png   | Bin 0 -> 31098 bytes
 docs/zh-cn/user/sources/images/tps.png  | Bin 0 -> 33114 bytes
 en-us/docs/developers/guide_dev.html    |   8 +
 en-us/docs/developers/guide_dev.json    |   2 +-
 md_json/blog.json                       |   9 +
 zh-cn/blog/dubbo-meet-arthas.html       | 325 ++++++++++++++++++++++++++++++++
 zh-cn/blog/dubbo-meet-arthas.json       |  10 +
 zh-cn/blog/index.html                   |   2 +-
 zh-cn/docs/developers/guide_dev.html    |   9 +
 zh-cn/docs/developers/guide_dev.json    |   2 +-
 zh-cn/docs/user/rest.html               |  20 +-
 zh-cn/docs/user/rest.json               |   2 +-
 19 files changed, 393 insertions(+), 46 deletions(-)

diff --git a/build/blog.js b/build/blog.js
index 98a7e59..bcf8732 100644
--- a/build/blog.js
+++ b/build/blog.js
@@ -1,6 +1,6 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=80) [...]
-  Copyright (c) 2016 Jed Watson.
+!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=78) [...]
+  Copyright (c) 2017 Jed Watson.
   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))e.push(n.apply(null,r));else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,u= [...]
\ 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/build/blogDetail.js b/build/blogDetail.js
index d737c9f..ec5b66b 100644
--- a/build/blogDetail.js
+++ b/build/blogDetail.js
@@ -1,6 +1,6 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=81) [...]
-  Copyright (c) 2016 Jed Watson.
+!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=79) [...]
+  Copyright (c) 2017 Jed Watson.
   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))e.push(n.apply(null,r));else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,u= [...]
\ 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/build/community.js b/build/community.js
index 9b45e1b..4704938 100644
--- a/build/community.js
+++ b/build/community.js
@@ -1,6 +1,6 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=82) [...]
-  Copyright (c) 2016 Jed Watson.
+!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=80) [...]
+  Copyright (c) 2017 Jed Watson.
   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))e.push(n.apply(null,r));else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,l= [...]
\ 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 l in r)i.call(r,l)&&r[l]&&e.push(l)}}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/build/documentation.js b/build/documentation.js
index 6637d67..b1330c7 100644
--- a/build/documentation.js
+++ b/build/documentation.js
@@ -1,6 +1,6 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=83) [...]
-  Copyright (c) 2016 Jed Watson.
+!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=81) [...]
+  Copyright (c) 2017 Jed Watson.
   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))e.push(n.apply(null,r));else if("object"===o)for(var l in r)i.call(r,l)&&r[l]&&e.push(l)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,a= [...]
\ 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 l=n.apply(null,r);l&&e.push(l)}else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}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/build/home.js b/build/home.js
index cbb9bf5..d580bc6 100644
--- a/build/home.js
+++ b/build/home.js
@@ -1,6 +1,6 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=84) [...]
-  Copyright (c) 2016 Jed Watson.
+!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=82) [...]
+  Copyright (c) 2017 Jed Watson.
   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))e.push(n.apply(null,r));else if("object"===o)for(var i in r)a.call(r,i)&&r[i]&&e.push(i)}}return e.join(" ")}var a={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,u= [...]
\ 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 i=n.apply(null,r);i&&e.push(i)}else if("object"===o)for(var u in r)a.call(r,u)&&r[u]&&e.push(u)}}return e.join(" ")}var a={}.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/docs/zh-cn/user/rest.md b/docs/zh-cn/user/rest.md
index 3c07479..aac7e9b 100644
--- a/docs/zh-cn/user/rest.md
+++ b/docs/zh-cn/user/rest.md
@@ -113,7 +113,7 @@ dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp
 需要指出的是,我认为1~3是dubbo的REST调用最有价值的三种应用场景,并且我们为dubbo添加REST调用,其最主要到目的也是面向服务的提供端,即开发REST服务来提供给非dubbo的(异构)消费端。
 
 归纳起来,所有应用场景如下图所示:
-![no image found](images/rest.jpg)
+![no image found](sources/images/rest.jpg)
 
 借用Java过去最流行的宣传语,为dubbo添加REST调用后,可以实现服务的”一次编写,到处访问“,理论上可以面向全世界开放,从而真正实现比较理想化的面向服务架构(SOA)。
 
@@ -1142,9 +1142,9 @@ TODO
 | Dubbo: hessian2 | 1.49 | 6701 |
 | Dubbo: fastjson | 1.572 | 6352 |
 
-![no image found](images/rt.png)
+![no image found](sources/images/rt.png)
 
-![no image found](images/tps.png)
+![no image found](sources/images/tps.png)
 
 
 仅就目前的结果,一点简单总结:
@@ -1188,19 +1188,19 @@ TODO
 初步看法,摘自http://www.infoq.com/cn/news/2014/10/dubbox-open-source?utm_source=infoq&utm_medium=popular_links_homepage#theCommentsSection
 
 > 谢谢,对于jax-rs和spring mvc,其实我对spring mvc的rest支持还没有太深入的看过,说点初步想法,请大家指正:
-
+>
 > spring mvc也支持annotation的配置,其实和jax-rs看起来是非常非常类似的。
-
+>
 > 我个人认为spring mvc相对更适合于面向web应用的restful服务,比如被AJAX调用,也可能输出HTML之类的,应用中还有页面跳转流程之类,spring mvc既可以做好正常的web页面请求也可以同时处理rest请求。但总的来说这个restful服务是在展现层或者叫web层之类实现的
-
+>
 > 而jax-rs相对更适合纯粹的服务化应用,也就是传统Java EE中所说的中间层服务,比如它可以把传统的EJB发布成restful服务。在spring应用中,也就把spring中充当service之类的bean直接发布成restful服务。总的来说这个restful服务是在业务、应用层或者facade层。而MVC层次和概念在这种做比如(后台)服务化的应用中通常是没有多大价值的。
-
+>
 > 当然jax-rs的有些实现比如jersey,也试图提供mvc支持,以更好的适应上面所说的web应用,但应该是不如spring mvc。
-
+>
 > 在dubbo应用中,我想很多人都比较喜欢直接将一个本地的spring service bean(或者叫manager之类的)完全透明的发布成远程服务,则这里用JAX-RS是更自然更直接的,不必额外的引入MVC概念。当然,先不讨论透明发布远程服务是不是最佳实践,要不要添加facade之类。
-
+>
 > 当然,我知道在dubbo不支持rest的情况下,很多朋友采用的架构是spring mvc restful调用dubbo (spring) service来发布restful服务的。这种方式我觉得也非常好,只是如果不修改spring mvc并将其与dubbo深度集成,restful服务不能像dubbo中的其他远程调用协议比如webservices、dubbo rpc、hessian等等那样,享受诸多高级的服务治理的功能,比如:注册到dubbo的服务注册中心,通过dubbo监控中心监控其调用次数、TPS、响应时间之类,通过dubbo的统一的配置方式控制其比如线程池大小、最大连接数等等,通过dubbo统一方式做服务流量控制、权限控制、频次控制。另外spring mvc仅仅负责服务端,而在消费端,通常是用spring restTemplate,如果restTemplate不和dubbo集成,有可能像dubbo服务客户端那样自动或者人工干预做服务降级。如果服务端消费端都是dubbo系统,通过spring的rest交互,如果spri
 ng rest不深度整合dubbo,则不能用d [...]
-
+>
 > 当然,其实我个人认为这些东西不必要非此即彼的。我听说spring创始人rod johnson总是爱说一句话,the customer is always right,其实与其非要探讨哪种方式更好,不如同时支持两种方式就是了,所以原来在文档中也写过计划支持spring rest annoation,只是不知道具体可行性有多高。
 
 ## 未来
diff --git a/docs/zh-cn/user/sources/images/rest.jpg b/docs/zh-cn/user/sources/images/rest.jpg
new file mode 100644
index 0000000..99a1b5b
Binary files /dev/null and b/docs/zh-cn/user/sources/images/rest.jpg differ
diff --git a/docs/zh-cn/user/sources/images/rt.png b/docs/zh-cn/user/sources/images/rt.png
new file mode 100644
index 0000000..dd8f4cd
Binary files /dev/null and b/docs/zh-cn/user/sources/images/rt.png differ
diff --git a/docs/zh-cn/user/sources/images/tps.png b/docs/zh-cn/user/sources/images/tps.png
new file mode 100644
index 0000000..20cc857
Binary files /dev/null and b/docs/zh-cn/user/sources/images/tps.png differ
diff --git a/en-us/docs/developers/guide_dev.html b/en-us/docs/developers/guide_dev.html
index b433ac6..2e26f00 100644
--- a/en-us/docs/developers/guide_dev.html
+++ b/en-us/docs/developers/guide_dev.html
@@ -79,6 +79,14 @@ git push origin your_awesome_patch
 <h3>Code style</h3>
 <p>We provide a template file <a href="https://github.com/apache/incubator-dubbo/tree/master/codestyle/dubbo_codestyle_for_idea.xml">dubbo_codestyle_for_idea.xml</a> for IntelliJ idea, you can import it to you IDE.
 If you use Eclipse you can config manually by referencing the same file.</p>
+<p><strong>NOTICE</strong></p>
+<p>It is very important to set the dubbo_codestyle_for_idea.xml, otherwise you will fail to pass the Travis CI. Steps to set the code style are as below:</p>
+<ol>
+<li>Enter <code>Editor &gt; Code Style</code></li>
+<li>To manage a code style scheme, in the Code Style page, select the desired scheme from the drop-down list, and click <img src="/img/manage_profiles.png" alt="manage profiles">.
+From the drop-down list, select <code>Import Scheme</code>, then select this option <code>IntelliJ IDEA code style XML</code> to import scheme</li>
+<li>In the Scheme field, type the name of the new scheme and press ⏎ to save the changes.</li>
+</ol>
 </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>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 [...]
 	<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/en-us/docs/developers/guide_dev.json b/en-us/docs/developers/guide_dev.json
index ef68c4d..7433265 100644
--- a/en-us/docs/developers/guide_dev.json
+++ b/en-us/docs/developers/guide_dev.json
@@ -1,6 +1,6 @@
 {
   "filename": "guide_dev.md",
-  "__html": "<h2>Contributing to Dubbo</h2>\n<p>Dubbo is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into master. If you want to contribute even something trivial please do not hesitate, but follow the guidelines below.</p>\n<h3>Sign the Contributor License Agreement</h3>\n<p>Before we accept a non-trivial patch or pull request we will need you to sign the Contribu [...]
+  "__html": "<h2>Contributing to Dubbo</h2>\n<p>Dubbo is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into master. If you want to contribute even something trivial please do not hesitate, but follow the guidelines below.</p>\n<h3>Sign the Contributor License Agreement</h3>\n<p>Before we accept a non-trivial patch or pull request we will need you to sign the Contribu [...]
   "link": "/en-us/docs/developers/guide_dev.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/md_json/blog.json b/md_json/blog.json
index cd02a27..fc90a41 100644
--- a/md_json/blog.json
+++ b/md_json/blog.json
@@ -311,6 +311,15 @@
       }
     },
     {
+      "filename": "dubbo-meet-arthas.md",
+      "link": "/zh-cn/blog/dubbo-meet-arthas.html",
+      "meta": {
+        "title": "当Dubbo遇上Arthas:排查问题的实践",
+        "keywords": "Dubbo, Arthas",
+        "description": "使用Alibaba开源的应用诊断利器Arthas来排查Dubbo应用的问题。"
+      }
+    },
+    {
       "filename": "dubbo-meetup-beijing-may-12th-2018.md",
       "link": "/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.html",
       "meta": {
diff --git a/zh-cn/blog/dubbo-meet-arthas.html b/zh-cn/blog/dubbo-meet-arthas.html
new file mode 100644
index 0000000..671a786
--- /dev/null
+++ b/zh-cn/blog/dubbo-meet-arthas.html
@@ -0,0 +1,325 @@
+<!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, Arthas" />
+	<meta name="description" content="使用Alibaba开源的应用诊断利器Arthas来排查Dubbo应用的问题。" />
+	<!-- 网页标签标题 -->
+	<title>当Dubbo遇上Arthas:排查问题的实践</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 [...]
+<p>Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。</p>
+<ul>
+<li>Github: <a href="https://github.com/apache/incubator-dubbo">https://github.com/apache/incubator-dubbo</a></li>
+<li>文档:<a href="http://dubbo.incubator.apache.org/zh-cn/">http://dubbo.incubator.apache.org/zh-cn/</a></li>
+</ul>
+<p>Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。</p>
+<ul>
+<li>Github: <a href="https://github.com/alibaba/arthas">https://github.com/alibaba/arthas</a></li>
+<li>文档:<a href="https://alibaba.github.io/arthas/">https://alibaba.github.io/arthas/</a></li>
+<li>Arthas开源交流QQ群: 916328269</li>
+<li>Arthas开源交流钉钉群: 21965291</li>
+</ul>
+<p>当Dubbo遇上Arthas,会碰撞出什么样的火花呢?下面来分享Arthas排查Dubbo问题的一些经验。</p>
+<h3>dubbo-arthas-demo</h3>
+<p>下面的排查分享基于这个<code>dubbo-arthas-demo</code>,非常简单的一个应用,浏览器请求从Spring MVC到Dubbo Client,再发送到Dubbo Server。</p>
+<p>Demo里有两个spring boot应用,可以先启动<code>server-demo</code>,再启动<code>client-demo</code>。</p>
+<ul>
+<li><a href="https://github.com/hengyunabc/dubbo-arthas-demo">https://github.com/hengyunabc/dubbo-arthas-demo</a></li>
+</ul>
+<pre><code>  /user/{id}    -&gt;   UserService    -&gt;   UserServiceImpl 
+   Browser           Dubbo Client          Dubbo Server
+</code></pre>
+<p>Client端:</p>
+<pre><code class="language-java"><span class="hljs-meta">@RestController</span>
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserController</span> </span>{
+
+	<span class="hljs-meta">@Reference</span>(version = <span class="hljs-string">"1.0.0"</span>)
+	<span class="hljs-keyword">private</span> UserService userService;
+
+	<span class="hljs-meta">@GetMapping</span>(<span class="hljs-string">"/user/{id}"</span>)
+	<span class="hljs-function"><span class="hljs-keyword">public</span> User <span class="hljs-title">findUserById</span><span class="hljs-params">(@PathVariable Integer id)</span> </span>{
+		<span class="hljs-keyword">return</span> userService.findUser(id);
+	}
+</code></pre>
+<p>Server端:</p>
+<pre><code class="language-java"><span class="hljs-meta">@Service</span>(version = <span class="hljs-string">"1.0.0"</span>)
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">UserService</span> </span>{
+	<span class="hljs-meta">@Override</span>
+	<span class="hljs-function"><span class="hljs-keyword">public</span> User <span class="hljs-title">findUser</span><span class="hljs-params">(<span class="hljs-keyword">int</span> id)</span> </span>{
+		<span class="hljs-keyword">if</span> (id &lt; <span class="hljs-number">1</span>) {
+			<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"user id &lt; 1, id: "</span> + id);
+		}
+		<span class="hljs-keyword">for</span> (User user : users) {
+			<span class="hljs-keyword">if</span> (user.getId() == id) {
+				<span class="hljs-keyword">return</span> user;
+			}
+		}
+		<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"Can not find user, id: "</span> + id);
+	}
+</code></pre>
+<h3>Arthas快速开始</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/install-detail.html">https://alibaba.github.io/arthas/install-detail.html</a></li>
+</ul>
+<pre><code class="language-bash">$ wget https://alibaba.github.io/arthas/arthas-boot.jar
+$ java -jar arthas-boot.jar
+</code></pre>
+<p>启动后,会列出所有的java进程,选择1,然后回车,就会连接上<code>ServerDemoApplication</code></p>
+<pre><code class="language-bash">$ java -jar arthas-boot.jar
+* [1]: 43523 ServerDemoApplication
+  [2]: 22342
+  [3]: 44108 ClientDemoApplication
+1
+[INFO] arthas home: /Users/hengyunabc/.arthas/lib/3.0.5/arthas
+[INFO] Try to attach process 43523
+[INFO] Attach process 43523 success.
+[INFO] arthas-client connect 127.0.0.1 3658
+  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
+ /  O  \ |  .--. <span class="hljs-string">''</span>--.  .--<span class="hljs-string">'|  '</span>--<span class="hljs-string">'  | /  O  \ '</span>   .-<span class="hljs-string">'
+|  .-.  ||  '</span>--<span class="hljs-string">'.'</span>   |  |   |  .--.  ||  .-.  |`.  `-.
+|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-<span class="hljs-string">'    |
+`--'</span> `--<span class="hljs-string">'`--'</span> <span class="hljs-string">'--'</span>   `--<span class="hljs-string">'   `--'</span>  `--<span class="hljs-string">'`--'</span> `--<span class="hljs-string">'`-----'</span>
+
+wiki: https://alibaba.github.io/arthas
+version: 3.0.5
+pid: 43523
+time: 2018-12-05 16:23:52
+
+$
+</code></pre>
+<h3>Dubbo线上服务抛出异常,怎么获取调用参数?</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/watch.html">https://alibaba.github.io/arthas/watch.html</a></li>
+</ul>
+<p>当线上服务抛出异常时,最着急的是什么参数导致了抛异常?</p>
+<p>在demo里,访问 <a href="http://localhost:8080/user/0">http://localhost:8080/user/0</a> ,<code>UserServiceImpl</code>就会抛出一个异常,因为user id不合法。</p>
+<p>在Arthas里执行 <code>watch com.example.UserService * -e -x 2 '{params,throwExp}'</code> ,然后再次访问,就可以看到watch命令把参数和异常都打印出来了。</p>
+<pre><code>$ watch com.example.UserService * -e -x 2 '{params,throwExp}'
+Press Ctrl+C to abort.
+Affect(class-cnt:1 , method-cnt:4) cost in 230 ms.
+ts=2018-12-05 16:26:44; [cost=3.905523ms] result=@ArrayList[
+    @Object[][
+        @Integer[0],
+    ],
+    java.lang.IllegalArgumentException: user id &lt; 1, id: 0
+	at com.example.UserServiceImpl.findUser(UserServiceImpl.java:24)
+	at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java)
+	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:45)
+	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:71)
+	at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:48)
+	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:52)
+	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:61)
+</code></pre>
+<h3>怎样线上调试Dubbo服务代码?</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/redefine.html">https://alibaba.github.io/arthas/redefine.html</a></li>
+</ul>
+<p>在本地开发时,可能会用到热部署工具,直接改代码,不需要重启应用。但是在线上环境,有没有办法直接动态调试代码?比如增加日志。</p>
+<p>在Arthas里,可以通过<code>redefine</code>命令来达到线上不重启,动态更新代码的效果。</p>
+<p>比如我们修改下<code>UserServiceImpl</code>,用<code>System.out</code>打印出具体的<code>User</code>对象来:</p>
+<pre><code class="language-java">	<span class="hljs-function"><span class="hljs-keyword">public</span> User <span class="hljs-title">findUser</span><span class="hljs-params">(<span class="hljs-keyword">int</span> id)</span> </span>{
+		<span class="hljs-keyword">if</span> (id &lt; <span class="hljs-number">1</span>) {
+			<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"user id &lt; 1, id: "</span> + id);
+		}
+		<span class="hljs-keyword">for</span> (User user : users) {
+			<span class="hljs-keyword">if</span> (user.getId() == id) {
+				System.out.println(user);
+				<span class="hljs-keyword">return</span> user;
+			}
+		}
+		<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"Can not find user, id: "</span> + id);
+	}
+</code></pre>
+<p>本地编绎后,把<code>server-demo/target/classes/com/example/UserServiceImpl.class</code>传到线上服务器,然后用<code>redefine</code>命令来更新代码:</p>
+<pre><code>$ redefine -p /tmp/UserServiceImpl.class
+redefine success, size: 1
+</code></pre>
+<p>这样子更新成功之后,访问 <a href="http://localhost:8080/user/1">http://localhost:8080/user/1</a> ,在<code>ServerDemoApplication</code>的控制台里就可以看到打印出了user信息。</p>
+<h3>怎样动态修改Dubbo的logger级别?</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/ognl.html">https://alibaba.github.io/arthas/ognl.html</a></li>
+<li><a href="https://alibaba.github.io/arthas/sc.html">https://alibaba.github.io/arthas/sc.html</a></li>
+<li><a href="https://commons.apache.org/proper/commons-ognl/language-guide.html">https://commons.apache.org/proper/commons-ognl/language-guide.html</a></li>
+</ul>
+<p>在排查问题时,需要查看到更多的信息,如果可以把logger级别修改为<code>DEBUG</code>,就非常有帮助。</p>
+<p><code>ognl</code>是apache开源的一个轻量级表达式引擎。下面通过Arthas里的<code>ognl</code>命令来动态修改logger级别。</p>
+<p>首先获取Dubbo里<code>TraceFilter</code>的一个logger对象,看下它的实现类,可以发现是log4j。</p>
+<pre><code class="language-bash">$ ognl <span class="hljs-string">'@com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter@logger.logger'</span>
+@Log4jLogger[
+    FQCN=@String[com.alibaba.dubbo.common.logger.support.FailsafeLogger],
+    logger=@Logger[org.apache.log4j.Logger@2f19bdcf],
+]
+</code></pre>
+<p>再用<code>sc</code>命令来查看具体从哪个jar包里加载的:</p>
+<pre><code class="language-bash">$ sc -d org.apache.log4j.Logger
+ class-info        org.apache.log4j.Logger
+ code-source       /Users/hengyunabc/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.25/log4j-over-slf4j-1.7.25.jar
+ name              org.apache.log4j.Logger
+ isInterface       <span class="hljs-literal">false</span>
+ isAnnotation      <span class="hljs-literal">false</span>
+ isEnum            <span class="hljs-literal">false</span>
+ isAnonymousClass  <span class="hljs-literal">false</span>
+ isArray           <span class="hljs-literal">false</span>
+ isLocalClass      <span class="hljs-literal">false</span>
+ isMemberClass     <span class="hljs-literal">false</span>
+ isPrimitive       <span class="hljs-literal">false</span>
+ isSynthetic       <span class="hljs-literal">false</span>
+ simple-name       Logger
+ modifier          public
+ annotation
+ interfaces
+ super-class       +-org.apache.log4j.Category
+                     +-java.lang.Object
+ class-loader      +-sun.misc.Launcher<span class="hljs-variable">$AppClassLoader</span>@5c647e05
+                     +-sun.misc.Launcher<span class="hljs-variable">$ExtClassLoader</span>@59878d35
+ classLoaderHash   5c647e05
+
+Affect(row-cnt:1) cost <span class="hljs-keyword">in</span> 126 ms.
+</code></pre>
+<p><strong>可以看到log4j是通过slf4j代理的。</strong></p>
+<p>那么通过<code>org.slf4j.LoggerFactory</code>获取<code>root</code> logger,再修改它的level:</p>
+<pre><code>$ ognl '@org.slf4j.LoggerFactory@getLogger(&quot;root&quot;).setLevel(@ch.qos.logback.classic.Level@DEBUG)'
+null
+$ ognl '@org.slf4j.LoggerFactory@getLogger(&quot;root&quot;).getLevel().toString()'
+@String[DEBUG]
+</code></pre>
+<p>可以看到修改之后,<code>root</code> logger的level变为<code>DEBUG</code>。</p>
+<h3>怎样减少测试小姐姐重复发请求的麻烦?</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/tt.html">https://alibaba.github.io/arthas/tt.html</a></li>
+</ul>
+<p>在平时开发时,可能需要测试小姐姐发请求过来联调,但是我们在debug时,可能不小心直接跳过去了。这样子就尴尬了,需要测试小姐姐再发请求过来。</p>
+<p>Arthas里提供了<code>tt</code>命令,可以减少这种麻烦,可以直接重放请求。</p>
+<pre><code class="language-bash">$ tt -t com.example.UserServiceImpl findUser
+Press Ctrl+C to abort.
+Affect(class-cnt:1 , method-cnt:1) cost <span class="hljs-keyword">in</span> 145 ms.
+ INDEX      TIMESTAMP              COST(ms)      IS-RET     IS-EXP    OBJECT       CLASS              METHOD
+----------------------------------------------------------------------------------------------------------------
+ 1000       2018-12-05 17:47:52    1.56523       <span class="hljs-literal">true</span>       <span class="hljs-literal">false</span>     0x3233483    UserServiceImpl    findUser
+ 1001       2018-12-05 17:48:03    0.286176      <span class="hljs-literal">false</span>      <span class="hljs-literal">true</span>      0x3233483    UserServiceImpl    findUser
+ 1002       2018-12-05 17:48:11    90.324335     <span class="hljs-literal">true</span>       <span class="hljs-literal">false</span>     0x3233483    UserServiceImpl    findUser
+</code></pre>
+<p>上面的<code>tt -t</code>命令捕获到了3个请求。然后通过<code>tt --play</code>可以重放请求:</p>
+<pre><code class="language-bash">$ tt --play -i 1000
+ RE-INDEX       1000
+ GMT-REPLAY     2018-12-05 17:55:50
+ OBJECT         0x3233483
+ CLASS          com.example.UserServiceImpl
+ METHOD         findUser
+ PARAMETERS[0]  @Integer[1]
+ IS-RETURN      <span class="hljs-literal">true</span>
+ IS-EXCEPTION   <span class="hljs-literal">false</span>
+ RETURN-OBJ     @User[
+                    id=@Integer[1],
+                    name=@String[Deanna Borer],
+                ]
+Time fragment[1000] successfully replayed.
+Affect(row-cnt:1) cost <span class="hljs-keyword">in</span> 4 ms.
+</code></pre>
+<h3>Dubbo运行时有哪些Filter? 耗时是多少?</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/trace.html">https://alibaba.github.io/arthas/trace.html</a></li>
+</ul>
+<p>Dubbo运行时会加载很多的Filter,那么一个请求会经过哪些Filter处理,Filter里的耗时又是多少呢?</p>
+<p>通过Arthas的<code>trace</code>命令,可以很方便地知道Filter的信息,可以看到详细的调用栈和耗时。</p>
+<pre><code class="language-bash">$ trace com.alibaba.dubbo.rpc.Filter *
+Press Ctrl+C to abort.
+Affect(class-cnt:19 , method-cnt:59) cost <span class="hljs-keyword">in</span> 1441 ms.
+`---ts=2018-12-05 19:07:26;thread_name=DubboServerHandler-30.5.125.152:20880-thread-10;id=3e;is_daemon=<span class="hljs-literal">true</span>;priority=5;TCCL=sun.misc.Launcher<span class="hljs-variable">$AppClassLoader</span>@5c647e05
+    `---[8.435844ms] com.alibaba.dubbo.rpc.filter.EchoFilter:invoke()
+        +---[0.124572ms] com.alibaba.dubbo.rpc.Invocation:getMethodName()
+        +---[0.065123ms] java.lang.String:equals()
+        `---[7.762928ms] com.alibaba.dubbo.rpc.Invoker:invoke()
+            `---[7.494124ms] com.alibaba.dubbo.rpc.filter.ClassLoaderFilter:invoke()
+                +---[min=0.00355ms,max=0.049922ms,total=0.057637ms,count=3] java.lang.Thread:currentThread()
+                +---[0.0126ms] java.lang.Thread:getContextClassLoader()
+                +---[0.02188ms] com.alibaba.dubbo.rpc.Invoker:getInterface()
+                +---[0.004115ms] java.lang.Class:getClassLoader()
+                +---[min=0.003906ms,max=0.014058ms,total=0.017964ms,count=2] java.lang.Thread:setContextClassLoader()
+                `---[7.033486ms] com.alibaba.dubbo.rpc.Invoker:invoke()
+                    `---[6.869488ms] com.alibaba.dubbo.rpc.filter.GenericFilter:invoke()
+                        +---[0.01481ms] com.alibaba.dubbo.rpc.Invocation:getMethodName()
+</code></pre>
+<h3>Dubbo动态代理是怎样实现的?</h3>
+<ul>
+<li><a href="https://alibaba.github.io/arthas/jad.html">https://alibaba.github.io/arthas/jad.html</a></li>
+<li>com.alibaba.dubbo.common.bytecode.Wrapper</li>
+</ul>
+<p>通过Arthas的<code>jad</code>命令,可以看到Dubbo通过javaassist动态生成的Wrappr类的代码:</p>
+<pre><code class="language-java">$ jad com.alibaba.dubbo.common.bytecode.Wrapper1
+
+ClassLoader:
++-sun.misc.Launcher$AppClassLoader@<span class="hljs-number">5</span>c647e05
+  +-sun.misc.Launcher$ExtClassLoader@<span class="hljs-number">59878</span>d35
+
+Location:
+/Users/hengyunabc/.m2/repository/com/alibaba/dubbo/<span class="hljs-number">2.5</span>.10/dubbo-<span class="hljs-number">2.5</span>.10.jar
+
+<span class="hljs-keyword">package</span> com.alibaba.dubbo.common.bytecode;
+
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Wrapper1</span>
+<span class="hljs-keyword">extends</span> <span class="hljs-title">Wrapper</span>
+<span class="hljs-keyword">implements</span> <span class="hljs-title">ClassGenerator</span>.<span class="hljs-title">DC</span> </span>{
+
+    <span class="hljs-function"><span class="hljs-keyword">public</span> Object <span class="hljs-title">invokeMethod</span><span class="hljs-params">(Object object, String string, Class[] arrclass, Object[] arrobject)</span> <span class="hljs-keyword">throws</span> InvocationTargetException </span>{
+        UserServiceImpl userServiceImpl;
+        <span class="hljs-keyword">try</span> {
+            userServiceImpl = (UserServiceImpl)object;
+        }
+        <span class="hljs-keyword">catch</span> (Throwable throwable) {
+            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(throwable);
+        }
+        <span class="hljs-keyword">try</span> {
+            <span class="hljs-keyword">if</span> (<span class="hljs-string">"findUser"</span>.equals(string) &amp;&amp; arrclass.length == <span class="hljs-number">1</span>) {
+                <span class="hljs-keyword">return</span> userServiceImpl.findUser(((Number)arrobject[<span class="hljs-number">0</span>]).intValue());
+            }
+            <span class="hljs-keyword">if</span> (<span class="hljs-string">"listUsers"</span>.equals(string) &amp;&amp; arrclass.length == <span class="hljs-number">0</span>) {
+                <span class="hljs-keyword">return</span> userServiceImpl.listUsers();
+            }
+            <span class="hljs-keyword">if</span> (<span class="hljs-string">"findUserByName"</span>.equals(string) &amp;&amp; arrclass.length == <span class="hljs-number">1</span>) {
+                <span class="hljs-keyword">return</span> userServiceImpl.findUserByName((String)arrobject[<span class="hljs-number">0</span>]);
+            }
+        }
+</code></pre>
+<h3>获取Spring context</h3>
+<p>除了上面介绍的一些排查技巧,下面分享一个获取Spring Context,然后“为所欲为”的例子。</p>
+<p>在Dubbo里有一个扩展<code>com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory</code>,把Spring Context保存到了里面。
+因此,我们可以通过<code>ognl</code>命令获取到。</p>
+<pre><code class="language-bash">$ ognl <span class="hljs-string">'#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("userServiceImpl").findUser(1)'</span>
+@User[
+    id=@Integer[1],
+    name=@String[Deanna Borer],
+]
+</code></pre>
+<ul>
+<li><code>SpringExtensionFactory@contexts.iterator.next</code> 获取到<code>SpringExtensionFactory</code>里保存的spring context对象</li>
+<li><code>#context.getBean(&quot;userServiceImpl&quot;).findUser(1)</code> 获取到<code>userServiceImpl</code>再执行一次调用</li>
+</ul>
+<p>只要充分发挥想像力,组合Arthas里的各种命令,可以发挥出神奇的效果。</p>
+<h2>总结</h2>
+<p>本篇文章来自杭州Dubbo Meetup的分享《当DUBBO遇上Arthas - 排查问题的实践》,希望对大家线上排查Dubbo问题有帮助。</p>
+<p>分享的PDF可以在 <a href="https://github.com/alibaba/arthas/issues/327">https://github.com/alibaba/arthas/issues/327</a> 里下载。</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-meet-arthas.json b/zh-cn/blog/dubbo-meet-arthas.json
new file mode 100644
index 0000000..f096451
--- /dev/null
+++ b/zh-cn/blog/dubbo-meet-arthas.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meet-arthas.md",
+  "__html": "<h1>当Dubbo遇上Arthas:排查问题的实践</h1>\n<p>Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a></li>\n<li>文档:<a href=\"http://dubbo.incubator.apache.org/zh-cn/\">http://dubbo.incubator.apache.org/zh-cn/</a></li>\n</ul>\n<p>Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/alibaba/arthas\">https://github.com/alibab [...]
+  "link": "/zh-cn/blog/dubbo-meet-arthas.html",
+  "meta": {
+    "title": "当Dubbo遇上Arthas:排查问题的实践",
+    "keywords": "Dubbo, Arthas",
+    "description": "使用Alibaba开源的应用诊断利器Arthas来排查Dubbo应用的问题。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/index.html b/zh-cn/blog/index.html
index da17259..c21219a 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>
diff --git a/zh-cn/docs/developers/guide_dev.html b/zh-cn/docs/developers/guide_dev.html
index 42b7710..8b3665e 100644
--- a/zh-cn/docs/developers/guide_dev.html
+++ b/zh-cn/docs/developers/guide_dev.html
@@ -79,6 +79,15 @@ git push origin your_awesome_patch
 <h3>代码风格</h3>
 <p>我们提供了IntelliJ idea的模版文件<a href="https://github.com/apache/incubator-dubbo/tree/master/codestyle/dubbo_codestyle_for_idea.xml">dubbo_codestyle_for_idea.xml</a>,您可以将它导入到IDE。</p>
 <p>如果使用Eclipse,可以通过参考该文件手动配置。</p>
+<p><strong>注意事项</strong></p>
+<p>使用 dubbo_codestyle_for_idea.xml 为你的 IDEA 设置代码格式是贡献代码前至关重要的一个步骤,否则你将会无法通过 Travis CI 的代码风格校验,下面几个步骤给你演示了如何配置代码格式:</p>
+<ol>
+<li>进入菜单页 <code>Editor &gt; Code Style</code></li>
+<li>在 Code Style 页面的 scheme 菜单中点击 <img src="/img/manage_profiles.png" alt="manage profiles"> 选项
+在下拉列表中选择 <code>Import Scheme</code>, 接着选择 <code>IntelliJ IDEA code style XML</code> 导入 xml 文件</li>
+<li>输入你的格式名称,方便在不同工程之间进行识别,最后别忘了 ⏎ 来保存更改.</li>
+</ol>
+<p>设置完成后,IDEA 会帮助你自动 reformat 代码</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>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 [...]
 	<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/developers/guide_dev.json b/zh-cn/docs/developers/guide_dev.json
index 7139c65..138846f 100644
--- a/zh-cn/docs/developers/guide_dev.json
+++ b/zh-cn/docs/developers/guide_dev.json
@@ -1,6 +1,6 @@
 {
   "filename": "guide_dev.md",
-  "__html": "<h2>为Dubbo做贡献</h2>\n<p>Dubbo是在非限制性的Apache 2.0许可下发布的,遵循标准的Github开发流程,使用Github追踪处理问题,并将pull request合并到master中。如果您想为Dubbo 做贡献(即便是一些微小的),请不要犹豫,遵循下面的指导方针。</p>\n<h3>签署贡献者许可协议</h3>\n<p>在我们接受一个补丁或pull request之前,我们需要您签署贡献者许可协议。签署贡献者协议并不授予任何人对代码仓库的提交权限,但是它意味着我们可以接受您的贡献,并且如果我们这样做,您将获得一个作者标注。主动贡献者可能会被邀请加入核心团队,并有权限合并pull request。</p>\n<h3>联系我们</h3>\n<h4>邮件列表</h4>\n<p>邮件列表是讨论几乎所有与Dubbo有关事情的推荐方式。有关如何订阅的详细文档,请参阅<a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscripti [...]
+  "__html": "<h2>为Dubbo做贡献</h2>\n<p>Dubbo是在非限制性的Apache 2.0许可下发布的,遵循标准的Github开发流程,使用Github追踪处理问题,并将pull request合并到master中。如果您想为Dubbo 做贡献(即便是一些微小的),请不要犹豫,遵循下面的指导方针。</p>\n<h3>签署贡献者许可协议</h3>\n<p>在我们接受一个补丁或pull request之前,我们需要您签署贡献者许可协议。签署贡献者协议并不授予任何人对代码仓库的提交权限,但是它意味着我们可以接受您的贡献,并且如果我们这样做,您将获得一个作者标注。主动贡献者可能会被邀请加入核心团队,并有权限合并pull request。</p>\n<h3>联系我们</h3>\n<h4>邮件列表</h4>\n<p>邮件列表是讨论几乎所有与Dubbo有关事情的推荐方式。有关如何订阅的详细文档,请参阅<a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscripti [...]
   "link": "/zh-cn/docs/developers/guide_dev.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/rest.html b/zh-cn/docs/user/rest.html
index 001e1bf..3a330e2 100644
--- a/zh-cn/docs/user/rest.html
+++ b/zh-cn/docs/user/rest.html
@@ -136,7 +136,7 @@
 </ol>
 <p>需要指出的是,我认为1~3是dubbo的REST调用最有价值的三种应用场景,并且我们为dubbo添加REST调用,其最主要到目的也是面向服务的提供端,即开发REST服务来提供给非dubbo的(异构)消费端。</p>
 <p>归纳起来,所有应用场景如下图所示:
-<img src="images/rest.jpg" alt="no image found"></p>
+<img src="sources/images/rest.jpg" alt="no image found"></p>
 <p>借用Java过去最流行的宣传语,为dubbo添加REST调用后,可以实现服务的”一次编写,到处访问“,理论上可以面向全世界开放,从而真正实现比较理想化的面向服务架构(SOA)。</p>
 <p>当然,传统的WebServices(WSDL/SOAP)也基本同样能满足以上场景(除了场景4)的要求(甚至还能满足那些需要企业级特性的场景),但由于其复杂性等问题,现在已经越来越少被实际采用了。</p>
 <h2>快速入门</h2>
@@ -886,8 +886,8 @@ http://api.foo.com/services/users/1002
 </tr>
 </tbody>
 </table>
-<p><img src="images/rt.png" alt="no image found"></p>
-<p><img src="images/tps.png" alt="no image found"></p>
+<p><img src="sources/images/rt.png" alt="no image found"></p>
+<p><img src="sources/images/tps.png" alt="no image found"></p>
 <p>仅就目前的结果,一点简单总结:</p>
 <ul>
 <li>dubbo RPC(特别是基于高效java序列化方式如kryo,fst)比REST的响应时间和吞吐量都有较显著优势,内网的dubbo系统之间优先选择dubbo RPC。</li>
@@ -917,26 +917,12 @@ http://api.foo.com/services/users/1002
 <p>初步看法,摘自http://www.infoq.com/cn/news/2014/10/dubbox-open-source?utm_source=infoq&amp;utm_medium=popular_links_homepage#theCommentsSection</p>
 <blockquote>
 <p>谢谢,对于jax-rs和spring mvc,其实我对spring mvc的rest支持还没有太深入的看过,说点初步想法,请大家指正:</p>
-</blockquote>
-<blockquote>
 <p>spring mvc也支持annotation的配置,其实和jax-rs看起来是非常非常类似的。</p>
-</blockquote>
-<blockquote>
 <p>我个人认为spring mvc相对更适合于面向web应用的restful服务,比如被AJAX调用,也可能输出HTML之类的,应用中还有页面跳转流程之类,spring mvc既可以做好正常的web页面请求也可以同时处理rest请求。但总的来说这个restful服务是在展现层或者叫web层之类实现的</p>
-</blockquote>
-<blockquote>
 <p>而jax-rs相对更适合纯粹的服务化应用,也就是传统Java EE中所说的中间层服务,比如它可以把传统的EJB发布成restful服务。在spring应用中,也就把spring中充当service之类的bean直接发布成restful服务。总的来说这个restful服务是在业务、应用层或者facade层。而MVC层次和概念在这种做比如(后台)服务化的应用中通常是没有多大价值的。</p>
-</blockquote>
-<blockquote>
 <p>当然jax-rs的有些实现比如jersey,也试图提供mvc支持,以更好的适应上面所说的web应用,但应该是不如spring mvc。</p>
-</blockquote>
-<blockquote>
 <p>在dubbo应用中,我想很多人都比较喜欢直接将一个本地的spring service bean(或者叫manager之类的)完全透明的发布成远程服务,则这里用JAX-RS是更自然更直接的,不必额外的引入MVC概念。当然,先不讨论透明发布远程服务是不是最佳实践,要不要添加facade之类。</p>
-</blockquote>
-<blockquote>
 <p>当然,我知道在dubbo不支持rest的情况下,很多朋友采用的架构是spring mvc restful调用dubbo (spring) service来发布restful服务的。这种方式我觉得也非常好,只是如果不修改spring mvc并将其与dubbo深度集成,restful服务不能像dubbo中的其他远程调用协议比如webservices、dubbo rpc、hessian等等那样,享受诸多高级的服务治理的功能,比如:注册到dubbo的服务注册中心,通过dubbo监控中心监控其调用次数、TPS、响应时间之类,通过dubbo的统一的配置方式控制其比如线程池大小、最大连接数等等,通过dubbo统一方式做服务流量控制、权限控制、频次控制。另外spring mvc仅仅负责服务端,而在消费端,通常是用spring restTemplate,如果restTemplate不和dubbo集成,有可能像dubbo服务客户端那样自动或者人工干预做服务降级。如果服务端消费端都是dubbo系统,通过spring的rest交互,如果spr
 ing rest不深度整合dubbo,则不能用 [...]
-</blockquote>
-<blockquote>
 <p>当然,其实我个人认为这些东西不必要非此即彼的。我听说spring创始人rod johnson总是爱说一句话,the customer is always right,其实与其非要探讨哪种方式更好,不如同时支持两种方式就是了,所以原来在文档中也写过计划支持spring rest annoation,只是不知道具体可行性有多高。</p>
 </blockquote>
 <h2>未来</h2>
diff --git a/zh-cn/docs/user/rest.json b/zh-cn/docs/user/rest.json
index 3c070bb..c9746f2 100644
--- a/zh-cn/docs/user/rest.json
+++ b/zh-cn/docs/user/rest.json
@@ -1,6 +1,6 @@
 {
   "filename": "rest.md",
-  "__html": "<h1>在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)</h1>\n<p><strong>作者:沈理</strong></p>\n<p><strong>文档版权:<a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0许可证 署名-禁止演绎</a></strong></p>\n<p>完善中……</p>\n<blockquote>\n<p>本文篇幅较长,因为REST本身涉及面较多。另外,本文参照Spring等的文档风格,不仅仅局限于框架用法的阐述,同时也努力呈现框架的设计理念和优良应用的架构思想。</p>\n</blockquote>\n<blockquote>\n<p>对于想粗略了解dubbo和REST的人,只需浏览 <code>概述</code> 至 <code>标准Java REST API:JAX-RS简介</code> 几节即可。</p>\n</blockquote>\n<p>TODO 生成可点击的目录</p>\n<h2>目录 [...]
+  "__html": "<h1>在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)</h1>\n<p><strong>作者:沈理</strong></p>\n<p><strong>文档版权:<a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0许可证 署名-禁止演绎</a></strong></p>\n<p>完善中……</p>\n<blockquote>\n<p>本文篇幅较长,因为REST本身涉及面较多。另外,本文参照Spring等的文档风格,不仅仅局限于框架用法的阐述,同时也努力呈现框架的设计理念和优良应用的架构思想。</p>\n</blockquote>\n<blockquote>\n<p>对于想粗略了解dubbo和REST的人,只需浏览 <code>概述</code> 至 <code>标准Java REST API:JAX-RS简介</code> 几节即可。</p>\n</blockquote>\n<p>TODO 生成可点击的目录</p>\n<h2>目录 [...]
   "link": "/zh-cn/docs/user/rest.html",
   "meta": {
     "title": "在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)",