You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by GitBox <gi...@apache.org> on 2018/11/19 05:41:17 UTC

[GitHub] lovepoem closed pull request #179: Transter committer guide from dubbo wiki new files

lovepoem closed pull request #179: Transter committer guide from dubbo wiki new files
URL: https://github.com/apache/incubator-dubbo-website/pull/179
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/build/documentation.js b/build/documentation.js
index d8353bdc..91b48630 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=81)}([function(e,t,n){"use strict";function r(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}function l(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function a(e){if(!e||!e.hasOwnProperty)return!1;for(var t=["value","initializer","get","set"],n=0,r=t.length;n<r;n++)if(e.hasOwnProperty(t[n]))return!0;return!1}function s(e,t){return a(t[t.length-1])?e.apply(void 0,l(t).concat([[]])):function(){return e.apply(void 0,l(Array.prototype.slice.call(arguments)).concat([t]))}}function u(e){return!1===e.hasOwnProperty(j)&&O(e,j,{value:new P}),e[j]}function c(e){var t={};return z(e).forEach(function(n){return t[n]=_(e,n)}),t}function d(e){return function(t){return Object.defineProperty(this,e,{configurable:!0,writable:!0,enumerable:!0,value:t}),t}}function f(e,t){return e.bind?e.bind(t):function(){return e.apply(t,arguments)}}function h(e){!0!==x[e]&&(x[e]=!0,T("DEPRECATION: "+e))}t.d=s,t.c=u,n.d(t,"g",function(){return z}),t.f=c,t.e=d,t.a=f,n.d(t,"b",function(){return T}),t.h=h;var p,m,y,v,g,b,k=n(9),w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},O=Object.defineProperty,_=Object.getOwnPropertyDescriptor,S=Object.getOwnPropertyNames,E=Object.getOwnPropertySymbols,P=(p=function e(){o(this,e),r(this,"debounceTimeoutIds",m,this),r(this,"throttleTimeoutIds",y,this),r(this,"throttlePreviousTimestamps",v,this),r(this,"throttleTrailingArgs",g,this),r(this,"profileLastRan",b,this)},m=i(p.prototype,"debounceTimeoutIds",[k.a],{enumerable:!0,initializer:function(){return{}}}),y=i(p.prototype,"throttleTimeoutIds",[k.a],{enumerable:!0,initializer:function(){return{}}}),v=i(p.prototype,"throttlePreviousTimestamps",[k.a],{enumerable:!0,initializer:function(){return{}}}),g=i(p.prototype,"throttleTrailingArgs",[k.a],{enumerable:!0,initializer:function(){return null}}),b=i(p.prototype,"profileLastRan",[k.a],{enumerable:!0,initializer:function(){return null}}),p),j="function"==typeof Symbol?Symbol("__core_decorators__"):"__core_decorators__",z=E?function(e){return S(e).concat(E(e))}:S,T=function(){return"object"===("undefined"==typeof console?"undefined":w(console))&&console&&"function"==typeof console.warn?f(console.warn,console):function(){}}(),x={}},function(e,t){e.exports=React},function(e,t,n){e.exports=n(33)()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={rootPath:"",port:8080,domain:"dubbo.apache.org",defaultSearch:"google",defaultLanguage:"en-us","en-us":{pageMenu:[{key:"home",text:"HOME",link:"/en-us/index.html"},{key:"docs",text:"DOCS",link:"/en-us/docs/user/quick-start.html"},{key:"developers",text:"DEVELOPERS",link:"/en-us/docs/developers/developers_dev.html"},{key:"blog",text:"BLOG",link:"/en-us/blog/index.html"},{key:"community",text:"COMMUNITY",link:"/en-us/community/index.html"},{key:"download",text:"DOWNLOAD",link:"/en-us/blog/download.html"}],disclaimer:{title:"Disclaimer",content:"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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF."},asf:{title:"ASF",list:[{text:"Foundation",link:"http://www.apache.org"},{text:"License",link:"http://www.apache.org/licenses/"},{text:"Events",link:"http://www.apache.org/events/current-event"},{text:"Sponsorship",link:"http://www.apache.org/foundation/sponsorship.html"},{text:"Thanks",link:"http://www.apache.org/foundation/thanks.html"}]},documentation:{title:"Documentation",list:[{text:"Quick start",link:"/en-us/docs/user/quick-start.html"},{text:"Developer guide",link:"/en-us/docs/dev/build.html"},{text:"Admin manual",link:"/en-us/docs/admin/ops/dubbo-ops.html"}]},resources:{title:"Resources",list:[{text:"Blog",link:"/en-us/blog/index.html"},{text:"Community",link:"/en-us/community/index.html"},{text:"Security",link:"https://www.apache.org/security/"}]},copyright:"Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation."},"zh-cn":{pageMenu:[{key:"home",text:"首页",link:"/zh-cn/index.html"},{key:"docs",text:"文档",link:"/zh-cn/docs/user/quick-start.html"},{key:"developers",text:"开发者",link:"/zh-cn/docs/developers/developers_dev.html"},{key:"blog",text:"博客",link:"/zh-cn/blog/index.html"},{key:"community",text:"社区",link:"/zh-cn/community/index.html"},{key:"download",text:"下载",link:"/zh-cn/blog/download.html"}],disclaimer:{title:"Disclaimer",content:"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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF."},asf:{title:"ASF",list:[{text:"基金会",link:"http://www.apache.org"},{text:"证书",link:"http://www.apache.org/licenses/"},{text:"事件",link:"http://www.apache.org/events/current-event"},{text:"赞助",link:"http://www.apache.org/foundation/sponsorship.html"},{text:"致谢",link:"http://www.apache.org/foundation/thanks.html"}]},documentation:{title:"文档",list:[{text:"快速开始",link:"/zh-cn/docs/user/quick-start.html"},{text:"开发者指南",link:"/zh-cn/docs/dev/build.html"},{text:"运维管理",link:"/zh-cn/docs/admin/ops/dubbo-ops.html"}]},resources:{title:"资源",list:[{text:"博客",link:"/zh-cn/blog/index.html"},{text:"社区",link:"/zh-cn/community/index.html"},{text:"安全",link:"https://www.apache.org/security"}]},copyright:"Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation."}}},function(e,t,n){var r,o;!function(i){var l=!1;if(r=i,void 0!==(o="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=o),l=!0,e.exports=i(),l=!0,!l){var a=window.Cookies,s=window.Cookies=i();s.noConflict=function(){return window.Cookies=a,s}}}(function(){function e(){for(var e=0,t={};e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}function t(n){function r(t,o,i){var l;if("undefined"!=typeof document){if(arguments.length>1){if(i=e({path:"/"},r.defaults,i),"number"==typeof i.expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{l=JSON.stringify(o),/^[\{\[]/.test(l)&&(o=l)}catch(e){}o=n.write?n.write(o,t):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var s="";for(var u in i)i[u]&&(s+="; "+u,!0!==i[u]&&(s+="="+i[u]));return document.cookie=t+"="+o+s}t||(l={});for(var c=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,f=0;f<c.length;f++){var h=c[f].split("="),p=h.slice(1).join("=");this.json||'"'!==p.charAt(0)||(p=p.slice(1,-1));try{var m=h[0].replace(d,decodeURIComponent);if(p=n.read?n.read(p,m):n(p,m)||p.replace(d,decodeURIComponent),this.json)try{p=JSON.parse(p)}catch(e){}if(t===m){l=p;break}t||(l[m]=p)}catch(e){}}return l}}return r.set=r,r.get=function(e){return r.call(r,e)},r.getJSON=function(){return r.apply({json:!0},[].slice.call(arguments))},r.defaults={},r.remove=function(t,n){r(t,"",e(n,{expires:-1}))},r.withConverter=t,r}return t(function(){})})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.throttle=function(e,t){var n=null;return function(){for(var r=arguments.length,o=Array(r),i=0;i<r;i++)o[i]=arguments[i];var l=this;clearTimeout(n),n=setTimeout(function(){e.apply(l,o)},t)}},t.getScrollTop=function(){var e=0;return document.documentElement&&document.documentElement.scrollTop?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e},t.getLink=function(e){return(""+e).length>1&&/^\/[^\/]/.test(""+e)?""+window.rootPath+e:e}},function(e,t){e.exports=ReactDOM},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(25);n.d(t,"override",function(){return r.a});var o=n(18);n.d(t,"deprecate",function(){return o.a}),n.d(t,"deprecated",function(){return o.a});var i=n(28);n.d(t,"suppressWarnings",function(){return i.a});var l=n(21);n.d(t,"memoize",function(){return l.a});var a=n(15);n.d(t,"autobind",function(){return a.a});var s=n(27);n.d(t,"readonly",function(){return s.a});var u=n(19);n.d(t,"enumerable",function(){return u.a});var c=n(24);n.d(t,"nonenumerable",function(){return c.a});var d=n(23);n.d(t,"nonconfigurable",function(){return d.a});var f=n(16);n.d(t,"debounce",function(){return f.a});var h=n(29);n.d(t,"throttle",function(){return h.a});var p=n(17);n.d(t,"decorate",function(){return p.a});var m=n(22);n.d(t,"mixin",function(){return m.a}),n.d(t,"mixins",function(){return m.a});var y=n(9);n.d(t,"lazyInitialize",function(){return y.a});var v=n(30);n.d(t,"time",function(){return v.a});var g=n(20);n.d(t,"extendDescriptor",function(){return g.a});var b=n(26);n.d(t,"profile",function(){return b.a});var k=n(14);n.d(t,"applyDecorators",function(){return k.a})},function(e,t,n){var r,o;/*!
+!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)}([function(e,t,n){"use strict";function r(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(r):void 0})}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}function l(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function a(e){if(!e||!e.hasOwnProperty)return!1;for(var t=["value","initializer","get","set"],n=0,r=t.length;n<r;n++)if(e.hasOwnProperty(t[n]))return!0;return!1}function s(e,t){return a(t[t.length-1])?e.apply(void 0,l(t).concat([[]])):function(){return e.apply(void 0,l(Array.prototype.slice.call(arguments)).concat([t]))}}function u(e){return!1===e.hasOwnProperty(z)&&_(e,z,{value:new P}),e[z]}function c(e){var t={};return j(e).forEach(function(n){return t[n]=O(e,n)}),t}function d(e){return function(t){return Object.defineProperty(this,e,{configurable:!0,writable:!0,enumerable:!0,value:t}),t}}function f(e,t){return e.bind?e.bind(t):function(){return e.apply(t,arguments)}}function h(e){!0!==x[e]&&(x[e]=!0,T("DEPRECATION: "+e))}t.d=s,t.c=u,n.d(t,"g",function(){return j}),t.f=c,t.e=d,t.a=f,n.d(t,"b",function(){return T}),t.h=h;var p,m,y,v,g,b,k=n(9),w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_=Object.defineProperty,O=Object.getOwnPropertyDescriptor,S=Object.getOwnPropertyNames,E=Object.getOwnPropertySymbols,P=(p=function e(){o(this,e),r(this,"debounceTimeoutIds",m,this),r(this,"throttleTimeoutIds",y,this),r(this,"throttlePreviousTimestamps",v,this),r(this,"throttleTrailingArgs",g,this),r(this,"profileLastRan",b,this)},m=i(p.prototype,"debounceTimeoutIds",[k.a],{enumerable:!0,initializer:function(){return{}}}),y=i(p.prototype,"throttleTimeoutIds",[k.a],{enumerable:!0,initializer:function(){return{}}}),v=i(p.prototype,"throttlePreviousTimestamps",[k.a],{enumerable:!0,initializer:function(){return{}}}),g=i(p.prototype,"throttleTrailingArgs",[k.a],{enumerable:!0,initializer:function(){return null}}),b=i(p.prototype,"profileLastRan",[k.a],{enumerable:!0,initializer:function(){return null}}),p),z="function"==typeof Symbol?Symbol("__core_decorators__"):"__core_decorators__",j=E?function(e){return S(e).concat(E(e))}:S,T=function(){return"object"===("undefined"==typeof console?"undefined":w(console))&&console&&"function"==typeof console.warn?f(console.warn,console):function(){}}(),x={}},function(e,t){e.exports=React},function(e,t,n){e.exports=n(33)()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={rootPath:"",port:8080,domain:"dubbo.apache.org",defaultSearch:"google",defaultLanguage:"en-us","en-us":{pageMenu:[{key:"home",text:"HOME",link:"/en-us/index.html"},{key:"docs",text:"DOCS",link:"/en-us/docs/user/quick-start.html"},{key:"developers",text:"DEVELOPERS",link:"/en-us/docs/developers/developers_dev.html"},{key:"blog",text:"BLOG",link:"/en-us/blog/index.html"},{key:"community",text:"COMMUNITY",link:"/en-us/community/index.html"},{key:"download",text:"DOWNLOAD",link:"/en-us/blog/download.html"}],disclaimer:{title:"Disclaimer",content:"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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF."},asf:{title:"ASF",list:[{text:"Foundation",link:"http://www.apache.org"},{text:"License",link:"http://www.apache.org/licenses/"},{text:"Events",link:"http://www.apache.org/events/current-event"},{text:"Sponsorship",link:"http://www.apache.org/foundation/sponsorship.html"},{text:"Thanks",link:"http://www.apache.org/foundation/thanks.html"}]},documentation:{title:"Documentation",list:[{text:"Quick start",link:"/en-us/docs/user/quick-start.html"},{text:"Developer guide",link:"/en-us/docs/dev/build.html"},{text:"Admin manual",link:"/en-us/docs/admin/ops/dubbo-ops.html"}]},resources:{title:"Resources",list:[{text:"Blog",link:"/en-us/blog/index.html"},{text:"Community",link:"/en-us/community/index.html"},{text:"Security",link:"https://www.apache.org/security/"}]},copyright:"Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation."},"zh-cn":{pageMenu:[{key:"home",text:"首页",link:"/zh-cn/index.html"},{key:"docs",text:"文档",link:"/zh-cn/docs/user/quick-start.html"},{key:"developers",text:"开发者",link:"/zh-cn/docs/developers/developers_dev.html"},{key:"blog",text:"博客",link:"/zh-cn/blog/index.html"},{key:"community",text:"社区",link:"/zh-cn/community/index.html"},{key:"download",text:"下载",link:"/zh-cn/blog/download.html"}],disclaimer:{title:"Disclaimer",content:"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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF."},asf:{title:"ASF",list:[{text:"基金会",link:"http://www.apache.org"},{text:"证书",link:"http://www.apache.org/licenses/"},{text:"事件",link:"http://www.apache.org/events/current-event"},{text:"赞助",link:"http://www.apache.org/foundation/sponsorship.html"},{text:"致谢",link:"http://www.apache.org/foundation/thanks.html"}]},documentation:{title:"文档",list:[{text:"快速开始",link:"/zh-cn/docs/user/quick-start.html"},{text:"开发者指南",link:"/zh-cn/docs/dev/build.html"},{text:"运维管理",link:"/zh-cn/docs/admin/ops/dubbo-ops.html"}]},resources:{title:"资源",list:[{text:"博客",link:"/zh-cn/blog/index.html"},{text:"社区",link:"/zh-cn/community/index.html"},{text:"安全",link:"https://www.apache.org/security"}]},copyright:"Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation."}}},function(e,t,n){var r,o;!function(i){var l=!1;if(r=i,void 0!==(o="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=o),l=!0,e.exports=i(),l=!0,!l){var a=window.Cookies,s=window.Cookies=i();s.noConflict=function(){return window.Cookies=a,s}}}(function(){function e(){for(var e=0,t={};e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}function t(n){function r(t,o,i){var l;if("undefined"!=typeof document){if(arguments.length>1){if(i=e({path:"/"},r.defaults,i),"number"==typeof i.expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{l=JSON.stringify(o),/^[\{\[]/.test(l)&&(o=l)}catch(e){}o=n.write?n.write(o,t):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var s="";for(var u in i)i[u]&&(s+="; "+u,!0!==i[u]&&(s+="="+i[u]));return document.cookie=t+"="+o+s}t||(l={});for(var c=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,f=0;f<c.length;f++){var h=c[f].split("="),p=h.slice(1).join("=");this.json||'"'!==p.charAt(0)||(p=p.slice(1,-1));try{var m=h[0].replace(d,decodeURIComponent);if(p=n.read?n.read(p,m):n(p,m)||p.replace(d,decodeURIComponent),this.json)try{p=JSON.parse(p)}catch(e){}if(t===m){l=p;break}t||(l[m]=p)}catch(e){}}return l}}return r.set=r,r.get=function(e){return r.call(r,e)},r.getJSON=function(){return r.apply({json:!0},[].slice.call(arguments))},r.defaults={},r.remove=function(t,n){r(t,"",e(n,{expires:-1}))},r.withConverter=t,r}return t(function(){})})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.throttle=function(e,t){var n=null;return function(){for(var r=arguments.length,o=Array(r),i=0;i<r;i++)o[i]=arguments[i];var l=this;clearTimeout(n),n=setTimeout(function(){e.apply(l,o)},t)}},t.getScrollTop=function(){var e=0;return document.documentElement&&document.documentElement.scrollTop?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e},t.getLink=function(e){return(""+e).length>1&&/^\/[^\/]/.test(""+e)?""+window.rootPath+e:e}},function(e,t){e.exports=ReactDOM},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(25);n.d(t,"override",function(){return r.a});var o=n(18);n.d(t,"deprecate",function(){return o.a}),n.d(t,"deprecated",function(){return o.a});var i=n(28);n.d(t,"suppressWarnings",function(){return i.a});var l=n(21);n.d(t,"memoize",function(){return l.a});var a=n(15);n.d(t,"autobind",function(){return a.a});var s=n(27);n.d(t,"readonly",function(){return s.a});var u=n(19);n.d(t,"enumerable",function(){return u.a});var c=n(24);n.d(t,"nonenumerable",function(){return c.a});var d=n(23);n.d(t,"nonconfigurable",function(){return d.a});var f=n(16);n.d(t,"debounce",function(){return f.a});var h=n(29);n.d(t,"throttle",function(){return h.a});var p=n(17);n.d(t,"decorate",function(){return p.a});var m=n(22);n.d(t,"mixin",function(){return m.a}),n.d(t,"mixins",function(){return m.a});var y=n(9);n.d(t,"lazyInitialize",function(){return y.a});var v=n(30);n.d(t,"time",function(){return v.a});var g=n(20);n.d(t,"extendDescriptor",function(){return g.a});var b=n(26);n.d(t,"profile",function(){return b.a});var k=n(14);n.d(t,"applyDecorators",function(){return k.a})},function(e,t,n){var r,o;/*!
   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)&&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";function r(e,t,r){var o=r.configurable,a=r.enumerable,s=r.initializer,u=r.value;return{configurable:o,enumerable:a,get:function(){if(this!==e){var n=s?s.call(this):u;return l(this,t,{configurable:o,enumerable:a,writable:!0,value:n}),n}},set:n.i(i.e)(t)}}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.defineProperty},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=r(s),c=n(2),d=r(c),f=n(4),h=r(f),p=n(3),m=r(p),y=n(5);n(31);var v={logo:d.default.string.isRequired},g=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),a(t,[{key:"render",value:function(){var e=this.props.logo,t=h.default.get("docsite_language")||m.default.defaultLanguage,n=m.default[t];return u.default.createElement("footer",{className:"footer-container"},u.default.createElement("div",{className:"footer-body"},u.default.createElement("img",{src:e}),u.default.createElement("img",{className:"apache",src:window.rootPath+"/img/apache_logo.png"}),u.default.createElement("div",{className:"cols-container"},u.default.createElement("div",{className:"col col-12"},u.default.createElement("h3",null,n.disclaimer.title),u.default.createElement("p",null,n.disclaimer.content)),u.default.createElement("div",{className:"col col-4"},u.default.createElement("dl",null,u.default.createElement("dt",null,n.asf.title),n.asf.list.map(function(e,t){return u.default.createElement("dd",{key:t},u.default.createElement("a",{href:(0,y.getLink)(e.link),target:e.target||"_self"},e.text))}))),u.default.createElement("div",{className:"col col-4"},u.default.createElement("dl",null,u.default.createElement("dt",null,n.documentation.title),n.documentation.list.map(function(e,t){return u.default.createElement("dd",{key:t},u.default.createElement("a",{href:(0,y.getLink)(e.link),target:e.target||"_self"},e.text))}))),u.default.createElement("div",{className:"col col-4"},u.default.createElement("dl",null,u.default.createElement("dt",null,n.resources.title),n.resources.list.map(function(e,t){return u.default.createElement("dd",{key:t},u.default.createElement("a",{href:(0,y.getLink)(e.link),target:e.target||"_self"},e.text))})))),u.default.createElement("div",{className:"copyright"},u.default.createElement("span",null,n.copyright))))}}]),t}(u.default.Component);g.propTypes=v,t.default=g},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s,u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(1),d=r(c),f=n(2),h=r(f),p=n(8),m=r(p),y=n(7),v=n(3),g=r(v);n(32);var b=[{text:"中",value:"en-us"},{text:"En",value:"zh-cn"}],k={baidu:{logo:"https://img.alicdn.com/tfs/TB1n6DQayLaK1RjSZFxXXamPFXa-300-300.png",url:"https://www.baidu.com/s?wd="},google:{logo:"https://img.alicdn.com/tfs/TB1REfuaCzqK1RjSZFjXXblCFXa-300-300.jpg",url:"https://www.google.com/search?q="}},w=function(){},O={currentKey:h.default.string,logo:h.default.string.isRequired,type:h.default.oneOf(["primary","normal"]),language:h.default.oneOf(["en-us","zh-cn"]),onLanguageChange:h.default.func},_={type:"primary",language:"en-us",onLanguageChange:w},S=(0,y.autobind)(s=function(e){function t(e){i(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={menuBodyVisible:!1,language:e.language,search:g.default.defaultSearch,searchValue:"",inputVisible:!1},n}return a(t,e),u(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({language:e.language})}},{key:"toggleMenu",value:function(){this.setState({menuBodyVisible:!this.state.menuBodyVisible})}},{key:"switchLang",value:function(){var e=void 0;e="zh-cn"===this.state.language?"en-us":"zh-cn",this.setState({language:e}),this.props.onLanguageChange(e)}},{key:"switchSearch",value:function(){var e=void 0;e="baidu"===this.state.search?"google":"baidu",this.setState({search:e})}},{key:"toggleSearch",value:function(){this.setState({searchVisible:!this.state.searchVisible})}},{key:"onInputChange",value:function(e){this.setState({searchValue:e.target.value})}},{key:"goSearch",value:function(){var e=this.state,t=e.search,n=e.searchValue;window.open(""+k[t].url+window.encodeURIComponent(n+" site:"+g.default.domain))}},{key:"onKeyDown",value:function(e){13===e.keyCode&&this.goSearch()}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.logo,r=e.onLanguageChange,i=e.currentKey,l=this.state,a=l.menuBodyVisible,s=l.language,u=l.search,c=l.searchVisible;return d.default.createElement("header",{className:(0,m.default)(o({"header-container":!0},"header-container-"+t,!0))},d.default.createElement("div",{className:"header-body"},d.default.createElement("a",{href:window.rootPath+"/"+s+"/index.html"},d.default.createElement("img",{className:"logo",alt:g.default.name,title:g.default.name,src:n})),g.default.defaultSearch?d.default.createElement("div",{className:(0,m.default)(o({search:!0},"search-"+t,!0))},d.default.createElement("span",{className:"icon-search",onClick:this.toggleSearch}),c?d.default.createElement("div",{className:"search-input"},d.default.createElement("img",{src:k[u].logo,onClick:this.switchSearch}),d.default.createElement("input",{autoFocus:!0,onChange:this.onInputChange,onKeyDown:this.onKeyDown})):null):null,r!==w?d.default.createElement("span",{className:(0,m.default)(o({"language-switch":!0},"language-switch-"+t,!0)),onClick:this.switchLang},b.find(function(e){return e.value===s}).text):null,d.default.createElement("div",{className:(0,m.default)({"header-menu":!0,"header-menu-open":a})},d.default.createElement("img",{className:"header-menu-toggle",onClick:this.toggleMenu,src:"primary"===t?window.rootPath+"/img/menu_white.png":window.rootPath+"/img/menu_gray.png"}),d.default.createElement("ul",null,g.default[s].pageMenu.map(function(e){var n;return d.default.createElement("li",{className:(0,m.default)((n={"menu-item":!0},o(n,"menu-item-"+t,!0),o(n,"menu-item-"+t+"-active",i===e.key),n)),key:e.key},d.default.createElement("a",{href:""+window.rootPath+e.link},e.text))})))))}}]),t}(d.default.Component))||s;S.propTypes=O,S.defaultProps=_,t.default=S},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a,s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(7),f=n(4),h=r(f),p=(a=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),s(t,[{key:"onLanguageChange",value:function(e){var t=window.location.pathname,n=void 0;n="zh-cn"===e?"en-us":"zh-cn";var r=t.replace(window.rootPath+"/"+n,window.rootPath+"/"+e);h.default.set("docsite_language",e,{expires:365,path:""}),window.location=r}},{key:"getLanguage",value:function(){var e=void 0;e=window.rootPath?window.location.pathname.split("/")[2]:window.location.pathname.split("/")[1];var t=this.props.lang||e||h.default.get("docsite_language")||siteConfig.defaultLanguage;return"en-us"!==t&&"zh-cn"!==t&&(t=siteConfig.defaultLanguage),t!==h.default.get("docsite_language")&&h.default.set("docsite_language",t,{expires:365,path:""}),t}}]),t}(c.default.Component),function(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}(a.prototype,"onLanguageChange",[d.autobind],Object.getOwnPropertyDescriptor(a.prototype,"onLanguageChange"),a.prototype),a);t.default=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e=e?0===e.indexOf("#")?e:"#"+e:"",history.pushState){var t=window.location;history.pushState(null,null,e?t.pathname+t.search+e:t.pathname+t.search)}else location.hash=e},o=function(){return window.location.hash.replace(/^#/,"")},i=function(e){return function(t){return e.contains?e!=t&&e.contains(t):!!(16&e.compareDocumentPosition(t))}},l=function(e,t){return e===document?t.getBoundingClientRect().top+(window.scrollY||window.pageYOffset):"relative"===getComputedStyle(e).position?t.offsetTop:t.getBoundingClientRect().top+e.scrollTop};t.default={pushHash:r,getHash:o,filterElementInContainer:i,scrollOffset:l}},function(e,t,n){"use strict";function r(e,t){var n=e.prototype;for(var r in t)for(var l=t[r],a=0,s=l.length;a<s;a++){var u=l[a];o(n,r,u(n,r,i(n,r)))}return e}t.a=r;var o=Object.defineProperty,i=Object.getOwnPropertyDescriptor},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function o(e,t){if("undefined"==typeof WeakMap)throw new Error("Using @autobind on "+t.name+"() requires WeakMap support due to its use of super."+t.name+"()\n      See https://github.com/jayphelps/core-decorators.js/issues/20");f||(f=new WeakMap),!1===f.has(e)&&f.set(e,new WeakMap);var r=f.get(e);return!1===r.has(t)&&r.set(t,n.i(u.a)(t,e)),r.get(t)}function i(e){for(var t=n.i(u.f)(e.prototype),r=n.i(u.g)(t),o=0,i=r.length;o<i;o++){var a=r[o],s=t[a];"function"==typeof s.value&&"constructor"!==a&&c(e.prototype,a,l(e.prototype,a,s))}}function l(e,t,r){var i=r.value,l=r.configurable,a=r.enumerable;if("function"!=typeof i)throw new SyntaxError("@autobind can only be used on functions, not: "+i);var s=e.constructor;return{configurable:l,enumerable:a,get:function(){if(this===e)return i;if(this.constructor!==s&&d(this).constructor===s)return i;if(this.constructor!==s&&t in this.constructor.prototype)return o(this,i);var r=n.i(u.a)(i,this);return c(this,t,{configurable:!0,writable:!0,enumerable:!1,value:r}),r},set:n.i(u.e)(t)}}function a(e){return 1===e.length?i.apply(void 0,r(e)):l.apply(void 0,r(e))}function s(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(){return a(arguments)}:a(t)}t.a=s;var u=n(0),c=Object.defineProperty,d=Object.getPrototypeOf,f=void 0},function(e,t,n){"use strict";function r(e,t,r,o){var u=a(o,2),c=u[0],d=void 0===c?s:c,f=u[1],h=void 0!==f&&f,p=r.value;if("function"!=typeof p)throw new SyntaxError("Only functions can be debounced");return l({},r,{value:function(){var e=this,r=n.i(i.c)(this),o=r.debounceTimeoutIds,l=o[t],a=h&&!l,s=arguments;clearTimeout(l),o[t]=setTimeout(function(){delete o[t],h||p.apply(e,s)},d),a&&p.apply(this,s)}})}function o(){n.i(i.h)("@debounce is deprecated and will be removed shortly. Use @debounce from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators");for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=300},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function o(e){return Array.isArray(e)?e:Array.from(e)}function i(e,t,i,l){var u=o(l),c=u[0],d=u.slice(1),f=i.configurable,h=i.enumerable,p=i.writable,m=i.get,y=i.set,v=i.value,g=!!m;return{configurable:f,enumerable:h,get:function(){var e=g?m.call(this):v,n=c.call.apply(c,[this,e].concat(r(d)));if(g)return n;var o={configurable:f,enumerable:h};return o.value=n,o.writable=p,s(this,t,o),n},set:g?y:n.i(a.e)()}}function l(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(a.d)(i,t)}t.a=l;var a=n(0),s=Object.defineProperty},function(e,t,n){"use strict";function r(e,t,r,o){var u=a(o,2),c=u[0],d=void 0===c?s:c,f=u[1],h=void 0===f?{}:f;if("function"!=typeof r.value)throw new SyntaxError("Only functions can be marked as deprecated");var p=e.constructor.name+"#"+t;return h.url&&(d+="\n\n    See "+h.url+" for more details.\n\n"),l({},r,{value:function(){return n.i(i.b)("DEPRECATION "+p+": "+d),r.value.apply(this,arguments)}})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s="This function will be removed in future versions."},function(e,t,n){"use strict";function r(e,t,n){return n.enumerable=!0,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(e,t,n){var r=a(e),o=s(r,t);return l({},o,{value:n.value,initializer:n.initializer,get:n.get||o.get,set:n.set||o.set})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=Object.getPrototypeOf,s=Object.getOwnPropertyDescriptor},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){return t===Object(t)?t:e[t]||(e[t]={})}function i(e,t,n,r,o){var i=t.apply(e,n);return r[o]=i,i}function l(e){var t=void 0,n=void 0;return e.value?(t=e.value,n="value"):e.get?(t=e.get,n="get"):e.set&&(t=e.set,n="set"),{fn:t,wrapKey:n}}function a(e,t,n){var a=l(n),s=a.fn,u=a.wrapKey,d=new WeakMap,f=Object.create(null),h=Object.create(null),p=0;return c({},n,r({},u,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r="0",l=0,a=t.length;l<a;l++){var u=t[l],c=o(h,u),m=d.get(c);void 0===m&&(m=++p,d.set(c,m)),r+=m}return f[r]||i(this,s,arguments,f,r)}))}function s(){n.i(u.h)("@memoize is deprecated and will be removed shortly. Use @memoize from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators");for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(u.d)(a,t)}t.a=s;var u=n(0),c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}},function(e,t,n){"use strict";function r(e){return"[object Symbol]"===Object.prototype.toString.call(e)&&"object"===(void 0===e?"undefined":s(e))}function o(e,t){if(r(e)){do{if(t===Object.prototype)return void 0!==t[e];if(t.hasOwnProperty(e))return!0}while(t=c(t));return!1}return e in t}function i(e,t){if(!t.length)throw new SyntaxError("@mixin() class "+e.name+" requires at least one mixin as an argument");for(var r=0,i=t.length;r<i;r++)for(var l=n.i(a.f)(t[r]),s=n.i(a.g)(l),c=0,d=s.length;c<d;c++){var f=s[c];o(f,e.prototype)||u(e.prototype,f,l[f])}}function l(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(a.h)("@mixin is deprecated and will be removed shortly. Use @mixin from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators"),"function"==typeof t[0]?i(t[0],[]):function(e){return i(e,t)}}t.a=l;var a=n(0),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u=Object.defineProperty,c=Object.getPrototypeOf},function(e,t,n){"use strict";function r(e,t,n){return n.configurable=!1,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(e,t,n){return n.enumerable=!1,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){return e.hasOwnProperty("value")?"data":e.hasOwnProperty("get")||e.hasOwnProperty("set")?"accessor":"data"}function i(e,t,n){n.assert(e.length===t.length)}function l(e,t,n){var r=h(e.value),o=h(t.value);if("undefined"===r&&"undefined"===o&&n.error("descriptor values are both undefined. (class properties are are not currently supported)'"),r!==o){("function"===o&&void 0===r||void 0!==r)&&n.error('value types do not match. {parent} is "'+r+'", {child} is "'+o+'"')}switch(o){case"function":i(e.value,t.value,n);break;default:n.error('Unexpected error. Please file a bug with: {parent} is "'+r+'", {child} is "'+o+'"')}}function a(e,t,n){var r="function"==typeof e.get,o="function"==typeof t.get,l="function"==typeof e.set,a="function"==typeof t.set;(r||o)&&(!r&&l&&n.error("{parent} is setter but {child} is getter"),!o&&a&&n.error("{parent} is getter but {child} is setter"),i(e.get,t.get,n)),(l||a)&&(!l&&r&&n.error("{parent} is getter but {child} is setter"),!a&&o&&n.error("{parent} is setter but {child} is getter"),i(e.set,t.set,n))}function s(e,t,n){var r=o(e),i=o(t);switch(r!==i&&n.error('descriptor types do not match. {parent} is "'+r+'", {child} is "'+i+'"'),i){case"data":l(e,t,n);break;case"accessor":a(e,t,n)}}function u(e,t){for(var n=0,r=v.length;n<r;n++){var o=v[n],i=o(t);if(i in e)return i}return null}function c(e,t,n){n.key=t;var r=Object.getPrototypeOf(e),o=Object.getOwnPropertyDescriptor(r,t),i=new y(r,e,o,n);if(void 0===o){var l=u(r,t),a=l?'\n\n  Did you mean "'+l+'"?':"";i.error("No descriptor matching {child} was found on the prototype chain."+a)}return s(o,n,i),n}function d(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(f.d)(c,t)}t.a=d;var f=n(0),h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),m=/^function ([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?(\([^\)]*\))[\s\S]+$/,y=function(){function e(t,n,o,i){r(this,e),this.parentKlass=t,this.childKlass=n,this.parentDescriptor=o,this.childDescriptor=i}return p(e,[{key:"_getTopic",value:function(e){return void 0===e?null:"value"in e?e.value:"get"in e?e.get:"set"in e?e.set:void 0}},{key:"_extractTopicSignature",value:function(e){switch(void 0===e?"undefined":h(e)){case"function":return this._extractFunctionSignature(e);default:return this.key}}},{key:"_extractFunctionSignature",value:function(e){var t=this;return e.toString().replace(m,function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.key)+arguments[2]})}},{key:"key",get:function(){return this.childDescriptor.key}},{key:"parentNotation",get:function(){return this.parentKlass.constructor.name+"#"+this.parentPropertySignature}},{key:"childNotation",get:function(){return this.childKlass.constructor.name+"#"+this.childPropertySignature}},{key:"parentTopic",get:function(){return this._getTopic(this.parentDescriptor)}},{key:"childTopic",get:function(){return this._getTopic(this.childDescriptor)}},{key:"parentPropertySignature",get:function(){return this._extractTopicSignature(this.parentTopic)}},{key:"childPropertySignature",get:function(){return this._extractTopicSignature(this.childTopic)}}]),p(e,[{key:"assert",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";!0!==e&&this.error("{child} does not properly override {parent}"+t)}},{key:"error",value:function(e){var t=this;throw e=e.replace("{parent}",function(e){return t.parentNotation}).replace("{child}",function(e){return t.childNotation}),new SyntaxError(e)}}]),e}(),v=[function(e){return e.toLowerCase()},function(e){return e.toUpperCase()},function(e){return e+"s"},function(e){return e.slice(0,-1)},function(e){return e.slice(1,e.length)}]},function(e,t,n){"use strict";function r(e,t,r,u){var c=a(u,3),d=c[0],f=void 0===d?null:d,h=c[1],p=void 0!==h&&h,m=c[2],y=void 0===m?s:m;if(!o.__enabled)return o.__warned||(y.warn("console.profile is not supported. All @profile decorators are disabled."),o.__warned=!0),r;var v=r.value;if(null===f&&(f=e.constructor.name+"."+t),"function"!=typeof v)throw new SyntaxError("@profile can only be used on functions, not: "+v);return l({},r,{value:function(){var e=Date.now(),t=n.i(i.c)(this);(!0===p&&!t.profileLastRan||!1===p||"number"==typeof p&&e-t.profileLastRan>p||"function"==typeof p&&p.apply(this,arguments))&&(y.profile(f),t.profileLastRan=e);try{return v.apply(this,arguments)}finally{y.profileEnd(f)}}})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=(console,{profile:console.profile?n.i(i.a)(console.profile,console):function(){},profileEnd:console.profileEnd?n.i(i.a)(console.profileEnd,console):function(){},warn:i.b});o.__enabled=!!console.profile,o.__warned=!1},function(e,t,n){"use strict";function r(e,t,n){return n.writable=!1,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(){}function o(e,t,n){if("object"===("undefined"==typeof console?"undefined":u(console))){var o=console.warn;console.warn=r;var i=t.apply(e,n);return console.warn=o,i}return t.apply(e,n)}function i(e,t,n){return s({},n,{value:function(){return o(this,n.value,arguments)}})}function l(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(a.d)(i,t)}t.a=l;var a=n(0),s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}},function(e,t,n){"use strict";function r(e,t,r,o){var u=a(o,2),c=u[0],d=void 0===c?s:c,f=u[1],h=void 0===f?{}:f,p=r.value;if("function"!=typeof p)throw new SyntaxError("Only functions can be throttled");return!1!==h.leading&&(h.leading=!0),!1!==h.trailing&&(h.trailing=!0),l({},r,{value:function(){var e=this,r=n.i(i.c)(this),o=r.throttleTimeoutIds,l=r.throttlePreviousTimestamps,a=o[t],s=l[t]||0,u=Date.now();h.trailing&&(r.throttleTrailingArgs=arguments),s||!1!==h.leading||(s=u);var c=d-(u-s);c<=0?(clearTimeout(a),delete o[t],l[t]=u,p.apply(this,arguments)):!a&&h.trailing&&(o[t]=setTimeout(function(){l[t]=!1===h.leading?0:Date.now(),delete o[t],p.apply(e,r.throttleTrailingArgs),r.throttleTrailingArgs=null},c))}})}function o(){n.i(i.h)("@throttle is deprecated and will be removed shortly. Use @throttle from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators");for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=300},function(e,t,n){"use strict";function r(e,t,n,r){var o=a(r,2),i=o[0],s=void 0===i?null:i,d=o[1],f=void 0===d?u:d,h=n.value;if(null===s&&(s=e.constructor.name+"."+t),"function"!=typeof h)throw new SyntaxError("@time can only be used on functions, not: "+h);return l({},n,{value:function(){var e=s+"-"+c;c++,f.time(e);try{return h.apply(this,arguments)}finally{f.timeEnd(e)}}})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s={},u={time:console.time?console.time.bind(console):function(e){s[e]=new Date},timeEnd:console.timeEnd?console.timeEnd.bind(console):function(e){var t=new Date,n=t-s[e];delete s[e],console.log(e+": "+n+"ms")}},c=0},function(e,t){},function(e,t){},function(e,t,n){"use strict";function r(){}var o=n(34);e.exports=function(){function e(e,t,n,r,i,l){if(l!==o){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(13),l=r(i),a=n(42),s=r(a),u=n(38),c=r(u),d={},f=void 0;t.default={unmount:function(){d={}},register:function(e,t){d[e]=t},unregister:function(e){delete d[e]},get:function(e){return d[e]||document.getElementById(e)||document.getElementsByName(e)[0]||document.getElementsByClassName(e)[0]},setActiveLink:function(e){return f=e},getActiveLink:function(){return f},scrollTo:function(e,t){var n=this.get(e);if(!n)return void console.warn("target Element not found");t=o({},t,{absolute:!1});var r=t.containerId,i=t.container,a=void 0;a=r?document.getElementById(r):i&&i.nodeType?i:document,c.default.registered.begin&&c.default.registered.begin(e,n),t.absolute=!0;var u=l.default.scrollOffset(a,n)+(t.offset||0);if(!t.smooth)return a===document?window.scrollTo(0,u):a.scrollTop=u,void(c.default.registered.end&&c.default.registered.end(e,n));s.default.animateTopScroll(u,t,e,n)}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),i=r(o),l=n(2),a=r(l),s=n(8),u=r(s);n(41);var c={text:a.default.string.isRequired,img:a.default.string.isRequired},d=function(e){var t=e.text,n=e.img,r=(0,u.default)({bar:!0});return i.default.createElement("div",{className:r},i.default.createElement("div",{className:"bar-body"},i.default.createElement("img",{src:n,className:"front-img"}),i.default.createElement("span",null,t),i.default.createElement("img",{src:n,className:"back-img"})))};d.propTypes=c,t.default=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.addPassiveEventListener=function(e,t,n){var r=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t)}catch(e){}return e}();e.addEventListener(t,n,!!r&&{passive:!0})},t.removePassiveEventListener=function(e,t,n){e.removeEventListener(t,n)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={registered:{},scrollEvent:{register:function(e,t){r.registered[e]=t},remove:function(e){r.registered[e]=null}}};t.default=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(6),f=(r(d),n(13)),h=(r(f),n(40)),p=r(h),m=n(35),y=r(m),v=n(2),g=r(v),b=n(44),k=r(b),w={to:g.default.string.isRequired,containerId:g.default.string,container:g.default.object,activeClass:g.default.string,spy:g.default.bool,smooth:g.default.oneOfType([g.default.bool,g.default.string]),offset:g.default.number,delay:g.default.number,isDynamic:g.default.bool,onClick:g.default.func,duration:g.default.oneOfType([g.default.number,g.default.func]),absolute:g.default.bool,onSetActive:g.default.func,onSetInactive:g.default.func,ignoreCancelEvents:g.default.bool,hashSpy:g.default.bool};t.default=function(e,t){var n=t||y.default,r=function(t){function r(e){o(this,r);var t=i(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,e));return u.call(t),t.state={active:!1},t}return l(r,t),s(r,[{key:"getScrollSpyContainer",value:function(){var e=this.props.containerId,t=this.props.container;return e&&!t?document.getElementById(e):t&&t.nodeType?t:document}},{key:"componentDidMount",value:function(){if(this.props.spy||this.props.hashSpy){var e=this.getScrollSpyContainer();p.default.isMounted(e)||p.default.mount(e),this.props.hashSpy&&(k.default.isMounted()||k.default.mount(n),k.default.mapContainer(this.props.to,e)),p.default.addSpyHandler(this.spyHandler,e),this.setState({container:e})}}},{key:"componentWillUnmount",value:function(){p.default.unmount(this.stateHandler,this.spyHandler)}},{key:"render",value:function(){var t="";t=this.state&&this.state.active?((this.props.className||"")+" "+(this.props.activeClass||"active")).trim():this.props.className;var n=a({},this.props);for(var r in w)n.hasOwnProperty(r)&&delete n[r];return n.className=t,n.onClick=this.handleClick,c.default.createElement(e,n)}}]),r}(c.default.PureComponent),u=function(){var e=this;this.scrollTo=function(t,r){n.scrollTo(t,a({},e.state,r))},this.handleClick=function(t){e.props.onClick&&e.props.onClick(t),t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),e.scrollTo(e.props.to,e.props)},this.spyHandler=function(t){var r=e.getScrollSpyContainer();if(!k.default.isMounted()||k.default.isInitialized()){var o=e.props.to,i=null,l=0,a=0,s=0;if(r.getBoundingClientRect){s=r.getBoundingClientRect().top}if(!i||e.props.isDynamic){if(!(i=n.get(o)))return;var u=i.getBoundingClientRect();l=u.top-s+t,a=l+u.height}var c=t-e.props.offset,d=c>=Math.floor(l)&&c<Math.floor(a),f=c<Math.floor(l)||c>=Math.floor(a),h=n.getActiveLink();f&&(o===h&&n.setActiveLink(void 0),e.props.hashSpy&&k.default.getHash()===o&&k.default.changeHash(),e.props.spy&&e.state.active&&(e.setState({active:!1}),e.props.onSetInactive&&e.props.onSetInactive(o,i))),!d||h===o&&!1!==e.state.active||(n.setActiveLink(o),e.props.hashSpy&&k.default.changeHash(o),e.props.spy&&(e.setState({active:!0}),e.props.onSetActive&&e.props.onSetActive(o,i)))}}};return r.propTypes=w,r.defaultProps={offset:0},r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(47),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i=n(37),l=function(e){return(0,o.default)(e,66)},a={spyCallbacks:[],spySetState:[],scrollSpyContainers:[],mount:function(e){if(e){var t=l(function(t){a.scrollHandler(e)});a.scrollSpyContainers.push(e),(0,i.addPassiveEventListener)(e,"scroll",t)}},isMounted:function(e){return-1!==a.scrollSpyContainers.indexOf(e)},currentPositionY:function(e){if(e===document){var t=void 0!==window.pageXOffset,n="CSS1Compat"===(document.compatMode||"");return t?window.pageYOffset:n?document.documentElement.scrollTop:document.body.scrollTop}return e.scrollTop},scrollHandler:function(e){(a.scrollSpyContainers[a.scrollSpyContainers.indexOf(e)].spyCallbacks||[]).forEach(function(t){return t(a.currentPositionY(e))})},addStateHandler:function(e){a.spySetState.push(e)},addSpyHandler:function(e,t){var n=a.scrollSpyContainers[a.scrollSpyContainers.indexOf(t)];n.spyCallbacks||(n.spyCallbacks=[]),n.spyCallbacks.push(e),e(a.currentPositionY(t))},updateStates:function(){a.spySetState.forEach(function(e){return e()})},unmount:function(e,t){a.scrollSpyContainers.forEach(function(e){return e.spyCallbacks&&e.spyCallbacks.length&&e.spyCallbacks.splice(e.spyCallbacks.indexOf(t),1)}),a.spySetState&&a.spySetState.length&&a.spySetState.splice(a.spySetState.indexOf(e),1),document.removeEventListener("scroll",a.scrollHandler)},update:function(){return a.scrollSpyContainers.forEach(function(e){return a.scrollHandler(e)})}};t.default=a},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(13),l=(r(i),n(54)),a=r(l),s=n(53),u=r(s),c=n(38),d=r(c),f=function(e){return a.default[e.smooth]||a.default.defaultEasing},h=function(e){return"function"==typeof e?e:function(){return e}},p=function(){if("undefined"!=typeof window)return window.requestAnimationFrame||window.webkitRequestAnimationFrame},m=function(){return p()||function(e,t,n){window.setTimeout(e,n||1e3/60,(new Date).getTime())}}(),y=function(){return{currentPositionY:0,startPositionY:0,targetPositionY:0,progress:0,duration:0,cancel:!1,target:null,containerElement:null,to:null,start:null,deltaTop:null,percent:null,delayTimeout:null}},v=function(e){var t=e.data.containerElement;if(t&&t!==document&&t!==document.body)return t.scrollTop;var n=void 0!==window.pageXOffset,r="CSS1Compat"===(document.compatMode||"");return n?window.pageYOffset:r?document.documentElement.scrollTop:document.body.scrollTop},g=function(e){var t=e.data.containerElement;if(t&&t!==document&&t!==document.body)return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight);var n=document.body,r=document.documentElement;return Math.max(n.scrollHeight,n.offsetHeight,r.clientHeight,r.scrollHeight,r.offsetHeight)},b=function e(t,n,r){var o=n.data;if(!n.ignoreCancelEvents&&o.cancel)return void(d.default.registered.end&&d.default.registered.end(o.to,o.target,o.currentPositionY));if(o.deltaTop=Math.round(o.targetPositionY-o.startPositionY),null===o.start&&(o.start=r),o.progress=r-o.start,o.percent=o.progress>=o.duration?1:t(o.progress/o.duration),o.currentPositionY=o.startPositionY+Math.ceil(o.deltaTop*o.percent),o.containerElement&&o.containerElement!==document&&o.containerElement!==document.body?o.containerElement.scrollTop=o.currentPositionY:window.scrollTo(0,o.currentPositionY),o.percent<1){var i=e.bind(null,t,n);return void m.call(window,i)}d.default.registered.end&&d.default.registered.end(o.to,o.target,o.currentPositionY)},k=function(e){e.data.containerElement=e?e.containerId?document.getElementById(e.containerId):e.container&&e.container.nodeType?e.container:document:null},w=function(e,t,n,r){if(t.data=t.data||y(),window.clearTimeout(t.data.delayTimeout),u.default.subscribe(function(){t.data.cancel=!0}),k(t),t.data.start=null,t.data.cancel=!1,t.data.startPositionY=v(t),t.data.targetPositionY=t.absolute?e:e+t.data.startPositionY,t.data.startPositionY===t.data.targetPositionY)return void(d.default.registered.end&&d.default.registered.end(t.data.to,t.data.target,t.data.currentPositionY));t.data.deltaTop=Math.round(t.data.targetPositionY-t.data.startPositionY),t.data.duration=h(t.duration)(t.data.deltaTop),t.data.duration=isNaN(parseFloat(t.data.duration))?1e3:parseFloat(t.data.duration),t.data.to=n,t.data.target=r;var o=f(t),i=b.bind(null,o,t);if(t&&t.delay>0)return void(t.data.delayTimeout=window.setTimeout(function(){m.call(window,i)},t.delay));m.call(window,i)},O=function(e){return e=o({},e),e.data=e.data||y(),e.absolute=!0,e},_=function(e){w(0,O(e))},S=function(e,t){w(e,O(t))},E=function(e){e=O(e),k(e),w(g(e),e)},P=function(e,t){t=O(t),k(t),w(v(t)+e,t)};t.default={animateTopScroll:w,getAnimationType:f,scrollToTop:_,scrollToBottom:E,scrollTo:S,scrollMore:P}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(6),f=(r(d),n(35)),h=r(f),p=n(2),m=r(p);t.default=function(e){var t=function(t){function n(e){o(this,n);var t=i(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));return t.childBindings={domNode:null},t}return l(n,t),s(n,[{key:"componentDidMount",value:function(){if("undefined"==typeof window)return!1;this.registerElems(this.props.name)}},{key:"componentWillReceiveProps",value:function(e){this.props.name!==e.name&&this.registerElems(e.name)}},{key:"componentWillUnmount",value:function(){if("undefined"==typeof window)return!1;h.default.unregister(this.props.name)}},{key:"registerElems",value:function(e){h.default.register(e,this.childBindings.domNode)}},{key:"render",value:function(){return c.default.createElement(e,a({},this.props,{parentBindings:this.childBindings}))}}]),n}(c.default.Component);return t.propTypes={name:m.default.string,id:m.default.string},t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=(n(37),n(13)),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i={mountFlag:!1,initialized:!1,scroller:null,containers:{},mount:function(e){this.scroller=e,this.handleHashChange=this.handleHashChange.bind(this),window.addEventListener("hashchange",this.handleHashChange),this.initStateFromHash(),this.mountFlag=!0},mapContainer:function(e,t){this.containers[e]=t},isMounted:function(){return this.mountFlag},isInitialized:function(){return this.initialized},initStateFromHash:function(){var e=this,t=this.getHash();t?window.setTimeout(function(){e.scrollTo(t,!0),e.initialized=!0},10):this.initialized=!0},scrollTo:function(e,t){var n=this.scroller;if(n.get(e)&&(t||e!==n.getActiveLink())){var r=this.containers[e]||document;n.scrollTo(e,{container:r})}},getHash:function(){return o.default.getHash()},changeHash:function(e){this.isInitialized()&&o.default.getHash()!==e&&o.default.pushHash(e)},handleHashChange:function(){this.scrollTo(this.getHash())},unmount:function(){this.scroller=null,this.containers=null,window.removeEventListener("hashchange",this.handleHashChange)}};t.default=i},function(e,t,n){(function(e){function n(e,t){for(var n=0,r=e.length-1;r>=0;r--){var o=e[r];"."===o?e.splice(r,1):".."===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.length;r++)t(e[r],r,e)&&n.push(e[r]);return n}var o=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return o.exec(e).slice(1)};t.resolve=function(){for(var t="",o=!1,i=arguments.length-1;i>=-1&&!o;i--){var l=i>=0?arguments[i]:e.cwd();if("string"!=typeof l)throw new TypeError("Arguments to path.resolve must be strings");l&&(t=l+"/"+t,o="/"===l.charAt(0))}return t=n(r(t.split("/"),function(e){return!!e}),!o).join("/"),(o?"/":"")+t||"."},t.normalize=function(e){var o=t.isAbsolute(e),i="/"===l(e,-1);return e=n(r(e.split("/"),function(e){return!!e}),!o).join("/"),e||o||(e="."),e&&i&&(e+="/"),(o?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(r(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},t.relative=function(e,n){function r(e){for(var t=0;t<e.length&&""===e[t];t++);for(var n=e.length-1;n>=0&&""===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=t.resolve(e).substr(1),n=t.resolve(n).substr(1);for(var o=r(e.split("/")),i=r(n.split("/")),l=Math.min(o.length,i.length),a=l,s=0;s<l;s++)if(o[s]!==i[s]){a=s;break}for(var u=[],s=a;s<o.length;s++)u.push("..");return u=u.concat(i.slice(a)),u.join("/")},t.sep="/",t.delimiter=":",t.dirname=function(e){var t=i(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},t.basename=function(e,t){var n=i(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},t.extname=function(e){return i(e)[3]};var l="b"==="ab".substr(-1)?function(e,t,n){return e.substr(t,n)}:function(e,t,n){return t<0&&(t=e.length+t),e.substr(t,n)}}).call(t,n(48))},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Helpers=t.ScrollElement=t.ScrollLink=t.animateScroll=t.scrollSpy=t.Events=t.scroller=t.Element=t.Button=t.Link=void 0;var o=n(51),i=r(o),l=n(49),a=r(l),s=n(50),u=r(s),c=n(35),d=r(c),f=n(38),h=r(f),p=n(40),m=r(p),y=n(42),v=r(y),g=n(39),b=r(g),k=n(43),w=r(k),O=n(52),_=r(O);t.Link=i.default,t.Button=a.default,t.Element=u.default,t.scroller=d.default,t.Events=h.default,t.scrollSpy=m.default,t.animateScroll=v.default,t.ScrollLink=b.default,t.ScrollElement=w.default,t.Helpers=_.default,t.default={Link:i.default,Button:a.default,Element:u.default,scroller:d.default,Events:h.default,scrollSpy:m.default,animateScroll:v.default,ScrollLink:b.default,ScrollElement:w.default,Helpers:_.default}},function(e,t,n){(function(t){function n(e,t,n){function r(t){var n=m,r=y;return m=y=void 0,S=t,g=e.apply(r,n)}function i(e){return S=e,b=setTimeout(c,t),E?r(e):g}function l(e){var n=e-k,r=e-S,o=t-n;return P?O(o,v-r):o}function u(e){var n=e-k,r=e-S;return void 0===k||n>=t||n<0||P&&r>=v}function c(){var e=_();if(u(e))return d(e);b=setTimeout(c,l(e))}function d(e){return b=void 0,j&&m?r(e):(m=y=void 0,g)}function f(){void 0!==b&&clearTimeout(b),S=0,m=k=y=b=void 0}function h(){return void 0===b?g:d(_())}function p(){var e=_(),n=u(e);if(m=arguments,y=this,k=e,n){if(void 0===b)return i(k);if(P)return b=setTimeout(c,t),r(k)}return void 0===b&&(b=setTimeout(c,t)),g}var m,y,v,g,b,k,S=0,E=!1,P=!1,j=!0;if("function"!=typeof e)throw new TypeError(s);return t=a(t)||0,o(n)&&(E=!!n.leading,P="maxWait"in n,v=P?w(a(n.maxWait)||0,t):v,j="trailing"in n?!!n.trailing:j),p.cancel=f,p.flush=h,p}function r(e,t,r){var i=!0,l=!0;if("function"!=typeof e)throw new TypeError(s);return o(r)&&(i="leading"in r?!!r.leading:i,l="trailing"in r?!!r.trailing:l),n(e,t,{leading:i,maxWait:t,trailing:l})}function o(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==typeof e}function l(e){return"symbol"==typeof e||i(e)&&k.call(e)==c}function a(e){if("number"==typeof e)return e;if(l(e))return u;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=h.test(e);return n||p.test(e)?m(e.slice(2),n?2:8):f.test(e)?u:+e}var s="Expected a function",u=NaN,c="[object Symbol]",d=/^\s+|\s+$/g,f=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,p=/^0o[0-7]+$/i,m=parseInt,y="object"==typeof t&&t&&t.Object===Object&&t,v="object"==typeof self&&self&&self.Object===Object&&self,g=y||v||Function("return this")(),b=Object.prototype,k=b.toString,w=Math.max,O=Math.min,_=function(){return g.Date.now()};e.exports=r}).call(t,n(55))},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(d===clearTimeout)return clearTimeout(e);if((d===r||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(e);try{return d(e)}catch(t){try{return d.call(null,e)}catch(t){return d.call(this,e)}}}function l(){m&&h&&(m=!1,h.length?p=h.concat(p):y=-1,p.length&&a())}function a(){if(!m){var e=o(l);m=!0;for(var t=p.length;t;){for(h=p,p=[];++y<t;)h&&h[y].run();y=-1,t=p.length}h=null,m=!1,i(e)}}function s(e,t){this.fun=e,this.array=t}function u(){}var c,d,f=e.exports={};!function(){try{c="function"==typeof setTimeout?setTimeout:n}catch(e){c=n}try{d="function"==typeof clearTimeout?clearTimeout:r}catch(e){d=r}}();var h,p=[],m=!1,y=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];p.push(new s(e,t)),1!==p.length||m||o(a)},s.prototype.run=function(){this.fun.apply(null,this.array)},f.title="browser",f.browser=!0,f.env={},f.argv=[],f.version="",f.versions={},f.on=u,f.addListener=u,f.once=u,f.off=u,f.removeListener=u,f.removeAllListeners=u,f.emit=u,f.prependListener=u,f.prependOnceListener=u,f.listeners=function(e){return[]},f.binding=function(e){throw new Error("process.binding is not supported")},f.cwd=function(){return"/"},f.chdir=function(e){throw new Error("process.chdir is not supported")},f.umask=function(){return 0}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=r(s),c=n(39),d=r(c),f=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),a(t,[{key:"render",value:function(){return u.default.createElement("input",this.props,this.props.children)}}]),t}(u.default.Component);t.default=(0,d.default)(f)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(43),f=r(d),h=n(2),p=r(h),m=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),s(t,[{key:"render",value:function(){var e=this,t=a({},this.props);return t.parentBindings&&delete t.parentBindings,c.default.createElement("div",a({},t,{ref:function(t){e.props.parentBindings.domNode=t}}),this.props.children)}}]),t}(c.default.Component);m.propTypes={name:p.default.string,id:p.default.string},t.default=(0,f.default)(m)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(1),s=r(a),u=n(39),c=r(u),d=function(e){function t(){var e,n,r,l;o(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),r.render=function(){return s.default.createElement("a",r.props,r.props.children)},l=n,i(r,l)}return l(t,e),t}(s.default.Component);t.default=(0,c.default)(d)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=(n(6),n(13),n(40)),c=n(35),d=n(2),f=n(44),h={to:d.string.isRequired,containerId:d.string,container:d.object,activeClass:d.string,spy:d.bool,smooth:d.oneOfType([d.bool,d.string]),offset:d.number,delay:d.number,isDynamic:d.bool,onClick:d.func,duration:d.oneOfType([d.number,d.func]),absolute:d.bool,onSetActive:d.func,onSetInactive:d.func,ignoreCancelEvents:d.bool,hashSpy:d.bool},p={Scroll:function(e,t){console.warn("Helpers.Scroll is deprecated since v1.7.0");var n=t||c,d=function(t){function c(e){r(this,c);var t=o(this,(c.__proto__||Object.getPrototypeOf(c)).call(this,e));return p.call(t),t.state={active:!1},t}return i(c,t),a(c,[{key:"getScrollSpyContainer",value:function(){var e=this.props.containerId,t=this.props.container;return e?document.getElementById(e):t&&t.nodeType?t:document}},{key:"componentDidMount",value:function(){if(this.props.spy||this.props.hashSpy){var e=this.getScrollSpyContainer();u.isMounted(e)||u.mount(e),this.props.hashSpy&&(f.isMounted()||f.mount(n),f.mapContainer(this.props.to,e)),this.props.spy&&u.addStateHandler(this.stateHandler),u.addSpyHandler(this.spyHandler,e),this.setState({container:e})}}},{key:"componentWillUnmount",value:function(){u.unmount(this.stateHandler,this.spyHandler)}},{key:"render",value:function(){var t="";t=this.state&&this.state.active?((this.props.className||"")+" "+(this.props.activeClass||"active")).trim():this.props.className;var n=l({},this.props);for(var r in h)n.hasOwnProperty(r)&&delete n[r];return n.className=t,n.onClick=this.handleClick,s.createElement(e,n)}}]),c}(s.Component),p=function(){var e=this;this.scrollTo=function(t,r){n.scrollTo(t,l({},e.state,r))},this.handleClick=function(t){e.props.onClick&&e.props.onClick(t),t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),e.scrollTo(e.props.to,e.props)},this.stateHandler=function(){n.getActiveLink()!==e.props.to&&(null!==e.state&&e.state.active&&e.props.onSetInactive&&e.props.onSetInactive(),e.setState({active:!1}))},this.spyHandler=function(t){var r=e.getScrollSpyContainer();if(!f.isMounted()||f.isInitialized()){var o=e.props.to,i=null,l=0,a=0,s=0;if(r.getBoundingClientRect){s=r.getBoundingClientRect().top}if(!i||e.props.isDynamic){if(!(i=n.get(o)))return;var c=i.getBoundingClientRect();l=c.top-s+t,a=l+c.height}var d=t-e.props.offset,h=d>=Math.floor(l)&&d<Math.floor(a),p=d<Math.floor(l)||d>=Math.floor(a),m=n.getActiveLink();return p?(o===m&&n.setActiveLink(void 0),e.props.hashSpy&&f.getHash()===o&&f.changeHash(),e.props.spy&&e.state.active&&(e.setState({active:!1}),e.props.onSetInactive&&e.props.onSetInactive()),u.updateStates()):h&&m!==o?(n.setActiveLink(o),e.props.hashSpy&&f.changeHash(o),e.props.spy&&(e.setState({active:!0}),e.props.onSetActive&&e.props.onSetActive(o)),u.updateStates()):void 0}}};return d.propTypes=h,d.defaultProps={offset:0},d},Element:function(e){console.warn("Helpers.Element is deprecated since v1.7.0");var t=function(t){function n(e){r(this,n);var t=o(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));return t.childBindings={domNode:null},t}return i(n,t),a(n,[{key:"componentDidMount",value:function(){if("undefined"==typeof window)return!1;this.registerElems(this.props.name)}},{key:"componentWillReceiveProps",value:function(e){this.props.name!==e.name&&this.registerElems(e.name)}},{key:"componentWillUnmount",value:function(){if("undefined"==typeof window)return!1;c.unregister(this.props.name)}},{key:"registerElems",value:function(e){c.register(e,this.childBindings.domNode)}},{key:"render",value:function(){return s.createElement(e,l({},this.props,{parentBindings:this.childBindings}))}}]),n}(s.Component);return t.propTypes={name:d.string,id:d.string},t}};e.exports=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(37),o=["mousedown","mousewheel","touchmove","keydown"];t.default={subscribe:function(e){return"undefined"!=typeof document&&o.forEach(function(t){return(0,r.addPassiveEventListener)(document,t,e)})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={defaultEasing:function(e){return e<.5?Math.pow(2*e,2)/2:1-Math.pow(2*(1-e),2)/2},linear:function(e){return e},easeInQuad:function(e){return e*e},easeOutQuad:function(e){return e*(2-e)},easeInOutQuad:function(e){return e<.5?2*e*e:(4-2*e)*e-1},easeInCubic:function(e){return e*e*e},easeOutCubic:function(e){return--e*e*e+1},easeInOutCubic:function(e){return e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1},easeInQuart:function(e){return e*e*e*e},easeOutQuart:function(e){return 1- --e*e*e*e},easeInOutQuart:function(e){return e<.5?8*e*e*e*e:1-8*--e*e*e*e},easeInQuint:function(e){return e*e*e*e*e},easeOutQuint:function(e){return 1+--e*e*e*e*e},easeInOutQuint:function(e){return e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e}}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={"en-us":{sidemenu:[{children:[{title:"How to contribute",link:"/en-us/docs/developers/guide_dev.html"},{title:"Developers",link:"/en-us/docs/developers/developers_dev.html"}]}],barText:"Developers"},"zh-cn":{sidemenu:[{children:[{title:"参与贡献",link:"/zh-cn/docs/developers/guide_dev.html"},{title:"开发人员",link:"/zh-cn/docs/developers/developers_dev.html"}]}],barText:"开发者"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={"en-us":{sidemenu:[{title:"User doc",children:[{title:"Preface",children:[{title:"Background",link:"/en-us/docs/user/preface/background.html"},{title:"Requirements",link:"/en-us/docs/user/preface/requirements.html"},{title:"Architecture",link:"/en-us/docs/user/preface/architecture.html"},{title:"Usage",link:"/en-us/docs/user/preface/usage.html"}]},{title:"Quick start",link:"/en-us/docs/user/quick-start.html"},{title:"Dependencies",link:"/en-us/docs/user/dependencies.html"},{title:"Maturality",link:"/en-us/docs/user/maturity.html"},{title:"Configuration",children:[{title:"XML configuration",link:"/en-us/docs/user/configuration/xml.html"},{title:"Properties configuration",link:"/en-us/docs/user/configuration/properties.html"},{title:"API configuration",link:"/en-us/docs/user/configuration/api.html"},{title:"Annotation configuration",link:"/en-us/docs/user/configuration/annotation.html"}]},{title:"Demos",children:[{title:"Start check",link:"/en-us/docs/user/demos/preflight-check.html"},{title:"Fault-tolerent strategy",link:"/en-us/docs/user/demos/fault-tolerent-strategy.html"},{title:"Load balance",link:"/en-us/docs/user/demos/loadbalance.html"},{title:"Thread model",link:"/en-us/docs/user/demos/thread-model.html"},{title:"Connecting certain provider straightly",link:"/en-us/docs/user/demos/explicit-target.html"},{title:"Subscribe only",link:"/en-us/docs/user/demos/subscribe-only.html"},{title:"Registry only",link:"/en-us/docs/user/demos/registry-only.html"},{title:"Static service",link:"/en-us/docs/user/demos/static-service.html"},{title:"Multi-protocols",link:"/en-us/docs/user/demos/multi-protocols.html"},{title:"Multi-registries",link:"/en-us/docs/user/demos/multi-registry.html"},{title:"Service group",link:"/en-us/docs/user/demos/service-group.html"},{title:"Multi-versions",link:"/en-us/docs/user/demos/multi-versions.html"},{title:"Group merger",link:"/en-us/docs/user/demos/group-merger.html"},{title:"Parameter validation",link:"/en-us/docs/user/demos/parameter-validation.html"},{title:"Result cache",link:"/en-us/docs/user/demos/result-cache.html"},{title:"Generic reference",link:"/en-us/docs/user/demos/generic-reference.html"},{title:"Generic service",link:"/en-us/docs/user/demos/generic-service.html"},{title:"Echo service",link:"/en-us/docs/user/demos/echo-service.html"},{title:"Context",link:"/en-us/docs/user/demos/context.html"},{title:"Attachment",link:"/en-us/docs/user/demos/attachment.html"},{title:"Asynchronous call",link:"/en-us/docs/user/demos/async-call.html"},{title:"Local call",link:"/en-us/docs/user/demos/local-call.html"},{title:"Callback parameter",link:"/en-us/docs/user/demos/callback-parameter.html"},{title:"Events notify",link:"/en-us/docs/user/demos/events-notify.html"},{title:"Local stub",link:"/en-us/docs/user/demos/local-stub.html"},{title:"Local mock",link:"/en-us/docs/user/demos/local-mock.html"},{title:"Delay publish",link:"/en-us/docs/user/demos/delay-publish.html"},{title:"Concurrency control",link:"/en-us/docs/user/demos/concurrency-control.html"},{title:"Connections limitation",link:"/en-us/docs/user/demos/config-connections.html"},{title:"Lazy connect",link:"/en-us/docs/user/demos/lazy-connect.html"},{title:"Stickness connections",link:"/en-us/docs/user/demos/stickiness.html"},{title:"Token authorization",link:"/en-us/docs/user/demos/token-authorization.html"},{title:"Routing rule",link:"/en-us/docs/user/demos/routing-rule.html"},{title:"Configuration rule",link:"/en-us/docs/user/demos/config-rule.html"},{title:"Service downgrade",link:"/en-us/docs/user/demos/service-downgrade.html"},{title:"Graceful shutdown",link:"/en-us/docs/user/demos/graceful-shutdown.html"},{title:"Hostname binding",link:"/en-us/docs/user/demos/hostname-binding.html"},{title:"Logger strategy",link:"/en-us/docs/user/demos/logger-strategy.html"},{title:"Accesslog",link:"/en-us/docs/user/demos/accesslog.html"},{title:"Service container",link:"/en-us/docs/user/demos/service-container.html"},{title:"Reference config cache",link:"/en-us/docs/user/demos/reference-config-cache.html"},{title:"Distributed transaction",link:"/en-us/docs/user/demos/distributed-transaction.html"},{title:"Automatic thread dump",link:"/en-us/docs/user/demos/dump.html"},{title:"Netty4",link:"/en-us/docs/user/demos/netty4.html"},{title:"Serialization with FST and Kyro",link:"/en-us/docs/user/demos/serialization.html"}]},{title:"API configuration reference",link:"/en-us/docs/user/references/api.html"},{title:"Schema configuration reference",children:[{title:"Introduction",link:"/en-us/docs/user/references/xml/introduction.html"},{title:"dubbo:service",link:"/en-us/docs/user/references/xml/dubbo-service.html"},{title:"dubbo:reference",link:"/en-us/docs/user/references/xml/dubbo-reference.html"},{title:"dubbo:protocol",link:"/en-us/docs/user/references/xml/dubbo-protocol.html"},{title:"dubbo:registry",link:"/en-us/docs/user/references/xml/dubbo-registry.html"},{title:"dubbo:monitor",link:"/en-us/docs/user/references/xml/dubbo-monitor.html"},{title:"dubbo:application",link:"/en-us/docs/user/references/xml/dubbo-application.html"},{title:"dubbo:module",link:"/en-us/docs/user/references/xml/dubbo-module.html"},{title:"dubbo:provider",link:"/en-us/docs/user/references/xml/dubbo-provider.html"},{title:"dubbo:consumer",link:"/en-us/docs/user/references/xml/dubbo-consumer.html"},{title:"dubbo:method",link:"/en-us/docs/user/references/xml/dubbo-method.html"},{title:"dubbo:argument",link:"/en-us/docs/user/references/xml/dubbo-argument.html"},{title:"dubbo:parameter",link:"/en-us/docs/user/references/xml/dubbo-parameter.html"}]},{title:"Protocol configuration reference",children:[{title:"Introduction",link:"/en-us/docs/user/references/protocol/introduction.html"},{title:"dubbo://",link:"/en-us/docs/user/references/protocol/dubbo.html"},{title:"rmi://",link:"/en-us/docs/user/references/protocol/rmi.html"},{title:"hessian://",link:"/en-us/docs/user/references/protocol/hessian.html"},{title:"http://",link:"/en-us/docs/user/references/protocol/http.html"},{title:"webservice://",link:"/en-us/docs/user/references/protocol/webservice.html"},{title:"thrift://",link:"/en-us/docs/user/references/protocol/thrift.html"},{title:"memcached://",link:"/en-us/docs/user/references/protocol/memcached.html"},{title:"redis://",link:"/en-us/docs/user/references/protocol/redis.html"},{title:"rest://",link:"/en-us/docs/user/references/protocol/rest.html"}]},{title:"Registry configuration reference",children:[{title:"Introduction",link:"/en-us/docs/user/references/registry/introduction.html"},{title:"Multicast registry",link:"/en-us/docs/user/references/registry/multicast.html"},{title:"Zookeeper registry",link:"/en-us/docs/user/references/registry/zookeeper.html"},{title:"Redis registry",link:"/en-us/docs/user/references/registry/redis.html"},{title:"Simple registry",link:"/en-us/docs/user/references/registry/simple.html"}]},{title:"Telnet command",link:"/en-us/docs/user/references/telnet.html"},{title:"Maven plugin",link:"/en-us/docs/user/references/maven.html"},{title:"Best practice",link:"/en-us/docs/user/best-practice.html"},{title:"Recommended usage",link:"/en-us/docs/user/recommend.html"},{title:"Capacity plan",link:"/en-us/docs/user/capacity-plan.html"},{title:"Performance testing reports",link:"/en-us/docs/user/perf-test.html"},{title:"Test coverage report",link:"/en-us/docs/user/coveragence.html"}]},{title:"Developer guide",children:[{title:"How To Build",link:"/en-us/docs/dev/build.html"},{title:"Architecture",link:"/en-us/docs/dev/design.html"},{title:"How SPI Works",link:"/en-us/docs/dev/SPI.html"},{title:"Init, Process, Protocols",link:"/en-us/docs/dev/implementation.html"},{title:"SPI Extensions",children:[{title:"Protocol",link:"/en-us/docs/dev/impls/protocol.html"},{title:"Filter",link:"/en-us/docs/dev/impls/filter.html"},{title:"InvokerListener",link:"/en-us/docs/dev/impls/invoker-listener.html"},{title:"ExporterListener",link:"/en-us/docs/dev/impls/exporter-listener.html"},{title:"Cluster",link:"/en-us/docs/dev/impls/cluster.html"},{title:"Router",link:"/en-us/docs/dev/impls/router.html"},{title:"LoadBalance",link:"/en-us/docs/dev/impls/load-balance.html"},{title:"Merger",link:"/en-us/docs/dev/impls/merger.html"},{title:"Registry",link:"/en-us/docs/dev/impls/registry.html"},{title:"Monitor",link:"/en-us/docs/dev/impls/monitor.html"},{title:"ExtensionFactory",link:"/en-us/docs/dev/impls/extension-factory.html"},{title:"ProxyFactory",link:"/en-us/docs/dev/impls/proxy-factory.html"},{title:"Compiler",link:"/en-us/docs/dev/impls/compiler.html"},{title:"Dispatcher",link:"/en-us/docs/dev/impls/dispatcher.html"},{title:"Threadpool",link:"/en-us/docs/dev/impls/threadpool.html"},{title:"Serialization",link:"/en-us/docs/dev/impls/serialize.html"},{title:"Remoting",link:"/en-us/docs/dev/impls/remoting.html"},{title:"Exchanger",link:"/en-us/docs/dev/impls/exchanger.html"},{title:"Networker",link:"/en-us/docs/dev/impls/networker.html"},{title:"TelnetHandler",link:"/en-us/docs/dev/impls/telnet-handler.html"},{title:"StatusChecker",link:"/en-us/docs/dev/impls/status-checker.html"},{title:"Container",link:"/en-us/docs/dev/impls/container.html"},{title:"PageHandler",link:"/en-us/docs/dev/impls/page.html"},{title:"Cache",link:"/en-us/docs/dev/impls/cache.html"},{title:"Validation",link:"/en-us/docs/dev/impls/validation.html"},{title:"LoggerAdapter",link:"/en-us/docs/dev/impls/logger-adapter.html"}]},{title:"Contract",link:"/en-us/docs/dev/contract.html"},{title:"Code Style",link:"/en-us/docs/dev/coding.html"},{title:"Versions",link:"/en-us/docs/dev/release.html"},{title:"Contribution",link:"/en-us/docs/dev/contribution.html"},{title:"Checklist",link:"/en-us/docs/dev/checklist.html"},{title:"Code Smell",link:"/en-us/docs/dev/code-smell.html"},{title:"TCK",link:"/en-us/docs/dev/TCK.html"}]},{title:"Admin guide",children:[{title:"Installation",children:[{title:"Install provider demo",link:"/en-us/docs/admin/install/provider-demo.html"},{title:"Install consumer demo",link:"/en-us/docs/admin/install/consumer-demo.html"},{title:"Install Zookeeper configuration center",link:"/en-us/docs/admin/install/zookeeper.html"},{title:"Install Redis configuration center",link:"/en-us/docs/admin/install/redis.html"},{title:"Install Simple configuration center",link:"/en-us/docs/admin/install/simple-registry-center.html"},{title:"Install Simple monitor center",link:"/en-us/docs/admin/install/simple-monitor-center.html"},{title:"Install admin console",link:"/en-us/docs/admin/install/admin-console.html"}]},{title:"Operation manual",children:[{title:"Admin console operation guide",link:"/en-us/docs/admin/ops/dubbo-ops.html"},{title:"Tracking with Pinpoint",link:"/en-us/docs/admin/ops/pinpoint.html"},{title:"Tracking with Skywalking",link:"/en-us/docs/admin/ops/skywalking.html"}]}]}],barText:"Documentation"},"zh-cn":{sidemenu:[{title:"用户文档",children:[{title:"入门",children:[{title:"背景",link:"/zh-cn/docs/user/preface/background.html"},{title:"需求",link:"/zh-cn/docs/user/preface/requirements.html"},{title:"架构",link:"/zh-cn/docs/user/preface/architecture.html"},{title:"用法",link:"/zh-cn/docs/user/preface/usage.html"}]},{title:"快速启动",link:"/zh-cn/docs/user/quick-start.html"},{title:"依赖",link:"/zh-cn/docs/user/dependencies.html"},{title:"成熟度",link:"/zh-cn/docs/user/maturity.html"},{title:"配置",children:[{title:"XML配置",link:"/zh-cn/docs/user/configuration/xml.html"},{title:"属性配置",link:"/zh-cn/docs/user/configuration/properties.html"},{title:"API配置",link:"/zh-cn/docs/user/configuration/api.html"},{title:"注解配置",link:"/zh-cn/docs/user/configuration/annotation.html"}]},{title:"示例",children:[{title:"启动时检查",link:"/zh-cn/docs/user/demos/preflight-check.html"},{title:"集群容错",link:"/zh-cn/docs/user/demos/fault-tolerent-strategy.html"},{title:"负载均衡",link:"/zh-cn/docs/user/demos/loadbalance.html"},{title:"线程模型",link:"/zh-cn/docs/user/demos/thread-model.html"},{title:"直连提供者",link:"/zh-cn/docs/user/demos/explicit-target.html"},{title:"只订阅",link:"/zh-cn/docs/user/demos/subscribe-only.html"},{title:"只注册",link:"/zh-cn/docs/user/demos/registry-only.html"},{title:"静态服务",link:"/zh-cn/docs/user/demos/static-service.html"},{title:"多协议",link:"/zh-cn/docs/user/demos/multi-protocols.html"},{title:"多注册中心",link:"/zh-cn/docs/user/demos/multi-registry.html"},{title:"服务分组",link:"/zh-cn/docs/user/demos/service-group.html"},{title:"多版本",link:"/zh-cn/docs/user/demos/multi-versions.html"},{title:"分组聚合",link:"/zh-cn/docs/user/demos/group-merger.html"},{title:"参数验证",link:"/zh-cn/docs/user/demos/parameter-validation.html"},{title:"结果缓存",link:"/zh-cn/docs/user/demos/result-cache.html"},{title:"泛化引用",link:"/zh-cn/docs/user/demos/generic-reference.html"},{title:"泛化实现",link:"/zh-cn/docs/user/demos/generic-service.html"},{title:"回声测试",link:"/zh-cn/docs/user/demos/echo-service.html"},{title:"上下文信息",link:"/zh-cn/docs/user/demos/context.html"},{title:"隐式参数",link:"/zh-cn/docs/user/demos/attachment.html"},{title:"异步调用",link:"/zh-cn/docs/user/demos/async-call.html"},{title:"本地调用",link:"/zh-cn/docs/user/demos/local-call.html"},{title:"参数回调",link:"/zh-cn/docs/user/demos/callback-parameter.html"},{title:"事件通知",link:"/zh-cn/docs/user/demos/events-notify.html"},{title:"本地存根",link:"/zh-cn/docs/user/demos/local-stub.html"},{title:"本地伪装",link:"/zh-cn/docs/user/demos/local-mock.html"},{title:"延迟暴露",link:"/zh-cn/docs/user/demos/delay-publish.html"},{title:"并发控制",link:"/zh-cn/docs/user/demos/concurrency-control.html"},{title:"连接控制",link:"/zh-cn/docs/user/demos/config-connections.html"},{title:"延迟连接",link:"/zh-cn/docs/user/demos/lazy-connect.html"},{title:"粘滞连接",link:"/zh-cn/docs/user/demos/stickiness.html"},{title:"令牌验证",link:"/zh-cn/docs/user/demos/token-authorization.html"},{title:"路由规则",link:"/zh-cn/docs/user/demos/routing-rule.html"},{title:"配置规则",link:"/zh-cn/docs/user/demos/config-rule.html"},{title:"服务降级",link:"/zh-cn/docs/user/demos/service-downgrade.html"},{title:"优雅停机",link:"/zh-cn/docs/user/demos/graceful-shutdown.html"},{title:"主机绑定",link:"/zh-cn/docs/user/demos/hostname-binding.html"},{title:"日志适配",link:"/zh-cn/docs/user/demos/logger-strategy.html"},{title:"访问日志",link:"/zh-cn/docs/user/demos/accesslog.html"},{title:"服务容器",link:"/zh-cn/docs/user/demos/service-container.html"},{title:"Reference Config 缓存",link:"/zh-cn/docs/user/demos/reference-config-cache.html"},{title:"分布式事务",link:"/zh-cn/docs/user/demos/distributed-transaction.html"},{title:"线程栈自动dump",link:"/zh-cn/docs/user/demos/dump.html"},{title:"Netty4",link:"/zh-cn/docs/user/demos/netty4.html"},{title:"Kryo和FST序列化",link:"/zh-cn/docs/user/demos/serialization.html"}]},{title:"API配置参考手册",link:"/zh-cn/docs/user/references/api.html"},{title:"schema配置参考手册",children:[{title:"介绍",link:"/zh-cn/docs/user/references/xml/introduction.html"},{title:"dubbo:service",link:"/zh-cn/docs/user/references/xml/dubbo-service.html"},{title:"dubbo:reference",link:"/zh-cn/docs/user/references/xml/dubbo-reference.html"},{title:"dubbo:protocol",link:"/zh-cn/docs/user/references/xml/dubbo-protocol.html"},{title:"dubbo:registry",link:"/zh-cn/docs/user/references/xml/dubbo-registry.html"},{title:"dubbo:monitor",link:"/zh-cn/docs/user/references/xml/dubbo-monitor.html"},{title:"dubbo:application",link:"/zh-cn/docs/user/references/xml/dubbo-application.html"},{title:"dubbo:module",link:"/zh-cn/docs/user/references/xml/dubbo-module.html"},{title:"dubbo:provider",link:"/zh-cn/docs/user/references/xml/dubbo-provider.html"},{title:"dubbo:consumer",link:"/zh-cn/docs/user/references/xml/dubbo-consumer.html"},{title:"dubbo:method",link:"/zh-cn/docs/user/references/xml/dubbo-method.html"},{title:"dubbo:argument",link:"/zh-cn/docs/user/references/xml/dubbo-argument.html"},{title:"dubbo:parameter",link:"/zh-cn/docs/user/references/xml/dubbo-parameter.html"}]},{title:"协议参考手册",children:[{title:"介绍",link:"/zh-cn/docs/user/references/protocol/introduction.html"},{title:"dubbo://",link:"/zh-cn/docs/user/references/protocol/dubbo.html"},{title:"rmi://",link:"/zh-cn/docs/user/references/protocol/rmi.html"},{title:"hessian://",link:"/zh-cn/docs/user/references/protocol/hessian.html"},{title:"http://",link:"/zh-cn/docs/user/references/protocol/http.html"},{title:"webservice://",link:"/zh-cn/docs/user/references/protocol/webservice.html"},{title:"thrift://",link:"/zh-cn/docs/user/references/protocol/thrift.html"},{title:"memcached://",link:"/zh-cn/docs/user/references/protocol/memcached.html"},{title:"redis://",link:"/zh-cn/docs/user/references/protocol/redis.html"},{title:"rest://",link:"/zh-cn/docs/user/references/protocol/rest.html"}]},{title:"注册中心参考手册",children:[{title:"介绍",link:"/zh-cn/docs/user/references/registry/introduction.html"},{title:"Multicast 注册中心",link:"/zh-cn/docs/user/references/registry/multicast.html"},{title:"Zookeeper 注册中心",link:"/zh-cn/docs/user/references/registry/zookeeper.html"},{title:"Redis 注册中心",link:"/zh-cn/docs/user/references/registry/redis.html"},{title:"Simple 注册中心",link:"/zh-cn/docs/user/references/registry/simple.html"}]},{title:"telnet命令参考手册",link:"/zh-cn/docs/user/references/telnet.html"},{title:"在线运维命令-QOS",link:"/zh-cn/docs/user/references/qos.html"},{title:"maven插件参考手册",link:"/zh-cn/docs/user/references/maven.html"},{title:"服务化最佳实践",link:"/zh-cn/docs/user/best-practice.html"},{title:"推荐用法",link:"/zh-cn/docs/user/recommend.html"},{title:"容量规划",link:"/zh-cn/docs/user/capacity-plan.html"},{title:"性能测试报告",link:"/zh-cn/docs/user/perf-test.html"},{title:"测试覆盖率报告",link:"/zh-cn/docs/user/coveragence.html"}]},{title:"开发者指南",children:[{title:"源码构建",link:"/zh-cn/docs/dev/build.html"},{title:"框架设计",link:"/zh-cn/docs/dev/design.html"},{title:"扩展点加载",link:"/zh-cn/docs/dev/SPI.html"},{title:"实现细节",link:"/zh-cn/docs/dev/implementation.html"},{title:"SPI 扩展实现",children:[{title:"协议扩展",link:"/zh-cn/docs/dev/impls/protocol.html"},{title:"调用拦截扩展",link:"/zh-cn/docs/dev/impls/filter.html"},{title:"引用监听扩展",link:"/zh-cn/docs/dev/impls/invoker-listener.html"},{title:"暴露监听扩展",link:"/zh-cn/docs/dev/impls/exporter-listener.html"},{title:"集群扩展",link:"/zh-cn/docs/dev/impls/cluster.html"},{title:"路由扩展",link:"/zh-cn/docs/dev/impls/router.html"},{title:"负载均衡扩展",link:"/zh-cn/docs/dev/impls/load-balance.html"},{title:"合并结果扩展",link:"/zh-cn/docs/dev/impls/merger.html"},{title:"注册中心扩展",link:"/zh-cn/docs/dev/impls/registry.html"},{title:"监控中心扩展",link:"/zh-cn/docs/dev/impls/monitor.html"},{title:"扩展点加载扩展",link:"/zh-cn/docs/dev/impls/extension-factory.html"},{title:"动态代理扩展",link:"/zh-cn/docs/dev/impls/proxy-factory.html"},{title:"编译器扩展",link:"/zh-cn/docs/dev/impls/compiler.html"},{title:"消息派发扩展",link:"/zh-cn/docs/dev/impls/dispatcher.html"},{title:"线程池扩展",link:"/zh-cn/docs/dev/impls/threadpool.html"},{title:"序列化扩展",link:"/zh-cn/docs/dev/impls/serialize.html"},{title:"网络传输扩展",link:"/zh-cn/docs/dev/impls/remoting.html"},{title:"信息交换扩展",link:"/zh-cn/docs/dev/impls/exchanger.html"},{title:"组网扩展",link:"/zh-cn/docs/dev/impls/networker.html"},{title:"Telnet 命令扩展",link:"/zh-cn/docs/dev/impls/telnet-handler.html"},{title:"状态检查扩展",link:"/zh-cn/docs/dev/impls/status-checker.html"},{title:"容器扩展",link:"/zh-cn/docs/dev/impls/container.html"},{title:"页面扩展",link:"/zh-cn/docs/dev/impls/page.html"},{title:"缓存扩展",link:"/zh-cn/docs/dev/impls/cache.html"},{title:"验证扩展",link:"/zh-cn/docs/dev/impls/validation.html"},{title:"日志适配扩展",link:"/zh-cn/docs/dev/impls/logger-adapter.html"}]},{title:"公共契约",link:"/zh-cn/docs/dev/contract.html"},{title:"编码约定",link:"/zh-cn/docs/dev/coding.html"},{title:"设计原则",children:[{title:"魔鬼在细节",link:"/zh-cn/docs/dev/principals/code-detail.html"},{title:"一些设计上的基本常识",link:"/zh-cn/docs/dev/principals/general-knowledge.html"},{title:"谈谈扩充式扩展与增量式扩展",link:"/zh-cn/docs/dev/principals/expansibility.html"},{title:"配置设计",link:"/zh-cn/docs/dev/principals/configuration.html"},{title:"设计实现的健壮性",link:"/zh-cn/docs/dev/principals/robustness.html"},{title:"防痴呆设计",link:"/zh-cn/docs/dev/principals/dummy.html"},{title:"扩展点重构",link:"/zh-cn/docs/dev/principals/extension.html"}]},{title:"版本管理",link:"/zh-cn/docs/dev/release.html"},{title:"贡献",link:"/zh-cn/docs/dev/contribution.html"},{title:"检查列表",link:"/zh-cn/docs/dev/checklist.html"},{title:"坏味道",link:"/zh-cn/docs/dev/code-smell.html"},{title:"技术兼容性测试",link:"/zh-cn/docs/dev/TCK.html"}]},{title:"运维管理",children:[{title:"安装手册",children:[{title:"示例提供者安装",link:"/zh-cn/docs/admin/install/provider-demo.html"},{title:"示例消费者安装",link:"/zh-cn/docs/admin/install/consumer-demo.html"},{title:"Zookeeper 注册中心安装",link:"/zh-cn/docs/admin/install/zookeeper.html"},{title:"Redis 注册中心安装",link:"/zh-cn/docs/admin/install/redis.html"},{title:"Simple 注册中心安装",link:"/zh-cn/docs/admin/install/simple-registry-center.html"},{title:"Simple 监控中心安装",link:"/zh-cn/docs/admin/install/simple-monitor-center.html"},{title:"管理控制台安装",link:"/zh-cn/docs/admin/install/admin-console.html"}]},{title:"运维手册",children:[{title:"管理控制台运维",link:"/zh-cn/docs/admin/ops/dubbo-ops.html"},{title:"使用Pinpoint做分布式跟踪",link:"/zh-cn/docs/admin/ops/pinpoint.html"},{title:"使用Skywalking做分布式跟踪",link:"/zh-cn/docs/admin/ops/skywalking.html"}]}]}],barText:"文档"}}},,,,function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a,s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(8),f=r(d),h=n(7),p=n(77),m=r(p);n(85);var y=(a=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={menuBodyVisible:!1},n}return l(t,e),s(t,[{key:"toggleMenuBody",value:function(){this.setState({menuBodyVisible:!this.state.menuBodyVisible})}},{key:"render",value:function(){var e=this,t=this.props.dataSource,n=this.state.menuBodyVisible,r=(0,f.default)({sidemenu:!0,"sidemenu-open":n}),o=(0,f.default)({"menu-item":!0,"menu-item-level-1":!0});return c.default.createElement("div",{className:r},c.default.createElement("div",{onClick:this.toggleMenuBody,className:"sidemenu-toggle"},c.default.createElement("img",{src:n?"https://img.alicdn.com/tfs/TB1I5itXQyWBuNjy0FpXXassXXa-200-200.png":"https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"})),c.default.createElement("ul",null,t.map(function(t,n){return c.default.createElement("li",{className:o,key:n},t.title?c.default.createElement("span",null,t.title):null,c.default.createElement("ul",null,t.children.map(function(t,n){return c.default.createElement(m.default,{item:t,key:n,toggleMenuBody:e.toggleMenuBody})})))})))}}]),t}(c.default.Component),function(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}(a.prototype,"toggleMenuBody",[h.autobind],Object.getOwnPropertyDescriptor(a.prototype,"toggleMenuBody"),a.prototype),a);t.default=y},,,,,,,,,,,function(e,t){},,function(e,t){!function(e){"use strict";function t(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function n(e){return"string"!=typeof e&&(e=String(e)),e}function r(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return v.iterable&&(t[Symbol.iterator]=function(){return t}),t}function o(e){this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):Array.isArray(e)?e.forEach(function(e){this.append(e[0],e[1])},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function i(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function l(e){return new Promise(function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function a(e){var t=new FileReader,n=l(t);return t.readAsArrayBuffer(e),n}function s(e){var t=new FileReader,n=l(t);return t.readAsText(e),n}function u(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}function c(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function d(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"==typeof e)this._bodyText=e;else if(v.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(v.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(v.searchParams&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=e.toString();else if(v.arrayBuffer&&v.blob&&b(e))this._bodyArrayBuffer=c(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!v.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e)&&!k(e))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=c(e)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):v.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},v.blob&&(this.blob=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?i(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(a)}),this.text=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return s(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(u(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},v.formData&&(this.formData=function(){return this.text().then(p)}),this.json=function(){return this.text().then(JSON.parse)},this}function f(e){var t=e.toUpperCase();return w.indexOf(t)>-1?t:e}function h(e,t){t=t||{};var n=t.body;if(e instanceof h){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||null==e._bodyInit||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=f(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function p(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}}),t}function m(e){var t=new o;return e.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();t.append(r,o)}}),t}function y(e,t){t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new o(t.headers),this.url=t.url||"",this._initBody(e)}if(!e.fetch){var v={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:"FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(v.arrayBuffer)var g=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],b=function(e){return e&&DataView.prototype.isPrototypeOf(e)},k=ArrayBuffer.isView||function(e){return e&&g.indexOf(Object.prototype.toString.call(e))>-1};o.prototype.append=function(e,r){e=t(e),r=n(r);var o=this.map[e];this.map[e]=o?o+","+r:r},o.prototype.delete=function(e){delete this.map[t(e)]},o.prototype.get=function(e){return e=t(e),this.has(e)?this.map[e]:null},o.prototype.has=function(e){return this.map.hasOwnProperty(t(e))},o.prototype.set=function(e,r){this.map[t(e)]=n(r)},o.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},o.prototype.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),r(e)},o.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),r(e)},o.prototype.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),r(e)},v.iterable&&(o.prototype[Symbol.iterator]=o.prototype.entries);var w=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];h.prototype.clone=function(){return new h(this,{body:this._bodyInit})},d.call(h.prototype),d.call(y.prototype),y.prototype.clone=function(){return new y(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},y.error=function(){var e=new y(null,{status:0,statusText:""});return e.type="error",e};var O=[301,302,303,307,308];y.redirect=function(e,t){if(-1===O.indexOf(t))throw new RangeError("Invalid status code");return new y(null,{status:t,headers:{location:e}})},e.Headers=o,e.Request=h,e.Response=y,e.fetch=function(e,t){return new Promise(function(n,r){var o=new h(e,t),i=new XMLHttpRequest;i.onload=function(){var e={status:i.status,statusText:i.statusText,headers:m(i.getAllResponseHeaders()||"")};e.url="responseURL"in i?i.responseURL:e.headers.get("X-Request-URL");var t="response"in i?i.response:i.responseText;n(new y(t,e))},i.onerror=function(){r(new TypeError("Network request failed"))},i.ontimeout=function(){r(new TypeError("Network request failed"))},i.open(o.method,o.url,!0),"include"===o.credentials?i.withCredentials=!0:"omit"===o.credentials&&(i.withCredentials=!1),"responseType"in i&&v.blob&&(i.responseType="blob"),o.headers.forEach(function(e,t){i.setRequestHeader(t,e)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})},e.fetch.polyfill=!0}}("undefined"!=typeof self?self:this)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(1),d=r(c),f=n(7),h=n(8),p=r(h),m=n(5),y=(s=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),r=e.item,l=r.children&&r.children.length,a=e.item.opened;return l?void 0===a&&(a=r.children.find(function(e){return""+window.rootPath+e.link===window.location.pathname})):a=!1,n.state={opened:a},n}return l(t,e),u(t,[{key:"onItemClick",value:function(e){this.props.toggleMenuBody(),e.stopPropagation()}},{key:"toggle",value:function(){this.setState({opened:!this.state.opened})}},{key:"renderSubMenu",value:function(e){var t=this;return d.default.createElement("ul",null,e.map(function(e,n){return d.default.createElement("li",{className:(0,p.default)({"menu-item":!0,"menu-item-level-3":!0,"menu-item-selected":(0,m.getLink)(e.link)===window.location.pathname}),key:n,onClick:t.onItemClick},d.default.createElement("a",{href:(0,m.getLink)(e.link),target:e.target||"_self"},e.title))}))}},{key:"render",value:function(){var e=this.props.item,t=e.children&&e.children.length,n=this.state.opened,r=(0,p.default)({"menu-item":!0,"menu-item-level-2":!0,"menu-item-selected":""+window.rootPath+e.link===window.location.pathname}),o={height:n?36*(e.children.length+1):36,overflow:"hidden"};return t?d.default.createElement("li",{style:o,className:r,onClick:this.toggle},d.default.createElement("span",null,e.title,d.default.createElement("img",{style:{transform:"rotate("+(n?0:-90)+"deg)"},className:"menu-toggle",src:window.rootPath+"/img/arrow_down.png"})),this.renderSubMenu(e.children)):d.default.createElement("li",{style:o,className:r,onClick:this.onItemClick},d.default.createElement("a",{href:(0,m.getLink)(e.link),target:e.target||"_self"},e.title))}}]),t}(d.default.Component),a(s.prototype,"onItemClick",[f.autobind],Object.getOwnPropertyDescriptor(s.prototype,"onItemClick"),s.prototype),a(s.prototype,"toggle",[f.autobind],Object.getOwnPropertyDescriptor(s.prototype,"toggle"),s.prototype),a(s.prototype,"renderSubMenu",[f.autobind],Object.getOwnPropertyDescriptor(s.prototype,"renderSubMenu"),s.prototype),s);t.default=y},,,,function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=r(s),c=n(6),d=r(c),f=n(4),h=r(f),p=n(46);n(76);var m=n(45),y=r(m),v=n(12),g=r(v),b=n(11),k=r(b),w=n(36),O=r(w),_=n(63),S=r(_),E=n(10),P=r(E),j=n(3),z=r(j),T=n(59),x=r(T),C=n(58),A=r(C);n(74);var M=/^#[^\/]/,I=/^((\.{1,2}\/)|([\w-]+[\/.]))/,B=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={__html:""},n}return l(t,e),a(t,[{key:"componentDidMount",value:function(){var e=this;fetch(window.location.pathname.replace(/\.html$/i,".json")).then(function(e){return e.json()}).then(function(t){e.setState({__html:t&&t.__html?t.__html:""})}),this.markdownContainer.addEventListener("click",function(e){if("a"===e.target.nodeName.toLowerCase()&&e.target.getAttribute("href")&&M.test(e.target.getAttribute("href"))){e.preventDefault();var t=e.target.getAttribute("href").slice(1);p.scroller.scrollTo(t,{duration:1e3,smooth:"easeInOutQuint"})}})}},{key:"componentDidUpdate",value:function(){this.handleRelativeLink(),this.handleRelativeImg()}},{key:"handleRelativeLink",value:function(){var e=h.default.get("docsite_language")||z.default.defaultLanguage,t=window.location.pathname.replace(window.rootPath+"/"+e,"").split("/").slice(0,-1),n=t.join("/");Array.from(this.markdownContainer.querySelectorAll("a")).forEach(function(t){var r=t.getAttribute("href");I.test(r)&&(t.href=""+y.default.join(window.rootPath+"/"+e,n,r.replace(/\.(md|markdown)$/,".html")))})}},{key:"handleRelativeImg",value:function(){var e=h.default.get("docsite_language")||z.default.defaultLanguage,t=window.location.pathname.replace(window.rootPath+"/"+e,"").split("/").slice(0,-1);t.splice(2,0,e);var n=t.join("/");Array.from(this.markdownContainer.querySelectorAll("img")).forEach(function(e){var t=e.getAttribute("src");I.test(t)&&(e.src=""+y.default.join(window.rootPath,n,t))})}},{key:"render",value:function(){var e=this,t=this.getLanguage(),n=-1!==window.location.pathname.split("/").pop().lastIndexOf("_dev.html"),r=n?A.default[t]:x.default[t],o=this.props.__html||this.state.__html;return u.default.createElement("div",{className:"documentation-page"},u.default.createElement(k.default,{currentKey:n?"developers":"docs",type:"normal",logo:window.rootPath+"/img/dubbo_colorful.png",language:t,onLanguageChange:this.onLanguageChange}),u.default.createElement(O.default,{img:window.rootPath+"/img/docs.png",text:r.barText}),u.default.createElement("section",{className:"content-section"},u.default.createElement(S.default,{dataSource:r.sidemenu}),u.default.createElement("div",{className:"doc-content markdown-body",ref:function(t){e.markdownContainer=t},dangerouslySetInnerHTML:{__html:o}})),u.default.createElement(P.default,{logo:window.rootPath+"/img/dubbo_gray.png"}))}}]),t}(g.default);document.getElementById("root")&&d.default.render(u.default.createElement(B,null),document.getElementById("root")),t.default=B},,,,function(e,t){}]);
\ 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";function r(e,t,r){var o=r.configurable,a=r.enumerable,s=r.initializer,u=r.value;return{configurable:o,enumerable:a,get:function(){if(this!==e){var n=s?s.call(this):u;return l(this,t,{configurable:o,enumerable:a,writable:!0,value:n}),n}},set:n.i(i.e)(t)}}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.defineProperty},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=r(s),c=n(2),d=r(c),f=n(4),h=r(f),p=n(3),m=r(p),y=n(5);n(31);var v={logo:d.default.string.isRequired},g=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),a(t,[{key:"render",value:function(){var e=this.props.logo,t=h.default.get("docsite_language")||m.default.defaultLanguage,n=m.default[t];return u.default.createElement("footer",{className:"footer-container"},u.default.createElement("div",{className:"footer-body"},u.default.createElement("img",{src:e}),u.default.createElement("img",{className:"apache",src:window.rootPath+"/img/apache_logo.png"}),u.default.createElement("div",{className:"cols-container"},u.default.createElement("div",{className:"col col-12"},u.default.createElement("h3",null,n.disclaimer.title),u.default.createElement("p",null,n.disclaimer.content)),u.default.createElement("div",{className:"col col-4"},u.default.createElement("dl",null,u.default.createElement("dt",null,n.asf.title),n.asf.list.map(function(e,t){return u.default.createElement("dd",{key:t},u.default.createElement("a",{href:(0,y.getLink)(e.link),target:e.target||"_self"},e.text))}))),u.default.createElement("div",{className:"col col-4"},u.default.createElement("dl",null,u.default.createElement("dt",null,n.documentation.title),n.documentation.list.map(function(e,t){return u.default.createElement("dd",{key:t},u.default.createElement("a",{href:(0,y.getLink)(e.link),target:e.target||"_self"},e.text))}))),u.default.createElement("div",{className:"col col-4"},u.default.createElement("dl",null,u.default.createElement("dt",null,n.resources.title),n.resources.list.map(function(e,t){return u.default.createElement("dd",{key:t},u.default.createElement("a",{href:(0,y.getLink)(e.link),target:e.target||"_self"},e.text))})))),u.default.createElement("div",{className:"copyright"},u.default.createElement("span",null,n.copyright))))}}]),t}(u.default.Component);g.propTypes=v,t.default=g},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s,u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(1),d=r(c),f=n(2),h=r(f),p=n(8),m=r(p),y=n(7),v=n(3),g=r(v);n(32);var b=[{text:"中",value:"en-us"},{text:"En",value:"zh-cn"}],k={baidu:{logo:"https://img.alicdn.com/tfs/TB1n6DQayLaK1RjSZFxXXamPFXa-300-300.png",url:"https://www.baidu.com/s?wd="},google:{logo:"https://img.alicdn.com/tfs/TB1REfuaCzqK1RjSZFjXXblCFXa-300-300.jpg",url:"https://www.google.com/search?q="}},w=function(){},_={currentKey:h.default.string,logo:h.default.string.isRequired,type:h.default.oneOf(["primary","normal"]),language:h.default.oneOf(["en-us","zh-cn"]),onLanguageChange:h.default.func},O={type:"primary",language:"en-us",onLanguageChange:w},S=(0,y.autobind)(s=function(e){function t(e){i(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={menuBodyVisible:!1,language:e.language,search:g.default.defaultSearch,searchValue:"",inputVisible:!1},n}return a(t,e),u(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({language:e.language})}},{key:"toggleMenu",value:function(){this.setState({menuBodyVisible:!this.state.menuBodyVisible})}},{key:"switchLang",value:function(){var e=void 0;e="zh-cn"===this.state.language?"en-us":"zh-cn",this.setState({language:e}),this.props.onLanguageChange(e)}},{key:"switchSearch",value:function(){var e=void 0;e="baidu"===this.state.search?"google":"baidu",this.setState({search:e})}},{key:"toggleSearch",value:function(){this.setState({searchVisible:!this.state.searchVisible})}},{key:"onInputChange",value:function(e){this.setState({searchValue:e.target.value})}},{key:"goSearch",value:function(){var e=this.state,t=e.search,n=e.searchValue;window.open(""+k[t].url+window.encodeURIComponent(n+" site:"+g.default.domain))}},{key:"onKeyDown",value:function(e){13===e.keyCode&&this.goSearch()}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.logo,r=e.onLanguageChange,i=e.currentKey,l=this.state,a=l.menuBodyVisible,s=l.language,u=l.search,c=l.searchVisible;return d.default.createElement("header",{className:(0,m.default)(o({"header-container":!0},"header-container-"+t,!0))},d.default.createElement("div",{className:"header-body"},d.default.createElement("a",{href:window.rootPath+"/"+s+"/index.html"},d.default.createElement("img",{className:"logo",alt:g.default.name,title:g.default.name,src:n})),g.default.defaultSearch?d.default.createElement("div",{className:(0,m.default)(o({search:!0},"search-"+t,!0))},d.default.createElement("span",{className:"icon-search",onClick:this.toggleSearch}),c?d.default.createElement("div",{className:"search-input"},d.default.createElement("img",{src:k[u].logo,onClick:this.switchSearch}),d.default.createElement("input",{autoFocus:!0,onChange:this.onInputChange,onKeyDown:this.onKeyDown})):null):null,r!==w?d.default.createElement("span",{className:(0,m.default)(o({"language-switch":!0},"language-switch-"+t,!0)),onClick:this.switchLang},b.find(function(e){return e.value===s}).text):null,d.default.createElement("div",{className:(0,m.default)({"header-menu":!0,"header-menu-open":a})},d.default.createElement("img",{className:"header-menu-toggle",onClick:this.toggleMenu,src:"primary"===t?window.rootPath+"/img/menu_white.png":window.rootPath+"/img/menu_gray.png"}),d.default.createElement("ul",null,g.default[s].pageMenu.map(function(e){var n;return d.default.createElement("li",{className:(0,m.default)((n={"menu-item":!0},o(n,"menu-item-"+t,!0),o(n,"menu-item-"+t+"-active",i===e.key),n)),key:e.key},d.default.createElement("a",{href:""+window.rootPath+e.link},e.text))})))))}}]),t}(d.default.Component))||s;S.propTypes=_,S.defaultProps=O,t.default=S},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a,s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(7),f=n(4),h=r(f),p=(a=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),s(t,[{key:"onLanguageChange",value:function(e){var t=window.location.pathname,n=void 0;n="zh-cn"===e?"en-us":"zh-cn";var r=t.replace(window.rootPath+"/"+n,window.rootPath+"/"+e);h.default.set("docsite_language",e,{expires:365,path:""}),window.location=r}},{key:"getLanguage",value:function(){var e=void 0;e=window.rootPath?window.location.pathname.split("/")[2]:window.location.pathname.split("/")[1];var t=this.props.lang||e||h.default.get("docsite_language")||siteConfig.defaultLanguage;return"en-us"!==t&&"zh-cn"!==t&&(t=siteConfig.defaultLanguage),t!==h.default.get("docsite_language")&&h.default.set("docsite_language",t,{expires:365,path:""}),t}}]),t}(c.default.Component),function(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}(a.prototype,"onLanguageChange",[d.autobind],Object.getOwnPropertyDescriptor(a.prototype,"onLanguageChange"),a.prototype),a);t.default=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e=e?0===e.indexOf("#")?e:"#"+e:"",history.pushState){var t=window.location;history.pushState(null,null,e?t.pathname+t.search+e:t.pathname+t.search)}else location.hash=e},o=function(){return window.location.hash.replace(/^#/,"")},i=function(e){return function(t){return e.contains?e!=t&&e.contains(t):!!(16&e.compareDocumentPosition(t))}},l=function(e,t){return e===document?t.getBoundingClientRect().top+(window.scrollY||window.pageYOffset):"relative"===getComputedStyle(e).position?t.offsetTop:t.getBoundingClientRect().top+e.scrollTop};t.default={pushHash:r,getHash:o,filterElementInContainer:i,scrollOffset:l}},function(e,t,n){"use strict";function r(e,t){var n=e.prototype;for(var r in t)for(var l=t[r],a=0,s=l.length;a<s;a++){var u=l[a];o(n,r,u(n,r,i(n,r)))}return e}t.a=r;var o=Object.defineProperty,i=Object.getOwnPropertyDescriptor},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function o(e,t){if("undefined"==typeof WeakMap)throw new Error("Using @autobind on "+t.name+"() requires WeakMap support due to its use of super."+t.name+"()\n      See https://github.com/jayphelps/core-decorators.js/issues/20");f||(f=new WeakMap),!1===f.has(e)&&f.set(e,new WeakMap);var r=f.get(e);return!1===r.has(t)&&r.set(t,n.i(u.a)(t,e)),r.get(t)}function i(e){for(var t=n.i(u.f)(e.prototype),r=n.i(u.g)(t),o=0,i=r.length;o<i;o++){var a=r[o],s=t[a];"function"==typeof s.value&&"constructor"!==a&&c(e.prototype,a,l(e.prototype,a,s))}}function l(e,t,r){var i=r.value,l=r.configurable,a=r.enumerable;if("function"!=typeof i)throw new SyntaxError("@autobind can only be used on functions, not: "+i);var s=e.constructor;return{configurable:l,enumerable:a,get:function(){if(this===e)return i;if(this.constructor!==s&&d(this).constructor===s)return i;if(this.constructor!==s&&t in this.constructor.prototype)return o(this,i);var r=n.i(u.a)(i,this);return c(this,t,{configurable:!0,writable:!0,enumerable:!1,value:r}),r},set:n.i(u.e)(t)}}function a(e){return 1===e.length?i.apply(void 0,r(e)):l.apply(void 0,r(e))}function s(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(){return a(arguments)}:a(t)}t.a=s;var u=n(0),c=Object.defineProperty,d=Object.getPrototypeOf,f=void 0},function(e,t,n){"use strict";function r(e,t,r,o){var u=a(o,2),c=u[0],d=void 0===c?s:c,f=u[1],h=void 0!==f&&f,p=r.value;if("function"!=typeof p)throw new SyntaxError("Only functions can be debounced");return l({},r,{value:function(){var e=this,r=n.i(i.c)(this),o=r.debounceTimeoutIds,l=o[t],a=h&&!l,s=arguments;clearTimeout(l),o[t]=setTimeout(function(){delete o[t],h||p.apply(e,s)},d),a&&p.apply(this,s)}})}function o(){n.i(i.h)("@debounce is deprecated and will be removed shortly. Use @debounce from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators");for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=300},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function o(e){return Array.isArray(e)?e:Array.from(e)}function i(e,t,i,l){var u=o(l),c=u[0],d=u.slice(1),f=i.configurable,h=i.enumerable,p=i.writable,m=i.get,y=i.set,v=i.value,g=!!m;return{configurable:f,enumerable:h,get:function(){var e=g?m.call(this):v,n=c.call.apply(c,[this,e].concat(r(d)));if(g)return n;var o={configurable:f,enumerable:h};return o.value=n,o.writable=p,s(this,t,o),n},set:g?y:n.i(a.e)()}}function l(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(a.d)(i,t)}t.a=l;var a=n(0),s=Object.defineProperty},function(e,t,n){"use strict";function r(e,t,r,o){var u=a(o,2),c=u[0],d=void 0===c?s:c,f=u[1],h=void 0===f?{}:f;if("function"!=typeof r.value)throw new SyntaxError("Only functions can be marked as deprecated");var p=e.constructor.name+"#"+t;return h.url&&(d+="\n\n    See "+h.url+" for more details.\n\n"),l({},r,{value:function(){return n.i(i.b)("DEPRECATION "+p+": "+d),r.value.apply(this,arguments)}})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s="This function will be removed in future versions."},function(e,t,n){"use strict";function r(e,t,n){return n.enumerable=!0,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(e,t,n){var r=a(e),o=s(r,t);return l({},o,{value:n.value,initializer:n.initializer,get:n.get||o.get,set:n.set||o.set})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=Object.getPrototypeOf,s=Object.getOwnPropertyDescriptor},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){return t===Object(t)?t:e[t]||(e[t]={})}function i(e,t,n,r,o){var i=t.apply(e,n);return r[o]=i,i}function l(e){var t=void 0,n=void 0;return e.value?(t=e.value,n="value"):e.get?(t=e.get,n="get"):e.set&&(t=e.set,n="set"),{fn:t,wrapKey:n}}function a(e,t,n){var a=l(n),s=a.fn,u=a.wrapKey,d=new WeakMap,f=Object.create(null),h=Object.create(null),p=0;return c({},n,r({},u,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r="0",l=0,a=t.length;l<a;l++){var u=t[l],c=o(h,u),m=d.get(c);void 0===m&&(m=++p,d.set(c,m)),r+=m}return f[r]||i(this,s,arguments,f,r)}))}function s(){n.i(u.h)("@memoize is deprecated and will be removed shortly. Use @memoize from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators");for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(u.d)(a,t)}t.a=s;var u=n(0),c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}},function(e,t,n){"use strict";function r(e){return"[object Symbol]"===Object.prototype.toString.call(e)&&"object"===(void 0===e?"undefined":s(e))}function o(e,t){if(r(e)){do{if(t===Object.prototype)return void 0!==t[e];if(t.hasOwnProperty(e))return!0}while(t=c(t));return!1}return e in t}function i(e,t){if(!t.length)throw new SyntaxError("@mixin() class "+e.name+" requires at least one mixin as an argument");for(var r=0,i=t.length;r<i;r++)for(var l=n.i(a.f)(t[r]),s=n.i(a.g)(l),c=0,d=s.length;c<d;c++){var f=s[c];o(f,e.prototype)||u(e.prototype,f,l[f])}}function l(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(a.h)("@mixin is deprecated and will be removed shortly. Use @mixin from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators"),"function"==typeof t[0]?i(t[0],[]):function(e){return i(e,t)}}t.a=l;var a=n(0),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u=Object.defineProperty,c=Object.getPrototypeOf},function(e,t,n){"use strict";function r(e,t,n){return n.configurable=!1,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(e,t,n){return n.enumerable=!1,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){return e.hasOwnProperty("value")?"data":e.hasOwnProperty("get")||e.hasOwnProperty("set")?"accessor":"data"}function i(e,t,n){n.assert(e.length===t.length)}function l(e,t,n){var r=h(e.value),o=h(t.value);if("undefined"===r&&"undefined"===o&&n.error("descriptor values are both undefined. (class properties are are not currently supported)'"),r!==o){("function"===o&&void 0===r||void 0!==r)&&n.error('value types do not match. {parent} is "'+r+'", {child} is "'+o+'"')}switch(o){case"function":i(e.value,t.value,n);break;default:n.error('Unexpected error. Please file a bug with: {parent} is "'+r+'", {child} is "'+o+'"')}}function a(e,t,n){var r="function"==typeof e.get,o="function"==typeof t.get,l="function"==typeof e.set,a="function"==typeof t.set;(r||o)&&(!r&&l&&n.error("{parent} is setter but {child} is getter"),!o&&a&&n.error("{parent} is getter but {child} is setter"),i(e.get,t.get,n)),(l||a)&&(!l&&r&&n.error("{parent} is getter but {child} is setter"),!a&&o&&n.error("{parent} is setter but {child} is getter"),i(e.set,t.set,n))}function s(e,t,n){var r=o(e),i=o(t);switch(r!==i&&n.error('descriptor types do not match. {parent} is "'+r+'", {child} is "'+i+'"'),i){case"data":l(e,t,n);break;case"accessor":a(e,t,n)}}function u(e,t){for(var n=0,r=v.length;n<r;n++){var o=v[n],i=o(t);if(i in e)return i}return null}function c(e,t,n){n.key=t;var r=Object.getPrototypeOf(e),o=Object.getOwnPropertyDescriptor(r,t),i=new y(r,e,o,n);if(void 0===o){var l=u(r,t),a=l?'\n\n  Did you mean "'+l+'"?':"";i.error("No descriptor matching {child} was found on the prototype chain."+a)}return s(o,n,i),n}function d(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(f.d)(c,t)}t.a=d;var f=n(0),h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),m=/^function ([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?(\([^\)]*\))[\s\S]+$/,y=function(){function e(t,n,o,i){r(this,e),this.parentKlass=t,this.childKlass=n,this.parentDescriptor=o,this.childDescriptor=i}return p(e,[{key:"_getTopic",value:function(e){return void 0===e?null:"value"in e?e.value:"get"in e?e.get:"set"in e?e.set:void 0}},{key:"_extractTopicSignature",value:function(e){switch(void 0===e?"undefined":h(e)){case"function":return this._extractFunctionSignature(e);default:return this.key}}},{key:"_extractFunctionSignature",value:function(e){var t=this;return e.toString().replace(m,function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.key)+arguments[2]})}},{key:"key",get:function(){return this.childDescriptor.key}},{key:"parentNotation",get:function(){return this.parentKlass.constructor.name+"#"+this.parentPropertySignature}},{key:"childNotation",get:function(){return this.childKlass.constructor.name+"#"+this.childPropertySignature}},{key:"parentTopic",get:function(){return this._getTopic(this.parentDescriptor)}},{key:"childTopic",get:function(){return this._getTopic(this.childDescriptor)}},{key:"parentPropertySignature",get:function(){return this._extractTopicSignature(this.parentTopic)}},{key:"childPropertySignature",get:function(){return this._extractTopicSignature(this.childTopic)}}]),p(e,[{key:"assert",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";!0!==e&&this.error("{child} does not properly override {parent}"+t)}},{key:"error",value:function(e){var t=this;throw e=e.replace("{parent}",function(e){return t.parentNotation}).replace("{child}",function(e){return t.childNotation}),new SyntaxError(e)}}]),e}(),v=[function(e){return e.toLowerCase()},function(e){return e.toUpperCase()},function(e){return e+"s"},function(e){return e.slice(0,-1)},function(e){return e.slice(1,e.length)}]},function(e,t,n){"use strict";function r(e,t,r,u){var c=a(u,3),d=c[0],f=void 0===d?null:d,h=c[1],p=void 0!==h&&h,m=c[2],y=void 0===m?s:m;if(!o.__enabled)return o.__warned||(y.warn("console.profile is not supported. All @profile decorators are disabled."),o.__warned=!0),r;var v=r.value;if(null===f&&(f=e.constructor.name+"."+t),"function"!=typeof v)throw new SyntaxError("@profile can only be used on functions, not: "+v);return l({},r,{value:function(){var e=Date.now(),t=n.i(i.c)(this);(!0===p&&!t.profileLastRan||!1===p||"number"==typeof p&&e-t.profileLastRan>p||"function"==typeof p&&p.apply(this,arguments))&&(y.profile(f),t.profileLastRan=e);try{return v.apply(this,arguments)}finally{y.profileEnd(f)}}})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=(console,{profile:console.profile?n.i(i.a)(console.profile,console):function(){},profileEnd:console.profileEnd?n.i(i.a)(console.profileEnd,console):function(){},warn:i.b});o.__enabled=!!console.profile,o.__warned=!1},function(e,t,n){"use strict";function r(e,t,n){return n.writable=!1,n}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0)},function(e,t,n){"use strict";function r(){}function o(e,t,n){if("object"===("undefined"==typeof console?"undefined":u(console))){var o=console.warn;console.warn=r;var i=t.apply(e,n);return console.warn=o,i}return t.apply(e,n)}function i(e,t,n){return s({},n,{value:function(){return o(this,n.value,arguments)}})}function l(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return n.i(a.d)(i,t)}t.a=l;var a=n(0),s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}},function(e,t,n){"use strict";function r(e,t,r,o){var u=a(o,2),c=u[0],d=void 0===c?s:c,f=u[1],h=void 0===f?{}:f,p=r.value;if("function"!=typeof p)throw new SyntaxError("Only functions can be throttled");return!1!==h.leading&&(h.leading=!0),!1!==h.trailing&&(h.trailing=!0),l({},r,{value:function(){var e=this,r=n.i(i.c)(this),o=r.throttleTimeoutIds,l=r.throttlePreviousTimestamps,a=o[t],s=l[t]||0,u=Date.now();h.trailing&&(r.throttleTrailingArgs=arguments),s||!1!==h.leading||(s=u);var c=d-(u-s);c<=0?(clearTimeout(a),delete o[t],l[t]=u,p.apply(this,arguments)):!a&&h.trailing&&(o[t]=setTimeout(function(){l[t]=!1===h.leading?0:Date.now(),delete o[t],p.apply(e,r.throttleTrailingArgs),r.throttleTrailingArgs=null},c))}})}function o(){n.i(i.h)("@throttle is deprecated and will be removed shortly. Use @throttle from lodash-decorators.\n\n  https://www.npmjs.com/package/lodash-decorators");for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=300},function(e,t,n){"use strict";function r(e,t,n,r){var o=a(r,2),i=o[0],s=void 0===i?null:i,d=o[1],f=void 0===d?u:d,h=n.value;if(null===s&&(s=e.constructor.name+"."+t),"function"!=typeof h)throw new SyntaxError("@time can only be used on functions, not: "+h);return l({},n,{value:function(){var e=s+"-"+c;c++,f.time(e);try{return h.apply(this,arguments)}finally{f.timeEnd(e)}}})}function o(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];return n.i(i.d)(r,t)}t.a=o;var i=n(0),l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=e[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s={},u={time:console.time?console.time.bind(console):function(e){s[e]=new Date},timeEnd:console.timeEnd?console.timeEnd.bind(console):function(e){var t=new Date,n=t-s[e];delete s[e],console.log(e+": "+n+"ms")}},c=0},function(e,t){},function(e,t){},function(e,t,n){"use strict";function r(){}var o=n(34);e.exports=function(){function e(e,t,n,r,i,l){if(l!==o){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(13),l=r(i),a=n(42),s=r(a),u=n(38),c=r(u),d={},f=void 0;t.default={unmount:function(){d={}},register:function(e,t){d[e]=t},unregister:function(e){delete d[e]},get:function(e){return d[e]||document.getElementById(e)||document.getElementsByName(e)[0]||document.getElementsByClassName(e)[0]},setActiveLink:function(e){return f=e},getActiveLink:function(){return f},scrollTo:function(e,t){var n=this.get(e);if(!n)return void console.warn("target Element not found");t=o({},t,{absolute:!1});var r=t.containerId,i=t.container,a=void 0;a=r?document.getElementById(r):i&&i.nodeType?i:document,c.default.registered.begin&&c.default.registered.begin(e,n),t.absolute=!0;var u=l.default.scrollOffset(a,n)+(t.offset||0);if(!t.smooth)return a===document?window.scrollTo(0,u):a.scrollTop=u,void(c.default.registered.end&&c.default.registered.end(e,n));s.default.animateTopScroll(u,t,e,n)}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),i=r(o),l=n(2),a=r(l),s=n(8),u=r(s);n(41);var c={text:a.default.string.isRequired,img:a.default.string.isRequired},d=function(e){var t=e.text,n=e.img,r=(0,u.default)({bar:!0});return i.default.createElement("div",{className:r},i.default.createElement("div",{className:"bar-body"},i.default.createElement("img",{src:n,className:"front-img"}),i.default.createElement("span",null,t),i.default.createElement("img",{src:n,className:"back-img"})))};d.propTypes=c,t.default=d},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.addPassiveEventListener=function(e,t,n){var r=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t)}catch(e){}return e}();e.addEventListener(t,n,!!r&&{passive:!0})},t.removePassiveEventListener=function(e,t,n){e.removeEventListener(t,n)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={registered:{},scrollEvent:{register:function(e,t){r.registered[e]=t},remove:function(e){r.registered[e]=null}}};t.default=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(6),f=(r(d),n(13)),h=(r(f),n(40)),p=r(h),m=n(35),y=r(m),v=n(2),g=r(v),b=n(44),k=r(b),w={to:g.default.string.isRequired,containerId:g.default.string,container:g.default.object,activeClass:g.default.string,spy:g.default.bool,smooth:g.default.oneOfType([g.default.bool,g.default.string]),offset:g.default.number,delay:g.default.number,isDynamic:g.default.bool,onClick:g.default.func,duration:g.default.oneOfType([g.default.number,g.default.func]),absolute:g.default.bool,onSetActive:g.default.func,onSetInactive:g.default.func,ignoreCancelEvents:g.default.bool,hashSpy:g.default.bool};t.default=function(e,t){var n=t||y.default,r=function(t){function r(e){o(this,r);var t=i(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,e));return u.call(t),t.state={active:!1},t}return l(r,t),s(r,[{key:"getScrollSpyContainer",value:function(){var e=this.props.containerId,t=this.props.container;return e&&!t?document.getElementById(e):t&&t.nodeType?t:document}},{key:"componentDidMount",value:function(){if(this.props.spy||this.props.hashSpy){var e=this.getScrollSpyContainer();p.default.isMounted(e)||p.default.mount(e),this.props.hashSpy&&(k.default.isMounted()||k.default.mount(n),k.default.mapContainer(this.props.to,e)),p.default.addSpyHandler(this.spyHandler,e),this.setState({container:e})}}},{key:"componentWillUnmount",value:function(){p.default.unmount(this.stateHandler,this.spyHandler)}},{key:"render",value:function(){var t="";t=this.state&&this.state.active?((this.props.className||"")+" "+(this.props.activeClass||"active")).trim():this.props.className;var n=a({},this.props);for(var r in w)n.hasOwnProperty(r)&&delete n[r];return n.className=t,n.onClick=this.handleClick,c.default.createElement(e,n)}}]),r}(c.default.PureComponent),u=function(){var e=this;this.scrollTo=function(t,r){n.scrollTo(t,a({},e.state,r))},this.handleClick=function(t){e.props.onClick&&e.props.onClick(t),t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),e.scrollTo(e.props.to,e.props)},this.spyHandler=function(t){var r=e.getScrollSpyContainer();if(!k.default.isMounted()||k.default.isInitialized()){var o=e.props.to,i=null,l=0,a=0,s=0;if(r.getBoundingClientRect){s=r.getBoundingClientRect().top}if(!i||e.props.isDynamic){if(!(i=n.get(o)))return;var u=i.getBoundingClientRect();l=u.top-s+t,a=l+u.height}var c=t-e.props.offset,d=c>=Math.floor(l)&&c<Math.floor(a),f=c<Math.floor(l)||c>=Math.floor(a),h=n.getActiveLink();f&&(o===h&&n.setActiveLink(void 0),e.props.hashSpy&&k.default.getHash()===o&&k.default.changeHash(),e.props.spy&&e.state.active&&(e.setState({active:!1}),e.props.onSetInactive&&e.props.onSetInactive(o,i))),!d||h===o&&!1!==e.state.active||(n.setActiveLink(o),e.props.hashSpy&&k.default.changeHash(o),e.props.spy&&(e.setState({active:!0}),e.props.onSetActive&&e.props.onSetActive(o,i)))}}};return r.propTypes=w,r.defaultProps={offset:0},r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(47),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i=n(37),l=function(e){return(0,o.default)(e,66)},a={spyCallbacks:[],spySetState:[],scrollSpyContainers:[],mount:function(e){if(e){var t=l(function(t){a.scrollHandler(e)});a.scrollSpyContainers.push(e),(0,i.addPassiveEventListener)(e,"scroll",t)}},isMounted:function(e){return-1!==a.scrollSpyContainers.indexOf(e)},currentPositionY:function(e){if(e===document){var t=void 0!==window.pageXOffset,n="CSS1Compat"===(document.compatMode||"");return t?window.pageYOffset:n?document.documentElement.scrollTop:document.body.scrollTop}return e.scrollTop},scrollHandler:function(e){(a.scrollSpyContainers[a.scrollSpyContainers.indexOf(e)].spyCallbacks||[]).forEach(function(t){return t(a.currentPositionY(e))})},addStateHandler:function(e){a.spySetState.push(e)},addSpyHandler:function(e,t){var n=a.scrollSpyContainers[a.scrollSpyContainers.indexOf(t)];n.spyCallbacks||(n.spyCallbacks=[]),n.spyCallbacks.push(e),e(a.currentPositionY(t))},updateStates:function(){a.spySetState.forEach(function(e){return e()})},unmount:function(e,t){a.scrollSpyContainers.forEach(function(e){return e.spyCallbacks&&e.spyCallbacks.length&&e.spyCallbacks.splice(e.spyCallbacks.indexOf(t),1)}),a.spySetState&&a.spySetState.length&&a.spySetState.splice(a.spySetState.indexOf(e),1),document.removeEventListener("scroll",a.scrollHandler)},update:function(){return a.scrollSpyContainers.forEach(function(e){return a.scrollHandler(e)})}};t.default=a},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(13),l=(r(i),n(54)),a=r(l),s=n(53),u=r(s),c=n(38),d=r(c),f=function(e){return a.default[e.smooth]||a.default.defaultEasing},h=function(e){return"function"==typeof e?e:function(){return e}},p=function(){if("undefined"!=typeof window)return window.requestAnimationFrame||window.webkitRequestAnimationFrame},m=function(){return p()||function(e,t,n){window.setTimeout(e,n||1e3/60,(new Date).getTime())}}(),y=function(){return{currentPositionY:0,startPositionY:0,targetPositionY:0,progress:0,duration:0,cancel:!1,target:null,containerElement:null,to:null,start:null,deltaTop:null,percent:null,delayTimeout:null}},v=function(e){var t=e.data.containerElement;if(t&&t!==document&&t!==document.body)return t.scrollTop;var n=void 0!==window.pageXOffset,r="CSS1Compat"===(document.compatMode||"");return n?window.pageYOffset:r?document.documentElement.scrollTop:document.body.scrollTop},g=function(e){var t=e.data.containerElement;if(t&&t!==document&&t!==document.body)return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight);var n=document.body,r=document.documentElement;return Math.max(n.scrollHeight,n.offsetHeight,r.clientHeight,r.scrollHeight,r.offsetHeight)},b=function e(t,n,r){var o=n.data;if(!n.ignoreCancelEvents&&o.cancel)return void(d.default.registered.end&&d.default.registered.end(o.to,o.target,o.currentPositionY));if(o.deltaTop=Math.round(o.targetPositionY-o.startPositionY),null===o.start&&(o.start=r),o.progress=r-o.start,o.percent=o.progress>=o.duration?1:t(o.progress/o.duration),o.currentPositionY=o.startPositionY+Math.ceil(o.deltaTop*o.percent),o.containerElement&&o.containerElement!==document&&o.containerElement!==document.body?o.containerElement.scrollTop=o.currentPositionY:window.scrollTo(0,o.currentPositionY),o.percent<1){var i=e.bind(null,t,n);return void m.call(window,i)}d.default.registered.end&&d.default.registered.end(o.to,o.target,o.currentPositionY)},k=function(e){e.data.containerElement=e?e.containerId?document.getElementById(e.containerId):e.container&&e.container.nodeType?e.container:document:null},w=function(e,t,n,r){if(t.data=t.data||y(),window.clearTimeout(t.data.delayTimeout),u.default.subscribe(function(){t.data.cancel=!0}),k(t),t.data.start=null,t.data.cancel=!1,t.data.startPositionY=v(t),t.data.targetPositionY=t.absolute?e:e+t.data.startPositionY,t.data.startPositionY===t.data.targetPositionY)return void(d.default.registered.end&&d.default.registered.end(t.data.to,t.data.target,t.data.currentPositionY));t.data.deltaTop=Math.round(t.data.targetPositionY-t.data.startPositionY),t.data.duration=h(t.duration)(t.data.deltaTop),t.data.duration=isNaN(parseFloat(t.data.duration))?1e3:parseFloat(t.data.duration),t.data.to=n,t.data.target=r;var o=f(t),i=b.bind(null,o,t);if(t&&t.delay>0)return void(t.data.delayTimeout=window.setTimeout(function(){m.call(window,i)},t.delay));m.call(window,i)},_=function(e){return e=o({},e),e.data=e.data||y(),e.absolute=!0,e},O=function(e){w(0,_(e))},S=function(e,t){w(e,_(t))},E=function(e){e=_(e),k(e),w(g(e),e)},P=function(e,t){t=_(t),k(t),w(v(t)+e,t)};t.default={animateTopScroll:w,getAnimationType:f,scrollToTop:O,scrollToBottom:E,scrollTo:S,scrollMore:P}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(6),f=(r(d),n(35)),h=r(f),p=n(2),m=r(p);t.default=function(e){var t=function(t){function n(e){o(this,n);var t=i(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));return t.childBindings={domNode:null},t}return l(n,t),s(n,[{key:"componentDidMount",value:function(){if("undefined"==typeof window)return!1;this.registerElems(this.props.name)}},{key:"componentWillReceiveProps",value:function(e){this.props.name!==e.name&&this.registerElems(e.name)}},{key:"componentWillUnmount",value:function(){if("undefined"==typeof window)return!1;h.default.unregister(this.props.name)}},{key:"registerElems",value:function(e){h.default.register(e,this.childBindings.domNode)}},{key:"render",value:function(){return c.default.createElement(e,a({},this.props,{parentBindings:this.childBindings}))}}]),n}(c.default.Component);return t.propTypes={name:m.default.string,id:m.default.string},t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=(n(37),n(13)),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i={mountFlag:!1,initialized:!1,scroller:null,containers:{},mount:function(e){this.scroller=e,this.handleHashChange=this.handleHashChange.bind(this),window.addEventListener("hashchange",this.handleHashChange),this.initStateFromHash(),this.mountFlag=!0},mapContainer:function(e,t){this.containers[e]=t},isMounted:function(){return this.mountFlag},isInitialized:function(){return this.initialized},initStateFromHash:function(){var e=this,t=this.getHash();t?window.setTimeout(function(){e.scrollTo(t,!0),e.initialized=!0},10):this.initialized=!0},scrollTo:function(e,t){var n=this.scroller;if(n.get(e)&&(t||e!==n.getActiveLink())){var r=this.containers[e]||document;n.scrollTo(e,{container:r})}},getHash:function(){return o.default.getHash()},changeHash:function(e){this.isInitialized()&&o.default.getHash()!==e&&o.default.pushHash(e)},handleHashChange:function(){this.scrollTo(this.getHash())},unmount:function(){this.scroller=null,this.containers=null,window.removeEventListener("hashchange",this.handleHashChange)}};t.default=i},function(e,t,n){(function(e){function n(e,t){for(var n=0,r=e.length-1;r>=0;r--){var o=e[r];"."===o?e.splice(r,1):".."===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.length;r++)t(e[r],r,e)&&n.push(e[r]);return n}var o=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return o.exec(e).slice(1)};t.resolve=function(){for(var t="",o=!1,i=arguments.length-1;i>=-1&&!o;i--){var l=i>=0?arguments[i]:e.cwd();if("string"!=typeof l)throw new TypeError("Arguments to path.resolve must be strings");l&&(t=l+"/"+t,o="/"===l.charAt(0))}return t=n(r(t.split("/"),function(e){return!!e}),!o).join("/"),(o?"/":"")+t||"."},t.normalize=function(e){var o=t.isAbsolute(e),i="/"===l(e,-1);return e=n(r(e.split("/"),function(e){return!!e}),!o).join("/"),e||o||(e="."),e&&i&&(e+="/"),(o?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(r(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},t.relative=function(e,n){function r(e){for(var t=0;t<e.length&&""===e[t];t++);for(var n=e.length-1;n>=0&&""===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=t.resolve(e).substr(1),n=t.resolve(n).substr(1);for(var o=r(e.split("/")),i=r(n.split("/")),l=Math.min(o.length,i.length),a=l,s=0;s<l;s++)if(o[s]!==i[s]){a=s;break}for(var u=[],s=a;s<o.length;s++)u.push("..");return u=u.concat(i.slice(a)),u.join("/")},t.sep="/",t.delimiter=":",t.dirname=function(e){var t=i(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},t.basename=function(e,t){var n=i(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},t.extname=function(e){return i(e)[3]};var l="b"==="ab".substr(-1)?function(e,t,n){return e.substr(t,n)}:function(e,t,n){return t<0&&(t=e.length+t),e.substr(t,n)}}).call(t,n(48))},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Helpers=t.ScrollElement=t.ScrollLink=t.animateScroll=t.scrollSpy=t.Events=t.scroller=t.Element=t.Button=t.Link=void 0;var o=n(51),i=r(o),l=n(49),a=r(l),s=n(50),u=r(s),c=n(35),d=r(c),f=n(38),h=r(f),p=n(40),m=r(p),y=n(42),v=r(y),g=n(39),b=r(g),k=n(43),w=r(k),_=n(52),O=r(_);t.Link=i.default,t.Button=a.default,t.Element=u.default,t.scroller=d.default,t.Events=h.default,t.scrollSpy=m.default,t.animateScroll=v.default,t.ScrollLink=b.default,t.ScrollElement=w.default,t.Helpers=O.default,t.default={Link:i.default,Button:a.default,Element:u.default,scroller:d.default,Events:h.default,scrollSpy:m.default,animateScroll:v.default,ScrollLink:b.default,ScrollElement:w.default,Helpers:O.default}},function(e,t,n){(function(t){function n(e,t,n){function r(t){var n=m,r=y;return m=y=void 0,S=t,g=e.apply(r,n)}function i(e){return S=e,b=setTimeout(c,t),E?r(e):g}function l(e){var n=e-k,r=e-S,o=t-n;return P?_(o,v-r):o}function u(e){var n=e-k,r=e-S;return void 0===k||n>=t||n<0||P&&r>=v}function c(){var e=O();if(u(e))return d(e);b=setTimeout(c,l(e))}function d(e){return b=void 0,z&&m?r(e):(m=y=void 0,g)}function f(){void 0!==b&&clearTimeout(b),S=0,m=k=y=b=void 0}function h(){return void 0===b?g:d(O())}function p(){var e=O(),n=u(e);if(m=arguments,y=this,k=e,n){if(void 0===b)return i(k);if(P)return b=setTimeout(c,t),r(k)}return void 0===b&&(b=setTimeout(c,t)),g}var m,y,v,g,b,k,S=0,E=!1,P=!1,z=!0;if("function"!=typeof e)throw new TypeError(s);return t=a(t)||0,o(n)&&(E=!!n.leading,P="maxWait"in n,v=P?w(a(n.maxWait)||0,t):v,z="trailing"in n?!!n.trailing:z),p.cancel=f,p.flush=h,p}function r(e,t,r){var i=!0,l=!0;if("function"!=typeof e)throw new TypeError(s);return o(r)&&(i="leading"in r?!!r.leading:i,l="trailing"in r?!!r.trailing:l),n(e,t,{leading:i,maxWait:t,trailing:l})}function o(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==typeof e}function l(e){return"symbol"==typeof e||i(e)&&k.call(e)==c}function a(e){if("number"==typeof e)return e;if(l(e))return u;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=h.test(e);return n||p.test(e)?m(e.slice(2),n?2:8):f.test(e)?u:+e}var s="Expected a function",u=NaN,c="[object Symbol]",d=/^\s+|\s+$/g,f=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,p=/^0o[0-7]+$/i,m=parseInt,y="object"==typeof t&&t&&t.Object===Object&&t,v="object"==typeof self&&self&&self.Object===Object&&self,g=y||v||Function("return this")(),b=Object.prototype,k=b.toString,w=Math.max,_=Math.min,O=function(){return g.Date.now()};e.exports=r}).call(t,n(55))},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(d===clearTimeout)return clearTimeout(e);if((d===r||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(e);try{return d(e)}catch(t){try{return d.call(null,e)}catch(t){return d.call(this,e)}}}function l(){m&&h&&(m=!1,h.length?p=h.concat(p):y=-1,p.length&&a())}function a(){if(!m){var e=o(l);m=!0;for(var t=p.length;t;){for(h=p,p=[];++y<t;)h&&h[y].run();y=-1,t=p.length}h=null,m=!1,i(e)}}function s(e,t){this.fun=e,this.array=t}function u(){}var c,d,f=e.exports={};!function(){try{c="function"==typeof setTimeout?setTimeout:n}catch(e){c=n}try{d="function"==typeof clearTimeout?clearTimeout:r}catch(e){d=r}}();var h,p=[],m=!1,y=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];p.push(new s(e,t)),1!==p.length||m||o(a)},s.prototype.run=function(){this.fun.apply(null,this.array)},f.title="browser",f.browser=!0,f.env={},f.argv=[],f.version="",f.versions={},f.on=u,f.addListener=u,f.once=u,f.off=u,f.removeListener=u,f.removeAllListeners=u,f.emit=u,f.prependListener=u,f.prependOnceListener=u,f.listeners=function(e){return[]},f.binding=function(e){throw new Error("process.binding is not supported")},f.cwd=function(){return"/"},f.chdir=function(e){throw new Error("process.chdir is not supported")},f.umask=function(){return 0}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=r(s),c=n(39),d=r(c),f=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),a(t,[{key:"render",value:function(){return u.default.createElement("input",this.props,this.props.children)}}]),t}(u.default.Component);t.default=(0,d.default)(f)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(43),f=r(d),h=n(2),p=r(h),m=function(e){function t(){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return l(t,e),s(t,[{key:"render",value:function(){var e=this,t=a({},this.props);return t.parentBindings&&delete t.parentBindings,c.default.createElement("div",a({},t,{ref:function(t){e.props.parentBindings.domNode=t}}),this.props.children)}}]),t}(c.default.Component);m.propTypes={name:p.default.string,id:p.default.string},t.default=(0,f.default)(m)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(1),s=r(a),u=n(39),c=r(u),d=function(e){function t(){var e,n,r,l;o(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),r.render=function(){return s.default.createElement("a",r.props,r.props.children)},l=n,i(r,l)}return l(t,e),t}(s.default.Component);t.default=(0,c.default)(d)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=(n(6),n(13),n(40)),c=n(35),d=n(2),f=n(44),h={to:d.string.isRequired,containerId:d.string,container:d.object,activeClass:d.string,spy:d.bool,smooth:d.oneOfType([d.bool,d.string]),offset:d.number,delay:d.number,isDynamic:d.bool,onClick:d.func,duration:d.oneOfType([d.number,d.func]),absolute:d.bool,onSetActive:d.func,onSetInactive:d.func,ignoreCancelEvents:d.bool,hashSpy:d.bool},p={Scroll:function(e,t){console.warn("Helpers.Scroll is deprecated since v1.7.0");var n=t||c,d=function(t){function c(e){r(this,c);var t=o(this,(c.__proto__||Object.getPrototypeOf(c)).call(this,e));return p.call(t),t.state={active:!1},t}return i(c,t),a(c,[{key:"getScrollSpyContainer",value:function(){var e=this.props.containerId,t=this.props.container;return e?document.getElementById(e):t&&t.nodeType?t:document}},{key:"componentDidMount",value:function(){if(this.props.spy||this.props.hashSpy){var e=this.getScrollSpyContainer();u.isMounted(e)||u.mount(e),this.props.hashSpy&&(f.isMounted()||f.mount(n),f.mapContainer(this.props.to,e)),this.props.spy&&u.addStateHandler(this.stateHandler),u.addSpyHandler(this.spyHandler,e),this.setState({container:e})}}},{key:"componentWillUnmount",value:function(){u.unmount(this.stateHandler,this.spyHandler)}},{key:"render",value:function(){var t="";t=this.state&&this.state.active?((this.props.className||"")+" "+(this.props.activeClass||"active")).trim():this.props.className;var n=l({},this.props);for(var r in h)n.hasOwnProperty(r)&&delete n[r];return n.className=t,n.onClick=this.handleClick,s.createElement(e,n)}}]),c}(s.Component),p=function(){var e=this;this.scrollTo=function(t,r){n.scrollTo(t,l({},e.state,r))},this.handleClick=function(t){e.props.onClick&&e.props.onClick(t),t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),e.scrollTo(e.props.to,e.props)},this.stateHandler=function(){n.getActiveLink()!==e.props.to&&(null!==e.state&&e.state.active&&e.props.onSetInactive&&e.props.onSetInactive(),e.setState({active:!1}))},this.spyHandler=function(t){var r=e.getScrollSpyContainer();if(!f.isMounted()||f.isInitialized()){var o=e.props.to,i=null,l=0,a=0,s=0;if(r.getBoundingClientRect){s=r.getBoundingClientRect().top}if(!i||e.props.isDynamic){if(!(i=n.get(o)))return;var c=i.getBoundingClientRect();l=c.top-s+t,a=l+c.height}var d=t-e.props.offset,h=d>=Math.floor(l)&&d<Math.floor(a),p=d<Math.floor(l)||d>=Math.floor(a),m=n.getActiveLink();return p?(o===m&&n.setActiveLink(void 0),e.props.hashSpy&&f.getHash()===o&&f.changeHash(),e.props.spy&&e.state.active&&(e.setState({active:!1}),e.props.onSetInactive&&e.props.onSetInactive()),u.updateStates()):h&&m!==o?(n.setActiveLink(o),e.props.hashSpy&&f.changeHash(o),e.props.spy&&(e.setState({active:!0}),e.props.onSetActive&&e.props.onSetActive(o)),u.updateStates()):void 0}}};return d.propTypes=h,d.defaultProps={offset:0},d},Element:function(e){console.warn("Helpers.Element is deprecated since v1.7.0");var t=function(t){function n(e){r(this,n);var t=o(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));return t.childBindings={domNode:null},t}return i(n,t),a(n,[{key:"componentDidMount",value:function(){if("undefined"==typeof window)return!1;this.registerElems(this.props.name)}},{key:"componentWillReceiveProps",value:function(e){this.props.name!==e.name&&this.registerElems(e.name)}},{key:"componentWillUnmount",value:function(){if("undefined"==typeof window)return!1;c.unregister(this.props.name)}},{key:"registerElems",value:function(e){c.register(e,this.childBindings.domNode)}},{key:"render",value:function(){return s.createElement(e,l({},this.props,{parentBindings:this.childBindings}))}}]),n}(s.Component);return t.propTypes={name:d.string,id:d.string},t}};e.exports=p},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(37),o=["mousedown","mousewheel","touchmove","keydown"];t.default={subscribe:function(e){return"undefined"!=typeof document&&o.forEach(function(t){return(0,r.addPassiveEventListener)(document,t,e)})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={defaultEasing:function(e){return e<.5?Math.pow(2*e,2)/2:1-Math.pow(2*(1-e),2)/2},linear:function(e){return e},easeInQuad:function(e){return e*e},easeOutQuad:function(e){return e*(2-e)},easeInOutQuad:function(e){return e<.5?2*e*e:(4-2*e)*e-1},easeInCubic:function(e){return e*e*e},easeOutCubic:function(e){return--e*e*e+1},easeInOutCubic:function(e){return e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1},easeInQuart:function(e){return e*e*e*e},easeOutQuart:function(e){return 1- --e*e*e*e},easeInOutQuart:function(e){return e<.5?8*e*e*e*e:1-8*--e*e*e*e},easeInQuint:function(e){return e*e*e*e*e},easeOutQuint:function(e){return 1+--e*e*e*e*e},easeInOutQuint:function(e){return e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e}}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={"en-us":{sidemenu:[{title:"User Guide",children:[{title:"FAQ",link:"/en-us/docs/developers/user-guide/faq_dev.html"}]},{title:"Contribute Guide",children:[{title:"New contributor guide",link:"/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html"},{title:"Software donation guide",link:"/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html"},{title:"Test coverage guide",link:"/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html"},{title:"Mailing list subscription guide",link:"/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html"},{title:"CLA Signing Guide",link:"/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html"},{title:"Extension guide",link:"/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html"}]},{title:"Committer Guide",children:[{title:"New Committer guide",link:"/en-us/docs/developers/committer-guide/new-committer-guide_dev.html"},{title:"Label an Issue",link:"/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html"},{title:"Website Guide",link:"/en-us/docs/developers/committer-guide/website-guide_dev.html"}]},{children:[{title:"How to contribute",link:"/en-us/docs/developers/guide_dev.html"},{title:"Developers",link:"/en-us/docs/developers/developers_dev.html"}]}],barText:"Developers"},"zh-cn":{sidemenu:[{title:"User Guide",children:[{title:"FAQ",link:"/zh-cn/docs/developers/user-guide/faq_dev.html"}]},{title:"贡献者向导",children:[{title:"新贡献者向导",link:"/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html"},{title:"软件捐献向导",link:"/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html"},{title:"测试覆盖率向导",link:"/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html"},{title:"邮件列表订阅向导",link:"/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html"},{title:"CLA签署向导",link:"/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html"},{title:"Dubbo Extension向导",link:"/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html"}]},{title:"提交者向导",children:[{title:"Apache提交者注册流程",link:"/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html"},{title:"给问题打标签",link:"/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html"},{title:"网站向导",link:"/zh-cn/docs/developers/committer-guide/website-guide_dev.html"}]},{children:[{title:"参与贡献",link:"/zh-cn/docs/developers/guide_dev.html"},{title:"开发人员",link:"/zh-cn/docs/developers/developers_dev.html"}]}],barText:"开发者"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={"en-us":{sidemenu:[{title:"User doc",children:[{title:"Preface",children:[{title:"Background",link:"/en-us/docs/user/preface/background.html"},{title:"Requirements",link:"/en-us/docs/user/preface/requirements.html"},{title:"Architecture",link:"/en-us/docs/user/preface/architecture.html"},{title:"Usage",link:"/en-us/docs/user/preface/usage.html"}]},{title:"Quick start",link:"/en-us/docs/user/quick-start.html"},{title:"Dependencies",link:"/en-us/docs/user/dependencies.html"},{title:"Maturality",link:"/en-us/docs/user/maturity.html"},{title:"Configuration",children:[{title:"XML configuration",link:"/en-us/docs/user/configuration/xml.html"},{title:"Properties configuration",link:"/en-us/docs/user/configuration/properties.html"},{title:"API configuration",link:"/en-us/docs/user/configuration/api.html"},{title:"Annotation configuration",link:"/en-us/docs/user/configuration/annotation.html"}]},{title:"Demos",children:[{title:"Start check",link:"/en-us/docs/user/demos/preflight-check.html"},{title:"Fault-tolerent strategy",link:"/en-us/docs/user/demos/fault-tolerent-strategy.html"},{title:"Load balance",link:"/en-us/docs/user/demos/loadbalance.html"},{title:"Thread model",link:"/en-us/docs/user/demos/thread-model.html"},{title:"Connecting certain provider straightly",link:"/en-us/docs/user/demos/explicit-target.html"},{title:"Subscribe only",link:"/en-us/docs/user/demos/subscribe-only.html"},{title:"Registry only",link:"/en-us/docs/user/demos/registry-only.html"},{title:"Static service",link:"/en-us/docs/user/demos/static-service.html"},{title:"Multi-protocols",link:"/en-us/docs/user/demos/multi-protocols.html"},{title:"Multi-registries",link:"/en-us/docs/user/demos/multi-registry.html"},{title:"Service group",link:"/en-us/docs/user/demos/service-group.html"},{title:"Multi-versions",link:"/en-us/docs/user/demos/multi-versions.html"},{title:"Group merger",link:"/en-us/docs/user/demos/group-merger.html"},{title:"Parameter validation",link:"/en-us/docs/user/demos/parameter-validation.html"},{title:"Result cache",link:"/en-us/docs/user/demos/result-cache.html"},{title:"Generic reference",link:"/en-us/docs/user/demos/generic-reference.html"},{title:"Generic service",link:"/en-us/docs/user/demos/generic-service.html"},{title:"Echo service",link:"/en-us/docs/user/demos/echo-service.html"},{title:"Context",link:"/en-us/docs/user/demos/context.html"},{title:"Attachment",link:"/en-us/docs/user/demos/attachment.html"},{title:"Asynchronous call",link:"/en-us/docs/user/demos/async-call.html"},{title:"Local call",link:"/en-us/docs/user/demos/local-call.html"},{title:"Callback parameter",link:"/en-us/docs/user/demos/callback-parameter.html"},{title:"Events notify",link:"/en-us/docs/user/demos/events-notify.html"},{title:"Local stub",link:"/en-us/docs/user/demos/local-stub.html"},{title:"Local mock",link:"/en-us/docs/user/demos/local-mock.html"},{title:"Delay publish",link:"/en-us/docs/user/demos/delay-publish.html"},{title:"Concurrency control",link:"/en-us/docs/user/demos/concurrency-control.html"},{title:"Connections limitation",link:"/en-us/docs/user/demos/config-connections.html"},{title:"Lazy connect",link:"/en-us/docs/user/demos/lazy-connect.html"},{title:"Stickness connections",link:"/en-us/docs/user/demos/stickiness.html"},{title:"Token authorization",link:"/en-us/docs/user/demos/token-authorization.html"},{title:"Routing rule",link:"/en-us/docs/user/demos/routing-rule.html"},{title:"Configuration rule",link:"/en-us/docs/user/demos/config-rule.html"},{title:"Service downgrade",link:"/en-us/docs/user/demos/service-downgrade.html"},{title:"Graceful shutdown",link:"/en-us/docs/user/demos/graceful-shutdown.html"},{title:"Hostname binding",link:"/en-us/docs/user/demos/hostname-binding.html"},{title:"Logger strategy",link:"/en-us/docs/user/demos/logger-strategy.html"},{title:"Accesslog",link:"/en-us/docs/user/demos/accesslog.html"},{title:"Service container",link:"/en-us/docs/user/demos/service-container.html"},{title:"Reference config cache",link:"/en-us/docs/user/demos/reference-config-cache.html"},{title:"Distributed transaction",link:"/en-us/docs/user/demos/distributed-transaction.html"},{title:"Automatic thread dump",link:"/en-us/docs/user/demos/dump.html"},{title:"Netty4",link:"/en-us/docs/user/demos/netty4.html"},{title:"Serialization with FST and Kyro",link:"/en-us/docs/user/demos/serialization.html"}]},{title:"API configuration reference",link:"/en-us/docs/user/references/api.html"},{title:"Schema configuration reference",children:[{title:"Introduction",link:"/en-us/docs/user/references/xml/introduction.html"},{title:"dubbo:service",link:"/en-us/docs/user/references/xml/dubbo-service.html"},{title:"dubbo:reference",link:"/en-us/docs/user/references/xml/dubbo-reference.html"},{title:"dubbo:protocol",link:"/en-us/docs/user/references/xml/dubbo-protocol.html"},{title:"dubbo:registry",link:"/en-us/docs/user/references/xml/dubbo-registry.html"},{title:"dubbo:monitor",link:"/en-us/docs/user/references/xml/dubbo-monitor.html"},{title:"dubbo:application",link:"/en-us/docs/user/references/xml/dubbo-application.html"},{title:"dubbo:module",link:"/en-us/docs/user/references/xml/dubbo-module.html"},{title:"dubbo:provider",link:"/en-us/docs/user/references/xml/dubbo-provider.html"},{title:"dubbo:consumer",link:"/en-us/docs/user/references/xml/dubbo-consumer.html"},{title:"dubbo:method",link:"/en-us/docs/user/references/xml/dubbo-method.html"},{title:"dubbo:argument",link:"/en-us/docs/user/references/xml/dubbo-argument.html"},{title:"dubbo:parameter",link:"/en-us/docs/user/references/xml/dubbo-parameter.html"}]},{title:"Protocol configuration reference",children:[{title:"Introduction",link:"/en-us/docs/user/references/protocol/introduction.html"},{title:"dubbo://",link:"/en-us/docs/user/references/protocol/dubbo.html"},{title:"rmi://",link:"/en-us/docs/user/references/protocol/rmi.html"},{title:"hessian://",link:"/en-us/docs/user/references/protocol/hessian.html"},{title:"http://",link:"/en-us/docs/user/references/protocol/http.html"},{title:"webservice://",link:"/en-us/docs/user/references/protocol/webservice.html"},{title:"thrift://",link:"/en-us/docs/user/references/protocol/thrift.html"},{title:"memcached://",link:"/en-us/docs/user/references/protocol/memcached.html"},{title:"redis://",link:"/en-us/docs/user/references/protocol/redis.html"},{title:"rest://",link:"/en-us/docs/user/references/protocol/rest.html"}]},{title:"Registry configuration reference",children:[{title:"Introduction",link:"/en-us/docs/user/references/registry/introduction.html"},{title:"Multicast registry",link:"/en-us/docs/user/references/registry/multicast.html"},{title:"Zookeeper registry",link:"/en-us/docs/user/references/registry/zookeeper.html"},{title:"Redis registry",link:"/en-us/docs/user/references/registry/redis.html"},{title:"Simple registry",link:"/en-us/docs/user/references/registry/simple.html"}]},{title:"Telnet command",link:"/en-us/docs/user/references/telnet.html"},{title:"Maven plugin",link:"/en-us/docs/user/references/maven.html"},{title:"Best practice",link:"/en-us/docs/user/best-practice.html"},{title:"Recommended usage",link:"/en-us/docs/user/recommend.html"},{title:"Capacity plan",link:"/en-us/docs/user/capacity-plan.html"},{title:"Performance testing reports",link:"/en-us/docs/user/perf-test.html"},{title:"Test coverage report",link:"/en-us/docs/user/coveragence.html"}]},{title:"Developer guide",children:[{title:"How To Build",link:"/en-us/docs/dev/build.html"},{title:"Architecture",link:"/en-us/docs/dev/design.html"},{title:"How SPI Works",link:"/en-us/docs/dev/SPI.html"},{title:"Init, Process, Protocols",link:"/en-us/docs/dev/implementation.html"},{title:"SPI Extensions",children:[{title:"Protocol",link:"/en-us/docs/dev/impls/protocol.html"},{title:"Filter",link:"/en-us/docs/dev/impls/filter.html"},{title:"InvokerListener",link:"/en-us/docs/dev/impls/invoker-listener.html"},{title:"ExporterListener",link:"/en-us/docs/dev/impls/exporter-listener.html"},{title:"Cluster",link:"/en-us/docs/dev/impls/cluster.html"},{title:"Router",link:"/en-us/docs/dev/impls/router.html"},{title:"LoadBalance",link:"/en-us/docs/dev/impls/load-balance.html"},{title:"Merger",link:"/en-us/docs/dev/impls/merger.html"},{title:"Registry",link:"/en-us/docs/dev/impls/registry.html"},{title:"Monitor",link:"/en-us/docs/dev/impls/monitor.html"},{title:"ExtensionFactory",link:"/en-us/docs/dev/impls/extension-factory.html"},{title:"ProxyFactory",link:"/en-us/docs/dev/impls/proxy-factory.html"},{title:"Compiler",link:"/en-us/docs/dev/impls/compiler.html"},{title:"Dispatcher",link:"/en-us/docs/dev/impls/dispatcher.html"},{title:"Threadpool",link:"/en-us/docs/dev/impls/threadpool.html"},{title:"Serialization",link:"/en-us/docs/dev/impls/serialize.html"},{title:"Remoting",link:"/en-us/docs/dev/impls/remoting.html"},{title:"Exchanger",link:"/en-us/docs/dev/impls/exchanger.html"},{title:"Networker",link:"/en-us/docs/dev/impls/networker.html"},{title:"TelnetHandler",link:"/en-us/docs/dev/impls/telnet-handler.html"},{title:"StatusChecker",link:"/en-us/docs/dev/impls/status-checker.html"},{title:"Container",link:"/en-us/docs/dev/impls/container.html"},{title:"PageHandler",link:"/en-us/docs/dev/impls/page.html"},{title:"Cache",link:"/en-us/docs/dev/impls/cache.html"},{title:"Validation",link:"/en-us/docs/dev/impls/validation.html"},{title:"LoggerAdapter",link:"/en-us/docs/dev/impls/logger-adapter.html"}]},{title:"Contract",link:"/en-us/docs/dev/contract.html"},{title:"Code Style",link:"/en-us/docs/dev/coding.html"},{title:"Versions",link:"/en-us/docs/dev/release.html"},{title:"Contribution",link:"/en-us/docs/dev/contribution.html"},{title:"Checklist",link:"/en-us/docs/dev/checklist.html"},{title:"Code Smell",link:"/en-us/docs/dev/code-smell.html"},{title:"TCK",link:"/en-us/docs/dev/TCK.html"}]},{title:"Admin guide",children:[{title:"Installation",children:[{title:"Install provider demo",link:"/en-us/docs/admin/install/provider-demo.html"},{title:"Install consumer demo",link:"/en-us/docs/admin/install/consumer-demo.html"},{title:"Install Zookeeper configuration center",link:"/en-us/docs/admin/install/zookeeper.html"},{title:"Install Redis configuration center",link:"/en-us/docs/admin/install/redis.html"},{title:"Install Simple configuration center",link:"/en-us/docs/admin/install/simple-registry-center.html"},{title:"Install Simple monitor center",link:"/en-us/docs/admin/install/simple-monitor-center.html"},{title:"Install admin console",link:"/en-us/docs/admin/install/admin-console.html"}]},{title:"Operation manual",children:[{title:"Admin console operation guide",link:"/en-us/docs/admin/ops/dubbo-ops.html"},{title:"Tracking with Pinpoint",link:"/en-us/docs/admin/ops/pinpoint.html"},{title:"Tracking with Skywalking",link:"/en-us/docs/admin/ops/skywalking.html"}]}]}],barText:"Documentation"},"zh-cn":{sidemenu:[{title:"用户文档",children:[{title:"入门",children:[{title:"背景",link:"/zh-cn/docs/user/preface/background.html"},{title:"需求",link:"/zh-cn/docs/user/preface/requirements.html"},{title:"架构",link:"/zh-cn/docs/user/preface/architecture.html"},{title:"用法",link:"/zh-cn/docs/user/preface/usage.html"}]},{title:"快速启动",link:"/zh-cn/docs/user/quick-start.html"},{title:"依赖",link:"/zh-cn/docs/user/dependencies.html"},{title:"成熟度",link:"/zh-cn/docs/user/maturity.html"},{title:"配置",children:[{title:"XML配置",link:"/zh-cn/docs/user/configuration/xml.html"},{title:"属性配置",link:"/zh-cn/docs/user/configuration/properties.html"},{title:"API配置",link:"/zh-cn/docs/user/configuration/api.html"},{title:"注解配置",link:"/zh-cn/docs/user/configuration/annotation.html"}]},{title:"示例",children:[{title:"启动时检查",link:"/zh-cn/docs/user/demos/preflight-check.html"},{title:"集群容错",link:"/zh-cn/docs/user/demos/fault-tolerent-strategy.html"},{title:"负载均衡",link:"/zh-cn/docs/user/demos/loadbalance.html"},{title:"线程模型",link:"/zh-cn/docs/user/demos/thread-model.html"},{title:"直连提供者",link:"/zh-cn/docs/user/demos/explicit-target.html"},{title:"只订阅",link:"/zh-cn/docs/user/demos/subscribe-only.html"},{title:"只注册",link:"/zh-cn/docs/user/demos/registry-only.html"},{title:"静态服务",link:"/zh-cn/docs/user/demos/static-service.html"},{title:"多协议",link:"/zh-cn/docs/user/demos/multi-protocols.html"},{title:"多注册中心",link:"/zh-cn/docs/user/demos/multi-registry.html"},{title:"服务分组",link:"/zh-cn/docs/user/demos/service-group.html"},{title:"多版本",link:"/zh-cn/docs/user/demos/multi-versions.html"},{title:"分组聚合",link:"/zh-cn/docs/user/demos/group-merger.html"},{title:"参数验证",link:"/zh-cn/docs/user/demos/parameter-validation.html"},{title:"结果缓存",link:"/zh-cn/docs/user/demos/result-cache.html"},{title:"泛化引用",link:"/zh-cn/docs/user/demos/generic-reference.html"},{title:"泛化实现",link:"/zh-cn/docs/user/demos/generic-service.html"},{title:"回声测试",link:"/zh-cn/docs/user/demos/echo-service.html"},{title:"上下文信息",link:"/zh-cn/docs/user/demos/context.html"},{title:"隐式参数",link:"/zh-cn/docs/user/demos/attachment.html"},{title:"异步调用",link:"/zh-cn/docs/user/demos/async-call.html"},{title:"本地调用",link:"/zh-cn/docs/user/demos/local-call.html"},{title:"参数回调",link:"/zh-cn/docs/user/demos/callback-parameter.html"},{title:"事件通知",link:"/zh-cn/docs/user/demos/events-notify.html"},{title:"本地存根",link:"/zh-cn/docs/user/demos/local-stub.html"},{title:"本地伪装",link:"/zh-cn/docs/user/demos/local-mock.html"},{title:"延迟暴露",link:"/zh-cn/docs/user/demos/delay-publish.html"},{title:"并发控制",link:"/zh-cn/docs/user/demos/concurrency-control.html"},{title:"连接控制",link:"/zh-cn/docs/user/demos/config-connections.html"},{title:"延迟连接",link:"/zh-cn/docs/user/demos/lazy-connect.html"},{title:"粘滞连接",link:"/zh-cn/docs/user/demos/stickiness.html"},{title:"令牌验证",link:"/zh-cn/docs/user/demos/token-authorization.html"},{title:"路由规则",link:"/zh-cn/docs/user/demos/routing-rule.html"},{title:"配置规则",link:"/zh-cn/docs/user/demos/config-rule.html"},{title:"服务降级",link:"/zh-cn/docs/user/demos/service-downgrade.html"},{title:"优雅停机",link:"/zh-cn/docs/user/demos/graceful-shutdown.html"},{title:"主机绑定",link:"/zh-cn/docs/user/demos/hostname-binding.html"},{title:"日志适配",link:"/zh-cn/docs/user/demos/logger-strategy.html"},{title:"访问日志",link:"/zh-cn/docs/user/demos/accesslog.html"},{title:"服务容器",link:"/zh-cn/docs/user/demos/service-container.html"},{title:"Reference Config 缓存",link:"/zh-cn/docs/user/demos/reference-config-cache.html"},{title:"分布式事务",link:"/zh-cn/docs/user/demos/distributed-transaction.html"},{title:"线程栈自动dump",link:"/zh-cn/docs/user/demos/dump.html"},{title:"Netty4",link:"/zh-cn/docs/user/demos/netty4.html"},{title:"Kryo和FST序列化",link:"/zh-cn/docs/user/demos/serialization.html"}]},{title:"API配置参考手册",link:"/zh-cn/docs/user/references/api.html"},{title:"schema配置参考手册",children:[{title:"介绍",link:"/zh-cn/docs/user/references/xml/introduction.html"},{title:"dubbo:service",link:"/zh-cn/docs/user/references/xml/dubbo-service.html"},{title:"dubbo:reference",link:"/zh-cn/docs/user/references/xml/dubbo-reference.html"},{title:"dubbo:protocol",link:"/zh-cn/docs/user/references/xml/dubbo-protocol.html"},{title:"dubbo:registry",link:"/zh-cn/docs/user/references/xml/dubbo-registry.html"},{title:"dubbo:monitor",link:"/zh-cn/docs/user/references/xml/dubbo-monitor.html"},{title:"dubbo:application",link:"/zh-cn/docs/user/references/xml/dubbo-application.html"},{title:"dubbo:module",link:"/zh-cn/docs/user/references/xml/dubbo-module.html"},{title:"dubbo:provider",link:"/zh-cn/docs/user/references/xml/dubbo-provider.html"},{title:"dubbo:consumer",link:"/zh-cn/docs/user/references/xml/dubbo-consumer.html"},{title:"dubbo:method",link:"/zh-cn/docs/user/references/xml/dubbo-method.html"},{title:"dubbo:argument",link:"/zh-cn/docs/user/references/xml/dubbo-argument.html"},{title:"dubbo:parameter",link:"/zh-cn/docs/user/references/xml/dubbo-parameter.html"}]},{title:"协议参考手册",children:[{title:"介绍",link:"/zh-cn/docs/user/references/protocol/introduction.html"},{title:"dubbo://",link:"/zh-cn/docs/user/references/protocol/dubbo.html"},{title:"rmi://",link:"/zh-cn/docs/user/references/protocol/rmi.html"},{title:"hessian://",link:"/zh-cn/docs/user/references/protocol/hessian.html"},{title:"http://",link:"/zh-cn/docs/user/references/protocol/http.html"},{title:"webservice://",link:"/zh-cn/docs/user/references/protocol/webservice.html"},{title:"thrift://",link:"/zh-cn/docs/user/references/protocol/thrift.html"},{title:"memcached://",link:"/zh-cn/docs/user/references/protocol/memcached.html"},{title:"redis://",link:"/zh-cn/docs/user/references/protocol/redis.html"},{title:"rest://",link:"/zh-cn/docs/user/references/protocol/rest.html"}]},{title:"注册中心参考手册",children:[{title:"介绍",link:"/zh-cn/docs/user/references/registry/introduction.html"},{title:"Multicast 注册中心",link:"/zh-cn/docs/user/references/registry/multicast.html"},{title:"Zookeeper 注册中心",link:"/zh-cn/docs/user/references/registry/zookeeper.html"},{title:"Redis 注册中心",link:"/zh-cn/docs/user/references/registry/redis.html"},{title:"Simple 注册中心",link:"/zh-cn/docs/user/references/registry/simple.html"}]},{title:"telnet命令参考手册",link:"/zh-cn/docs/user/references/telnet.html"},{title:"在线运维命令-QOS",link:"/zh-cn/docs/user/references/qos.html"},{title:"maven插件参考手册",link:"/zh-cn/docs/user/references/maven.html"},{title:"服务化最佳实践",link:"/zh-cn/docs/user/best-practice.html"},{title:"推荐用法",link:"/zh-cn/docs/user/recommend.html"},{title:"容量规划",link:"/zh-cn/docs/user/capacity-plan.html"},{title:"性能测试报告",link:"/zh-cn/docs/user/perf-test.html"},{title:"测试覆盖率报告",link:"/zh-cn/docs/user/coveragence.html"}]},{title:"开发者指南",children:[{title:"源码构建",link:"/zh-cn/docs/dev/build.html"},{title:"框架设计",link:"/zh-cn/docs/dev/design.html"},{title:"扩展点加载",link:"/zh-cn/docs/dev/SPI.html"},{title:"实现细节",link:"/zh-cn/docs/dev/implementation.html"},{title:"SPI 扩展实现",children:[{title:"协议扩展",link:"/zh-cn/docs/dev/impls/protocol.html"},{title:"调用拦截扩展",link:"/zh-cn/docs/dev/impls/filter.html"},{title:"引用监听扩展",link:"/zh-cn/docs/dev/impls/invoker-listener.html"},{title:"暴露监听扩展",link:"/zh-cn/docs/dev/impls/exporter-listener.html"},{title:"集群扩展",link:"/zh-cn/docs/dev/impls/cluster.html"},{title:"路由扩展",link:"/zh-cn/docs/dev/impls/router.html"},{title:"负载均衡扩展",link:"/zh-cn/docs/dev/impls/load-balance.html"},{title:"合并结果扩展",link:"/zh-cn/docs/dev/impls/merger.html"},{title:"注册中心扩展",link:"/zh-cn/docs/dev/impls/registry.html"},{title:"监控中心扩展",link:"/zh-cn/docs/dev/impls/monitor.html"},{title:"扩展点加载扩展",link:"/zh-cn/docs/dev/impls/extension-factory.html"},{title:"动态代理扩展",link:"/zh-cn/docs/dev/impls/proxy-factory.html"},{title:"编译器扩展",link:"/zh-cn/docs/dev/impls/compiler.html"},{title:"消息派发扩展",link:"/zh-cn/docs/dev/impls/dispatcher.html"},{title:"线程池扩展",link:"/zh-cn/docs/dev/impls/threadpool.html"},{title:"序列化扩展",link:"/zh-cn/docs/dev/impls/serialize.html"},{title:"网络传输扩展",link:"/zh-cn/docs/dev/impls/remoting.html"},{title:"信息交换扩展",link:"/zh-cn/docs/dev/impls/exchanger.html"},{title:"组网扩展",link:"/zh-cn/docs/dev/impls/networker.html"},{title:"Telnet 命令扩展",link:"/zh-cn/docs/dev/impls/telnet-handler.html"},{title:"状态检查扩展",link:"/zh-cn/docs/dev/impls/status-checker.html"},{title:"容器扩展",link:"/zh-cn/docs/dev/impls/container.html"},{title:"页面扩展",link:"/zh-cn/docs/dev/impls/page.html"},{title:"缓存扩展",link:"/zh-cn/docs/dev/impls/cache.html"},{title:"验证扩展",link:"/zh-cn/docs/dev/impls/validation.html"},{title:"日志适配扩展",link:"/zh-cn/docs/dev/impls/logger-adapter.html"}]},{title:"公共契约",link:"/zh-cn/docs/dev/contract.html"},{title:"编码约定",link:"/zh-cn/docs/dev/coding.html"},{title:"设计原则",children:[{title:"魔鬼在细节",link:"/zh-cn/docs/dev/principals/code-detail.html"},{title:"一些设计上的基本常识",link:"/zh-cn/docs/dev/principals/general-knowledge.html"},{title:"谈谈扩充式扩展与增量式扩展",link:"/zh-cn/docs/dev/principals/expansibility.html"},{title:"配置设计",link:"/zh-cn/docs/dev/principals/configuration.html"},{title:"设计实现的健壮性",link:"/zh-cn/docs/dev/principals/robustness.html"},{title:"防痴呆设计",link:"/zh-cn/docs/dev/principals/dummy.html"},{title:"扩展点重构",link:"/zh-cn/docs/dev/principals/extension.html"}]},{title:"版本管理",link:"/zh-cn/docs/dev/release.html"},{title:"贡献",link:"/zh-cn/docs/dev/contribution.html"},{title:"检查列表",link:"/zh-cn/docs/dev/checklist.html"},{title:"坏味道",link:"/zh-cn/docs/dev/code-smell.html"},{title:"技术兼容性测试",link:"/zh-cn/docs/dev/TCK.html"}]},{title:"运维管理",children:[{title:"安装手册",children:[{title:"示例提供者安装",link:"/zh-cn/docs/admin/install/provider-demo.html"},{title:"示例消费者安装",link:"/zh-cn/docs/admin/install/consumer-demo.html"},{title:"Zookeeper 注册中心安装",link:"/zh-cn/docs/admin/install/zookeeper.html"},{title:"Redis 注册中心安装",link:"/zh-cn/docs/admin/install/redis.html"},{title:"Simple 注册中心安装",link:"/zh-cn/docs/admin/install/simple-registry-center.html"},{title:"Simple 监控中心安装",link:"/zh-cn/docs/admin/install/simple-monitor-center.html"},{title:"管理控制台安装",link:"/zh-cn/docs/admin/install/admin-console.html"}]},{title:"运维手册",children:[{title:"管理控制台运维",link:"/zh-cn/docs/admin/ops/dubbo-ops.html"},{title:"使用Pinpoint做分布式跟踪",link:"/zh-cn/docs/admin/ops/pinpoint.html"},{title:"使用Skywalking做分布式跟踪",link:"/zh-cn/docs/admin/ops/skywalking.html"}]}]}],barText:"文档"}}},,,,function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a,s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),c=r(u),d=n(8),f=r(d),h=n(7),p=n(77),m=r(p);n(85);var y=(a=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={menuBodyVisible:!1},n}return l(t,e),s(t,[{key:"toggleMenuBody",value:function(){this.setState({menuBodyVisible:!this.state.menuBodyVisible})}},{key:"render",value:function(){var e=this,t=this.props.dataSource,n=this.state.menuBodyVisible,r=(0,f.default)({sidemenu:!0,"sidemenu-open":n}),o=(0,f.default)({"menu-item":!0,"menu-item-level-1":!0});return c.default.createElement("div",{className:r},c.default.createElement("div",{onClick:this.toggleMenuBody,className:"sidemenu-toggle"},c.default.createElement("img",{src:n?"https://img.alicdn.com/tfs/TB1I5itXQyWBuNjy0FpXXassXXa-200-200.png":"https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"})),c.default.createElement("ul",null,t.map(function(t,n){return c.default.createElement("li",{className:o,key:n},t.title?c.default.createElement("span",null,t.title):null,c.default.createElement("ul",null,t.children.map(function(t,n){return c.default.createElement(m.default,{item:t,key:n,toggleMenuBody:e.toggleMenuBody})})))})))}}]),t}(c.default.Component),function(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}(a.prototype,"toggleMenuBody",[h.autobind],Object.getOwnPropertyDescriptor(a.prototype,"toggleMenuBody"),a.prototype),a);t.default=y},,,,,,,,,,,function(e,t){},,function(e,t){!function(e){"use strict";function t(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function n(e){return"string"!=typeof e&&(e=String(e)),e}function r(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return v.iterable&&(t[Symbol.iterator]=function(){return t}),t}function o(e){this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):Array.isArray(e)?e.forEach(function(e){this.append(e[0],e[1])},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function i(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function l(e){return new Promise(function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function a(e){var t=new FileReader,n=l(t);return t.readAsArrayBuffer(e),n}function s(e){var t=new FileReader,n=l(t);return t.readAsText(e),n}function u(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}function c(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function d(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"==typeof e)this._bodyText=e;else if(v.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(v.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(v.searchParams&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=e.toString();else if(v.arrayBuffer&&v.blob&&b(e))this._bodyArrayBuffer=c(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!v.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e)&&!k(e))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=c(e)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):v.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},v.blob&&(this.blob=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?i(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(a)}),this.text=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return s(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(u(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},v.formData&&(this.formData=function(){return this.text().then(p)}),this.json=function(){return this.text().then(JSON.parse)},this}function f(e){var t=e.toUpperCase();return w.indexOf(t)>-1?t:e}function h(e,t){t=t||{};var n=t.body;if(e instanceof h){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||null==e._bodyInit||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=f(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function p(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}}),t}function m(e){var t=new o;return e.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();t.append(r,o)}}),t}function y(e,t){t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new o(t.headers),this.url=t.url||"",this._initBody(e)}if(!e.fetch){var v={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:"FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(v.arrayBuffer)var g=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],b=function(e){return e&&DataView.prototype.isPrototypeOf(e)},k=ArrayBuffer.isView||function(e){return e&&g.indexOf(Object.prototype.toString.call(e))>-1};o.prototype.append=function(e,r){e=t(e),r=n(r);var o=this.map[e];this.map[e]=o?o+","+r:r},o.prototype.delete=function(e){delete this.map[t(e)]},o.prototype.get=function(e){return e=t(e),this.has(e)?this.map[e]:null},o.prototype.has=function(e){return this.map.hasOwnProperty(t(e))},o.prototype.set=function(e,r){this.map[t(e)]=n(r)},o.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},o.prototype.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),r(e)},o.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),r(e)},o.prototype.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),r(e)},v.iterable&&(o.prototype[Symbol.iterator]=o.prototype.entries);var w=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];h.prototype.clone=function(){return new h(this,{body:this._bodyInit})},d.call(h.prototype),d.call(y.prototype),y.prototype.clone=function(){return new y(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},y.error=function(){var e=new y(null,{status:0,statusText:""});return e.type="error",e};var _=[301,302,303,307,308];y.redirect=function(e,t){if(-1===_.indexOf(t))throw new RangeError("Invalid status code");return new y(null,{status:t,headers:{location:e}})},e.Headers=o,e.Request=h,e.Response=y,e.fetch=function(e,t){return new Promise(function(n,r){var o=new h(e,t),i=new XMLHttpRequest;i.onload=function(){var e={status:i.status,statusText:i.statusText,headers:m(i.getAllResponseHeaders()||"")};e.url="responseURL"in i?i.responseURL:e.headers.get("X-Request-URL");var t="response"in i?i.response:i.responseText;n(new y(t,e))},i.onerror=function(){r(new TypeError("Network request failed"))},i.ontimeout=function(){r(new TypeError("Network request failed"))},i.open(o.method,o.url,!0),"include"===o.credentials?i.withCredentials=!0:"omit"===o.credentials&&(i.withCredentials=!1),"responseType"in i&&v.blob&&(i.responseType="blob"),o.headers.forEach(function(e,t){i.setRequestHeader(t,e)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})},e.fetch.polyfill=!0}}("undefined"!=typeof self?self:this)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e,t,n,r,o){var i={};return Object.keys(r).forEach(function(e){i[e]=r[e]}),i.enumerable=!!i.enumerable,i.configurable=!!i.configurable,("value"in i||i.initializer)&&(i.writable=!0),i=n.slice().reverse().reduce(function(n,r){return r(e,t,n)||n},i),o&&void 0!==i.initializer&&(i.value=i.initializer?i.initializer.call(o):void 0,i.initializer=void 0),void 0===i.initializer&&(Object.defineProperty(e,t,i),i=null),i}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(1),d=r(c),f=n(7),h=n(8),p=r(h),m=n(5),y=(s=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),r=e.item,l=r.children&&r.children.length,a=e.item.opened;return l?void 0===a&&(a=r.children.find(function(e){return""+window.rootPath+e.link===window.location.pathname})):a=!1,n.state={opened:a},n}return l(t,e),u(t,[{key:"onItemClick",value:function(e){this.props.toggleMenuBody(),e.stopPropagation()}},{key:"toggle",value:function(){this.setState({opened:!this.state.opened})}},{key:"renderSubMenu",value:function(e){var t=this;return d.default.createElement("ul",null,e.map(function(e,n){return d.default.createElement("li",{className:(0,p.default)({"menu-item":!0,"menu-item-level-3":!0,"menu-item-selected":(0,m.getLink)(e.link)===window.location.pathname}),key:n,onClick:t.onItemClick},d.default.createElement("a",{href:(0,m.getLink)(e.link),target:e.target||"_self"},e.title))}))}},{key:"render",value:function(){var e=this.props.item,t=e.children&&e.children.length,n=this.state.opened,r=(0,p.default)({"menu-item":!0,"menu-item-level-2":!0,"menu-item-selected":""+window.rootPath+e.link===window.location.pathname}),o={height:n?36*(e.children.length+1):36,overflow:"hidden"};return t?d.default.createElement("li",{style:o,className:r,onClick:this.toggle},d.default.createElement("span",null,e.title,d.default.createElement("img",{style:{transform:"rotate("+(n?0:-90)+"deg)"},className:"menu-toggle",src:window.rootPath+"/img/arrow_down.png"})),this.renderSubMenu(e.children)):d.default.createElement("li",{style:o,className:r,onClick:this.onItemClick},d.default.createElement("a",{href:(0,m.getLink)(e.link),target:e.target||"_self"},e.title))}}]),t}(d.default.Component),a(s.prototype,"onItemClick",[f.autobind],Object.getOwnPropertyDescriptor(s.prototype,"onItemClick"),s.prototype),a(s.prototype,"toggle",[f.autobind],Object.getOwnPropertyDescriptor(s.prototype,"toggle"),s.prototype),a(s.prototype,"renderSubMenu",[f.autobind],Object.getOwnPropertyDescriptor(s.prototype,"renderSubMenu"),s.prototype),s);t.default=y},,,,function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function l(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(1),u=r(s),c=n(6),d=r(c),f=n(4),h=r(f),p=n(46);n(76);var m=n(45),y=r(m),v=n(12),g=r(v),b=n(11),k=r(b),w=n(36),_=r(w),O=n(63),S=r(O),E=n(10),P=r(E),z=n(3),j=r(z),T=n(59),x=r(T),C=n(58),A=r(C);n(74);var M=/^#[^\/]/,I=/^((\.{1,2}\/)|([\w-]+[\/.]))/,B=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={__html:""},n}return l(t,e),a(t,[{key:"componentDidMount",value:function(){var e=this;fetch(window.location.pathname.replace(/\.html$/i,".json")).then(function(e){return e.json()}).then(function(t){e.setState({__html:t&&t.__html?t.__html:""})}),this.markdownContainer.addEventListener("click",function(e){if("a"===e.target.nodeName.toLowerCase()&&e.target.getAttribute("href")&&M.test(e.target.getAttribute("href"))){e.preventDefault();var t=e.target.getAttribute("href").slice(1);p.scroller.scrollTo(t,{duration:1e3,smooth:"easeInOutQuint"})}})}},{key:"componentDidUpdate",value:function(){this.handleRelativeLink(),this.handleRelativeImg()}},{key:"handleRelativeLink",value:function(){var e=h.default.get("docsite_language")||j.default.defaultLanguage,t=window.location.pathname.replace(window.rootPath+"/"+e,"").split("/").slice(0,-1),n=t.join("/");Array.from(this.markdownContainer.querySelectorAll("a")).forEach(function(t){var r=t.getAttribute("href");I.test(r)&&(t.href=""+y.default.join(window.rootPath+"/"+e,n,r.replace(/\.(md|markdown)$/,".html")))})}},{key:"handleRelativeImg",value:function(){var e=h.default.get("docsite_language")||j.default.defaultLanguage,t=window.location.pathname.replace(window.rootPath+"/"+e,"").split("/").slice(0,-1);t.splice(2,0,e);var n=t.join("/");Array.from(this.markdownContainer.querySelectorAll("img")).forEach(function(e){var t=e.getAttribute("src");I.test(t)&&(e.src=""+y.default.join(window.rootPath,n,t))})}},{key:"render",value:function(){var e=this,t=this.getLanguage(),n=-1!==window.location.pathname.split("/").pop().lastIndexOf("_dev.html"),r=n?A.default[t]:x.default[t],o=this.props.__html||this.state.__html;return u.default.createElement("div",{className:"documentation-page"},u.default.createElement(k.default,{currentKey:n?"developers":"docs",type:"normal",logo:window.rootPath+"/img/dubbo_colorful.png",language:t,onLanguageChange:this.onLanguageChange}),u.default.createElement(_.default,{img:window.rootPath+"/img/docs.png",text:r.barText}),u.default.createElement("section",{className:"content-section"},u.default.createElement(S.default,{dataSource:r.sidemenu}),u.default.createElement("div",{className:"doc-content markdown-body",ref:function(t){e.markdownContainer=t},dangerouslySetInnerHTML:{__html:o}})),u.default.createElement(P.default,{logo:window.rootPath+"/img/dubbo_gray.png"}))}}]),t}(g.default);document.getElementById("root")&&d.default.render(u.default.createElement(B,null),document.getElementById("root")),t.default=B},,,,function(e,t){}]);
\ No newline at end of file
diff --git a/docs/en-us/developers/committer-guide/label-an-issue-guide_dev.md b/docs/en-us/developers/committer-guide/label-an-issue-guide_dev.md
new file mode 100644
index 00000000..0ae02030
--- /dev/null
+++ b/docs/en-us/developers/committer-guide/label-an-issue-guide_dev.md
@@ -0,0 +1,29 @@
+# Label an Issue
+
+If you are handling an issue, remember to **mark the issue cearly with one or more labels** whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress. 
+
+For issues or pull requests that need coding and further version release to fix, you should always **mark it with a [milestone](https://github.com/apache/incubator-dubbo/milestones)**. 
+
+Some frequently used labels:
+* Help Wanted
+  * help wanted
+  * good first issue
+
+* Prority
+  * priority/blocker
+  * priority/high
+  * priority/low
+  * priority/normal
+
+* Status
+  * status/need-triage
+  * status/DO-NOT-MERGE
+  * status/READY-TO-MERGE
+  * status/invalid 
+  * status/wontfix
+
+* Type
+  * type/bug
+  * type/documentation
+  * type/enhancement
+  * type/feature
\ No newline at end of file
diff --git a/docs/en-us/developers/committer-guide/new-committer-guide_dev.md b/docs/en-us/developers/committer-guide/new-committer-guide_dev.md
new file mode 100644
index 00000000..ac292731
--- /dev/null
+++ b/docs/en-us/developers/committer-guide/new-committer-guide_dev.md
@@ -0,0 +1,88 @@
+# Apache Committer Guide
+
+## First: How to become a committer
+
+### Initial committers at the project incubator stage
+At the project incubator stage, there will be an initial committers list in the proposal of the incubator project. Confirm that you are one of the initial committers. After the vote is passed in the Apache incubator community, these committers can start preparing their account. See [incubator wiki](https://wiki.apache.org/incubator/) for details.
+
+### The active contributor is elected as a committer
+At the late development stage, an active contributor can be elected as a committer. See [how to become a committer](https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer)
+
+## Second: The individual contributor signs ICLA
+
+### 1, Apache ID
+Choose a Apache ID not in the [apache committers list page](http://people.apache.org/committer-index.html).
+
+### 2, Individual Contributor License Agreement  (ICLA):
+Download the [ICLA template](https://www.apache.org/licenses/icla.pdf). After filling the icla.pdf with personal information correctly, print, sign, scan, and send it in mail as an attachment to the secretary secretary@apache.org, the secretary will help to create the Apache user ID. At the same time, a your-id@apache.org mailbox will be created. You can see if the user has been created on the [apache committers list page (http://people.apache.org/committer-index.html).
+
+## Third: Join The Apache Developer Group
+
+* 1, login via the [Apache account tool](https://id.apache.org/), when you login at the first time, you can select the "Change password?" checkbox  to get the initial password. Then the initial password will be sent to the forward mailbox (the developer mail recorded in the project incubator proposal)
+
+* 2, about Apache mailbox: does not have its own mail content storage server. It needs to borrow the mail content storage and mail sending functions of other mail providers. In many voting sessions, Apache mailbox is recommended.
+
+There is a question about how to configure the apache.org mailbox forwarding function using other mailboxes.
+
+1) inbox: to receive mails that sent to youer-id@apache.org mailbox. The forward mailbox configured in the Apache account tool in the first step can use the forward mailbox to pick up incoming mail.
+
+2) the Outbox: emails sent out will show the sender as  your-id@apache.org account. Please refer to: [set up Apache mailbox guide](https://reference.apache.org/committer/email) and [Gmail mailbox setting](http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html). In other mailbox service settings, this forwarding mode is not easy to find. Gmail is the most convenient, which is recommended  (no advertising).
+
+* 3, Modify the homepage URL option in the edit page, homepage link of  your account can be added in [apache committer index page](http://people.apache.org/committer-index.html) 
+
+* 4, Modify the GitHub account in the edit page, and an email will be sent to invite you to join the github.com/apache-commiiters group. Now, please learn from the way [ASF works](http://www.apache.org/foundation/how-it-works.html#developers) to do some basic preparation of ASF development.
+
+## Fourth: To obtain write permission of the project
+
+Operation of the [GitBox account link tool](https://gitbox.apache.org/setup/) 
+
+### 1, Apache account authorization
+
+According to the prompt, the OAuth protocol of Apache account is authorized to login.
+
+### 2, Github account authorization
+
+According to the prompt, the OAuth protocol of Github account is authorized to login.
+
+### 3, Set up GitHub account in github.com, two-factors authorization (2FA)
+
+* 1) install "Google Authenticator" app on your cell phone
+* 2), Following the [authorized GitHub 2FA wiki](https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/),  you can operation step by step .
+
+In the [two-factors authorization authentication (2. Scan this barcode with your app.)](https://github.com/settings/two_factor_authentication/verify) page, it is not recommended to select a two-dimensional code with a cell phone, because some of the cell phones will not be able to scan.
+
+Please open the cell phone "Google Authenticator" app, click "+" to select "input the secret key": write the GitHub account in the account name input box. In your "secret key" input box, write the text of the "enter this text code" link in the open web page. After clicking "add" in app, 6 digit dynamic will be generated for this account. Write the 6 digit number to the text box in the web page, and then click "Enable". In this way, the 2fa is set successfully.
+
+* 3), logout and login to Github again, and one more step will appear after entering user name and password. Fill in the 6 digit number dynamic password  generated by the app 
+
+* 4),It will take about half an hour, and you will be notified by mail that you have joined the XX project-committers developer group. You can also check it in the [apache teams] (https://github.com/orgs/apache/teams) page yourself.
+
+* 5), After the 2fa has been submitted, you will have the permission check problem for the cloned projects. The solution is one of below two:
+
+* A. Apply for Access Token
+
+When access token is generated on GitHub, the token where the instruction line needs a password is pasted.
+
+Refer to website [referenced link one](https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled) and [referenced link two](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/)
+
+* B. switch to SSH
+
+ssh-keygen then paste the content in the pub file into GitHub.
+
+**Note**: ensure that GitHub's 2fa is "enabled". When you set 2fa to "off", it will be delisted by the corresponding Apache committer write permission group until you set it up again.
+
+## Fifth: other
+
+### The Apache way
+
+See [wiki](http://apache.org/foundation/governance/).
+
+The community is more important than the code
+If not discussed in the community (mailing list), just as it did not happen
+
+### A small benefit
+
+Jetbrains company gives Apache committers a small benefit, which is free to use IDEA's full series products. The specific address is: https://www.jetbrains.com/shop/eform/apache?Product=ALL
+
+### Reference wiki
+https://www.apache.org/dev/new-committers-guide.html
\ No newline at end of file
diff --git a/docs/en-us/developers/committer-guide/website-guide_dev.md b/docs/en-us/developers/committer-guide/website-guide_dev.md
new file mode 100644
index 00000000..8777de93
--- /dev/null
+++ b/docs/en-us/developers/committer-guide/website-guide_dev.md
@@ -0,0 +1,4 @@
+# Website Guide
+
+1. The website repository of Apache Dubbo(incubating) is https://github.com/apache/incubator-dubbo-website
+2. After building the website, it'll be published to dubbo.apache.org automatically, you can also trigger it manually via https://selfserve.apache.org (need to login with Apache account) 
diff --git a/docs/en-us/developers/contributor-guide/cla-signing-guide_dev.md b/docs/en-us/developers/contributor-guide/cla-signing-guide_dev.md
new file mode 100644
index 00000000..974ba8c7
--- /dev/null
+++ b/docs/en-us/developers/contributor-guide/cla-signing-guide_dev.md
@@ -0,0 +1,25 @@
+# CLA Signing Guide
+
+You are required to sign the Apache ICLA under the following condition:
+* You have made lots of contribution to Dubbo before Dubbo get donated to Apache, and you haven't sign the Alibaba-CLA before.
+* You have made lots of contribution to Dubbo, and you are invited to become committer of Dubbo, and you have not signed Alibaba-CLA or Apache ICLA before.
+
+#### Steps
+
+* Download this [pdf](https://www.apache.org/licenses/icla.pdf)
+* Fill in the necessary blanks
+* Print it out
+* Sign the printed file
+* Scan it
+* Send an email to secretary@apache.org and cc private@dubbo.apache.org:
+  * entitled with "ICLA submission"
+  * please also provide the link to your github account in the email body
+  * remember to add you ICLA as attachment.
+
+
+#### Explanation to the fields
+
+* Mailing address: Your company address in English is preferred.
+* preferred apache id(s): if you are invited to become committers, you have to choose one apache id, otherwise you can leave it blank.
+* notify project: Dubbo  (This means Dubbo is the project who notifies you to sign the ICLA)
+
diff --git a/docs/en-us/developers/contributor-guide/dubbo-extension-guide_dev.md b/docs/en-us/developers/contributor-guide/dubbo-extension-guide_dev.md
new file mode 100644
index 00000000..028a3f4c
--- /dev/null
+++ b/docs/en-us/developers/contributor-guide/dubbo-extension-guide_dev.md
@@ -0,0 +1,37 @@
+# Extension guide
+
+Dubbo Use microkernel + plugin design pattern. Microkernel is only responsible for assembling plugins, the functions of Dubbo are implemented by extension points(plugins), which means that all functions of Dubbo can be replaced by user customized extension.
+
+## Dubbo Ecosystem
+
+We recommend you to put extension to Dubbo [ecosystem](https://github.com/dubbo). Using this pattern will keep the core repository cleaner and decrease the maintains work. With less code also speed up core repository build process.
+
+## Dependency
+Implement your own Dubbo extension, in general is just dependence on API jar correspond to what you want.
+For example:
+```xml
+<dependency>
+    <groupId>org.apache.dubbo</groupId>
+    <artifactId>dubbo-serialization-api</artifactId>
+    <version>${dubbo.version}</version>
+</dependency>
+```
+
+## Src Guide
+Usually, implement special extension, just need reference the [Developer Guide](http://dubbo.apache.org/#/docs/dev/build.md?lang=en-us) docs. Implement necessary interface and adapt extension to dubbo. Besides, some others should be considered:
+1. Well tested. You should write unit test and mock test to eliminate potential bugs.
+2. No warning, if some warning cannot to avoid, use @SuppressWarnings to suppress it, but do not abuse it.
+3. README. Add necessary readme to show how to use your extension, and something to take notice.
+4. License. Make sure of use Apache License 2.0.
+
+## Notify the Community
+1. Commit your code to [GitHub](https://github.com).
+2. Join the mail list (recommended). [HowTo](https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide)
+2. Send email to dev@incubator.dubbo.apache.org to notify the community
+3. Usually, after sending email, community will discuss your extension, and Administrators of dubbo group will contact you for transfer project to dubbo ecosystem.
+
+## Transfer Project to Dubbo Group
+1. Administrators of dubbo group will ask you, grant your project owner to dubbo.
+2. Administrators of dubbo group will create a new project under dubbo group and invite you join the project.
+3. Once you accept the invitation, you can transfer your project to new project under dubbo group.
+4. Existing members of dubbo group will do the code review. After that you may make some improvement to code.
\ No newline at end of file
diff --git a/docs/en-us/developers/contributor-guide/mailing-list-subscription-guide_dev.md b/docs/en-us/developers/contributor-guide/mailing-list-subscription-guide_dev.md
new file mode 100644
index 00000000..8dd7e177
--- /dev/null
+++ b/docs/en-us/developers/contributor-guide/mailing-list-subscription-guide_dev.md
@@ -0,0 +1,78 @@
+# Mailing list subscription guide
+
+The Dubbo developer mailing list (dev@dubbo.incubator.apache.org) for Apache Incubator has been established, please feel free to subscribe and refer to [1] for more details.
+
+Here is a brief guide specific to Dubbo:
+
+1. Send an email to dev-subscribe@dubbo.incubator.apache.org, you can have empty subject and empty content. You will receive an email with the following content:
+
+```
+from: dev-help@dubbo.apache.org
+reply-to: dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+to: hello@example.com
+date: Sat, Feb 24, 2018 at 3:12 PM
+subject: confirm subscribe to dev@dubbo.apache.org
+mailed-by: apache.org
+
+Hi! This is the ezmlm program. I'm managing the
+dev@dubbo.apache.org mailing list.
+
+I'm working for my owner, who can be reached
+at dev-owner@dubbo.apache.org.
+
+To confirm that you would like
+
+   hello@example.com
+
+added to the dev mailing list, please send
+a short reply to this address:
+
+   dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+
+Usually, this happens when you just hit the "reply" button.
+If this does not work, simply copy the address and paste it into
+the "To:" field of a new message.
+
+or click here:
+        mailto:dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+
+...
+```
+
+2. Reply the email directly, you can have empty subject and empty content. You will receive an email with the following content:
+
+```
+from: dev-help@dubbo.apache.org
+to: hello@example.com
+date: Sat, Feb 24, 2018 at 3:14 PM
+subject: WELCOME to dev@dubbo.apache.org
+mailed-by: apache.org
+
+Hi! This is the ezmlm program. I'm managing the
+dev@dubbo.apache.org mailing list.
+
+I'm working for my owner, who can be reached
+at dev-owner@dubbo.apache.org.
+
+Acknowledgment: I have added the address
+
+   hello@example.com
+
+to the dev mailing list.
+
+Welcome to dev@dubbo.apache.org!
+
+Please save this message so that you know the address you are
+subscribed under, in case you later want to unsubscribe or change your
+subscription address.
+
+...
+```
+
+3. After that, you will receive any email that is posted to this mailing list. If you have any further questions, just send email to dev@dubbo.incubator.apache.org and hopefully someone will answer your questions.
+
+4. If you want to unsubscribe, just send an email to dev-unsubscribe@dubbo.incubator.apache.org, and follow the steps once you get an reply.
+
+> Note that both dev@dubbo.apache.org and dev@dubbo.incubator.apache.org should work, you can pick any of it.
+
+[1] http://apache.org/foundation/mailinglists.html#subscribing
\ No newline at end of file
diff --git a/docs/en-us/developers/contributor-guide/new-contributor-guide.md b/docs/en-us/developers/contributor-guide/new-contributor-guide.md
new file mode 100644
index 00000000..167d306e
--- /dev/null
+++ b/docs/en-us/developers/contributor-guide/new-contributor-guide.md
@@ -0,0 +1,33 @@
+# New contributor guide
+
+This is a guide for new comers who wants to contribute to Dubbo.
+
+### Subscribe to the mailing list
+
+The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this [issue](https://github.com/apache/incubator-dubbo/issues/1393) for detailed documentation on how to subscribe.
+
+* dev@dubbo.incubator.apache.org: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.
+* commits@dubbo.incubator.apache.org: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.
+* issues@dubbo.incubator.apache.org: all the JIRA [issues](https://issues.apache.org/jira/projects/DUBBO/issues) and updates will be sent to this mailing list. The Dubbo community has decided to use github issues rather than JIRA issues, therefore it is expected that most of the issues will be tracked by github issues. The JIRA issues are used to track ASF related issues.
+
+
+### Reporting issue
+
+### Sending pull request
+
+* Follow the checklist in the [pull request template](https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md)
+* Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:
+
+```sh
+git remote add upstream git@github.com:apache/incubator-dubbo.git
+git fetch upstream
+git rebase upstream/master
+git checkout -b your_awesome_patch
+... add some work
+git push origin your_awesome_patch
+```
+
+
+### Code convention
+
+Please check the [CONTRIBUTING.md](https://github.com/apache/incubator-dubbo/blob/master/CONTRIBUTING.md) for code convention.
\ No newline at end of file
diff --git a/docs/en-us/developers/contributor-guide/software-donation-guide_dev.md b/docs/en-us/developers/contributor-guide/software-donation-guide_dev.md
new file mode 100644
index 00000000..c413c288
--- /dev/null
+++ b/docs/en-us/developers/contributor-guide/software-donation-guide_dev.md
@@ -0,0 +1,106 @@
+# Software donation guide
+
+Before you go through this guide, make sure you have confirmed with PPMC that a SGA is actually needed.
+
+If you are donating significant amount of code or documentation to Apache Dubbo (incubating), you will be required to sign a [Software Grant](https://www.apache.org/licenses/#grants) before your code/doc could be merged.
+
+#### Steps
+
+1. Download this [pdf](https://www.apache.org/licenses/software-grant-template.pdf)
+2. Print it out
+3. Fill in the blanks (see below as an example)
+4. Request your boss to sign it
+5. Scan it
+6. Send an email to secretary@apache.org and cc private@dubbo.apache.org
+
+#### Example:
+
+Below is an text versioned **example**, original text could be found [here](https://www.apache.org/licenses/software-grant.txt) 
+
+```
+License Agreement
+
+
+    This License Agreement is entered into as of the _12th_ day of
+___April____, __2018__ by ___ABC Software Co., Ltd.____ ("Licensor"),
+in favor of The Apache Software Foundation, a Delaware nonstock
+membership corporation (the "Foundation").
+
+    WHEREAS, Licensor owns or has sufficient rights to contribute the
+software source code and other related intellectual property as
+itemized on Exhibit A ("Software") under the terms of this agreement
+to the Foundation for use within Foundation software development
+projects ("Projects").
+
+    NOW, THEREFORE, FOR GOOD AND VALUABLE CONSIDERATION, the receipt
+and legal sufficiency of which are hereby acknowledged, the parties
+hereto, intending to be legally bound, agree as follows:
+
+1. Subject to the terms and conditions of this License, Licensor
+hereby grants to the Foundation:
+
+  a) a non-exclusive, worldwide, royalty-free, irrevocable
+     copyright license to reproduce, prepare derivative works of,
+     publicly display, publicly perform, distribute and sublicense,
+     internally and externally, the Software and such derivative
+     works, in source code and object code form; and,
+
+  b) a non-exclusive, worldwide, royalty-free, irrevocable
+     patent license under Licensed Patents to make, use, sell,
+     offer to sell, import and otherwise transfer the Software
+     in source code and object code form. "Licensed Patents" mean
+     patent claims owned by Licensor which are necessarily
+     infringed by the use or sale of the Software alone.
+
+2. Licensor represents that, to Licensor's knowledge, Licensor is
+legally entitled to grant the above license. Licensor agrees to notify
+the Foundation of any facts or circumstances of which Licensor becomes
+aware and which makes or would make Licensor's representations in this
+License Agreement inaccurate in any respect.
+
+3. This Software is provided AS-IS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER THE LICENSOR NOR ITS
+SUPPLIERS WILL BE LIABLE TO THE FOUNDATION OR ITS LICENSEES FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+THE USE OR DISTRIBUTION OF THE WORK OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+This License Agreement is the entire agreement of the parties
+with respect to its subject matter, and may only be amended by a
+writing signed by each party. This License Agreement may be
+executed in one or more counterparts, each of which shall be
+considered an original.
+
+    IN WITNESS WHEREOF, Licensor has executed this License Agreement
+as of the date first written above.
+
+
+    LICENSOR:
+
+
+    Signed By: _____________________________________   <--- Your boss's sign here
+
+    Print Name: _____Lei Li_________________________   <--- Your boss's name here
+
+    Title: ____Director_____________________________   <--- Your boss's title here
+
+    Representing: ____ABC Software Co., Ltd. _______ 
+
+    ________________________________________________
+
+    Contact Name: ____Lei Li________________________   <--- Your boss's name here
+
+    Contact Email: ____lilei@abc.com________________   <--- Your boss's email here
+
+Exhibit A
+
+List of software and other intellectual property covered by this agreement:
+
+* Github address where your code is hosted
+* Pull request link
+```
\ No newline at end of file
diff --git a/docs/en-us/developers/contributor-guide/test-coverage-guide_dev.md b/docs/en-us/developers/contributor-guide/test-coverage-guide_dev.md
new file mode 100644
index 00000000..ac1d2009
--- /dev/null
+++ b/docs/en-us/developers/contributor-guide/test-coverage-guide_dev.md
@@ -0,0 +1,16 @@
+# Test coverage guide
+
+### 1.The benefits of unit testing 
+  * Unit test code can help everyone to go into details and understand the function of the code.
+  * We can find bugs by test case, and then enhance the robustness of the code.
+  * Test case code is also the demo usage of the core code.
+### 2.Some design principle of unit test case 
+  * Steps, fine-grained and combination conditions should be well designed.
+  * Attention to boundary condition test
+  * Test code should also be designed without writing useless code.
+  * When you find a `method` that is hard to write unit test, if you can be sure the `method` is "smelly code", then  refactor it with the committer.
+  * The mock framework in dubbo is: [mockito](http://site.mockito.org/). Some tutorials:[mockito tutorial](http://www.baeldung.com/bdd-mockito),[mockito refcard](https://dzone.com/refcardz/mockito)
+  * TDD(optional):When you start a new issue, you can try to write test case at first 
+### 3.The specified value of the test coverage
+  * In the stage, the test coverage specified value of delta changed codes is :>=60%. The higher, the better.
+  * We can see the coverage report in this page: https://codecov.io/gh/apache/incubator-dubbo
\ No newline at end of file
diff --git a/docs/en-us/developers/user-guide/faq_dev.md b/docs/en-us/developers/user-guide/faq_dev.md
new file mode 100644
index 00000000..22b76258
--- /dev/null
+++ b/docs/en-us/developers/user-guide/faq_dev.md
@@ -0,0 +1,27 @@
+# FAQ
+
+### Where is dubbo-admin?
+
+dubbo-admin has been moved from core repository to https://github.com/apache/incubator-dubbo-ops since 2.6.1
+
+### Which version should I choose?
+
+Currently, dubbo keeps 3 versions evolve in parallel:
+
+* 2.7.x (master): requires Java 1.8, major feature branch.
+
+* 2.6.x: requires Java 1.6, minor feature & bugfix branch, GA, production ready.
+
+* 2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.
+
+check [this](https://github.com/apache/incubator-dubbo/issues/1208) for detailed version management plan.
+
+For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.
+
+For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.
+
+####  How to register ip correctly in docker?  
+
+[Example question](https://github.com/alibaba/dubbo/issues/742)  
+
+Dubbo supports specifying ip/port via system environment variables, examples can be found [here](https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker).
\ No newline at end of file
diff --git a/docs/zh-cn/developers/committer-guide/label-an-issue-guide_dev.md b/docs/zh-cn/developers/committer-guide/label-an-issue-guide_dev.md
new file mode 100644
index 00000000..9f62f736
--- /dev/null
+++ b/docs/zh-cn/developers/committer-guide/label-an-issue-guide_dev.md
@@ -0,0 +1 @@
+# 给问题打标签
\ No newline at end of file
diff --git a/docs/zh-cn/developers/committer-guide/new-committer-guide_dev.md b/docs/zh-cn/developers/committer-guide/new-committer-guide_dev.md
new file mode 100644
index 00000000..6fdb27a1
--- /dev/null
+++ b/docs/zh-cn/developers/committer-guide/new-committer-guide_dev.md
@@ -0,0 +1,64 @@
+# Apache提交者注册流程
+
+## 一、apache提交者的产生
+### 项目孵化初始化提交者
+   项目孵化阶段,在孵化项目提案中,会有初始化提交者列表这一选项。确认你是初始化提交者的一员。项目在apache孵化器社区投票通过后,提交者可以开始准备注册账户了。可以参看[孵化器wiki](https://wiki.apache.org/incubator/)
+### 活跃的贡献者被选举为提交者
+   在后期的开发过程中,活跃的贡献者可以被选举为提交者。见[如何成为committer](https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer)
+
+## 二、个人开发者提交ICLA
+
+### 1、选apache id
+   在[apache提交者列表页](http://people.apache.org/committer-index.html)查看可用的apache id,
+### 2、个人提交者授权协议(ICLA):
+   下载[ICLA模板](https://www.apache.org/licenses/icla.pdf),查找可用的id。将icla.pdf个人信息填写正确后打印,签名、扫描、并当做附件发送邮件给秘书 secretary@apache.org,秘书会帮忙创建apache 用户id。同时会创建一个your id@apache.org的邮箱,可以在[apache提交者列表页](http://people.apache.org/committer-index.html)查看查找用户是否已经创建。
+### 3、导师帮助提交用户id创建请求
+   导师将帮助提交apache账户创建请求给root邮件组,会有人帮助建立id。一般需要2天时间账户会建立,请等待并在[apache提交者列表页](http://people.apache.org/committer-index.html)查看查找用户是否已经创建。
+
+## 三、加入apache开发者组
+   * 1、登入[Apache账户工具](https://id.apache.org/),首次登入可以选忘记密码获得初始化密码,会发送到forward邮箱(在孵化项目提案中提交的开发者邮件)
+   * 2、关于apache邮箱:apache.org邮箱并没有自己的邮件内容存储服务器。他是需要借用其他邮件提供商的邮件内容存储、分发功能。在很多投票环节是建议用apache邮箱的。
+    这就就有一个问题,怎么在其他邮箱里面配置好apache.org邮箱转发功能:
+    1)收件箱:收取发送到apache.org的邮件。这个在第一步配置好Apache账户工具的forward邮箱就可以用forward邮箱收取邮件了
+    2)发件箱:将发出的邮件显示发件邮箱为apache.org邮箱。请参考:[设置apache邮箱指南](https://reference.apache.org/committer/email)和[gmail邮箱设置方式](http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html)。 其他邮箱服务的设置方式不方便找到,gmail的最方便,建议换成gmail邮箱(不是广告)。
+   * 3、修改编辑页面的homepage url,[apache提交者列表页](http://people.apache.org/committer-index.html)中你的账户能加主页链接。
+   * 4、修改编辑页面的github账户,会发有邮件邀请你加入github.com/apache-commiiters组。这时间请看[ASF工作方式](http://www.apache.org/foundation/how-it-works.html#developers)对ASF开发做一些基本了解。
+## 四、提交者获得对项目的写权限
+
+[GitBox账户链接工具](https://gitbox.apache.org/setup/)的操作
+
+### 1、Apache账户授权
+   按照提示授权对Apache账户的OAuth协议登入
+### 2、Github账户授权
+   按照提示授权对Github账户的OAuth协议登入
+### 3、在github.com设置github账户两因素授权(2FA)
+   按照[授权GitHub 2FA wiki](https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/)操作如下:
+* 1)、在手机安装 “google身份验证器” app
+* 2)、按照[授权GitHub 2FA wiki](https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/)一步一步操作。
+
+   在[两因素授权验证(2. Scan this barcode with your app.)](https://github.com/settings/two_factor_authentication/verify)界面,不建议选择用手机扫描二维码,因为有些手机会扫描不出来。
+   请打开手机 “google身份验证器” app,点“+”选择“输入提供的秘钥”: 在“账户名”input框写入github账户。在“您的秘钥”input框写入:打开的网页中"enter this text code" 链接里面的文本。在app中点击"添加" 后,将为此账户生成6位数字动态。将此6位数字写入网页中的文本框,然后点“Enable”。这样2fa就设置成功了。
+
+* 3)、退出并重新登入Github,输入用户名、密码后会多一步。动态密码的填写,用app的动态密码
+
+* 4)、约需要半个小时,会有邮件通知你已经加入了xx project-committers开发者组。你也可以自己去[apache teams](https://github.com/orgs/apache/teams) 页面查看。
+
+* 5)、2fa提交后你已经clone的项目会有权限校验问题,解决方法为下面二选一:
+  * a.申请Access Token
+   在github上 生成access token 后,指令行需要密码的地方就粘贴token。
+   参考官网[帮助链接一](https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled)和[帮助链接二](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/)
+  * b. 改用ssh
+   ssh-keygen 然后把pub文件中的内容粘贴到github上
+  
+* 注意:一定要保证github的2fa为"enable"状态。当你将2fa设置为"off"时候,将会被对应的apache committer写权限组除名,直到你再次设置成功为止。
+  
+## 五、其他
+   ### The apache way
+   参看[wiki](http://apache.org/foundation/governance/)
+
+   社区重于代码
+   如果没有在社区(邮件列表)讨论过,就当没有发生过
+   ### 小福利
+   Jetbrains给apache提交者一个小福利,就是可以免费使用idea的全产品系列。具体注册地址为:https://www.jetbrains.com/shop/eform/apache?product=ALL
+   ### 相关 wiki
+https://www.apache.org/dev/new-committers-guide.html
\ No newline at end of file
diff --git a/docs/zh-cn/developers/committer-guide/website-guide_dev.md b/docs/zh-cn/developers/committer-guide/website-guide_dev.md
new file mode 100644
index 00000000..77695ece
--- /dev/null
+++ b/docs/zh-cn/developers/committer-guide/website-guide_dev.md
@@ -0,0 +1 @@
+# 网站向导
\ No newline at end of file
diff --git a/docs/zh-cn/developers/contributor-guide/cla-signing-guide_dev.md b/docs/zh-cn/developers/contributor-guide/cla-signing-guide_dev.md
new file mode 100644
index 00000000..e7d224ba
--- /dev/null
+++ b/docs/zh-cn/developers/contributor-guide/cla-signing-guide_dev.md
@@ -0,0 +1 @@
+# CLA签署向导
diff --git a/docs/zh-cn/developers/contributor-guide/dubbo-extension-guide_dev.md b/docs/zh-cn/developers/contributor-guide/dubbo-extension-guide_dev.md
new file mode 100644
index 00000000..da065682
--- /dev/null
+++ b/docs/zh-cn/developers/contributor-guide/dubbo-extension-guide_dev.md
@@ -0,0 +1 @@
+# Dubbo Extension向导
\ No newline at end of file
diff --git a/docs/zh-cn/developers/contributor-guide/mailing-list-subscription-guide_dev.md b/docs/zh-cn/developers/contributor-guide/mailing-list-subscription-guide_dev.md
new file mode 100644
index 00000000..ff448865
--- /dev/null
+++ b/docs/zh-cn/developers/contributor-guide/mailing-list-subscription-guide_dev.md
@@ -0,0 +1 @@
+# 邮件列表订阅向导
\ No newline at end of file
diff --git a/docs/zh-cn/developers/contributor-guide/new-contributor-guide_dev.md b/docs/zh-cn/developers/contributor-guide/new-contributor-guide_dev.md
new file mode 100644
index 00000000..e81c2825
--- /dev/null
+++ b/docs/zh-cn/developers/contributor-guide/new-contributor-guide_dev.md
@@ -0,0 +1 @@
+# 新贡献者向导
diff --git a/docs/zh-cn/developers/contributor-guide/software-donation-guide_dev.md b/docs/zh-cn/developers/contributor-guide/software-donation-guide_dev.md
new file mode 100644
index 00000000..045e8ffe
--- /dev/null
+++ b/docs/zh-cn/developers/contributor-guide/software-donation-guide_dev.md
@@ -0,0 +1 @@
+# 软件捐献向导
\ No newline at end of file
diff --git a/docs/zh-cn/developers/contributor-guide/test-coverage-guide_dev.md b/docs/zh-cn/developers/contributor-guide/test-coverage-guide_dev.md
new file mode 100644
index 00000000..cd21174c
--- /dev/null
+++ b/docs/zh-cn/developers/contributor-guide/test-coverage-guide_dev.md
@@ -0,0 +1,16 @@
+# 测试覆盖率向导
+
+### 1.写单元测试的收益 
+  * 单元测试能帮助每个人深入代码细节,了解代码的功能。
+  * 通过测试用例我们能发现bug,并提交代码的健壮性。
+  * 测试用例同时也是代码的demo用法。
+### 2.单元测试用例的一些设计原则 
+  * 应该精心设计好步骤,颗粒度和组合条件。
+  * 注意边界条件。
+  * 单元测试也应该好好设计,不要写无用的代码。
+  * 当你发现一个`方法`很难写单元测试时,如果可以确认这个`方法`是`臭代码`,那么就和开发者一起重构它。
+  * Dubbo中用的mock框架是: [mockito](http://site.mockito.org/). 下面是一些开发向导:[mockito tutorial](http://www.baeldung.com/bdd-mockito),[mockito refcard](https://dzone.com/refcardz/mockito)
+  * TDD(optional):When you start a new issue, you can try to write test case at first 
+### 3.测试覆盖率设定值
+  * 在现阶段,Delta更改代码的测试覆盖设定值为:>=60%,越高越好。
+  * 我们可以在这个页面中看到测试报告: https://codecov.io/gh/apache/incubator-dubbo
\ No newline at end of file
diff --git a/docs/zh-cn/developers/user-guide/faq_dev.md b/docs/zh-cn/developers/user-guide/faq_dev.md
new file mode 100644
index 00000000..32cce907
--- /dev/null
+++ b/docs/zh-cn/developers/user-guide/faq_dev.md
@@ -0,0 +1 @@
+# FAQ
\ No newline at end of file
diff --git a/en-us/blog/apachecon-na-2018.json b/en-us/blog/apachecon-na-2018.json
index af5101e3..0b190d69 100644
--- a/en-us/blog/apachecon-na-2018.json
+++ b/en-us/blog/apachecon-na-2018.json
@@ -1,4 +1,6 @@
 {
   "filename": "apachecon-na-2018.md",
-  "__html": "<h2>The ApacheCon NA schedule has been announced</h2>\n<p>Ian Luo(PPMC) and Jun Liu(PPMC) will talk about &quot;Introducing Apache Dubbo(Incubating): What is Dubbo and How it Works&quot; at ApacheCon NA this year in Montréal! Please check out the schedule <a href=\"https://apachecon.dukecon.org/acna/2018/#/scheduledEvent/b8db9dc580d85853f\">here</a> and register <a href=\"https://www.eventbrite.com/e/apachecon-north-america-2018-registration-43200327342\">here</a>.</p>\n"
+  "__html": "<h2>The ApacheCon NA schedule has been announced</h2>\n<p>Ian Luo(PPMC) and Jun Liu(PPMC) will talk about &quot;Introducing Apache Dubbo(Incubating): What is Dubbo and How it Works&quot; at ApacheCon NA this year in Montréal! Please check out the schedule <a href=\"https://apachecon.dukecon.org/acna/2018/#/scheduledEvent/b8db9dc580d85853f\">here</a> and register <a href=\"https://www.eventbrite.com/e/apachecon-north-america-2018-registration-43200327342\">here</a>.</p>\n",
+  "link": "/en-us/blog/apachecon-na-2018.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/blog/download.json b/en-us/blog/download.json
index e8c29441..6c9f8025 100644
--- a/en-us/blog/download.json
+++ b/en-us/blog/download.json
@@ -1,4 +1,6 @@
 {
   "filename": "download.md",
-  "__html": "<h1>Downloads</h1>\n<h2><a href=\"https://github.com/apache/incubator-dubbo\">Dubbo-RPC</a></h2>\n<blockquote>\n<p>Release Notes: <a href=\"https://github.com/apache/incubator-dubbo/releases\">https://github.com/apache/incubator-dubbo/releases</a></p>\n</blockquote>\n<h3>2.6.4 (latest version)</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.3</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.2</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project\">Dubbo Spring Boot Starter</a></h2>\n<h3>0.2.0</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-ops\">Dubbo Admin</a></h2>\n<p>All new Dubbo Admin is coming.</p>\n"
+  "__html": "<h1>Downloads</h1>\n<h2><a href=\"https://github.com/apache/incubator-dubbo\">Dubbo-RPC</a></h2>\n<blockquote>\n<p>Release Notes: <a href=\"https://github.com/apache/incubator-dubbo/releases\">https://github.com/apache/incubator-dubbo/releases</a></p>\n</blockquote>\n<h3>2.6.4 (latest version)</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.3</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.2</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project\">Dubbo Spring Boot Starter</a></h2>\n<h3>0.2.0</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-ops\">Dubbo Admin</a></h2>\n<p>All new Dubbo Admin is coming.</p>\n",
+  "link": "/en-us/blog/download.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-101.json b/en-us/blog/dubbo-101.json
index 99bbcf8e..c4b281ab 100644
--- a/en-us/blog/dubbo-101.json
+++ b/en-us/blog/dubbo-101.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-101.md",
   "__html": "<h1>Your First Dubbo Demo</h1>\n<h2>Java RMI Introduction</h2>\n<p>Java RMI (Remote Method Invocation) is a mechanism that allows users to access or invocate an object and a method running on another JVM (Java Virtual Machine). RMI is an implementation of RPC (Remote Procedure Call) in java with support of OOP (Object Oriented Paradigms). Instead of bothering IDL (Interface Define Language), users can build distributed applications by depending on interfaces in an easy and natural way.</p>\n<h3>Java RMI Work Flow</h3>\n<p>Here is how a typical RMI invocation usually works:</p>\n<ol>\n<li>The server registers service from RMI and binds its address.</li>\n<li>The client registers service from RMI and obtains target address.</li>\n<li>The client invokes methods of local stub object in the same way of invoking other local objects.</li>\n<li>Local stub object zips invoking information and send it to the server via network.</li>\n<li>The Skeleton object of server receives the network request and unzips the information.</li>\n<li>Server runs invocation on the target object based on the information and return the zipped results back to client via network.</li>\n</ol>\n<p><img src=\"../../img/blog/rmi-flow.png\" alt=\"RMI Flow\"></p>\n<p>(source:<a href=\"https://www.cs.rutgers.edu/~pxk/417/notes/images/rpc-rmi_flow.png\">https://www.cs.rutgers.edu/~pxk/417/notes/images/rpc-rmi_flow.png</a>)</p>\n<h3>Java RMI Concepts</h3>\n<p>Java RMI is a technique foundation stone of creating distributed applications in Java. The following EJB techniques and current framework of distributed services still inherit the fundamental concepts of Java RMI. In RMI invocation, there are some core concepts:</p>\n<ol>\n<li>The invocation is run remotely on <strong>interface</strong>.</li>\n<li>\n<ol start=\"2\">\n<li>Disguise remote invocation as local invocation by <strong>Stub object</strong> on client and <strong>Skeleton object</strong> on server.</li>\n</ol>\n</li>\n<li>The service is registered and looked up by <strong>RMI</strong> registry service.</li>\n</ol>\n<p>For 1. users are dependent on interfaces which should be implemented by server.</p>\n<p>For 2. In J2SE 1.5 version and before, it needs to pre-compile Stub on client and Skeleton on server by rmic. In the later versions there is no need to do so.</p>\n<p>The following is a code example of registry and look-up in RMI.</p>\n<h4>Server service registry</h4>\n<pre><code class=\"language-java\">Hello obj = <span class=\"hljs-keyword\">new</span> HelloImpl(); <span class=\"hljs-comment\">// #1</span>\nHello stub = (Hello) UnicastRemoteObject.exportObject(obj, <span class=\"hljs-number\">0</span>); <span class=\"hljs-comment\">// #2</span>\nRegistry registry = LocateRegistry.createRegistry(<span class=\"hljs-number\">1099</span>); <span class=\"hljs-comment\">// #3</span>\nregistry.rebind(<span class=\"hljs-string\">\"Hello\"</span>, stub); <span class=\"hljs-comment\">// #4</span>\n</code></pre>\n<p>Notes:</p>\n<ol>\n<li>\n<p>Initiate service object instance.</p>\n</li>\n<li>\n<p>Create stub object to communicate with the server by UnicastRemoteObject.exportObject.</p>\n</li>\n<li>\n<p>Create a local RMI registry service on port 1099 which is run on server. It can also be registered as an independent process.</p>\n</li>\n<li>\n<p>Bind stub object into registry so the client can find the remote object by looking up Hello.</p>\n</li>\n</ol>\n<h4>Client service look-up</h4>\n<pre><code class=\"language-java\">Registry registry = LocateRegistry.getRegistry(); <span class=\"hljs-comment\">// #1</span>\nHello stub = (Hello) registry.lookup(<span class=\"hljs-string\">\"Hello\"</span>); <span class=\"hljs-comment\">// #2</span>\nString response = stub.sayHello(); <span class=\"hljs-comment\">// #3</span>\n</code></pre>\n<p>Notes:</p>\n<ol>\n<li>Acquire registry service instances. In this case, there is no input parameters so it is assumed that the acquired instance is located on port 1099.</li>\n<li>Look up the remote object named Hello in registry service.</li>\n<li>Run a RMI invocation via acquired Stub object and get results.\nUnderstand the work flow and basic concepts of RMI is helpful to handle current framework of distributed service. It is recommended to refer to RMI official documents for further information[^1].</li>\n</ol>\n<h2>Basic Concepts of Dubbo</h2>\n<p>The basic concepts of current framework of distributed service is similar to the one of RMI. They both use Java interface as service contract, register and look up by registry center and use agency to block the details of remote communications. Specifically, Dubbo has following four types of roles to play when running:</p>\n<ol>\n<li>Serve the provider – Expose service at assigned ports at initialization and register the service address and ports at registry center</li>\n<li>Serve the consumer – Subscribe the service of interests at registry center at initialization to acquire the list of addresses provided by the service provider.</li>\n<li>Registry center – Register and look up service. Store the address provided by the service provider and send it to the consumer.</li>\n<li>Monitor center – Collect and monitor running status of providers and consumers, e.g., times of invocations, delay of invocations, etc.</li>\n<li>Running container – Initialize and load the provider and manage the lifecycle of running.</li>\n</ol>\n<p><img src=\"../../img/blog/dubbo-architecture.png\" alt=\"dubbo-architecture\"></p>\n<p><strong>Deploy stage</strong></p>\n<ul>\n<li>Service providers expose service at assigned ports and register information of service at registry center.</li>\n<li>Service consumers subscribe the list of service addresses from registry center.</li>\n</ul>\n<p><strong>Run stage</strong></p>\n<ul>\n<li>Registry center sends the address to service consumers.</li>\n<li>After receiving the list of addresses, service consumers select one of them and invoke an object service.</li>\n<li>During invocation, the running status of service providers and consumers is reported to the monitor center.</li>\n</ul>\n<h2>Dubbo Applications Based on API</h2>\n<p>The applications of Dubbo are usually assembled by Spring. To obtain an available Dubbo application quickly, the example shown here abandons complex configurations but to create service provider and consumer in Dubbo API oriented way. Additionally, the registry center and monitor center do not need installation or configuration in this example.</p>\n<p>In production environment, the service of Dubbo usually requires cooperation with a distributed service registry center, such as ZooKeeper. For convenience, Dubbo offers two ways to avoid extra work of building registry center, namely direct connection [2] and assembled podcast [3] respectively. In this example, the latter way is applied to register and look up service.</p>\n<h3>Define Service Contract</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\">GreetingsService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHi</span><span class=\"hljs-params\">(String name)</span></span>; <span class=\"hljs-comment\">// #1</span>\n}\n</code></pre>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>The codes define a simple service contract where there is only one function, sayHi, can be invoked. The type of input parameter and return value are both String.</li>\n</ol>\n<h3>Provide Contract Implementation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingsServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingsService</span> </span>{ <span class=\"hljs-comment\">// #1</span>\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHi</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hi, \"</span> + name; <span class=\"hljs-comment\">// #2</span>\n    }\n}\n</code></pre>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>Service providers need to implement the interface of service contract, GreetingsService.</li>\n<li>This function simply returns a welcome message. For example, if the input value is <em>dubbo</em>,it will return <em>hi, dubbo</em>.</li>\n</ol>\n<h3>Implement Dubbo Service Provider</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        ServiceConfig&lt;GreetingsService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;&gt;(); <span class=\"hljs-comment\">// #1</span>\n        service.setApplication(<span class=\"hljs-keyword\">new</span> ApplicationConfig(<span class=\"hljs-string\">\"first-dubbo-provider\"</span>)); <span class=\"hljs-comment\">// #2</span>\n        service.setRegistry(<span class=\"hljs-keyword\">new</span> RegistryConfig(<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>)); <span class=\"hljs-comment\">// #3</span>\n        service.setInterface(GreetingsService.class); <span class=\"hljs-comment\">// #4</span>\n        service.setRef(<span class=\"hljs-keyword\">new</span> GreetingsServiceImpl()); <span class=\"hljs-comment\">// #5</span>\n        service.export(); <span class=\"hljs-comment\">// #6</span>\n        System.in.read(); <span class=\"hljs-comment\">// #7</span>\n    }\n}\n</code></pre>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>Create an instance <em>ServiceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li>\n<li>Generate an instance of <em>ApplicationConfig</em> and assemble it into <em>ServiceConfig</em>.</li>\n<li>Generate an instance <em>RegistryConfig</em> and assemble it into <em>ServiceConfig</em>. Since the assembled way is applied here, the parameter should be <code>multicast://224.5.6.7:1234</code>. The valid range of assembled address is <em>224.0.0.0 - 239.255.255.255</em></li>\n<li>Assemble the service contract <em>GreetingsService</em> into <em>ServiceConfig</em>.</li>\n<li>Assemble the instance with implementation of <em>GreetingsServicelmpl</em> provided by service providers into <em>ServiceConfig</em>.</li>\n<li><em>ServiceConfig</em> starts to expose itself at default ports <em>20880</em>. after being equipped with enough information.</li>\n<li>Press any key or <em>ctrl-C</em> to exit to avoid server halt.</li>\n</ol>\n<h3>Implement Dubbo Service Consumer</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        ReferenceConfig&lt;GreetingsService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;&gt;(); <span class=\"hljs-comment\">// #1</span>\n        reference.setApplication(<span class=\"hljs-keyword\">new</span> ApplicationConfig(<span class=\"hljs-string\">\"first-dubbo-client\"</span>)); <span class=\"hljs-comment\">// #2</span>\n        reference.setRegistry(<span class=\"hljs-keyword\">new</span> RegistryConfig(<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>)); <span class=\"hljs-comment\">// #3</span>\n        reference.setInterface(GreetingsService.class); <span class=\"hljs-comment\">// #4</span>\n        GreetingsService greetingsService = reference.get(); <span class=\"hljs-comment\">// #5</span>\n        String message = greetingsService.sayHi(<span class=\"hljs-string\">\"dubbo\"</span>); <span class=\"hljs-comment\">// #6</span>\n        System.out.println(message); <span class=\"hljs-comment\">// #7</span>\n    }\n}\n</code></pre>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>Create an instance of <em>ReferenceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li>\n<li>Create an instance of <em>AplicatonConfig</em>, and assemble it into <em>ReferenceConfig</em>.</li>\n<li>Generate an instance <em>RegistryConfig</em>, and assemble it into <em>ReferenceConfig</em>. Note that the address information here should be the same as the one of the service provider.</li>\n<li>Assemble the service contract <em>GreetingsService</em> into <em>ReferenceConfig</em>.</li>\n<li>Obtain the agency of <em>GreetingsService</em> from <em>ReferenceConfig</em>.</li>\n<li>Invoke a remote call through <em>GreetingsSerive</em>’s agency and pass in <code>dubbo</code> as input parameter.</li>\n<li>Return and print results <code>hi, dubbo</code>.</li>\n</ol>\n<h3>Run</h3>\n<p>The complete example can be found at <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-api\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-api</a>. In the complete version, it is convenient to execute by maven in command line with the configuration of <em>exec-maven-plugin</em>. Of course, it can also be executed directly in IDE. However, there is one noteworthy thing that because of using assembled way to look up service, it needs to assign <em>-Djava.net.preferIPv4Stack=true</em> when running.</p>\n<h4>Build Example</h4>\n<p>Synchronize the example codes and build by the following command lines:</p>\n<ol>\n<li>Synchronize the example codes: git clone <a href=\"https://github.com/dubbo/dubbo-samples.git\">https://github.com/dubbo/dubbo-samples.git</a></li>\n<li>Build:mvn clean package</li>\n</ol>\n<pre><code class=\"language-bash\">$ git <span class=\"hljs-built_in\">clone</span> https://github.com/dubbo/dubbo-samples.git\n$ <span class=\"hljs-built_in\">cd</span> dubbo-samples/dubbo-samples-api/\n$ mvn clean package\nINFO] Scanning <span class=\"hljs-keyword\">for</span> projects...\n[INFO]\n[INFO] ------------------------------------------------------------------------\n[INFO] Building dubbo-samples-api 1.0-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO]\n[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ dubbo-samples-api ---\n...\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time: 2.182 s\n[INFO] Finished at: 2018-05-28T14:56:08+08:00\n[INFO] Final Memory: 20M/353M\n[INFO] ------------------------------------------------------------------------\n</code></pre>\n<p>The build is finished when it shows <code>BUILD SUCCESS</code>. Then comes the running stage.</p>\n<h4>Run the server</h4>\n<p>Run the service provider by the following maven command lines:</p>\n<pre><code class=\"language-bash\">$ mvn -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> -Dexec.mainClass=com.alibaba.dubbo.samples.server.Application <span class=\"hljs-built_in\">exec</span>:java\n[INFO] Scanning <span class=\"hljs-keyword\">for</span> projects...\n[INFO]                                                                         \n[INFO] ------------------------------------------------------------------------\n[INFO] Building dubbo-samples-api 1.0-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO]\n[INFO] --- <span class=\"hljs-built_in\">exec</span>-maven-plugin:1.6.0:java (default-cli) @ dubbo-samples-api ---\nlog4j:WARN No appenders could be found <span class=\"hljs-keyword\">for</span> logger (com.alibaba.dubbo.common.logger.LoggerFactory).\nlog4j:WARN Please initialize the log4j system properly.\nlog4j:WARN See http://logging.apache.org/log4j/1.2/faq.html<span class=\"hljs-comment\">#noconfig for more info.</span>\nfirst-dubbo-provider is running.\n</code></pre>\n<p>When <em>first-dubbo-provider is running</em> appears, the service provider is ready to be called by the client.</p>\n<h4>Run the client</h4>\n<p>Run the service consumer by the following maven command lines:</p>\n<pre><code class=\"language-bash\">$ mvn -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> -Dexec.mainClass=com.alibaba.dubbo.samples.client.Application <span class=\"hljs-built_in\">exec</span>:java\n[INFO] Scanning <span class=\"hljs-keyword\">for</span> projects...\n[INFO]                                                                         \n[INFO] ------------------------------------------------------------------------\n[INFO] Building dubbo-samples-api 1.0-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO]\n[INFO] --- <span class=\"hljs-built_in\">exec</span>-maven-plugin:1.6.0:java (default-cli) @ dubbo-samples-api ---\nlog4j:WARN No appenders could be found <span class=\"hljs-keyword\">for</span> logger (com.alibaba.dubbo.common.logger.LoggerFactory).\nlog4j:WARN Please initialize the log4j system properly.\nlog4j:WARN See http://logging.apache.org/log4j/1.2/faq.html<span class=\"hljs-comment\">#noconfig for more info.</span>\nhi, dubbo\n</code></pre>\n<p><code>hi, dubbo</code> is the execution results from service provider.</p>\n<h2>Quick Creation of A Dubbo Application</h2>\n<p>Dubbo also provides a public platform that can create a Dubbo application quickly based on Spring Boot. Visit  <a href=\"http://start.dubbo.io\">http://start.dubbo.io</a> and follow the figure below to create an example project:</p>\n<p><img src=\"../../img/blog/dubbo-initializr.png\" alt=\"dubbo initializr\"></p>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>Provide maven groupId in <em>Group</em> with default value <code>com.example</code>.</li>\n<li>Provide maven artifactId in <em>Artifact</em> with default value <code>demo</code>.</li>\n<li>Provide the name of service in <em>DubboServiceName</em> with default value <code>com.example.HelloService</code>.</li>\n<li>Provide the version of service in <em>DubboServiceVersion</em> with default value <code>1.0.0</code>.</li>\n<li>Choose server or client in <em>Client/Server</em> with default value <code>server</code>.</li>\n<li><em>embeddedZookeeper</em> is selected by default as service registry look up.</li>\n<li>qos ports activation is not selected by default but if it is, it can be accessed by port <em>22222</em>.</li>\n<li>Click <em>Generate Project</em> to download the generated project.</li>\n</ol>\n<p>This example shows how to generate a server. Similarly, it can generate a <em>client</em> by selecting client on the generation interface.</p>\n<h3>Run</h3>\n<p>Open the generated project with an IDE and to see the application is a typical Spring Boot application with the following program entry:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoApplication</span> </span>{\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\t<span class=\"hljs-keyword\">new</span> EmbeddedZooKeeper(<span class=\"hljs-number\">2181</span>, <span class=\"hljs-keyword\">false</span>).start();  <span class=\"hljs-comment\">// #1</span>\n\t\tSpringApplication.run(DemoApplication.class, args); <span class=\"hljs-comment\">// #2</span>\n\t}\n}\n</code></pre>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>Launch embedded <em>ZooKeeper</em> on port <em>2181</em>.</li>\n<li>Launch the context of <em>Spring Boot</em>.</li>\n</ol>\n<p>Run it directly in IDE and here are the results:</p>\n<pre><code class=\"language-bash\">2018-05-28 16:59:38.072  INFO 59943 --- [           main] a.b.d.c.e.WelcomeLogoApplicationListener :\n\n  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  \n  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███\n  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███\n  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███\n  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███\n  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  \n\n\n :: Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project\n :: Dubbo (v2.0.1) : https://github.com/alibaba/dubbo\n :: Google group : http://groups.google.com/group/dubbo\n\n2018-05-28 16:59:38.079  INFO 59943 --- [           main] e.OverrideDubboConfigApplicationListener : Dubbo Config was overridden by externalized configuration {dubbo.application.name=dubbo-demo-server, dubbo.application.qosAcceptForeignIp=<span class=\"hljs-literal\">false</span>, dubbo.application.qosEnable=<span class=\"hljs-literal\">true</span>, dubbo.application.qosPort=22222, dubbo.registry.address=zookeeper://localhost:2181?client=curator, dubbo.registry.id=my-registry, dubbo.scan.basePackages=com.example} <span class=\"hljs-comment\">#1</span>\n\n...\n\n2018-05-28 16:59:39.624  INFO 59943 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication <span class=\"hljs-keyword\">in</span> 1.746 seconds (JVM running <span class=\"hljs-keyword\">for</span> 2.963)\n</code></pre>\n<p><strong>Notes</strong>:</p>\n<ol>\n<li>In the printouts, the configuration starting with <code>dubbo.</code> Is defined in <em>main/resources/application.properties</em>.</li>\n</ol>\n<h3>Manage service by Telnet</h3>\n<p>If <em>qos</em> is actived during generation, the service can be watched and managed by <em>telnet</em> or <em>nc</em>.</p>\n<pre><code class=\"language-bash\">$ telnet localhost 22222\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is <span class=\"hljs-string\">'^]'</span>.\n  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  \n  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███\n  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███\n  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███\n  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███\n  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  \n\n\ndubbo&gt;\ndubbo&gt;ls\nAs Provider side:\n+------------------------------+---+\n|     Provider Service Name    |PUB|\n+------------------------------+---+\n|com.example.HelloService:1.0.0| Y |\n+------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>Currently, <em>qos</em> supports following command lines. For more information please refer to the official document. [^4]:</p>\n<ul>\n<li><em>ls</em>:List the information of client and server.</li>\n<li><em>online</em>:Bring the service online.</li>\n<li><em>offline</em>:Bring the service offline.</li>\n<li><em>help</em>:View online help.</li>\n</ul>\n<h2>Summary</h2>\n<p>In this tutorial, we start with RMI and introduce the basic concepts in Java distributed invocations. Based on interface programming, it disguises remote calls as local by agency and run the service registry and looking up by registry center.</p>\n<p>Then for simplicity, we introduce how to develop a complete Dubbo demo in an easy way of assembled registry and direct Dubbo API oriented programming. Additionally, we look into the usage of <em>ServiceConfig</em> and <em>RefenceConfig</em>, which is of great help for further using Spring XML configuration and the programming pattern of Spring Boot.</p>\n<p>Eventually, we give an outline of how to create a Dubbo application quickly based on Spring Boot using the public resources, <a href=\"http://start.dubbo.io\">start.dubbo.io</a>, provided by the Dubbo development team and operate and maintain the Dubbo service by <em>qos</em>.</p>\n<hr>\n<ol>\n<li><a href=\"https://docs.oracle.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html\">Getting Started Using JavaTM RMI</a></li>\n<li><a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/explicit-target.html\">直连提供者</a></li>\n<li><a href=\"http://dubbo.apache.org/books/dubbo-user-book/references/registry/multicast.html\">Multicast 注册中心</a></li>\n<li><a href=\"http://dubbo.apache.org/books/dubbo-user-book/references/qos.html\">在线运维命令</a></li>\n</ol>\n",
-  "title": "Your First Dubbo Demo",
-  "keywords": "Dubbo, RPC, RMI",
-  "description": "Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy."
+  "link": "/en-us/blog/dubbo-101.html",
+  "meta": {
+    "title": "Your First Dubbo Demo",
+    "keywords": "Dubbo, RPC, RMI",
+    "description": "Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-annotation.json b/en-us/blog/dubbo-annotation.json
index 832d9c39..ce139f77 100644
--- a/en-us/blog/dubbo-annotation.json
+++ b/en-us/blog/dubbo-annotation.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-annotation.md",
   "__html": "<h1>Use Annotations In Dubbo</h1>\n<p>With the widely promotion and implementation of Microservices Architecture, the Microservices Architecture represented by Spring Boot and Spring Cloud, in Java ecosystem, introduced some brand new programming model, like:</p>\n<ul>\n<li>Annotation-Driven</li>\n<li>External Configuration</li>\n<li>Auto-Configure</li>\n</ul>\n<p>New programming model have some advantages, for example, it does not require <code>XML</code> configuration, it can simplify deployment process, beyond that,it can promote development efficiency. In order to implement the microservice architecture better,Dubbo has provided more perfect support for the above three scenarios since version 2.5.8. This article focuses on introduce annotations rather than discuss the traditional XML configuration approach. There are two kinds of automatic assembly, external configuration and automatic assembly, will be introduced in another aricle.</p>\n<h2>Introduce Annotations</h2>\n<h3>@EnableDubbo</h3>\n<p>The annotations of <code>@EnableDubbo</code> is a combination of both <code>@EnableDubboConfig</code> and <code>@DubboComponentScan</code>.Related to the annotation driver is  <code>@DubboComponentScan</code>.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.config.spring.context.annotation;\n\n<span class=\"hljs-meta\">@EnableDubboConfig</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-meta\">@interface</span> EnableDubbo {\n    <span class=\"hljs-comment\">/**\n     * Base packages to scan for annotated <span class=\"hljs-doctag\">@Service</span> classes.\n     * &lt;p&gt;\n     * Use {<span class=\"hljs-doctag\">@link</span> #scanBasePackageClasses()} for a type-safe alternative to String-based\n     * package names.\n     *\n     * <span class=\"hljs-doctag\">@return</span> the base packages to scan\n     * <span class=\"hljs-doctag\">@see</span> DubboComponentScan#basePackages()\n     */</span>\n    <span class=\"hljs-meta\">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class=\"hljs-string\">\"basePackages\"</span>)\n    String[] scanBasePackages() <span class=\"hljs-keyword\">default</span> {};\n\n    <span class=\"hljs-comment\">/**\n     * Type-safe alternative to {<span class=\"hljs-doctag\">@link</span> #scanBasePackages()} for specifying the packages to\n     * scan for annotated <span class=\"hljs-doctag\">@Service</span> classes. The package of each class specified will be\n     * scanned.\n     *\n     * <span class=\"hljs-doctag\">@return</span> classes from the base packages to scan\n     * <span class=\"hljs-doctag\">@see</span> DubboComponentScan#basePackageClasses\n     */</span>\n    <span class=\"hljs-meta\">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class=\"hljs-string\">\"basePackageClasses\"</span>)\n    Class&lt;?&gt;[] scanBasePackageClasses() <span class=\"hljs-keyword\">default</span> {};    \n}\n</code></pre>\n<p>The <code>@bableDubbo</code> can be used to scan Dubbo's service provider (marked by <code>@Service</code>) and Dubbo's service consumer (marked by <code>Reference</code>) under the specified package name (via <code>scanBasePackages</code>) or in the specified class (via <code>scanBasePackageClasses</code>). After Dubbo's service providers and consumers have been scanned,  they have been assembled corresponding and been initialized, and finally the service is exposed or referenced, if you do not use <code>External Configuration</code>, you can use <code>@DubboComponentScan</code> directly.</p>\n<h3>@Service</h3>\n<p><code>@service</code> is used to configure Dubbo's Service provider,for example:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotatedGreetingService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + name;\n    }\n}\n</code></pre>\n<p>Via <code>@Service</code>'s properties, you can customize Dubbo's Service provider:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.config.annotation;\n\n<span class=\"hljs-meta\">@Documented</span>\n<span class=\"hljs-meta\">@Retention</span>(RetentionPolicy.RUNTIME)\n<span class=\"hljs-meta\">@Target</span>({ElementType.TYPE}) <span class=\"hljs-comment\">// #1</span>\n<span class=\"hljs-meta\">@Inherited</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-meta\">@interface</span> Service {\n    Class&lt;?&gt; interfaceClass() <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">void</span>.class; <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">interfaceName</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">version</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #4</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">group</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #5</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean</span> <span class=\"hljs-title\">export</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">true</span></span>; <span class=\"hljs-comment\">// #6</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">true</span></span>; <span class=\"hljs-comment\">// #7</span>\n    \n    <span class=\"hljs-function\">String <span class=\"hljs-title\">application</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #8</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">module</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #9</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">provider</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #10</span>\n    String[] protocol() <span class=\"hljs-keyword\">default</span> {}; <span class=\"hljs-comment\">// #11</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">monitor</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #12</span>\n    String[] registry() <span class=\"hljs-keyword\">default</span> {}; <span class=\"hljs-comment\">// #13</span>\n}\n</code></pre>\n<p>Which is more important:</p>\n<ol>\n<li><strong>@Service</strong>:        Can only be defined on a class, represent a service</li>\n<li><strong>interfaceClass</strong>: specified <code>interface</code>'s class implemented by the service provider</li>\n<li><strong>interfaceName</strong>: specified <code>interface</code>'s class name implemented by the service provider</li>\n<li><strong>version</strong>: specified the version number of the service</li>\n<li><strong>group</strong>:specified the group of services</li>\n<li><strong>export</strong>:whether to expose service</li>\n<li><strong>registry</strong>:Whether to register service to the registry</li>\n<li><strong>application</strong>:application configuration</li>\n<li><strong>module</strong>:module configuration</li>\n<li><strong>provider</strong>:service provider configuration</li>\n<li><strong>protocol</strong>:protocol configuration</li>\n<li><strong>monitor</strong>:monitoring center configuration</li>\n<li><strong>registr</strong>:registry configuration</li>\n</ol>\n<p>In addition, it should be noted that, <code>application</code>, <code>module</code>, <code>provider</code>, <code>protocol</code>, <code>monitor</code>, <code>registry</code> (from 8 to 13) need to provide the name of the corresponding <code>spring bean</code>,These bean assembly completed either through traditional XML configuration,or by the modern Java Config. This article will show you how to use <code>Java Config</code>.</p>\n<h3>@Reference</h3>\n<p><code>@Reference</code> is used to configure Dubbo's Service consumer,for example:</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Component</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceConsumer</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>\n    <span class=\"hljs-keyword\">private</span> GreetingService greetingService;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">doSayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> greetingService.sayHello(name);\n    }\n}\n</code></pre>\n<p>Via <code>@Reference</code>'s properties, you can customize Dubbo's Service consumer:</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.config.annotation;\n\n<span class=\"hljs-meta\">@Documented</span>\n<span class=\"hljs-meta\">@Retention</span>(RetentionPolicy.RUNTIME)\n<span class=\"hljs-meta\">@Target</span>({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) <span class=\"hljs-comment\">// #1</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-meta\">@interface</span> Reference {\n    Class&lt;?&gt; interfaceClass() <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">void</span>.class; <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">interfaceName</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">version</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #4</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">group</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #5</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">url</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #6</span>\n    \n    <span class=\"hljs-function\">String <span class=\"hljs-title\">application</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #7</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">module</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #8</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">consumer</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #9</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">protocol</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #10</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">monitor</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #11</span>\n    String[] registry() <span class=\"hljs-keyword\">default</span> {}; <span class=\"hljs-comment\">// #12</span>\n}\n</code></pre>\n<p>Which is more important:</p>\n<ol>\n<li><strong>@Reference</strong>:you can define it on a field in a class, you can define it on a method, you can even modify another annotation, it represent a reference to a service.Normally <code>@Reference</code> is defined in one field</li>\n<li><strong>interfaceClass</strong> : specified <code>interface</code>'s class implemented by the service provider</li>\n<li><strong>interfaceName</strong>: specified <code>interface</code>'s class name implemented by the service provider</li>\n<li><strong>version</strong>: specified the version number of the service</li>\n<li><strong>group</strong>:pecified the group of services</li>\n<li><strong>url</strong>: invoking the registry directly by specifying the URL of the service provider</li>\n<li><strong>application</strong>:application configuration</li>\n<li><strong>module</strong>:module configuration</li>\n<li><strong>consumer</strong>:service consumer configuration</li>\n<li><strong>protocol</strong>:protocol configuration</li>\n<li><strong>monitor</strong>:monitoring center configuration</li>\n<li><strong>registr</strong>:registry configuration</li>\n</ol>\n<p>In addition, it should be noted that, <code>application</code>, <code>module</code>, <code>consumer</code>, <code>protocol</code>, <code>monitor</code>, <code>registry</code> (from 7 to 12) need to provide the name of the corresponding <code>spring bean</code>,These bean assembly completed either through traditional XML configuration,or by the modern Java Config. This article will show you how to use <code>Java Config</code>.</p>\n<h2>Example practice</h2>\n<p>After learn what <code>@EnableDubbo</code>, <code>@Service</code>, <code>@Reference</code> is, there is a practical example showing how to use the annotation to develop a Dubbo application.The following code can be found at <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-annotation\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-annotation</a></p>\n<h3>1.Interface Definition</h3>\n<p>Define a simple <code>GreetingService</code> interface with only a simple method <code>sayHello</code> to the caller.</p>\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\">GreetingService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h3>2.Server:Service Implementation</h3>\n<p>Implement the <code>GreetingService</code> interface, and mark it as a service for Dubbo via @Service.</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotatedGreetingService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + name;\n    }\n}\n</code></pre>\n<h3>3.Server:Assembly Service Provider</h3>\n<p>You can discover, assemble, and provide Dubbo's services through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.impl\"</span>)\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderConfiguration</span> </span>{\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #1</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProviderConfig <span class=\"hljs-title\">providerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ProviderConfig providerConfig = <span class=\"hljs-keyword\">new</span> ProviderConfig();\n        providerConfig.setTimeout(<span class=\"hljs-number\">1000</span>);\n        <span class=\"hljs-keyword\">return</span> providerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"dubbo-annotation-provider\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setProtocol(<span class=\"hljs-string\">\"zookeeper\"</span>);\n        registryConfig.setAddress(<span class=\"hljs-string\">\"localhost\"</span>);\n        registryConfig.setPort(<span class=\"hljs-number\">2181</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #4</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProtocolConfig <span class=\"hljs-title\">protocolConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ProtocolConfig protocolConfig = <span class=\"hljs-keyword\">new</span> ProtocolConfig();\n        protocolConfig.setName(<span class=\"hljs-string\">\"dubbo\"</span>);\n        protocolConfig.setPort(<span class=\"hljs-number\">20880</span>);\n        <span class=\"hljs-keyword\">return</span> protocolConfig;\n    }\n}\n</code></pre>\n<p>Description:</p>\n<ul>\n<li>Scan all classes marked with <code>@Service</code> under <code>com.alibaba.dubbo.samples.impl</code> with <code>@EnableDubbo</code></li>\n<li>Via @Configuration, all @Beans in the ProviderConfiguration are assembled using the way of <code>Java Config</code> and then injected into the Dubbo service, which means the class marked with <code>@Service</code>.Which included:\ni. <strong>ProviderConfig</strong>:Service provider configuration\nii. <strong>ApplicationConfig</strong>:Application configuration\niii.<strong>RegistryConfig</strong>:registry configuration\niv. <strong>ProtocolConfig</strong>:Protocol configuration</li>\n</ul>\n<h3>4.Server:Start Service</h3>\n<p>In the <code>main</code> method to provide external <code>Dubbo</code> service by starting a <code>Spring Context</code>.</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        <span class=\"hljs-keyword\">new</span> EmbeddedZooKeeper(<span class=\"hljs-number\">2181</span>, <span class=\"hljs-keyword\">false</span>).start(); <span class=\"hljs-comment\">// #1</span>\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class); <span class=\"hljs-comment\">// #2</span>\n        context.start(); <span class=\"hljs-comment\">// #3</span>\n        System.in.read(); <span class=\"hljs-comment\">// #4</span>\n    }\n}\n</code></pre>\n<p>Description:</p>\n<ol>\n<li>Start an embedded <code>zookeeper</code> and provide service registry on port <code>2181</code></li>\n<li>Initialize an example of an AnnotationConfigApplicationContext and pass the <code>ProviderConfiguration</code> into the example to complete the automatic discovery and assembly of the <code>Dubbo</code> service.</li>\n<li>Start the <code>Spring Context</code> and start providing external <code>Dubbo</code> services.</li>\n<li>Because it is a server, you need to prevent the process exit by blocking the main thread.</li>\n</ol>\n<p>Start the <code>main</code> method of the server, you will see the following output, on behalf of the server startup success, and registered the <code>GreetingService</code> service in the <code>ZookeeperRegistry</code>:</p>\n<pre><code class=\"language-sh\">[01/08/18 02:12:51:051 CST] main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer <span class=\"hljs-built_in\">bind</span> /0.0.0.0:20880, <span class=\"hljs-built_in\">export</span> /192.168.99.1:20880, dubbo version: 2.6.2, current host: 192.168.99.1\n\n[01/08/18 02:12:51:051 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=<span class=\"hljs-literal\">true</span>&amp;application=dubbo-annotation-provider&amp;default.timeout=1000&amp;dubbo=2.6.2&amp;generic=<span class=\"hljs-literal\">false</span>&amp;interface=com.alibaba.dubbo.samples.api\n</code></pre>\n<h3>5.Server:Reference Service</h3>\n<p>Marking the member variable of the <code>GreetingService</code> via <code>@Reference</code> .The <code>greetingService</code> is a reference to the <code>Dubbo</code> service, which means that it can simply provide through the interface to the remote party to initiate service calls, and the client does not implement <code>GreetingService</code> interface.</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Component</span>(<span class=\"hljs-string\">\"annotatedConsumer\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceConsumer</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>\n    <span class=\"hljs-keyword\">private</span> GreetingService greetingService;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">doSayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> greetingService.sayHello(name);\n    }\n}\n</code></pre>\n<h3>6.Server:Assembly Service consumer</h3>\n<p>Just like  <strong>3. Server:Assembly Service Provider</strong> You can discover, assemble, and provide Dubbo's service consumer through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>)\n<span class=\"hljs-meta\">@ComponentScan</span>(value = {<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>})\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerConfiguration</span> </span>{\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #1</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"dubbo-annotation-consumer\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n        consumerConfig.setTimeout(<span class=\"hljs-number\">3000</span>);\n        <span class=\"hljs-keyword\">return</span> consumerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setProtocol(<span class=\"hljs-string\">\"zookeeper\"</span>);\n        registryConfig.setAddress(<span class=\"hljs-string\">\"localhost\"</span>);\n        registryConfig.setPort(<span class=\"hljs-number\">2181</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<p>Description:</p>\n<ul>\n<li>Scan all classes marked with <code>@Service</code> under <code>com.alibaba.dubbo.samples.impl</code> with <code>@Reference</code></li>\n<li>Via @Configuration, all @Beans in the ProviderConfiguration are assembled using the way of <code>Java Config</code> and then injected into the Dubbo service, which means the class marked with <code>@Reference</code>.Which included:\ni. <code>ApplicationConfig</code>: Application configuration\nii. <code>ConsumerConfig</code>:Service consumer configuration\niii.<code>RegistryConfig</code>:Registry configuration.Note:The configuration here needs to be consistent with the configuration information of the EmbeddedZooKeeper when started by the service provider.</li>\n</ul>\n<h3>7.Server: Initiate Remote Calls</h3>\n<p>In the <code>main</code> method, you can start a <code>Spring Context</code> to find the service consumer of the assembled <code>Dubbo</code> from it, and initiate a remote call.</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class); <span class=\"hljs-comment\">// #1</span>\n        context.start(); <span class=\"hljs-comment\">// #2</span>\n        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class); <span class=\"hljs-comment\">// #3</span>\n        String hello = greetingServiceConsumer.doSayHello(<span class=\"hljs-string\">\"annotation\"</span>); <span class=\"hljs-comment\">// #4</span>\n        System.out.println(<span class=\"hljs-string\">\"result: \"</span> + hello); <span class=\"hljs-comment\">// #5</span>\n    }\n}\n</code></pre>\n<p>Description:</p>\n<ul>\n<li>Initialize an example of an AnnotationConfigApplicationContext and pass the <code>ProviderConfiguration</code> into the example to complete the automatic discovery and assembly of the <code>Dubbo</code> service consumer.</li>\n<li>start <code>Spring Context</code>.</li>\n<li>Find <code>bean</code> which type is <code>GreetingServiceConsumer</code> from <code>Context</code>.</li>\n<li>Call the <code>doSayHello</code> method and finally initiate a remote call via Dubbo's service reference (marked by @Reference)</li>\n<li>Print call result\nStart the Server's <code>main</code> method, you will see the following output, which returns the <code>result</code>:  hello, annotation:</li>\n</ul>\n<pre><code class=\"language-sh\">[01/08/18 02:38:40:040 CST] main  INFO config.AbstractConfig:  [DUBBO] Refer dubbo service com.alibaba.dubbo.samples.api.GreetingService from url zookeeper://localhost:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=<span class=\"hljs-literal\">true</span>&amp;application=dubbo-annotation-consumer&amp;check=<span class=\"hljs-literal\">false</span>&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;generic=<span class=\"hljs-literal\">false</span>&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=33001&amp;register.ip=192.168.99.1&amp;remote.timestamp=1533105502086&amp;side=consumer&amp;timestamp=1533105519216, dubbo version: 2.6.2, current host: 192.168.99.1\n[01/08/18 02:38:40:040 CST] main  INFO annotation.ReferenceBeanBuilder: &lt;dubbo:reference object=<span class=\"hljs-string\">\"com.alibaba.dubbo.common.bytecode.proxy0@673be18f\"</span> singleton=<span class=\"hljs-string\">\"true\"</span> interface=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> uniqueServiceName=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> generic=<span class=\"hljs-string\">\"false\"</span> id=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> /&gt; has been built.\nresult: hello, annotation\n</code></pre>\n<h2>Conclusion</h2>\n<p>By studying this article, the reader can master the basic concepts of <code>Dubbo</code>'s exclusive <code>annotations</code> , <code>@EnableDubbo</code>, <code>@Service</code>, <code>@Reference</code>, and master it's basic usage through a simple <code>Dubbo</code> application.</p>\n<p>In addition to traditional <code>XML</code> configuration, <code>Spring</code> offers more modern configurations such as annotation drivers, externalization, and auto-assembly.This article focuses on the development of <code>Dubbo</code> applications through annotations. You can be seen that annotation mode programming is more concise and simple than XML configuration. In future, we will introduce the use of externalization configuration and automatic assembly in <code>Dubbo</code>  further.</p>\n",
-  "title": "Use Annotations In Dubbo",
-  "keywords": "Dubbo, Annotation, Spring",
-  "description": "This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`."
+  "link": "/en-us/blog/dubbo-annotation.html",
+  "meta": {
+    "title": "Use Annotations In Dubbo",
+    "keywords": "Dubbo, Annotation, Spring",
+    "description": "This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.json b/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.json
index 5f96b79a..fe756443 100644
--- a/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.json
+++ b/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-basic-usage-dubbo-provider-configuration.md",
   "__html": "<h2>Dubbo Basic Usage -- Dubbo Provider Configuration</h2>\n<h1>Dubbo Basic Usage</h1>\n<p>This chapter mainly talking about how to configure dubbo. According to the configuration mode, it can be divided into the following mode: XML Configuration, Properties Configuration, Annotation Configuration, API Invocation Mode Configuration. And according to the function, we can divide them into Dubbo Provider and Dubbo Consumer. In the following sections, we would explain Dubbo Provider and Dubbo Consumer respectively.</p>\n<h2>Dubbo Provider Configuration</h2>\n<h3>Provider Configuration in Detail</h3>\n<p>The configuration mode of Dubbo Provider has 4 different ways: XML Configuration, Properties Configuration, API Invocation Mode Configuration and Annotation Configuration.</p>\n<h4>XML Configuration</h4>\n<h6>The simplest configuration example:</h6>\n<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;\n    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;\n    xmlns:dubbo=&quot;http://dubbo.apache.org/schema/dubbo&quot;\n    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd&quot;&gt;  \n    &lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;  \n    &lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;  \n    &lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;  \n    &lt;dubbo:service interface=&quot;com.alibaba.dubbo.demo.DemoService&quot; ref=&quot;demoServiceLocal&quot; /&gt;  \n    &lt;dubbo:reference id=&quot;demoServiceRemote&quot; interface=&quot;com.alibaba.dubbo.demo.DemoService&quot; /&gt;  \n&lt;/beans&gt;\n</code></pre>\n<p>In the example above,note the way to write dubbo schema:</p>\n<pre><code>&lt;beans xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;\n       xmlns:dubbo=&quot;http://code.alibabatech.com/schema/dubbo&quot;\n       xmlns=&quot;http://www.springframework.org/schema/beans&quot;\n       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd\n       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&quot;&gt;\n</code></pre>\n<h6>Supported Configuration Tags</h6>\n<table>\n<thead>\n<tr>\n<th>Tags</th>\n<th>Application</th>\n<th style=\"text-align:left\">Describe</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>&lt;dubbo:service/&gt;</td>\n<td>Service Configuration</td>\n<td style=\"text-align:left\">Expose a service, define the meta information of the service. One service can use multiple protocols to expose and can be registered to multiple registry centers</td>\n</tr>\n<tr>\n<td>&lt;dubbo:reference/&gt;</td>\n<td>Reference Configuration</td>\n<td style=\"text-align:left\">Create a remote service agent, one reference can point to multiple registry centers</td>\n</tr>\n<tr>\n<td>&lt;dubbo:protocol/&gt;</td>\n<td>Protocol Configuration</td>\n<td style=\"text-align:left\">Configure protocol information for providing services, protocol is specified by the provider and accepted passively by the consumer</td>\n</tr>\n<tr>\n<td>&lt;dubbo:application/&gt;</td>\n<td>Application Configuration</td>\n<td style=\"text-align:left\">Configure current application information, regardless of whether the application is provider or consumer</td>\n</tr>\n<tr>\n<td>&lt;dubbo:module/&gt;</td>\n<td>Module Configuration</td>\n<td style=\"text-align:left\">Configure current module information. Optional</td>\n</tr>\n<tr>\n<td>&lt;dubbo:registry/&gt;</td>\n<td>Registry Center Configuration</td>\n<td style=\"text-align:left\">Configure information related to connect registry centers</td>\n</tr>\n<tr>\n<td>&lt;dubbo:monitor/&gt;</td>\n<td>Monitoring Center Configuration</td>\n<td style=\"text-align:left\">Configure information related to connect monitor centers. Optional</td>\n</tr>\n<tr>\n<td>&lt;dubbo:provider/&gt;</td>\n<td>Provider Configuration</td>\n<td style=\"text-align:left\">When some properties ProtocolConfig or ServiceConfig are not configured, use this default value. Optional</td>\n</tr>\n<tr>\n<td>&lt;dubbo:consumer/&gt;</td>\n<td>Consumer Configuration</td>\n<td style=\"text-align:left\">When some properties of ReferenceConfig are not configured, use this default value. Optional</td>\n</tr>\n<tr>\n<td>&lt;dubbo:method/&gt;</td>\n<td>Method Configuration</td>\n<td style=\"text-align:left\">Configure specific method level information of ServiceConfig and ReferenceConfig</td>\n</tr>\n<tr>\n<td>&lt;dubbo:argument/&gt;</td>\n<td>Parameter Configuration</td>\n<td style=\"text-align:left\">Configure parameters of specific method</td>\n</tr>\n</tbody>\n</table>\n<p><img src=\"https://cdn.yuque.com/lark/0/2018/png/15841/1527849348155-8423d401-9ea4-4dc6-8720-d9e3d90963b6.png\" alt=\"undefined\"></p>\n <center>Configuration Diagram</center>\n<h6>Configuration item in detail</h6>\n<ul>\n<li>\n<p>&lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;<br>\nApply to specific application name, note that you need to make sure that the application name is unique. The application name can be displayed in the following console admin for easy management.</p>\n</li>\n<li>\n<p>&lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;<br>\nConfigure registry center, related to the specific mechanism of service discovery. It can be zookeeper address or eureka address. The address above is the broadcast address, which is very convenient in the test process of the local service invocation.</p>\n</li>\n<li>\n<p>&lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;<br>\nHere is the transport protocol and the default port, generally no changes are required.</p>\n</li>\n</ul>\n<blockquote>\n<p>Next, we will focus on the configuration of &lt;dubbo:service/&gt;</p>\n</blockquote>\n<ul>\n<li>&lt;dubbo:service/&gt;mainly supports the following properties:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Properties Name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>version</td>\n<td>Version number</td>\n</tr>\n<tr>\n<td>scope</td>\n<td>Service visibility, value can be local or remote,remote by default</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>Maximum number of activated requests</td>\n</tr>\n<tr>\n<td>async</td>\n<td>Whether the method called asynchronously,false by default</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>Service cache,optional value:lru/threadlocal/jcache</td>\n</tr>\n<tr>\n<td>callbacks</td>\n<td>Limitation of callback instance</td>\n</tr>\n<tr>\n<td>generic</td>\n<td>Generalized calls which can be bypassed</td>\n</tr>\n<tr>\n<td>class</td>\n<td>The implementation of the service's class name</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>The number of connections in the service</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>The number of milliseconds delay for publicating the service</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>Upper bound of service execution requests</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>Timeout retry times</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>Invocation timeout time</td>\n</tr>\n</tbody>\n</table>\n<p>For other configuration properties, please refer to xsd:<a href=\"http://dubbo.apache.org/schema/dubbo/dubbo.xsd\">http://dubbo.apache.org/schema/dubbo/dubbo.xsd</a></p>\n<ul>\n<li>&lt;dubbo:method/&gt; as the sub-element of &lt;dubbo:service/&gt; can be configured corresponding to method. Properties that are commonly used are:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Properties Name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>executes</td>\n<td>Upper bound of service execution requests</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>Timeout retry times</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>Invocation timeout time</td>\n</tr>\n</tbody>\n</table>\n<p>For other properties,you can refer to xsd above。</p>\n<h6>Configuration Override Relationship</h6>\n<p><img src=\"https://cdn.yuque.com/lark/0/2018/png/15841/1527849374313-94a5ea24-0e72-4d83-871b-e0e95eab646a.png\" alt=\"undefined\"></p>\n<center>Configuration Coverage Relationship Diagram</center>\n<p>The Override relationship here includes the configuration of both provider end and consumer end. If you have any questions about consumer, you can refer to the next chapter, consumer chapter, to understand.</p>\n<h4>dubbo.properties Configuration</h4>\n<blockquote>\n<p>If the public configuration is very simple, no multiple registry centers, no multiple protocols, etc., or if you want multiple Spring containers to share the configuration, you can use dubbo.properties as the default configurations.</p>\n</blockquote>\n<p>Dubbo would load dubbo.properties under the classpath root directory automaticaly,you can change the default configuration location by JVM startup parameter -Ddubbo.properties.file=xxx.properties.</p>\n<h6>dubbo.properties Configuration example</h6>\n<pre><code># application name\ndubbo.application.name=dubbodemo-provider\n# registry center address\ndubbo.registry.address=zookeeper://localhost:2181\n# Example of broadcasting registry center\n#dubbo.registry.address=multicast://224.5.6.7:1234\n# address for calling protocol\ndubbo.protocol.name=dubbo\ndubbo.protocol.port=28080\n</code></pre>\n<h6>Mapping Rule</h6>\n<p>Split the tag name and properties in XML configuration with dots, and multiple properties should be split into multiple lines</p>\n<ul>\n<li>For example: dubbo.application.name=foo equivalents to &lt;dubbo:application name=&quot;foo&quot; /&gt;</li>\n<li>For example: dubbo.registry.address=10.20.153.10:9090 equivalents to &lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; /&gt;</li>\n</ul>\n<p>If there are multiple configurations having the same tag name, they can be distinguished by id, and if there is no id, the configurations will be applied to all tags with the same name.</p>\n<ul>\n<li>For example: dubbo.protocol.rmi.port=1234 equivalents to &lt;dubbo:protocol id=&quot;rmi&quot; name=&quot;rmi&quot; port=&quot;1234&quot; /&gt;</li>\n<li>For example: dubbo.registry.china.address=10.20.153.10:9090 equivalents to &lt;dubbo:registry id=&quot;china&quot; address=&quot;10.20.153.10:9090&quot; /&gt;</li>\n</ul>\n<h6>Coverage Strategy</h6>\n<p><img src=\"https://cdn.yuque.com/lark/0/2018/png/15841/1527849393591-2c3de248-1b3d-47d3-bd10-8b415e9fcd39.png\" alt=\"undefined\"></p>\n<ul>\n<li>When JVM starts, -D parameter has priority, so that users can rewrite the parameters when deploy and start, for example, the protocol port should be changed when start.</li>\n<li>Then comes to XML, the configurations in dubbo.properties are invalid, if they are configured in XML.</li>\n<li>Properties are the last, which can be considered as default value. Only when there is no configuration in XML, the corresponding configuarations in dubbo.properties will become effective, which usually applies to shared public configuration, like application name.</li>\n</ul>\n<blockquote>\n<p>Note:</p>\n</blockquote>\n<ol>\n<li>If there are multiple dubbo.properties in the classpath root directory, for example, if dubbo.properties exist in multiple JAR files, Dubbo will load anyone arbitrarily and print the Error logs, which may change to throwing exceptions later.↩</li>\n<li>When the protocol's id is not configured, protocol name will be used as id as default.</li>\n</ol>\n<h4>Annotation</h4>\n<h6>Service Annotation Exposure Service</h6>\n<pre><code>import com.alibaba.dubbo.config.annotation.Service;\n\n@Service(timeout = 5000)\npublic class AnnotateServiceImpl implements AnnotateService { \n    // ...\n}\n</code></pre>\n<h6>Javaconfig Configuration Public Module</h6>\n<pre><code>@Configuration\npublic class DubboConfiguration {\n\n    @Bean\n    public ApplicationConfig applicationConfig() {\n        ApplicationConfig applicationConfig = new ApplicationConfig();\n        applicationConfig.setName(&quot;provider-test&quot;);\n        return applicationConfig;\n    }\n\n    @Bean\n    public RegistryConfig registryConfig() {\n        RegistryConfig registryConfig = new RegistryConfig();\n        registryConfig.setAddress(&quot;zookeeper://127.0.0.1:2181&quot;);\n        registryConfig.setClient(&quot;curator&quot;);\n        return registryConfig;\n    }\n}\n</code></pre>\n<p>The result of configuration using this method is the same as that of using xml.</p>\n<h6>Specify the Dubbo Scan Path</h6>\n<pre><code>@SpringBootApplication\n@DubboComponentScan(basePackages = &quot;com.alibaba.dubbo.test.service.impl&quot;)\npublic class ProviderTestApp {\n    // ...\n}\n</code></pre>\n<p>or use the spring bean xml configuration:</p>\n<pre><code>&lt;dubbo:annotation package=&quot;com.chanshuyi.service.impl&quot; /&gt;\n</code></pre>\n<h4>API Trigger Directly</h4>\n<pre><code>import com.alibaba.dubbo.rpc.config.ApplicationConfig;\nimport com.alibaba.dubbo.rpc.config.RegistryConfig;\nimport com.alibaba.dubbo.rpc.config.ProviderConfig;\nimport com.alibaba.dubbo.rpc.config.ServiceConfig;\nimport com.xxx.XxxService;\nimport com.xxx.XxxServiceImpl;\n\n// Service implementation\nXxxService xxxService = new XxxServiceImpl();\n\n// current application configuration\nApplicationConfig application = new ApplicationConfig();\napplication.setName(&quot;xxx&quot;);\n\n// connect to registry center configuration\nRegistryConfig registry = new RegistryConfig();\nregistry.setAddress(&quot;10.20.130.230:9090&quot;);\nregistry.setUsername(&quot;aaa&quot;);\nregistry.setPassword(&quot;bbb&quot;);\n\n// service provider's protocol configuration\nProtocolConfig protocol = new ProtocolConfig();\nprotocol.setName(&quot;dubbo&quot;);\nprotocol.setPort(12345);\nprotocol.setThreads(200);\n\n// Note: ServiceConfig is a heavy object, which encapsulated the connection with registry center internally, and open the service port\n\n// Service provider exposes service configuration\nServiceConfig&lt;XxxService&gt; service = new ServiceConfig&lt;XxxService&gt;(); // This instance is very heavy, which encapsulated the connection with registry center, please cache it by yourself, it might cause memory and connection leakage otherwise.\nservice.setApplication(application);\nservice.setRegistry(registry); // multiple registry centers can use setRegistries()\nservice.setProtocol(protocol); // multiple protocols can use setProtocols()\nservice.setInterface(XxxService.class);\nservice.setRef(xxxService);\nservice.setVersion(&quot;1.0.0&quot;);\n\n// exposure and register service\nservice.export();\n</code></pre>\n<p>Generally, this method is not recommended in spring applications. The reason can be checked by reading the source code on github, which would not be explained here.</p>\n<h3>Provider Interface and Implement</h3>\n<p>The above chapters are described mainly from a configuration perspective, and lets explain the complete use of Dubbo provider by going through a complete example.</p>\n<p>There is only one service UserReadService, and one method getUserById in this example.\nThis service need to be exposed to a remote service by Dubbo. Detail steps are shown below:</p>\n<ol>\n<li>Create Project\nSkip this step if there is already a project. Create a Spring Boot project, which can be created through <a href=\"https://start.spring.io/\">https://start.spring.io/</a>.</li>\n<li>Define Interface\nDefine interface: UserReadService</li>\n</ol>\n<pre><code>public interface UserReadService{\n    public User getUserById(Long userId);\n}\n</code></pre>\n<p>Generally, this interface should be placed in an independent JAR file as a client package.\nGenerally, the other services need to refer this client package if they want to consume this service(except for generalized call).\n3. Implement Interface\nImplement UserReadService, and deploy current implementation in the Provider's application.</p>\n<pre><code>public UserReadServiceImpl implements UserReadService{\n    public User getUserById(Long userId){\n        return xxx;\n    }\n}\n</code></pre>\n<ol start=\"4\">\n<li>Dubbo Configuration</li>\n</ol>\n<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;\n    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;\n    xmlns:dubbo=&quot;http://dubbo.apache.org/schema/dubbo&quot;\n    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd&quot;&gt;  \n    &lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;  \n    &lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;  \n    &lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;  \n    &lt;bean id=&quot;userReadService&quot; class=&quot;com.package.UserReadServiceImpl&quot;/&gt;\n    &lt;dubbo:service interface=&quot;com.package.UserReadService&quot; ref=&quot;userReadService&quot; /&gt;  \n&lt;/beans&gt;\n</code></pre>\n<p>For the other modes of Dubbo configuration, please refer to the related configurations in the previous chapter, or use the integrated Dubbo Spring Boot starter method.</p>\n",
-  "title": "Dubbo Basic Usage -- Dubbo Provider Configuration",
-  "keywords": "Dubbo, Provider, Configuration",
-  "description": "This article will introduce you how to config Dubbo, by XML, property files, annotations or Java code."
+  "link": "/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.html",
+  "meta": {
+    "title": "Dubbo Basic Usage -- Dubbo Provider Configuration",
+    "keywords": "Dubbo, Provider, Configuration",
+    "description": "This article will introduce you how to config Dubbo, by XML, property files, annotations or Java code."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-generic-invoke.json b/en-us/blog/dubbo-generic-invoke.json
index 2b7140cc..7b7dfd08 100644
--- a/en-us/blog/dubbo-generic-invoke.json
+++ b/en-us/blog/dubbo-generic-invoke.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-generic-invoke.md",
   "__html": "<h1>Generic invoke of Dubbo</h1>\n<p>The generic invoke could be considered to be used in the following cases:</p>\n<ul>\n<li>Service test platform</li>\n<li>API service gateway</li>\n</ul>\n<p>The generic invoke is mainly used when the consumer does not have an API interface;\ninstead of depending the interface jar package, the service call is initiated directly through the GenericService interface, and all POJOs in the parameters and return values are represented by a <code>Map</code>.\nGeneric invoke does not require attention on the server and can be exposed as normal services.</p>\n<p>Next, let's take a look at how the consumer uses generic invoke for service call.</p>\n<h2>Generic invoke through Spring XML configuration</h2>\n<p>Declare <code>generic=&quot;true&quot;</code> in Spring configuration, such as</p>\n<pre><code class=\"language-xml\">\"userService\" interface=\"com.alibaba.dubbo.samples.generic.api.IUserService\" generic=\"true\"/&gt;\n</code></pre>\n<p>Where you need to use it, you can call it by forcing a type cast to GenericService.</p>\n<pre><code class=\"language-java\">GenericService userService = (GenericService) context.getBean(<span class=\"hljs-string\">\"userService\"</span>);\n<span class=\"hljs-comment\">// primary param and return value</span>\nString name = (String) userService.$invoke(<span class=\"hljs-string\">\"delete\"</span>, <span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-keyword\">int</span>.class.getName()}, <span class=\"hljs-keyword\">new</span> Object[]{<span class=\"hljs-number\">1</span>});\nSystem.out.println(name);\n</code></pre>\n<p>Among them,</p>\n<ol>\n<li>\n<p>The interface GenericService has only one method, named $invoke, which takes three arguments, a method name, an array of method parameter types, and an array of parameter values.</p>\n</li>\n<li>\n<p>For arrays of method parameter types</p>\n<p>i.\tIf it is a basic type, such as int or long, use <code>int.class.getName()</code> to get its type;</p>\n<p>ii. If it is a basic type array, such as int[], use <code>int[].class.getName()</code>;</p>\n<p>iii.\tIf it is a POJO, use the full class name directly, such as <code>com.alibaba.dubbo.samples.generic.api.Params</code>.</p>\n</li>\n</ol>\n<h2>Generic invoke through API programming</h2>\n<pre><code class=\"language-java\">ApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig()ApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"api-generic-consumer\"</span>);\n\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n\napplication.setRegistry(registry);\n\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type interface name</span>\nreference.setInterface(<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.IUserService\"</span>);\n<span class=\"hljs-comment\">// declared as a generalized interface</span>\nreference.setGeneric(<span class=\"hljs-keyword\">true</span>);\n\nreference.setApplication(application);\n\n<span class=\"hljs-comment\">// replace all interface references with com.alibaba.dubbo.rpc.service.GenericService</span>\nGenericService genericService = reference.get();\n\nString name = (String) genericService.$invoke(<span class=\"hljs-string\">\"delete\"</span>, <span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-keyword\">int</span>.class.getName()}, <span class=\"hljs-keyword\">new</span> Object[]{<span class=\"hljs-number\">1</span>});\nSystem.out.println(name);\n</code></pre>\n<p>Through the API, you don't need to configure the service in advance like XML. You can dynamically construct ReferenceConfig; the API is more common than XML.</p>\n<h2>The case where parameters or return values are POJOs</h2>\n<p>For example, the method signature is <code>User get(Params params)</code>, where <code>User</code> has two attributes, id and name, and <code>Params</code> has one attribute, query.</p>\n<p>The following is the code of the consumer:</p>\n<pre><code class=\"language-java\">String[] parameterTypes = <span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.Params\"</span>};\nMap&lt;String, Object&gt; params = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;();\nparam.put(<span class=\"hljs-string\">\"class\"</span>, <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.Params\"</span>);\nparam.put(<span class=\"hljs-string\">\"query\"</span>, <span class=\"hljs-string\">\"a=b\"</span>);\nObject user = userService.$invoke(<span class=\"hljs-string\">\"get\"</span>, parameterTypes, <span class=\"hljs-keyword\">new</span> Object[]{param});\nSystem.out.println(<span class=\"hljs-string\">\"sample one result: \"</span> + user);\n</code></pre>\n<p>The output of the above code is:</p>\n<pre><code>sample one result: {name=charles, id=1, class=com.alibaba.dubbo.samples.generic.api.User}\n</code></pre>\n<p>Here, the Dubbo framework will automatically convert the return value from POJO to Map.\nIt can be seen that the return value <code>user</code> is a HashMap, which stores three k/vs, name, id, and class.</p>\n<h2>Generic interface implementation</h2>\n<p>The implementation of the generic interface is mainly used when the server does not have an API interface. All POJOs in the parameters and return values are represented by Map, which is usually used for framework integration. For example, to implement a generic remote service Mock framework, all service requests can be handled by implementing the interface GenericService.</p>\n<h3>Implementation GenericService on the server</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GenericServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GenericService</span> </span>{\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-keyword\">public</span> Object $invoke(String method, String[] parameterTypes, Object[] args) <span class=\"hljs-keyword\">throws</span> GenericException {\n        <span class=\"hljs-keyword\">if</span> (method.equals(<span class=\"hljs-string\">\"hi\"</span>)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hi, \"</span> + args[<span class=\"hljs-number\">0</span>];\n        } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (method.equals(<span class=\"hljs-string\">\"hello\"</span>)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + args[<span class=\"hljs-number\">0</span>];\n        }\n\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"welcome\"</span>;\n    }\n}\n</code></pre>\n<h3>Server exposed service</h3>\n<pre><code class=\"language-java\">ApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"api-generic-provider\"</span>);\n\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n\napplication.setRegistry(registry);\n\nGenericService genericService = <span class=\"hljs-keyword\">new</span> GenericServiceImpl();\n\nServiceConfig&lt;GenericService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\nservice.setApplication(application);\nservice.setInterface(<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.HelloService\"</span>);\nservice.setRef(genericService);\nservice.export();\n\nServiceConfig&lt;GenericService&gt; service2 = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\nservice2.setApplication(application);\nservice2.setInterface(<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.HiService\"</span>);\nservice2.setRef(genericService);\nservice2.export();\n</code></pre>\n<p>Similarly, you can expose the service using XML configuration; in this case, the server does not depend on the two interfaces HiService and HelloService.</p>\n<h3>Service invoke on the consumer</h3>\n<pre><code class=\"language-java\">ApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"api-generic-consumer\"</span>);\n\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n\napplication.setRegistry(registry);\n\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type interface name</span>\nreference.setInterface(HiService.class);\nreference.setApplication(application);\n\nHiService hiService = (HiService) reference.get();\nSystem.out.println(hiService.hi(<span class=\"hljs-string\">\"dubbo\"</span>));\n\nReferenceConfig&lt;GenericService&gt; reference2 = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type interface name</span>\nreference2.setInterface(HelloService.class);\nreference2.setApplication(application);\n\nHelloService helloService = (HelloService) reference2.get();\nSystem.out.println(helloService.hello(<span class=\"hljs-string\">\"community\"</span>));\n</code></pre>\n<p>Similarly, the consumer can also reference the service using an XML configuration and then make the call. Here you can see that the calling method is a normal service call, not a generic call. Of course, it is also possible to use generic calls.</p>\n<p>So far, a simple service Mock platform has been successfully launched!</p>\n<h2>Others</h2>\n<ul>\n<li>The generic invoke and generic interface implementations introduced in this article are all based on the native Dubbo protocol. Prior to version 2.6.2, other protocols such as http/hessian don't support generic invoke. Version 2.6.3 will support the generic invoke of these two protocols.</li>\n<li>The relevant sample codes mentioned in this article can be found in dubbo-samples: <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-generic\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-generic</a></li>\n</ul>\n",
-  "title": "Generic invoke of Dubbo",
-  "keywords": "Dubbo, Generic invoke",
-  "description": "This article introduces you when and how to use generic invoke of Dubbo."
+  "link": "/en-us/blog/dubbo-generic-invoke.html",
+  "meta": {
+    "title": "Generic invoke of Dubbo",
+    "keywords": "Dubbo, Generic invoke",
+    "description": "This article introduces you when and how to use generic invoke of Dubbo."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-invoke.json b/en-us/blog/dubbo-invoke.json
index 0fdf6a3e..e05a847f 100644
--- a/en-us/blog/dubbo-invoke.json
+++ b/en-us/blog/dubbo-invoke.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-invoke.md",
   "__html": "<h1>Dubbo: Several ways about synchronous/asynchronous invoke</h1>\n<p>As we all know,Dubbo adopts a single large join protocol by default and takes the NIO asynchronous communication mechanism of Netty as the low-level implementation. Based on this mechanism, Dubbo implements several invocation modes as follows:</p>\n<ul>\n<li>synchronous invoke</li>\n<li>asynchronous invoke</li>\n<li>parameters callback</li>\n<li>event notification</li>\n</ul>\n<h3>Synchronous invoke</h3>\n<p>Synchronous invoke is a kind of blocking invocation mode, that is the Consumer keeps blocking and waiting, until the Provider returns.</p>\n<p>Generally, a typical synchronous invocation process is as follows:</p>\n<ol>\n<li>Consumer service thread invokes the remote API and sends requests to the Provider. Meanwhile, the current service thread stays in blocking state;</li>\n<li>Provider process relative request after receiving it from Consumer. Then returns the results to Consumer;</li>\n<li>After Consumer receiving results, the current thread continues to execute.</li>\n</ol>\n<p>Here are two problems:</p>\n<ol>\n<li>How does Consumer service thread turn into <code>blocking</code> state?</li>\n<li>How does the service thread be awaked to execute after Consumer receiving results?</li>\n</ol>\n<p>In fact, the low-level I/O operations of Dubbo are all asynchronous. The Consumer gets a Future object after invoking the Provider. For synchronous invoke, the service thread takes advantage of <code>Future#get(timeout)</code> to block and wait for Provider returning results, with the 'timeout' indicating the timeout defined by Consumer. When the result returns, the Future will be set and the blocked service thread will be awaked. The service thread will return an exception if there is no result after timeout.</p>\n<h3>Asynchronous invoke</h3>\n<p>For scenarios that Provider has a long response time, it's necessary to implement asynchronous invoke based on Dubbo's underlying asynchronous NIO. It could utilize the resource of Consumer effectively, and costs less than using multi-thread for Consumer.</p>\n<p>Asynchronous invoke does not need specific configuration for Provider. In the example,the API of Provider is defined as follow:</p>\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\">AsyncService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">goodbye</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h5>Consumer configuration</h5>\n<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\">\"asyncService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.async.api.AsyncService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"goodbye\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Notice that if we need an asynchronous revoke method, we must use <code>&lt;dubbo:method/&gt;</code> label to describe it.</p>\n<h5>Consumer triggers invocation</h5>\n<pre><code class=\"language-java\">AsyncService service = ...;\nString result = service.goodbye(<span class=\"hljs-string\">\"samples\"</span>);<span class=\"hljs-comment\">// returns NULL and DO NOT use!</span>\nFuture&lt;String&gt; future = RpcContext.getContext().getFuture();\n... <span class=\"hljs-comment\">// other service thread logic</span>\nresult = future.get(); <span class=\"hljs-comment\">// could use get(timeout, unit) to configure timeout, when it needs to get the asynchronous result</span>\n</code></pre>\n<p>After Dubbo Consumer triggers invocation, it uses <code>RpcContext.getContext().getFuture()</code> to get the relative <code>Future</code> object, and then it could start executing other tasks. Anytime when we need results, <code>future.get(timeout)</code> is supposed to be called.</p>\n<p>Under several special conditions, it could be set whether to wait for sending the request, to accelerate the return of invocation:</p>\n<ul>\n<li><code>sent=&quot;true&quot;</code> Waiting for sending the request, and return an exception if it fails;</li>\n<li><code>sent=&quot;false&quot;</code> Do not wait for the request, and returns immediately after putting the request to the I/O queue.</li>\n</ul>\n<p>We set it to <code>false</code> by default. And detailed configuration is as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"goodbye\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">sent</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>If you only want to be asynchronous, then omit the result thoroughly, <code>return=&quot;false&quot;</code> could be set to reduce the creation and management cost of Future:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"goodbye\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">return</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n</code></pre>\n<p>At this time,<code>RpcContext.getContext().getFuture()</code> will return <code>null</code>。</p>\n<p>The complete sequence diagram of asynchronous invoke is as follow:</p>\n<p><img src=\"../../img/blog/dubbo-async.svg\" alt=\"Asynchronous invoke\"></p>\n<p>The sample locates at:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async</a></p>\n<h3>Parameters callback</h3>\n<p>The parameter Callback is somewhat similar to the local Callback mechanism, but Callback is not an inner class or interface of Dubbo. Instead, it is defined by the Provider. Dubbo will generate a reverse proxy based on the long connection, so as to implement the logic of calling the Consumer from the Provider.</p>\n<h5>Service and Callback definition of Provider</h5>\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\">CallbackService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span></span>;\n}\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span></span>;\n}\n</code></pre>\n<h5>Service implementation of Provider</h5>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CallbackServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Map&lt;String, CallbackListener&gt; listeners = <span class=\"hljs-keyword\">new</span> ConcurrentHashMap&lt;String, CallbackListener&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">CallbackServiceImpl</span><span class=\"hljs-params\">()</span> </span>{\n        Thread t = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">while</span> (<span class=\"hljs-keyword\">true</span>) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        <span class=\"hljs-keyword\">for</span> (Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()) {\n                            <span class=\"hljs-keyword\">try</span> {\n                                entry.getValue().changed(getChanged(entry.getKey()));\n                            } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                                listeners.remove(entry.getKey());\n                            }\n                        }\n                        Thread.sleep(<span class=\"hljs-number\">5000</span>); <span class=\"hljs-comment\">// timely trigger change event</span>\n                    } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                        t.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.setDaemon(<span class=\"hljs-keyword\">true</span>);\n        t.start();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span> </span>{\n        listeners.put(key, listener);\n        listener.changed(getChanged(key)); <span class=\"hljs-comment\">// send notification for change</span>\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> String <span class=\"hljs-title\">getChanged</span><span class=\"hljs-params\">(String key)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Changed: \"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date());\n    }\n}\n</code></pre>\n<h5>Service exposure of Provider</h5>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.callback.impl.CallbackServiceImpl\"</span>/&gt;</span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.callback.api.CallbackService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"callbackService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"addListener\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--&lt;dubbo:argument type=\"com.demo.CallbackListener\" callback=\"true\" /&gt;--&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>Here,Provider needs to declare which parameter is the Callback parameter in the method.</p>\n<h5>Callback interface implementation of Consumer</h5>\n<pre><code class=\"language-java\">CallbackService callbackService = ...;\ncallbackService.addListener(<span class=\"hljs-string\">\"foo.bar\"</span>, <span class=\"hljs-keyword\">new</span> CallbackListener() {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span> </span>{\n            System.out.println(<span class=\"hljs-string\">\"callback1:\"</span> + msg);\n        }\n});\n</code></pre>\n<p>The implementation class of the Callback interface is on the Consumer, which automatically exports a Callback service when the method is called. Thus during Provider processing the call, if the parameter is determined as Callback, it will generate a proxy. Therefore, when the service implementation class calling the Callback method, it will be passed to the Consumer to execute the code.</p>\n<p>The sample code above is located at:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback</a></p>\n<p>This invocation mode is somewhat like message publishing and subscribing, but there is a little difference. For example, when the Consumer completes the export of Callback service, if it restarts later, then the Provider will fail to adjust. Meanwhile it is also a problem for the Provider to clean up the proxy.</p>\n<h3>Event notification</h3>\n<p>Event notification allows the Consumer triggering three events,particularly <code>oninvoke</code>, <code>onreturn</code>, <code>onthrow</code> before calling, after calling or occurring exceptions.</p>\n<p>You can specify which events need to be notified during configuring Consumer, such as:</p>\n<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\">\"demoCallback\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.notify.impl.NotifyImpl\"</span> /&gt;</span>\n\n<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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.notify.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">onreturn</span>=<span class=\"hljs-string\">\"demoCallback.onreturn\"</span> <span class=\"hljs-attr\">onthrow</span>=<span class=\"hljs-string\">\"demoCallback.onthrow\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Among them,the code of NotifyImpl is as follow:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NotifyImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Notify</span></span>{\n\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, String&gt; ret = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, String&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(String name, <span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        ret.put(id, name);\n        System.out.println(<span class=\"hljs-string\">\"onreturn: \"</span> + name);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, String name, <span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"onthrow: \"</span> + name);\n    }\n}\n</code></pre>\n<p>Here we address that the parameter rules of three methods in the custom Notify interface are as follows:</p>\n<ul>\n<li><code>oninvoke</code> method's parameters are the same as the calling method parameters;</li>\n<li><code>onreturn</code> method's first parameter is the returned value of calling method,and the others are the same as the calling method;</li>\n<li><code>onthrow</code> method's first parameter is an invoked exception,and the others are the same as the calling method.</li>\n</ul>\n<p>In the above configuration, <code>sayHello</code> method is an asynchronous invocation, so the execution of event notification method is also synchronous. You can configure the <code>async = true</code> to make method invocation asynchronous, at this moment, event notification method is executed asynchronously. Especially emphasize that <code>oninvoke</code> method is executed synchronously, whether is an asynchronous call or not.</p>\n<p>Please refer to the sample code for event notification:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify</a></p>\n",
-  "title": "Dubbo: Several ways about synchronous/asynchronous invoke",
-  "keywords": "Dubbo, Invoke, Async",
-  "description": "This article introduces you how to use Dubbo synchronously or asynchronously."
+  "link": "/en-us/blog/dubbo-invoke.html",
+  "meta": {
+    "title": "Dubbo: Several ways about synchronous/asynchronous invoke",
+    "keywords": "Dubbo, Invoke, Async",
+    "description": "This article introduces you how to use Dubbo synchronously or asynchronously."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-k8s.json b/en-us/blog/dubbo-k8s.json
index 0ab00d00..e53fd8a3 100644
--- a/en-us/blog/dubbo-k8s.json
+++ b/en-us/blog/dubbo-k8s.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-k8s.md",
   "__html": "<h1>General goal</h1>\n<p>Dubbo's provider don't care about service registration.Open its Dubbo service port,the declaration and publishment of the service will be executed by Kubernetes.\nDubbo's consumer directly discovers the corresponding service endpoints of Kubernetes during service discovery procedure, thereby reusing Dubbo's existing microservice channel capabilities.The benefit is that there is no need to rely on any third-party soft-loaded registry and it can be seamlessly integrated into the multi-tenant security system of Kubernetes. Reference demo : <a href=\"https://github.com/dubbo/dubbo-Kubernetes\">https://github.com/dubbo/dubbo-ubernetes</a></p>\n<h1>Introduction</h1>\n<p>Kubernates is a hierarchical system with rich secondary development function based on the expansibility.</p>\n<ul>\n<li>First of all, Kubernates's core function is to manage the container cluster. Kubernates manages the  storage and calculation of containerized cluster, based on the container runtime (CRI), network interface (CNI) and storage service interface (CSI/FV).</li>\n<li>Secondly,Kubernates has application-oriented deployment and routing capabilities,including statefulness/statelessness,batch processing and service-oriented applications,especially the application management based on microservices architecture which includes service discovery,service definition and unified configuration on the basis of configmap.</li>\n<li>Finally, on top of the abstract model of the basic resource (mainly the resources of abstract infrastructure, IaaS) and the application layer is the governance layer, which includes elastic expansion, namespaces/tenants and so on. Naturally, it is a matter of course to set up service about unified log center and omnidirectional monitoring on the Kubernetes based upon the foundational capabilities of atomic inner core.</li>\n</ul>\n<p>We will explain the above description with a diagram of Kubernetes Architecture. In 2018, Kubernetes took a qualitative step toward the standard PaaS basement.Someone hold opinions that the reason is the ability for secondary development on the basis of the expansion and someone think the key is declarative programming and strong community operations relying on Google and Redhat. However,I think the essential reason is Layered architecture and the abstract domain modeling in the problem domain as the figure below.</p>\n<p><img src=\"../../img/blog/k8s/1.png\" alt=\"img\"></p>\n<p>From a micro-service architecture perspective, Kubernetes is a micro-service framework (more appropriate than a micro-service platform or toolkit set at this time) in a sense, supporting the basic capabilities of microservices for service discovery/registration. Use the following table to make a brief description.</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">The design of microservice</th>\n<th style=\"text-align:left\">The function of Kubernetes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">Point 1:API gateway</td>\n<td style=\"text-align:left\">Ingress</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 2:Statelessness, distinguish between stateful and stateless applications</td>\n<td style=\"text-align:left\">Stateless corresponds to Deployment,and stateful corresponds to StatefulSet</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 3:Horizontal expansion of the database</td>\n<td style=\"text-align:left\">Headless service points to PaaS service or StatefulSet deployment</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 4:Cache</td>\n<td style=\"text-align:left\">Headless service points to PaaS service or StatefulSet deployment</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 5:Service splitting and service discovery</td>\n<td style=\"text-align:left\">Service</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 6:Service orchestration and flexibility</td>\n<td style=\"text-align:left\">Replicas of deployment</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 7:Unified configuration center</td>\n<td style=\"text-align:left\">ConfigMap</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 8:Unified log center</td>\n<td style=\"text-align:left\">DaemonSet deploys log agent</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 9:Circut break, current limiting and downgrade</td>\n<td style=\"text-align:left\">Service Mesh</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">Point 10:Comprehensive monitoring</td>\n<td style=\"text-align:left\">Cadsivor, DaemonSet deploys and monitors Agent</td>\n</tr>\n</tbody>\n</table>\n<p>By the way, the microservices field involves many issues, which can be explained as follows. When building microservices, we will delve into Distributed System, a discipline has a 40-year research background and is rooted in the adaptive system theory. It's a bit complicated, but the concepts it covers are more or less heard for us, and it solves problems that we're familiar with:</p>\n<ul>\n<li>Deployment</li>\n<li>Delivery</li>\n<li>APIs</li>\n<li>Versioning</li>\n<li>Contracts</li>\n<li>Scaling / Autoscaling</li>\n<li>Service Discovery</li>\n<li>Load Balancing</li>\n<li>Routing / Adaptive Routing</li>\n<li>Health Checking</li>\n<li>Configuration</li>\n<li>Circuit Breaking</li>\n<li>Bulk-heads</li>\n<li>TTL / Deadlining</li>\n<li>Latency Tracing</li>\n<li>Service Causal Tracing</li>\n<li>Distributed logging</li>\n<li>Metrics Exposure, Collection</li>\n</ul>\n<p>For Kubernetes, only a few of problems are solved. Problems such as Dynamic Routing, Stability Control (Circuit Breaking, Bulk-heads, etc.) , Distributed Service Tracking, etc. are all the blank. These problems are exactly what Service Mesh needs to solve, and these also plays an important role in CNCF's Tail Map. Of course, as Dubbo is a basically complete microservices infrastructure (Dubbo is based on the Sidecar which is a common solution for solving cross-language claims in Service Mesh, and the details of Dubbo are so complicated that they need to be explained in the new topic ) , that is to say, it is very meaningful to integrate Dubbo into the k8s system. The original definition of Service Mesh is cited below:</p>\n<blockquote>\n<p><span data-type=\"color\" style=\"color:rgb(119, 119, 119)\"><span data-type=\"background\" style=\"background-color:rgb(255, 255, 255)\">A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It's responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application.</span></span></p>\n</blockquote>\n<p>We will know the existing solution, Dubbo integrates the Clould Native Equipment - Kubernetes's basic abilities to solve the microservices's core problems, can be regarded as a Service Mesh solution in a narrow sense, but it can only be used in the Java field. You can understand the above words as a joke, haha.</p>\n<h1>T<span data-type=\"color\" style=\"color:rgb(51, 51, 51)\"><span data-type=\"background\" style=\"background-color:rgb(255, 255, 255)\">hought</span></span>/Plan</h1>\n<p>Kubernetes is a natural address registration center for microservices, similar to zookeeper, VIPserver and Configserver used internally by Alibaba. Specifically, the Pod in Kubernetes is a running instance of the application. The scheduled deployment/start/stop of the Pod will call the API-Server service to maintain its state to ETCD. The service in Kubernetes is coresponded to the concept of the microservices defined as follows.</p>\n<blockquote>\n<p>A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.</p>\n</blockquote>\n<p>In conclusion, the Kubernetes service has the following characteristics:</p>\n<ul>\n<li>Each Service has a unique name and corresponding IP. IP is automatically assigned by Kubernetes and the name is defined by the developer.</li>\n<li>Service IP has several manifestations: ClusterIP, NodePort, LoadBalance and Ingress. ClusterIP is mainly used for intra-cluster communication; NodePort, Ingress and LoadBalance, which are used to expose services to access portals outside the cluster.</li>\n</ul>\n<p>At first sight, the service of Kubernetes has its own IP, while under the original fixed mindset: Dubbo/HSF service is aggregated by the IP of the entire service cluster, that means, Kubernetes and Dubbo/HSF look like something different in natural, but when carefully thinking, the difference becomes insignificant. Because the only IP under Kubernetes is just a Virtural IP--VIP, behind the vip are multiple endpoints, which is the factual processing node.</p>\n<p>Here we only discuss the situation that the Dubbo service in the cluster is accessed in the same Kubernetes cluster, As for the provider outside Kubernetes to access the provider in Kubernetes, since it involves the problem of network address space, and it usually requires GateWay/loadbalance for mapping conversion, which there not detail discussion for this case. Besides, there are two options available for Kubernetes:</p>\n<ol>\n<li>\n<p>DNS: The default Kubernetes service is based on the DNS plugin (The latest version of the recommendation is coreDNS), one proposal on Dubbo is about this.  since HSF/Dubbo has always highlighted its soft-load address discovery capability, it ignores Static's strategy insteadily, my understanding is that as a service discovery mechanism, the static resolution mechanism is one of the simplest and most needed to support mechanism, you can also refer to Envoy's point of views. While at the same time, ant's SOFA has always supported this static strategy, it can provides an explanation for an engineering fragment of the SOFA project. There are two advantages to doing this. 1) When the soft load center crash is unavailable and the address list cannot be obtained, there is a mechanism to Failover to this policy to handle certain requests. 2) Under LDC/unitization, the ant's load center cluster is deployed in the equipment room/area. First, the LDC of the soft load center is guaranteed to be stable and controllable. When the unit needs the request center, the address of the VIP can come in handy.</p>\n<p><img src=\"https://img.alicdn.com/tfs/TB1Kj1ktpkoBKNjSZFEXXbrEVXa-985-213.png\" alt=\"img\"></p>\n</li>\n<li>\n<p>API:DNS relies on the DNS plugin, which will generate additional operation, so consider directly obtaining the endpoint through the client of Kubernetes. In fact, by accessing the API server interface of Kubernetes, you can directly obtain the list of endpoints behind a certain servie, and can also monitor the changes in its address list. Thereby implementing the soft load discovery strategy recommended by Dubbo/HSF. Refer to the code for details:</p>\n</li>\n</ol>\n<p>The above two thoughts need to consider the following two points:</p>\n<ol>\n<li>Kubernetes and Dubbo are consistent with the mapping name of service. Dubbo's service is determined by serviename, group, version to determine its uniqueness, and servicename generally has a longer package name for its service interface. Need to map the servie name of Kubernetes and the service name of dubbo. Either add a property like SOFA to define it. This is a big change, but it is most reasonable. Or it is a fixed rule to reference the deployed environment variables, which can be used for quick verification.</li>\n<li>Port problem:The default Pod and Pod network interoperability is solved, need to be validated.</li>\n</ol>\n<h2>Demo Verification</h2>\n<p>The following is a demo deployment through Kubernetes service in Alibaba Cloud's Container Registry and   EDAS. Visit Alibaba Cloud -》Container Registry.</p>\n<ol>\n<li>Create repo and bind the github codebase. As shown below.</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1m.tEtrorBKNjSZFjXXc_SpXa-1892-870.png\" alt=\"img\"></p>\n<ol start=\"2\">\n<li>\n<p>Click Manage enter the repository details page. Click Build in images service panel,  construct the demo into image and publish it to the specified repository. As shown below.</p>\n<p><img src=\"https://img.alicdn.com/tfs/TB1oYqvtcIrBKNjSZK9XXagoVXa-1872-888.png\" alt=\"img\"></p>\n</li>\n<li>\n<p>Switch to Enterprise Distributed Application Services (EDAS) products panel, visit Resource Management -&gt; Clusters. Create Kubernetes cluster and bind ECS. As shown below.</p>\n<p><img src=\"https://img.alicdn.com/tfs/TB1b1p2trZnBKNjSZFKXXcGOVXa-1858-833.png\" alt=\"img\"></p>\n</li>\n<li>\n<p>Application Management -&gt; Create  application, type Kubernetes application and specify the image in the container registry . As shown below.</p>\n<p><img src=\"https://img.alicdn.com/tfs/TB1_YywtDCWBKNjSZFtXXaC3FXa-1737-588.png\" alt=\"img\"></p>\n<p><img src=\"https://img.alicdn.com/tfs/TB18uzTtdcnBKNjSZR0XXcFqFXa-1820-861.png\" alt=\"\"></p>\n</li>\n<li>\n<p>After creation , then deploy applications. As shown below.</p>\n</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1fEpEtrorBKNjSZFjXXc_SpXa-1846-783.png\" alt=\"\"></p>\n<ul>\n<li>\n<p>The supplementary application name cannot have uppercase letters, all lowercase, otherwise there is a problem of deployment failure.</p>\n</li>\n<li>\n<p>When creating an app, after selecting the image, the next button cannot be clicked and you need to click Choose to continue.</p>\n</li>\n<li>\n<p>EDAS has two independent Kubernetes services, one based on Alibaba Cloud's container service, and one set by Lark. I experience the latter.</p>\n</li>\n<li>\n<p>The development joint of Docker and IDE integration, you need to consider the relevant plug-ins for integrating IDEA.</p>\n</li>\n<li>\n<p>There is always an error in deployment, maybe there is a problem with the Kubernetes service. Need further investigation.</p>\n</li>\n</ul>\n<p>{&quot;kind&quot;:&quot;Pod&quot;,&quot;namespace&quot;:&quot;lzumwsrddf831iwarhehd14zh2-default&quot;,&quot;name&quot;:&quot;dubbo-k8s-demo-610694273-jq238&quot;,&quot;uid&quot;:&quot;12892e67-8bc8-11e8-b96a-00163e02c37b&quot;,&quot;apiVersion&quot;:&quot;v1&quot;,&quot;resourceVersion&quot;:&quot;850282769&quot;},&quot;reason&quot;:&quot;FailedSync&quot;,&quot;message&quot;:&quot;Error syncing pod&quot;,&quot;</p>\n",
-  "title": "Integrate Dubbo with Kubernetes",
-  "keywords": "Dubbo, Kubernetes, K8S",
-  "description": "This article will try to register Dubbo service to Kubernetes and integrate with Kubernetes's multi-tenancy security system."
+  "link": "/en-us/blog/dubbo-k8s.html",
+  "meta": {
+    "title": "Integrate Dubbo with Kubernetes",
+    "keywords": "Dubbo, Kubernetes, K8S",
+    "description": "This article will try to register Dubbo service to Kubernetes and integrate with Kubernetes's multi-tenancy security system."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-loadbalance.json b/en-us/blog/dubbo-loadbalance.json
index 841613e2..2df2a9eb 100644
--- a/en-us/blog/dubbo-loadbalance.json
+++ b/en-us/blog/dubbo-loadbalance.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-loadbalance.md",
   "__html": "<h1>Dubbo's Load Balance</h1>\n<h2>Background</h2>\n<p>Dubbo is a distributed service framework that avoids single point of failure and horizontal expansion of support services. A service typically deploys multiple instances. How to select a call from a cluster of multiple service providers involves a load balancing strategy.</p>\n<h2>Concepts</h2>\n<p>Before discussing load balancing, I will explain these three concepts first.</p>\n<ol>\n<li>Load Balancing</li>\n<li>Fault-tolerant Cluster</li>\n<li>Service Route</li>\n</ol>\n<p>These three concepts are confusing. They all describe how to choose from multiple Providers to make calls. So what is the difference between them? Let me give a simple example and explain these concepts clearly.</p>\n<p>There is a Dubbo user service, 10 deployed in Beijing and 20 deployed in Shanghai. A service consumer in Hangzhou initiated a call and then the following steps executed:</p>\n<ol>\n<li>According to the configured routing rule, if the call is initiated by Hangzhou, it will be routed to the nearest 20 Providers in Shanghai.</li>\n<li>According to the configured random load balancing strategy, one of the 20 Providers is randomly selected to be called, assuming that the 7th Provider is randomly selected.</li>\n<li>As a result, calling the 7th Provider failed.</li>\n<li>Retried other servers according to the configured Fault-tolerant Cluster mode.</li>\n<li>The call to the 13th Provider was successful.</li>\n</ol>\n<p>Steps 1, 2, and 4 above correspond to routing, load balancing, and fault-tolerant cluster. In Dubbo, a subset is selected by routing from multiple Providers according to routing rules, then a Provider selected from the subset according to load balancing to make this call. If the call fails, Dubbo retry or schedule retransmission or fail-fast according to the Fault-tolerant Cluster policy. You can see the routes in Dubbo, load balancing and Fault-tolerant Cluster exectute at different stages of an RPC call. The first stage is routing, then load balancing, and finally cluster fault tolerance. This document only discusses load balancing, routing and cluster fault tolerance are described in other documents.</p>\n<h2>Dubbo's Internal Load Balancing Strategy</h2>\n<p>Dubbo has four Internal Load Balancing Strategies:</p>\n<ol>\n<li>RandomLoadBalance: Random load balancing. Choose a Provider randomly. It is Dubbo's default load balancing strategy.</li>\n<li>Round Robin Load Balancing: Polling load balancing, then chooses one Provider.</li>\n<li>LeastActiveLoadBalance: The minimum number of active calls, the random number of the same active number. The active number refers to the difference before and after the call. Make slow providers receive fewer requests, because the slower Provider before and after the difference of calls will be larger.</li>\n<li>ConsistentHashLoadBalance: Consistent hash load balancing. Requests with the same parameters always fall on the same machine.</li>\n</ol>\n<h3>1. Random Load Balancing</h3>\n<p>As the name implies, the random load balancing strategy is to select one from multiple Providers randomly. However, random load balancing in Dubbo has a weighting concept that sets the random probability according to the weight. For example, there are 10 Providers, it's not to say that the probability of each Provider is the same, but to assign the probability by combining the weights of these 10 providers.</p>\n<p>In Dubbo, you can set weights on the Provider. For example, if the performance of the machine is better, you can set a larger weight. If the performance is poorer, you can set a smaller weight. Weights have an impact on load balancing. The weight of provider can be set in Dubbo Admin.</p>\n<h4>Weight-based Load Balancing Algorithm</h4>\n<p>The stochastic strategy will determine whether the weights of all the invokers are the same at first. If they are all the same, then the processing is relatively simple. Using <code>random.nexInt(length)</code>, you can randomly generate an invoker serial number, and select the corresponding invoker according to the serial number. If the service provider not set weight in Dubbo Admin, then all the invokers have the same weight, the default is 100. If the weights are different, then you need to combine the weights to set the random probability. The algorithm is probably as follows: If there are 4 invokers</p>\n<table>\n<thead>\n<tr>\n<th>Invoker</th>\n<th>Weight</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A</td>\n<td>10</td>\n</tr>\n<tr>\n<td>B</td>\n<td>20</td>\n</tr>\n<tr>\n<td>C</td>\n<td>20</td>\n</tr>\n<tr>\n<td>D</td>\n<td>30</td>\n</tr>\n</tbody>\n</table>\n<p>The total weight of A, B, C and D is 10 + 20 + 20 + 30 = 80. Spread 80 numbers in the following diagram:</p>\n<pre><code>+-----------------------------------------------------------------------------------+\n|          |                    |                    |                              |\n+-----------------------------------------------------------------------------------+\n1          10                   30                   50                             80\n\n|-----A----|---------B----------|----------C---------|---------------D--------------|\n\n\n---------------------15\n\n-------------------------------------------37\n\n-----------------------------------------------------------54\n</code></pre>\n<p>There are four areas in the above picture, and the lengths are the weights of A, B, C and D, respectively. Use <code>random.nextInt(10 + 20 + 20 + 30)</code> to randomly select one of the 80 numbers. Then determine which area the number is distributed in. For example, if random to 37, 37 is distributed in the C region, then select inboker C. 15 is in the B area, 54 is in the D area.</p>\n<h4>Random load balancing Source code</h4>\n<p>Below is the source code for random load balancing. For ease of reading and understanding, I removed the extraneous parts.</p>\n<pre><code>public class RandomLoadBalance extends AbstractLoadBalance {\n\n    private final Random random = new Random();\n\n    protected &lt;T&gt; Invoker&lt;T&gt; doSelect(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) {\n        int length = invokers.size();      // total invoker\n        int totalWeight = 0;               // Sum of invokers' weights\n\n        // Determine if all the invokers have the same weight\n        // If the weights are the same, it is simple to generate an index directly from Random.\n        boolean sameWeight = true;\n        for (int i = 0; i &lt; length; i++) {\n            int weight = getWeight(invokers.get(i), invocation);\n            totalWeight += weight; // Sum\n            if (sameWeight &amp;&amp; i &gt; 0 &amp;&amp; weight != getWeight(invokers.get(i - 1), invocation)) {\n                sameWeight = false;\n            }\n        }\n\n        if (totalWeight &gt; 0 &amp;&amp; !sameWeight) {\n            // If not all of the invoker weights are the same, load balancer will randomly choose invoker based on its weight. The greater the weight, the greater the probability of being selected\n            int offset = random.nextInt(totalWeight);\n            for (int i = 0; i &lt; length; i++) {\n                offset -= getWeight(invokers.get(i), invocation);\n                if (offset &lt; 0) {\n                    return invokers.get(i);\n                }\n            }\n        }\n        // If all invokers have the same weight\n        return invokers.get(random.nextInt(length));\n    }\n}\n</code></pre>\n<h3>2. Round Robin Load Balancing</h3>\n<p>Round Robin Load Balancing, is to call all Providers in turn. As with random load balancing strategies, Round Robin Load Balancing policies also has a weighting concept. The Round Robin Load Balancing algorithm allows RPC calls to be allocated exactly as we set. Whether it is a small or large number of calls. However, there are also some shortcomings in the Round Robin Load Balancing algorithm. There is a problem that the slow provider accumulates the request. For example, the second machine is slow, but it is not crashed. When the request is transferred to the second machine, it is stuck. Over time, all The request get stuck on the second machine, causing the entire system to slow down.</p>\n<h3>3. Minimum Active Call Load Balancing</h3>\n<p>Official explanation:</p>\n<blockquote>\n<p>The active number refers to the difference between the counts before and after the call. Select the machine with the minimum number of active calls or choose a random one among machines with the same active number, so that the slower machine can receives less requests.</p>\n</blockquote>\n<p>This explanation seems to be ambigious. We know the purpose is to ensure the slower machine receive less requests, but it is not clear how to achieve it. An example is here: each service maintains an active number counter. When A machine starts processing the request, the counter is incremented by 1. At this time, A is still processing. If the processing is completed, the counter is decremented by 1. B machine processes very quickly after receiving the request. Then the active numbers of A and B are 1,0 respectively. When a new request is generated, the B machine is selected for execution (as B has the minimum active number), so that the slower machine A receives fewer requests.</p>\n<p>When processing a new request, Consumer will check the active number of all Providers. If there is only one Invoker with the minimum active number, the Invoker is returned directly.</p>\n<pre><code>if (leastCount == 1) {\n    // if there is only one minimum value then return directly\n    return invokers.get(leastIndexs[0]);\n}\n</code></pre>\n<p>If there are multiple Invokers with the minimum active number, plus the weights are not equal and the total weight is greater than 0, then generate a random weight ranging from 0 to totalWeight. Finally, the Invoker is selected based on the randomly generated weights.</p>\n<pre><code>if (! sameWeight &amp;&amp; totalWeight &gt; 0) {\n    // if the weights are not equal and the toatl weight is greater than 0 then choose randomly according to total weight\n\n    int offsetWeight = random.nextInt(totalWeight);\n\n    // and determine which segment the random value falls on.\n\n    for (int i = 0; i &lt; leastCount; i++) {\n        int leastIndex = leastIndexs[i];\n        offsetWeight -= getWeight(invokers.get(leastIndex), invocation);\n        if (offsetWeight &lt;= 0)\n            return invokers.get(leastIndex);\n    }\n}\n</code></pre>\n<h3>4. Consistent Hash Algorithm</h3>\n<p>Use consistent hash algorithm to ensure that requests with same parameters are always sent to the same Provider. When a Provider crashes, requests originally sent to the Provider is spread evenly to other Providers based on the virtual node without causing drastic changes. The algorithm can be seen at: <a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></p>\n<p>By default, only the first parameter is hashed. Configure if you would like to modify it:</p>\n<pre><code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;\n</code></pre>\n<p>By default, 160 virtual nodes are used. Configure if you would like to modify it:</p>\n<pre><code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;\n</code></pre>\n<p>Consistent hash algorithms can be used in conjunction with caching mechanisms. For example, there is a service getUserInfo(String userId). After the hash algorithm is set, the same userId call is sent to the same Provider. This Provider can cache user data in memory, reducing the number of accesses to the database or distributed cache. If this part of the data is allowed to be inconsistent for some time, this approach can be considered. The number of dependencies and accesses to middleware such as databases, caches, etc. and network IO operations is reduced, while the system performance is improved.</p>\n<h2>Load Balancing Configuration</h2>\n<p>If load balancing is not specified, random load balancing is used by default. Load balancing can also be explicitly specified based on our needs. Load balancing can be configured in multiple local classes, such as Provider Side, Consumer Side, Service Level, and Method Level.</p>\n<h3>Server Side Service Level</h3>\n<pre><code>&lt;dubbo:service interface=&quot;...&quot; loadbalance=&quot;roundrobin&quot; /&gt;\n</code></pre>\n<p>All methods of the service use roundrobin load balancing.</p>\n<h3>Client Side Service Level</h3>\n<pre><code>&lt;dubbo:reference interface=&quot;...&quot; loadbalance=&quot;roundrobin&quot; /&gt;\n</code></pre>\n<p>All methods of the service use roundrobin load balancing.</p>\n<h3>Server Side Method Level</h3>\n<pre><code>&lt;dubbo:service interface=&quot;...&quot;&gt;\n    &lt;dubbo:method name=&quot;hello&quot; loadbalance=&quot;roundrobin&quot;/&gt;\n&lt;/dubbo:service&gt;\n</code></pre>\n<p>Only the hello method of the service uses roundrobin load balancing.</p>\n<h3>Client Side Method Level</h3>\n<pre><code>&lt;dubbo:reference interface=&quot;...&quot;&gt;\n    &lt;dubbo:method name=&quot;hello&quot; loadbalance=&quot;roundrobin&quot;/&gt;\n&lt;/dubbo:reference&gt;\n</code></pre>\n<p>Only the hello method of the service uses roundrobin load balancing.</p>\n<p>Similar to other Dubbo configurations, multiple configurations are covered:</p>\n<ol>\n<li>The method level takes precedence, the interface level is next, and the global configuration comes last.</li>\n<li>If the level is the same, the Consumer is given priority and the Provider is next</li>\n</ol>\n<p>Therefore, the priority of the above four configurations is:</p>\n<ol>\n<li>Client side method level configuration.</li>\n<li>Client side interface level configuration.</li>\n<li>Server side method level configuration.</li>\n<li>Server side interface level configuration.</li>\n</ol>\n<h2>Extended Load Balancing</h2>\n<p>Four load balancing implementations of Dubbo meet the requirements in most cases. Sometimes, we may need to implement our own load balancing strategy because of the needs of the business. This chapter only explains how to configure the load balancing algorithm. For more on the Dubbo extension mechanism, go to the Dubbo extension mechanism practice.</p>\n<ol>\n<li>Implementing the LoadBalance interface</li>\n</ol>\n<p>The following is Dubbo's LoadBalance interface:</p>\n<pre><code>@SPI(RandomLoadBalance.NAME)\npublic interface LoadBalance {\n    @Adaptive(&quot;loadbalance&quot;)\n    &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException;\n}\n</code></pre>\n<p>This is the interface of the SPI. The parameters of the select method are as follows:</p>\n<ul>\n<li>invokers: A list of all service Providers.</li>\n<li>url: Some configuration information, such as interface name, check or not, serialization.</li>\n<li>invocation: Information called by the RPC, including the method name, method parameter type, and method parameters. Here is a LoadBalance implemented by us. The implementation is very simple - Choose the first Invoker:</li>\n</ul>\n<pre><code>package com.demo.dubbo;\npublic class DemoLoadBalance implements LoadBalance {\n    @Override\n    public &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException {\n        System.out.println(&quot;[DemoLoadBalance]Select the first invoker...&quot;);\n        return invokers.get(0);\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Add a resource file</li>\n</ol>\n<p>Add a file:\n<code>src/main/resource/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>\nThis is a simple text file. The file contents are as follows:</p>\n<pre><code>demo=my=com.demo.dubbo.DemoLoadBalance\n</code></pre>\n<ol start=\"3\">\n<li>Configure to use custom LoadBalance</li>\n</ol>\n<pre><code>&lt;dubbo:reference id=&quot;helloService&quot; interface=&quot;com.demo.dubbo.api.IHelloService&quot; loadbalance=&quot;demo&quot; /&gt;\n</code></pre>\n<p>Configure  <code>&lt;loadbalance=&quot;demo&quot;&gt;</code> in <code>dubbo:reference</code> at the Consumer side.</p>\n<p>After 3 steps above, we wrote a custom LoadBalance and told Dubbo to use it. Start Dubbo and we can see that Dubbo has used a custom DemoLoadBalance.</p>\n",
-  "title": "Dubbo's Load Balance",
-  "keywords": "Dubbo, LoadBalance",
-  "description": "This article introduces you what is load balance and how load balance strategy is implemented in Dubbo."
+  "link": "/en-us/blog/dubbo-loadbalance.html",
+  "meta": {
+    "title": "Dubbo's Load Balance",
+    "keywords": "Dubbo, LoadBalance",
+    "description": "This article introduces you what is load balance and how load balance strategy is implemented in Dubbo."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-meetup-beijing-may-12th-2018.json b/en-us/blog/dubbo-meetup-beijing-may-12th-2018.json
index cef8c5b2..3cc8b545 100644
--- a/en-us/blog/dubbo-meetup-beijing-may-12th-2018.json
+++ b/en-us/blog/dubbo-meetup-beijing-may-12th-2018.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-meetup-beijing-may-12th-2018.md",
   "__html": "<h2>The first Dubbo meetup has been held in Beijing</h2>\n<p>The first Dubbo meetup has successfully been held in Beijing, over 400+ people were present. What a great event!</p>\n<p>Please enjoy the slides of the topics:</p>\n<ul>\n<li>Ian Luo: Dubbo's present and future (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/dubbo-present-and-future.pdf\">slides</a></li>\n<li>Jun Liu: Introduction to the 4th Aliware Performance Challenge (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/introduction-to-4th-aliware-performance-challenge.pdf\">slides</a></li>\n<li>Zhixuan Chen: Quickly building Microservice with Dubbo and Spring-boot (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/quickly-building-microservice-with-dubbo-and-springboot.pdf\">slides</a></li>\n<li>Xin Wang: Dubbo and Weidian's Practice on Microservice Architecture (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/dubbo-and-weidian's-practice-on-microservice-architecture.pdf\">slides</a></li>\n</ul>\n",
-  "title": "The first Dubbo meetup has been held in Beijing",
-  "keywords": "Dubbo, Beijing, meetup",
-  "description": "The first Dubbo meetup has been held in Beijing"
+  "link": "/en-us/blog/dubbo-meetup-beijing-may-12th-2018.html",
+  "meta": {
+    "title": "The first Dubbo meetup has been held in Beijing",
+    "keywords": "Dubbo, Beijing, meetup",
+    "description": "The first Dubbo meetup has been held in Beijing"
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.json b/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
index 3bdba099..d80340e7 100644
--- a/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
+++ b/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
   "__html": "<h2>Dubbo Shanghai meetup has been held successfully</h2>\n<p>The sencond Dubbo meetup has successfully been held in Shanghai, over 700 people submitted registration, and over 300 were present, more than 10,000 watched the live online. A great event again!</p>\n<p>Please enjoy the slides of the topics:</p>\n<ul>\n<li>Jerrick Zhu: Dubbo Status and Roadmap (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-status-and-roadmap.pdf\">slides</a></li>\n<li>Mercy Ma: Dubbo Cloud Native Practices and Thoughts (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-cloud-native-practices-and-thoughts.pdf\">slides</a></li>\n<li>Ping Guo: Nacos Open Source Initiative (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/nacos-open-source-initiative.pdf\">slides</a></li>\n<li>Zhiwei Pan: Dubbo Practices on Internet Finance Industries (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-practices-on-internet-finance-industries.pdf\">slides</a></li>\n</ul>\n",
-  "title": "Dubbo Shanghai meetup has been held successfully",
-  "keywords": "Dubbo, Shanghai, meetup",
-  "description": "Dubbo Shanghai meetup has been held successfully"
+  "link": "/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
+  "meta": {
+    "title": "Dubbo Shanghai meetup has been held successfully",
+    "keywords": "Dubbo, Shanghai, meetup",
+    "description": "Dubbo Shanghai meetup has been held successfully"
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-new-async.json b/en-us/blog/dubbo-new-async.json
index b723d828..e15369b9 100644
--- a/en-us/blog/dubbo-new-async.json
+++ b/en-us/blog/dubbo-new-async.json
@@ -1,7 +1,10 @@
 {
   "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 enhanced asynchronous programming is elaborated through several examples. Finally, it summarizes the new problems brought by the introduction of asynchronous mode and corresponding solutions from <a href=\"http://Dubbo.By\">Dubbo.By</a> reading this article, it is easy to implement a fully asynchronous remote service call chain based on Dubbo 2.7.0+.</p>\n<h2>Asynchronous mode before version 2.6.x</h2>\n<p>Dubbo Provides some asynchronous programming capabilities in 2.6.x and earlier versions, including <a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/async-call.html\">Asynchronous Call</a>, <a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/callback-parameter.html\">Parameter Callback</a> and <a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/events-notify.html\">Event Notification</a> on Consumer side. There are some brief introductions to the usage and Demo in the above document links.</p>\n<p>But the current asynchronous method has the following problems:</p>\n<ul>\n<li>Methods to access Future object are not direct enough.</li>\n<li>Future interface cannot implement automatic callback. Customized ResponseFuture class could implement callback, however it only supports limited asynchronous scenes. For example, it does not support mutual coordination or combination between Future objects.</li>\n<li>Asynchronization on Provider side is not supported.</li>\n</ul>\n<p>Take the asynchronous method of Consumer side as an example:</p>\n<ol>\n<li>Define a original synchronous interface and add the declaration to support asynchronous calls.</li>\n</ol>\n<pre><code>public interface FooService {\n    String findFoo(String name);\n}\n</code></pre>\n<pre><code>&lt;dubbo:reference id=&quot;fooService&quot; interface=&quot;com.alibaba.foo.FooService&quot;&gt;\n      &lt;dubbo:method name=&quot;findFoo&quot; async=&quot;true&quot; /&gt;\n&lt;/dubbo:reference&gt;\n</code></pre>\n<ol start=\"2\">\n<li>Obtain Future object through RpcContext.</li>\n</ol>\n<pre><code>// this call will return null immediately\nfooService.findFoo(fooId);\n// Obtain the Future instance. When the result is returned, Future instance will be notified and the result will be set to Future instance.\nFuture&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture();\nfooFuture.get();\n</code></pre>\n<p>or</p>\n<pre><code>// this call will return null immediately\nfooService.findFoo(fooId);\n// get Dubbo's built-in ResponseFuture, and set the callback\nResponseFuture future = ((FutureAdapter)RpcContext.getContext().getFuture()).getFuture();\nfuture.setCallback(new ResponseCallback() {\n    @Override\n    public void done(Object response) {\n        System.out.print(response);\n    }\n\n    @Override\n    public void caught(Throwable exception) {\n        exception.printStackTrace();\n    }\n});\n</code></pre>\n<p>From this simple example, we can see there are some inconveniences in use:</p>\n<ol>\n<li>The synchronization interface of findFoo cannot directly return a Future object representing the asynchronous result, which is further obtained through RpcContext.</li>\n<li>Future object can only be obtained from get method that will block until getting the result.</li>\n<li>Callback can be set by getting the built-in ResponseFuture interface. However, the API to obtain ResponseFuture is not convenient enough to support other asynchronous scenes except callback. For example, it does not support the scene where multiple Future objects work together.</li>\n</ol>\n<h2>Enhancement based on CompletableFuture in version 2.7.0</h2>\n<p>People who understand the evolution history of Future in Java should know that the Future used in Dubbo 2.6.x and earlier versions is introduced in Java 5, so there are some problems in function design.The CompletableFuture introduced in Java 8 further enriches the Future interface and solves these problems well.</p>\n<p>Support for Java 8 has been upgraded in Dubbo 2.7.0, and Dubbo has enhanced the current asynchronous functionality based on CompletableFuture.</p>\n<ol>\n<li>\n<p>Now it supports direct definition of service interfaces that return CompletableFuture. Through these interfaces, we can implement asynchronous programming on both Consumer side and Provider side more naturally.</p>\n<pre><code>public interface AsyncService {\n    CompletableFuture&lt;String&gt; sayHello(String name);\n}\n</code></pre>\n</li>\n<li>\n<p>If you don't want to define the return value of the interface as a Future object, or if there is a defined synchronization interface, you can additionally define an asynchronous interface and provide a method to return a Future object.</p>\n<pre><code>public interface AsyncService {\n    CompletableFuture&lt;String&gt; sayHello(String name);\n}\n</code></pre>\n<pre><code>@AsyncFor(AsyncService.class)\npublic interface GrettingServiceAsync extends GreetingsService {\n    CompletableFuture&lt;String&gt; sayHiAsync(String name);\n}\n</code></pre>\n<p>In this way, Provider can only implement the sayHi method. The Consumer can get a Future instance by directly calling sayHiAsync, and Dubbo framework will convert it to a call to the sayHi method on the Provider side automatically.</p>\n<p>Providing an asynchronous method definition for each synchronization method can be inconvenient. Further, using <a href=\"https://github.com/dubbo/dubbo-async-processor\">Annotation Processor implementation</a> in the Dubbo ecosystem can automatically generate asynchronous method definitions for us.</p>\n</li>\n<li>\n<p>Similarly, if your original interface definition doesn't return a Future object, the Provider side also provides a programming interface similar to the Async Servlet in Servlet 3.0 to support asynchronization : <code>RpcContext.startAsync()</code>.</p>\n<pre><code>public interface AsyncService {\n    String sayHello(String name);\n}\n</code></pre>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public String sayHello(String name) {\n        final AsyncContext asyncContext = RpcContext.startAsync();\n        new Thread(() -&gt; {\n            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);\n        }).start();\n        return null;\n    }\n}\n</code></pre>\n<p>At the beginning of the method body, it starts asynchronization by running <code>RpcContext.startAsync()</code> , and it starts a new thread to execute the business logic asynchronously. After the time-consuming operation is completed, the result is written back by <code>asyncContext.write</code>.</p>\n</li>\n<li>\n<p>RpcContext returns CompletableFuture directly.</p>\n<pre><code>CompletableFuture&lt;String&gt; f = RpcContext.getContext().getCompletableFuture();\n</code></pre>\n</li>\n</ol>\n<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>\n<p>Next, let's illustrate how to implement a fully asynchronous Dubbo service call chain through a few examples.</p>\n<h2>example 1:CompletableFuture interface</h2>\n<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/samples-for-2.7.0-SNAPSHOT/dubbo-samples-async-original-future\">dubbo-samples-async-original-future</a>.</p>\n<ol>\n<li>\n<p>Interface definition</p>\n<pre><code>public interface AsyncService {\n    CompletableFuture&lt;String&gt; sayHello(String name);\n}\n</code></pre>\n<p>Note that the return type of this interface is <code>CompletableFuture&lt;String&gt;</code>.</p>\n</li>\n<li>\n<p>Provider Side</p>\n<ul>\n<li>\n<p>Implementation</p>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public CompletableFuture&lt;String&gt; sayHello(String name) {\n        return CompletableFuture.supplyAsync(() -&gt; {\n            try {\n                Thread.sleep(5000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            return &quot;async response from provider.&quot;;\n        });\n    }\n}\n</code></pre>\n<p>We can see that the business code is switched to be executed in the new thread by supplyAsync, so the Provider side is asynchronous.</p>\n</li>\n<li>\n<p>Config</p>\n<pre><code>&lt;bean id=&quot;asyncService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&quot;/&gt;\n&lt;dubbo:service interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot; ref=&quot;asyncService&quot;/&gt;\n</code></pre>\n<p>The Config is the same as the original interface.</p>\n</li>\n</ul>\n</li>\n<li>\n<p>Consumer Side</p>\n<ul>\n<li>Config</li>\n</ul>\n<pre><code>&lt;dubbo:reference id=&quot;asyncService&quot; timeout=&quot;10000&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot;/&gt;\n</code></pre>\n<p>​\tThe Config is the same as the original interface.</p>\n<ul>\n<li>Call remote service</li>\n</ul>\n<pre><code>public static void main(String[] args) throws Exception {\n        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});\n        context.start();\n        final AsyncService asyncService = (AsyncService) context.getBean(&quot;asyncService&quot;);\n    \n        CompletableFuture&lt;String&gt; future = asyncService.sayHello(&quot;async call request&quot;);\n        future.whenComplete((v, t) -&gt; {\n            if (t != null) {\n                t.printStackTrace();\n            } else {\n                System.out.println(&quot;Response: &quot; + v);\n            }\n        });\n        System.out.println(&quot;Executed before response return.&quot;);\n        System.in.read();\n    }\n</code></pre>\n<p><code>CompletableFuture&lt;String&gt; future = asyncService.sayHello(&quot;async call request&quot;);</code>It is convenient to return the Future instance, which implements the asynchronous service call on the Consumer side.</p>\n</li>\n</ol>\n<h2>Example 2:Synchronous interface uses Annotation Processor</h2>\n<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/samples-for-2.7.0-SNAPSHOT/dubbo-samples-async-generated-future\">dubbo-samples-async-generated-future</a>.</p>\n<ol>\n<li>\n<p>Interface definition</p>\n<pre><code>@DubboAsync\npublic interface GreetingsService {\n    String sayHi(String name);\n}\n</code></pre>\n<p>This is a generic definition of the Dubbo service interface. Note that add the @DubboAsync annotation when using Annotation Processor.</p>\n<pre><code>&lt;dependency&gt;\n    &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n    &lt;artifactId&gt;dubbo-async-processer&lt;/artifactId&gt;\n    &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;\n&lt;/dependency&gt;\n&lt;plugin&gt;\n    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n    &lt;version&gt;3.7.0&lt;/version&gt;\n    &lt;configuration&gt;\n        &lt;source&gt;1.8&lt;/source&gt;\n        &lt;target&gt;1.8&lt;/target&gt;\n        &lt;annotationProcessorPaths&gt;\n            &lt;path&gt;\n                &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n                &lt;artifactId&gt;dubbo-async-processer&lt;/artifactId&gt;\n                &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;\n            &lt;/path&gt;\n        &lt;/annotationProcessorPaths&gt;\n    &lt;/configuration&gt;\n&lt;/plugin&gt;\n</code></pre>\n<p>The above config is the Maven dependency that imports dubbo-async-processer processor. Developers who define interfaces (providing APIs) usually add the above dependencies to the project, so that when doing API packaging, the following interface definitions will be automatically generated in APIs:</p>\n<pre><code>/**\n* Generated by dubbo-async-processer\n*/\npackage com.alibaba.dubbo.samples.api;\nimport java.util.concurrent.CompletableFuture;\n@javax.annotation.Generated(&quot;com.alibaba.dubbo.async.processor.AsyncAnnotationProcessor&quot;)\n@org.apache.dubbo.common.config.AsyncFor(com.alibaba.dubbo.samples.api.GreetingsService.class)\npublic interface GreetingsServiceAsync extends GreetingsService {\nCompletableFuture&lt;java.lang.String&gt; sayHiAsync(java.lang.String name);\n}\n</code></pre>\n</li>\n<li>\n<p>Provider side</p>\n<ul>\n<li>Config</li>\n</ul>\n<pre><code>&lt;bean id=&quot;greetingsService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.GreetingsServiceImpl&quot;/&gt;\n&lt;dubbo:service interface=&quot;com.alibaba.dubbo.samples.api.GreetingsService&quot; ref=&quot;greetingsService&quot;/&gt;\n</code></pre>\n<ul>\n<li>Service implementation</li>\n</ul>\n<pre><code>public class GreetingsServiceImpl implements GreetingsService {\n    @Override\n    public String sayHi(String name) {\n        return &quot;hi, &quot; + name;\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>Consumer side</p>\n<ul>\n<li>Config</li>\n</ul>\n<pre><code> &lt;dubbo:reference id=&quot;greetingsService&quot; interface=&quot;com.alibaba.dubbo.samples.api.GreetingsServiceAsync&quot;/&gt;\n</code></pre>\n<p>Note that the service interface uses <strong>GreetingsServiceAsync</strong></p>\n<ul>\n<li>Service call</li>\n</ul>\n<pre><code> public static void main(String[] args) throws Exception {\n        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});\n        context.start();\n\n        GreetingsServiceAsync greetingsService = (GreetingsServiceAsync) context.getBean(&quot;greetingsService&quot;);\n        CompletableFuture&lt;String&gt; future = greetingsService.sayHiAsync(&quot;async call reqeust&quot;);\n        System.out.println(&quot;async call ret :&quot; + future.get());\n     \n        System.in.read();\n    }\n</code></pre>\n<p>In this way, we can use <code>CompletableFuture&lt;String&gt; future = greetingsService.sayHiAsync(&quot;async call reqeust&quot;);</code> directly,and return CompletableFuture.</p>\n</li>\n</ol>\n<h2>Example 3:Use AsyncContext</h2>\n<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/samples-for-2.7.0-SNAPSHOT/dubbo-samples-async-provider\">dubbo-samples-async-provider</a>.</p>\n<ol>\n<li>\n<p>Interface definition</p>\n<pre><code>public interface AsyncService {\n    String sayHello(String name);\n}\n</code></pre>\n</li>\n<li>\n<p>Provider side</p>\n<ul>\n<li>Config</li>\n</ul>\n<pre><code>&lt;bean id=&quot;asyncService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&quot;/&gt;\n&lt;dubbo:service async=&quot;true&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot; ref=&quot;asyncService&quot;/&gt;\n</code></pre>\n<p>Note that adding <code>async=&quot;true&quot;</code> indicates that this is a service that starts the Provider-side execution asynchronously.</p>\n<ul>\n<li>Asynchronous execution implementation</li>\n</ul>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public String sayHello(String name) {\n        final AsyncContext asyncContext = RpcContext.startAsync();\n        new Thread(() -&gt; {\n            asyncContext.signalContextSwitch();\n            try {\n                Thread.sleep(500);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);\n        }).start();\n        return null;\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>Consumer side</p>\n<ul>\n<li>Config</li>\n</ul>\n<pre><code>&lt;dubbo:reference id=&quot;asyncService&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot;/&gt;\n</code></pre>\n<ul>\n<li>Service call</li>\n</ul>\n<pre><code> public static void main(String[] args) throws Exception {\n        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});\n        context.start();\n\n        AsyncService asyncService = (AsyncService) context.getBean(&quot;asyncService&quot;);\n        System.out.println(asyncService.sayHello(&quot;async call request&quot;));\n     \n        System.in.read();\n    }\n</code></pre>\n</li>\n</ol>\n<h2>New problems resulted from asynchronization</h2>\n<h3>Filter Chain</h3>\n<p>The following is a complete Filter chain for a normal Dubbo call.</p>\n<p>After using the asynchronous call, since the asynchronous result is executed separately in the asynchronous thread, the Result passed through the second half of the Filter chain is null, and the real result cannot be processed by the Filter chain when it is returned.</p>\n<p>In order to solve this problem, PostProcessFilter and AbstractPostProcessFilter were introduced in Dubbo 2.7.0. The PostProcessFilter interface extends from the Filter interface, and AbstractPostProcessFilter is an abstract implementation of PostProcessFilter.</p>\n<p>The following is an example of extending the Filter and supporting the asynchronous Filter chain.</p>\n<pre><code>@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})\npublic class AsyncPostprocessFilter extends AbstractPostProcessFilter {\n\n    @Override\n    public Result invoke(Invoker&lt;?&gt; invoker, Invocation invocation) throws RpcException {\n        return postProcessResult(invoker.invoke(invocation), invoker, invocation);\n    }\n\n    @Override\n    protected Result doPostProcess(Result result, Invoker&lt;?&gt; invoker, Invocation invocation) {\n        System.out.println(&quot;Filter get the return value: &quot; + result.getValue());\n        return result;\n    }\n}\n</code></pre>\n<h3>Context passing</h3>\n<p>Currently, the context we are considering mainly refers to the data stored in the RpcContext. In most scenarios, the user needs to complete the passing of the Context before switching the service thread.</p>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    // Save the context of the current thread\n    RpcContext context = RpcContext.getContext();\n    public CompletableFuture&lt;String&gt; sayHello(String name) {\n        return CompletableFuture.supplyAsync(() -&gt; {\n            // Set context into new thread\n            RpcContext.setContext(context);\n            try {\n                Thread.sleep(5000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            return &quot;async response from provider.&quot;;\n        });\n    }\n}\n</code></pre>\n<p>However, AsyncContext also provides the signalContextSwitch() method for a convenient Context switch.</p>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public String sayHello(String name) {\n        final AsyncContext asyncContext = RpcContext.startAsync();\n        new Thread(() -&gt; {\n            asyncContext.signalContextSwitch();\n            try {\n                Thread.sleep(500);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);\n        }).start();\n        return null;\n    }\n}\n</code></pre>\n",
-  "title": "How to implement a fully asynchronous calls chain based on Dubbo",
-  "keywords": "Dubbo, asynchronous, async chain",
-  "description": "This article recalls how asynchronous call is implemented in Dubbo 2.6.x, and introduces the new way based on CompletableFuture in 2.7.0."
+  "link": "/en-us/blog/dubbo-new-async.html",
+  "meta": {
+    "title": "How to implement a fully asynchronous calls chain based on Dubbo",
+    "keywords": "Dubbo, asynchronous, async chain",
+    "description": "This article recalls how asynchronous call is implemented in Dubbo 2.6.x, and introduces the new way based on CompletableFuture in 2.7.0."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo-zk.json b/en-us/blog/dubbo-zk.json
index 1a7ddce6..bbbd96cb 100644
--- a/en-us/blog/dubbo-zk.json
+++ b/en-us/blog/dubbo-zk.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-zk.md",
   "__html": "<h1>Using Zookeeper in Dubbo</h1>\n<h2>Introduction of Zookeeper</h2>\n<h3>The basic concept</h3>\n<p>In the mordern distrbuted applications, there are multiple coordination problems between nodes and nodes, including: leader election, group service, locking, configuration management, naming and synchronization. Apache Zookeeper, as its name implied, is a distributed, open-source coordination service framwork to address these demand.</p>\n<p>In order to ensure the high performance, highly available and strictly ordered access, the performance aspects of ZooKeeper means it can be used in large, distributed systems and can also be deployed in cluster mode, which called 'ZooKeeper ensemble'. In ZooKeeper ensemble, all write requests from clients are forwarded to a single server, called the leader, through the ZAB(Zookeeper Atomic Broadcast Protocol) to make sure the message in each nodes are same. Clients can access any one of the clusters to read and write data without worrying about inconsistencies in the data.</p>\n<p><img src=\"../../img/blog/zk-emsemble.png\" alt=\"Diagram shows client-server architecture of ZooKeeper\">\n<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O'Reilly</em></p>\n<p>The method to store the data in Zookeeper is similar as the standard UNIX file system, as a data model styled after the familiar directory tree structure of file systems. When we talking about ZooKeeper data nodes, we call it Znodes to clarify it.</p>\n<p><img src=\"../../img/blog/zk-tree.png\" alt=\"zk-tree\">\n<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O'Reilly</em></p>\n<h3>Basic Implementation</h3>\n<p>You could donwload and install Zookeeper directly<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>.\nOr you could use Homebrew <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> <code>brew install zookeeper</code> to install Zookeeper in Mac OS.\nConsidering the versatility, we run the Zookeeper by using docker in this blog. If you have not installed the docker yet, please prepare the docker environment first. <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup></p>\n<h4>1. Running the Zookeeper</h4>\n<p>Execute the command to run zookeeper in a docker container</p>\n<pre><code class=\"language-shell\">docker run --rm --name zookeeper -p 2181:2181 zookeeper\n</code></pre>\n<h4>2. Entering the zookeeper container</h4>\n<pre><code class=\"language-shell\">docker exec -it zookeeper bash\n</code></pre>\n<p>In the <code>bin</code> directory, there is a command to start zookeeper <code>zkServer</code> and the Management Console <code>zkCli</code></p>\n<pre><code class=\"language-shell\">bash-4.4# ls -l bin\ntotal 36\n-rwxr-xr-x    1 zookeepe zookeepe       232 Mar 27 04:32 README.txt\n-rwxr-xr-x    1 zookeepe zookeepe      1937 Mar 27 04:32 zkCleanup.sh\n-rwxr-xr-x    1 zookeepe zookeepe      1056 Mar 27 04:32 zkCli.cmd\n-rwxr-xr-x    1 zookeepe zookeepe      1534 Mar 27 04:32 zkCli.sh\n-rwxr-xr-x    1 zookeepe zookeepe      1759 Mar 27 04:32 zkEnv.cmd\n-rwxr-xr-x    1 zookeepe zookeepe      2696 Mar 27 04:32 zkEnv.sh\n-rwxr-xr-x    1 zookeepe zookeepe      1089 Mar 27 04:32 zkServer.cmd\n-rwxr-xr-x    1 zookeepe zookeepe      6773 Mar 27 04:32 zkServer.sh\n</code></pre>\n<h4>3. Entering the zookeeper management interface via zkCli</h4>\n<p>Since it was started through docker, the process of Zookeeper has been started and will provide the services to the public via port 2181.</p>\n<pre><code class=\"language-shell\">bash-4.4# ps\nPID   USER     TIME  COMMAND\n    1 zookeepe  0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root\n   32 root      0:00 bash\n   42 root      0:00 ps\n</code></pre>\n<p>So, it allows you to access Zookeeper's console directly through <code>zkCli</code> for management.</p>\n<pre><code class=\"language-shell\">bash-4.4# bin/zkCli.sh -server 127.0.0.1:2181\nConnecting to 127.0.0.1:2181\n...\nWATCHER::\n\nWatchedEvent state:SyncConnected type:None path:null\n\n[zk: 127.0.0.1:2181(CONNECTED) 0] help\nZooKeeper -server host:port cmd args\n\tstat path [watch]\n\tset path data [version]\n\tls path [watch]\n\tdelquota [-n|-b] path\n\tls2 path [watch]\n\tsetAcl path acl\n\tsetquota -n|-b val path\n\thistory\n\tredo cmdno\n\tprintwatches on|off\n\tdelete path [version]\n\tsync path\n\tlistquota path\n\trmr path\n\tget path [watch]\n\tcreate [-s] [-e] path data acl\n\taddauth scheme auth\n\tquit\n\tgetAcl path\n\tclose\n\tconnect host:port\n</code></pre>\n<h4>4. Basic Examples on zkCli</h4>\n<p>Create <code>/hello-zone</code> node:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 19] create /hello-zone 'world'\nCreated /hello-zone\n</code></pre>\n<p>List the child nodes under <code>/</code> and confirm that <code>hello-zone</code> is created:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 20] ls /\n[zookeeper, hello-zone]\n</code></pre>\n<p>List the child nodes for <code>/hello-zone</code> and verify that it is empty:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 21] ls /hello-zone\n[]\n</code></pre>\n<p>Get the data stored on the <code>/hello-zone</code> node:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 22] get /hello-zone\nworld\n</code></pre>\n<h2>Using Zookeeper in Dubbo</h2>\n<p>Zookeeper is used for service registration discovery and configuration management in Dubbo, and the structure of data in Zookeeper is shown in the following figure:</p>\n<p><img src=\"../../img/blog/dubbo-in-zk.jpg\" alt=\"dubbo-in-zk\"></p>\n<p>First, all data related to Dubbo is organized under the root node of <code>/duboo</code>.</p>\n<p>The secondary directory is the service name like <code>com.foo.BarService</code>.</p>\n<p>The three-level directory has two child nodes, <code>providers</code> and <code>consumers</code>, representing the supplier and customers of the service.</p>\n<p>The URL information for each application instance associated with the service will be recorded by the Level 4 directory. The <code>providers</code> and <code>consumer</code> will stored the providers information and the consumers information of the services seperately.<br>\nFor example, the service provider of <code>com.foo.BarService</code>  will register its URL Information to <code>/dubbo/com.foo.BarService/providers</code>; Similarly, service consumers will register their information under the corresponding <code>consumer</code> node. At the same time, consumers will subscribe to the corresponding <code>providers</code> node to be able to detect the changes of the service provider address list.</p>\n<h3>Prepare the sample code</h3>\n<p>The code in this document can be found in <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-zookeeper\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-zookeeper</a>.</p>\n<h4>1. Interface definition</h4>\n<p>Define a simple <code>greetingservice</code> interface with only one simple method named <code>sayHello</code> to greet to the caller.</p>\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\">GreetingService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h4>2. Server: Implementation</h4>\n<p>Implement the <code>GreetingService</code>  interface and mark it as a service for Dubbo via <code>@Service</code>.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotatedGreetingService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + name;\n    }\n}\n</code></pre>\n<h4>3. Server: Assembly</h4>\n<p>Define ProviderConfiguration to assemble Dubbo services.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.impl\"</span>)\n<span class=\"hljs-meta\">@PropertySource</span>(<span class=\"hljs-string\">\"classpath:/spring/dubbo-provider.properties\"</span>)\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderConfiguration</span> </span>{}\n</code></pre>\n<p>Dubbo-provider.properties is an external configuration in a spring application, as follows:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">demo-provider</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">zookeeper://$DOCKER_HOST:2181</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">20880</span>\n</code></pre>\n<p>Since zookeeper runs in a docker container, please be noted that:</p>\n<ul>\n<li>We assumes that Dubbo applications is running on the host machine (outside the docker container) in this document, and  needs to replace the PATH of Zookeeper with the IP address of the Environment Variable <em>${DOCKER_HOST}</em>. Please find more detail in the official Docker documentation.</li>\n<li>When the Dubbo application is a docker application, the container's name is equivalent to Zookeeper's. The container's name is ** zookeeper ** in this document.</li>\n<li>Of course, if you don't want to run the Zookeeper in a container mode, just simply replace <em>$DOCKER_HOST</em> with <strong>localhost</strong>.</li>\n</ul>\n<h4>4. Server: Starting Service</h4>\n<p>In the <code>main</code> method, you could provide the Dubbo service by running a Spring Context.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class);\n        context.start();\n        System.in.read();\n    }\n}\n</code></pre>\n<p>Start the <code>main</code> method of server,  you will get the following output, which represents the success of the server's startup, and  the <code>GreetingService</code> service is registered on the ZookeeperRegistry:</p>\n<pre><code class=\"language-sh\">[03/08/18 10:50:33:033 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=<span class=\"hljs-literal\">true</span>&amp;application=demo-provider&amp;dubbo=2.6.2&amp;generic=<span class=\"hljs-literal\">false</span>&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=12938&amp;side=provider&amp;timestamp=1533264631849, dubbo version: 2.6.2, current host: 192.168.99.1\n</code></pre>\n<p>You could find the registration information of the service provider through the Zookeeper management terminal:</p>\n<pre><code class=\"language-sh\">$ docker <span class=\"hljs-built_in\">exec</span> -it zookeeper bash\nbash-4.4<span class=\"hljs-comment\"># bin/zkCli.sh -server localhost:218</span>\nConnecting to localhost:2181\n...\nWelcome to ZooKeeper!\nJLine support is enabled\n...\n[zk: localhost:2181(CONNECTED) 0] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/providers\n[dubbo%3A%2F%2F192.168.99.1%3A20880%2Fcom.alibaba.dubbo.samples.api.GreetingService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.6.2%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D12938%26side%3Dprovider%26timestamp%3D1533264631849]\n</code></pre>\n<p>You could find that the Dubbo services just registered its URL address at the <code>providers</code> node as follows:\n<em>dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=true&amp;application=demo-provider&amp;dubbo=2.6.2&amp;generic=false&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=12938&amp;side=provider&amp;timestamp=1533264631849</em></p>\n<h4>5. Client: Reference Service</h4>\n<p>You could declare the reference service by @Reference, while it will generate a full call. The target address of the service could be queried by the Zookeeper's <code>provider</code> node.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Component</span>(<span class=\"hljs-string\">\"annotatedConsumer\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceConsumer</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>\n    <span class=\"hljs-keyword\">private</span> GreetingService greetingService;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">doSayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> greetingService.sayHello(name);\n    }\n}\n</code></pre>\n<h4>6. Client: Assembling</h4>\n<p>Define the ConsumerConfiguration to assemble Dubbo service.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>)\n<span class=\"hljs-meta\">@PropertySource</span>(<span class=\"hljs-string\">\"classpath:/spring/dubbo-consumer.properties\"</span>)\n<span class=\"hljs-meta\">@ComponentScan</span>(value = {<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>})\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerConfiguration</span> </span>{}\n</code></pre>\n<p>&quot;dubbo-consumer.properties&quot; is a method of external configuration in a Spring application, as follows:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">demo-consumer</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">zookeeper://$DOCKER_HOST:2181</span>\n<span class=\"hljs-meta\">dubbo.consumer.timeout</span>=<span class=\"hljs-string\">3000</span>\n</code></pre>\n<p>Same as <strong>3. Server: Assembling</strong>, You need to modify <em>$DOCKER_HOST</em> defined in <em>dubbo.registry.address</em> according to your own  environment. You could find more instructions in step 3.</p>\n<h4>7. Client: Initiating A Remote Call</h4>\n<p>Run <code>main</code> to initiate a remote call from a existed service provider. Dubbo first subscribes to the zookeeper service address and then selects one from the list of returned addresses to invoke the client:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerBootstrap</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);\n        context.start();\n        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class);\n        String hello = greetingServiceConsumer.doSayHello(<span class=\"hljs-string\">\"zookeeper\"</span>);\n        System.out.println(<span class=\"hljs-string\">\"result: \"</span> + hello);\n        System.in.read();\n    }\n}\n</code></pre>\n<p>The output are as follows:</p>\n<pre><code class=\"language-shell\">[03/08/18 01:42:31:031 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Register: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&amp;category=consumers&amp;check=false&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=82406&amp;side=consumer&amp;timestamp=1533274951195, dubbo version: 2.6.2, current host: 192.168.99.1 #1\n[03/08/18 01:42:31:031 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Subscribe: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&amp;category=providers,configurators,routers&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=82406&amp;side=consumer&amp;timestamp=1533274951195, dubbo version: 2.6.2, current host: 192.168.99.1 #2\n...\nresult: hello, zookeeper\n</code></pre>\n<p>Description:</p>\n<ol>\n<li><strong>Register</strong>: consumer://192.168.99.1/...&amp;<strong>category=consumers</strong>&amp;: In Zookeeper, consumers could register their information and store it at the <code>consumers</code> node</li>\n<li><strong>Subscribe</strong>: consumer://192.168.99.1/...&amp;<strong>category=providers,configurators,routers</strong>&amp;:Consumers subscribe <code>providers</code>, <code>configurators</code>, <code>routers</code> from Zookeepers. The <code>configurations</code> is related to the Dubbo configuration, and <code>routers</code> is related to routing rules. The providers node subscription should be noted. When a new service provider to join, due to the relationship between the subscription, the new address list will be pushed to the subscriber. So service consumers also dynamically perceive changes in address lists.</li>\n</ol>\n<p>You could find the registration information of the service provider through the Zookeeper management terminal:</p>\n<pre><code class=\"language-sh\">$ docker <span class=\"hljs-built_in\">exec</span> -it zookeeper bash\nbash-4.4<span class=\"hljs-comment\"># bin/zkCli.sh -server localhost:218</span>\nConnecting to localhost:2181\n...\nWelcome to ZooKeeper!\nJLine support is enabled\n...\n[zk: localhost:2181(CONNECTED) 4] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/consumers\n[consumer%3A%2F%2F192.168.99.1%2Fcom.alibaba.dubbo.samples.api.GreetingService%3Fapplication%3Ddemo-consumer%26category%3Dconsumers%26check%3Dfalse%26default.timeout%3D3000%26dubbo%3D2.6.2%26interface%3Dcom.alibaba.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D82406%26side%3Dconsumer%26timestamp%3D1533274951195]\n</code></pre>\n<p>You could see that  consumers of Dubbo's servicehas registered its URL address at the <code>consumers</code> node:</p>\n<p><em>consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&amp;category=providers,configurators,routers&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=82406&amp;side=consumer&amp;timestamp=1533274951195</em></p>\n<h2>Summary</h2>\n<p>This document focuses on how to use ZooKeeper as a registry in Dubbo. This document also mentioned that the Zookeeper could be a configuration center and a service management in Dubbo. Zookeeper is a single-node, standalone mode. However, developers always bulid a Zookeeper server cluster called * Zookeeper ensemble * in the real world.</p>\n<p>Through this document, readers can learn:</p>\n<ul>\n<li>Basic concepts and applications of ZooKeeper</li>\n<li>The function of Zookeeper in Dubbo application</li>\n<li>Learn about Zookeeper's interaction through practical sample codes</li>\n<li>The storage of service registration and consumption information of Dubbo with ZooKeeper</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><a href=\"https://www.apache.org/dyn/closer.cgi/zookeeper/\">https://www.apache.org/dyn/closer.cgi/zookeeper/</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"https://brew.sh\">https://brew.sh</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p><a href=\"https://www.docker.com/community-edition\">https://www.docker.com/community-edition</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
-  "title": "Using Zookeeper in Dubbo",
-  "keywords": "Dubbo, registry center, Zookeeper, ZK",
-  "description": "This article introduces basic concepts of Zookeeper, and how to use Zookeeper as a registry center."
+  "link": "/en-us/blog/dubbo-zk.html",
+  "meta": {
+    "title": "Using Zookeeper in Dubbo",
+    "keywords": "Dubbo, registry center, Zookeeper, ZK",
+    "description": "This article introduces basic concepts of Zookeeper, and how to use Zookeeper as a registry center."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/dubbo2-js.json b/en-us/blog/dubbo2-js.json
index dbcf4d09..05265511 100644
--- a/en-us/blog/dubbo2-js.json
+++ b/en-us/blog/dubbo2-js.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo2-js.md",
   "__html": "<h1>Implementation of cross-language calls by Dubbo2.js</h1>\n<blockquote>\n<p><a href=\"https://github.com/dubbo/dubbo2.js\">dubbo2.js</a> is a Dubbo client for node.js developped by <a href=\"https://www.qianmi.com/\">Qianmiwang</a>. It supports Dubbo's native protocol, which makes the RPC calls between javascript and java efficient and agile. This tool has been contributed to Dubbo's community.</p>\n</blockquote>\n<h2>Cross-language calls for micro service</h2>\n<p>Nowadays, Internet architecture tends to be micro-service way. The discussions about micro-service architecture becomes the most mentioned topic in different technical conferences. In China, most of the companies, such as Qianmiwang, choose Dubbo as their micro-servie architecture solution. As most of the internet companies, Qianmiwang uses various of programming languages. Java is for most of the backend services. Each business based on these backend can choose its own programming language such as go, python and javascript. Therefore, here comes a challenge, cross language calls. Some well mentioned solutions are as follows:</p>\n<ul>\n<li>Spring cloud. Spring cloud provides a set of components for micro-service development. It is based on HTTP protocol and is designed in the restful way, which makes it support cross-language calls. Other languages can call the services simply by implementing an HTTP interface.</li>\n<li>Service mesh. People call service mesh the next generation of micro-service framework. The core of this solution is SideCar. Even though the concept of SideCar changes a lot during the revolution of Service mesh, its main job never changed: providing reliable communication between different services.</li>\n<li>Motan. <a href=\"https://github.com/weibocom/motan\">Motan</a> is an open source cross-language service framework developped by Sina Weibo. Its early version only supports motan-java. However, as the new versions come out, more languages are supported in order to handle the cross-language problem. Its newest version(1.1.0) provides motan-go, motan-php, motan-openresty, etc. Similar to SideCar in Service mesh, Motan forwards messages by mortan-go, which can be considered as an agent. Meanwhile, motan2, its own protocol, is built for cross-language calls.</li>\n</ul>\n<p>According to the solutions below, there are two ways to solve the cross-language calls problem:</p>\n<ul>\n<li>communicating by a common protocol.</li>\n<li>implementing an agent as a protocol adapter.</li>\n</ul>\n<p>When a new team is choosing technical solutions, what I mentioned below could be our candidates. Meanwhile, the old system's compatibility and migration costs should also be considered. The first trial we did is to work on RPC protocol.</p>\n<h2>Cross-language calls by a common protocol</h2>\n<h3>SpringMVC</h3>\n<p><img src=\"../../img/blog/springmvc.png\" alt=\"springmvc\"></p>\n<p>Before achieving the real cross-language calls, the most common solution is to use the http protocol. We can call Dubbo provider indirectly by controller/restController provided by springmvc. This is easy to carry out, but there are lots of inconveniences. firstly, a call will go through too many nodes. Secondly, an extra communication layer (for http protocol) will be involved, but it could have been handled simply by the TCP protocol. Thirdly, we need to implement the RPC interface in the controller part. This will be extra work for developers.</p>\n<h3>We support some common protocols</h3>\n<p>Most of the service management frameworks support multiple protocols, dubbo as well. Besides its own protocol, the common protocols such as Dangdangwang's <a href=\"https://dangdangdotcom.github.io/dubbox/rest.html\">Rest</a> protocol and Qianmiwang's <a href=\"https://github.com/apache/incubator-dubbo-rpc-jsonrpc\">json-rpc</a> protocol are also supported.</p>\n<p>The developers getting used to traditional RPC interfaces might feel uncomfortable while working on restful RPC interfaces. On the one hand, this is not good for rebuilding new interfaces. On the other hand, restful style might make these interfaces incompatible with the other protocols used by old interfaces. Of course, if there is no old system problems, using Rest protocol is the easiest implementation of cross-language calls, since most of the languages support it.</p>\n<p>Even if Dubbo has tried on restful interface, the difference between rest architecture and RPC architecture should not be ignored. Rest architecture defines each resources, and it needs basic operations of http protocols such as GET, POST, DELETE, PUT. In my opinion, a Rest protocol is more for calls between different systems on the internet, while RPC is suitable for inner system calls. Similar to Rest protocol, json-rpc is also implemented by text sequence and http protocol. Using json-rpc can also solve the cross-language problems, meanwhile, it makes our solution compatible with old interfaces and there is no need to adapt to the restful style.</p>\n<p>Json-rpc is Qianmiwang's early solution for cross-language protocol. They open-sourced their <a href=\"https://github.com/dubbo/dubbo-client-py\">dubbo-client-py</a> and <a href=\"https://github.com/QianmiOpen/dubbo-node-client\">dubbo-node-client</a>, two clients based on json-rpc protocol. With these tools, we can easily call the rpc services provided by dubbo-provider-java with while using python or node.js. The inner system calls for java services are still mainly implemented by Dubbo protocol. In addition, in order to adapt the old system, two protocols could be configured.</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jsonrpc\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n</code></pre>\n<h3>Customized Protocols for Cross-language Support</h3>\n<p>The so-called protocol of the microservice framework can be simply interpreted as: message format and serialization scheme. Generally, the service governance framework would provide numbers of protocol configuration items for users to choose from. In addition to the above two common protocols,there exists some other customized protocols like the dubbo protocol, the default protocol for the dubbo framework, and Motan2, a cross-language protocol provided by the motan framework.</p>\n<h4>Motan2 for cross-language support</h4>\n<p><img src=\"../../img/blog/motan-protocol-en.png\" alt=\"motan2\"></p>\n<p>In the original Motan protocol, the protocol message consisted only of the Header and the Body, making deserialization indispensable for acquiring data stored in the Body, like path, param and group, which is terribly unfriendly for cross-language support. Therefore, the content of the protocol was modifiedin Motan2, Weibo released the open-source projects, <a href=\"https://github.com/weibocom/motan-go/\">motan-go</a>, <a href=\"https://github.com/weibocom/motan-php\">motan-php</a> and <a href=\"https://github.com/weibocom/motan-openresty\">motan-openresty</a>. It used motan-go as an interpreter and the Simple serialization scheme to serialize the Body of protocol message. (Simple is a comparably weaker serialization scheme)</p>\n<p><img src=\"../../img/blog/motan-agent.png\" alt=\"agent\"></p>\n<p>After observation we find out that there is no big difference between the configuration of Motan2 and the dual protocol. It’s just that the agent here is implicit, and it co-exists with the main service. The most obvious difference is that different languages do not interact directly in agent scheme.</p>\n<h4>Dubbo for cross-language support</h4>\n<p>Instead of cross-language support, the dubbo protocol was originally designed only for common rpc requests. However, it’s not always the case that we can only choose to support it or not. We can always choose to offer different levels of support. It may be hard to offer cross-language support based on the dubbo protocol, but not impossible. Actually, Qianmiwang succeeded. It conquered the front-end cross-language business field built by nodejs with dubbo2.js. It builds the bridge between Nodejs and the native dubbo protocol. Next, we will focus on what we can do with dubbo2.js.</p>\n<h5>Dubbo protocol message format:</h5>\n<p><img src=\"../../img/blog/dubbo-protocol.png\" alt=\"dubbo协议\"></p>\n<p>Details in dubbo protocol header message:</p>\n<ul>\n<li>Magic: similar to magic number in Java bytes code files, which is used to determine whether it is a data pack of dubbo protocol. The magic number is the constant, 0xdabb.</li>\n<li>Flag: contains 8 bits. The lower four bits are used to indicate the type of serialization tool used for message body data (default hessian). Among the upper four bits, the 1 at first bit indicates request, the 1 at second bit indicates dual transfer, 1 at third bits indicates the heartbeat.</li>\n<li>Status: used toset response status. Dubbo defines some types for response. Details can be found in <span data-type=\"color\" style=\"color:rgb(36, 41, 46)\"><span data-type=\"background\" style=\"background-color:rgba(27, 31, 35, 0.05)\">com.alibaba.dubbo.remoting.exchange.Response</span></span></li>\n<li>Invoke id: Message id,Type long, Unique indentifier for each request (Due to asynchronous communication, it is used to match the request to the corresponding returned response)</li>\n<li>Body length: message body length, type int,record bytes of body content.</li>\n<li>Body content: request param, where serializedresponse parameters are stored.</li>\n</ul>\n<p>Protocol messages will eventually become bytes and be transmitted using TCP. Any language that supports network modules and has a socket will be able to be communicatedwith. Then, why cross-language support is difficult? There are two main obstaclesin calling service in Java using other languages:</p>\n<ol>\n<li><span data-type=\"color\" style=\"color:#24292E\">How </span><span data-type=\"color\" style=\"color:#212121\">can different languages ​​represent data types in java, especially dynamiclanguages with possible non-strict data types</span>?</li>\n<li><span data-type=\"color\" style=\"color:#24292E\">How to serialize string across language?</span></li>\n</ol>\n<h2>How does dubbo2.js solve problems?</h2>\n<p>We have analyzed two obstacles above. The key to dubbo2.js in solving these two problems depends on two class libraries: <a href=\"https://github.com/node-modules/js-to-java\">js-to-java</a>,<a href=\"https://github.com/node-modules/hessian.js\">hessian.js</a>. js-to-java, which makes nodejs have the ability to express Java objects. Hessian.js provides serialization capabilities. With the help of nodejs socket,  and a duplicate set of dubbo protocol message format, we can finally achieve nodejs call to java-dubbo-provider.</p>\n<h2>Quick Start</h2>\n<p>To give an intuitive feeling to readers interested in dubbo2.js, this section presents a quick start example that shows how easy it is to call dubbo service using dubbo2.js.</p>\n<h3>1. Initiate dubbo-java-provider</h3>\n<p>Java provides the backend dubbo service. Firstly, let’s define the service interface:</p>\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\">DemoProvider</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">echo</span><span class=\"hljs-params\">()</span> </span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">test</span><span class=\"hljs-params\">()</span></span>;\n    <span class=\"hljs-function\">UserResponse <span class=\"hljs-title\">getUserInfo</span><span class=\"hljs-params\">(UserRequest request)</span></span>;\n}\n</code></pre>\n<p>Then we implement the interface:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoProvider</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"[\"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date()) + <span class=\"hljs-string\">\"] Hello \"</span> + name + <span class=\"hljs-string\">\", request from consumer: \"</span> + RpcContext.getContext().getRemoteAddress());\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\", response form provider: \"</span> + RpcContext.getContext().getLocalAddress();\n    }\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">echo</span><span class=\"hljs-params\">()</span>  </span>{\n        System.out.println(<span class=\"hljs-string\">\"receive....\"</span>);\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"pang\"</span>;\n    }\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">test</span><span class=\"hljs-params\">()</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"test\"</span>);\n    }\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> UserResponse <span class=\"hljs-title\">getUserInfo</span><span class=\"hljs-params\">(UserRequest request)</span> </span>{\n        System.out.println(request);\n        UserResponse response = <span class=\"hljs-keyword\">new</span> UserResponse();\n        response.setStatus(<span class=\"hljs-string\">\"ok\"</span>);\n        Map&lt;String, String&gt; map = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, String&gt;();\n        map.put(<span class=\"hljs-string\">\"id\"</span>, <span class=\"hljs-string\">\"1\"</span>);\n        map.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"test\"</span>);\n        response.setInfo(map);\n        <span class=\"hljs-keyword\">return</span> response;\n    }\n}\n</code></pre>\n<p>After that,<span data-type=\"color\" style=\"color:#24292E\"> we expose the dubbo service with xml files:</span></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://code.alibabatech.com/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\n   http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- dubbo provider info, used to compute dependency --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>/&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"localhost:2181\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- dubbo protocol, used to expose service at port 20880 --&gt;</span>\n    <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\">\"20880\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- realize a service as a local bean --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoProvider\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.provider.DemoProviderImpl\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- claim for service interfaces to expose --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoProvider\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoProvider\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span>/&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>After we implemented all the configurations on server side, initiate an object initiater to register a dubbo service locally:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Provider</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-string\">\"META-INF/spring/dubbo-demo-provider.xml\"</span>});\n        context.start();\n        System.in.read();\n    }\n}\n</code></pre>\n<h3>2. Implement dubbo client-side for nodejs</h3>\n<p>Install dubbo2.js using npm:</p>\n<pre><code class=\"language-sh\">npm install dubbo2.js --save\n</code></pre>\n<p>Configure dubboConfig.ts:</p>\n<pre><code class=\"language-typescript\"><span class=\"hljs-keyword\">import</span> { Dubbo, java, TDubboCallResult } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'dubbo2.js'</span>\n\n<span class=\"hljs-keyword\">const</span> dubbo = <span class=\"hljs-keyword\">new</span> Dubbo({\n  application: {name: <span class=\"hljs-string\">'demo-provider'</span>},\n  register: <span class=\"hljs-string\">'localhost:2181'</span>,\n  dubboVersion: <span class=\"hljs-string\">'2.0.0'</span>,\n  interfaces: [\n    <span class=\"hljs-string\">'com.alibaba.dubbo.demo.DemoProvider'</span>,\n  ],\n});\n\n<span class=\"hljs-keyword\">interface</span> IDemoService {\n  sayHello(name: <span class=\"hljs-built_in\">string</span>): TDubboCallResult&lt;<span class=\"hljs-built_in\">string</span>&gt;;\n}\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">const</span> demoService = dubbo.proxyService&lt;IDemoService&gt;({\n  dubboInterface: <span class=\"hljs-string\">'com.alibaba.dubbo.demo.DemoProvider'</span>,\n  version: <span class=\"hljs-string\">'1.0.0'</span>,\n  methods: {\n    sayHello(name: <span class=\"hljs-built_in\">string</span>) {\n      <span class=\"hljs-keyword\">return</span> [java.String(name)];\n    },\n\n    echo() {},\n\n    test() {},\n\n    getUserInfo() {\n      <span class=\"hljs-keyword\">return</span> [\n        java.combine(<span class=\"hljs-string\">'com.alibaba.dubbo.demo.UserRequest'</span>, {\n          id: <span class=\"hljs-number\">1</span>,\n          name: <span class=\"hljs-string\">'nodejs'</span>,\n          email: <span class=\"hljs-string\">'node@qianmi.com'</span>,\n        }),\n      ];\n    },\n  },\n});\n</code></pre>\n<blockquote>\n<p>Using typescript brings better coding experience.</p>\n</blockquote>\n<p>Implement caller class main.ts:</p>\n<pre><code class=\"language-typescript\"><span class=\"hljs-keyword\">import</span> {demoService} <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./dubboConfig'</span>\n\ndemoService.sayHello(<span class=\"hljs-string\">'kirito'</span>).then(<span class=\"hljs-function\">(<span class=\"hljs-params\">{res,err}</span>)=&gt;</span>{\n    <span class=\"hljs-built_in\">console</span>.log(res)\n});\n</code></pre>\n<h3>3. Call main.ts:</h3>\n<p>Run nodejs client in Debug mode:</p>\n<pre><code class=\"language-sh\">DEBUG=dubbo* ts-node main.ts\n</code></pre>\n<p>Checkout running results:</p>\n<pre><code class=\"language-sh\">Hello kirito, response form provider: 172.19.6.151:20880\n</code></pre>\n<p>Congratulations!</p>\n<h2>Features</h2>\n<ul>\n<li>Support zookeeper as register center</li>\n<li>Support TCP Dubbo Native protocol</li>\n<li>Support directly Dubbo connection</li>\n<li>Support link tracing</li>\n<li>Generate dubbo interface Automatically</li>\n</ul>\n<h2>More details</h2>\n<p>The sample code in this article is available here, <a href=\"https://github.com/lexburner/Dubbojs-Learning\">https://github.com/lexburner/Dubbojs-Learning</a>.\nIf you don't know much about the dubbo protocol and want to understand how it works, the project provides a sub-moudle: java-socket-consumer, which is implemented in a process-oriented approach, realizing a process of sending dubbo protocal message with native socket and making function calls, and then get response.</p>\n",
-  "title": "Implementation of cross-language calls by Dubbo2.js",
-  "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
-  "description": "This article introduces how to use Dubbo.js to implement cross-language calls."
+  "link": "/en-us/blog/dubbo2-js.html",
+  "meta": {
+    "title": "Implementation of cross-language calls by Dubbo2.js",
+    "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
+    "description": "This article introduces how to use Dubbo.js to implement cross-language calls."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/gsoc-2018.json b/en-us/blog/gsoc-2018.json
index 8f3d49a9..851a6528 100644
--- a/en-us/blog/gsoc-2018.json
+++ b/en-us/blog/gsoc-2018.json
@@ -1,4 +1,6 @@
 {
   "filename": "gsoc-2018.md",
-  "__html": "<h2>The GSoC(Google Summer of Code) 2018 projects has been announced</h2>\n<p>The GSoC(Google Summer of Code) 2018 projects has been announced, Raghu Reddy's project &quot;Extending Serialization protocols support for Apache Dubbo&quot; has been <a href=\"https://summerofcode.withgoogle.com/projects/#4747840161579008\">accepted</a>! Congratulations!</p>\n"
+  "__html": "<h2>The GSoC(Google Summer of Code) 2018 projects has been announced</h2>\n<p>The GSoC(Google Summer of Code) 2018 projects has been announced, Raghu Reddy's project &quot;Extending Serialization protocols support for Apache Dubbo&quot; has been <a href=\"https://summerofcode.withgoogle.com/projects/#4747840161579008\">accepted</a>! Congratulations!</p>\n",
+  "link": "/en-us/blog/gsoc-2018.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/blog/introduction-to-dubbo-qos.json b/en-us/blog/introduction-to-dubbo-qos.json
index 717818be..9bf79222 100644
--- a/en-us/blog/introduction-to-dubbo-qos.json
+++ b/en-us/blog/introduction-to-dubbo-qos.json
@@ -1,7 +1,10 @@
 {
   "filename": "introduction-to-dubbo-qos.md",
   "__html": "<h1>Manipulating Services Dynamically via QoS</h1>\n<p>QoS (short form of <strong>Quality of Service</strong>), is a common terminology talking about network devices. For example, by adjusting and manipulating the weights of ports of a router dynamically via QoS, engineers could give priority to services running on these ports and make sure these services' quality and reliability.</p>\n<p>In Dubbo, QoS is used to query and manipulate services dynamically, like getting a list of active provider and consumer services, and launching or withdrawing services (i.e registering to or unregistering services from registration center).</p>\n<h2>Mechanism of QoS</h2>\n<p>From 2.5.8, QoS is introduced into Dubbo and is activated by default. All QoS's features are abstracted to commands, which could be executed to get responses from QoS.</p>\n<blockquote>\n<p>QoS is based on Netty4. In versions earlier than 2.6.x, Dubbo relies on Netty3, so you have to add Netty4 as a dependency explicitly to ensure that Netty4 works. If you generate a Dubbo application on <a href=\"http://start.dubbo.io\">http://start.dubbo.io</a>, there's no need to add configurations because Netty4 is listed as a dependency by default.</p>\n</blockquote>\n<p><img src=\"../../img/blog/qos-architecture.png\" alt=\"undefined\"></p>\n<p>The picture above shows how QoS works:</p>\n<ol>\n<li>Start and listen to a port (22222 by default).</li>\n<li>Choose a corresponding request handler by detecting the protocol (telnet or http) a request comply with.</li>\n<li>Decode and parse the request to generate corresponding command according to the protocol.</li>\n<li>Execute commands and return with responses.</li>\n</ol>\n<h3>QoS Commands:</h3>\n<p>Commands that QoS supports at the current moment include:</p>\n<ul>\n<li><code>help</code>, list available commands</li>\n<li><code>ls</code>: list all active provider services and consumer services</li>\n<li><code>online</code>: dynamically register a service or all services to registration center</li>\n<li><code>offline</code>: dynamically remove (unregister) a services or all services from registration center</li>\n<li><code>quit</code>: quit the current telnet session</li>\n</ul>\n<p>Now we are going to demonstrate how to manipulate services dynamically via QoS.</p>\n<h4>Access QoS via Telnet</h4>\n<p>Assuming that our Dubbo server has started, connect to it via telnet:</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> telnet localhost 22222</span>\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is '^]'.\n  ?????????  ???    ??  ???????????  ???????????   ????????\n  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???\n  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???\n  ???    ??? ???    ???  ??????????   ??????????  ???    ???\n  ???    ??? ???    ??? ???????????  ???????????  ???    ???\n  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???\n  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???\n  ?????????  ?????????  ???????????  ???????????   ????????\n<span class=\"hljs-meta\">\n\ndubbo&gt;</span><span class=\"bash\"></span>\n</code></pre>\n<p>A <code>dubbo&gt;</code> prompt would show up once you connect to server. Now input <code>help</code>:</p>\n<pre><code class=\"language-sh\">dubbo&gt;<span class=\"hljs-built_in\">help</span>\n+---------+----------------------------------------------------------------------------------+\n|    <span class=\"hljs-built_in\">help</span> | <span class=\"hljs-built_in\">help</span> <span class=\"hljs-built_in\">command</span>                                                                     |\n+---------+----------------------------------------------------------------------------------+\n|      ls | ls service                                                                       |\n+---------+----------------------------------------------------------------------------------+\n| offline | offline dubbo                                                                    |\n+---------+----------------------------------------------------------------------------------+\n|  online | online dubbo                                                                     |\n+---------+----------------------------------------------------------------------------------+\n|    quit | quit telnet console                                                              |\n+---------+----------------------------------------------------------------------------------+\n\ndubbo&gt;\n</code></pre>\n<p>This command lists all available commands with explanations.</p>\n<p>You can also use <code>help</code> to a specific command to read examples of that command.</p>\n<pre><code class=\"language-sh\">dubbo&gt;<span class=\"hljs-built_in\">help</span> online\n+--------------+----------------------------------------------------------------------------------+\n| COMMAND NAME | online                                                                           |\n+--------------+----------------------------------------------------------------------------------+\n|      EXAMPLE | online dubbo                                                                     |\n|              | online xx.xx.xxx.service                                                         |\n+--------------+----------------------------------------------------------------------------------+\n</code></pre>\n<p>Use <code>ls</code> to check services' status:</p>\n<pre><code class=\"language-sh\">dubbo&gt;ls\nAs Provider side:\n+------------------------------------------+---+\n|           Provider Service Name          |PUB|\n+------------------------------------------+---+\n|org.apache.dubbo.demo.provider.DemoService| Y |\n+------------------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>There is a service named <code>org.apache.dubbo.demo.provider.DemoService</code> in the provider side. <code>PUB=Y</code> in the second columns means that the service has been published to the registration center, waiting to be called by the consumer side.</p>\n<p>Assuming that we need to withdraw a service dynamically, we can use <code>offline</code> command:</p>\n<pre><code>dubbo&gt;offline org.apache.dubbo.demo.provider.DemoService\nOK\n</code></pre>\n<p>You can see that the command responds with <code>OK</code>. Check the services' status using <code>ls</code>:</p>\n<pre><code class=\"language-sh\">dubbo&gt;ls\nAs Provider side:\n+------------------------------------------+---+\n|           Provider Service Name          |PUB|\n+------------------------------------------+---+\n|org.apache.dubbo.demo.provider.DemoService| N |\n+------------------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>You can see that <code>PUB</code> of <code>org.apache.dubbo.demo.provider.DemoService</code> has been set to <code>N</code>.</p>\n<p>Quit the current telnet session using <code>quit</code>:</p>\n<pre><code class=\"language-sh\">dubbo&gt;quit\nBYE!\nConnection closed by foreign host.\n</code></pre>\n<h4>Access QoS via HTTP</h4>\n<p>In the example above we performed an offline action to <code>org.apache.dubbo.demo.provider.DemoService</code>. Now we are going to demonstrate how to register the service above via HTTP.</p>\n<pre><code class=\"language-sh\">$ curl -i http://localhost:22222/online?service=org.apache.dubbo.demo.provider.DemoService\nHTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 2\n\nOK%\n</code></pre>\n<blockquote>\n<p>Beware of the parameters of online action. They need to be provided in the form of <code>key=value</code>. However, <code>key</code> would be ignored actually.</p>\n</blockquote>\n<p>The action responds with <code>OK</code>. Now use <code>ls</code> to check providers' status at the current moment.</p>\n<pre><code>$ curl -i http://localhost:22222/ls\nHTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 365\n\nAs Provider side:\n+------------------------------------------+---+\n|           Provider Service Name          |PUB|\n+------------------------------------------+---+\n|org.apache.dubbo.demo.provider.DemoService| Y |\n+------------------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>You can see that the service's <code>PUB</code> status has been changed to <code>Y</code>.</p>\n<h3>QoS' Parameters</h3>\n<p>You can use parameters that QoS provides to config its startup. These parameters include:</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Explanation</th>\n<th>Default</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>qosEnable</td>\n<td>Activate QoS or not</td>\n<td>true</td>\n</tr>\n<tr>\n<td>qosPort</td>\n<td>The port QoS would bind to</td>\n<td>22222</td>\n</tr>\n<tr>\n<td>qosAcceptForeignIp</td>\n<td>Enable remote access or not</td>\n<td>false</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>Attention. From 2.6.4/2.7.0, <code>qosAcceptForeignIp</code> is set to <code>false</code> by default, because it's risky if this property is set to <code>true</code>. Think twice before you turn it on.</p>\n</blockquote>\n<p>You can configure these parameters in the following ways:</p>\n<ul>\n<li>System property</li>\n<li><code>dubbo.properties</code></li>\n<li>XML</li>\n<li>Spring-boot auto configuration</li>\n</ul>\n<p>They have priority in the following order: system property &gt; <code>dubbo.properties</code> &gt; XML &gt; spring-boot.</p>\n<h4>System Property</h4>\n<pre><code>-Ddubbo.application.qos.enable=true\n-Ddubbo.application.qos.port=33333\n-Ddubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h4><code>Dubbo.properties</code></h4>\n<p>Create a <code>dubbo.properties</code> file in this directory <code>src/main/resources</code> in your project, and copy the following codes into it:</p>\n<pre><code>dubbo.application.qos.enable=true\ndubbo.application.qos.port=33333\ndubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h4>XML</h4>\n<p>If you are going to config using XML, you can try this:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.enable\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.accept.foreign.ip\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.port\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"33333\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n  <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\">\"20880\"</span>/&gt;</span>\n  <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.demo.provider.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.provider.DemoServiceImpl\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h4><code>spring-boot</code> auto configuration</h4>\n<p>If you are developing a spring-boot application, you can configure in <code>application.properties</code> or <code>application.yml</code>:</p>\n<pre><code>dubbo.application.qosEnable=true\ndubbo.application.qosPort=33333\ndubbo.application.qosAcceptForeignIp=false\n</code></pre>\n",
-  "title": "Manipulating Services Dynamically via QoS",
-  "keywords": "Dubbo, qos",
-  "description": "This article introduces how to use Dubbo's QoS to achieve dynamic configuration."
+  "link": "/en-us/blog/introduction-to-dubbo-qos.html",
+  "meta": {
+    "title": "Manipulating Services Dynamically via QoS",
+    "keywords": "Dubbo, qos",
+    "description": "This article introduces how to use Dubbo's QoS to achieve dynamic configuration."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/introduction-to-dubbo-spi-2.json b/en-us/blog/introduction-to-dubbo-spi-2.json
index e45b20c1..b6b38ae0 100644
--- a/en-us/blog/introduction-to-dubbo-spi-2.json
+++ b/en-us/blog/introduction-to-dubbo-spi-2.json
@@ -1,7 +1,10 @@
 {
   "filename": "introduction-to-dubbo-spi-2.md",
   "__html": "<h1>Dubbo extensible mechanism source code analysis</h1>\n<hr>\n<p>In the <a href=\"./introduction-to-dubbo-spi.md\">actual implementation of the Dubbo extensibility mechanism</a>, we learned some concepts of the Dubbo extension mechanism, explored the implementation of LoadBalance in Dubbo, and implemented a LoadBalance on our own. Do you think Dubbo's extension mechanism is great? Next, we will go deep into the source code of Dubbo and see what it is.</p>\n<h2>ExtensionLoader</h2>\n<p><code>ExtentionLoader</code> is the core class, which is responsible for the loading and lifecycle management of extension points. Let's start with this class. There are many methods of Extension, and the common methods include:</p>\n<ul>\n<li><code>public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type)</code></li>\n<li><code>public T getExtension(String name)</code></li>\n<li><code>public T getAdaptiveExtension()</code></li>\n</ul>\n<p>The common usages are:</p>\n<ul>\n<li><code>LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName)</code></li>\n<li><code>RouterFactory routerFactory = ExtensionLoader.getExtensionLoader(RouterFactory.class).getAdaptiveExtension()</code></li>\n</ul>\n<p>Notice: In the source code shown below, I'll remove extraneous code (such as logging, exception catching, and so on) to make it easy to read and understand.</p>\n<ol>\n<li>getExtensionLoader\nThis is a static factory method that enters an extensible interface and returns an ExtensionLoader entity class for this interface. With this entity class, you can get not only a specific extension based on name, but also an adaptive extension.</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> &lt;T&gt; <span class=\"hljs-function\">ExtensionLoader&lt;T&gt; <span class=\"hljs-title\">getExtensionLoader</span><span class=\"hljs-params\">(Class&lt;T&gt; type)</span> </span>{\n        <span class=\"hljs-comment\">// An extension point must be an interface</span>\n        <span class=\"hljs-keyword\">if</span> (!type.isInterface()) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"Extension type(\"</span> + type + <span class=\"hljs-string\">\") is not interface!\"</span>);\n        }\n        <span class=\"hljs-comment\">// @SPI annotations must be provided</span>\n        <span class=\"hljs-keyword\">if</span> (!withExtensionAnnotation(type)) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"Extension type without @SPI Annotation!\"</span>);\n        }\n        <span class=\"hljs-comment\">// Get the corresponding ExtensionLoader from the cache according to the interface</span>\n        <span class=\"hljs-comment\">// Each extension will only be loaded once</span>\n        ExtensionLoader&lt;T&gt; loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);\n        <span class=\"hljs-keyword\">if</span> (loader == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-comment\">// Initialize extension</span>\n            EXTENSION_LOADERS.putIfAbsent(type, <span class=\"hljs-keyword\">new</span> ExtensionLoader&lt;T&gt;(type));\n            loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);\n        }\n        <span class=\"hljs-keyword\">return</span> loader;\n    }\n    \n<span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">ExtensionLoader</span><span class=\"hljs-params\">(Class&lt;?&gt; type)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.type = type;\n        objectFactory = (type == ExtensionFactory.class ? <span class=\"hljs-keyword\">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());\n    }\n</code></pre>\n<ol start=\"2\">\n<li>getExtension</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(String name)</span> </span>{\n        Holder&lt;Object&gt; holder = cachedInstances.get(name);\n        <span class=\"hljs-keyword\">if</span> (holder == <span class=\"hljs-keyword\">null</span>) {\n            cachedInstances.putIfAbsent(name, <span class=\"hljs-keyword\">new</span> Holder&lt;Object&gt;());\n            holder = cachedInstances.get(name);\n        }\n        Object instance = holder.get();\n        <span class=\"hljs-comment\">// Get it from the cache. If it does not exist, create</span>\n        <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">synchronized</span> (holder) {\n                instance = holder.get();\n                <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n                    instance = createExtension(name);\n                    holder.set(instance);\n                }\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> (T) instance;\n    }\n</code></pre>\n<p>Some judgments and caching have been made in the getExtention method, and the main logic is in the createExtension method. Let's move on to the createExtention method.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> T <span class=\"hljs-title\">createExtension</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// Get the extension class according to the name of extension point. For example,  for LoadBalance, get the RandomLoadBalance class according to random</span>\n        Class&lt;?&gt; clazz = getExtensionClasses().get(name);\n        \n        T instance = (T) EXTENSION_INSTANCES.get(clazz);\n        <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n              <span class=\"hljs-comment\">// Use reflection to call newInstance to create an example of an extension class</span>\n            EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance());\n            instance = (T) EXTENSION_INSTANCES.get(clazz);\n        }\n        <span class=\"hljs-comment\">// Make dependency injection for the extended class samples</span>\n        injectExtension(instance);\n        <span class=\"hljs-comment\">// If there is a wrapper, add the wrapper</span>\n        Set&lt;Class&lt;?&gt;&gt; wrapperClasses = cachedWrapperClasses;\n        <span class=\"hljs-keyword\">if</span> (wrapperClasses != <span class=\"hljs-keyword\">null</span> &amp;&amp; !wrapperClasses.isEmpty()) {\n            <span class=\"hljs-keyword\">for</span> (Class&lt;?&gt; wrapperClass : wrapperClasses) {\n                instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> instance;\n}\n</code></pre>\n<p>The createExtension method has done the following:</p>\n<ol>\n<li>First, get the corresponding extension class according to name. Read the extension point configuration file from the <code>META-INF</code> folder under ClassPath.</li>\n<li>Use reflection to create an instance of an extended class.</li>\n<li>make dependency injection for the attributes of the extended class instance. That is, IoC.</li>\n<li>If there is a wrapper, add the wrapper. That is, AoP.</li>\n</ol>\n<p>Let's focus on these four processes.</p>\n<ol>\n<li>Get the corresponding extension class according to name. Let’s read the code first:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">private</span> Map&lt;String, Class&lt;?&gt;&gt; getExtensionClasses() {\n        Map&lt;String, Class&lt;?&gt;&gt; classes = cachedClasses.get();\n        <span class=\"hljs-keyword\">if</span> (classes == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">synchronized</span> (cachedClasses) {\n                classes = cachedClasses.get();\n                <span class=\"hljs-keyword\">if</span> (classes == <span class=\"hljs-keyword\">null</span>) {\n                    classes = loadExtensionClasses();\n                    cachedClasses.set(classes);\n                }\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> classes;\n    }\n\n    <span class=\"hljs-comment\">// synchronized in getExtensionClasses</span>\n    <span class=\"hljs-keyword\">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {\n        <span class=\"hljs-keyword\">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);\n        <span class=\"hljs-keyword\">if</span> (defaultAnnotation != <span class=\"hljs-keyword\">null</span>) {\n            String value = defaultAnnotation.value();\n            <span class=\"hljs-keyword\">if</span> (value != <span class=\"hljs-keyword\">null</span> &amp;&amp; (value = value.trim()).length() &gt; <span class=\"hljs-number\">0</span>) {\n                String[] names = NAME_SEPARATOR.split(value);\n                <span class=\"hljs-keyword\">if</span> (names.length &gt; <span class=\"hljs-number\">1</span>) {\n                    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"more than 1 default extension name on extension \"</span> + type.getName());\n                }\n                <span class=\"hljs-keyword\">if</span> (names.length == <span class=\"hljs-number\">1</span>) cachedDefaultName = names[<span class=\"hljs-number\">0</span>];\n            }\n        }\n\n        Map&lt;String, Class&lt;?&gt;&gt; extensionClasses = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Class&lt;?&gt;&gt;();\n        loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY);\n        loadFile(extensionClasses, DUBBO_DIRECTORY);\n        loadFile(extensionClasses, SERVICES_DIRECTORY);\n        <span class=\"hljs-keyword\">return</span> extensionClasses;\n    }\n</code></pre>\n<p>This process is very simple. Get the extension class from the cache first, and if it does not exist, load it from the configuration file. The path of the configuration file has been mentioned before:</p>\n<ul>\n<li><code>META-INF/dubbo/internal</code></li>\n<li><code>META-INF/dubbo</code></li>\n<li><code>META-INF/services</code></li>\n</ul>\n<ol start=\"2\">\n<li>Use reflection to create an extended instance. This process is very simple. We can do this using <code>clazz.newInstance()</code>. The attributes of the extended instance created are all null values.</li>\n<li>Extended instance is automatic assembly. In the actual scenario, there have dependencies between classes. Dependencies are also referenced in the extended instance, such as a simple Java class, an extension of another Dubbo, or a Spring Bean. The situation of dependencies is complex, and Dubbo's processing is relatively complicated. We will have a special chapter to explain it later. Now, we just need to know that Dubbo can correctly inject common dependencies in extension points, Dubbo extension dependencies or Spring dependencies, etc..</li>\n<li>Extended instance is auto-wrapping. Auto-wrapping is about implementing Spring like AOP functionality. Dubbo uses it to implement some common functions internally, such as logging, monitoring, and so on. The contents of the extended instance auto-wrapper will also be explained separately later.</li>\n</ol>\n<p>After the above 4 steps, Dubbo creates and initializes an extended instance. The dependencies of this instance are injected and packaged as needed. At this point, this extended instance can be used.</p>\n<h2>Auto-assembly of Dubbo SPI advanced usage</h2>\n<p>The relevant code for auto-assembly is in the injectExtension method:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> T <span class=\"hljs-title\">injectExtension</span><span class=\"hljs-params\">(T instance)</span> </span>{\n    <span class=\"hljs-keyword\">for</span> (Method method : instance.getClass().getMethods()) {\n        <span class=\"hljs-keyword\">if</span> (method.getName().startsWith(<span class=\"hljs-string\">\"set\"</span>)\n                &amp;&amp; method.getParameterTypes().length == <span class=\"hljs-number\">1</span>\n                &amp;&amp; Modifier.isPublic(method.getModifiers())) {\n            Class&lt;?&gt; pt = method.getParameterTypes()[<span class=\"hljs-number\">0</span>];\n          \n            String property = method.getName().length() &gt; <span class=\"hljs-number\">3</span> ? method.getName().substring(<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>).toLowerCase() + method.getName().substring(<span class=\"hljs-number\">4</span>) : <span class=\"hljs-string\">\"\"</span>;\n            Object object = objectFactory.getExtension(pt, property);\n            <span class=\"hljs-keyword\">if</span> (object != <span class=\"hljs-keyword\">null</span>) {\n                method.invoke(instance, object);\n            }\n        }\n    }\n    <span class=\"hljs-keyword\">return</span> instance;\n}\n</code></pre>\n<p>To accomplish the automatic assembly of dependencies of the extended instances, you first need to know what the dependencies are and what the types of dependencies are. The solution of Dubbo is to find the Java standard setter method. That is, the method name starting with set has only one parameter. If such a set method exists in an extension class, Dubbo injects it into dependencies, which is similar to the injection of Spring's set method. However, dependency injection in Dubbo is more complicated than that in Spring, because all the methods injected into Spring are Spring beans and managed by the Spring container. In Dubbo's dependency injection, you may need to inject another extension of Dubbo, or a Spring Bean, or a component of Google guice, or a component in any other framework. Dubbo needs to be able to load extensions from any scenario. In the injectExtension method, it is implemented with <code>Object object = objectFactory. getExtension (pt, property)</code>. ObjectFactory is ExtensionFactory type and initialized when creating ExtensionLoader:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">ExtensionLoader</span><span class=\"hljs-params\">(Class&lt;?&gt; type)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.type = type;\n        objectFactory = (type == ExtensionFactory.class ? <span class=\"hljs-keyword\">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());\n    }\n</code></pre>\n<p>ObjectFacore is also an extension, obtained through <code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()</code>.</p>\n<p><img src=\"https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo-extensionfactory.png\" alt=\"Dubbo-ExtensionFactory | left\"></p>\n<p>ExtensionLoader includes three implementations:</p>\n<ol>\n<li>SpiExtensionLoader: use Dubbo's Spi to load Extension.</li>\n<li>SpringExtensionLoader: load Extension from the Spring container.</li>\n<li>AdaptiveExtensionLoader: adaptive AdaptiveExtensionLoader</li>\n</ol>\n<p>Pay attention to the AdaptiveExtensionLoader here, the source code is as follows:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Adaptive</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AdaptiveExtensionFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExtensionFactory</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> List&lt;ExtensionFactory&gt; factories;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">AdaptiveExtensionFactory</span><span class=\"hljs-params\">()</span> </span>{\n        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);\n        List&lt;ExtensionFactory&gt; list = <span class=\"hljs-keyword\">new</span> ArrayList&lt;ExtensionFactory&gt;();\n        <span class=\"hljs-keyword\">for</span> (String name : loader.getSupportedExtensions()) {\n            list.add(loader.getExtension(name));\n        }\n        factories = Collections.unmodifiableList(list);\n    }\n\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">T <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;T&gt; type, String name)</span> </span>{\n        <span class=\"hljs-keyword\">for</span> (ExtensionFactory factory : factories) {\n            T extension = factory.getExtension(type, name);\n            <span class=\"hljs-keyword\">if</span> (extension != <span class=\"hljs-keyword\">null</span>) {\n                <span class=\"hljs-keyword\">return</span> extension;\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">null</span>;\n    }\n}\n</code></pre>\n<p>The AdaptiveExtensionLoader class has @Adaptive annotations. As mentioned earlier, Dubbo creates an adaptive instance for each extension. If the extension class has @Adaptive annotations, it will use it as an adaptive class. If not, Dubbo will create one for us. So <code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())</code> will return an AdaptiveExtensionLoader instance as an adaptive extension instance.\nThe AdaptiveExtentionLoader will iterate through all the ExtensionFactory implementations and try to load the extensions. If found, return. If not, continue to find it in the next ExtensionFactory. Dubbo has two ExtensionFactory built in, which are searched from Dubbo's own extension mechanism and Spring container. Since ExtensionFactory itself is also an extension point, we can implement our own ExtensionFactory to enable automatic assembly of Dubbo to support our custom components. For example, we used Google's guice as an IoC container in our project. We can implement our own GuiceExtensionFactory to enable Dubbo to load extensions from the guice container.</p>\n<h2>AoP of Dubbo SPI advanced usage</h2>\n<p>We often use AOP functionality when using Spring. Insert other logic before and after the method of the target class. For example, Spring AOP is usually used to implement logging, monitoring, and authentication, and so on.\nDoes Dubbo's extension mechanism also support similar features? The answer is yes. In Dubbo, there is a special class called the Wrapper class. It uses the wrapper class to wrap the original extension point instance through the decorator pattern, and then inserts additional logic before and after the original extension point implementation to implement AOP functionality.</p>\n<h3>What is the Wrapper class</h3>\n<p>So what kind of class is the Wrapper class in the Dubbo extension mechanism? The Wrapper class is a class that has a replication constructor and also is a typical decorator pattern. Here's a Wrapper class:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">A</span></span>{\n    <span class=\"hljs-keyword\">private</span> A a;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">A</span><span class=\"hljs-params\">(A a)</span></span>{\n        <span class=\"hljs-keyword\">this</span>.a = a;\n    }\n}\n</code></pre>\n<p>Class A has a constructor <code>public A(A a)</code>, and the argument to the constructor is A itself. Such a class can be a Wrapper class in the Dubbo extension mechanism. Such Wrapper classes in Dubbo include ProtocolFilterWrapper, ProtocolListenerWrapper, and so on. You can check the source code to deepen your understanding.</p>\n<h3>How to configure the Wrapper class</h3>\n<p>The Wipper class in Dubbo is also an extension point. Like other extension points, it is also configured in the <code>META-INF</code> folder. For example, the ProtocolFilterWrapper and ProtocolListenerWrapper in the previous example are configured in the path <code>dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol</code>:</p>\n<pre><code class=\"language-text\">filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper\nlistener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper\nmock=com.alibaba.dubbo.rpc.support.MockProtocol\n</code></pre>\n<p>When Dubbo loads the extension configuration file, there is a piece of code as follows:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">try</span> {  \n  clazz.getConstructor(type);    \n  Set&lt;Class&lt;?&gt;&gt; wrappers = cachedWrapperClasses;\n  <span class=\"hljs-keyword\">if</span> (wrappers == <span class=\"hljs-keyword\">null</span>) {\n    cachedWrapperClasses = <span class=\"hljs-keyword\">new</span> ConcurrentHashSet&lt;Class&lt;?&gt;&gt;();\n    wrappers = cachedWrapperClasses;\n  }\n  wrappers.add(clazz);\n} <span class=\"hljs-keyword\">catch</span> (NoSuchMethodException e) {}\n</code></pre>\n<p>The meaning of this code is that if the extension class has a copy constructor, it will be saved for later use. The class that has the copy constructor is the Wrapper class. The parameter obtained by <code>clazz.getConstructor(type)</code> is the constructor of the extension point interface. Note that the parameter type of the constructor is an extension point interface, not an extension class.\nTake Protocol as an example. The configuration file <code>dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol defines filter=com.alibaba.dubbo.rpc.protocol. ProtocolFilterWrapper</code>.\nThe code of ProtocolFilterWrapper is as follows:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProtocolFilterWrapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Protocol protocol;\n\n    <span class=\"hljs-comment\">// One parameter is the copy constructor of Protocol</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ProtocolFilterWrapper</span><span class=\"hljs-params\">(Protocol protocol)</span> </span>{\n        <span class=\"hljs-keyword\">if</span> (protocol == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"protocol == null\"</span>);\n        }\n        <span class=\"hljs-keyword\">this</span>.protocol = protocol;\n    }\n</code></pre>\n<p>ProtocolFilterWrapper has a constructor <code>public ProtocolFilterWrapper(Protocol protocol)</code>, and the parameter is the extension point Protocol. So it is a Wrapper class in the Dubbo extension mechanism. The ExtensionLoader will cache it. When creating Extension instances later, the ExtensionLoader use these wrapper classes to wrap the original Extension point in turn.</p>\n<h2>Extension point adaptive</h2>\n<p>As mentioned earlier, Dubbo needs to determine which extension to use based on method parameters at runtime. So there is an extension point adaptive instance. In fact, it is an extension point proxy that delays the selection of extensions from starting Dubbo to calling RPC. Each extension point in Dubbo has an adaptive class. If it is not explicitly provided, Dubbo will automatically create one for us. By default, Javaassist is used.\nLet's first look at the code to create an adaptive extension class:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">getAdaptiveExtension</span><span class=\"hljs-params\">()</span> </span>{\n    Object instance = cachedAdaptiveInstance.get();\n    <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">synchronized</span> (cachedAdaptiveInstance) {\n                instance = cachedAdaptiveInstance.get();\n                <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n                      instance = createAdaptiveExtension();\n                      cachedAdaptiveInstance.set(instance); \n                }\n            }        \n    }\n\n    <span class=\"hljs-keyword\">return</span> (T) instance;\n}\n</code></pre>\n<p>Continue to read the createAdaptiveExtension method:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> T <span class=\"hljs-title\">createAdaptiveExtension</span><span class=\"hljs-params\">()</span> </span>{        \n    <span class=\"hljs-keyword\">return</span> injectExtension((T) getAdaptiveExtensionClass().newInstance());\n}\n</code></pre>\n<p>Continue to read the getAdaptiveExtensionClass method:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">private</span> Class&lt;?&gt; getAdaptiveExtensionClass() {\n        getExtensionClasses();\n        <span class=\"hljs-keyword\">if</span> (cachedAdaptiveClass != <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">return</span> cachedAdaptiveClass;\n        }\n        <span class=\"hljs-keyword\">return</span> cachedAdaptiveClass = createAdaptiveExtensionClass();\n    }\n</code></pre>\n<p>Continue to read the createAdaptiveExtensionClass method. After a long journey, we finally come to a concrete realization. Look at this createAdaptiveExtensionClass method, which first generates the Java source code for the adaptive class, and then compile the source code into Java bytecode and load it into the JVM.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">private</span> Class&lt;?&gt; createAdaptiveExtensionClass() {\n        String code = createAdaptiveExtensionClassCode();\n        ClassLoader classLoader = findClassLoader();\n        com.alibaba.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();\n        <span class=\"hljs-keyword\">return</span> compiler.compile(code, classLoader);\n    }\n</code></pre>\n<p>The default implementation of Compiler's code is javassist.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SPI</span>(<span class=\"hljs-string\">\"javassist\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Compiler</span> </span>{\n    Class&lt;?&gt; compile(String code, ClassLoader classLoader);\n}\n</code></pre>\n<p>The createAdaptiveExtensionClassCode () method uses a StringBuilder to build Java source code for the adaptive class. The method implementation is relatively long, and the code is not posted here. The approach to bytecode generation is also interesting, first generating Java source code, then compiling it and loading it into the jvm. In this way, the generated Java class can be better controlled. And it doesn't have to care about the API of the bytecode generation framework. Because the xxx.java file is universal in Java, it is also the one we are most familiar with. However, the code is not very readable and you need to build xx. Java content bit by bit.\nBelow are the Java code example for Protocol adaptive class created by createAdaptiveExtensionClassCode method:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.rpc;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.ExtensionLoader;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Protocol</span>$<span class=\"hljs-title\">Adpative</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">com</span>.<span class=\"hljs-title\">alibaba</span>.<span class=\"hljs-title\">dubbo</span>.<span class=\"hljs-title\">rpc</span>.<span class=\"hljs-title\">Protocol</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroy</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> UnsupportedOperationException(<span class=\"hljs-string\">\"method public abstract void com.alibaba.dubbo.rpc.Protocol.destroy() of interface com.alibaba.dubbo.rpc.Protocol is not adaptive method!\"</span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getDefaultPort</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> UnsupportedOperationException(<span class=\"hljs-string\">\"method public abstract int com.alibaba.dubbo.rpc.Protocol.getDefaultPort() of interface com.alibaba.dubbo.rpc.Protocol is not adaptive method!\"</span>);\n    }\n\n    <span class=\"hljs-keyword\">public</span> com.alibaba.dubbo.rpc.<span class=\"hljs-function\">Exporter <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(com.alibaba.dubbo.rpc.Invoker arg0)</span> <span class=\"hljs-keyword\">throws</span> com.alibaba.dubbo.rpc.RpcException </span>{\n        <span class=\"hljs-keyword\">if</span> (arg0 == <span class=\"hljs-keyword\">null</span>) <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.Invoker argument == null\"</span>);\n        <span class=\"hljs-keyword\">if</span> (arg0.getUrl() == <span class=\"hljs-keyword\">null</span>)\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.Invoker argument getUrl() == null\"</span>);\n        com.alibaba.dubbo.common.URL url = arg0.getUrl();\n        String extName = (url.getProtocol() == <span class=\"hljs-keyword\">null</span> ? <span class=\"hljs-string\">\"dubbo\"</span> : url.getProtocol());\n        <span class=\"hljs-keyword\">if</span> (extName == <span class=\"hljs-keyword\">null</span>)\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(\"</span> + url.toString() + <span class=\"hljs-string\">\") use keys([protocol])\"</span>);\n        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);\n        <span class=\"hljs-keyword\">return</span> extension.export(arg0);\n    }\n\n    <span class=\"hljs-keyword\">public</span> com.alibaba.dubbo.rpc.<span class=\"hljs-function\">Invoker <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(java.lang.Class arg0, com.alibaba.dubbo.common.URL arg1)</span> <span class=\"hljs-keyword\">throws</span> com.alibaba.dubbo.rpc.RpcException </span>{\n        <span class=\"hljs-keyword\">if</span> (arg1 == <span class=\"hljs-keyword\">null</span>) <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"url == null\"</span>);\n        com.alibaba.dubbo.common.URL url = arg1;\n        String extName = (url.getProtocol() == <span class=\"hljs-keyword\">null</span> ? <span class=\"hljs-string\">\"dubbo\"</span> : url.getProtocol());\n        <span class=\"hljs-keyword\">if</span> (extName == <span class=\"hljs-keyword\">null</span>)\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(\"</span> + url.toString() + <span class=\"hljs-string\">\") use keys([protocol])\"</span>);\n        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);\n        <span class=\"hljs-keyword\">return</span> extension.refer(arg0, arg1);\n    }\n}\n</code></pre>\n<p>The general logic is the same as at the beginning. The parameters are parsed through the url, and the parsed logic is controlled by the value parameter of @adaptive, and then the extension points implementation are obtained according to the name of the extension point. And then finally make the call. If you want to know the specific construction logic of .Java code, you can see the complete implementation of <code>createAdaptiveExtensionClassCode</code>.\nIn the generated Protocol$Adpative, both the getDefaultPort and destroy methods are found to throw the exception directly. Why? Take a look at the source code of Protocol:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SPI</span>(<span class=\"hljs-string\">\"dubbo\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Protocol</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getDefaultPort</span><span class=\"hljs-params\">()</span></span>;\n\n    <span class=\"hljs-meta\">@Adaptive</span>\n    &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n\n    <span class=\"hljs-meta\">@Adaptive</span>\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroy</span><span class=\"hljs-params\">()</span></span>;\n</code></pre>\n<p>As you can see, there are four methods in the Protocol interface, but only the methods of export and refer use the @adaptive annotation. Dubbo automatically generates adaptive instances, and only the methods modified by @Adaptive has a specific implementation. Therefore, in the Protocol$Adpative class, only the export and refer methods have specific implementations, and the rest of the methods throw exceptions.</p>\n",
-  "title": "Dubbo extensible mechanism source code analysis",
-  "keywords": "Dubbo, SPI, source code analysis",
-  "description": "This article introduces the principles and details of Dubbo's SPI."
+  "link": "/en-us/blog/introduction-to-dubbo-spi-2.html",
+  "meta": {
+    "title": "Dubbo extensible mechanism source code analysis",
+    "keywords": "Dubbo, SPI, source code analysis",
+    "description": "This article introduces the principles and details of Dubbo's SPI."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/introduction-to-dubbo-spi.json b/en-us/blog/introduction-to-dubbo-spi.json
index af45811d..f46d9def 100644
--- a/en-us/blog/introduction-to-dubbo-spi.json
+++ b/en-us/blog/introduction-to-dubbo-spi.json
@@ -1,7 +1,10 @@
 {
   "filename": "introduction-to-dubbo-spi.md",
   "__html": "<h1>Dubbo Extension Mechanism in Action</h1>\n<h2>1. Extension Mechanism of Dubbo</h2>\n<p>Dubbo is claimed as a high-performance RPC framework on its official website. Today, I want to talk about another great specialty of Dubbo --- its scalability.  As quote: Rome wasn’t built in a day. Any successful system always starts as a prototype. It is impossible to design a perfect system at the beginning. Instead, we should focus on true demand and keep improving the system. On the coding side, it requires us to pay attention on abstraction layers and high-level isolation. In that case, the system could keep a healthy structure and easy to maintain while new features or third-party extensions are added. Under some circumstances, a designer should pursue more of scalability than the system’s current performance.\nWhen talking about software design, people always mention scalability. A framework with good scalability requires the following:\n1.The framework should follow opening/closed principle: software entities should be open for extension, but closed for modification; This means a framework should allow the maintainer to add new functions with as few modifications as possible.\n2.The framework should allow the user to add new functions by adding code on his project without modifying the framework's original source code base.\nWith microkernel architecture and extension mechanism, Dubbo satisfies such requirements and achieves good scalability. In the following chapters, we will discuss Dubbo's extension mechanism in detail.</p>\n<h2>2.Extension Solutions</h2>\n<p>Creating Extensible applications usually considers:</p>\n<ul>\n<li>Factory method pattern</li>\n<li>IoC container</li>\n<li>OSGi (Open Services Gateway initiative)</li>\n</ul>\n<p>As a framework, Dubbo does not wish to rely on other IoC containers such as Spring, Guice. OSGi is too complicated to fit Dubbo. In the end, Dubbo SPI is inherited from standard JDK SPI and makes it more powerful.</p>\n<h2>3.Java SPI Mechanism</h2>\n<p>We will first discuss Java SPI mechanism, which is a basis for understanding Dubbo’s extension mechanism. If you are familiar with Java SPI, you can skip this part.</p>\n<p>Java SPI (Service Provider Interface) is a feature for discovering and loading implementations matching a given interface provided in JDK. We can create a text file with the same name as the interface under resource directory <code>META-INF/services</code>. The content of the file is the fully qualified class name of the SPI implementation, in which each component is separated by a line breaker. JDK uses <code>java.util.ServiceLoader</code> to load implementations of a service. Let us use a simple example to show how Java SPI works.</p>\n<ol>\n<li>Define an interface IRepository to store data.</li>\n</ol>\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\">IRepository</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(String data)</span></span>;\n}\n</code></pre>\n<ol start=\"2\">\n<li>Create 2 implementations for IRepository: MysqlRepository and MongoRepository</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MysqlRepository</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IRepository</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(String data)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"Save \"</span> + data + <span class=\"hljs-string\">\" to Mysql\"</span>);\n    }\n}\n</code></pre>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MongoRepository</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IRepository</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(String data)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"Save \"</span> + data + <span class=\"hljs-string\">\" to Mongo\"</span>);\n    }\n}\n</code></pre>\n<ol start=\"3\">\n<li>Create a configuration file under <code>META-INF/services</code>.</li>\n</ol>\n<p>The file name is <code>META-INF/services/com.demo.IRepository</code>, the content of file is:</p>\n<pre><code class=\"language-text\">com.demo.MongoRepository\ncom.demo.MysqlRepository\n</code></pre>\n<ol start=\"4\">\n<li>Load IRepository using ServiceLoader</li>\n</ol>\n<pre><code class=\"language-java\">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository.class);\nIterator&lt;IRepository&gt; it = serviceLoader.iterator();\n<span class=\"hljs-keyword\">while</span> (it != <span class=\"hljs-keyword\">null</span> &amp;&amp; it.hasNext()){\n    IRepository demoService = it.next();\n    System.out.println(<span class=\"hljs-string\">\"class:\"</span> + demoService.getClass().getName());\n    demoService.save(<span class=\"hljs-string\">\"tom\"</span>);\n}\n</code></pre>\n<p>In the above example, we created an extension and two of its applications. We created the configuration file in ClassPath and loaded the extensions using ServiceLoader. The final output is:\nclass:testDubbo.MongoRepository\nSave tom to Mongo\nclass:testDubbo.MysqlRepository\nSave tom to Mysql</p>\n<h2>4. Dubbo SPI Mechanism</h2>\n<p>Java SPI is simple to use. It also supports basic extension point functions, however, it has some disadvantages:</p>\n<ul>\n<li>It will load and instantiate all implementations at once to find the requested implementation.</li>\n<li>The configuration file only includes the extension implementation but does not name them, which makes it hard to reference them in applications.</li>\n<li>If extensions depend on other extensions, Java SPI cannot automatically load the dependency SPI.</li>\n<li>It does not provide functions such as IOC or AOP in Spring.</li>\n<li>It is hard to assemble extensions with other frameworks. For example, if the extension depends on Spring bean, the original Java SPI will not support it.</li>\n</ul>\n<p>Therefore, Java SPI is good for some simple scenarios, but does not fit for Dubbo. Dubbo makes some extensions on the original SPI mechanism. We will discuss more about the Dubbo SPI mechanism in the following sections.</p>\n<h2>5. Basic Concepts for Dubbo Extension Point Mechanism</h2>\n<p>Before diving into Dubbo's extension mechanism,Let us first declare some basic concepts in Dubbo SPI. Those terms will appear multiple times in the following section.</p>\n<h3>5.1 Extension Point</h3>\n<p>an interface of java.</p>\n<h3>5.2 Extension</h3>\n<p>an implementation class of the Extension Point</p>\n<h3>5.3 Extension Instance</h3>\n<p>instance of an extension point implementation class</p>\n<h3>5.4 Extension Adaptive Instance</h3>\n<p>Maybe it is a little difficult to understand this concept when hearing about it the first time. It may help you understand it better by calling it an extension proxy class. The extension adaptive instance is actually an extension proxy, which implements the method of extension point interface. When calling the interface method of the extension point, it will decide which extension to use according to the actual parameters. For example, the extension point of an IRepository has one save method, and two implementations MysqlRepository and MongoRepository. When calling the method of the interface, the adaptive instance of IRepository will determine which IRepository implementation to call according to the parameters in the save method. If the parameter repository=mysql in the method, then we can call the save method of MysqlRepository. If repository=mongo, then we can call the save method of MongoRepository, which is similar to late binding in Object-oriented languages. However, why does Dubbo introduce the concept of extended adaptive instances?</p>\n<ul>\n<li>There are two configurations in Dubbo, one is a fixed system-level configuration and it will not be changed after Dubbo launches. Another is the run-time configuration that may be different for each RPC. For instance, the timeout is configured as 10 seconds in the xml file, which will not change after Dubbo launches. However, for a certain PRC call, we can set its timeout to 30 seconds so as to override the system-level configuration. For Dubbo, the parameters called in each RPC is unknown and only at run-time can you make the right decision according to revealed parameters.</li>\n<li>Our class is usually singleton-scaled, such as beans of Spring IoC Container. When instantiating beans, if it depends on some specific extension point, it will know which extension to use, otherwise, the bean will not know how to choose extensions. At this time, a proxy mode is needed, which implements the interface  of an extension point. The method can dynamically select the appropriate extension according to the run-time parameters, and this proxy is an adaptive instance. Adaptive extension instance is widely used in Dubbo, in Dubbo, each extension will have an adaptive class, and if we do not provide it, Dubbo will automatically generate one for us by using the bytecode encoder. Therefore, we basically don't recognize the existence of adaptive classes. We will explain how the adaptive class works in later chapters.</li>\n</ul>\n<h3>5.5 @SPI</h3>\n<p>@SPI annotation works on the interface of the extension point, which indicates that the interface is an extension point, and can be loaded by Dubbo ExtentionLoader. If there is no such ExtentionLoader, the call will throw an exception.</p>\n<h3>5.6 @Adaptive</h3>\n<p>@Adaptive annotation is used on the method that extends the interface, which indicates an adaptive method. When Dubbo generates an adaptive instance for an extension point, if the function has @Adaptive annotation, then Dubbo will generate the corresponding code for the method. The method determines which extension to use according to the parameters. When @Adaptive annotation is used on the class to implement a Decorator class, it is similar to the Decorator pattern, whose major function is to return a specified class. Currently in Dubbo, both AdaptiveCompiler and AdaptiveExtensionFactory have @Adaptive annotation.</p>\n<h3>5.7 ExtentionLoader</h3>\n<p>Similar to the Java SPI ServiceLoader, it is responsible for loading extensions and life-cycle maintenance.</p>\n<h3>5.8 Extension Alias</h3>\n<p>Different from Java, each extension in Dubbo has an alias, which is used to reference them in the application, such as</p>\n<pre><code class=\"language-bash\">random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance\nroundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance\n</code></pre>\n<p>where random, roundrobin are alias of the corresponding extensions, and we can directly use them in the configuration file.</p>\n<h3>5.9 Paths</h3>\n<p>Similar to the way Java SPI loading the extension configuration from the <code>META-INF/services</code> directory, Dubbo will also load the extension configuration file from the following path:</p>\n<ul>\n<li><code>META-INF/dubbo/internal</code></li>\n<li><code>META-INF/dubbo</code></li>\n<li><code>META-INF/services</code></li>\n</ul>\n<h2>6. Interpretation for Dubbo's LoadBalance Extension Point</h2>\n<p>Now that we know some basic idea about Dubbo, let us check a practical extension point in Dubbo to get some intuition.</p>\n<p>We take the Dubbo’s LoadBalance extension point as an example. A service in Dubbo usually has multiple providers. When a consumer calls the service, he needs to choose one of the providers. This is an example of LoadBalance. Now, let us figure out how LoadBalance becomes an extension point in Dubbo.</p>\n<h3>6.1 LoadBalance Interfance</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SPI</span>(RandomLoadBalance.NAME)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n\n    <span class=\"hljs-meta\">@Adaptive</span>(<span class=\"hljs-string\">\"loadbalance\"</span>)\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n}\n</code></pre>\n<p>LoadBalance interface has only one select method. Select method chose one invoker among multiple invokers. In the code above, the elements related to Dubbo SPI are:</p>\n<ul>\n<li>@SPI(<a href=\"http://RandomLoadBalance.NAME\">RandomLoadBalance.NAME</a>) @SPI is used for LoadBalance interface, which indicates that the LoadBalance interface is an extension point. Without the @SPI annotation, if we try to load the extension, it will throw an exception. @SPI annotation has one parameter, and this parameter represents the Alias of the default implementation of the extension point. If there has no explicitly specified extension, the default implementation will be used.\n<code>RandomLoadBalance.NAME</code> is a constant with value “random” and is a random load balancing implementation. The definition of random is in the configuration file <code>META-INF/dubbo/internal/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>:</li>\n</ul>\n<pre><code class=\"language-bash\">random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance\nroundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance\nleastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance\nconsistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance\n</code></pre>\n<p>There are four extension implementations of LoadBalance defined in the configuration file. The implementation of load balancing will not be covered in this article. The only thing we need to know is that Dubbo provides four kinds of load balancing implementations. We can explicitly specify an implementation by using xml file, properties file or JVM parameter. If there has no explicitly specified implementation, Dubbo will use random as default.</p>\n<p><img src=\"https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo_loadbalance.png\" alt=\"dubbo-loadbalance | left\"></p>\n<ul>\n<li>@Adaptive(&quot;loadbalance&quot;)  Applying @Adaptive annotation on select method indicates that select method is an adaptive method. Dubbo will automatically generate the corresponding code for the method. When select method is called, it will decide which extension to apply based on the method parameters. @Adaptive parameter <code>loadbalance</code> indicates that the value of loadbalance in method is the extension implementation that will be actually called. However, we cannot find loadbalance parameter in select method, then how can we obtain the value of loadbalance? There is another URL-type parameter in select method, and Dubbo obtains the value of loadbalance from that URL. Here we need to use Dubbo’s URL bus pattern, in one word, URL contains all the parameters in RPC. There is a member variable <code>Map&lt;String, String&gt;parameters</code> in the URL class, which contains loadbalance as a parameter</li>\n</ul>\n<h3>6.2 Obtain LoadBalance extension</h3>\n<p>The code of LoadBalance in Dubbo is as follows:</p>\n<pre><code class=\"language-java\">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName);\n</code></pre>\n<p>Using ExtensionLoader.getExtensionLoader(LoadBalance.class) method to obtain an implementation of ExtensionLoader, then we call getExtension and pass an extension alias to obtain the corresponding extension implementation.</p>\n<h2>7. Customize a LoadBalance Extension</h2>\n<p>In this session, we will use a simple example to implement a LoadBalance and integrate it into Dubbo. I will show some important steps and codes, and the complete demo can be downloaded from the following address(<a href=\"https://github.com/vangoleo/dubbo-spi-demo\">https://github.com/vangoleo/dubbo-spi-demo</a>).</p>\n<h3>7.1 implement LoadBalance Interface</h3>\n<p>First, we build a LoadBalance instance. Since we just need the instance to demonstrate Dubbo extension mechanism, it will be very simple. We choose the first invoker and print a log sentence in the console.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.dubbo.spi.demo.consumer;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoLoadBalance</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        System.out.println(<span class=\"hljs-string\">\"DemoLoadBalance: Select the first invoker...\"</span>);\n        <span class=\"hljs-keyword\">return</span> invokers.get(<span class=\"hljs-number\">0</span>);\n    }\n}\n</code></pre>\n<h3>7.2 Add extension configuration file</h3>\n<p>Add file:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>. The content of file is:</p>\n<pre><code class=\"language-bash\">demo=com.dubbo.spi.demo.consumer.DemoLoadBalance\n</code></pre>\n<h3>7.3 Configure customized LoadBalance</h3>\n<p>Through the above 2 steps, we have already added a LoadBalance implementation named demo, and set up the configuration file. In the next step, we need to explicitly tell Dubbo to implement the demo while doing load balancing. If we use Dubbo through spring, we could set it up in the xml file.</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.dubbo.spi.demo.api.IHelloService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"demo\"</span> /&gt;</span>\n</code></pre>\n<p>Configure &lt;loadbalance=&quot;demo&quot;&gt; in <a href=\"dubbo:reference\">dubbo:reference</a> at consumer part.</p>\n<h3>7.4 launch Dubbo</h3>\n<p>Launch Dubbo and call IHelloService, the console will output log: <code>DemoLoadBalance: Select the first invoker...</code>, which means Dubbo does use our customized LoadBalance.</p>\n<h2>Summary</h2>\n<p>So far, we learnt the basic concepts of Dubbo SPI beginning with Java SPI, and we used LoadBalance in Dubbo as an example to help us understand better. Finally, we practiced and created a customized LoadBalance and integrated it to Dubbo. We believe that combining concepts and practice, everyone can get a better idea of Dubbo’s scalability. To summarize, Dubbo SPI has the following features:</p>\n<ul>\n<li>Build extensions on Dubbo does not require modifications on the original source code base.</li>\n<li>The customized Dubbo extension point implementation is a normal Java class. Dubbo does not introduce any specialized elements, and have almost zero code intrusion.\n*Extension registration on Dubbo requires only configuration file under the ClassPath directory. It is simple to use and has no effect on the existing code. This meets opening/closed principle.</li>\n<li>Dubbo's extension mechanism default: @SPI(&quot;dubbo&quot;) represents the default SPI object.</li>\n<li>Dubbo's extension mechanism supports the advanced features such as IoC and AoP, etc.</li>\n<li>Dubbo's extension mechanism supports third-party IoC containers. It supports Spring beans by default and can be extended to other containers, such as Google/Guice.</li>\n<li>It is easy to switch the implementation of the extension point because it requires only modifications on the specific implementation in the configuration file without changing the code.</li>\n</ul>\n<p>In the next article, we will go deep and check Dubbo's source code to learn more about Dubbo's extensibility mechanism.</p>\n",
-  "title": "Dubbo Extension Mechanism in Action",
-  "keywords": "Dubbo, SPI",
-  "description": "This article introduces Dubbo's SPI mechanism."
+  "link": "/en-us/blog/introduction-to-dubbo-spi.html",
+  "meta": {
+    "title": "Dubbo Extension Mechanism in Action",
+    "keywords": "Dubbo, SPI",
+    "description": "This article introduces Dubbo's SPI mechanism."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/pinpoint.json b/en-us/blog/pinpoint.json
index eec101dc..80cf5c96 100644
--- a/en-us/blog/pinpoint.json
+++ b/en-us/blog/pinpoint.json
@@ -1,7 +1,10 @@
 {
   "filename": "pinpoint.md",
   "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).</p>\n<h2>What is Pinpoint</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a> is an APM (Application Performance Management) tool for large-scale distributed systems written in Java. Inspired by Dapper, Pinpoint provides a solution to help analyze the overall structure of the system and how components within them are interconnected by tracing transactions across distributed applications.</p>\n<p>You should definitely check Pinpoint out If you want to</p>\n<p>understand your application topology at a glance\nmonitor your application in Real-Time\ngain code-level visibility to every transaction\ninstall APM Agents without changing a single line of code\nhave minimal impact on the performance (approximately 3% increase in resource usage)</p>\n<h3>ServerMap</h3>\n<p>Understand the topology of any distributed systems by visualizing how their components are interconnected. Clicking on a node reveals details about the component, such as its current status, and transaction count.</p>\n<h3>Realtime Active Thread Chart</h3>\n<p>Monitor active threads inside applications in real-time.</p>\n<h3>Request/Response Scatter Chart</h3>\n<p>Visualize request count and response patterns over time to identify potential problems. Transactions can be selected for additional detail by dragging over the chart.</p>\n<h3>CallStack</h3>\n<p>Gain code-level visibility to every transaction in a distributed environment, identifying bottlenecks and points of failure in a single view.</p>\n<h3>Inspector</h3>\n<p>View additional details on the application such as CPU usage, Memory/Garbage Collection, TPS, and JVM arguments.</p>\n<h3>Supported Modules (last updated 2018/04/01)</h3>\n<ul>\n<li>JDK 6+</li>\n<li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li>\n<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>\n<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>\n<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>\n<li>ActiveMQ, RabbitMQ</li>\n<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>\n<li>Arcus, Memcached, Redis, CASSANDRA</li>\n<li>iBATIS, MyBatis</li>\n<li>DBCP, DBCP2, HIKARICP</li>\n<li>gson, Jackson, Json Lib</li>\n<li>log4j, Logback</li>\n</ul>\n<h2>Pinpoint and Dubbo</h2>\n<h3>Quickstart Pinpoint</h3>\n<p><a href=\"http://naver.github.io/pinpoint/quickstart.html\">Quick start</a>(No neet to start TestApp)</p>\n<h3>Dubbo demo</h3>\n<h4>Create API module</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span>\n         <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n         <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<p>Create API interface:</p>\n<pre><code>package com.example.demoapi;\n\npublic interface HelloService {\n    String sayHello(String name);\n}\n</code></pre>\n<h4>Dubbo provider</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li><code>HelloService</code> interface:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider.provider;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n\n<span class=\"hljs-meta\">@Service</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n        application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n        protocol = <span class=\"hljs-string\">\"${dubbo.protocol.id}\"</span>,\n        registry = <span class=\"hljs-string\">\"${dubbo.registry.id}\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        i++;\n        <span class=\"hljs-keyword\">if</span> (i % <span class=\"hljs-number\">3</span> == <span class=\"hljs-number\">0</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"ex\"</span>);\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\"!\"</span>;\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Spring Boot bootstrap:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoProviderApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li><code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">server.port</span> = <span class=\"hljs-string\">9090</span>\n<span class=\"hljs-meta\">management.port</span> = <span class=\"hljs-string\">9091</span>\n<span class=\"hljs-comment\">\n# Service version</span>\n<span class=\"hljs-meta\">demo.service.version</span> = <span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Base packages to scan Dubbo Components (e.g @Service , @Reference)</span>\n<span class=\"hljs-meta\">dubbo.scan.basePackages</span>  = <span class=\"hljs-string\">com.example.demoprovider</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span> = <span class=\"hljs-string\">12345</span>\n<span class=\"hljs-comment\">\n## RegistryConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.registry.id</span> = <span class=\"hljs-string\">my-registry</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span> = <span class=\"hljs-string\">N/A</span>\n</code></pre>\n<h4>Dubbo consumer</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classifier</span>&gt;</span>exec<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">classifier</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li><code>@Reference</code> injection <code>HelloService</code></li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer.controller;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Reference;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestMapping;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RestController;\n\n<span class=\"hljs-meta\">@RestController</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerController</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n            application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n            url = <span class=\"hljs-string\">\"dubbo://&lt;Real IP Address&gt;:12345\"</span>)\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-meta\">@RequestMapping</span>(<span class=\"hljs-string\">\"/sayHello\"</span>)\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(@RequestParam String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> helloService.sayHello(name);\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Spring Boot bootstrap:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoConsumerApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li><code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">server.port</span>=<span class=\"hljs-string\">8080</span>\n<span class=\"hljs-meta\">management.port</span>=<span class=\"hljs-string\">8081</span>\n<span class=\"hljs-comment\">\n# Service Version</span>\n<span class=\"hljs-meta\">demo.service.version</span>=<span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">12345</span>\n</code></pre>\n<h3>Using Pinpoint-agent to start <code>Dubbo provider</code> and <code>Dubbo consumer</code></h3>\n<ol>\n<li>Maven clean package</li>\n</ol>\n<pre><code>mvn clean package\n</code></pre>\n<ol start=\"2\">\n<li>Start provider</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar\n</code></pre>\n<ol start=\"3\">\n<li>Start consumer</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-consumer -Dpinpoint.applicationName=DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar\n</code></pre>\n<ol start=\"4\">\n<li>Access the consumer address to simulate user requests</li>\n</ol>\n<p><code>http://localhost:8080/sayHello?name=ABC</code></p>\n<h2>Using Pinpoint locate problems</h2>\n<h3>Homepage</h3>\n<p><img src=\"../../img/blog/en_pinpoint-home.png\" alt=\"/admin-guide/images/pinpoint-home.png\"></p>\n<blockquote>\n<p>The user request here is double the number of requests for DubboProvider, because the favicon.ico icon request is recorded.</p>\n</blockquote>\n<h3>Call tree</h3>\n<p><img src=\"../../img/blog/en_pinpoint-calltree.png\" alt=\"/admin-guide/images/pinpoint-calltree.png\"></p>\n<h3>Mixed view</h3>\n<p><img src=\"../../img/blog/en_pinpoint-mixedview.png\" alt=\"/admin-guide/images/pinpoint-mixedview.png\"></p>\n<h3>Other</h3>\n<p>The example simply simulates the provision and call of Dubbo, and does not carry out the application of other middleware such as database. For detailed use, please refer to the Pinpoint document.</p>\n",
-  "title": "Tracking with Pinpoint",
-  "keywords": "Dubbo, Pinpoint, tracing",
-  "description": "This article introduces how to use Pinpoint to track Dubbo applications and monitor applications' performance."
+  "link": "/en-us/blog/pinpoint.html",
+  "meta": {
+    "title": "Tracking with Pinpoint",
+    "keywords": "Dubbo, Pinpoint, tracing",
+    "description": "This article introduces how to use Pinpoint to track Dubbo applications and monitor applications' performance."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/prepare-an-apache-release.json b/en-us/blog/prepare-an-apache-release.json
index ffdde29f..7caf8c6a 100644
--- a/en-us/blog/prepare-an-apache-release.json
+++ b/en-us/blog/prepare-an-apache-release.json
@@ -1,6 +1,9 @@
 {
   "filename": "prepare-an-apache-release.md",
   "__html": "<h2>Understanding the Apache Release Cycle</h2>\n<p>In general, Source Release is the key and the required content of Apache. But Binary Release is optional, Dubbo can choose whether to release binary packages to the Apache repository or to the Maven central repository.</p>\n<p>Please refer to the following links for more information on ASF's release guide:</p>\n<ul>\n<li><a href=\"http://www.apache.org/dev/release-publishing\">Apache Release Guide</a></li>\n<li><a href=\"http://www.apache.org/dev/release.html\">Apache Release Policy</a></li>\n<li><a href=\"http://www.apache.org/dev/publishing-maven-artifacts.html\">Maven Release Info</a></li>\n</ul>\n<h2>Preparation of Local Building Environment</h2>\n<p>Mainly including the related preparation of signature utilities and Maven repository certification</p>\n<ol>\n<li>\n<p>Install GPG,refer to <a href=\"https://www.gnupg.org/download/index.html\">https://www.gnupg.org/download/index.html</a></p>\n<ul>\n<li>For example, in Mac OS</li>\n</ul>\n<pre><code class=\"language-sh\">$ brew install gpg\n$ gpg --version <span class=\"hljs-comment\">#check version,should be 2.x</span>\n</code></pre>\n</li>\n<li>\n<p>Generate the key with GPG</p>\n<ul>\n<li>Generate the key according to the prompt</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> gpg2 --full-gen-key</span>\ngpg (GnuPG) 2.0.12; Copyright (C) 2009 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nPlease select what kind of key you want:\n  (1) RSA and RSA (default)\n  (2) DSA and Elgamal\n  (3) DSA (sign only)\n  (4) RSA (sign only)\nYour selection? 1\nRSA keys may be between 1024 and 4096 bits long.\nWhat keysize do you want? (2048) 4096\nRequested keysize is 4096 bits\nPlease specify how long the key should be valid.\n        0 = key does not expire\n     &lt;n&gt;  = key expires in n days\n     &lt;n&gt;w = key expires in n weeks\n     &lt;n&gt;m = key expires in n months\n     &lt;n&gt;y = key expires in n years\nKey is valid for? (0) \nKey does not expire at all\nIs this correct? (y/N) y\n\nGnuPG needs to construct a user ID to identify your key.\n\nReal name: Robert Burrell Donkin\nEmail address: rdonkin@apache.org\nComment: CODE SIGNING KEY\nYou selected this USER-ID:\n   \"Robert Burrell Donkin (CODE SIGNING KEY) &lt;rdonkin@apache.org&gt;\"\n\nChange (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O\nYou need a Passphrase to protect your secret key. # enter the password, which will be used frequently when packaging.\n</code></pre>\n<ul>\n<li>View key id</li>\n</ul>\n<pre><code class=\"language-sh\">$ gpg --list-keys\npub   rsa4096/28681CB1 2018-04-26 <span class=\"hljs-comment\"># 28681CB1 is the key id</span>\nuid       [ultimate] liujun (apache-dubbo) &lt;liujun@apache.org&gt;\nsub   rsa4096/D3D6984B 2018-04-26\n\n<span class=\"hljs-comment\"># send public key to keyserver via key id </span>\n$ gpg --keyserver pgpkeys.mit.edu --send-key 28681CB1\n<span class=\"hljs-comment\"># Here pgpkeys.mit.edu is a random selection of keyserver. Any key server from the list https://sks-keyservers.net/status/ is acceptable because they are automatically synchronized.</span>\n</code></pre>\n<ul>\n<li>If there are multiple public keys,set the default key</li>\n</ul>\n<p>~/.gnupg/gpg.conf</p>\n<pre><code class=\"language-proper\"># If you have more than 1 secret key in your keyring, you may want to\n# uncomment the following option and set your preferred keyid.\n\ndefault-key 28681CB1\n</code></pre>\n</li>\n<li>\n<p>Set up Apache central repository.</p>\n<ul>\n<li>The parent pom of Dubbo project is apache pom</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>apache<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>19<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n</code></pre>\n<ul>\n<li>\n<p>Add the following contents to .m2/settings.xml</p>\n<p>Enter the passwords after\nencrypting by <a href=\"http://maven.apache.org/guides/mini/guide-encryption.html\">maven-encryption-plugin</a></p>\n</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">settings</span>&gt;</span>\n...\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servers</span>&gt;</span>\n   <span class=\"hljs-comment\">&lt;!-- To publish a snapshot of some part of Maven --&gt;</span>\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>apache.snapshots.https<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">username</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP USERNAME --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">username</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">password</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">password</span>&gt;</span>\n   <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">server</span>&gt;</span>\n   <span class=\"hljs-comment\">&lt;!-- To stage a release of some part of Maven --&gt;</span>\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>apache.releases.https<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">username</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP USERNAME --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">username</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">password</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">password</span>&gt;</span>\n   <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">server</span>&gt;</span>\n  ...\n     <span class=\"hljs-comment\">&lt;!-- gpg passphrase used when generate key --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>gpg.passphrase<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">passphrase</span>&gt;</span><span class=\"hljs-comment\">&lt;!-- yourKeyPassword --&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">passphrase</span>&gt;</span>\n   <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">server</span>&gt;</span>\n <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servers</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">settings</span>&gt;</span>\n</code></pre>\n</li>\n</ol>\n<h2>Pack &amp; Upload</h2>\n<ol>\n<li>\n<p>Pull the new branch from the master branch as the release branch. If you want to release the ${release_version} version now, pull the new branch ${release_version}-release from 2.6.x. Then the\nmodifications and taggings related to ${release_version} Release Candidates are applied to ${release_version}-release branch, and is merged into the master branch after the final release.</p>\n</li>\n<li>\n<p>First of all, verify that the maven component packing, source packing, signature, etc are working properly on the ${release_version}-release branch.</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn clean install -Papache-release</span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn deploy</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> push the snapshot package to the maven central repository,<span class=\"hljs-keyword\">in</span> staging state</span>\n</code></pre>\n</li>\n<li>\n<p>Release with maven-release-plugin</p>\n<ul>\n<li>verify with dryRun</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn release:prepare -Papache-release -Darguments=<span class=\"hljs-string\">\"-DskipTests\"</span> -DautoVersionSubmodules=<span class=\"hljs-literal\">true</span> -Dusername=YOUR GITHUB ID -DdryRun=<span class=\"hljs-literal\">true</span></span>\n</code></pre>\n<ul>\n<li>After verification, run release:prepare</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn release:clean</span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn release:prepare -Papache-release -Darguments=<span class=\"hljs-string\">\"-DskipTests\"</span> -DautoVersionSubmodules=<span class=\"hljs-literal\">true</span> -Dusername=YOUR GITHUB ID</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> After running:1. Generate source.zip; 2. Tag and push to github repository; 3. The branch version is upgraded to <span class=\"hljs-variable\">${release_version}</span>-SNAPSHOT automatically and the modifications are pushed to the github repository</span>\n</code></pre>\n<ul>\n<li>Run release:perform, make an offical release</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn -Prelease release:perform -Darguments=<span class=\"hljs-string\">\"-DskipTests\"</span> -DautoVersionSubmodules=<span class=\"hljs-literal\">true</span> -Dusername=YOUR GITHUB ID</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> All artifacts are released to  configured remote maven central repository, <span class=\"hljs-keyword\">in</span> staging state </span>\n</code></pre>\n</li>\n</ol>\n<h2>Prepare Apache Release</h2>\n<ol>\n<li>\n<p>Prepare the svn local environment (Apache hosting the release content of project by svn)</p>\n</li>\n<li>\n<p>Checkout dubbo to local directory</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> svn checkout https://dist.apache.org/repos/dist/dev/incubator/dubbo</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> Assume that the <span class=\"hljs-built_in\">local</span> directory is</span>\n~/apache/incubator/dubbo\n</code></pre>\n</li>\n<li>\n<p>The current release version is ${release_version},new directory</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> <span class=\"hljs-built_in\">cd</span> ~/apache/incubator/dubbo <span class=\"hljs-comment\"># dubbo svn root directory</span></span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mkdir <span class=\"hljs-variable\">${release_version}</span></span>\n</code></pre>\n</li>\n<li>\n<p>Add public key to <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS\">KEYS</a> file.KEYS is mainly used to allow people who participate in the voting to be imported locally to verify the correctness of the sign.</p>\n</li>\n<li>\n<p>Copy the source.zip package from the Dubbo root directory to the svn local repository dubbo/${release_version}</p>\n</li>\n<li>\n<p>Generate sha512 sign</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> shasum -a 512 apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-<span class=\"hljs-built_in\">source</span>-release.zip &gt;&gt; apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-<span class=\"hljs-built_in\">source</span>-release.zip.sha512</span>\n</code></pre>\n</li>\n<li>\n<p>If the binary release is accompanied with the source release</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">#</span><span class=\"bash\"> In the module of the dubbo project distribution</span>\nrun:\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn install</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> In target directory,copy bin-release.zip and bin-release.zip.asc to svn <span class=\"hljs-built_in\">local</span> repository dubbo/<span class=\"hljs-variable\">${release_version}</span></span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> Refer to the six step,generate sha512 sign</span>\n</code></pre>\n</li>\n<li>\n<p>Commit to Apache svn</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> svn status</span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> svn commit -m <span class=\"hljs-string\">'prepare for ${release_version} RC1'</span></span>\n</code></pre>\n</li>\n</ol>\n<h2>Verify Release Candidates</h2>\n<p>The verification link includes but is not limited to the following contents and forms:</p>\n<ol>\n<li>Check signatures and hashes are good</li>\n</ol>\n<ul>\n<li>sha512</li>\n</ul>\n<pre><code class=\"language-sh\">$ shasum -c apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-<span class=\"hljs-built_in\">source</span>-release.zip.sha512\n$ shasum -c apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-bin-release.zip.sha512\n</code></pre>\n<ul>\n<li>gpg\n<ul>\n<li>If it's your first time verify a release candidte, you should import public keys first.</li>\n</ul>\n<pre><code class=\"language-sh\">$ curl https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS &gt;&gt; KEYS <span class=\"hljs-comment\"># download public keys to local directory</span>\n$ gpg --import KEYS <span class=\"hljs-comment\"># import keys</span>\n$ gpg —edit-key liujun\n  &gt; trust <span class=\"hljs-comment\"># type trust command</span>\n</code></pre>\n<ul>\n<li>Now, you can verify signature with command</li>\n</ul>\n<pre><code>gpg --verify apache-dubbo-incubating-2.6.3-source-release.zip.asc apache-dubbo-incubating-2.6.3-source-release.zip\n</code></pre>\n</li>\n</ul>\n<ol start=\"2\">\n<li>Unzip apache-dubbo-incubating-${release_version}-source-release.zip to the default directory and check the following:</li>\n</ol>\n<ul>\n<li>\n<p>Directory with 'incubating' in name\n<code>apache-dubbo-incubating-${release_version}-source-release</code></p>\n</li>\n<li>\n<p>DISCLAIMER exists</p>\n</li>\n<li>\n<p>LICENSE and NOTICE exists and contents are good</p>\n</li>\n<li>\n<p>All files and no binary files exist</p>\n</li>\n<li>\n<p>All files has standard ASF License header</p>\n</li>\n<li>\n<p>Can compile from source</p>\n</li>\n<li>\n<p>All unit tests can pass</p>\n<pre><code class=\"language-sh\">mvn clean <span class=\"hljs-built_in\">test</span> <span class=\"hljs-comment\"># This will run all unit tests</span>\n<span class=\"hljs-comment\"># you can also open rat and style plugin to check if every file meets requirements.</span>\nmvn clean <span class=\"hljs-built_in\">test</span> -Drat.skip=<span class=\"hljs-literal\">false</span> -Dcheckstyle.skip=<span class=\"hljs-literal\">false</span>\n</code></pre>\n</li>\n<li>\n<p>Release candidates match with corresponding tags, you can find tag link and hash in vote email.</p>\n<ul>\n<li>check the version number in pom.xml are the same</li>\n<li>check there are no extra files or directories in the source package, for example, no empty directories or useless log files.<br>\n<code>diff -r a rc_dir tag_dir</code></li>\n<li>check the top n tag commits, dive into the related files and check if the source package has the same changes</li>\n</ul>\n</li>\n</ul>\n<ol start=\"3\">\n<li>Unzip apache-dubbo-incubating-${release_version}-bin-release.zip and check:</li>\n</ol>\n<ul>\n<li>Check signatures are good</li>\n<li>'incubating' in name</li>\n<li>LICENSE and NOTICE exists and contents are good</li>\n</ul>\n<h2>Begin voting</h2>\n<p>The voting is divided into two phases:</p>\n<ol>\n<li>Dubbo community votes and sends the voting email to <a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a>. After reviewing by community developers and winning 3 binding tickets that agree to release, you can go to the next stage of voting.</li>\n<li>Apache community votes and sends the voting email to <a href=\"mailto:general@apache.org\">general@apache.org</a>. After reviewing by Apache PMC Review and winning 3 binding tickets that agree to release,you will be allowed to release officially.</li>\n<li>Publish <a href=\"https://github.com/apache/incubator-dubbo/releases\">release notes</a> on Github.</li>\n<li>Update the recommend dependency on <a href=\"https://github.com/apache/incubator-dubbo#maven-dependency\">Github</a> to the latest version, also update the version in other place if necessary.</li>\n<li>Announce on the <a href=\"http://dubbo.apache.org/\">official site</a> that the version was successfully released.</li>\n</ol>\n<p>Mail template:</p>\n<pre><code class=\"language-tex\">Hello Dubbo Community,\n\nThis is a call for vote to release Apache Dubbo (Incubating) version 2.6.2.\n\nThe release candidates:\nhttps://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/\n\nGit tag for the release:\nhttps://github.com/apache/incubator-dubbo/tree/dubbo-2.6.2\n\nHash for the release tag:\nafab04c53edab38d52275d2a198ea1aff7a4f41e\n\nRelease Notes:\nhttps://github.com/apache/incubator-dubbo/releases/tag/untagged-4775c0a22c60fca55118\n\nThe artifacts have been signed with Key : 28681CB1, which can be found in the keys file:\nhttps://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS\n\nThe vote will be open for at least 72 hours or until necessary number of votes are reached.\n\nPlease vote accordingly:\n\n[ ] +1 approve \n[ ] +0 no opinion \n[ ] -1 disapprove with the reason\n\nThanks,\nThe Apache Dubbo (Incubating) Team\n</code></pre>\n<h2>Official Release</h2>\n<ol>\n<li>Commit release package of  <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo\">https://dist.apache.org/repos/dist/dev/incubator/dubbo</a> to <a href=\"https://dist.apache.org/repos/dist/release/incubator/dubbo/\">https://dist.apache.org/repos/dist/release/incubator/dubbo/</a>, complete official release。</li>\n<li>Send mail to <a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a> and <a href=\"mailto:general@apache.org\">general@apache.org</a>, notify the community that the release is completed.</li>\n</ol>\n<h2>Complete Maven Convenient Binary release(Optional)</h2>\n<p><strong><a href=\"http://apache.repository.org\">apache.repository.org</a> The permissions of the nexus repository have been applied, see <a href=\"https://issues.apache.org/jira/browse/INFRA-16451\">jira</a>。</strong></p>\n<p>The artifacts that were previously published to the maven repository are in the staging state. Log in to <a href=\"http://apache.repository.org\">apache.repository.org</a> with the Apache id and release it.</p>\n",
-  "title": "Understanding the Apache Release Cycle",
-  "keywords": "Dubbo, Apache, Release"
+  "link": "/en-us/blog/prepare-an-apache-release.html",
+  "meta": {
+    "title": "Understanding the Apache Release Cycle",
+    "keywords": "Dubbo, Apache, Release"
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/qcon-beijing-2018.json b/en-us/blog/qcon-beijing-2018.json
index 998de7e8..dbe1503d 100644
--- a/en-us/blog/qcon-beijing-2018.json
+++ b/en-us/blog/qcon-beijing-2018.json
@@ -1,4 +1,6 @@
 {
   "filename": "qcon-beijing-2018.md",
-  "__html": "<h2>Dubbo roadmap is announced in QCon Beijing 2018</h2>\n<p>Ian Luo has delivered a great talk at QCon Beijing 2018, where the roadmap of Dubbo has also be announced. Please enjoy the <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/qcon2018/dubbo-present-and-future.pdf\">slides</a>!</p>\n"
+  "__html": "<h2>Dubbo roadmap is announced in QCon Beijing 2018</h2>\n<p>Ian Luo has delivered a great talk at QCon Beijing 2018, where the roadmap of Dubbo has also be announced. Please enjoy the <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/qcon2018/dubbo-present-and-future.pdf\">slides</a>!</p>\n",
+  "link": "/en-us/blog/qcon-beijing-2018.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/blog/sentinel-introduction-for-dubbo.json b/en-us/blog/sentinel-introduction-for-dubbo.json
index 7539faa5..1454dded 100644
--- a/en-us/blog/sentinel-introduction-for-dubbo.json
+++ b/en-us/blog/sentinel-introduction-for-dubbo.json
@@ -1,7 +1,10 @@
 {
   "filename": "sentinel-introduction-for-dubbo.md",
   "__html": "<h1>Sentinel: The flow sentinel of Dubbo services</h1>\n<p>In large clusters there may be thousands of Dubbo service instances in production, with continuous traffic coming in. However, in distributed systems, some services may be unavailable due to various of failure such as traffic surge, high system load, and network latency. If no control actions are performed, this may cause cascading failure, affecting the availability of the service. So we need a powerful library - Sentinel, which can guarantee the stability of the service, to protect the Dubbo service.</p>\n<h2>Introduction to Sentinel</h2>\n<p><a href=\"https://github.com/alibaba/Sentinel\">Sentinel</a> is a powerful library opensourced by Alibaba Middleware Team. Sentinel takes &quot;<strong>flow</strong>&quot; as the breakthrough point, and covers multiple fields including flow control, concurrency, circuit breaking and load protection to protect service stability.</p>\n<p>There are mainly three features in Sentinel:</p>\n<ul>\n<li><strong>Flow Control</strong>: Sentinel can control the traffic flow of resource calls based on different runtime metrics (such as QPS, number of threads, system load, etc.), for different invocation paths, and adjust random traffic to appropriate shapes (e.g. uniform speed).</li>\n<li><strong>Circuit Breaking</strong>: When a resource in the invocation chain is unstable (average RT increase or exception ratio increase), Sentinel will fast-fail the call request for this resource to avoid affecting other resources, causing cascade failure.</li>\n<li><strong>System Load Protection</strong>: Sentinel can be used to protect your server in case the system load goes too high. It helps you to achieve a good balance between system load and incoming requests.</li>\n</ul>\n<p>The commonly used circuit breaker/isolation library in production is <a href=\"https://github.com/Netflix/Hystrix\">Netflix Hystrix</a>. Hystrix focuses on the concept of isolation, which isolates dependencies (that is resource in Sentinel) through thread pools or semaphores. The benefit of Hystrix thread pool isolation is that the isolation is thorough, but the downside is that you have to create a lot of thread pools, pre-divide dependencies, and allocate thread pools to each dependency. Sentinel provides another idea for resource isolation: it is controlled by <strong>the number of concurrent threads</strong>. In this way, developer does not need to specify the size of the thread pool in advance, and there is less loss of thread context switching. When the resource is in an unstable state, the response time becomes longer and the number of threads gradually increases. When the number of threads of a resource is raised to a threshold, traffic flow limit is triggered until the stacked thread completes the task and then continues to accept the requests.</p>\n<p>Hystrix uses Circuit Breaker Pattern to automatically fast-fail the service when exception ratio exceeds the threshold. Sentinel's circuit breaking feature is more versatile, which supports two metrics: average response time and failure ratio. Sentinel also provides various invocation chain path and flow control effects support, as well as the ability to adjust the traffic in real time according to the system load to protect the system. At the same time, Sentinel also provides a real-time monitoring API and dashboard, which allows developers to quickly understand the current state of the system and understand the stability of the service. The scenarios are more abundant.</p>\n<h2>Best Practice for using Dubbo with Sentinel</h2>\n<p><a href=\"https://github.com/dubbo/dubbo-sentinel-support\">Sentinel Dubbo Adapter</a> provides service consumer filter and provider filter for Dubbo services. We can add the following dependency in <code>pom.xml</code> (if you are using Maven):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.csp<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>sentinel-dubbo-adapter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>x.y.z<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<p>The two filters are enabled by default. Once you add the dependency, the Dubbo services and methods will become protected resources in Sentinel, which can leverage Sentinel's flow control and guard ability when rules are configured. If you don't want to enable the filter, you can manually disable it. For example:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n    ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n    consumerConfig.setFilter(<span class=\"hljs-string\">\"-sentinel.dubbo.consumer.filter\"</span>);\n    <span class=\"hljs-keyword\">return</span> consumerConfig;\n}\n</code></pre>\n<p>We've provided sereval demos, you can check here: <a href=\"https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-dubbo\">sentinel-demo-dubbo</a>。</p>\n<h3>Service Provider</h3>\n<p>Dubbo service providers provide services for outside world and handle requests from consumers. To protect the service provider from suffering the proliferation of traffic flow, you can set flow rules in <strong>QPS mode</strong> to the service provider. Thus, when the number of requests per second exceeds the threshold, new requests are automatically rejected.</p>\n<p>The flow control for Dubbo services has two granularities: service interface and service method.</p>\n<ul>\n<li>Service interface:resourceName format is <code>interfaceName</code>,e.g. <code>com.alibaba.csp.sentinel.demo.dubbo.FooService</code></li>\n<li>Service method:resourceName format is <code>interfaceName:methodSignature</code>,e.g. <code>com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)</code></li>\n</ul>\n<p>For the detail of flow rule configuration and flow control, please refer to <a href=\"https://github.com/alibaba/Sentinel/wiki/Flow-Control\">Flow Control | Sentinel</a>.</p>\n<p>Let's take a look at the effect of the QPS flow control. Assume that we have a service interface <code>com.alibaba.csp.sentinel.demo.dubbo.FooService</code>, which contains a method <code>sayHello(java.lang.String)</code>. We set flow rule for service provider (QPS count = 10). Then we do RPC 15 times at service consumer continuously in 1s. We can see the blocked metrics in the log. The log of blocked calls is located in <code>~/logs/csp/sentinel-block.log</code>:</p>\n<pre><code>2018-07-24 17:13:43|1|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String),FlowException,default,|5,0\n</code></pre>\n<p>Log messages will also appear in provider's metric log:</p>\n<pre><code>1532423623000|2018-07-24 17:13:43|com.alibaba.csp.sentinel.demo.dubbo.FooService|15|0|15|0|3\n1532423623000|2018-07-24 17:13:43|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)|10|5|10|0|0\n</code></pre>\n<p>In many circumstances, it's also significant to control traffic flow based on the <strong>caller</strong>. For example, assuming that there are two services A and B, both of them initiate remote call requests to the service provider. If we want to limit the calls from service B only, we can set the <code>limitApp</code> of flow rule as the identifier of service B (e.g. service name). The Sentinel Dubbo Adapter will automatically resolve the Dubbo consumer's <em>application name</em> as the caller's name (<code>origin</code>), and will bring the caller's name when doing resource protection. If <code>limitApp</code> of flow rules is not configured (<code>default</code>), flow control will take effects on all callers. If <code>limitApp</code> of a flow rule is configured with a caller, then the corresponding flow rule will only take effect on the specific caller.</p>\n<blockquote>\n<p>Note: Dubbo consumer does not provide its Dubbo application name when doing RPC, so developers should manually put the application name into <em>attachment</em> at consumer side, then extract it at provider side. Sentinel Dubbo Adapter has implemented a filter where consumer can carry application name information to provider automatically. If the counsmer does not use Sentinel Dubbo Adapter but requires flow control based on caller, developers can manually put the application name into attachment with the key <code>dubboApplication</code>.</p>\n</blockquote>\n<p>The <code>sentinel-block.log</code> will also record caller name. For example:</p>\n<pre><code>2018-07-25 16:26:48|1|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String),FlowException,default,demo-consumer|5,0\n</code></pre>\n<p>The <code>demo-consumer</code> in the log is the caller name (origin).</p>\n<h3>Service Consumer</h3>\n<p>Dubbo service consumers act as a client to invoke the remote service. Each service may depend on several downstream services. If a service A depends on the downstream service B, and service B is unstable (i.e. the response time becomes longer), the number of threads where service A invokes service B will accumulate, thus may eventually run out of service A's thread pool. We use the thread count to control access to downstream service B. This can ensure service itself not affected by others when downstream services are not stable and reliable. Based on this scenario, it is recommended to set flow rules with <strong>thread count mode</strong> to consumers so that it's not affected by unstable services.</p>\n<p>The thread-count-based flow control mode does not require us to explicitly perform thread pool isolation. Sentinel will control the number of threads of the resource, and the excess requests will be rejected directly until the stacked tasks are completed.</p>\n<h3>Sentinel Dashboard</h3>\n<p>For ease of use, Sentinel provides a Dashboard for configuring rules, viewing monitoring metrics, machine discovery, and more. We only need to start the dashborad according to the <a href=\"https://github.com/alibaba/Sentinel/wiki/Dashboard\">Sentinel dashboard documentation</a>, then add the appropriate parameters to the corresponding application and launch it. For example, the startup parameters of the service provider demo in this article is:</p>\n<pre><code class=\"language-bash\">-Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> -Dcsp.sentinel.api.port=8720 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=dubbo-provider-demo\n</code></pre>\n<p>After launching the service provider demo, we can find our application in the Sentinel dashboard. It's convenient to configure the rules in the dashboard:</p>\n<p><img src=\"../../img/blog/sentinel-dashboard-view-rules.png\" alt=\"Rule List\"></p>\n<p>Or view real-time metrics:</p>\n<p><img src=\"../../img/blog/sentinel-dashboard-metrics.png\" alt=\"Real-time metrics monitoring\"></p>\n<h2>Summary</h2>\n<p>This blog post only introduces the simplest scenario in Sentinel - Traffic Flow Control. Sentinel can handle more complex scenarios like circuit breaking, cold starting and uniform traffic flow. For more scenarios, you can dig into <a href=\"https://github.com/alibaba/Sentinel/wiki\">Sentinel Wiki</a>.</p>\n",
-  "title": "Sentinel: The flow sentinel of Dubbo services",
-  "keywords": "Dubbo, Sentinel, current limit, fuse",
-  "description": "This article introduces the Sentinel and how to integrate it with Dubbo."
+  "link": "/en-us/blog/sentinel-introduction-for-dubbo.html",
+  "meta": {
+    "title": "Sentinel: The flow sentinel of Dubbo services",
+    "keywords": "Dubbo, Sentinel, current limit, fuse",
+    "description": "This article introduces the Sentinel and how to integrate it with Dubbo."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/spring-boot-dubbo-start-stop-analysis.json b/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
index 66ce6c0f..ccd7aa0a 100644
--- a/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
+++ b/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
@@ -1,7 +1,10 @@
 {
   "filename": "spring-boot-dubbo-start-stop-analysis.md",
   "__html": "<h1>Source code analysis of spring-boot+Dubbo App start and stop</h1>\n<h2>Introduction</h2>\n<p><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project\">Dubbo Spring Boot</a> project is dedicated to simplifying the development of the Dubbo RPC framework in the Spring Boot application. It also integrates the feature of Spring Boot:</p>\n<ul>\n<li><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">Autoconfigure</a> (ex: Annotation driver, Autoconfigure, etc.)</li>\n<li><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator\">Production-Ready</a> (ex: Security, Healthy check, Externalize configuration, etc.)</li>\n</ul>\n<h2>The analysis of DubboConsumer startup</h2>\n<p>Have you ever thought about this : since the <code>DubboConsumerDemo</code> application in <code>incubator-dubbo-spring-boot-project</code> has only one line of code, why not just exit directly when the <code>main</code> method is executed?</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.boot.dubbo.demo.consumer.controller\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConsumerDemo</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        SpringApplication.run(DubboConsumerDemo.class,args);\n    }\n\n}\n</code></pre>\n<p>In fact, to answer this question, we need to abstract it first, that is, under what circumstances will a JVM process exit?</p>\n<p>Take Java 8 as an example. By referring to the JVM language specification[1], there is a clear description in Section 12.8:</p>\n<blockquote>\n<p>A program terminates all its activity and <em>exits</em> when one of two things happens:</p>\n<ul>\n<li>All the threads that are not daemon threads terminate.</li>\n<li>Some thread invokes the <code>exit</code> method of class <code>Runtime</code> or class <code>System</code>, and the <code>exit</code> operation is not forbidden by the security manager.</li>\n</ul>\n</blockquote>\n<p>Therefore, in view of the above situation, we judge that there must be some non-daemon thread not exiting. All thread information can be seen by <code>jstack</code>, including whether they are daemon threads, and <code>jstack</code> can be used to find out which threads are non-daemon.</p>\n<pre><code class=\"language-sh\">➜  jstack 57785 | grep tid | grep -v <span class=\"hljs-string\">\"daemon\"</span>\n<span class=\"hljs-string\">\"container-0\"</span> <span class=\"hljs-comment\">#37 prio=5 os_prio=31 tid=0x00007fbe312f5800 nid=0x7103 waiting on condition  [0x0000700010144000]</span>\n<span class=\"hljs-string\">\"container-1\"</span> <span class=\"hljs-comment\">#49 prio=5 os_prio=31 tid=0x00007fbe3117f800 nid=0x7b03 waiting on condition  [0x0000700010859000]</span>\n<span class=\"hljs-string\">\"DestroyJavaVM\"</span> <span class=\"hljs-comment\">#83 prio=5 os_prio=31 tid=0x00007fbe30011000 nid=0x2703 waiting on condition  [0x0000000000000000]</span>\n<span class=\"hljs-string\">\"VM Thread\"</span> os_prio=31 tid=0x00007fbe3005e800 nid=0x3703 runnable\n<span class=\"hljs-string\">\"GC Thread#0\"</span> os_prio=31 tid=0x00007fbe30013800 nid=0x5403 runnable\n<span class=\"hljs-string\">\"GC Thread#1\"</span> os_prio=31 tid=0x00007fbe30021000 nid=0x5303 runnable\n<span class=\"hljs-string\">\"GC Thread#2\"</span> os_prio=31 tid=0x00007fbe30021800 nid=0x2d03 runnable\n<span class=\"hljs-string\">\"GC Thread#3\"</span> os_prio=31 tid=0x00007fbe30022000 nid=0x2f03 runnable\n<span class=\"hljs-string\">\"G1 Main Marker\"</span> os_prio=31 tid=0x00007fbe30040800 nid=0x5203 runnable\n<span class=\"hljs-string\">\"G1 Conc#0\"</span> os_prio=31 tid=0x00007fbe30041000 nid=0x4f03 runnable\n<span class=\"hljs-string\">\"G1 Refine#0\"</span> os_prio=31 tid=0x00007fbe31044800 nid=0x4e03 runnable\n<span class=\"hljs-string\">\"G1 Refine#1\"</span> os_prio=31 tid=0x00007fbe31045800 nid=0x4d03 runnable\n<span class=\"hljs-string\">\"G1 Refine#2\"</span> os_prio=31 tid=0x00007fbe31046000 nid=0x4c03 runnable\n<span class=\"hljs-string\">\"G1 Refine#3\"</span> os_prio=31 tid=0x00007fbe31047000 nid=0x4b03 runnable\n<span class=\"hljs-string\">\"G1 Young RemSet Sampling\"</span> os_prio=31 tid=0x00007fbe31047800 nid=0x3603 runnable\n<span class=\"hljs-string\">\"VM Periodic Task Thread\"</span> os_prio=31 tid=0x00007fbe31129000 nid=0x6703 waiting on condition\n\n</code></pre>\n<blockquote>\n<p>We can find all the thread digests by <code>grep tid</code> here, and find the line that doesn't contain the daemon keyword by <code>grep -v</code> command.</p>\n</blockquote>\n<p>We can get some information from the above results:</p>\n<ul>\n<li>There are two &quot;suspicious&quot; threads : <code>container-0</code>, <code>container-1</code>. They are non-daemon thread in wait state.</li>\n<li>There are alse some threads about GC, and threads that start with <code>VM</code>. They are also some non-daemon threads, but they are most likely the JVM's own threads, which we can ignore for now.</li>\n</ul>\n<p>In summary, we can infer that it is likely that the <code>container-0</code> and <code>container-1</code> cause the JVM to not exit. Now let's search through the source code to find out who created the two threads.</p>\n<p>By the source code analysis of Spring-boot, we can find these code in the <code>startDaemonAwaitThread</code> method of <code>org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer</code>.</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">startDaemonAwaitThread</span><span class=\"hljs-params\">()</span> </span>{\n        Thread awaitThread = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-string\">\"container-\"</span> + (containerCounter.get())) {\n\n            <span class=\"hljs-meta\">@Override</span>\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                TomcatEmbeddedServletContainer.<span class=\"hljs-keyword\">this</span>.tomcat.getServer().await();\n            }\n\n        };\n        awaitThread.setContextClassLoader(getClass().getClassLoader());\n        awaitThread.setDaemon(<span class=\"hljs-keyword\">false</span>);\n        awaitThread.start();\n    }\n</code></pre>\n<p>Let's add a breakpoint in this method, and focus on the call stack:</p>\n<pre><code class=\"language-plain\">initialize:115, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\n&lt;init&gt;:84, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\ngetTomcatEmbeddedServletContainer:554, TomcatEmbeddedServletContainerFactory (org.springframework.boot.context.embedded.tomcat)\ngetEmbeddedServletContainer:179, TomcatEmbeddedServletContainerFactory (org.springframework.boot.context.embedded.tomcat)\ncreateEmbeddedServletContainer:164, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nonRefresh:134, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nrefresh:537, AbstractApplicationContext (org.springframework.context.support)\nrefresh:122, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nrefresh:693, SpringApplication (org.springframework.boot)\nrefreshContext:360, SpringApplication (org.springframework.boot)\nrun:303, SpringApplication (org.springframework.boot)\nrun:1118, SpringApplication (org.springframework.boot)\nrun:1107, SpringApplication (org.springframework.boot)\nmain:35, DubboConsumerDemo (com.alibaba.boot.dubbo.demo.consumer.bootstrap)\n</code></pre>\n<p>It can be seen that during the startup process of the Spring-boot application, the above method is executed since the execution of Tomcat exposes the HTTP service by default. Also, all threads started by Tomcat are daemon threads by default, such as the Acceptor of the listening request, threads in working threads, etc. Thus the JVM will also exit after the startup is complete in there is no extra control here. Therefore, it is necessary to explicitly start a thread and continue to wait under certain conditions, thereby avoid thread exit.</p>\n<p>Let's dig deeper to find out how the thread stay alive in Tomcat's <code>this.tomcat.getServer().await()</code> method.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">await</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">if</span>( port==-<span class=\"hljs-number\">1</span> ) {\n            <span class=\"hljs-keyword\">try</span> {\n                awaitThread = Thread.currentThread();\n                <span class=\"hljs-keyword\">while</span>(!stopAwait) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        Thread.sleep( <span class=\"hljs-number\">10000</span> );\n                    } <span class=\"hljs-keyword\">catch</span>( InterruptedException ex ) {\n                        <span class=\"hljs-comment\">// continue and check the flag</span>\n                    }\n                }\n            } <span class=\"hljs-keyword\">finally</span> {\n                awaitThread = <span class=\"hljs-keyword\">null</span>;\n            }\n            <span class=\"hljs-keyword\">return</span>;\n        }\n        <span class=\"hljs-comment\">// ...</span>\n    }\n</code></pre>\n<p>In the await method, the current thread checks the variable <code>stopAwait</code> every 10 seconds in a while loop. It is a <code>volatile</code> variable that is used to ensure that the current thread can see the change immediately after the variable being modified by another thread. If there is no change, it will stay in the loop. This is the reason why the thread does not exit, which is also the reason that the entire Spring-boot application doesn't exit.</p>\n<p>Since Spring-boot application enables port 8080 and 8081(management port) at the same time, there are actually two Tomcats. So there are two threads named <code>container-0</code> and <code>container-1</code>.</p>\n<p>Next, let's see how this Spring-boot application exits.</p>\n<h2>The analysis of DubboConsumer exit</h2>\n<p>As mentioned in the previous description, there is a thread that checks the variable <code>stopAwait</code> continuously. So there must be a thread to modify <code>stopAwait</code> at Stop, thus break the while loop. But who is modifying this variable?</p>\n<p>By analyzing the source code, we can see that there is only one method that modifies <code>stopAwait</code> : <code>org.apache.catalina.core.StandardServer#stopAwait</code>. To figure out who is calling this method, we add a breakpoint here.</p>\n<blockquote>\n<p>Note that after adding a breakpoint in Intellij IDEA's Debug mode, we also need to type <code>kill -s INT $PID</code> or <code>kill -s TERM $PID</code> in command line to trigger the breakpoint. Due to buggy IDEA, a single click to the stop button won't trigger the breakpoint.</p>\n</blockquote>\n<p>You can see the method is called by a thread called <code>Thread-3</code>:</p>\n<pre><code class=\"language-java\">stopAwait:<span class=\"hljs-number\">390</span>, StandardServer (org.apache.catalina.core)\nstopInternal:<span class=\"hljs-number\">819</span>, StandardServer (org.apache.catalina.core)\nstop:<span class=\"hljs-number\">226</span>, LifecycleBase (org.apache.catalina.util)\nstop:<span class=\"hljs-number\">377</span>, Tomcat (org.apache.catalina.startup)\nstopTomcat:<span class=\"hljs-number\">241</span>, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\nstop:<span class=\"hljs-number\">295</span>, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\nstopAndReleaseEmbeddedServletContainer:<span class=\"hljs-number\">306</span>, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nonClose:<span class=\"hljs-number\">155</span>, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\ndoClose:<span class=\"hljs-number\">1014</span>, AbstractApplicationContext (org.springframework.context.support)\nrun:<span class=\"hljs-number\">929</span>, AbstractApplicationContext$<span class=\"hljs-number\">2</span> (org.springframework.context.support)\n</code></pre>\n<p>Through source code analysis, it was executed by Spring's registered <code>ShutdownHook</code>.</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerShutdownHook</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.shutdownHook == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-comment\">// No shutdown hook registered yet.</span>\n            <span class=\"hljs-keyword\">this</span>.shutdownHook = <span class=\"hljs-keyword\">new</span> Thread() {\n                <span class=\"hljs-meta\">@Override</span>\n                <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                    <span class=\"hljs-keyword\">synchronized</span> (startupShutdownMonitor) {\n                        doClose();\n                    }\n                }\n            };\n            Runtime.getRuntime().addShutdownHook(<span class=\"hljs-keyword\">this</span>.shutdownHook);\n        }\n    }\n</code></pre>\n<p>By reffering the Java API documentation[2], we found that ShutdownHook will be executed under the following two cases.</p>\n<blockquote>\n<p>The Java virtual machine <em>shuts down</em> in response to two kinds of events:</p>\n<ul>\n<li>The program <em>exits</em> normally, when the last non-daemon thread exits or when the <code>exit</code> (equivalently, <a href=\"https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#exit-int-\"><code>System.exit</code></a>) method is invoked, or</li>\n<li>The virtual machine is <em>terminated</em> in response to a user interrupt, such as typing <code>^C</code>, or a system-wide event, such as user logoff or system shutdown.</li>\n</ul>\n</blockquote>\n<ol>\n<li>So it's either a call of <code>System.exit()</code></li>\n<li>Respond to external signals, such as Ctrl+C(actually sent as SIGINT signal), or <code>SIGTERM</code> signal (<code>kill $PID</code> will send <code>SIGTERM</code> signal by default)</li>\n</ol>\n<p>Therefore, the normal application will execute the above ShutdownHook during the stop process (except <code>kill -9 $PID</code>). Its function is not only to close the Tomcat, but also to perform other cleanup work. It is unnecessary to go into details.</p>\n<h2>Summary</h2>\n<ol>\n<li>During the startup of <code>DubboConsumer</code>, an independent non-daemon thread is launched to query the status of the variable continuously, thus the process can't exit.</li>\n<li>To stop the <code>DubboConsumer</code>, one should call ShutdownHook to change the variable to let the thread break the loop.</li>\n</ol>\n<h2>Problems</h2>\n<p>In the example of DubboProvider, we see that Provider doesn't start Tomcat to provide HTTP service, then how does the program stays alive without exiting? We will answer this question in the next article.</p>\n<h3>Notice</h3>\n<p>By running the following unit test which create a thread in <code>Intellij IDEA</code> , we are surprised to find that the program exits with less than 1000s. Why?(The thread being created is a non-daemon thread)</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-meta\">@Test</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">test</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-meta\">@Override</span>\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">try</span> {\n                    Thread.sleep(<span class=\"hljs-number\">1000000</span>);\n                } <span class=\"hljs-keyword\">catch</span> (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        }).start();\n    }\n</code></pre>\n<p>[1] <a href=\"https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.8\">https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.8</a></p>\n<p>[2] <a href=\"https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook\">https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook</a></p>\n",
-  "title": "Source code analysis of spring-boot+Dubbo App start and stop",
-  "keywords": "Dubbo, Spring Boot, source code analysis",
-  "description": "This article introduces the implementation details of app start and stop in `incubator-dubbo-spring-boot-project`."
+  "link": "/en-us/blog/spring-boot-dubbo-start-stop-analysis.html",
+  "meta": {
+    "title": "Source code analysis of spring-boot+Dubbo App start and stop",
+    "keywords": "Dubbo, Spring Boot, source code analysis",
+    "description": "This article introduces the implementation details of app start and stop in `incubator-dubbo-spring-boot-project`."
+  }
 }
\ No newline at end of file
diff --git a/en-us/blog/tracing-with-skywalking.json b/en-us/blog/tracing-with-skywalking.json
index dc88514f..e27e8fde 100644
--- a/en-us/blog/tracing-with-skywalking.json
+++ b/en-us/blog/tracing-with-skywalking.json
@@ -1,7 +1,10 @@
 {
   "filename": "tracing-with-skywalking.md",
   "__html": "<h1>Tracing Dubbo service with Apache Skywalking(incubator)</h1>\n<h2>Introduction to Apache Skywalking(Incubator)</h2>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a>  is the APM system that it designed for micro-services architectures and cloud native architecture systems and supports distribute tracking. <a href=\"https://github.com/apache/incubator-skywalking\">Apache skywalking (incubator)</a> collects and analyzes the trace data and generates the relationship between the application and the service metric, Apache skywalking (incubating) supports multiple languages agent, for example <a href=\"https://github.com/apache/incubator-skywalking\">Java</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-netcore\">.net core</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-nodejs\">Node.js</a> and <a href=\"https://github.com/OpenSkywalking/skywalking-go\">Go</a>.</p>\n<p>Currently, Skywalking has supported analysis the operation of distributed systems from 6 visual dimensions. The overview view is a global view of your applications and components, including the number of components and applications, application alarm fluctuations, slow service lists, and application throughput; The topology shows the topological relationship of the whole application; The application view represents the upstream and downstream relationship of the application from single application, TOP N services and servers, JVM, host and process info. The service view focuses on the operation of a single service portal and the upstream and downstream dependencies of this service and it helps the user to optimize and monitor a single service; the trace graph shows all the buried points of the invocation and the execution time of each burial point, and the alarm view is based on the configuration threshold for the application, server, service for real-time alarms</p>\n<h2>Dubbo and Apache Skywalking(Incubator)</h2>\n<h3>Build the Dubbo demo  project</h3>\n<p>The Dubbo demo has been uploaded to the <a href=\"https://github.com/SkywalkingTest/dubbo-trace-example\">GitHub repository</a>.</p>\n<h4>API project</h4>\n<p>Service interface definition:\npackage org.apache.skywalking.demo.interfaces;</p>\n<p>public interface HelloService {\nString sayHello(String name);\n}</p>\n<h4>Service provider project</h4>\n<p>package org.apache.skywalking.demo.provider;</p>\n<p>@Service(version = &quot;<span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mrow><mi>d</mi><mi>e</mi><mi>m</mi><mi>o</mi><mi mathvariant=\"normal\">.</mi><mi>s</mi><mi>e</mi><mi>r</mi><mi>v</mi><mi>i</mi><mi>c</mi><mi>e</mi><mi mathvariant=\"normal\">.</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mi mathvariant=\"normal\">&quot;</mi><mo separator=\"true\">,</mo><mi>a</mi><mi>p</mi><mi>p</mi><mi>l</mi><mi>i</mi><mi>c</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>=</mo><mi mathvariant=\"normal\">&quot;</mi></mrow><annotation encoding=\"application/x-tex\">{demo.service.version}&quot;,\n\tapplication = &quot;</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"strut\" style=\"height:0.69444em;\"></span><span class=\"strut bottom\" style=\"height:0.8888799999999999em;vertical-align:-0.19444em;\"></span><span class=\"base textstyle uncramped\"><span class=\"mord textstyle uncramped\"><span class=\"mord mathit\">d</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\">m</span><span class=\"mord mathit\">o</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">v</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">e</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">v</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">n</span></span><span class=\"mord mathrm\">&quot;</span><span class=\"mpunct\">,</span><span class=\"mord mathit\">a</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">a</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">n</span><span class=\"mrel\">=</span><span class=\"mord mathrm\">&quot;</span></span></span></span>{<a href=\"http://dubbo.application.id\">dubbo.application.id</a>}&quot;,\nprotocol = &quot;<span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mrow><mi>d</mi><mi>u</mi><mi>b</mi><mi>b</mi><mi>o</mi><mi mathvariant=\"normal\">.</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>t</mi><mi>o</mi><mi>c</mi><mi>o</mi><mi>l</mi><mi mathvariant=\"normal\">.</mi><mi>i</mi><mi>d</mi></mrow><mi mathvariant=\"normal\">&quot;</mi><mo separator=\"true\">,</mo><mi>r</mi><mi>e</mi><mi>g</mi><mi>i</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>y</mi><mo>=</mo><mi mathvariant=\"normal\">&quot;</mi></mrow><annotation encoding=\"application/x-tex\">{dubbo.protocol.id}&quot;,\n\tregistry = &quot;</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"strut\" style=\"height:0.69444em;\"></span><span class=\"strut bottom\" style=\"height:0.8888799999999999em;vertical-align:-0.19444em;\"></span><span class=\"base textstyle uncramped\"><span class=\"mord textstyle uncramped\"><span class=\"mord mathit\">d</span><span class=\"mord mathit\">u</span><span class=\"mord mathit\">b</span><span class=\"mord mathit\">b</span><span class=\"mord mathit\">o</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">d</span></span><span class=\"mord mathrm\">&quot;</span><span class=\"mpunct\">,</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">g</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">y</span><span class=\"mrel\">=</span><span class=\"mord mathrm\">&quot;</span></span></span></span>{<a href=\"http://dubbo.registry.id\">dubbo.registry.id</a>}&quot;, timeout = 60000)\npublic class HelloServiceImpl implements HelloService {</p>\n<pre><code>public String sayHello(String name) {\n\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));\n\treturn &quot;Hello, &quot; + name;\n}\n</code></pre>\n<p>}</p>\n<h4>Service consumer project</h4>\n<p>package org.apache.skywalking.demo.consumer;</p>\n<p>@RestController\npublic class ConsumerController {</p>\n<pre><code>private static int COUNT = 0;\n\n@Reference(version = &quot;${demo.service.version}&quot;,\n\tapplication = &quot;${dubbo.application.id}&quot;,\n\turl = &quot;dubbo://localhost:20880&quot;, timeout = 60000)\nprivate HelloService helloService;\n\n@GetMapping(&quot;/sayHello/{name}&quot;)\npublic String sayHello(@PathVariable(name = &quot;name&quot;) String name) {\n\tif ((COUNT++) % 3 == 0){\n\t\tthrow new RuntimeException();\n\t}\n\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));\n\treturn helloService.sayHello(name);\n}\n</code></pre>\n<p>}</p>\n<h3>Deploy Apache Skywalking(incubator)</h3>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache skywalking (Incubator)</a> offers  two deployment modes: single-node mode and cluster mode,Here is  the single-node mode deployment step, and more about how to deploy skywalking with cluster mode, please reference <a href=\"https://github.com/apache/incubator-skywalking/blob/master/docs/en/Deploy-backend-in-cluster-mode.md\">document</a>.</p>\n<h4>Third-party components</h4>\n<ol>\n<li>JDK 8+</li>\n<li>Elasticsearch 5.x</li>\n</ol>\n<h4>Deployment step</h4>\n<ol>\n<li>Download <a href=\"http://skywalking.apache.org/downloads/\">Apache Skywalking Collector</a></li>\n<li>Deploy Elasticsearch service\n<ul>\n<li>Set <code>cluster.name</code> to <code>CollectorDBCluster</code></li>\n<li>Set <code>network.host</code> to <code>0.0.0.0</code></li>\n<li>Start elasticsearch service</li>\n</ul>\n</li>\n<li>Unzip and start the Skywalking Collector. Run the ' bin/startup.sh ' command to start skywalking Collector</li>\n</ol>\n<h4>Deploy the demo</h4>\n<p>Before you deploy the demo service, please run the following command:</p>\n<pre><code>./mvnw clean package\n</code></pre>\n<h4>Deploy the provider service</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar\n</code></pre>\n<h4>Deploy the consumer service</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar \n</code></pre>\n<h4>visit demo service</h4>\n<pre><code>curl http://localhost:8080/sayHello/test\n</code></pre>\n<h2>Skywalking scren snapshot</h2>\n<h3>Dashboard</h3>\n<p><img src=\"../../img/blog/skywalking-dashboard.png\" alt=\"/admin-guide/images/skywalking-dashboard.png\"></p>\n<h3>Topology</h3>\n<p><img src=\"../../img/blog/skywalking-topology.png\" alt=\"/admin-guide/images/skywalking-topology.png\"></p>\n<h3>Application view</h3>\n<p><img src=\"../../img/blog/skywalking-application.png\" alt=\"/admin-guide/images/skywalking-application.png\"></p>\n<p>JVM Information\n<img src=\"../../img/blog/skywalking-application_instance.png\" alt=\"/admin-guide/images/skywalking-application_instance.png\"></p>\n<h3>Service view</h3>\n<p>Consumer side\n<img src=\"../../img/blog/skywalking-service-consumer.png\" alt=\"/admin-guide/images/skywalking-service-consumer.png\"></p>\n<p>provider side\n<img src=\"../../img/blog/skywalking-service-provider.png\" alt=\"/admin-guide/images/skywalking-service-provider.png\"></p>\n<h3>Trace</h3>\n<p><img src=\"../../img/blog/skywalking-trace.png\" alt=\"/admin-guide/images/skywalking-trace.png\"></p>\n<p>Span info\n<img src=\"../../img/blog/skywalking-span-Info.png\" alt=\"/admin-guide/images/skywalking-span-Info.png\"></p>\n<h3>Alarm view</h3>\n<p><img src=\"../../img/blog/skywalking-alarm.png\" alt=\"/admin-guide/images/skywalking-alarm.png\"></p>\n",
-  "title": "Tracing Dubbo service with Apache Skywalking(incubator)",
-  "keywords": "Dubbo, Skywalking, tracing, distribute tracking",
-  "description": "This article introduces how to use Apache Skywalking to track Dubbo applications."
+  "link": "/en-us/blog/tracing-with-skywalking.html",
+  "meta": {
+    "title": "Tracing Dubbo service with Apache Skywalking(incubator)",
+    "keywords": "Dubbo, Skywalking, tracing, distribute tracking",
+    "description": "This article introduces how to use Apache Skywalking to track Dubbo applications."
+  }
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/README.json b/en-us/docs/admin/README.json
index 42c24ffa..7a71118c 100644
--- a/en-us/docs/admin/README.json
+++ b/en-us/docs/admin/README.json
@@ -1,4 +1,6 @@
 {
   "filename": "README.md",
-  "__html": "<h1>dubbo-admin-book</h1>\n<p>The installation and maintenance guidance of registry center and dubbo-admin.</p>\n"
+  "__html": "<h1>dubbo-admin-book</h1>\n<p>The installation and maintenance guidance of registry center and dubbo-admin.</p>\n",
+  "link": "/en-us/docs/admin/README.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/SUMMARY.json b/en-us/docs/admin/SUMMARY.json
index cc720661..82de1862 100644
--- a/en-us/docs/admin/SUMMARY.json
+++ b/en-us/docs/admin/SUMMARY.json
@@ -1,4 +1,6 @@
 {
   "filename": "SUMMARY.md",
-  "__html": "<ul>\n<li><a href=\"install/introduction.md\">1 install manual</a>\n<ul>\n<li><a href=\"install/provider-demo.md\">1.1 install provider demo</a></li>\n<li><a href=\"install/consumer-demo.md\">1.2 install consumer demo</a></li>\n<li><a href=\"install/zookeeper.md\">1.3 install Zookeeper configuration center</a></li>\n<li><a href=\"install/redis.md\">1.4 install Redis configuration center</a></li>\n<li><a href=\"install/simple-registry-center.md\">1.5 install Simple configuration center</a></li>\n<li><a href=\"install/simple-monitor-center.md\">1.6 install Simple monitor center</a></li>\n<li><a href=\"install/admin-console.md\">1.7 install admin console</a></li>\n</ul>\n</li>\n<li><a href=\"\">2 Ops manual</a>\n<ul>\n<li><a href=\"ops/dubbo-ops.md\">2.1 admin-console Ops</a></li>\n</ul>\n</li>\n</ul>\n"
+  "__html": "<ul>\n<li><a href=\"install/introduction.md\">1 install manual</a>\n<ul>\n<li><a href=\"install/provider-demo.md\">1.1 install provider demo</a></li>\n<li><a href=\"install/consumer-demo.md\">1.2 install consumer demo</a></li>\n<li><a href=\"install/zookeeper.md\">1.3 install Zookeeper configuration center</a></li>\n<li><a href=\"install/redis.md\">1.4 install Redis configuration center</a></li>\n<li><a href=\"install/simple-registry-center.md\">1.5 install Simple configuration center</a></li>\n<li><a href=\"install/simple-monitor-center.md\">1.6 install Simple monitor center</a></li>\n<li><a href=\"install/admin-console.md\">1.7 install admin console</a></li>\n</ul>\n</li>\n<li><a href=\"\">2 Ops manual</a>\n<ul>\n<li><a href=\"ops/dubbo-ops.md\">2.1 admin-console Ops</a></li>\n</ul>\n</li>\n</ul>\n",
+  "link": "/en-us/docs/admin/SUMMARY.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/admin-console.json b/en-us/docs/admin/install/admin-console.json
index 8cd6e841..7948d29c 100644
--- a/en-us/docs/admin/install/admin-console.json
+++ b/en-us/docs/admin/install/admin-console.json
@@ -1,4 +1,6 @@
 {
   "filename": "admin-console.md",
-  "__html": "<h1>Install admin console</h1>\n<p>The current version of dubbo admin is under development, including: route rule, dynamic configuration, access control, weight adjustment, load balance, etc.</p>\n<p>Install:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo-ops.git /var/tmp/dubbo-ops\n<span class=\"hljs-built_in\">cd</span> /var/tmp/dubbo-ops\nmvn clean package\n</code></pre>\n<p>Configuration <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">configuration file:\ndubbo-admin-backend/src/main/resources/application.properties\nconfigurations:\ndubbo.registry.address=zookeeper://127.0.0.1:2181\n</code></pre>\n<p>Start:</p>\n<pre><code class=\"language-sh\">mvn --projects dubbo-admin-backend spring-boot:run\n</code></pre>\n<p>For more information, please visit:</p>\n<pre><code class=\"language-sh\">https://github.com/apache/incubator-dubbo-ops\n</code></pre>\n<p>Visit [^2]:</p>\n<pre><code>http://127.0.0.1:8080\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>There's no login for current version, will be added later <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Install admin console</h1>\n<p>The current version of dubbo admin is under development, including: route rule, dynamic configuration, access control, weight adjustment, load balance, etc.</p>\n<p>Install:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo-ops.git /var/tmp/dubbo-ops\n<span class=\"hljs-built_in\">cd</span> /var/tmp/dubbo-ops\nmvn clean package\n</code></pre>\n<p>Configuration <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">configuration file:\ndubbo-admin-backend/src/main/resources/application.properties\nconfigurations:\ndubbo.registry.address=zookeeper://127.0.0.1:2181\n</code></pre>\n<p>Start:</p>\n<pre><code class=\"language-sh\">mvn --projects dubbo-admin-backend spring-boot:run\n</code></pre>\n<p>For more information, please visit:</p>\n<pre><code class=\"language-sh\">https://github.com/apache/incubator-dubbo-ops\n</code></pre>\n<p>Visit [^2]:</p>\n<pre><code>http://127.0.0.1:8080\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>There's no login for current version, will be added later <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/admin/install/admin-console.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/consumer-demo.json b/en-us/docs/admin/install/consumer-demo.json
index e06343d1..4e35df76 100644
--- a/en-us/docs/admin/install/consumer-demo.json
+++ b/en-us/docs/admin/install/consumer-demo.json
@@ -1,4 +1,6 @@
 {
   "filename": "consumer-demo.md",
-  "__html": "<h1>install demo consumer</h1>\n<p>install:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\nPlease start Provider first\nadd -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> your IDE is Intellij Idea\n</code></pre>\n<p>configuration:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-consumer.xml\nchange dubbo:registery to the real registery center address\n</code></pre>\n"
+  "__html": "<h1>install demo consumer</h1>\n<p>install:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\nPlease start Provider first\nadd -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> your IDE is Intellij Idea\n</code></pre>\n<p>configuration:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-consumer.xml\nchange dubbo:registery to the real registery center address\n</code></pre>\n",
+  "link": "/en-us/docs/admin/install/consumer-demo.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/introduction.json b/en-us/docs/admin/install/introduction.json
index 6474a9f8..48219970 100644
--- a/en-us/docs/admin/install/introduction.json
+++ b/en-us/docs/admin/install/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>Install manual</h1>\n<p>You can run Demo Provider and Demo Consumer only, the default discovery strategy is Multicast by configuration center broadcast, do not run the two parts on the same machine, if you have to do so, set <code>unicast=false</code>, like <code>multicast://224.5.6.7:1234?unicast=false</code>, or the unicast send to consumer will be taken by provider, and the same for consumers. Only multicast has this issue</p>\n<p>You can run multiple Demo Provider and Demo consumer to verify load balance. Demo Consumer can run multi instance directly. Because of port conflict, you can either run multi Demo Providers on different machines or modify the value of <code>dubbo.protocol.port</code> in <code>conf/dubbo.properties</code> under the install directory of <code>conf/dubbo.properties</code></p>\n<p>You can add Simple Monitor as a monitor center, the default discovery strategy is Multicast by configuration center broadcast, display the dependency relationship, call times and cost</p>\n<p>You can use Zookeeper instead of Multicast as the configuration center, after Zookeeper Registry installation, modify <code>conf/dubbo.properties</code> under the installation directory of Demo Provider, Demo Consumer and Simple Monitor, change the value of <code>dubbo.registry.address</code> to <code>zookeeper://127.0.0.1:2181</code>(<code>redis://127.0.0.1:6379</code> for Redis Registry). the value for Simple Registry is <code>dubbo://127.0.0.1:9090</code></p>\n<p>Zookeeper configuration address is recommended</p>\n"
+  "__html": "<h1>Install manual</h1>\n<p>You can run Demo Provider and Demo Consumer only, the default discovery strategy is Multicast by configuration center broadcast, do not run the two parts on the same machine, if you have to do so, set <code>unicast=false</code>, like <code>multicast://224.5.6.7:1234?unicast=false</code>, or the unicast send to consumer will be taken by provider, and the same for consumers. Only multicast has this issue</p>\n<p>You can run multiple Demo Provider and Demo consumer to verify load balance. Demo Consumer can run multi instance directly. Because of port conflict, you can either run multi Demo Providers on different machines or modify the value of <code>dubbo.protocol.port</code> in <code>conf/dubbo.properties</code> under the install directory of <code>conf/dubbo.properties</code></p>\n<p>You can add Simple Monitor as a monitor center, the default discovery strategy is Multicast by configuration center broadcast, display the dependency relationship, call times and cost</p>\n<p>You can use Zookeeper instead of Multicast as the configuration center, after Zookeeper Registry installation, modify <code>conf/dubbo.properties</code> under the installation directory of Demo Provider, Demo Consumer and Simple Monitor, change the value of <code>dubbo.registry.address</code> to <code>zookeeper://127.0.0.1:2181</code>(<code>redis://127.0.0.1:6379</code> for Redis Registry). the value for Simple Registry is <code>dubbo://127.0.0.1:9090</code></p>\n<p>Zookeeper configuration address is recommended</p>\n",
+  "link": "/en-us/docs/admin/install/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/provider-demo.json b/en-us/docs/admin/install/provider-demo.json
index c8e29558..377624ab 100644
--- a/en-us/docs/admin/install/provider-demo.json
+++ b/en-us/docs/admin/install/provider-demo.json
@@ -1,4 +1,6 @@
 {
   "filename": "provider-demo.md",
-  "__html": "<h1>install demo provider</h1>\n<p>install:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\nrun com.alibaba.dubbo.demo.provider.Provider under dubbo-demo-provider module\nadd -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> your IDE is Intellij Idea\n</code></pre>\n<p>configuration:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-provider.xml\nchange dubbo:registery to a real registery server address, zookeeper is recommanded\n</code></pre>\n"
+  "__html": "<h1>install demo provider</h1>\n<p>install:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\nrun com.alibaba.dubbo.demo.provider.Provider under dubbo-demo-provider module\nadd -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> your IDE is Intellij Idea\n</code></pre>\n<p>configuration:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-provider.xml\nchange dubbo:registery to a real registery server address, zookeeper is recommanded\n</code></pre>\n",
+  "link": "/en-us/docs/admin/install/provider-demo.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/redis.json b/en-us/docs/admin/install/redis.json
index a7dc576f..3ac1038a 100644
--- a/en-us/docs/admin/install/redis.json
+++ b/en-us/docs/admin/install/redis.json
@@ -1,4 +1,6 @@
 {
   "filename": "redis.md",
-  "__html": "<h1>install Redis register center</h1>\n<p>Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> introductions, please refer to: <a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/references/registry/redis.html\">Redis application center manual</a>。</p>\n<p>you need an origin Redis server only, and change the value from <code>dubbo.registry.addrss</code> to <code>redis://127.0.0.1:6379</code> in <code>conf/dubbo.properties</code> of <a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/quick-start.html\">quick start</a></p>\n<p>Redis configuration center cluster <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> write multiple server in client side and read from a single server.</p>\n<p>Install:</p>\n<pre><code class=\"language-sh\">wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz\ntar xzf redis-2.4.8.tar.gz\n<span class=\"hljs-built_in\">cd</span> redis-2.4.8\nmake\n</code></pre>\n<p>Configuration:</p>\n<pre><code class=\"language-sh\">vi redis.conf\n</code></pre>\n<p>Start:</p>\n<pre><code class=\"language-sh\">nohup ./src/redis-server redis.conf &amp;\n</code></pre>\n<p>Stop:</p>\n<pre><code class=\"language-sh\">killall redis-server\n</code></pre>\n<ul>\n<li>Command line <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</li>\n</ul>\n<pre><code class=\"language-sh\">./src/redis-cli\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 6379\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Redis is a high performance KV store server, please refer to: <a href=\"http://redis.io/topics/quickstart\">http://redis.io/topics/quickstart</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Support for version <code>2.1.0</code> and higher <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Please refer to: <a href=\"http://redis.io/commands\">http://redis.io/commands</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>install Redis register center</h1>\n<p>Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> introductions, please refer to: <a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/references/registry/redis.html\">Redis application center manual</a>。</p>\n<p>you need an origin Redis server only, and change the value from <code>dubbo.registry.addrss</code> to <code>redis://127.0.0.1:6379</code> in <code>conf/dubbo.properties</code> of <a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/quick-start.html\">quick start</a></p>\n<p>Redis configuration center cluster <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> write multiple server in client side and read from a single server.</p>\n<p>Install:</p>\n<pre><code class=\"language-sh\">wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz\ntar xzf redis-2.4.8.tar.gz\n<span class=\"hljs-built_in\">cd</span> redis-2.4.8\nmake\n</code></pre>\n<p>Configuration:</p>\n<pre><code class=\"language-sh\">vi redis.conf\n</code></pre>\n<p>Start:</p>\n<pre><code class=\"language-sh\">nohup ./src/redis-server redis.conf &amp;\n</code></pre>\n<p>Stop:</p>\n<pre><code class=\"language-sh\">killall redis-server\n</code></pre>\n<ul>\n<li>Command line <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</li>\n</ul>\n<pre><code class=\"language-sh\">./src/redis-cli\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 6379\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Redis is a high performance KV store server, please refer to: <a href=\"http://redis.io/topics/quickstart\">http://redis.io/topics/quickstart</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Support for version <code>2.1.0</code> and higher <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Please refer to: <a href=\"http://redis.io/commands\">http://redis.io/commands</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/admin/install/redis.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/simple-monitor-center.json b/en-us/docs/admin/install/simple-monitor-center.json
index 8d8995df..36504957 100644
--- a/en-us/docs/admin/install/simple-monitor-center.json
+++ b/en-us/docs/admin/install/simple-monitor-center.json
@@ -1,4 +1,6 @@
 {
   "filename": "simple-monitor-center.md",
-  "__html": "<h1>install Simple monitor center</h1>\n<h4>The function of monitor center will be merged to dubbo admin, based on metrics, coming soon</h4>\n"
+  "__html": "<h1>install Simple monitor center</h1>\n<h4>The function of monitor center will be merged to dubbo admin, based on metrics, coming soon</h4>\n",
+  "link": "/en-us/docs/admin/install/simple-monitor-center.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/simple-registry-center.json b/en-us/docs/admin/install/simple-registry-center.json
index 91a33a60..1231365c 100644
--- a/en-us/docs/admin/install/simple-registry-center.json
+++ b/en-us/docs/admin/install/simple-registry-center.json
@@ -1,4 +1,6 @@
 {
   "filename": "simple-registry-center.md",
-  "__html": "<h1>install Simple configuration center</h1>\n"
+  "__html": "<h1>install Simple configuration center</h1>\n",
+  "link": "/en-us/docs/admin/install/simple-registry-center.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/install/zookeeper.json b/en-us/docs/admin/install/zookeeper.json
index f8ecd67b..22a53b8b 100644
--- a/en-us/docs/admin/install/zookeeper.json
+++ b/en-us/docs/admin/install/zookeeper.json
@@ -1,4 +1,6 @@
 {
   "filename": "zookeeper.md",
-  "__html": "<h1>install Zookeeper configuration center</h1>\n<p>zookeeper register center client version: <code>dubbo-2.3.3</code> and above<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p>Dubbo changes nothing of Zookeeper's server side, an original Zookeeper server is fine. All change happens while calling Zookeeper's client side</p>\n<p>install:</p>\n<pre><code class=\"language-sh\">wget http://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz\ntar zxvf zookeeper-3.3.3.tar.gz\n<span class=\"hljs-built_in\">cd</span> zookeeper-3.3.3\ncp conf/zoo_sample.cfg conf/zoo.cfg\n</code></pre>\n<p>configuration:</p>\n<pre><code class=\"language-sh\">vi conf/zoo.cfg\n</code></pre>\n<p>If cluster is not needed, the content of <code>zoo.cfg</code> is as below <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n</code></pre>\n<p>If cluster is needed, the content of <code>zoo.cfg</code> is as below <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n<span class=\"hljs-meta\">server.1</span>=<span class=\"hljs-string\">10.20.153.10:2555:3555</span>\n<span class=\"hljs-meta\">server.2</span>=<span class=\"hljs-string\">10.20.153.11:2555:3555</span>\n</code></pre>\n<p>Put myid file in data directory <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>:</p>\n<pre><code class=\"language-sh\">mkdir data\nvi myid\n</code></pre>\n<p>Myid is the number after <code>server</code> in <code>zoo.cfg</code>. The first one's content is 1, the second one's content is 2:</p>\n<pre><code>1\n</code></pre>\n<p>Start:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh start\n</code></pre>\n<p>Stop:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh stop\n</code></pre>\n<p>Command line <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 2181\ndump\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-shell\">echo dump | nc 127.0.0.1 2181\n</code></pre>\n<p>Usage:</p>\n<pre><code class=\"language-xml\">dubbo.registry.address=zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181,10.20.153.11:2181\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Zookeeper is a sub project of Apache <a href=\"http://Hadoop.As\">Hadoop.As</a> it is robust, we recommend to use in production environment. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Data directory should be changed into your real output directory <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Data directory and server address should be changed into your real machine information <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p><code>dataDir</code> in <code>zoo.cfg</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><a href=\"http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html\">http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>install Zookeeper configuration center</h1>\n<p>zookeeper register center client version: <code>dubbo-2.3.3</code> and above<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p>Dubbo changes nothing of Zookeeper's server side, an original Zookeeper server is fine. All change happens while calling Zookeeper's client side</p>\n<p>install:</p>\n<pre><code class=\"language-sh\">wget http://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz\ntar zxvf zookeeper-3.3.3.tar.gz\n<span class=\"hljs-built_in\">cd</span> zookeeper-3.3.3\ncp conf/zoo_sample.cfg conf/zoo.cfg\n</code></pre>\n<p>configuration:</p>\n<pre><code class=\"language-sh\">vi conf/zoo.cfg\n</code></pre>\n<p>If cluster is not needed, the content of <code>zoo.cfg</code> is as below <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n</code></pre>\n<p>If cluster is needed, the content of <code>zoo.cfg</code> is as below <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n<span class=\"hljs-meta\">server.1</span>=<span class=\"hljs-string\">10.20.153.10:2555:3555</span>\n<span class=\"hljs-meta\">server.2</span>=<span class=\"hljs-string\">10.20.153.11:2555:3555</span>\n</code></pre>\n<p>Put myid file in data directory <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>:</p>\n<pre><code class=\"language-sh\">mkdir data\nvi myid\n</code></pre>\n<p>Myid is the number after <code>server</code> in <code>zoo.cfg</code>. The first one's content is 1, the second one's content is 2:</p>\n<pre><code>1\n</code></pre>\n<p>Start:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh start\n</code></pre>\n<p>Stop:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh stop\n</code></pre>\n<p>Command line <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 2181\ndump\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-shell\">echo dump | nc 127.0.0.1 2181\n</code></pre>\n<p>Usage:</p>\n<pre><code class=\"language-xml\">dubbo.registry.address=zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181,10.20.153.11:2181\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Zookeeper is a sub project of Apache <a href=\"http://Hadoop.As\">Hadoop.As</a> it is robust, we recommend to use in production environment. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Data directory should be changed into your real output directory <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Data directory and server address should be changed into your real machine information <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p><code>dataDir</code> in <code>zoo.cfg</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><a href=\"http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html\">http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/admin/install/zookeeper.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/ops/dubbo-ops.json b/en-us/docs/admin/ops/dubbo-ops.json
index cd0033f8..1decedbd 100644
--- a/en-us/docs/admin/ops/dubbo-ops.json
+++ b/en-us/docs/admin/ops/dubbo-ops.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-ops.md",
-  "__html": "<h1>Ops console management</h1>\n<h2>Page search</h2>\n<p>If you need to manage a Dubbo service, you need to search it first and open it's management page</p>\n<p><img src=\"../sources/images/dubbo-search.jpg\" alt=\"/admin-guide/images/dubbo-search.png\"></p>\n<h2>Service provider page</h2>\n<p><img src=\"../sources/images/dubbo-providers.jpg\" alt=\"/admin-guide/images/dubbo-providers.png\"></p>\n<h2>Service consumer page</h2>\n<p><img src=\"../sources/images/dubbo-consumers.jpg\" alt=\"/admin-guide/images/dubbo-consumers.png\"></p>\n<h2>Add route rule page</h2>\n<p><img src=\"../sources/images/dubbo-add-route.jpg\" alt=\"/admin-guide/images/dubbo-add-route.png\"></p>\n<h2>Add dynamic configuration page</h2>\n<p><img src=\"../sources/images/dubbo-add-config.jpg\" alt=\"/admin-guide/images/dubbo-add-config.png\"></p>\n"
+  "__html": "<h1>Ops console management</h1>\n<h2>Page search</h2>\n<p>If you need to manage a Dubbo service, you need to search it first and open it's management page</p>\n<p><img src=\"../sources/images/dubbo-search.jpg\" alt=\"/admin-guide/images/dubbo-search.png\"></p>\n<h2>Service provider page</h2>\n<p><img src=\"../sources/images/dubbo-providers.jpg\" alt=\"/admin-guide/images/dubbo-providers.png\"></p>\n<h2>Service consumer page</h2>\n<p><img src=\"../sources/images/dubbo-consumers.jpg\" alt=\"/admin-guide/images/dubbo-consumers.png\"></p>\n<h2>Add route rule page</h2>\n<p><img src=\"../sources/images/dubbo-add-route.jpg\" alt=\"/admin-guide/images/dubbo-add-route.png\"></p>\n<h2>Add dynamic configuration page</h2>\n<p><img src=\"../sources/images/dubbo-add-config.jpg\" alt=\"/admin-guide/images/dubbo-add-config.png\"></p>\n",
+  "link": "/en-us/docs/admin/ops/dubbo-ops.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/ops/introduction.json b/en-us/docs/admin/ops/introduction.json
index fa36f78a..bca737cf 100644
--- a/en-us/docs/admin/ops/introduction.json
+++ b/en-us/docs/admin/ops/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>Ops manual</h1>\n"
+  "__html": "<h1>Ops manual</h1>\n",
+  "link": "/en-us/docs/admin/ops/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/ops/pinpoint.json b/en-us/docs/admin/ops/pinpoint.json
index b47e2c38..5fb6d94f 100644
--- a/en-us/docs/admin/ops/pinpoint.json
+++ b/en-us/docs/admin/ops/pinpoint.json
@@ -1,4 +1,6 @@
 {
   "filename": "pinpoint.md",
-  "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).</p>\n<h2>What is Pinpoint</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a> is an APM (Application Performance Management) tool for large-scale distributed systems written in Java. Inspired by Dapper, Pinpoint provides a solution to help analyze the overall structure of the system and how components within them are interconnected by tracing transactions across distributed applications.</p>\n<p>You should definitely check Pinpoint out If you want to</p>\n<p>understand your application topology at a glance\nmonitor your application in Real-Time\ngain code-level visibility to every transaction\ninstall APM Agents without changing a single line of code\nhave minimal impact on the performance (approximately 3% increase in resource usage)</p>\n<h3>ServerMap</h3>\n<p>Understand the topology of any distributed systems by visualizing how their components are interconnected. Clicking on a node reveals details about the component, such as its current status, and transaction count.</p>\n<h3>Realtime Active Thread Chart</h3>\n<p>Monitor active threads inside applications in real-time.</p>\n<h3>Request/Response Scatter Chart</h3>\n<p>Visualize request count and response patterns over time to identify potential problems. Transactions can be selected for additional detail by dragging over the chart.</p>\n<h3>CallStack</h3>\n<p>Gain code-level visibility to every transaction in a distributed environment, identifying bottlenecks and points of failure in a single view.</p>\n<h3>Inspector</h3>\n<p>View additional details on the application such as CPU usage, Memory/Garbage Collection, TPS, and JVM arguments.</p>\n<h3>Supported Modules (last updated 2018/04/01)</h3>\n<ul>\n<li>JDK 6+</li>\n<li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li>\n<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>\n<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>\n<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>\n<li>ActiveMQ, RabbitMQ</li>\n<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>\n<li>Arcus, Memcached, Redis, CASSANDRA</li>\n<li>iBATIS, MyBatis</li>\n<li>DBCP, DBCP2, HIKARICP</li>\n<li>gson, Jackson, Json Lib</li>\n<li>log4j, Logback</li>\n</ul>\n<h2>Pinpoint and Dubbo</h2>\n<h3>Quickstart Pinpoint</h3>\n<p><a href=\"http://naver.github.io/pinpoint/quickstart.html\">Quick start</a>(No neet to start TestApp)</p>\n<h3>Dubbo demo</h3>\n<h4>Create API module</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span>\n         <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n         <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<p>Create API interface:</p>\n<pre><code>package com.example.demoapi;\n\npublic interface HelloService {\n    String sayHello(String name);\n}\n</code></pre>\n<h4>Dubbo provider</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li><code>HelloService</code> interface:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider.provider;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n\n<span class=\"hljs-meta\">@Service</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n        application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n        protocol = <span class=\"hljs-string\">\"${dubbo.protocol.id}\"</span>,\n        registry = <span class=\"hljs-string\">\"${dubbo.registry.id}\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        i++;\n        <span class=\"hljs-keyword\">if</span> (i % <span class=\"hljs-number\">3</span> == <span class=\"hljs-number\">0</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"ex\"</span>);\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\"!\"</span>;\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Spring Boot bootstrap:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoProviderApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li><code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">server.port</span> = <span class=\"hljs-string\">9090</span>\n<span class=\"hljs-meta\">management.port</span> = <span class=\"hljs-string\">9091</span>\n<span class=\"hljs-comment\">\n# Service version</span>\n<span class=\"hljs-meta\">demo.service.version</span> = <span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Base packages to scan Dubbo Components (e.g @Service , @Reference)</span>\n<span class=\"hljs-meta\">dubbo.scan.basePackages</span>  = <span class=\"hljs-string\">com.example.demoprovider</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span> = <span class=\"hljs-string\">12345</span>\n<span class=\"hljs-comment\">\n## RegistryConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.registry.id</span> = <span class=\"hljs-string\">my-registry</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span> = <span class=\"hljs-string\">N/A</span>\n</code></pre>\n<h4>Dubbo consumer</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classifier</span>&gt;</span>exec<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">classifier</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li><code>@Reference</code> injection <code>HelloService</code></li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer.controller;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Reference;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestMapping;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RestController;\n\n<span class=\"hljs-meta\">@RestController</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerController</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n            application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n            url = <span class=\"hljs-string\">\"dubbo://&lt;Real IP Address&gt;:12345\"</span>)\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-meta\">@RequestMapping</span>(<span class=\"hljs-string\">\"/sayHello\"</span>)\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(@RequestParam String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> helloService.sayHello(name);\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Spring Boot bootstrap:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoConsumerApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li><code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">server.port</span>=<span class=\"hljs-string\">8080</span>\n<span class=\"hljs-meta\">management.port</span>=<span class=\"hljs-string\">8081</span>\n<span class=\"hljs-comment\">\n# Service Version</span>\n<span class=\"hljs-meta\">demo.service.version</span>=<span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">12345</span>\n</code></pre>\n<h3>Using Pinpoint-agent to start <code>Dubbo provider</code> and <code>Dubbo consumer</code></h3>\n<ol>\n<li>Maven clean package</li>\n</ol>\n<pre><code>mvn clean package\n</code></pre>\n<ol start=\"2\">\n<li>Start provider</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar\n</code></pre>\n<ol start=\"3\">\n<li>Start consumer</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-consumer -Dpinpoint.applicationName=DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar\n</code></pre>\n<ol start=\"4\">\n<li>Access the consumer address to simulate user requests</li>\n</ol>\n<p><code>http://localhost:8080/sayHello?name=ABC</code></p>\n<h2>Using Pinpoint locate problems</h2>\n<h3>Homepage</h3>\n<p><img src=\"../sources/images/pinpoint-home.png\" alt=\"/admin-guide/images/pinpoint-home.png\"></p>\n<blockquote>\n<p>The user request here is double the number of requests for DubboProvider, because the favicon.ico icon request is recorded.</p>\n</blockquote>\n<h3>Call tree</h3>\n<p><img src=\"../sources/images/pinpoint-calltree.png\" alt=\"/admin-guide/images/pinpoint-calltree.png\"></p>\n<h3>Mixed view</h3>\n<p><img src=\"../sources/images/pinpoint-mixedview.png\" alt=\"/admin-guide/images/pinpoint-mixedview.png\"></p>\n<h3>Other</h3>\n<p>The example simply simulates the provision and call of Dubbo, and does not carry out the application of other middleware such as database. For detailed use, please refer to the Pinpoint document.</p>\n"
+  "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).</p>\n<h2>What is Pinpoint</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a> is an APM (Application Performance Management) tool for large-scale distributed systems written in Java. Inspired by Dapper, Pinpoint provides a solution to help analyze the overall structure of the system and how components within them are interconnected by tracing transactions across distributed applications.</p>\n<p>You should definitely check Pinpoint out If you want to</p>\n<p>understand your application topology at a glance\nmonitor your application in Real-Time\ngain code-level visibility to every transaction\ninstall APM Agents without changing a single line of code\nhave minimal impact on the performance (approximately 3% increase in resource usage)</p>\n<h3>ServerMap</h3>\n<p>Understand the topology of any distributed systems by visualizing how their components are interconnected. Clicking on a node reveals details about the component, such as its current status, and transaction count.</p>\n<h3>Realtime Active Thread Chart</h3>\n<p>Monitor active threads inside applications in real-time.</p>\n<h3>Request/Response Scatter Chart</h3>\n<p>Visualize request count and response patterns over time to identify potential problems. Transactions can be selected for additional detail by dragging over the chart.</p>\n<h3>CallStack</h3>\n<p>Gain code-level visibility to every transaction in a distributed environment, identifying bottlenecks and points of failure in a single view.</p>\n<h3>Inspector</h3>\n<p>View additional details on the application such as CPU usage, Memory/Garbage Collection, TPS, and JVM arguments.</p>\n<h3>Supported Modules (last updated 2018/04/01)</h3>\n<ul>\n<li>JDK 6+</li>\n<li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li>\n<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>\n<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>\n<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>\n<li>ActiveMQ, RabbitMQ</li>\n<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>\n<li>Arcus, Memcached, Redis, CASSANDRA</li>\n<li>iBATIS, MyBatis</li>\n<li>DBCP, DBCP2, HIKARICP</li>\n<li>gson, Jackson, Json Lib</li>\n<li>log4j, Logback</li>\n</ul>\n<h2>Pinpoint and Dubbo</h2>\n<h3>Quickstart Pinpoint</h3>\n<p><a href=\"http://naver.github.io/pinpoint/quickstart.html\">Quick start</a>(No neet to start TestApp)</p>\n<h3>Dubbo demo</h3>\n<h4>Create API module</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span>\n         <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n         <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<p>Create API interface:</p>\n<pre><code>package com.example.demoapi;\n\npublic interface HelloService {\n    String sayHello(String name);\n}\n</code></pre>\n<h4>Dubbo provider</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li><code>HelloService</code> interface:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider.provider;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n\n<span class=\"hljs-meta\">@Service</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n        application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n        protocol = <span class=\"hljs-string\">\"${dubbo.protocol.id}\"</span>,\n        registry = <span class=\"hljs-string\">\"${dubbo.registry.id}\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        i++;\n        <span class=\"hljs-keyword\">if</span> (i % <span class=\"hljs-number\">3</span> == <span class=\"hljs-number\">0</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"ex\"</span>);\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\"!\"</span>;\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Spring Boot bootstrap:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoProviderApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li><code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">server.port</span> = <span class=\"hljs-string\">9090</span>\n<span class=\"hljs-meta\">management.port</span> = <span class=\"hljs-string\">9091</span>\n<span class=\"hljs-comment\">\n# Service version</span>\n<span class=\"hljs-meta\">demo.service.version</span> = <span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Base packages to scan Dubbo Components (e.g @Service , @Reference)</span>\n<span class=\"hljs-meta\">dubbo.scan.basePackages</span>  = <span class=\"hljs-string\">com.example.demoprovider</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span> = <span class=\"hljs-string\">12345</span>\n<span class=\"hljs-comment\">\n## RegistryConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.registry.id</span> = <span class=\"hljs-string\">my-registry</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span> = <span class=\"hljs-string\">N/A</span>\n</code></pre>\n<h4>Dubbo consumer</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classifier</span>&gt;</span>exec<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">classifier</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li><code>@Reference</code> injection <code>HelloService</code></li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer.controller;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Reference;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestMapping;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RestController;\n\n<span class=\"hljs-meta\">@RestController</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerController</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n            application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n            url = <span class=\"hljs-string\">\"dubbo://&lt;Real IP Address&gt;:12345\"</span>)\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-meta\">@RequestMapping</span>(<span class=\"hljs-string\">\"/sayHello\"</span>)\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(@RequestParam String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> helloService.sayHello(name);\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>Spring Boot bootstrap:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoConsumerApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li><code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">server.port</span>=<span class=\"hljs-string\">8080</span>\n<span class=\"hljs-meta\">management.port</span>=<span class=\"hljs-string\">8081</span>\n<span class=\"hljs-comment\">\n# Service Version</span>\n<span class=\"hljs-meta\">demo.service.version</span>=<span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">12345</span>\n</code></pre>\n<h3>Using Pinpoint-agent to start <code>Dubbo provider</code> and <code>Dubbo consumer</code></h3>\n<ol>\n<li>Maven clean package</li>\n</ol>\n<pre><code>mvn clean package\n</code></pre>\n<ol start=\"2\">\n<li>Start provider</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar\n</code></pre>\n<ol start=\"3\">\n<li>Start consumer</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-consumer -Dpinpoint.applicationName=DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar\n</code></pre>\n<ol start=\"4\">\n<li>Access the consumer address to simulate user requests</li>\n</ol>\n<p><code>http://localhost:8080/sayHello?name=ABC</code></p>\n<h2>Using Pinpoint locate problems</h2>\n<h3>Homepage</h3>\n<p><img src=\"../sources/images/pinpoint-home.png\" alt=\"/admin-guide/images/pinpoint-home.png\"></p>\n<blockquote>\n<p>The user request here is double the number of requests for DubboProvider, because the favicon.ico icon request is recorded.</p>\n</blockquote>\n<h3>Call tree</h3>\n<p><img src=\"../sources/images/pinpoint-calltree.png\" alt=\"/admin-guide/images/pinpoint-calltree.png\"></p>\n<h3>Mixed view</h3>\n<p><img src=\"../sources/images/pinpoint-mixedview.png\" alt=\"/admin-guide/images/pinpoint-mixedview.png\"></p>\n<h3>Other</h3>\n<p>The example simply simulates the provision and call of Dubbo, and does not carry out the application of other middleware such as database. For detailed use, please refer to the Pinpoint document.</p>\n",
+  "link": "/en-us/docs/admin/ops/pinpoint.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/admin/ops/skywalking.json b/en-us/docs/admin/ops/skywalking.json
index 4b8aedde..1ffd3218 100644
--- a/en-us/docs/admin/ops/skywalking.json
+++ b/en-us/docs/admin/ops/skywalking.json
@@ -1,4 +1,6 @@
 {
   "filename": "skywalking.md",
-  "__html": "<h1>Tracing Dubbo service with Apache Skywalking(incubator)</h1>\n<h2>Introduction to Apache Skywalking(Incubator)</h2>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a>  is the APM system that it designed for micro-services architectures and cloud native architecture systems and supports distribute tracking. <a href=\"https://github.com/apache/incubator-skywalking\">Apache skywalking (incubator)</a> collects and analyzes the trace data and generates the relationship between the application and the service metric, Apache skywalking (incubating) supports multiple languages agent, for example <a href=\"https://github.com/apache/incubator-skywalking\">Java</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-netcore\">.net core</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-nodejs\">Node.js</a> and <a href=\"https://github.com/OpenSkywalking/skywalking-go\">Go</a>.</p>\n<p>Currently, Skywalking has supported analysis the operation of distributed systems from 6 visual dimensions. The overview view is a global view of your applications and components, including the number of components and applications, application alarm fluctuations, slow service lists, and application throughput; The topology shows the topological relationship of the whole application; The application view represents the upstream and downstream relationship of the application from single application, TOP N services and servers, JVM, host and process info. The service view focuses on the operation of a single service portal and the upstream and downstream dependencies of this service and it helps the user to optimize and monitor a single service; the trace graph shows all the buried points of the invocation and the execution time of each burial point, and the alarm view is based on the configuration threshold for the application, server, service for real-time alarms</p>\n<h2>Dubbo and Apache Skywalking(Incubator)</h2>\n<h3>Build the Dubbo demo  project</h3>\n<p>The Dubbo demo has been uploaded to the <a href=\"https://github.com/SkywalkingTest/dubbo-trace-example\">GitHub repository</a>.</p>\n<h4>API project</h4>\n<p>Service interface definition:\npackage org.apache.skywalking.demo.interfaces;</p>\n<p>public interface HelloService {\nString sayHello(String name);\n}</p>\n<h4>Service provider project</h4>\n<p>package org.apache.skywalking.demo.provider;</p>\n<p>@Service(version = &quot;<span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mrow><mi>d</mi><mi>e</mi><mi>m</mi><mi>o</mi><mi mathvariant=\"normal\">.</mi><mi>s</mi><mi>e</mi><mi>r</mi><mi>v</mi><mi>i</mi><mi>c</mi><mi>e</mi><mi mathvariant=\"normal\">.</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mi mathvariant=\"normal\">&quot;</mi><mo separator=\"true\">,</mo><mi>a</mi><mi>p</mi><mi>p</mi><mi>l</mi><mi>i</mi><mi>c</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>=</mo><mi mathvariant=\"normal\">&quot;</mi></mrow><annotation encoding=\"application/x-tex\">{demo.service.version}&quot;,\n\tapplication = &quot;</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"strut\" style=\"height:0.69444em;\"></span><span class=\"strut bottom\" style=\"height:0.8888799999999999em;vertical-align:-0.19444em;\"></span><span class=\"base textstyle uncramped\"><span class=\"mord textstyle uncramped\"><span class=\"mord mathit\">d</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\">m</span><span class=\"mord mathit\">o</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">v</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">e</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">v</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">n</span></span><span class=\"mord mathrm\">&quot;</span><span class=\"mpunct\">,</span><span class=\"mord mathit\">a</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">a</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">n</span><span class=\"mrel\">=</span><span class=\"mord mathrm\">&quot;</span></span></span></span>{<a href=\"http://dubbo.application.id\">dubbo.application.id</a>}&quot;,\nprotocol = &quot;<span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mrow><mi>d</mi><mi>u</mi><mi>b</mi><mi>b</mi><mi>o</mi><mi mathvariant=\"normal\">.</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>t</mi><mi>o</mi><mi>c</mi><mi>o</mi><mi>l</mi><mi mathvariant=\"normal\">.</mi><mi>i</mi><mi>d</mi></mrow><mi mathvariant=\"normal\">&quot;</mi><mo separator=\"true\">,</mo><mi>r</mi><mi>e</mi><mi>g</mi><mi>i</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>y</mi><mo>=</mo><mi mathvariant=\"normal\">&quot;</mi></mrow><annotation encoding=\"application/x-tex\">{dubbo.protocol.id}&quot;,\n\tregistry = &quot;</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"strut\" style=\"height:0.69444em;\"></span><span class=\"strut bottom\" style=\"height:0.8888799999999999em;vertical-align:-0.19444em;\"></span><span class=\"base textstyle uncramped\"><span class=\"mord textstyle uncramped\"><span class=\"mord mathit\">d</span><span class=\"mord mathit\">u</span><span class=\"mord mathit\">b</span><span class=\"mord mathit\">b</span><span class=\"mord mathit\">o</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">d</span></span><span class=\"mord mathrm\">&quot;</span><span class=\"mpunct\">,</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">g</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">y</span><span class=\"mrel\">=</span><span class=\"mord mathrm\">&quot;</span></span></span></span>{<a href=\"http://dubbo.registry.id\">dubbo.registry.id</a>}&quot;, timeout = 60000)\npublic class HelloServiceImpl implements HelloService {</p>\n<pre><code>public String sayHello(String name) {\n\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));\n\treturn &quot;Hello, &quot; + name;\n}\n</code></pre>\n<p>}</p>\n<h4>Service consumer project</h4>\n<p>package org.apache.skywalking.demo.consumer;</p>\n<p>@RestController\npublic class ConsumerController {</p>\n<pre><code>private static int COUNT = 0;\n\n@Reference(version = &quot;${demo.service.version}&quot;,\n\tapplication = &quot;${dubbo.application.id}&quot;,\n\turl = &quot;dubbo://localhost:20880&quot;, timeout = 60000)\nprivate HelloService helloService;\n\n@GetMapping(&quot;/sayHello/{name}&quot;)\npublic String sayHello(@PathVariable(name = &quot;name&quot;) String name) {\n\tif ((COUNT++) % 3 == 0){\n\t\tthrow new RuntimeException();\n\t}\n\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));\n\treturn helloService.sayHello(name);\n}\n</code></pre>\n<p>}</p>\n<h3>Deploy Apache Skywalking(incubator)</h3>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache skywalking (Incubator)</a> offers  two deployment modes: single-node mode and cluster mode,Here is  the single-node mode deployment step, and more about how to deploy skywalking with cluster mode, please reference <a href=\"https://github.com/apache/incubator-skywalking/blob/master/docs/en/Deploy-backend-in-cluster-mode.md\">document</a>.</p>\n<h4>Third-party components</h4>\n<ol>\n<li>JDK 8+</li>\n<li>Elasticsearch 5.x</li>\n</ol>\n<h4>Deployment step</h4>\n<ol>\n<li>Download <a href=\"http://skywalking.apache.org/downloads/\">Apache Skywalking Collector</a></li>\n<li>Deploy Elasticsearch service\n<ul>\n<li>Set <code>cluster.name</code> to <code>CollectorDBCluster</code></li>\n<li>Set <code>network.host</code> to <code>0.0.0.0</code></li>\n<li>Start elasticsearch service</li>\n</ul>\n</li>\n<li>Unzip and start the Skywalking Collector. Run the ' bin/startup.sh ' command to start skywalking Collector</li>\n</ol>\n<h4>Deploy the demo</h4>\n<p>Before you deploy the demo service, please run the following command:</p>\n<pre><code>./mvnw clean package\n</code></pre>\n<h4>Deploy the provider service</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar\n</code></pre>\n<h4>Deploy the consumer service</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar \n</code></pre>\n<h4>visit demo service</h4>\n<pre><code>curl http://localhost:8080/sayHello/test\n</code></pre>\n<h2>Skywalking scren snapshot</h2>\n<h3>Dashboard</h3>\n<p><img src=\"../sources/images/skywalking-dashboard.png\" alt=\"/admin-guide/images/skywalking-dashboard.png\"></p>\n<h3>Topology</h3>\n<p><img src=\"../sources/images/skywalking-topology.png\" alt=\"/admin-guide/images/skywalking-topology.png\"></p>\n<h3>Application view</h3>\n<p><img src=\"../sources/images/skywalking-application.png\" alt=\"/admin-guide/images/skywalking-application.png\"></p>\n<p>JVM Information\n<img src=\"../sources/images/skywalking-application_instance.png\" alt=\"/admin-guide/images/skywalking-application_instance.png\"></p>\n<h3>Service view</h3>\n<p>Consumer side\n<img src=\"../sources/images/skywalking-service-consumer.png\" alt=\"/admin-guide/images/skywalking-service-consumer.png\"></p>\n<p>provider side\n<img src=\"../sources/images/skywalking-service-provider.png\" alt=\"/admin-guide/images/skywalking-service-provider.png\"></p>\n<h3>Trace</h3>\n<p><img src=\"../sources/images/skywalking-trace.png\" alt=\"/admin-guide/images/skywalking-trace.png\"></p>\n<p>Span info\n<img src=\"../sources/images/skywalking-span-Info.png\" alt=\"/admin-guide/images/skywalking-span-Info.png\"></p>\n<h3>Alarm view</h3>\n<p><img src=\"../sources/images/skywalking-alarm.png\" alt=\"/admin-guide/images/skywalking-alarm.png\"></p>\n"
+  "__html": "<h1>Tracing Dubbo service with Apache Skywalking(incubator)</h1>\n<h2>Introduction to Apache Skywalking(Incubator)</h2>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a>  is the APM system that it designed for micro-services architectures and cloud native architecture systems and supports distribute tracking. <a href=\"https://github.com/apache/incubator-skywalking\">Apache skywalking (incubator)</a> collects and analyzes the trace data and generates the relationship between the application and the service metric, Apache skywalking (incubating) supports multiple languages agent, for example <a href=\"https://github.com/apache/incubator-skywalking\">Java</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-netcore\">.net core</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-nodejs\">Node.js</a> and <a href=\"https://github.com/OpenSkywalking/skywalking-go\">Go</a>.</p>\n<p>Currently, Skywalking has supported analysis the operation of distributed systems from 6 visual dimensions. The overview view is a global view of your applications and components, including the number of components and applications, application alarm fluctuations, slow service lists, and application throughput; The topology shows the topological relationship of the whole application; The application view represents the upstream and downstream relationship of the application from single application, TOP N services and servers, JVM, host and process info. The service view focuses on the operation of a single service portal and the upstream and downstream dependencies of this service and it helps the user to optimize and monitor a single service; the trace graph shows all the buried points of the invocation and the execution time of each burial point, and the alarm view is based on the configuration threshold for the application, server, service for real-time alarms</p>\n<h2>Dubbo and Apache Skywalking(Incubator)</h2>\n<h3>Build the Dubbo demo  project</h3>\n<p>The Dubbo demo has been uploaded to the <a href=\"https://github.com/SkywalkingTest/dubbo-trace-example\">GitHub repository</a>.</p>\n<h4>API project</h4>\n<p>Service interface definition:\npackage org.apache.skywalking.demo.interfaces;</p>\n<p>public interface HelloService {\nString sayHello(String name);\n}</p>\n<h4>Service provider project</h4>\n<p>package org.apache.skywalking.demo.provider;</p>\n<p>@Service(version = &quot;<span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mrow><mi>d</mi><mi>e</mi><mi>m</mi><mi>o</mi><mi mathvariant=\"normal\">.</mi><mi>s</mi><mi>e</mi><mi>r</mi><mi>v</mi><mi>i</mi><mi>c</mi><mi>e</mi><mi mathvariant=\"normal\">.</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mi mathvariant=\"normal\">&quot;</mi><mo separator=\"true\">,</mo><mi>a</mi><mi>p</mi><mi>p</mi><mi>l</mi><mi>i</mi><mi>c</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>=</mo><mi mathvariant=\"normal\">&quot;</mi></mrow><annotation encoding=\"application/x-tex\">{demo.service.version}&quot;,\n\tapplication = &quot;</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"strut\" style=\"height:0.69444em;\"></span><span class=\"strut bottom\" style=\"height:0.8888799999999999em;vertical-align:-0.19444em;\"></span><span class=\"base textstyle uncramped\"><span class=\"mord textstyle uncramped\"><span class=\"mord mathit\">d</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\">m</span><span class=\"mord mathit\">o</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">v</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">e</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">v</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">n</span></span><span class=\"mord mathrm\">&quot;</span><span class=\"mpunct\">,</span><span class=\"mord mathit\">a</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">a</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">n</span><span class=\"mrel\">=</span><span class=\"mord mathrm\">&quot;</span></span></span></span>{<a href=\"http://dubbo.application.id\">dubbo.application.id</a>}&quot;,\nprotocol = &quot;<span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mrow><mi>d</mi><mi>u</mi><mi>b</mi><mi>b</mi><mi>o</mi><mi mathvariant=\"normal\">.</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>t</mi><mi>o</mi><mi>c</mi><mi>o</mi><mi>l</mi><mi mathvariant=\"normal\">.</mi><mi>i</mi><mi>d</mi></mrow><mi mathvariant=\"normal\">&quot;</mi><mo separator=\"true\">,</mo><mi>r</mi><mi>e</mi><mi>g</mi><mi>i</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>y</mi><mo>=</mo><mi mathvariant=\"normal\">&quot;</mi></mrow><annotation encoding=\"application/x-tex\">{dubbo.protocol.id}&quot;,\n\tregistry = &quot;</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"strut\" style=\"height:0.69444em;\"></span><span class=\"strut bottom\" style=\"height:0.8888799999999999em;vertical-align:-0.19444em;\"></span><span class=\"base textstyle uncramped\"><span class=\"mord textstyle uncramped\"><span class=\"mord mathit\">d</span><span class=\"mord mathit\">u</span><span class=\"mord mathit\">b</span><span class=\"mord mathit\">b</span><span class=\"mord mathit\">o</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">p</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\">c</span><span class=\"mord mathit\">o</span><span class=\"mord mathit\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathrm\">.</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">d</span></span><span class=\"mord mathrm\">&quot;</span><span class=\"mpunct\">,</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\">e</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">g</span><span class=\"mord mathit\">i</span><span class=\"mord mathit\">s</span><span class=\"mord mathit\">t</span><span class=\"mord mathit\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathit\" style=\"margin-right:0.03588em;\">y</span><span class=\"mrel\">=</span><span class=\"mord mathrm\">&quot;</span></span></span></span>{<a href=\"http://dubbo.registry.id\">dubbo.registry.id</a>}&quot;, timeout = 60000)\npublic class HelloServiceImpl implements HelloService {</p>\n<pre><code>public String sayHello(String name) {\n\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));\n\treturn &quot;Hello, &quot; + name;\n}\n</code></pre>\n<p>}</p>\n<h4>Service consumer project</h4>\n<p>package org.apache.skywalking.demo.consumer;</p>\n<p>@RestController\npublic class ConsumerController {</p>\n<pre><code>private static int COUNT = 0;\n\n@Reference(version = &quot;${demo.service.version}&quot;,\n\tapplication = &quot;${dubbo.application.id}&quot;,\n\turl = &quot;dubbo://localhost:20880&quot;, timeout = 60000)\nprivate HelloService helloService;\n\n@GetMapping(&quot;/sayHello/{name}&quot;)\npublic String sayHello(@PathVariable(name = &quot;name&quot;) String name) {\n\tif ((COUNT++) % 3 == 0){\n\t\tthrow new RuntimeException();\n\t}\n\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));\n\treturn helloService.sayHello(name);\n}\n</code></pre>\n<p>}</p>\n<h3>Deploy Apache Skywalking(incubator)</h3>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache skywalking (Incubator)</a> offers  two deployment modes: single-node mode and cluster mode,Here is  the single-node mode deployment step, and more about how to deploy skywalking with cluster mode, please reference <a href=\"https://github.com/apache/incubator-skywalking/blob/master/docs/en/Deploy-backend-in-cluster-mode.md\">document</a>.</p>\n<h4>Third-party components</h4>\n<ol>\n<li>JDK 8+</li>\n<li>Elasticsearch 5.x</li>\n</ol>\n<h4>Deployment step</h4>\n<ol>\n<li>Download <a href=\"http://skywalking.apache.org/downloads/\">Apache Skywalking Collector</a></li>\n<li>Deploy Elasticsearch service\n<ul>\n<li>Set <code>cluster.name</code> to <code>CollectorDBCluster</code></li>\n<li>Set <code>network.host</code> to <code>0.0.0.0</code></li>\n<li>Start elasticsearch service</li>\n</ul>\n</li>\n<li>Unzip and start the Skywalking Collector. Run the ' bin/startup.sh ' command to start skywalking Collector</li>\n</ol>\n<h4>Deploy the demo</h4>\n<p>Before you deploy the demo service, please run the following command:</p>\n<pre><code>./mvnw clean package\n</code></pre>\n<h4>Deploy the provider service</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar\n</code></pre>\n<h4>Deploy the consumer service</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar \n</code></pre>\n<h4>visit demo service</h4>\n<pre><code>curl http://localhost:8080/sayHello/test\n</code></pre>\n<h2>Skywalking scren snapshot</h2>\n<h3>Dashboard</h3>\n<p><img src=\"../sources/images/skywalking-dashboard.png\" alt=\"/admin-guide/images/skywalking-dashboard.png\"></p>\n<h3>Topology</h3>\n<p><img src=\"../sources/images/skywalking-topology.png\" alt=\"/admin-guide/images/skywalking-topology.png\"></p>\n<h3>Application view</h3>\n<p><img src=\"../sources/images/skywalking-application.png\" alt=\"/admin-guide/images/skywalking-application.png\"></p>\n<p>JVM Information\n<img src=\"../sources/images/skywalking-application_instance.png\" alt=\"/admin-guide/images/skywalking-application_instance.png\"></p>\n<h3>Service view</h3>\n<p>Consumer side\n<img src=\"../sources/images/skywalking-service-consumer.png\" alt=\"/admin-guide/images/skywalking-service-consumer.png\"></p>\n<p>provider side\n<img src=\"../sources/images/skywalking-service-provider.png\" alt=\"/admin-guide/images/skywalking-service-provider.png\"></p>\n<h3>Trace</h3>\n<p><img src=\"../sources/images/skywalking-trace.png\" alt=\"/admin-guide/images/skywalking-trace.png\"></p>\n<p>Span info\n<img src=\"../sources/images/skywalking-span-Info.png\" alt=\"/admin-guide/images/skywalking-span-Info.png\"></p>\n<h3>Alarm view</h3>\n<p><img src=\"../sources/images/skywalking-alarm.png\" alt=\"/admin-guide/images/skywalking-alarm.png\"></p>\n",
+  "link": "/en-us/docs/admin/ops/skywalking.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/README.json b/en-us/docs/dev/README.json
index 14b45b20..2dfd4790 100644
--- a/en-us/docs/dev/README.json
+++ b/en-us/docs/dev/README.json
@@ -1,4 +1,6 @@
 {
   "filename": "README.md",
-  "__html": "<h1>dubbo-dev-book</h1>\n<p>This book dives into the design principles of dubbo, mainly covers the following topics: extension, coding styles, versio, build, etc.</p>\n"
+  "__html": "<h1>dubbo-dev-book</h1>\n<p>This book dives into the design principles of dubbo, mainly covers the following topics: extension, coding styles, versio, build, etc.</p>\n",
+  "link": "/en-us/docs/dev/README.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/SPI.json b/en-us/docs/dev/SPI.json
index 46efa736..16d3abbd 100644
--- a/en-us/docs/dev/SPI.json
+++ b/en-us/docs/dev/SPI.json
@@ -1,4 +1,6 @@
 {
   "filename": "SPI.md",
-  "__html": "<h1>SPI Loading</h1>\n<h2>SPI Config</h2>\n<h3>Source:</h3>\n<p>Dubbo SPI is inherited from standard JDK SPI(Service Provider Interface) and makes it more powerful.</p>\n<p>Dubbo fixed below issues of the standard JDK SPI:</p>\n<ul>\n<li>the standard JDK  SPI will load  and instantize all implementation at once. It will be a waste of resources if the implementation is timecosted ,but never be used.</li>\n<li>We cann't accquire the SPI name,if loading the SPI implementation is failed.For example:standard JDK  ScriptEngine,get script type by invoking method getName(). RubyScriptEngine class will load failed if the depenency jar jruby.jar is missing,and the real error info will be lost. When user executes ruby scripts , program throws exception , telling not support ruby, but it is not the real cause.</li>\n<li>Enhance the SPI functionality by supporting  IoC and AOP ,one SPI can be easily injected by another SPI simply using  setter.</li>\n</ul>\n<h3>Appointment:</h3>\n<p>In the jar file containing extension class <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,places a config file  <code>META-INF/dubbo/full interface name</code>,file content pattern:<code>SPI name=the fully qualified name for the extension class</code>,use new line seperator for multiple implementation.</p>\n<h3>Example:</h3>\n<p>To extend  Dubbo Protocol,placee a text file in the extension jar file:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol</code>,content:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.alibaba.xxx.XxxProtocol</span>\n</code></pre>\n<p>content of the implementation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>Configuration in config module</h3>\n<p>In Dubbo config module,all SPI points have related attributes or labels,we can choose the specific SPI implementation by using its name. Like:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>SPI Features</h2>\n<h3>SPI Auto Wrap</h3>\n<p>Auto wrap the SPI's Wrapper class。<code>ExtensionLoader</code>  loads the SPI implementation,if the SPI has a copy instructor ,it will be regarded as the SPI's Wrapper class。</p>\n<p>Wrapper class content:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocolWrapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    Protocol impl;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxProtocolWrapper</span><span class=\"hljs-params\">(Protocol protocol)</span> </span>{ impl = protocol; }\n \n    <span class=\"hljs-comment\">//after interface method is executed,the method in extension will be executed</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">//... some operation</span>\n        impl.refer();\n        <span class=\"hljs-comment\">// ... some operation</span>\n    }\n \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Wrapper class also implements the same SPI interface,but Wrapper is not the real implementation。It is used for wrap the real  implementation  returned from the <code>ExtensionLoader</code> 。The real returned instance by   <code>ExtensionLoader</code>  is the Wrapper class instance,Wrapper holder the real SPI implementation class。</p>\n<p>There can be many Wrapper for one spi, simply add one if you need。</p>\n<p>By Wrapper class,you will be able move same logics into Wrapper for all SPIs。Newly added Wrapper class add external logics for all spis, looks like  AOP, Wrapper acts as a proxy for SPI.</p>\n<h3>SPI Auto Load</h3>\n<p>when loading the SPI,Dubbo will auto load the depency SPI. When one SPI implementation contains attribute which is also an SPI of another type,<code>ExtensionLoader</code> will automatically load the depency SPI.<code>ExtensionLoader</code> knows all the members of the specific SPI by scanning the setter method of all implementation class.</p>\n<p>Demo:two SPI  <code>CarMaker</code>(car maker)、<code>WheelMaker</code> (wheel maker)</p>\n<p>Intefaces look like:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">()</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code>  implementation:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel();\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p>when<code>ExtensionLoader</code> loading <code>CarMaker</code>  implementation <code>RaceCar</code> ,<code>setWheelMaker</code>  needs paramType <code>WheelMaker</code>  which is also an SPI, It will be automatically loaded .</p>\n<p>This brings a new question:How <code>ExtensionLoader</code> determines which implementation to use when load the injected SPI。As for this demo, when existing multi <code>WheelMaker</code>  implementation, which one should the <code>ExtensionLoader</code>  chooses.</p>\n<p>Good question ,we will explain it in the following chapter: SPI Auto Adaptive.</p>\n<h3>SPI Auto Adaptive</h3>\n<p>The depency SPI that <code>ExtensionLoader</code>  injects is an instance of <code>Adaptive</code>,the real spi implementation is known until the adaptive instance is be executed.</p>\n<p>Dubbo  use URL (containing Key-Value) to pass the configuration.</p>\n<p>The SPI method invocation has the URL parameter(Or Entity that has URL attribute)</p>\n<p>In this way depended SPI can get configuration from URL,after config all SPI  key needed, configuration information will be passed from outer by URL.URL act as a bus when pass the config information.</p>\n<p>Demo:two SPI  <code>CarMaker</code>、<code>WheelMaker</code></p>\n<p>interface looks like:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code>  implementation:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel(url);\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p>when execute the code above</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// ...</span>\nWheel wheel = wheelMaker.makeWheel(url);\n<span class=\"hljs-comment\">// ...</span>\n</code></pre>\n<p>,the injected <code>Adaptive</code>  object determine which  <code>WheelMaker</code> 's  <code>makeWheel</code>  method will be executed by predefined Key.。Such  as <code>wheel.type</code>, key  <code>url.get(&quot;wheel.type&quot;)</code>  will determine <code>WheelMake</code>  implementation。The logic of<code>Adaptive</code> instance of fixed,getting the predefined Key of the URL,dynamically creating the real implementation and execute it.</p>\n<p>For Dubbo , the SPI  <code>Adaptive</code>  implementation in  <code>ExtensionLoader</code>  is dynamically created when dubbo is loading the SPI。Get the Key from URL, the Key will be provided through <code>@Adaptive</code> annotation for the interface method definition.</p>\n<p>Below is Dubbo  Transporter SPI codes:</p>\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\">Transporter</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"server\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n \n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"client\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n}\n</code></pre>\n<p>for the method bind(),Adaptive will firstly search <code>server</code> key,if no Key  were founded then will search <code>transport</code> key ,to determine the implementation that the proxy represent for.</p>\n<h3>SPI Auto Activation</h3>\n<p>As for Collections SPI, such as:<code>Filter</code>, <code>InvokerListener</code>, <code>ExportListener</code>, <code>TelnetHandler</code>, <code>StatusChecker</code>  etc,multi implementations can be loaded at one time. User can simplify configuration by using auto activation,Like:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span> <span class=\"hljs-comment\">// Active for any condition</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(<span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// when configed xxx parameter and the parameter has a valid value,the SPI is activated,for example configed cache=\"lru\",auto acitivate CacheFilter。</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(group = <span class=\"hljs-string\">\"provider\"</span>, value = <span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// only activate for provider,group can be \"provider\" or \"consumer\"</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Note:The config file here is in you own jar file,not in dubbo release jar file,Dubbo  will scan all jar files for the same filename in  ClassPath and merge together then <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Note:SPI will be loaded in singleton pattern(Please ensure thread safety ),cached in  <code>ExtensionLoader</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>SPI Loading</h1>\n<h2>SPI Config</h2>\n<h3>Source:</h3>\n<p>Dubbo SPI is inherited from standard JDK SPI(Service Provider Interface) and makes it more powerful.</p>\n<p>Dubbo fixed below issues of the standard JDK SPI:</p>\n<ul>\n<li>the standard JDK  SPI will load  and instantize all implementation at once. It will be a waste of resources if the implementation is timecosted ,but never be used.</li>\n<li>We cann't accquire the SPI name,if loading the SPI implementation is failed.For example:standard JDK  ScriptEngine,get script type by invoking method getName(). RubyScriptEngine class will load failed if the depenency jar jruby.jar is missing,and the real error info will be lost. When user executes ruby scripts , program throws exception , telling not support ruby, but it is not the real cause.</li>\n<li>Enhance the SPI functionality by supporting  IoC and AOP ,one SPI can be easily injected by another SPI simply using  setter.</li>\n</ul>\n<h3>Appointment:</h3>\n<p>In the jar file containing extension class <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,places a config file  <code>META-INF/dubbo/full interface name</code>,file content pattern:<code>SPI name=the fully qualified name for the extension class</code>,use new line seperator for multiple implementation.</p>\n<h3>Example:</h3>\n<p>To extend  Dubbo Protocol,placee a text file in the extension jar file:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol</code>,content:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.alibaba.xxx.XxxProtocol</span>\n</code></pre>\n<p>content of the implementation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>Configuration in config module</h3>\n<p>In Dubbo config module,all SPI points have related attributes or labels,we can choose the specific SPI implementation by using its name. Like:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>SPI Features</h2>\n<h3>SPI Auto Wrap</h3>\n<p>Auto wrap the SPI's Wrapper class。<code>ExtensionLoader</code>  loads the SPI implementation,if the SPI has a copy instructor ,it will be regarded as the SPI's Wrapper class。</p>\n<p>Wrapper class content:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocolWrapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    Protocol impl;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxProtocolWrapper</span><span class=\"hljs-params\">(Protocol protocol)</span> </span>{ impl = protocol; }\n \n    <span class=\"hljs-comment\">//after interface method is executed,the method in extension will be executed</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">//... some operation</span>\n        impl.refer();\n        <span class=\"hljs-comment\">// ... some operation</span>\n    }\n \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Wrapper class also implements the same SPI interface,but Wrapper is not the real implementation。It is used for wrap the real  implementation  returned from the <code>ExtensionLoader</code> 。The real returned instance by   <code>ExtensionLoader</code>  is the Wrapper class instance,Wrapper holder the real SPI implementation class。</p>\n<p>There can be many Wrapper for one spi, simply add one if you need。</p>\n<p>By Wrapper class,you will be able move same logics into Wrapper for all SPIs。Newly added Wrapper class add external logics for all spis, looks like  AOP, Wrapper acts as a proxy for SPI.</p>\n<h3>SPI Auto Load</h3>\n<p>when loading the SPI,Dubbo will auto load the depency SPI. When one SPI implementation contains attribute which is also an SPI of another type,<code>ExtensionLoader</code> will automatically load the depency SPI.<code>ExtensionLoader</code> knows all the members of the specific SPI by scanning the setter method of all implementation class.</p>\n<p>Demo:two SPI  <code>CarMaker</code>(car maker)、<code>WheelMaker</code> (wheel maker)</p>\n<p>Intefaces look like:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">()</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code>  implementation:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel();\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p>when<code>ExtensionLoader</code> loading <code>CarMaker</code>  implementation <code>RaceCar</code> ,<code>setWheelMaker</code>  needs paramType <code>WheelMaker</code>  which is also an SPI, It will be automatically loaded .</p>\n<p>This brings a new question:How <code>ExtensionLoader</code> determines which implementation to use when load the injected SPI。As for this demo, when existing multi <code>WheelMaker</code>  implementation, which one should the <code>ExtensionLoader</code>  chooses.</p>\n<p>Good question ,we will explain it in the following chapter: SPI Auto Adaptive.</p>\n<h3>SPI Auto Adaptive</h3>\n<p>The depency SPI that <code>ExtensionLoader</code>  injects is an instance of <code>Adaptive</code>,the real spi implementation is known until the adaptive instance is be executed.</p>\n<p>Dubbo  use URL (containing Key-Value) to pass the configuration.</p>\n<p>The SPI method invocation has the URL parameter(Or Entity that has URL attribute)</p>\n<p>In this way depended SPI can get configuration from URL,after config all SPI  key needed, configuration information will be passed from outer by URL.URL act as a bus when pass the config information.</p>\n<p>Demo:two SPI  <code>CarMaker</code>、<code>WheelMaker</code></p>\n<p>interface looks like:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code>  implementation:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel(url);\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p>when execute the code above</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// ...</span>\nWheel wheel = wheelMaker.makeWheel(url);\n<span class=\"hljs-comment\">// ...</span>\n</code></pre>\n<p>,the injected <code>Adaptive</code>  object determine which  <code>WheelMaker</code> 's  <code>makeWheel</code>  method will be executed by predefined Key.。Such  as <code>wheel.type</code>, key  <code>url.get(&quot;wheel.type&quot;)</code>  will determine <code>WheelMake</code>  implementation。The logic of<code>Adaptive</code> instance of fixed,getting the predefined Key of the URL,dynamically creating the real implementation and execute it.</p>\n<p>For Dubbo , the SPI  <code>Adaptive</code>  implementation in  <code>ExtensionLoader</code>  is dynamically created when dubbo is loading the SPI。Get the Key from URL, the Key will be provided through <code>@Adaptive</code> annotation for the interface method definition.</p>\n<p>Below is Dubbo  Transporter SPI codes:</p>\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\">Transporter</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"server\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n \n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"client\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n}\n</code></pre>\n<p>for the method bind(),Adaptive will firstly search <code>server</code> key,if no Key  were founded then will search <code>transport</code> key ,to determine the implementation that the proxy represent for.</p>\n<h3>SPI Auto Activation</h3>\n<p>As for Collections SPI, such as:<code>Filter</code>, <code>InvokerListener</code>, <code>ExportListener</code>, <code>TelnetHandler</code>, <code>StatusChecker</code>  etc,multi implementations can be loaded at one time. User can simplify configuration by using auto activation,Like:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span> <span class=\"hljs-comment\">// Active for any condition</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(<span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// when configed xxx parameter and the parameter has a valid value,the SPI is activated,for example configed cache=\"lru\",auto acitivate CacheFilter。</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(group = <span class=\"hljs-string\">\"provider\"</span>, value = <span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// only activate for provider,group can be \"provider\" or \"consumer\"</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Note:The config file here is in you own jar file,not in dubbo release jar file,Dubbo  will scan all jar files for the same filename in  ClassPath and merge together then <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Note:SPI will be loaded in singleton pattern(Please ensure thread safety ),cached in  <code>ExtensionLoader</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/dev/SPI.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/SUMMARY.json b/en-us/docs/dev/SUMMARY.json
index daf758ee..9978b5de 100644
--- a/en-us/docs/dev/SUMMARY.json
+++ b/en-us/docs/dev/SUMMARY.json
@@ -1,4 +1,6 @@
 {
   "filename": "SUMMARY.md",
-  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./build.md\">1 How To Build</a></li>\n<li><a href=\"./design.md\">2 Architecture</a></li>\n<li><a href=\"./SPI.md\">3 How SPI Works</a></li>\n<li><a href=\"./implementation.md\">4 Init, Process, Protocols</a></li>\n<li><a href=\"./impls/introduction.md\">5 SPI Extensions</a>\n<ul>\n<li><a href=\"./impls/protocol.md\">5.1 Protocol</a></li>\n<li><a href=\"./impls/filter.md\">5.2 Filter</a></li>\n<li><a href=\"./impls/invoker-listener.md\">5.3 InvokerListener</a></li>\n<li><a href=\"./impls/exporter-listener.md\">5.4 ExporterListener</a></li>\n<li><a href=\"./impls/cluster.md\">5.5 Cluster</a></li>\n<li><a href=\"./impls/router.md\">5.6 Router</a></li>\n<li><a href=\"./impls/load-balance.md\">5.7 LoadBalance</a></li>\n<li><a href=\"./impls/merger.md\">5.8 Merger</a></li>\n<li><a href=\"./impls/registry.md\">5.9 Registry</a></li>\n<li><a href=\"./impls/monitor.md\">5.10 Monitor</a></li>\n<li><a href=\"./impls/extension-factory.md\">5.11 ExtensionFactory</a></li>\n<li><a href=\"./impls/proxy-factory.md\">5.12 ProxyFactory</a></li>\n<li><a href=\"./impls/compiler.md\">5.13 Compiler</a></li>\n<li><a href=\"./impls/dispatcher.md\">5.14 Dispatcher</a></li>\n<li><a href=\"./impls/threadpool.md\">5.15 Threadpool</a></li>\n<li><a href=\"./impls/serialize.md\">5.16 Serialization</a></li>\n<li><a href=\"./impls/remoting.md\">5.17 Remoting</a></li>\n<li><a href=\"./impls/exchanger.md\">5.18 Exchanger</a></li>\n<li><a href=\"./impls/networker.md\">5.19 Networker</a></li>\n<li><a href=\"./impls/telnet-handler.md\">5.20 TelnetHandler</a></li>\n<li><a href=\"./impls/status-checker.md\">5.21 StatusChecker</a></li>\n<li><a href=\"./impls/container.md\">5.22 Container</a></li>\n<li><a href=\"./impls/page.md\">5.23 PageHandler</a></li>\n<li><a href=\"./impls/cache.md\">5.24 Cache</a></li>\n<li><a href=\"./impls/validation.md\">5.25 Validation</a></li>\n<li><a href=\"./impls/logger-adapter.md\">5.26 LoggerAdapter</a></li>\n</ul>\n</li>\n<li><a href=\"./contract.md\">6 Contract</a></li>\n<li><a href=\"./coding.md\">7 Code Style</a></li>\n<li><a href=\"./release.md\">9 Versions</a></li>\n<li><a href=\"./contribution.md\">10 Contribution</a></li>\n<li><a href=\"./checklist.md\">11 Checklist</a></li>\n<li><a href=\"./code-smell.md\">12 Code Smell</a></li>\n<li><a href=\"./TCK.md\">13 TCK</a></li>\n</ul>\n"
+  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./build.md\">1 How To Build</a></li>\n<li><a href=\"./design.md\">2 Architecture</a></li>\n<li><a href=\"./SPI.md\">3 How SPI Works</a></li>\n<li><a href=\"./implementation.md\">4 Init, Process, Protocols</a></li>\n<li><a href=\"./impls/introduction.md\">5 SPI Extensions</a>\n<ul>\n<li><a href=\"./impls/protocol.md\">5.1 Protocol</a></li>\n<li><a href=\"./impls/filter.md\">5.2 Filter</a></li>\n<li><a href=\"./impls/invoker-listener.md\">5.3 InvokerListener</a></li>\n<li><a href=\"./impls/exporter-listener.md\">5.4 ExporterListener</a></li>\n<li><a href=\"./impls/cluster.md\">5.5 Cluster</a></li>\n<li><a href=\"./impls/router.md\">5.6 Router</a></li>\n<li><a href=\"./impls/load-balance.md\">5.7 LoadBalance</a></li>\n<li><a href=\"./impls/merger.md\">5.8 Merger</a></li>\n<li><a href=\"./impls/registry.md\">5.9 Registry</a></li>\n<li><a href=\"./impls/monitor.md\">5.10 Monitor</a></li>\n<li><a href=\"./impls/extension-factory.md\">5.11 ExtensionFactory</a></li>\n<li><a href=\"./impls/proxy-factory.md\">5.12 ProxyFactory</a></li>\n<li><a href=\"./impls/compiler.md\">5.13 Compiler</a></li>\n<li><a href=\"./impls/dispatcher.md\">5.14 Dispatcher</a></li>\n<li><a href=\"./impls/threadpool.md\">5.15 Threadpool</a></li>\n<li><a href=\"./impls/serialize.md\">5.16 Serialization</a></li>\n<li><a href=\"./impls/remoting.md\">5.17 Remoting</a></li>\n<li><a href=\"./impls/exchanger.md\">5.18 Exchanger</a></li>\n<li><a href=\"./impls/networker.md\">5.19 Networker</a></li>\n<li><a href=\"./impls/telnet-handler.md\">5.20 TelnetHandler</a></li>\n<li><a href=\"./impls/status-checker.md\">5.21 StatusChecker</a></li>\n<li><a href=\"./impls/container.md\">5.22 Container</a></li>\n<li><a href=\"./impls/page.md\">5.23 PageHandler</a></li>\n<li><a href=\"./impls/cache.md\">5.24 Cache</a></li>\n<li><a href=\"./impls/validation.md\">5.25 Validation</a></li>\n<li><a href=\"./impls/logger-adapter.md\">5.26 LoggerAdapter</a></li>\n</ul>\n</li>\n<li><a href=\"./contract.md\">6 Contract</a></li>\n<li><a href=\"./coding.md\">7 Code Style</a></li>\n<li><a href=\"./release.md\">9 Versions</a></li>\n<li><a href=\"./contribution.md\">10 Contribution</a></li>\n<li><a href=\"./checklist.md\">11 Checklist</a></li>\n<li><a href=\"./code-smell.md\">12 Code Smell</a></li>\n<li><a href=\"./TCK.md\">13 TCK</a></li>\n</ul>\n",
+  "link": "/en-us/docs/dev/SUMMARY.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/TCK.json b/en-us/docs/dev/TCK.json
index 004a770f..c2e06994 100644
--- a/en-us/docs/dev/TCK.json
+++ b/en-us/docs/dev/TCK.json
@@ -1,4 +1,6 @@
 {
   "filename": "TCK.md",
-  "__html": "<h1>Compatibility test</h1>\n<p>Dubbo's protocol, communication, serialization, registry, load balancing and other SPI all offer alternative strategies for different application scenarios while our test cases are very scattered. Ours is always uncertain whether it can satisfy the complete contract of the extension point when users need to add a new implementation.</p>\n<p>Thus we need to use TCK (Technology Compatibility Kit) for the core extension points.  When users add a new implementaion, compatibility with the rest of the framework can be ensured with TCK. This can effectively improve the overall health and also facilitate the access of the third party extenders, which accelerates the maturity of the open source community.</p>\n<p>Xingzhi from the open source community is already working on this part. His preliminary idea is to build a TCK framework for Dubbo drawing on the CDI-TCK of JBoss first, then realize the TCK implementing case of Dubbo.</p>\n<p>Reference:<a href=\"http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html\">http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html</a></p>\n<p>Anyone interested  is welcomed to work on this together.</p>\n<h4>Protocol TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n<h4>Registry TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n"
+  "__html": "<h1>Compatibility test</h1>\n<p>Dubbo's protocol, communication, serialization, registry, load balancing and other SPI all offer alternative strategies for different application scenarios while our test cases are very scattered. Ours is always uncertain whether it can satisfy the complete contract of the extension point when users need to add a new implementation.</p>\n<p>Thus we need to use TCK (Technology Compatibility Kit) for the core extension points.  When users add a new implementaion, compatibility with the rest of the framework can be ensured with TCK. This can effectively improve the overall health and also facilitate the access of the third party extenders, which accelerates the maturity of the open source community.</p>\n<p>Xingzhi from the open source community is already working on this part. His preliminary idea is to build a TCK framework for Dubbo drawing on the CDI-TCK of JBoss first, then realize the TCK implementing case of Dubbo.</p>\n<p>Reference:<a href=\"http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html\">http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html</a></p>\n<p>Anyone interested  is welcomed to work on this together.</p>\n<h4>Protocol TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n<h4>Registry TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n",
+  "link": "/en-us/docs/dev/TCK.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/build.json b/en-us/docs/dev/build.json
index 456ecdec..cfa25094 100644
--- a/en-us/docs/dev/build.json
+++ b/en-us/docs/dev/build.json
@@ -1,4 +1,6 @@
 {
   "filename": "build.md",
-  "__html": "<h1>Source Code Build</h1>\n<h2>Checkout</h2>\n<p>checkout the lastest project source code with commands blow:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git dubbo\n</code></pre>\n<h2>Branches</h2>\n<p>We use <code>master</code> as the major branch for new feature development, and use other branches for maintenance. Tags for all versions can be checked via <a href=\"https://github.com/apache/incubator-dubbo/tags\">https://github.com/apache/incubator-dubbo/tags</a>.</p>\n<h2>Building</h2>\n<p>Dubbo relies on <a href=\"http://maven.apache.org\">maven</a> as the building tool.</p>\n<p>Requirements:</p>\n<ul>\n<li>Java above 1.5 version</li>\n<li>Maven version 2.2.1 or above</li>\n</ul>\n<p>The following <code>MAVEN_OPTS</code>should be configured before building:</p>\n<pre><code class=\"language-sh\"><span class=\"hljs-built_in\">export</span> MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=512m\n</code></pre>\n<p>build with below command:</p>\n<pre><code class=\"language-sh\">mvn clean install\n</code></pre>\n<p>skip testing using below building command:</p>\n<pre><code class=\"language-sh\">mvn install -Dmaven.test.skip\n</code></pre>\n<h2>Building jar package of source code</h2>\n<p>build Dubbo source code jar package with below command, which can debug Dubbo source code.</p>\n<pre><code class=\"language-sh\">mvn clean <span class=\"hljs-built_in\">source</span>:jar install -Dmaven.test.skip\n</code></pre>\n<h2>IDE support</h2>\n<p>use below command to generate IDE.</p>\n<h3>Intellij Idea</h3>\n<pre><code class=\"language-sh\">mvn idea:idea\n</code></pre>\n<h3>Eclipse</h3>\n<pre><code class=\"language-sh\">mvn eclipse:eclipse\n</code></pre>\n<p>Importing into eclipse</p>\n<p>Firstly, a maven repository needs to be configured in eclipse. Define <code>M2_REPO</code> and point it to the local maven repository by clicking <code>Preferences -&gt; Java -&gt; Build Path -&gt; Classpath</code>.</p>\n<p>Use the following maven command as well:</p>\n<pre><code class=\"language-sh\">mvn eclipse:configure-workspace -Declipse.workspace=/path/to/the/workspace/\n</code></pre>\n<p>1: view the source code through <a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a>\n2: path under UNIX is ${HOME}/.m2/repository, path under Windows is C:\\Documents and Settings&lt;user&gt;.m2\\repository</p>\n"
+  "__html": "<h1>Source Code Build</h1>\n<h2>Checkout</h2>\n<p>checkout the lastest project source code with commands blow:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git dubbo\n</code></pre>\n<h2>Branches</h2>\n<p>We use <code>master</code> as the major branch for new feature development, and use other branches for maintenance. Tags for all versions can be checked via <a href=\"https://github.com/apache/incubator-dubbo/tags\">https://github.com/apache/incubator-dubbo/tags</a>.</p>\n<h2>Building</h2>\n<p>Dubbo relies on <a href=\"http://maven.apache.org\">maven</a> as the building tool.</p>\n<p>Requirements:</p>\n<ul>\n<li>Java above 1.5 version</li>\n<li>Maven version 2.2.1 or above</li>\n</ul>\n<p>The following <code>MAVEN_OPTS</code>should be configured before building:</p>\n<pre><code class=\"language-sh\"><span class=\"hljs-built_in\">export</span> MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=512m\n</code></pre>\n<p>build with below command:</p>\n<pre><code class=\"language-sh\">mvn clean install\n</code></pre>\n<p>skip testing using below building command:</p>\n<pre><code class=\"language-sh\">mvn install -Dmaven.test.skip\n</code></pre>\n<h2>Building jar package of source code</h2>\n<p>build Dubbo source code jar package with below command, which can debug Dubbo source code.</p>\n<pre><code class=\"language-sh\">mvn clean <span class=\"hljs-built_in\">source</span>:jar install -Dmaven.test.skip\n</code></pre>\n<h2>IDE support</h2>\n<p>use below command to generate IDE.</p>\n<h3>Intellij Idea</h3>\n<pre><code class=\"language-sh\">mvn idea:idea\n</code></pre>\n<h3>Eclipse</h3>\n<pre><code class=\"language-sh\">mvn eclipse:eclipse\n</code></pre>\n<p>Importing into eclipse</p>\n<p>Firstly, a maven repository needs to be configured in eclipse. Define <code>M2_REPO</code> and point it to the local maven repository by clicking <code>Preferences -&gt; Java -&gt; Build Path -&gt; Classpath</code>.</p>\n<p>Use the following maven command as well:</p>\n<pre><code class=\"language-sh\">mvn eclipse:configure-workspace -Declipse.workspace=/path/to/the/workspace/\n</code></pre>\n<p>1: view the source code through <a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a>\n2: path under UNIX is ${HOME}/.m2/repository, path under Windows is C:\\Documents and Settings&lt;user&gt;.m2\\repository</p>\n",
+  "link": "/en-us/docs/dev/build.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/checklist.json b/en-us/docs/dev/checklist.json
index b2a8b5de..d7b93c9e 100644
--- a/en-us/docs/dev/checklist.json
+++ b/en-us/docs/dev/checklist.json
@@ -1,4 +1,6 @@
 {
   "filename": "checklist.md",
-  "__html": "<h1>Checklist</h1>\n<h2>Checklist before release</h2>\n<ul>\n<li>github milestones</li>\n<li>github change lists</li>\n<li>Travis CI</li>\n<li>test code</li>\n<li>find bugs</li>\n</ul>\n<h2>Checklist for bigfix versions</h2>\n<ul>\n<li>Create a <em>github issue</em> before coding</li>\n<li>Create <em>unit test</em> before bugfix</li>\n<li>Review</li>\n<li>Test your code (Normal process / Abnormal process)</li>\n<li>Record your design on <em>github issue</em></li>\n<li>Complete javadoc and comment in code</li>\n<li>Manager for every version, responsible for scope and check</li>\n</ul>\n"
+  "__html": "<h1>Checklist</h1>\n<h2>Checklist before release</h2>\n<ul>\n<li>github milestones</li>\n<li>github change lists</li>\n<li>Travis CI</li>\n<li>test code</li>\n<li>find bugs</li>\n</ul>\n<h2>Checklist for bigfix versions</h2>\n<ul>\n<li>Create a <em>github issue</em> before coding</li>\n<li>Create <em>unit test</em> before bugfix</li>\n<li>Review</li>\n<li>Test your code (Normal process / Abnormal process)</li>\n<li>Record your design on <em>github issue</em></li>\n<li>Complete javadoc and comment in code</li>\n<li>Manager for every version, responsible for scope and check</li>\n</ul>\n",
+  "link": "/en-us/docs/dev/checklist.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/code-smell.json b/en-us/docs/dev/code-smell.json
index db0f64b3..1db05cc8 100644
--- a/en-us/docs/dev/code-smell.json
+++ b/en-us/docs/dev/code-smell.json
@@ -1,4 +1,6 @@
 {
   "filename": "code-smell.md",
-  "__html": "<h1>Bad Smell</h1>\n<p>Ugly Dubbo design or implementation will be record here.</p>\n<h2>URL Convertion</h2>\n<h3>1. Point to Point Service export and refer</h3>\n<p>service directly export:</p>\n<pre><code>EXPORT(dubbo://provider-address/com.xxx.XxxService?version=1.0.0&quot;)\n</code></pre>\n<p>service directly refer:</p>\n<pre><code>REFER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>2. Export servie by registry</h3>\n<p>export service to registry:</p>\n<pre><code>EXPORT(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;export=ENCODE(dubbo://provider-address/com.xxx.XxxService?version=1.0.0))\n</code></pre>\n<p>accquire registry:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>registry service address:</p>\n<pre><code>url.getParameterAndDecoded(&quot;export&quot;))\nREGISTER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>3. Refer service from registry</h3>\n<p>refer service from registry:</p>\n<pre><code>REFER(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;refer=ENCODE(version=1.0.0))\n</code></pre>\n<p>accquire registry:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>subscribe service address:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nSUBSCRIBE(dubbo://registry-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<p>notify service address:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nNOTIFY(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>4. Registry push route rule</h3>\n<p>registry push route rule:</p>\n<pre><code>NOTIFY(route://registry-address/com.xxx.XxxService?router=script&amp;type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<p>accquire routers:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;))\nGETROUTE(script://registry-address/com.xxx.XxxService?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h3>5. Load route rule from file</h3>\n<p>load route rule from file:</p>\n<pre><code>GETROUTE(file://path/file.js?router=script)\n</code></pre>\n<p>accquire routers:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;)).addParameter(&quot;type&quot;, SUFFIX(file)).addParameter(&quot;rule&quot;, READ(file))\nGETROUTE(script://path/file.js?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h2>Invoke parameters</h2>\n<ul>\n<li>path      service path</li>\n<li>group    service group</li>\n<li>version  service version</li>\n<li>dubbo   current dubbo release version</li>\n<li>token    verify token</li>\n<li>timeout   invocation timeout</li>\n</ul>\n<h2>SPI Loading</h2>\n<h3>1. SPI Auto Adaptive</h3>\n<p>When ExtensionLoader loads SPI, It will check spi attributes(using set method) . If one attribute is SPI, ExtensionLoader  will load the SPI implementation. Auto injected object is an adaptive instance(proxy) ,because the real implementation is confirmed only in execution stage.。when adaptive spi is invoked, Dubbo will choose the real implementation and executes it. Dubbo choose the right implementation according to the parameters that the mehod defines.</p>\n<p>All the inner SPIs that  Dubbo defines have the URL  parameter defined for the method invocation. Adaptive SPI uses URL to determine which implementation is needed. One specific Key and Value in the URL confirms the usage of the specific implementation, All these is done by adding <code>@Adaptive</code>  annotation.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Extension</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Car</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/car.type\"</span>, <span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/transport.type\"</span>})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">(URL url, Type1 arg1, Type2 arg2)</span></span>;\n}\n</code></pre>\n<p>For the rules above,ExtensionLoader  will create a adaptive instance for each SPI injected.</p>\n<p>ExtensionLoader generated adaptive classes  look like :</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> &lt;<span class=\"hljs-keyword\">package</span> name <span class=\"hljs-keyword\">for</span> SPI <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span>&gt;</span>;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> &lt;<span class=\"hljs-title\">SPI</span> <span class=\"hljs-title\">interface</span> <span class=\"hljs-title\">name</span>&gt;$<span class=\"hljs-title\">Adpative</span> <span class=\"hljs-keyword\">implements</span> &lt;<span class=\"hljs-title\">SPI</span> <span class=\"hljs-title\">interface</span>&gt; </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;contains <span class=\"hljs-meta\">@Adaptive</span> annotation method&gt;(&lt;parameters&gt;) {\n        <span class=\"hljs-keyword\">if</span>(parameters containing URL Type?) <span class=\"hljs-function\">using URL parameter\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-title\">if</span><span class=\"hljs-params\">(method returns URL)</span> using the return URL\n        # &lt;<span class=\"hljs-keyword\">else</span> throw exception,inject SPI fail!&gt;\n         \n        <span class=\"hljs-title\">if</span><span class=\"hljs-params\">(URL accquired == <span class=\"hljs-keyword\">null</span>)</span> </span>{\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"url == null\"</span>);\n        }\n \n        According to the Key order from <span class=\"hljs-meta\">@Adaptive</span> annotation,get the Value from the URL as the real SPI name\n        <span class=\"hljs-keyword\">if</span> no value is found then use the <span class=\"hljs-keyword\">default</span> SPI implementation。If no SPI point, <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"Fail to get extension\"</span>);\n \n        Invoke the method using the spi and <span class=\"hljs-keyword\">return</span> the result.\n    }\n \n    <span class=\"hljs-keyword\">public</span> &lt;method having annotation <span class=\"hljs-meta\">@Adaptive</span>&gt;(&lt;parameters&gt;) {\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> UnsupportedOperationException(<span class=\"hljs-string\">\"is not adaptive method!\"</span>);\n    }\n}\n</code></pre>\n<p><code>@Adaptive</code>  annotation usage:</p>\n<p>If no value is configed for those Keys in URL,default SPI implementation is used。For example ,String[] {&quot;key1&quot;, &quot;key2&quot;},firstly Dubbo will look up value for key1 and use it as SPI name;if key1 value is not founded then look up for key2,if value of key2 is also not found ,then use default spi implementation. If no default implementation is configed, then the method will throw IllegalStateException。if not configed , then default implement is lower case of the interface class full package name. For Extension interface <code>com.alibaba.dubbo.xxx.YyyInvokerWrapper</code> , default value is <code>new String[] {&quot;yyy.invoker.wrapper&quot;}</code></p>\n<h2>Callback Function</h2>\n<h3>1. Parameter Callback</h3>\n<p>main theory : in the persistent connection for one consumer-&gt;provider,export a service in  Consumer side,provider  side can reversely call the instance in consumer side.</p>\n<p>Implement details:</p>\n<ul>\n<li>For exchanging interface instance in transmition, auto export and auto refer is implemented in DubboCodec . Need to seperate business logic and codec logic.</li>\n<li>you will need to judge whether needing callback when getting exporter from invocation,if needed, get the callback instance id from the attachments. By using this method, consumer side can implement the callback interface with different implementations.</li>\n</ul>\n<h3>2. Event Notification</h3>\n<p>main theory : when Consumer  executing invoke method,judging if any configuration for  onreturn/onerror... put  the method for onreturn to the callback list of the async invocatioin.</p>\n<p>Implement details:parameters is passed using URL,but string-object is not supported for URL, so the method is stored in  staticMap,it needs to be optimized.</p>\n<h2>Lazy Connection</h2>\n<p>DubboProtocol  specific features, default disabled</p>\n<p>When client creating proxy for server, do not establish TCP persistent connection at first, only init the connecton when data is needing transmision.</p>\n<p>This feather will disable the connection retry policy , resend the data again(if connection is lost when sending data ,try to establish a new connection to send data)</p>\n<h2>Share Connection</h2>\n<p>DubboProtocol specific features, default enabled。</p>\n<p>JVM A export many services,JVM B  refer more than one services of A,Share Connection means those different services invocations between A and B uses the same TCP connection  to transmit data, reducing server connections.</p>\n<p>Implement details:when using share connection for the same address,you need pay more attention to the invoker's destroy action.on one hand, you should close the connection when all the invokers refering the same address is destroyed, on another hand ,you should not close the connection when not all of the invokers are destroyed. In design implementation, we uses a strategy called reference count , we create a connection called Lazy connection for exceptions not affacting business when closing the connection just in case.</p>\n<h2>sticky policy</h2>\n<p>when existing many providers and configing the sticky policy,invocation will be sent to the same provider as last invocation. Sticky Policy opens the lazy attribute of connection, for avoiding open useless connectons.</p>\n<h2>provider selecting logic</h2>\n<ol start=\"0\">\n<li>existing multi providers,firstly select by Loadbalance 。If the selected  provider is available ,then just doing the invocation</li>\n<li>If the selected provider is not available in stage 1, then choose from the remaining ,if available then doing the inovation</li>\n<li>If all providers are not available , rescan the list(not choosen invoker first),juding if any provider is available, if existing,doing the invocatiion.</li>\n<li>If no available provider in stage 3, then the next invoker of the invoker of stage 1 will be choosen(if not the last one),avoiding collision.</li>\n</ol>\n"
+  "__html": "<h1>Bad Smell</h1>\n<p>Ugly Dubbo design or implementation will be record here.</p>\n<h2>URL Convertion</h2>\n<h3>1. Point to Point Service export and refer</h3>\n<p>service directly export:</p>\n<pre><code>EXPORT(dubbo://provider-address/com.xxx.XxxService?version=1.0.0&quot;)\n</code></pre>\n<p>service directly refer:</p>\n<pre><code>REFER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>2. Export servie by registry</h3>\n<p>export service to registry:</p>\n<pre><code>EXPORT(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;export=ENCODE(dubbo://provider-address/com.xxx.XxxService?version=1.0.0))\n</code></pre>\n<p>accquire registry:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>registry service address:</p>\n<pre><code>url.getParameterAndDecoded(&quot;export&quot;))\nREGISTER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>3. Refer service from registry</h3>\n<p>refer service from registry:</p>\n<pre><code>REFER(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;refer=ENCODE(version=1.0.0))\n</code></pre>\n<p>accquire registry:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>subscribe service address:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nSUBSCRIBE(dubbo://registry-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<p>notify service address:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nNOTIFY(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>4. Registry push route rule</h3>\n<p>registry push route rule:</p>\n<pre><code>NOTIFY(route://registry-address/com.xxx.XxxService?router=script&amp;type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<p>accquire routers:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;))\nGETROUTE(script://registry-address/com.xxx.XxxService?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h3>5. Load route rule from file</h3>\n<p>load route rule from file:</p>\n<pre><code>GETROUTE(file://path/file.js?router=script)\n</code></pre>\n<p>accquire routers:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;)).addParameter(&quot;type&quot;, SUFFIX(file)).addParameter(&quot;rule&quot;, READ(file))\nGETROUTE(script://path/file.js?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h2>Invoke parameters</h2>\n<ul>\n<li>path      service path</li>\n<li>group    service group</li>\n<li>version  service version</li>\n<li>dubbo   current dubbo release version</li>\n<li>token    verify token</li>\n<li>timeout   invocation timeout</li>\n</ul>\n<h2>SPI Loading</h2>\n<h3>1. SPI Auto Adaptive</h3>\n<p>When ExtensionLoader loads SPI, It will check spi attributes(using set method) . If one attribute is SPI, ExtensionLoader  will load the SPI implementation. Auto injected object is an adaptive instance(proxy) ,because the real implementation is confirmed only in execution stage.。when adaptive spi is invoked, Dubbo will choose the real implementation and executes it. Dubbo choose the right implementation according to the parameters that the mehod defines.</p>\n<p>All the inner SPIs that  Dubbo defines have the URL  parameter defined for the method invocation. Adaptive SPI uses URL to determine which implementation is needed. One specific Key and Value in the URL confirms the usage of the specific implementation, All these is done by adding <code>@Adaptive</code>  annotation.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Extension</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Car</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/car.type\"</span>, <span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/transport.type\"</span>})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">(URL url, Type1 arg1, Type2 arg2)</span></span>;\n}\n</code></pre>\n<p>For the rules above,ExtensionLoader  will create a adaptive instance for each SPI injected.</p>\n<p>ExtensionLoader generated adaptive classes  look like :</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> &lt;<span class=\"hljs-keyword\">package</span> name <span class=\"hljs-keyword\">for</span> SPI <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span>&gt;</span>;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> &lt;<span class=\"hljs-title\">SPI</span> <span class=\"hljs-title\">interface</span> <span class=\"hljs-title\">name</span>&gt;$<span class=\"hljs-title\">Adpative</span> <span class=\"hljs-keyword\">implements</span> &lt;<span class=\"hljs-title\">SPI</span> <span class=\"hljs-title\">interface</span>&gt; </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;contains <span class=\"hljs-meta\">@Adaptive</span> annotation method&gt;(&lt;parameters&gt;) {\n        <span class=\"hljs-keyword\">if</span>(parameters containing URL Type?) <span class=\"hljs-function\">using URL parameter\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-title\">if</span><span class=\"hljs-params\">(method returns URL)</span> using the return URL\n        # &lt;<span class=\"hljs-keyword\">else</span> throw exception,inject SPI fail!&gt;\n         \n        <span class=\"hljs-title\">if</span><span class=\"hljs-params\">(URL accquired == <span class=\"hljs-keyword\">null</span>)</span> </span>{\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"url == null\"</span>);\n        }\n \n        According to the Key order from <span class=\"hljs-meta\">@Adaptive</span> annotation,get the Value from the URL as the real SPI name\n        <span class=\"hljs-keyword\">if</span> no value is found then use the <span class=\"hljs-keyword\">default</span> SPI implementation。If no SPI point, <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"Fail to get extension\"</span>);\n \n        Invoke the method using the spi and <span class=\"hljs-keyword\">return</span> the result.\n    }\n \n    <span class=\"hljs-keyword\">public</span> &lt;method having annotation <span class=\"hljs-meta\">@Adaptive</span>&gt;(&lt;parameters&gt;) {\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> UnsupportedOperationException(<span class=\"hljs-string\">\"is not adaptive method!\"</span>);\n    }\n}\n</code></pre>\n<p><code>@Adaptive</code>  annotation usage:</p>\n<p>If no value is configed for those Keys in URL,default SPI implementation is used。For example ,String[] {&quot;key1&quot;, &quot;key2&quot;},firstly Dubbo will look up value for key1 and use it as SPI name;if key1 value is not founded then look up for key2,if value of key2 is also not found ,then use default spi implementation. If no default implementation is configed, then the method will throw IllegalStateException。if not configed , then default implement is lower case of the interface class full package name. For Extension interface <code>com.alibaba.dubbo.xxx.YyyInvokerWrapper</code> , default value is <code>new String[] {&quot;yyy.invoker.wrapper&quot;}</code></p>\n<h2>Callback Function</h2>\n<h3>1. Parameter Callback</h3>\n<p>main theory : in the persistent connection for one consumer-&gt;provider,export a service in  Consumer side,provider  side can reversely call the instance in consumer side.</p>\n<p>Implement details:</p>\n<ul>\n<li>For exchanging interface instance in transmition, auto export and auto refer is implemented in DubboCodec . Need to seperate business logic and codec logic.</li>\n<li>you will need to judge whether needing callback when getting exporter from invocation,if needed, get the callback instance id from the attachments. By using this method, consumer side can implement the callback interface with different implementations.</li>\n</ul>\n<h3>2. Event Notification</h3>\n<p>main theory : when Consumer  executing invoke method,judging if any configuration for  onreturn/onerror... put  the method for onreturn to the callback list of the async invocatioin.</p>\n<p>Implement details:parameters is passed using URL,but string-object is not supported for URL, so the method is stored in  staticMap,it needs to be optimized.</p>\n<h2>Lazy Connection</h2>\n<p>DubboProtocol  specific features, default disabled</p>\n<p>When client creating proxy for server, do not establish TCP persistent connection at first, only init the connecton when data is needing transmision.</p>\n<p>This feather will disable the connection retry policy , resend the data again(if connection is lost when sending data ,try to establish a new connection to send data)</p>\n<h2>Share Connection</h2>\n<p>DubboProtocol specific features, default enabled。</p>\n<p>JVM A export many services,JVM B  refer more than one services of A,Share Connection means those different services invocations between A and B uses the same TCP connection  to transmit data, reducing server connections.</p>\n<p>Implement details:when using share connection for the same address,you need pay more attention to the invoker's destroy action.on one hand, you should close the connection when all the invokers refering the same address is destroyed, on another hand ,you should not close the connection when not all of the invokers are destroyed. In design implementation, we uses a strategy called reference count , we create a connection called Lazy connection for exceptions not affacting business when closing the connection just in case.</p>\n<h2>sticky policy</h2>\n<p>when existing many providers and configing the sticky policy,invocation will be sent to the same provider as last invocation. Sticky Policy opens the lazy attribute of connection, for avoiding open useless connectons.</p>\n<h2>provider selecting logic</h2>\n<ol start=\"0\">\n<li>existing multi providers,firstly select by Loadbalance 。If the selected  provider is available ,then just doing the invocation</li>\n<li>If the selected provider is not available in stage 1, then choose from the remaining ,if available then doing the inovation</li>\n<li>If all providers are not available , rescan the list(not choosen invoker first),juding if any provider is available, if existing,doing the invocatiion.</li>\n<li>If no available provider in stage 3, then the next invoker of the invoker of stage 1 will be choosen(if not the last one),avoiding collision.</li>\n</ol>\n",
+  "link": "/en-us/docs/dev/code-smell.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/coding.json b/en-us/docs/dev/coding.json
index b33a66ef..81fac353 100644
--- a/en-us/docs/dev/coding.json
+++ b/en-us/docs/dev/coding.json
@@ -1,4 +1,6 @@
 {
   "filename": "coding.md",
-  "__html": "<h1>Coding convention</h1>\n<h2>Code style</h2>\n<p>The source and JavaDoc of Dubbo follow below specifications:</p>\n<ul>\n<li><a href=\"http://www.oracle.com/technetwork/java/codeconvtoc-136057.html\">Code Conventions for the Java Programming Language</a></li>\n<li><a href=\"http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html\">How to Write Doc Comments for the Javadoc Tool</a></li>\n</ul>\n<h2>Exception and Logging</h2>\n<ul>\n<li>Log more context information as possible, such as error reason, error server address, client address, registry center address, dubbo version and so on.</li>\n<li>Try to put the main cause at the front, and display all other context information with key-value paris after it.</li>\n<li>Log is not printed where the exception is thrown, log level is determined by the final exception handler, and must print log when dicarding exception.</li>\n<li><code>ERROR</code> log means NEED TO ALARM, <code>WARN</code> log means COULD AUTO RECOVERY, <code>INFO</code> long mean NORMAL.</li>\n<li>Suggestion: config <code>ERROR</code> log in Monitor center for real-time alarm, summary and send <code>WARN</code> log weekly.</li>\n<li><code>RpcException</code> is the ONLY external exception of Dubbo,all internal exceptions mush be transfered to <code>RpcException</code> if need to throw out to user.</li>\n<li><code>RpcException</code> CAN NOT have sub-class, all types of information are identified with ErrorCode in order to keep compatible.</li>\n</ul>\n<h2>Configuration and URL</h2>\n<ul>\n<li>Use initials and camelCase for multiple words for object properties <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>.</li>\n<li>Use lowercase and split by '-' for multiple words for config properties <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</li>\n<li>Use lowercase and split by '.' for multiple words for URL properties <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>.</li>\n<li>Use URL transfer parameters as possible, Don't define Map or other types, config information also transfer to URL style.</li>\n<li>Minimize URL nesting to keep URL simplicity.</li>\n</ul>\n<h2>Unit testing and integration testing</h2>\n<ul>\n<li>Use JUnit and EasyMock for unit testing, use TestNG for integration testing, use DBUnit for database testing.</li>\n<li>Don't put large integration test case in unit testing for running speed of unit test case.</li>\n<li>Use <code>try...finally</code> or <code>tearDown</code> to release resource for all test cases of unit testing.</li>\n<li>Minimize test case that with <code>while</code> loop which need waiting repsonse, use to make the logic in timer as function for timer and net testing.</li>\n<li>For fail-safe testing, unified use <code>LogUtil</code> assertion log output.</li>\n</ul>\n<h2>Extension point base class and AOP</h2>\n<ul>\n<li>AOP class should be named as <code>XxxWrapper</code>,Base class should be named as <code>AbstractXxx</code>.</li>\n<li>Use AOP for combine relationship between extension points, <code>ExtensionLoader</code> only loads extension points, including AOP extension.</li>\n<li>Try to use Ioc inject dependency of extension points, Don't direct dependent on factory method of <code>ExtensionLoader</code>.</li>\n<li>Try to use AOP implement the common action of extension points, instead of using base class, such as the <code>isAvailable</code> checking before load balancing, which is independent of load balance. Close the URL paramters which no need to check.</li>\n<li>Use base class for abstaction for a variety of similar types, such as RMI, Hessian 3rd protocols which have generated interface proxy, only transfer interface proxy to <code>Invoker</code> to complete bridging, and public base class can do the logic.</li>\n<li>The base class is also part of the SPI, and each extension should have a convenient base class support.</li>\n</ul>\n<h2>Module and packaging</h2>\n<ul>\n<li>Base on reusability for packaging, dividing the interface, base class and large implementation into separate modules.</li>\n<li>Put all interfaces under the base package of module, and put base classes in support subpackage, different implementations are placed under the subpackage named by extension point.</li>\n<li>Try to keep subpackage dependent on parent package, NOT reverse.</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Java convention <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Spring convention <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Dubbo convention <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Coding convention</h1>\n<h2>Code style</h2>\n<p>The source and JavaDoc of Dubbo follow below specifications:</p>\n<ul>\n<li><a href=\"http://www.oracle.com/technetwork/java/codeconvtoc-136057.html\">Code Conventions for the Java Programming Language</a></li>\n<li><a href=\"http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html\">How to Write Doc Comments for the Javadoc Tool</a></li>\n</ul>\n<h2>Exception and Logging</h2>\n<ul>\n<li>Log more context information as possible, such as error reason, error server address, client address, registry center address, dubbo version and so on.</li>\n<li>Try to put the main cause at the front, and display all other context information with key-value paris after it.</li>\n<li>Log is not printed where the exception is thrown, log level is determined by the final exception handler, and must print log when dicarding exception.</li>\n<li><code>ERROR</code> log means NEED TO ALARM, <code>WARN</code> log means COULD AUTO RECOVERY, <code>INFO</code> long mean NORMAL.</li>\n<li>Suggestion: config <code>ERROR</code> log in Monitor center for real-time alarm, summary and send <code>WARN</code> log weekly.</li>\n<li><code>RpcException</code> is the ONLY external exception of Dubbo,all internal exceptions mush be transfered to <code>RpcException</code> if need to throw out to user.</li>\n<li><code>RpcException</code> CAN NOT have sub-class, all types of information are identified with ErrorCode in order to keep compatible.</li>\n</ul>\n<h2>Configuration and URL</h2>\n<ul>\n<li>Use initials and camelCase for multiple words for object properties <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>.</li>\n<li>Use lowercase and split by '-' for multiple words for config properties <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</li>\n<li>Use lowercase and split by '.' for multiple words for URL properties <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>.</li>\n<li>Use URL transfer parameters as possible, Don't define Map or other types, config information also transfer to URL style.</li>\n<li>Minimize URL nesting to keep URL simplicity.</li>\n</ul>\n<h2>Unit testing and integration testing</h2>\n<ul>\n<li>Use JUnit and EasyMock for unit testing, use TestNG for integration testing, use DBUnit for database testing.</li>\n<li>Don't put large integration test case in unit testing for running speed of unit test case.</li>\n<li>Use <code>try...finally</code> or <code>tearDown</code> to release resource for all test cases of unit testing.</li>\n<li>Minimize test case that with <code>while</code> loop which need waiting repsonse, use to make the logic in timer as function for timer and net testing.</li>\n<li>For fail-safe testing, unified use <code>LogUtil</code> assertion log output.</li>\n</ul>\n<h2>Extension point base class and AOP</h2>\n<ul>\n<li>AOP class should be named as <code>XxxWrapper</code>,Base class should be named as <code>AbstractXxx</code>.</li>\n<li>Use AOP for combine relationship between extension points, <code>ExtensionLoader</code> only loads extension points, including AOP extension.</li>\n<li>Try to use Ioc inject dependency of extension points, Don't direct dependent on factory method of <code>ExtensionLoader</code>.</li>\n<li>Try to use AOP implement the common action of extension points, instead of using base class, such as the <code>isAvailable</code> checking before load balancing, which is independent of load balance. Close the URL paramters which no need to check.</li>\n<li>Use base class for abstaction for a variety of similar types, such as RMI, Hessian 3rd protocols which have generated interface proxy, only transfer interface proxy to <code>Invoker</code> to complete bridging, and public base class can do the logic.</li>\n<li>The base class is also part of the SPI, and each extension should have a convenient base class support.</li>\n</ul>\n<h2>Module and packaging</h2>\n<ul>\n<li>Base on reusability for packaging, dividing the interface, base class and large implementation into separate modules.</li>\n<li>Put all interfaces under the base package of module, and put base classes in support subpackage, different implementations are placed under the subpackage named by extension point.</li>\n<li>Try to keep subpackage dependent on parent package, NOT reverse.</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Java convention <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Spring convention <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Dubbo convention <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/dev/coding.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/contract.json b/en-us/docs/dev/contract.json
index e3bd1659..805a1464 100644
--- a/en-us/docs/dev/contract.json
+++ b/en-us/docs/dev/contract.json
@@ -1,4 +1,6 @@
 {
   "filename": "contract.md",
-  "__html": "<h1>Public Agreement</h1>\n<p>This document is Dubbo public agreement, we expect all extension points comply with it.</p>\n<h2>URL</h2>\n<ul>\n<li>All extension points must include URL parameter, design URL as a context information which throughouts the whole extension point design system.</li>\n<li>URL standard style: <code>protocol://username:password@host:port/path?key=value&amp;key=value</code></li>\n</ul>\n<h2>Logging</h2>\n<ul>\n<li>Print <code>ERROR</code> log for unrecoverable and NEED TO ALARM situation.</li>\n<li>Print <code>WARN</code> log for recoverable exception or transient state inconsistency.</li>\n<li>Print <code>INFO</code> log for normally status.</li>\n</ul>\n"
+  "__html": "<h1>Public Agreement</h1>\n<p>This document is Dubbo public agreement, we expect all extension points comply with it.</p>\n<h2>URL</h2>\n<ul>\n<li>All extension points must include URL parameter, design URL as a context information which throughouts the whole extension point design system.</li>\n<li>URL standard style: <code>protocol://username:password@host:port/path?key=value&amp;key=value</code></li>\n</ul>\n<h2>Logging</h2>\n<ul>\n<li>Print <code>ERROR</code> log for unrecoverable and NEED TO ALARM situation.</li>\n<li>Print <code>WARN</code> log for recoverable exception or transient state inconsistency.</li>\n<li>Print <code>INFO</code> log for normally status.</li>\n</ul>\n",
+  "link": "/en-us/docs/dev/contract.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/contribution.json b/en-us/docs/dev/contribution.json
index b05b7b0a..07e822f2 100644
--- a/en-us/docs/dev/contribution.json
+++ b/en-us/docs/dev/contribution.json
@@ -1,4 +1,6 @@
 {
   "filename": "contribution.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>Contribution</h1>\n<h2>Flow</h2>\n<ul>\n<li>Direct adding new project, black-box dependent on Dubbo for function extension.</li>\n<li>Fork Dubbo on Github for BUG fixing or modify the framework.</li>\n<li>Pull Request after changing.</li>\n</ul>\n<h2>Tasks</h2>\n<table>\n<thead>\n<tr>\n<th>Funcation</th>\n<th>Type</th>\n<th>Priority</th>\n<th>Status</th>\n<th>Claimer</th>\n<th>Plan complete time</th>\n<th>progress</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><Use Guideline> Translation</td>\n<td>Document</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td><Developing Guideline> translation</td>\n<td>Document</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Extension point compatibility testing</td>\n<td>Testing</td>\n<td>High</td>\n<td>Claimed</td>\n<td>罗立树</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Performance benchmark testing</td>\n<td>Testing</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Functional unit testing</td>\n<td>Testing</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JTA/XA distributed transaction</td>\n<td>Interceptor extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Thrift</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Developing done</td>\n<td>闾刚</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>ICE</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>ACE</td>\n<td>Protocol extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSON-RPC</td>\n<td>Protocol extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XML-RPC</td>\n<td>Protocol extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR181&amp;CXF(WebService)</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Developing done</td>\n<td>白文志</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>JSR311&amp;JSR339(RestfulWebService)</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMS&amp;ActiveMQ</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Protobuf</td>\n<td>Serialization extension</td>\n<td>High</td>\n<td>Researching</td>\n<td>朱启恒</td>\n<td>2012-02-30</td>\n<td>20%</td>\n</tr>\n<tr>\n<td>Avro</td>\n<td>Serialization extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XSocket</td>\n<td>Transmission extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>CGLib</td>\n<td>Dynamic proxy extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JNDI</td>\n<td>Registry extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>LDAP</td>\n<td>Registry extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR140&amp;SLP</td>\n<td>Registry extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>UDDI</td>\n<td>Registry extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMX</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SNMP</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Cacti</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Nagios</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Logstash</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JRobin</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Maven</td>\n<td>Package management</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Subversion</td>\n<td>Package management</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JCR/JSR283</td>\n<td>Package management</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleDeployer</td>\n<td>Local deployment agent</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleScheduler</td>\n<td>Scheduler</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>Contribution</h1>\n<h2>Flow</h2>\n<ul>\n<li>Direct adding new project, black-box dependent on Dubbo for function extension.</li>\n<li>Fork Dubbo on Github for BUG fixing or modify the framework.</li>\n<li>Pull Request after changing.</li>\n</ul>\n<h2>Tasks</h2>\n<table>\n<thead>\n<tr>\n<th>Funcation</th>\n<th>Type</th>\n<th>Priority</th>\n<th>Status</th>\n<th>Claimer</th>\n<th>Plan complete time</th>\n<th>progress</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><Use Guideline> Translation</td>\n<td>Document</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td><Developing Guideline> translation</td>\n<td>Document</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Extension point compatibility testing</td>\n<td>Testing</td>\n<td>High</td>\n<td>Claimed</td>\n<td>罗立树</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Performance benchmark testing</td>\n<td>Testing</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Functional unit testing</td>\n<td>Testing</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JTA/XA distributed transaction</td>\n<td>Interceptor extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Thrift</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Developing done</td>\n<td>闾刚</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>ICE</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>ACE</td>\n<td>Protocol extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSON-RPC</td>\n<td>Protocol extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XML-RPC</td>\n<td>Protocol extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR181&amp;CXF(WebService)</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Developing done</td>\n<td>白文志</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>JSR311&amp;JSR339(RestfulWebService)</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMS&amp;ActiveMQ</td>\n<td>Protocol extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Protobuf</td>\n<td>Serialization extension</td>\n<td>High</td>\n<td>Researching</td>\n<td>朱启恒</td>\n<td>2012-02-30</td>\n<td>20%</td>\n</tr>\n<tr>\n<td>Avro</td>\n<td>Serialization extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XSocket</td>\n<td>Transmission extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>CGLib</td>\n<td>Dynamic proxy extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JNDI</td>\n<td>Registry extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>LDAP</td>\n<td>Registry extension</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR140&amp;SLP</td>\n<td>Registry extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>UDDI</td>\n<td>Registry extension</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMX</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SNMP</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Cacti</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Nagios</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Logstash</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JRobin</td>\n<td>Monitoring expansion</td>\n<td>High</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Maven</td>\n<td>Package management</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Subversion</td>\n<td>Package management</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JCR/JSR283</td>\n<td>Package management</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleDeployer</td>\n<td>Local deployment agent</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleScheduler</td>\n<td>Scheduler</td>\n<td>Low</td>\n<td>Unclaimed</td>\n<td>Pending</td>\n<td>Pending</td>\n<td>0%</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/dev/contribution.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/design.json b/en-us/docs/dev/design.json
index c2003d3c..22c26272 100644
--- a/en-us/docs/dev/design.json
+++ b/en-us/docs/dev/design.json
@@ -1,4 +1,6 @@
 {
   "filename": "design.md",
-  "__html": "<h1>Framework Design</h1>\n<h2>Overall design</h2>\n<p><img src=\"sources/images/dubbo-framework.jpg\" alt=\"/dev-guide/images/dubbo-framework.jpg\"></p>\n<p>Image description:</p>\n<ul>\n<li>Left area with light blue background shows service consumer interfaces, Right area with light green background shows service provider interfaces, center area shows both side interfaces.</li>\n<li>The image is divided into 10 layers from the bottom to the top, and the layers are one-way dependence. The black arrow on the right represents the dependency between layers, and each layer can be stripped from the upper layer to be reused, the Service and Config layers are API, and the other layers are SPI.</li>\n<li>Green boxes are extension interfaces, blue boxes are implementation classes, image only shows implementation class of associated layers.</li>\n<li>The blue dashed line is the initialization process, which is assembly chain when starting, red line for the method call process, which is calling chain when running, purple triangle arrow is inherited, can treat subclass as the same node of parent class, text of lines are the method invocation.</li>\n</ul>\n<h2>Layer description</h2>\n<ul>\n<li><strong>config layer</strong>: external config interface, <code>ServiceConfig</code> and <code>ReferenceConfig</code> is the center of the layer, you can directly initialize config class, also can generate config class by spring.</li>\n<li><strong>proxy layer</strong>: transparent proxy of service interface, generate client Stub of service and server Skeletion of service, <code>ServiceProxy</code> is the center, extension interface is <code>ProxyFactory</code>.</li>\n<li><strong>registry layer</strong>: encapsulation of service registry and discovery, service URL is the center, extension interfaces are <code>RegistryFactory</code>, <code>Registry</code> and <code>RegistryService</code>.</li>\n<li><strong>cluster layer</strong>: encapsulation of cluster of muliple providers and load balance, and bridging registration center, <code>Invoker</code> is the center, extension interfaces are <code>Cluster</code>, <code>Directory</code>, <code>Router</code>, <code>LoadBalance</code>.</li>\n<li><strong>monitor layer</strong>: monitor of RPC call times and call execute time, <code>Statistics</code> is the center, extension interface are <code>MonitorFactory</code>, <code>Monitor</code>, <code>MonitorService</code></li>\n<li><strong>protocol layer</strong>: encapsulation of RPC, <code>Invocation</code> and <code>Result</code> are the center, extension interfaces are <code>Protocol</code>, <code>Invoker</code>, <code>Exporter</code></li>\n<li><strong>exchange layer</strong>: encapsulation of request and response, synchronous transfer asynchronous, <code>Request</code> and <code>Response</code> are the center, extension interfaces are <code>Exchanger</code>, <code>ExchangeChannel</code>, <code>ExchangeClient</code>, <code>ExchangeServer</code></li>\n<li><strong>transport layer</strong>: abstraction of mina and netty, <code>Message</code> is the center, extension interfaces are <code>Channel</code>, <code>Transporter</code>, <code>Client</code>, <code>Server</code>, <code>Codec</code></li>\n<li><strong>serialize layer</strong>: reusable tools, extension interfaces are <code>Serialization</code>, <code>ObjectInput</code>, <code>ObjectOutput</code>, <code>ThreadPool</code></li>\n</ul>\n<h2>Relationship description</h2>\n<ul>\n<li>In RPC, Protocol is the core layer, it means that you can complete RPC calling by Protocol + Invoker + Exporter, then filter at the main process of Invoker.</li>\n<li>Consumer and Provider are abstraction concepts, just want you have a more intuitive understanding of which classes belong to the client and server side, the reason not use Client and Server is that Dubbo uses Provider, Consumer, Registry, Monitor divide logical topology node in many scenes, keep the concept of unity.</li>\n<li>Cluster is external concept, the purpose of Cluster is that make various Invoker disguise to one Invoker, so that we just pay attention to the Invoker in Protocol layer, adding Cluster or removing Cluster will not affect other layers, because we don't need Cluster when only have one provider.</li>\n<li>The Proxy layer encapsulates the transparent proxy for all interfaces, and in other layers with Invoker as the center, turn Invoker into interface, or turn interface implementation into Invoker by Proxy only when exposuring to user. RPC still work even removing Proxy layer, but not so transparent, making remote service calling don't look like local service calling.</li>\n<li>Remoting is the implemetation of Dubbo protocols, you can remove Remoting if choosing RMI. The Remoting is divided into Transport layer and Exchange layer, Transport layer is responsible for one-way message transmission, it's abstraction of Mina, Netty, Grizzly, it also can extend UDP transmission. The Exchange layer encapsulates the Request-Response semantics over the transport layer.</li>\n<li>Actually Registry and Monitor are not at the same layer, they are independent nodes, draw them together by layer just for global view.</li>\n</ul>\n<h2>Modules packaging</h2>\n<p><img src=\"sources/images/dubbo-modules.jpg\" alt=\"/dev-guide/images/dubbo-modules.jpg\"></p>\n<p>Modules description:</p>\n<ul>\n<li><strong>dubbo-common module</strong>: includes Util classes and common modules.</li>\n<li><strong>dubbo-remoting module</strong>: is Dubbo protocol implementation, no need to use this module if using RMI for RPC.</li>\n<li><strong>dubbo-rpc module</strong>: abstraction of various protocols, and dynamic proxy, only one to one call, not concerned with the management of cluster.</li>\n<li><strong>dubbo-cluster module</strong>: disguise many service providers as one provider, including load balancing, fault tolerance, routing, etc. the address list of clusters can be either static or send by registry.</li>\n<li><strong>dubbo-registry module</strong>: Based on the cluster of registry send address and the abstraction of various registry centers.</li>\n<li><strong>dubbo-monitor module</strong>: statistics of service call times, call time, call chain tracked services.</li>\n<li><strong>dubbo-config module</strong>: is Dubbo external API, users use Dubbo by Config, hide Dubbo details.</li>\n<li><strong>dubbo-container module</strong>: is a Standlone container, just use Main method to load Spring, because usually service no need Tomcat/JBoss features.</li>\n</ul>\n<p>Package dividing according to the layer structure, and the difference with layer dividing:</p>\n<ul>\n<li>container is service container, for service running deployment, not showed in the image.</li>\n<li>protocol layer and proxy layer are placed in RPC module, they are the core of RPC module, you can use these 2 layers complete RPC call when only have 1 provider.</li>\n<li>transport layer and exchange layer are placed in remoting module, for RPC call base comminucation.</li>\n<li>serialize layer is placed in common module, for reuse.</li>\n</ul>\n<h2>Dependence relationship</h2>\n<p><img src=\"sources/images/dubbo-relation.jpg\" alt=\"/dev-guide/images/dubbo-relation.jpg\"></p>\n<p>Image description:</p>\n<ul>\n<li>The boxes in image, Protocol, Cluster, Proxy, Service, Container, Registry, Monitor represent layer or module, the blues mean interactive with business, the greens mean only internal interactive with Dubbo.</li>\n<li>The backgroud boxes in image, Consumer, Provider, Registry, Monitor represent deployment logical topology node.</li>\n<li>The blue dashed line in the image is called for initialization, the red dashed line is called asynchronously for runtime, and the red line is called synchronously for runtime.</li>\n<li>The image only includes RPC layer, don't includes Remoting layer, the whole Remoting hides in Protocol layer.</li>\n</ul>\n<h2>Call chain</h2>\n<p>Expand the red call chain of the overall design map:</p>\n<p><img src=\"sources/images/dubbo-extension.jpg\" alt=\"/dev-guide/images/dubbo-extension.jpg\"></p>\n<h2>Expose service sequence</h2>\n<p>Expand the initialization chain of service provider exposes service which at the left of the overall design map, the sequence diagram shows below:</p>\n<p><img src=\"sources/images/dubbo-export.jpg\" alt=\"/dev-guide/images/dubbo-export.jpg\"></p>\n<h2>Reference service sequence</h2>\n<p>Expand the initialization chain of service consumer references service which at the right of the overall design map, the sequence diagram shows below:</p>\n<p><img src=\"sources/images/dubbo-refer.jpg\" alt=\"/dev-guide/images/dubbo-refer.jpg\"></p>\n<h2>Domain model</h2>\n<p>The core domain models of Dubbo:</p>\n<ul>\n<li>Protocol is service domain, it is the main function entrance of Invoker exposure and reference, it is responsible for the life cycle management of Invoker.</li>\n<li>Invoker is entity domain, it is the core model of Dubbo, all the other models are disturbed, or converted to it, it represents an executable, you can call it by calling invoke, it can be a local implementation, a remote implementation, or a cluster implementation.</li>\n<li>Invocation is session domain, it holds variables in the calling process, such as the method name, the parameters, and so on.</li>\n</ul>\n<h2>Base design principle</h2>\n<ul>\n<li>Use Microkernel + Plugin design pattern,Microkernel only responsible for assembly Plugin, the functions of Dubbo are implemented by extension points, it means that all functions of Dubbo can be replaced by self defined extension by user.</li>\n<li>Use URL to be the startdard format of config information, all extension points transfer config information by URL.</li>\n</ul>\n<p>More design principles refer to: <a href=\"./principals/introduction.md\">Framework design principle</a></p>\n"
+  "__html": "<h1>Framework Design</h1>\n<h2>Overall design</h2>\n<p><img src=\"sources/images/dubbo-framework.jpg\" alt=\"/dev-guide/images/dubbo-framework.jpg\"></p>\n<p>Image description:</p>\n<ul>\n<li>Left area with light blue background shows service consumer interfaces, Right area with light green background shows service provider interfaces, center area shows both side interfaces.</li>\n<li>The image is divided into 10 layers from the bottom to the top, and the layers are one-way dependence. The black arrow on the right represents the dependency between layers, and each layer can be stripped from the upper layer to be reused, the Service and Config layers are API, and the other layers are SPI.</li>\n<li>Green boxes are extension interfaces, blue boxes are implementation classes, image only shows implementation class of associated layers.</li>\n<li>The blue dashed line is the initialization process, which is assembly chain when starting, red line for the method call process, which is calling chain when running, purple triangle arrow is inherited, can treat subclass as the same node of parent class, text of lines are the method invocation.</li>\n</ul>\n<h2>Layer description</h2>\n<ul>\n<li><strong>config layer</strong>: external config interface, <code>ServiceConfig</code> and <code>ReferenceConfig</code> is the center of the layer, you can directly initialize config class, also can generate config class by spring.</li>\n<li><strong>proxy layer</strong>: transparent proxy of service interface, generate client Stub of service and server Skeletion of service, <code>ServiceProxy</code> is the center, extension interface is <code>ProxyFactory</code>.</li>\n<li><strong>registry layer</strong>: encapsulation of service registry and discovery, service URL is the center, extension interfaces are <code>RegistryFactory</code>, <code>Registry</code> and <code>RegistryService</code>.</li>\n<li><strong>cluster layer</strong>: encapsulation of cluster of muliple providers and load balance, and bridging registration center, <code>Invoker</code> is the center, extension interfaces are <code>Cluster</code>, <code>Directory</code>, <code>Router</code>, <code>LoadBalance</code>.</li>\n<li><strong>monitor layer</strong>: monitor of RPC call times and call execute time, <code>Statistics</code> is the center, extension interface are <code>MonitorFactory</code>, <code>Monitor</code>, <code>MonitorService</code></li>\n<li><strong>protocol layer</strong>: encapsulation of RPC, <code>Invocation</code> and <code>Result</code> are the center, extension interfaces are <code>Protocol</code>, <code>Invoker</code>, <code>Exporter</code></li>\n<li><strong>exchange layer</strong>: encapsulation of request and response, synchronous transfer asynchronous, <code>Request</code> and <code>Response</code> are the center, extension interfaces are <code>Exchanger</code>, <code>ExchangeChannel</code>, <code>ExchangeClient</code>, <code>ExchangeServer</code></li>\n<li><strong>transport layer</strong>: abstraction of mina and netty, <code>Message</code> is the center, extension interfaces are <code>Channel</code>, <code>Transporter</code>, <code>Client</code>, <code>Server</code>, <code>Codec</code></li>\n<li><strong>serialize layer</strong>: reusable tools, extension interfaces are <code>Serialization</code>, <code>ObjectInput</code>, <code>ObjectOutput</code>, <code>ThreadPool</code></li>\n</ul>\n<h2>Relationship description</h2>\n<ul>\n<li>In RPC, Protocol is the core layer, it means that you can complete RPC calling by Protocol + Invoker + Exporter, then filter at the main process of Invoker.</li>\n<li>Consumer and Provider are abstraction concepts, just want you have a more intuitive understanding of which classes belong to the client and server side, the reason not use Client and Server is that Dubbo uses Provider, Consumer, Registry, Monitor divide logical topology node in many scenes, keep the concept of unity.</li>\n<li>Cluster is external concept, the purpose of Cluster is that make various Invoker disguise to one Invoker, so that we just pay attention to the Invoker in Protocol layer, adding Cluster or removing Cluster will not affect other layers, because we don't need Cluster when only have one provider.</li>\n<li>The Proxy layer encapsulates the transparent proxy for all interfaces, and in other layers with Invoker as the center, turn Invoker into interface, or turn interface implementation into Invoker by Proxy only when exposuring to user. RPC still work even removing Proxy layer, but not so transparent, making remote service calling don't look like local service calling.</li>\n<li>Remoting is the implemetation of Dubbo protocols, you can remove Remoting if choosing RMI. The Remoting is divided into Transport layer and Exchange layer, Transport layer is responsible for one-way message transmission, it's abstraction of Mina, Netty, Grizzly, it also can extend UDP transmission. The Exchange layer encapsulates the Request-Response semantics over the transport layer.</li>\n<li>Actually Registry and Monitor are not at the same layer, they are independent nodes, draw them together by layer just for global view.</li>\n</ul>\n<h2>Modules packaging</h2>\n<p><img src=\"sources/images/dubbo-modules.jpg\" alt=\"/dev-guide/images/dubbo-modules.jpg\"></p>\n<p>Modules description:</p>\n<ul>\n<li><strong>dubbo-common module</strong>: includes Util classes and common modules.</li>\n<li><strong>dubbo-remoting module</strong>: is Dubbo protocol implementation, no need to use this module if using RMI for RPC.</li>\n<li><strong>dubbo-rpc module</strong>: abstraction of various protocols, and dynamic proxy, only one to one call, not concerned with the management of cluster.</li>\n<li><strong>dubbo-cluster module</strong>: disguise many service providers as one provider, including load balancing, fault tolerance, routing, etc. the address list of clusters can be either static or send by registry.</li>\n<li><strong>dubbo-registry module</strong>: Based on the cluster of registry send address and the abstraction of various registry centers.</li>\n<li><strong>dubbo-monitor module</strong>: statistics of service call times, call time, call chain tracked services.</li>\n<li><strong>dubbo-config module</strong>: is Dubbo external API, users use Dubbo by Config, hide Dubbo details.</li>\n<li><strong>dubbo-container module</strong>: is a Standlone container, just use Main method to load Spring, because usually service no need Tomcat/JBoss features.</li>\n</ul>\n<p>Package dividing according to the layer structure, and the difference with layer dividing:</p>\n<ul>\n<li>container is service container, for service running deployment, not showed in the image.</li>\n<li>protocol layer and proxy layer are placed in RPC module, they are the core of RPC module, you can use these 2 layers complete RPC call when only have 1 provider.</li>\n<li>transport layer and exchange layer are placed in remoting module, for RPC call base comminucation.</li>\n<li>serialize layer is placed in common module, for reuse.</li>\n</ul>\n<h2>Dependence relationship</h2>\n<p><img src=\"sources/images/dubbo-relation.jpg\" alt=\"/dev-guide/images/dubbo-relation.jpg\"></p>\n<p>Image description:</p>\n<ul>\n<li>The boxes in image, Protocol, Cluster, Proxy, Service, Container, Registry, Monitor represent layer or module, the blues mean interactive with business, the greens mean only internal interactive with Dubbo.</li>\n<li>The backgroud boxes in image, Consumer, Provider, Registry, Monitor represent deployment logical topology node.</li>\n<li>The blue dashed line in the image is called for initialization, the red dashed line is called asynchronously for runtime, and the red line is called synchronously for runtime.</li>\n<li>The image only includes RPC layer, don't includes Remoting layer, the whole Remoting hides in Protocol layer.</li>\n</ul>\n<h2>Call chain</h2>\n<p>Expand the red call chain of the overall design map:</p>\n<p><img src=\"sources/images/dubbo-extension.jpg\" alt=\"/dev-guide/images/dubbo-extension.jpg\"></p>\n<h2>Expose service sequence</h2>\n<p>Expand the initialization chain of service provider exposes service which at the left of the overall design map, the sequence diagram shows below:</p>\n<p><img src=\"sources/images/dubbo-export.jpg\" alt=\"/dev-guide/images/dubbo-export.jpg\"></p>\n<h2>Reference service sequence</h2>\n<p>Expand the initialization chain of service consumer references service which at the right of the overall design map, the sequence diagram shows below:</p>\n<p><img src=\"sources/images/dubbo-refer.jpg\" alt=\"/dev-guide/images/dubbo-refer.jpg\"></p>\n<h2>Domain model</h2>\n<p>The core domain models of Dubbo:</p>\n<ul>\n<li>Protocol is service domain, it is the main function entrance of Invoker exposure and reference, it is responsible for the life cycle management of Invoker.</li>\n<li>Invoker is entity domain, it is the core model of Dubbo, all the other models are disturbed, or converted to it, it represents an executable, you can call it by calling invoke, it can be a local implementation, a remote implementation, or a cluster implementation.</li>\n<li>Invocation is session domain, it holds variables in the calling process, such as the method name, the parameters, and so on.</li>\n</ul>\n<h2>Base design principle</h2>\n<ul>\n<li>Use Microkernel + Plugin design pattern,Microkernel only responsible for assembly Plugin, the functions of Dubbo are implemented by extension points, it means that all functions of Dubbo can be replaced by self defined extension by user.</li>\n<li>Use URL to be the startdard format of config information, all extension points transfer config information by URL.</li>\n</ul>\n<p>More design principles refer to: <a href=\"./principals/introduction.md\">Framework design principle</a></p>\n",
+  "link": "/en-us/docs/dev/design.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/implementation.json b/en-us/docs/dev/implementation.json
index 226c906e..0cdee0c1 100644
--- a/en-us/docs/dev/implementation.json
+++ b/en-us/docs/dev/implementation.json
@@ -1,4 +1,6 @@
 {
   "filename": "implementation.md",
-  "__html": "<h1>Implementation details</h1>\n<h2>Initialization details</h2>\n<h3>Service parsing</h3>\n<p>Based on <code>META-INF/spring.handlers</code> config in dubbo.jar, Spring calls <code>DubboNamespaceHandler</code> when meeting dubbo namespace.</p>\n<p>All Dubbo tags are parsed by <code>DubboBeanDefinitionParser</code>, based on one to one attribute mapping, the XML label is parsed as a Bean object.</p>\n<p>Transfer Bean object to URL, and transfer all attributes of Bean to URL parameters when <code>ServiceConfig.export()</code> or <code>ReferenceConfig.get()</code> initialization.</p>\n<p>Then pase URL to <a href=\"./impls/protocol.md\">Protocol extension point</a>, based on <a href=\"./SPI.md\">Extension point adaptive mechanism</a> of extension point, processing service exposure or reference for different protocols according to URL protocol header.</p>\n<h3>Service Exposure</h3>\n<h4>1. Only expose service port:</h4>\n<p>Direct exposing to provider when have not Registry, <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, the URL format which parsing by <code>ServiceConfig</code>:\n<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>.</p>\n<p>Based on extension point adaptive mechanism, call <code>export()</code> method of <code>DubboProtocol</code> and open server port by identifying <code>dubbo://</code> protocol header of URL.</p>\n<h4>2. Expose to Registry:</h4>\n<p>Expose provider address to Registry <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>, the URL format which parsing by <code>ServiceConfig</code>: <code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot;)</code>,</p>\n<p>Based on extension point adaptive mechanism, call <code>export()</code> method of <code>RegistryProtocol</code> by identifying  <code>registry://</code> protocol header, register the provider URL parameter of <code>export</code> to Registry.</p>\n<p>Resend to <code>Protocol</code> extension point to do exposure: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>, then based on extension point adaptive mechanism, call <code>export()</code> method of <code>DubboProtocol</code> and open server port by identifying <code>dubbo://</code> protocol header of provider URL.</p>\n<h3>Service Reference</h3>\n<h4>1. Direct connect service</h4>\n<p>Direct connect provider when have not Registry <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>, the URL format which parsing by <code>ReferenceConfig</code>: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>.</p>\n<p>Based on extension point adaptive mechanism, call <code>refer()</code> method of <code>DubboProtocol</code> by identifying <code>dubbo://</code> protocol header of URL, and return provider reference.</p>\n<h4>2. Service Registry discovery</h4>\n<p>Discover provider address by Registry <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>, the URL format which parsing by <code>ReferenceConfig</code>:\n<code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(&quot;consumer://consumer-host/com.foo.FooService?version=1.0.0&quot;)</code>.</p>\n<p>Based on extension point adaptive mechanism, call <code>refer()</code> method of <code>RegistryProtocol</code> by identifying <code>registry://</code> protocol header of URL, then based on the condition of parameter of <code>refer</code> to search provider URL, for example: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>.</p>\n<p>Then based on extension point adaptive mechanism, call <code>refer()</code> method of <code>DubboProtocol</code> to get provider reference by identifying <code>dubbo://</code> protocol header of provider URL.</p>\n<p>Then <code>RegistryProtocol</code> disguise various provider references to single provider by <code>Cluster</code> extension point and return.</p>\n<h3>Service Filter</h3>\n<p>Based on extension point adaptive mechanism, all <code>Protocol</code> extension points are auto wrapped <code>Wrapper</code> class.</p>\n<p>Based on <code>ProtocolFilterWrapper</code> class, make all <code>Filter</code> as chain, call the real reference at the end of the chain.</p>\n<p>Based on <code>ProtocolListenerWrapper</code> class, make all <code>InvokerListener</code> and <code>ExporterListener</code> as list, perform call back before and after exposure and reference.</p>\n<p>All additional functions would be implementated by <code>Filter</code>, including Monitor.</p>\n<h2>RPC details</h2>\n<h3>The detail process of exposing service by service provider</h3>\n<p><img src=\"sources/images/dubbo_rpc_export.jpg\" alt=\"/dev-guide/images/dubbo_rpc_export.jpg\"></p>\n<p>The above image shows the main process of exposing service by service provider:</p>\n<p>First <code>ServiceConfig</code> class get the actual class <code>ref</code> that provides service(e.g. 如:HelloWorldImpl), then generating a <code>AbstractProxyInvoker</code> instance by the <code>getInvoker</code> method of <code>ProxyFactory</code> class, to this step, complete the transformation of specific service to <code>Invoker</code>, next is the process of converting <code>Invoker</code> to <code>Exporter</code>.</p>\n<p>The key of Dubbo processing service exposure is the process of converting <code>Invoker</code> to <code>Exporter</code>, the red part in the above image. Here we introduce the implementation of the two typical protocols, Dubbo and RMI:</p>\n<h4>Dubbo implementation</h4>\n<p>The transformation from <code>Invoker</code> of Dubbo protocol to <code>Exporter</code> takes place in the <code>export</code> method of <code>DubboProtocol</code> class, it mainly opens the socket to listen service and receive all kinds of requests sent by the client, and the communication details are implementated by Dubbo itself.</p>\n<h4>RMI implementation</h4>\n<p>The transformation from <code>Invoker</code> of RMI protocol to <code>Exporter</code> takes place in the <code>export</code> method of <code>RmiProtocol</code> class, the RMI service is implementated by Spring, Dubbo or JDK, and the communication details are implementated by JDK, which saves a lot of work.</p>\n<h3>The detail process of serving service for service consumer</h3>\n<p><img src=\"sources/images/dubbo_rpc_refer.jpg\" alt=\"/dev-guide/images/dubbo_rpc_refer.jpg\"></p>\n<p>The above image is the main process of service consumption:</p>\n<p>First, the <code>init</code> method of <code>ReferenceConfig</code> class calls the <code>refer</code> method of <code>Protocol</code> to generate <code>Invoker</code> instance(such as the red part in the above image), which is the key of service consumption. Then the <code>Invoker</code> is converted to the interface required by the client (such as: HelloWorld).</p>\n<p>For each protocol such as RMI/Dubbo/Web service, the details they call <code>refer</code> method generate <code>Invoker</code> instance are similar to the previous section.</p>\n<h3>Invoker everywhere</h3>\n<p>Because of <code>Invoker</code> is a very important concept in the Dubbo domain model, many of the design ideas are close to it. This makes <code>Invoker</code> permeate the entire implementation code, and it's really easy to mix up for people who have just started Dubbo.</p>\n<p>Let's use a simple image below to describe the 2 important <code>Invoker</code>: service provider <code>Invoker</code> and service consumer <code>Invoker</code>:</p>\n<p><img src=\"sources/images/dubbo_rpc_invoke.jpg\" alt=\"/dev-guide/images/dubbo_rpc_invoke.jpg\"></p>\n<p>To better explain the above image, we provide the below code examples of service consumption and providers:</p>\n<p>Service consumer code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoClientAction</span> </span>{\n \n    <span class=\"hljs-keyword\">private</span> DemoService demoService;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setDemoService</span><span class=\"hljs-params\">(DemoService demoService)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.demoService = demoService;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span> + i);\n    }\n}\n</code></pre>\n<p>The <code>DemoService</code> in above code is the proxy of service consumer in above image, user can call <code>Invoker</code> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup> which implementate the real RPC by the proxy.</p>\n<p>Service provider code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> <span class=\"hljs-keyword\">throws</span> RemoteException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<p>The above class would be encapsulated to be a <code>AbstractProxyInvoker</code> instance, and create a new <code>Exporter</code> instance, then find corresponding <code>Exporter</code> instance and call its corresponding <code>AbstractProxyInvoker</code> instance when network communication layer recieve request, so that real call service provider code. There are some other <code>Invoker</code> classes, but the above 2 are the most important.</p>\n<h2>Remote communication details</h2>\n<h3>Protocol header agreement</h3>\n<p><img src=\"sources/images/dubbo_protocol_header.png\" alt=\"/dev-guide/images/dubbo_protocol_header.jpg\"></p>\n<h3>Thread dispatch model</h3>\n<p><img src=\"sources/images/dubbo-protocol.jpg\" alt=\"/dev-guide/images/dubbo-protocol.jpg\"></p>\n<ul>\n<li>Dispather: <code>all</code>, <code>direct</code>, <code>message</code>, <code>execution</code>, <code>connection</code></li>\n<li>ThreadPool: <code>fixed</code>, <code>cached</code></li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>is <code>&lt;dubbo:service regisrty=&quot;N/A&quot; /&gt;</code> or <code>&lt;dubbo:registry address=&quot;N/A&quot; /&gt;</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>is <code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>is <code>&lt;dubbo:reference url=&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot; /&gt;</code> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>is <code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>is one of <code>DubboInvoker</code>, <code>HessianRpcInvoker</code>, <code>InjvmInvoker</code>, <code>RmiInvoker</code>, <code>WebServiceInvoker</code> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Implementation details</h1>\n<h2>Initialization details</h2>\n<h3>Service parsing</h3>\n<p>Based on <code>META-INF/spring.handlers</code> config in dubbo.jar, Spring calls <code>DubboNamespaceHandler</code> when meeting dubbo namespace.</p>\n<p>All Dubbo tags are parsed by <code>DubboBeanDefinitionParser</code>, based on one to one attribute mapping, the XML label is parsed as a Bean object.</p>\n<p>Transfer Bean object to URL, and transfer all attributes of Bean to URL parameters when <code>ServiceConfig.export()</code> or <code>ReferenceConfig.get()</code> initialization.</p>\n<p>Then pase URL to <a href=\"./impls/protocol.md\">Protocol extension point</a>, based on <a href=\"./SPI.md\">Extension point adaptive mechanism</a> of extension point, processing service exposure or reference for different protocols according to URL protocol header.</p>\n<h3>Service Exposure</h3>\n<h4>1. Only expose service port:</h4>\n<p>Direct exposing to provider when have not Registry, <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, the URL format which parsing by <code>ServiceConfig</code>:\n<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>.</p>\n<p>Based on extension point adaptive mechanism, call <code>export()</code> method of <code>DubboProtocol</code> and open server port by identifying <code>dubbo://</code> protocol header of URL.</p>\n<h4>2. Expose to Registry:</h4>\n<p>Expose provider address to Registry <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>, the URL format which parsing by <code>ServiceConfig</code>: <code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot;)</code>,</p>\n<p>Based on extension point adaptive mechanism, call <code>export()</code> method of <code>RegistryProtocol</code> by identifying  <code>registry://</code> protocol header, register the provider URL parameter of <code>export</code> to Registry.</p>\n<p>Resend to <code>Protocol</code> extension point to do exposure: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>, then based on extension point adaptive mechanism, call <code>export()</code> method of <code>DubboProtocol</code> and open server port by identifying <code>dubbo://</code> protocol header of provider URL.</p>\n<h3>Service Reference</h3>\n<h4>1. Direct connect service</h4>\n<p>Direct connect provider when have not Registry <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>, the URL format which parsing by <code>ReferenceConfig</code>: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>.</p>\n<p>Based on extension point adaptive mechanism, call <code>refer()</code> method of <code>DubboProtocol</code> by identifying <code>dubbo://</code> protocol header of URL, and return provider reference.</p>\n<h4>2. Service Registry discovery</h4>\n<p>Discover provider address by Registry <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>, the URL format which parsing by <code>ReferenceConfig</code>:\n<code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(&quot;consumer://consumer-host/com.foo.FooService?version=1.0.0&quot;)</code>.</p>\n<p>Based on extension point adaptive mechanism, call <code>refer()</code> method of <code>RegistryProtocol</code> by identifying <code>registry://</code> protocol header of URL, then based on the condition of parameter of <code>refer</code> to search provider URL, for example: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>.</p>\n<p>Then based on extension point adaptive mechanism, call <code>refer()</code> method of <code>DubboProtocol</code> to get provider reference by identifying <code>dubbo://</code> protocol header of provider URL.</p>\n<p>Then <code>RegistryProtocol</code> disguise various provider references to single provider by <code>Cluster</code> extension point and return.</p>\n<h3>Service Filter</h3>\n<p>Based on extension point adaptive mechanism, all <code>Protocol</code> extension points are auto wrapped <code>Wrapper</code> class.</p>\n<p>Based on <code>ProtocolFilterWrapper</code> class, make all <code>Filter</code> as chain, call the real reference at the end of the chain.</p>\n<p>Based on <code>ProtocolListenerWrapper</code> class, make all <code>InvokerListener</code> and <code>ExporterListener</code> as list, perform call back before and after exposure and reference.</p>\n<p>All additional functions would be implementated by <code>Filter</code>, including Monitor.</p>\n<h2>RPC details</h2>\n<h3>The detail process of exposing service by service provider</h3>\n<p><img src=\"sources/images/dubbo_rpc_export.jpg\" alt=\"/dev-guide/images/dubbo_rpc_export.jpg\"></p>\n<p>The above image shows the main process of exposing service by service provider:</p>\n<p>First <code>ServiceConfig</code> class get the actual class <code>ref</code> that provides service(e.g. 如:HelloWorldImpl), then generating a <code>AbstractProxyInvoker</code> instance by the <code>getInvoker</code> method of <code>ProxyFactory</code> class, to this step, complete the transformation of specific service to <code>Invoker</code>, next is the process of converting <code>Invoker</code> to <code>Exporter</code>.</p>\n<p>The key of Dubbo processing service exposure is the process of converting <code>Invoker</code> to <code>Exporter</code>, the red part in the above image. Here we introduce the implementation of the two typical protocols, Dubbo and RMI:</p>\n<h4>Dubbo implementation</h4>\n<p>The transformation from <code>Invoker</code> of Dubbo protocol to <code>Exporter</code> takes place in the <code>export</code> method of <code>DubboProtocol</code> class, it mainly opens the socket to listen service and receive all kinds of requests sent by the client, and the communication details are implementated by Dubbo itself.</p>\n<h4>RMI implementation</h4>\n<p>The transformation from <code>Invoker</code> of RMI protocol to <code>Exporter</code> takes place in the <code>export</code> method of <code>RmiProtocol</code> class, the RMI service is implementated by Spring, Dubbo or JDK, and the communication details are implementated by JDK, which saves a lot of work.</p>\n<h3>The detail process of serving service for service consumer</h3>\n<p><img src=\"sources/images/dubbo_rpc_refer.jpg\" alt=\"/dev-guide/images/dubbo_rpc_refer.jpg\"></p>\n<p>The above image is the main process of service consumption:</p>\n<p>First, the <code>init</code> method of <code>ReferenceConfig</code> class calls the <code>refer</code> method of <code>Protocol</code> to generate <code>Invoker</code> instance(such as the red part in the above image), which is the key of service consumption. Then the <code>Invoker</code> is converted to the interface required by the client (such as: HelloWorld).</p>\n<p>For each protocol such as RMI/Dubbo/Web service, the details they call <code>refer</code> method generate <code>Invoker</code> instance are similar to the previous section.</p>\n<h3>Invoker everywhere</h3>\n<p>Because of <code>Invoker</code> is a very important concept in the Dubbo domain model, many of the design ideas are close to it. This makes <code>Invoker</code> permeate the entire implementation code, and it's really easy to mix up for people who have just started Dubbo.</p>\n<p>Let's use a simple image below to describe the 2 important <code>Invoker</code>: service provider <code>Invoker</code> and service consumer <code>Invoker</code>:</p>\n<p><img src=\"sources/images/dubbo_rpc_invoke.jpg\" alt=\"/dev-guide/images/dubbo_rpc_invoke.jpg\"></p>\n<p>To better explain the above image, we provide the below code examples of service consumption and providers:</p>\n<p>Service consumer code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoClientAction</span> </span>{\n \n    <span class=\"hljs-keyword\">private</span> DemoService demoService;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setDemoService</span><span class=\"hljs-params\">(DemoService demoService)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.demoService = demoService;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span> + i);\n    }\n}\n</code></pre>\n<p>The <code>DemoService</code> in above code is the proxy of service consumer in above image, user can call <code>Invoker</code> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup> which implementate the real RPC by the proxy.</p>\n<p>Service provider code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> <span class=\"hljs-keyword\">throws</span> RemoteException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<p>The above class would be encapsulated to be a <code>AbstractProxyInvoker</code> instance, and create a new <code>Exporter</code> instance, then find corresponding <code>Exporter</code> instance and call its corresponding <code>AbstractProxyInvoker</code> instance when network communication layer recieve request, so that real call service provider code. There are some other <code>Invoker</code> classes, but the above 2 are the most important.</p>\n<h2>Remote communication details</h2>\n<h3>Protocol header agreement</h3>\n<p><img src=\"sources/images/dubbo_protocol_header.png\" alt=\"/dev-guide/images/dubbo_protocol_header.jpg\"></p>\n<h3>Thread dispatch model</h3>\n<p><img src=\"sources/images/dubbo-protocol.jpg\" alt=\"/dev-guide/images/dubbo-protocol.jpg\"></p>\n<ul>\n<li>Dispather: <code>all</code>, <code>direct</code>, <code>message</code>, <code>execution</code>, <code>connection</code></li>\n<li>ThreadPool: <code>fixed</code>, <code>cached</code></li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>is <code>&lt;dubbo:service regisrty=&quot;N/A&quot; /&gt;</code> or <code>&lt;dubbo:registry address=&quot;N/A&quot; /&gt;</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>is <code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>is <code>&lt;dubbo:reference url=&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot; /&gt;</code> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>is <code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>is one of <code>DubboInvoker</code>, <code>HessianRpcInvoker</code>, <code>InjvmInvoker</code>, <code>RmiInvoker</code>, <code>WebServiceInvoker</code> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/dev/implementation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/cache.json b/en-us/docs/dev/impls/cache.json
index e1b7c742..ff1ad89c 100644
--- a/en-us/docs/dev/impls/cache.json
+++ b/en-us/docs/dev/impls/cache.json
@@ -1,4 +1,6 @@
 {
   "filename": "cache.md",
-  "__html": "<h1>Cache Extension</h1>\n<h2>Summary</h2>\n<p>Cache the return value, use request parameter as the key.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.cache.CacheFactory</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- method level cache --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:service&gt;没有配置cache属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take affect if cache attribute isn't configured in &lt;dubbo:service&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.cache.support.lru.LruCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.threadlocal.ThreadLocalCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.jcache.JCacheFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCacheFactory.java (CacheFactory implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.cache.CacheFactory (plain text file with contents: xxx=com.xxx.XxxCacheFactory)\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.CacheFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCacheFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CacheFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Cache <span class=\"hljs-title\">getCache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxCache(url, name);\n    }\n}\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.Cache;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCache</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cache</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">Cache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">put</span><span class=\"hljs-params\">(Object key, Object value)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(Object key)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.cache.CacheFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCacheFactory</span>\n</code></pre>\n"
+  "__html": "<h1>Cache Extension</h1>\n<h2>Summary</h2>\n<p>Cache the return value, use request parameter as the key.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.cache.CacheFactory</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- method level cache --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:service&gt;没有配置cache属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take affect if cache attribute isn't configured in &lt;dubbo:service&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.cache.support.lru.LruCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.threadlocal.ThreadLocalCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.jcache.JCacheFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCacheFactory.java (CacheFactory implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.cache.CacheFactory (plain text file with contents: xxx=com.xxx.XxxCacheFactory)\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.CacheFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCacheFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CacheFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Cache <span class=\"hljs-title\">getCache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxCache(url, name);\n    }\n}\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.Cache;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCache</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cache</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">Cache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">put</span><span class=\"hljs-params\">(Object key, Object value)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(Object key)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.cache.CacheFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCacheFactory</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/cache.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/cluster.json b/en-us/docs/dev/impls/cluster.json
index db7c418b..f939340d 100644
--- a/en-us/docs/dev/impls/cluster.json
+++ b/en-us/docs/dev/impls/cluster.json
@@ -1,4 +1,6 @@
 {
   "filename": "cluster.md",
-  "__html": "<h1>Cluster Extension</h1>\n<h2>Summary</h2>\n<p>Group service providers in a cluster, and treat them as one single provider.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Cluster</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take affect if cluster attribute is not configured in &lt;dubbo:protocol&gt;  --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailoverCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailfastCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailbackCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.ForkingCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.AvailableCluster</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCluster.java (Cluster implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Cluster (plain text file with the content: xxx=com.xxx.XxxCluster)\n</code></pre>\n<p>XxxCluster.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Cluster;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Directory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCluster</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cluster</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(Directory&lt;T&gt; directory)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> AbstractClusterInvoker&lt;T&gt;(directory) {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation, List&lt;Invoker&lt;T&gt;&gt; invokers, LoadBalance loadbalance)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n                <span class=\"hljs-comment\">// ...</span>\n            }\n        };\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Cluster:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCluster</span>\n</code></pre>\n"
+  "__html": "<h1>Cluster Extension</h1>\n<h2>Summary</h2>\n<p>Group service providers in a cluster, and treat them as one single provider.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Cluster</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take affect if cluster attribute is not configured in &lt;dubbo:protocol&gt;  --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailoverCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailfastCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailbackCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.ForkingCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.AvailableCluster</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCluster.java (Cluster implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Cluster (plain text file with the content: xxx=com.xxx.XxxCluster)\n</code></pre>\n<p>XxxCluster.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Cluster;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Directory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCluster</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cluster</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(Directory&lt;T&gt; directory)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> AbstractClusterInvoker&lt;T&gt;(directory) {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation, List&lt;Invoker&lt;T&gt;&gt; invokers, LoadBalance loadbalance)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n                <span class=\"hljs-comment\">// ...</span>\n            }\n        };\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Cluster:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCluster</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/cluster.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/compiler.json b/en-us/docs/dev/impls/compiler.json
index 7f007abd..d4a55bf2 100644
--- a/en-us/docs/dev/impls/compiler.json
+++ b/en-us/docs/dev/impls/compiler.json
@@ -1,4 +1,6 @@
 {
   "filename": "compiler.md",
-  "__html": "<h1>Compiler Extension</h1>\n<h2>Summary</h2>\n<p>Java compiler, used for byte code dynamic generation for RPC invocation.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.compiler.Compiler</code></p>\n<h2>Extension Configuration</h2>\n<p>No configuration required, the extension will be automatically discovered and loaded.</p>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.compiler.support.JdkCompiler</code></li>\n<li><code>com.alibaba.dubbo.common.compiler.support.JavassistCompiler</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCompiler.java (Compiler implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.compiler.Compiler (plain text file with the content: xxx=com.xxx.XxxCompiler)\n</code></pre>\n<p>XxxCompiler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.compiler.Compiler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCompiler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Compiler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.compiler.Compiler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCompiler</span>\n</code></pre>\n"
+  "__html": "<h1>Compiler Extension</h1>\n<h2>Summary</h2>\n<p>Java compiler, used for byte code dynamic generation for RPC invocation.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.compiler.Compiler</code></p>\n<h2>Extension Configuration</h2>\n<p>No configuration required, the extension will be automatically discovered and loaded.</p>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.compiler.support.JdkCompiler</code></li>\n<li><code>com.alibaba.dubbo.common.compiler.support.JavassistCompiler</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCompiler.java (Compiler implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.compiler.Compiler (plain text file with the content: xxx=com.xxx.XxxCompiler)\n</code></pre>\n<p>XxxCompiler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.compiler.Compiler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCompiler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Compiler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.compiler.Compiler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCompiler</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/compiler.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/container.json b/en-us/docs/dev/impls/container.json
index cd806e21..95ae2c89 100644
--- a/en-us/docs/dev/impls/container.json
+++ b/en-us/docs/dev/impls/container.json
@@ -1,4 +1,6 @@
 {
   "filename": "container.md",
-  "__html": "<h1>Container Extension</h1>\n<h2>Summary</h2>\n<p>Service container extension, useful for loading custom contents.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.container.Container</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.spring.SpringContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.JettyContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.Log4jContainer</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxContainer.java (Container implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.Container (plain text file with the content: xxx=com.xxx.XxxContainer)\n</code></pre>\n<p>XxxContainer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \ncom.alibaba.dubbo.container.Container;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxContainer</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Container</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">stop</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.Container:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxContainer</span>\n</code></pre>\n"
+  "__html": "<h1>Container Extension</h1>\n<h2>Summary</h2>\n<p>Service container extension, useful for loading custom contents.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.container.Container</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.spring.SpringContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.JettyContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.Log4jContainer</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxContainer.java (Container implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.Container (plain text file with the content: xxx=com.xxx.XxxContainer)\n</code></pre>\n<p>XxxContainer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \ncom.alibaba.dubbo.container.Container;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxContainer</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Container</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">stop</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.Container:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxContainer</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/container.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/dispatcher.json b/en-us/docs/dev/impls/dispatcher.json
index c74a88b9..63ad45c9 100644
--- a/en-us/docs/dev/impls/dispatcher.json
+++ b/en-us/docs/dev/impls/dispatcher.json
@@ -1,4 +1,6 @@
 {
   "filename": "dispatcher.md",
-  "__html": "<h1>Dispatcher Extension</h1>\n<h2>Summary</h2>\n<p>Thread pool dispatch strategy.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.remoting.Dispatcher</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if dispatcher attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.all.AllDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedDispatcher</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxDispatcher.java (Dispatcher implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Dispatcher (plain text file with the content: xxx=com.xxx.XxxDispatcher)\n</code></pre>\n<p>XxxDispatcher.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Dispatcher;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxDispatcher</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Dispatcher</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Dispatcher:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxDispatcher</span>\n</code></pre>\n"
+  "__html": "<h1>Dispatcher Extension</h1>\n<h2>Summary</h2>\n<p>Thread pool dispatch strategy.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.remoting.Dispatcher</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if dispatcher attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extensions</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.all.AllDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedDispatcher</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxDispatcher.java (Dispatcher implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Dispatcher (plain text file with the content: xxx=com.xxx.XxxDispatcher)\n</code></pre>\n<p>XxxDispatcher.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Dispatcher;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxDispatcher</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Dispatcher</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Dispatcher:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxDispatcher</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/dispatcher.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/exchanger.json b/en-us/docs/dev/impls/exchanger.json
index 79b42d51..a946c92b 100644
--- a/en-us/docs/dev/impls/exchanger.json
+++ b/en-us/docs/dev/impls/exchanger.json
@@ -1,4 +1,6 @@
 {
   "filename": "exchanger.md",
-  "__html": "<h1>Exchanger Extension</h1>\n<h2>Summary</h2>\n<p>Exchange message between request and response on network transport layer.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.exchange.Exchanger</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeServer</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeClient</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if exchanger attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.remoting.exchange.exchanger.HeaderExchanger</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExchanger.java (Exchanger implementation)\n                |-XxxExchangeServer.java (ExchangeServer implementation)\n                |-XxxExchangeClient.java (ExchangeClient implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.exchange.Exchanger (plain text file with the content: xxx=com.xxx.XxxExchanger)\n</code></pre>\n<p>XxxExchanger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.Exchanger;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchanger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Exchanger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeServer <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeClient <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxExchangeServer.java:</p>\n<pre><code class=\"language-java\">\n<span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeServer</span> <span class=\"hljs-title\">impelements</span> <span class=\"hljs-title\">ExchangeServer</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>XxxExchangeClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeClient</span> <span class=\"hljs-title\">impelments</span> <span class=\"hljs-title\">ExchangeClient</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.exchange.Exchanger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExchanger</span>\n</code></pre>\n"
+  "__html": "<h1>Exchanger Extension</h1>\n<h2>Summary</h2>\n<p>Exchange message between request and response on network transport layer.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.exchange.Exchanger</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeServer</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeClient</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if exchanger attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.remoting.exchange.exchanger.HeaderExchanger</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExchanger.java (Exchanger implementation)\n                |-XxxExchangeServer.java (ExchangeServer implementation)\n                |-XxxExchangeClient.java (ExchangeClient implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.exchange.Exchanger (plain text file with the content: xxx=com.xxx.XxxExchanger)\n</code></pre>\n<p>XxxExchanger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.Exchanger;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchanger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Exchanger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeServer <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeClient <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxExchangeServer.java:</p>\n<pre><code class=\"language-java\">\n<span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeServer</span> <span class=\"hljs-title\">impelements</span> <span class=\"hljs-title\">ExchangeServer</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>XxxExchangeClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeClient</span> <span class=\"hljs-title\">impelments</span> <span class=\"hljs-title\">ExchangeClient</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.exchange.Exchanger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExchanger</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/exchanger.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/exporter-listener.json b/en-us/docs/dev/impls/exporter-listener.json
index 5adf80c4..52f2dbeb 100644
--- a/en-us/docs/dev/impls/exporter-listener.json
+++ b/en-us/docs/dev/impls/exporter-listener.json
@@ -1,4 +1,6 @@
 {
   "filename": "exporter-listener.md",
-  "__html": "<h1>ExporterListener Extension</h1>\n<h2>Summary</h2>\n<p>Fire events when there's any service exported.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.ExporterListener</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- service exporter listener --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default exporter listener for service provider --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.registry.directory.RegistryExporterListener</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExporterListener.java (ExporterListener implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ExporterListener (plain text file with the content: xxx=com.xxx.XxxExporterListener)\n</code></pre>\n<p>XxxExporterListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ExporterListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Exporter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporterListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExporterListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">exported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ExporterListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExporterListener</span>\n</code></pre>\n"
+  "__html": "<h1>ExporterListener Extension</h1>\n<h2>Summary</h2>\n<p>Fire events when there's any service exported.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.ExporterListener</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- service exporter listener --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default exporter listener for service provider --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.registry.directory.RegistryExporterListener</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExporterListener.java (ExporterListener implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ExporterListener (plain text file with the content: xxx=com.xxx.XxxExporterListener)\n</code></pre>\n<p>XxxExporterListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ExporterListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Exporter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporterListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExporterListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">exported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ExporterListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExporterListener</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/exporter-listener.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/extension-factory.json b/en-us/docs/dev/impls/extension-factory.json
index e7e29421..8d6b4332 100644
--- a/en-us/docs/dev/impls/extension-factory.json
+++ b/en-us/docs/dev/impls/extension-factory.json
@@ -1,4 +1,6 @@
 {
   "filename": "extension-factory.md",
-  "__html": "<h1>ExtensionFactory Extension</h1>\n<h2>Summary</h2>\n<p>Factory to load dubbo extensions.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.extension.ExtensionFactory</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">compiler</span>=<span class=\"hljs-string\">\"jdk\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory</code></li>\n<li><code>com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExtensionFactory.java (ExtensionFactory implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.extension.ExtensionFactory (plain text file with the content: xxx=com.xxx.XxxExtensionFactory)\n</code></pre>\n<p>XxxExtensionFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.ExtensionFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExtensionFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExtensionFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.extension.ExtensionFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExtensionFactory</span>\n</code></pre>\n"
+  "__html": "<h1>ExtensionFactory Extension</h1>\n<h2>Summary</h2>\n<p>Factory to load dubbo extensions.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.extension.ExtensionFactory</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">compiler</span>=<span class=\"hljs-string\">\"jdk\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory</code></li>\n<li><code>com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExtensionFactory.java (ExtensionFactory implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.extension.ExtensionFactory (plain text file with the content: xxx=com.xxx.XxxExtensionFactory)\n</code></pre>\n<p>XxxExtensionFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.ExtensionFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExtensionFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExtensionFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.extension.ExtensionFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExtensionFactory</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/extension-factory.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/filter.json b/en-us/docs/dev/impls/filter.json
index 0228d26f..b234cb65 100644
--- a/en-us/docs/dev/impls/filter.json
+++ b/en-us/docs/dev/impls/filter.json
@@ -1,4 +1,6 @@
 {
   "filename": "filter.md",
-  "__html": "<h1>Filter Extension</h1>\n<h2>Summary</h2>\n<p>Extension for intercepting the invocation for both service provider and consumer, furthermore, most of functions in dubbo are implemented base on the same mechanism. Since every time when remote method is invoked, the filter extensions will be executed too, the corresponding penalty should be considered before more filters are added.</p>\n<p>Contract:</p>\n<ul>\n<li>User defined filters are executed after built-in filters by default.</li>\n<li>Special value <code>default</code> is introduced to represent the default extension location. For example: for <code>filter=&quot;xxx,default,yyy&quot;</code>, <code>xxx</code> is before default filter, and <code>yyy</code> is after the default filter.</li>\n<li>Special value <code>-</code> means delete. For example: <code>filter=&quot;-foo1&quot;</code> excludes <code>foo1</code> extension. For example, <code>filter=&quot;-default&quot;</code> exclues all default filters.</li>\n<li>When provider and service have filter configured at the same moment, all filters are accumulated together instead of override, for example: for <code>&lt;dubbo:provider filter=&quot;xxx,yyy&quot;/&gt;</code> and <code>&lt;dubbo:service filter=&quot;aaa,bbb&quot; /&gt;</code>,<code>xxx</code>, <code>yyy</code>, <code>aaa</code>, <code>bbb</code> are all count as filters. In order to change to override, use: <code>&lt;dubbo:service filter=&quot;-xxx,-yyy,aaa,bbb&quot; /&gt;</code></li>\n</ul>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.Filter</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- filter for consumer --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default filter configuration for the consumer, will intercept for all references --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- filter for provider --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default filter configuration for the provider, will intercept for all services --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.filter.EchoFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericImplFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.TokenFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.AccessLogFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.CountFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ActiveLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ClassLoaderFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ConsumerContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExceptionFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExecuteLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.DeprecatedFilter</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxFilter.java (Filter implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Filter (plain text file with the content: xxx=com.xxx.XxxFilter)\n</code></pre>\n<p>XxxFilter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// before filter ...</span>\n        Result result = invoker.invoke(invocation);\n        <span class=\"hljs-comment\">// after filter ...</span>\n        <span class=\"hljs-keyword\">return</span> result;\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Filter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxFilter</span>\n</code></pre>\n"
+  "__html": "<h1>Filter Extension</h1>\n<h2>Summary</h2>\n<p>Extension for intercepting the invocation for both service provider and consumer, furthermore, most of functions in dubbo are implemented base on the same mechanism. Since every time when remote method is invoked, the filter extensions will be executed too, the corresponding penalty should be considered before more filters are added.</p>\n<p>Contract:</p>\n<ul>\n<li>User defined filters are executed after built-in filters by default.</li>\n<li>Special value <code>default</code> is introduced to represent the default extension location. For example: for <code>filter=&quot;xxx,default,yyy&quot;</code>, <code>xxx</code> is before default filter, and <code>yyy</code> is after the default filter.</li>\n<li>Special value <code>-</code> means delete. For example: <code>filter=&quot;-foo1&quot;</code> excludes <code>foo1</code> extension. For example, <code>filter=&quot;-default&quot;</code> exclues all default filters.</li>\n<li>When provider and service have filter configured at the same moment, all filters are accumulated together instead of override, for example: for <code>&lt;dubbo:provider filter=&quot;xxx,yyy&quot;/&gt;</code> and <code>&lt;dubbo:service filter=&quot;aaa,bbb&quot; /&gt;</code>,<code>xxx</code>, <code>yyy</code>, <code>aaa</code>, <code>bbb</code> are all count as filters. In order to change to override, use: <code>&lt;dubbo:service filter=&quot;-xxx,-yyy,aaa,bbb&quot; /&gt;</code></li>\n</ul>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.Filter</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- filter for consumer --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default filter configuration for the consumer, will intercept for all references --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- filter for provider --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default filter configuration for the provider, will intercept for all services --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.filter.EchoFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericImplFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.TokenFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.AccessLogFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.CountFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ActiveLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ClassLoaderFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ConsumerContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExceptionFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExecuteLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.DeprecatedFilter</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxFilter.java (Filter implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Filter (plain text file with the content: xxx=com.xxx.XxxFilter)\n</code></pre>\n<p>XxxFilter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// before filter ...</span>\n        Result result = invoker.invoke(invocation);\n        <span class=\"hljs-comment\">// after filter ...</span>\n        <span class=\"hljs-keyword\">return</span> result;\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Filter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxFilter</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/filter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/introduction.json b/en-us/docs/dev/impls/introduction.json
index 7304c42a..a413d9fe 100644
--- a/en-us/docs/dev/impls/introduction.json
+++ b/en-us/docs/dev/impls/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>SPI Extension Implementations</h1>\n<p>SPI extension interface is used for system integration, it's also useful for dubbo contributor to extend dubbo functionality.</p>\n"
+  "__html": "<h1>SPI Extension Implementations</h1>\n<p>SPI extension interface is used for system integration, it's also useful for dubbo contributor to extend dubbo functionality.</p>\n",
+  "link": "/en-us/docs/dev/impls/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/invoker-listener.json b/en-us/docs/dev/impls/invoker-listener.json
index 2c855e24..d2927c2c 100644
--- a/en-us/docs/dev/impls/invoker-listener.json
+++ b/en-us/docs/dev/impls/invoker-listener.json
@@ -1,4 +1,6 @@
 {
   "filename": "invoker-listener.md",
-  "__html": "<h1>InvokerListener Extension</h1>\n<h2>Summary</h2>\n<p>Fire event when there's any service referenced.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.InvokerListener</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 引用服务监听 --&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- service reference listener --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- default service reference listener --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.rpc.listener.DeprecatedInvokerListener</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxInvokerListener.java (InvokerListener implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.InvokerListener (plain text file with the content: xxx=com.xxx.XxxInvokerListener)\n</code></pre>\n<p>XxxInvokerListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.InvokerListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvokerListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">InvokerListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">referred</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroyed</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.InvokerListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxInvokerListener</span>\n</code></pre>\n"
+  "__html": "<h1>InvokerListener Extension</h1>\n<h2>Summary</h2>\n<p>Fire event when there's any service referenced.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.InvokerListener</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 引用服务监听 --&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- service reference listener --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- default service reference listener --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.rpc.listener.DeprecatedInvokerListener</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxInvokerListener.java (InvokerListener implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.InvokerListener (plain text file with the content: xxx=com.xxx.XxxInvokerListener)\n</code></pre>\n<p>XxxInvokerListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.InvokerListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvokerListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">InvokerListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">referred</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroyed</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.InvokerListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxInvokerListener</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/invoker-listener.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/load-balance.json b/en-us/docs/dev/impls/load-balance.json
index 7e1d051b..9b105043 100644
--- a/en-us/docs/dev/impls/load-balance.json
+++ b/en-us/docs/dev/impls/load-balance.json
@@ -1,4 +1,6 @@
 {
   "filename": "load-balance.md",
-  "__html": "<h1>LoadBalance Extension</h1>\n<h2>Summary</h2>\n<p>Pick one from service providers and fire the invocation.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.LoadBalance</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect when loadbalance is not configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoadBalance.java (LoadBalance implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.LoadBalance (plain text file with the content: xxx=com.xxx.XxxLoadBalance)\n</code></pre>\n<p>XxxLoadBalance.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException; \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoadBalance</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoadBalance</span>\n</code></pre>\n"
+  "__html": "<h1>LoadBalance Extension</h1>\n<h2>Summary</h2>\n<p>Pick one from service providers and fire the invocation.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.LoadBalance</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect when loadbalance is not configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoadBalance.java (LoadBalance implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.LoadBalance (plain text file with the content: xxx=com.xxx.XxxLoadBalance)\n</code></pre>\n<p>XxxLoadBalance.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException; \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoadBalance</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoadBalance</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/load-balance.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/logger-adapter.json b/en-us/docs/dev/impls/logger-adapter.json
index 73b5678c..68f8f85d 100644
--- a/en-us/docs/dev/impls/logger-adapter.json
+++ b/en-us/docs/dev/impls/logger-adapter.json
@@ -1,4 +1,6 @@
 {
   "filename": "logger-adapter.md",
-  "__html": "<h1>LoggerAdapter Extension</h1>\n<h2>Summary</h2>\n<p>Extension for adapting logger output</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.logger.LoggerAdapter</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">-Ddubbo:application.logger=xxx\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j2.Log4j2LoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoggerAdapter.java (LoggerAdapter implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.logger.LoggerAdapter (plain text file with the content: xxx=com.xxx.XxxLoggerAdapter)\n</code></pre>\n<p>XxxLoggerAdapter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.LoggerAdapter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoggerAdapter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoggerAdapter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Logger <span class=\"hljs-title\">getLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxLogger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.Logger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLogger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Logger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">info</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.logger.LoggerAdapter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoggerAdapter</span>\n</code></pre>\n"
+  "__html": "<h1>LoggerAdapter Extension</h1>\n<h2>Summary</h2>\n<p>Extension for adapting logger output</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.logger.LoggerAdapter</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">-Ddubbo:application.logger=xxx\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j2.Log4j2LoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoggerAdapter.java (LoggerAdapter implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.logger.LoggerAdapter (plain text file with the content: xxx=com.xxx.XxxLoggerAdapter)\n</code></pre>\n<p>XxxLoggerAdapter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.LoggerAdapter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoggerAdapter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoggerAdapter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Logger <span class=\"hljs-title\">getLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxLogger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.Logger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLogger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Logger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">info</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.logger.LoggerAdapter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoggerAdapter</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/logger-adapter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/merger.json b/en-us/docs/dev/impls/merger.json
index b82ccd69..9c36e506 100644
--- a/en-us/docs/dev/impls/merger.json
+++ b/en-us/docs/dev/impls/merger.json
@@ -1,4 +1,6 @@
 {
   "filename": "merger.md",
-  "__html": "<h1>Merger Extension</h1>\n<h2>Summary</h2>\n<p>Merge strategy for return result aggregation in group.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Merger</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ArrayMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ListMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.SetMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.MapMerger</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMerger.java (Merger implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Merger (plain text file with the content: xxx=com.xxx.XxxMerger)\n</code></pre>\n<p>XxxMerger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Merger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMerger</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Merger</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(T... results)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Merger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMerger</span>\n</code></pre>\n"
+  "__html": "<h1>Merger Extension</h1>\n<h2>Summary</h2>\n<p>Merge strategy for return result aggregation in group.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Merger</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ArrayMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ListMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.SetMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.MapMerger</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMerger.java (Merger implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Merger (plain text file with the content: xxx=com.xxx.XxxMerger)\n</code></pre>\n<p>XxxMerger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Merger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMerger</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Merger</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(T... results)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Merger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMerger</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/merger.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/monitor.json b/en-us/docs/dev/impls/monitor.json
index 86e73bd0..9df72f16 100644
--- a/en-us/docs/dev/impls/monitor.json
+++ b/en-us/docs/dev/impls/monitor.json
@@ -1,4 +1,6 @@
 {
   "filename": "monitor.md",
-  "__html": "<h1>Monitor Extension</h1>\n<h2>Summary</h2>\n<p>Extension to monitor service invocation times and time taken for each service invocation.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.monitor.MonitorFactory</code></li>\n<li><code>com.alibaba.dubbo.monitor.Monitor</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- configure monitor center --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p>com.alibaba.dubbo.monitor.support.dubbo.DubboMonitorFactory</p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMonitorFactoryjava (MonitorFactory implementation)\n                |-XxxMonitor.java (Monitor implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.monitor.MonitorFactory (plain text file with the format: xxx=com.xxx.XxxMonitorFactory)\n</code></pre>\n<p>XxxMonitorFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.MonitorFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitorFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">MonitorFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Monitor <span class=\"hljs-title\">getMonitor</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxMonitor(url);\n    }\n}\n</code></pre>\n<p>XxxMonitor.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitor</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Monitor</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">count</span><span class=\"hljs-params\">(URL statistics)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.monitor.MonitorFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMonitorFactory</span>\n</code></pre>\n"
+  "__html": "<h1>Monitor Extension</h1>\n<h2>Summary</h2>\n<p>Extension to monitor service invocation times and time taken for each service invocation.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.monitor.MonitorFactory</code></li>\n<li><code>com.alibaba.dubbo.monitor.Monitor</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- configure monitor center --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p>com.alibaba.dubbo.monitor.support.dubbo.DubboMonitorFactory</p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMonitorFactoryjava (MonitorFactory implementation)\n                |-XxxMonitor.java (Monitor implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.monitor.MonitorFactory (plain text file with the format: xxx=com.xxx.XxxMonitorFactory)\n</code></pre>\n<p>XxxMonitorFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.MonitorFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitorFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">MonitorFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Monitor <span class=\"hljs-title\">getMonitor</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxMonitor(url);\n    }\n}\n</code></pre>\n<p>XxxMonitor.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitor</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Monitor</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">count</span><span class=\"hljs-params\">(URL statistics)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.monitor.MonitorFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMonitorFactory</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/monitor.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/networker.json b/en-us/docs/dev/impls/networker.json
index cc95ba21..c65c15c3 100644
--- a/en-us/docs/dev/impls/networker.json
+++ b/en-us/docs/dev/impls/networker.json
@@ -1,4 +1,6 @@
 {
   "filename": "networker.md",
-  "__html": "<h1>Networker Extension</h1>\n<h2>Summary</h2>\n<p>Extension for peer to peer network grouping.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.remoting.p2p.Networker</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it takes effect if networker attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.MulticastNetworker</code></li>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.FileNetworker</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxNetworker.java (Networker implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.p2p.Networker (plain text file with the content: xxx=com.xxx.XxxNetworker)\n</code></pre>\n<p>XxxNetworker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.p2p.Networker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxNetworker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Networker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.p2p.Networker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxNetworker</span>\n</code></pre>\n"
+  "__html": "<h1>Networker Extension</h1>\n<h2>Summary</h2>\n<p>Extension for peer to peer network grouping.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.remoting.p2p.Networker</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it takes effect if networker attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.MulticastNetworker</code></li>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.FileNetworker</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxNetworker.java (Networker implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.p2p.Networker (plain text file with the content: xxx=com.xxx.XxxNetworker)\n</code></pre>\n<p>XxxNetworker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.p2p.Networker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxNetworker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Networker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.p2p.Networker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxNetworker</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/networker.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/page.json b/en-us/docs/dev/impls/page.json
index b461bd63..b1dfe038 100644
--- a/en-us/docs/dev/impls/page.json
+++ b/en-us/docs/dev/impls/page.json
@@ -1,4 +1,6 @@
 {
   "filename": "page.md",
-  "__html": "<h1>Page Extension</h1>\n<h2>Summary</h2>\n<p>Extension for page handler</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.container.page.PageHandler</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if page attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.page.pages.HomePageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.StatusPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.LogPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.SystemPageHandler</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxPageHandler.java (PageHandler implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.page.PageHandler (plain text file with the content: xxx=com.xxx.XxxPageHandler)\n</code></pre>\n<p>XxxPageHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.container.page.PageHandler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxPageHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">PageHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.page.PageHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxPageHandler</span>\n</code></pre>\n"
+  "__html": "<h1>Page Extension</h1>\n<h2>Summary</h2>\n<p>Extension for page handler</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.container.page.PageHandler</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if page attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.page.pages.HomePageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.StatusPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.LogPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.SystemPageHandler</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxPageHandler.java (PageHandler implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.page.PageHandler (plain text file with the content: xxx=com.xxx.XxxPageHandler)\n</code></pre>\n<p>XxxPageHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.container.page.PageHandler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxPageHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">PageHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.page.PageHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxPageHandler</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/page.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/protocol.json b/en-us/docs/dev/impls/protocol.json
index 7ec74c15..0394b665 100644
--- a/en-us/docs/dev/impls/protocol.json
+++ b/en-us/docs/dev/impls/protocol.json
@@ -1,4 +1,6 @@
 {
   "filename": "protocol.md",
-  "__html": "<h1>Protocol Extension</h1>\n<h2>Summary</h2>\n<p>Extension to RPC protocol, hide details of remote call.</p>\n<p>Contract:</p>\n<ul>\n<li>When user calls <code>invoke()</code> method of <code>Invoker</code> object which's returned from <code>refer()</code> call, the protocol needs to correspondingly execute <code>invoke()</code> method of <code>Invoker</code> object passed from remote <code>export()</code> method associated with the same URL.</li>\n<li>Moreover, it's protocol's responsibility to implement <code>Invoker</code> which's returned from <code>refer()</code>. Generally speaking, protocol sends remote request in the <code>Invoker</code> implementation, but needs not to care about the <code>Invoker</code> passed into <code>export()</code> since the framework will implement the logic and pass in the instance.</li>\n</ul>\n<p>Notes:</p>\n<ul>\n<li>Protocol does not need to care about the proxy of the business interface. The upper layer of the framework will convert <code>Invoker</code> into business interface.</li>\n<li>It is not a requirement that the protocol must use TCP for network communication. It could be file-sharing, IPC, or others.</li>\n</ul>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.Protocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.Exporter</code></li>\n<li><code>com.alibaba.dubbo.rpc.Invoker</code></li>\n</ul>\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\">Protocol</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * Export remote service: &lt;br&gt;\n     * 1. Should save address info for the request when the protocol receives it: RpcContext.getContext().setRemoteAddress();&lt;br&gt;\n     * 2. export() must be implemented as idempotent, that is, it should not introduce side effect when the implementation gets called with the same Invoker for more than once.\n     * 3. Invoker is passed by the framework, and the protocol should not care about it. &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; Service type\n     * <span class=\"hljs-doctag\">@param</span> invoker Service invoker\n     * <span class=\"hljs-doctag\">@return</span> exporter The reference of service exporter, used for cancelling service export.\n     * <span class=\"hljs-doctag\">@throws</span> RpcException throw when there's any error during service export, e.g. the port is occupied\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n    <span class=\"hljs-comment\">/**\n     * Reference remote service: &lt;br&gt;\n     * 1. When user calls `invoke()` method of `Invoker` object which's returned from `refer()` call, the protocol needs to correspondingly execute `invoke()` method of `Invoker` object passed from remote `export()` method associated with the same URL. &lt;br&gt;\n     * 2. It's protocol's responsibility to implement `Invoker` which's returned from `refer()`. Generally speaking, protocol sends remote request in the `Invoker` implementation. &lt;br&gt;\n     * 3. When there's check=false set in URL, the implementation must not throw exception but try to recover when connection fails.\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; Service type\n     * <span class=\"hljs-doctag\">@param</span> type Service type\n     * <span class=\"hljs-doctag\">@param</span> url URL address for the remote service\n     * <span class=\"hljs-doctag\">@return</span> invoker service's local proxy\n     * <span class=\"hljs-doctag\">@throws</span> RpcException throw when there's any error while connecting to the service provider\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n}\n</code></pre>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- declare protocol, if id is not set, then use the value of name for id --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- reference protocol, if protocol's attribute is not set, then protocol configuration will be scanned automatically from ApplicationContext --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default value for referenced protocol, it will be used if protocol attribute is not configured in &lt;dubbo:service&gt; --&gt;</span> \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Protocol</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.injvm.InjvmProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.DubboProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.rmi.RmiProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.HttpProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.hessian.HessianProtocol</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProtocol.java (Protocol implementation)\n                |-XxxExporter.java (Exporter implementation)\n                |-XxxInvoker.java (Invoker implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Protocol (plain text file with the content: xxx=com.xxx.XxxProtocol)\n</code></pre>\n<p>XxxProtocol.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExporter(invoker);\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxInvoker(type, url);\n    }\n}\n</code></pre>\n<p>XxxExporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractExporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxExporter</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(invoker);\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexport</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">super</span>.unexport();\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxInvoker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractInvoker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxInvoker</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(type, url);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">abstract</span> Object <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProtocol</span>\n</code></pre>\n"
+  "__html": "<h1>Protocol Extension</h1>\n<h2>Summary</h2>\n<p>Extension to RPC protocol, hide details of remote call.</p>\n<p>Contract:</p>\n<ul>\n<li>When user calls <code>invoke()</code> method of <code>Invoker</code> object which's returned from <code>refer()</code> call, the protocol needs to correspondingly execute <code>invoke()</code> method of <code>Invoker</code> object passed from remote <code>export()</code> method associated with the same URL.</li>\n<li>Moreover, it's protocol's responsibility to implement <code>Invoker</code> which's returned from <code>refer()</code>. Generally speaking, protocol sends remote request in the <code>Invoker</code> implementation, but needs not to care about the <code>Invoker</code> passed into <code>export()</code> since the framework will implement the logic and pass in the instance.</li>\n</ul>\n<p>Notes:</p>\n<ul>\n<li>Protocol does not need to care about the proxy of the business interface. The upper layer of the framework will convert <code>Invoker</code> into business interface.</li>\n<li>It is not a requirement that the protocol must use TCP for network communication. It could be file-sharing, IPC, or others.</li>\n</ul>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.Protocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.Exporter</code></li>\n<li><code>com.alibaba.dubbo.rpc.Invoker</code></li>\n</ul>\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\">Protocol</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * Export remote service: &lt;br&gt;\n     * 1. Should save address info for the request when the protocol receives it: RpcContext.getContext().setRemoteAddress();&lt;br&gt;\n     * 2. export() must be implemented as idempotent, that is, it should not introduce side effect when the implementation gets called with the same Invoker for more than once.\n     * 3. Invoker is passed by the framework, and the protocol should not care about it. &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; Service type\n     * <span class=\"hljs-doctag\">@param</span> invoker Service invoker\n     * <span class=\"hljs-doctag\">@return</span> exporter The reference of service exporter, used for cancelling service export.\n     * <span class=\"hljs-doctag\">@throws</span> RpcException throw when there's any error during service export, e.g. the port is occupied\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n    <span class=\"hljs-comment\">/**\n     * Reference remote service: &lt;br&gt;\n     * 1. When user calls `invoke()` method of `Invoker` object which's returned from `refer()` call, the protocol needs to correspondingly execute `invoke()` method of `Invoker` object passed from remote `export()` method associated with the same URL. &lt;br&gt;\n     * 2. It's protocol's responsibility to implement `Invoker` which's returned from `refer()`. Generally speaking, protocol sends remote request in the `Invoker` implementation. &lt;br&gt;\n     * 3. When there's check=false set in URL, the implementation must not throw exception but try to recover when connection fails.\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; Service type\n     * <span class=\"hljs-doctag\">@param</span> type Service type\n     * <span class=\"hljs-doctag\">@param</span> url URL address for the remote service\n     * <span class=\"hljs-doctag\">@return</span> invoker service's local proxy\n     * <span class=\"hljs-doctag\">@throws</span> RpcException throw when there's any error while connecting to the service provider\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n}\n</code></pre>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- declare protocol, if id is not set, then use the value of name for id --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- reference protocol, if protocol's attribute is not set, then protocol configuration will be scanned automatically from ApplicationContext --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default value for referenced protocol, it will be used if protocol attribute is not configured in &lt;dubbo:service&gt; --&gt;</span> \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Protocol</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.injvm.InjvmProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.DubboProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.rmi.RmiProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.HttpProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.hessian.HessianProtocol</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProtocol.java (Protocol implementation)\n                |-XxxExporter.java (Exporter implementation)\n                |-XxxInvoker.java (Invoker implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Protocol (plain text file with the content: xxx=com.xxx.XxxProtocol)\n</code></pre>\n<p>XxxProtocol.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExporter(invoker);\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxInvoker(type, url);\n    }\n}\n</code></pre>\n<p>XxxExporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractExporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxExporter</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(invoker);\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexport</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">super</span>.unexport();\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxInvoker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractInvoker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxInvoker</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(type, url);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">abstract</span> Object <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProtocol</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/protocol.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/proxy-factory.json b/en-us/docs/dev/impls/proxy-factory.json
index 878c894a..8f3f646b 100644
--- a/en-us/docs/dev/impls/proxy-factory.json
+++ b/en-us/docs/dev/impls/proxy-factory.json
@@ -1,4 +1,6 @@
 {
   "filename": "proxy-factory.md",
-  "__html": "<h1>ProxyFactory Extension</h1>\n<h2>Summary</h2>\n<p>Convert <code>Invoker</code> into business interface.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.ProxyFactory</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it will take effect when proxy attribute is not configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.proxy.JdkProxyFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.proxy.JavassistProxyFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProxyFactory.java (ProxyFactory implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ProxyFactory (plain text file with the content: xxx=com.xxx.XxxProxyFactory)\n</code></pre>\n<p>XxxProxyFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ProxyFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProxyFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ProxyFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">T <span class=\"hljs-title\">getProxy</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">getInvoker</span><span class=\"hljs-params\">(T proxy, Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ProxyFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProxyFactory</span>\n</code></pre>\n"
+  "__html": "<h1>ProxyFactory Extension</h1>\n<h2>Summary</h2>\n<p>Convert <code>Invoker</code> into business interface.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.rpc.ProxyFactory</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it will take effect when proxy attribute is not configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.proxy.JdkProxyFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.proxy.JavassistProxyFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProxyFactory.java (ProxyFactory implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ProxyFactory (plain text file with the content: xxx=com.xxx.XxxProxyFactory)\n</code></pre>\n<p>XxxProxyFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ProxyFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProxyFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ProxyFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">T <span class=\"hljs-title\">getProxy</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">getInvoker</span><span class=\"hljs-params\">(T proxy, Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ProxyFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProxyFactory</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/proxy-factory.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/registry.json b/en-us/docs/dev/impls/registry.json
index 4a665de4..e7b9c95d 100644
--- a/en-us/docs/dev/impls/registry.json
+++ b/en-us/docs/dev/impls/registry.json
@@ -1,4 +1,6 @@
 {
   "filename": "registry.md",
-  "__html": "<h1>Registry Extension</h1>\n<h2>Summary</h2>\n<p>Registry extension is used for service registration and discovery.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.registry.RegistryFactory</code></li>\n<li><code>com.alibaba.dubbo.registry.Registry</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- config registry server --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- reference registry server, if registry attribute is not specified, then ApplicationContext will be scanned to find if there's any --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration for referencing registry server, it will take effect if there's no registry attribute specified in &lt;dubbo:service&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>Extension Contract</h2>\n<p>RegistryFactory.java:</p>\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\">RegistryFactory</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * Connect to registry server\n     * \n     * The contract for connecting to registry server: &lt;br&gt;\n     * 1. Will not check connection when check=false is set, otherwise exception will be thrown if connection fails. &lt;br&gt;\n     * 2. Support authorizing against username:password in the URL &lt;br&gt;\n     * 3. Support registry server backup with backup=10.20.153.10 &lt;br&gt;\n     * 4. Support cache on local disk with file=registry.cache &lt;br&gt;\n     * 5. Support timeout setup with timeout=1000 &lt;br&gt;\n     * 6. Support session expiration setup with session=60000 &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url registry server address, null is not allowed\n     * <span class=\"hljs-doctag\">@return</span> reference to registry server, never return null\n     */</span>\n    <span class=\"hljs-function\">Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span></span>; \n}\n</code></pre>\n<p>RegistryService.java:</p>\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\">RegistryService</span> </span>{ <span class=\"hljs-comment\">// Registry extends RegistryService </span>\n    <span class=\"hljs-comment\">/**\n     * Register service.\n     * \n     * Contract for registering service: &lt;br&gt;\n     * 1. Registration failure will be ignored and kept retrying if check=false is set in URL, otherwise exception will be thrown &lt;br&gt;\n     * 2. Persistence is required if dynamic=false is set in URL, otherwise, the registration info will be removed automatically when register quits accidentally &lt;br&gt;\n     * 3. Persistent by category if category=overrides is set in URL, default category is providers. It is possible to notify by category. &lt;br&gt;\n     * 4. Data lost is not tolerant when registry server reboots or network jitter happens. &lt;br&gt; \n     * 5. It is not allowed to override each other when URLs have same URI part but different parameters &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url registration info,null is not allowed, e.g.: dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * Unregister service.\n     * \n     * Contract for unregistering service: &lt;br&gt;\n     * 1. IllegalStateException should be thrown when registration info which's supposed to be persistent (with dynamic=false set) cannot be found, otherwise it should be ignored. &lt;br&gt;\n     * 2. To cancel one service, extract match on its URL will be honored &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url registration info,null is not allowed, e.g.: dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 订阅服务.\n     * Subscribe service.\n     * \n     * Contract for subscribing service: &lt;br&gt;\n     * 1. Subscription failure will be ignored and kept retrying if check=false is set in URL &lt;br&gt;\n     * 2. Only the specified category will be notified if category=overrides is set in URL. Categories are seperated with comma, and all categorized data will be subscribed when wildcard \"*\" is specified. &lt;br&gt;\n     * 3. Allow to query by interface, group, version, classifier, e.g.: interface=com.alibaba.foo.BarService&amp;version=1.0.0&lt;br&gt;\n     * 4. Allow to query with wildcard \"*\" to subscribe all versions under all categories for all interfaces, e.g.: interface=*&amp;group=*&amp;version=*&amp;classifier=*&lt;br&gt;\n     * 5. Subscription will be automatically recoverred when registry server reboots or network jitter happens. &lt;br&gt;\n     * 6. It is not allowed to override each other when URLs have same URI part but different parameters &lt;br&gt;\n     * 7. Subscription procedure will not return until the first notification happens. &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url URL for subscription, null isn't allowed, e.g.: consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener notification listener, null is not allowed\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * Unsubscribe service.\n     * \n     * Contract for unsubscribing service: &lt;br&gt;\n     * 1. Simply ignore if not subscribe &lt;br&gt;\n     * 2. Unsubscribe with URL exact match &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url URL for unsubscription, null is not allowed, e.g.: consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener notification listener, null is not allowed\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。\n     * Lookup subscription list. Compared to push mode for subscription, this is pull mode and returns result only once.\n     * \n     * <span class=\"hljs-doctag\">@see</span> com.alibaba.dubbo.registry.NotifyListener#notify(List)\n     * <span class=\"hljs-doctag\">@param</span> url URL for  query, null is not allowed, e.g.: consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@return</span> subscription list, could be null, has the same meaning as the parameters in {<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.NotifyListener#notify(List&lt;URL&gt;)}.\n     */</span>\n    <span class=\"hljs-function\">List&lt;URL&gt; <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n}\n</code></pre>\n<p>NotifyListener.java:</p>\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\">NotifyListener</span> </span>{ \n    <span class=\"hljs-comment\">/**\n     * Fire event when receive service change notification.\n     * \n     * Contract for notify: &lt;br&gt;\n     * 1. Always notify with the whole data instead of partial data from the perspective of service interface and data type. In this way, user needs not compare with the previous result. &lt;br&gt;\n     * 2. First notification for subscription must contain the full set of data for one particular service &lt;br&gt;\n     * 3. It is allowed to separate the different type of data in the upcoming notifications, e.g.: it is legal to only notify one of types among providers, consumers, routes or overrides each time, but pls. note for this particular type, the data must be a full set. &lt;br&gt;\n     * 4. If the data for one particular type is empty, need to notify with a special URL which has empty as its protocol and has category parameter for this particluar type.\n     * 5. Notifier (usually it is monitor center) needs to guarantee the notification sequence by, for say: single thread push, queuing in order,  versioning, etc. &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> urls subscription list, always not empty, equivalent to the return result of {<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.RegistryService#lookup(URL)}.\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">notify</span><span class=\"hljs-params\">(List&lt;URL&gt; urls)</span></span>;\n \n}\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.registry.support.dubbo.DubboRegistryFactory</code></p>\n<h2>Extension Guide</h2>\n<p>Directory structure:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRegistryFactoryjava (RegistryFactory implementation)\n                |-XxxRegistry.java (Registry implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.registry.RegistryFactory (plain text file with the content: xxx=com.xxx.XxxRegistryFactory)\n</code></pre>\n<p>XxxRegistryFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.RegistryFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistryFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RegistryFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxRegistry(url);\n    }\n}\n</code></pre>\n<p>XxxRegistry.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.NotifyListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistry</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Registry</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.registry.RegistryFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRegistryFactory</span>\n</code></pre>\n"
+  "__html": "<h1>Registry Extension</h1>\n<h2>Summary</h2>\n<p>Registry extension is used for service registration and discovery.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.registry.RegistryFactory</code></li>\n<li><code>com.alibaba.dubbo.registry.Registry</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- config registry server --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- reference registry server, if registry attribute is not specified, then ApplicationContext will be scanned to find if there's any --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration for referencing registry server, it will take effect if there's no registry attribute specified in &lt;dubbo:service&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>Extension Contract</h2>\n<p>RegistryFactory.java:</p>\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\">RegistryFactory</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * Connect to registry server\n     * \n     * The contract for connecting to registry server: &lt;br&gt;\n     * 1. Will not check connection when check=false is set, otherwise exception will be thrown if connection fails. &lt;br&gt;\n     * 2. Support authorizing against username:password in the URL &lt;br&gt;\n     * 3. Support registry server backup with backup=10.20.153.10 &lt;br&gt;\n     * 4. Support cache on local disk with file=registry.cache &lt;br&gt;\n     * 5. Support timeout setup with timeout=1000 &lt;br&gt;\n     * 6. Support session expiration setup with session=60000 &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url registry server address, null is not allowed\n     * <span class=\"hljs-doctag\">@return</span> reference to registry server, never return null\n     */</span>\n    <span class=\"hljs-function\">Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span></span>; \n}\n</code></pre>\n<p>RegistryService.java:</p>\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\">RegistryService</span> </span>{ <span class=\"hljs-comment\">// Registry extends RegistryService </span>\n    <span class=\"hljs-comment\">/**\n     * Register service.\n     * \n     * Contract for registering service: &lt;br&gt;\n     * 1. Registration failure will be ignored and kept retrying if check=false is set in URL, otherwise exception will be thrown &lt;br&gt;\n     * 2. Persistence is required if dynamic=false is set in URL, otherwise, the registration info will be removed automatically when register quits accidentally &lt;br&gt;\n     * 3. Persistent by category if category=overrides is set in URL, default category is providers. It is possible to notify by category. &lt;br&gt;\n     * 4. Data lost is not tolerant when registry server reboots or network jitter happens. &lt;br&gt; \n     * 5. It is not allowed to override each other when URLs have same URI part but different parameters &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url registration info,null is not allowed, e.g.: dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * Unregister service.\n     * \n     * Contract for unregistering service: &lt;br&gt;\n     * 1. IllegalStateException should be thrown when registration info which's supposed to be persistent (with dynamic=false set) cannot be found, otherwise it should be ignored. &lt;br&gt;\n     * 2. To cancel one service, extract match on its URL will be honored &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url registration info,null is not allowed, e.g.: dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 订阅服务.\n     * Subscribe service.\n     * \n     * Contract for subscribing service: &lt;br&gt;\n     * 1. Subscription failure will be ignored and kept retrying if check=false is set in URL &lt;br&gt;\n     * 2. Only the specified category will be notified if category=overrides is set in URL. Categories are seperated with comma, and all categorized data will be subscribed when wildcard \"*\" is specified. &lt;br&gt;\n     * 3. Allow to query by interface, group, version, classifier, e.g.: interface=com.alibaba.foo.BarService&amp;version=1.0.0&lt;br&gt;\n     * 4. Allow to query with wildcard \"*\" to subscribe all versions under all categories for all interfaces, e.g.: interface=*&amp;group=*&amp;version=*&amp;classifier=*&lt;br&gt;\n     * 5. Subscription will be automatically recoverred when registry server reboots or network jitter happens. &lt;br&gt;\n     * 6. It is not allowed to override each other when URLs have same URI part but different parameters &lt;br&gt;\n     * 7. Subscription procedure will not return until the first notification happens. &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url URL for subscription, null isn't allowed, e.g.: consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener notification listener, null is not allowed\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * Unsubscribe service.\n     * \n     * Contract for unsubscribing service: &lt;br&gt;\n     * 1. Simply ignore if not subscribe &lt;br&gt;\n     * 2. Unsubscribe with URL exact match &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url URL for unsubscription, null is not allowed, e.g.: consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener notification listener, null is not allowed\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。\n     * Lookup subscription list. Compared to push mode for subscription, this is pull mode and returns result only once.\n     * \n     * <span class=\"hljs-doctag\">@see</span> com.alibaba.dubbo.registry.NotifyListener#notify(List)\n     * <span class=\"hljs-doctag\">@param</span> url URL for  query, null is not allowed, e.g.: consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@return</span> subscription list, could be null, has the same meaning as the parameters in {<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.NotifyListener#notify(List&lt;URL&gt;)}.\n     */</span>\n    <span class=\"hljs-function\">List&lt;URL&gt; <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n}\n</code></pre>\n<p>NotifyListener.java:</p>\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\">NotifyListener</span> </span>{ \n    <span class=\"hljs-comment\">/**\n     * Fire event when receive service change notification.\n     * \n     * Contract for notify: &lt;br&gt;\n     * 1. Always notify with the whole data instead of partial data from the perspective of service interface and data type. In this way, user needs not compare with the previous result. &lt;br&gt;\n     * 2. First notification for subscription must contain the full set of data for one particular service &lt;br&gt;\n     * 3. It is allowed to separate the different type of data in the upcoming notifications, e.g.: it is legal to only notify one of types among providers, consumers, routes or overrides each time, but pls. note for this particular type, the data must be a full set. &lt;br&gt;\n     * 4. If the data for one particular type is empty, need to notify with a special URL which has empty as its protocol and has category parameter for this particluar type.\n     * 5. Notifier (usually it is monitor center) needs to guarantee the notification sequence by, for say: single thread push, queuing in order,  versioning, etc. &lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> urls subscription list, always not empty, equivalent to the return result of {<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.RegistryService#lookup(URL)}.\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">notify</span><span class=\"hljs-params\">(List&lt;URL&gt; urls)</span></span>;\n \n}\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.registry.support.dubbo.DubboRegistryFactory</code></p>\n<h2>Extension Guide</h2>\n<p>Directory structure:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRegistryFactoryjava (RegistryFactory implementation)\n                |-XxxRegistry.java (Registry implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.registry.RegistryFactory (plain text file with the content: xxx=com.xxx.XxxRegistryFactory)\n</code></pre>\n<p>XxxRegistryFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.RegistryFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistryFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RegistryFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxRegistry(url);\n    }\n}\n</code></pre>\n<p>XxxRegistry.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.NotifyListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistry</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Registry</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.registry.RegistryFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRegistryFactory</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/registry.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/remoting.json b/en-us/docs/dev/impls/remoting.json
index 260281b3..4c1ceac2 100644
--- a/en-us/docs/dev/impls/remoting.json
+++ b/en-us/docs/dev/impls/remoting.json
@@ -1,4 +1,6 @@
 {
   "filename": "remoting.md",
-  "__html": "<h1>Transporter Extension</h1>\n<h2>Summary</h2>\n<p>Transportation extension for communication between server and client.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.Transporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.Server</code></li>\n<li><code>com.alibaba.dubbo.remoting.Client</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- server and client use the same transporter --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- server and client use the different transporter --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect when transport/server/client attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.netty.NettyTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.mina.MinaTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.grizzly.GrizzlyTransporter</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTransporter.java (Transporter implementation)\n                |-XxxServer.java (Server implementation)\n                |-XxxClient.java (Client implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Transporter (plain text file with the content: xxx=com.xxx.XxxTransporter)\n</code></pre>\n<p>XxxTransporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Transporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTransporter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Transporter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxServer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServer</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractServer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Collection&lt;Channel&gt; <span class=\"hljs-title\">getChannels</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">(InetSocketAddress remoteAddress)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxClient</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractClient</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doConnect</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Transporter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTransporter</span>\n</code></pre>\n"
+  "__html": "<h1>Transporter Extension</h1>\n<h2>Summary</h2>\n<p>Transportation extension for communication between server and client.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.Transporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.Server</code></li>\n<li><code>com.alibaba.dubbo.remoting.Client</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- server and client use the same transporter --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- server and client use the different transporter --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect when transport/server/client attribute is not set in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.netty.NettyTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.mina.MinaTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.grizzly.GrizzlyTransporter</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTransporter.java (Transporter implementation)\n                |-XxxServer.java (Server implementation)\n                |-XxxClient.java (Client implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Transporter (plain text file with the content: xxx=com.xxx.XxxTransporter)\n</code></pre>\n<p>XxxTransporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Transporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTransporter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Transporter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxServer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServer</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractServer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Collection&lt;Channel&gt; <span class=\"hljs-title\">getChannels</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">(InetSocketAddress remoteAddress)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxClient</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractClient</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doConnect</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Transporter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTransporter</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/remoting.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/router.json b/en-us/docs/dev/impls/router.json
index ee3c9699..73300f54 100644
--- a/en-us/docs/dev/impls/router.json
+++ b/en-us/docs/dev/impls/router.json
@@ -1,4 +1,6 @@
 {
   "filename": "router.md",
-  "__html": "<h1>Router Extension</h1>\n<h2>Summary</h2>\n<p>Pick one from service providers and fire the invocation.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.RouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.Router</code></li>\n</ul>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.ScriptRouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.FileRouterFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRouterFactory.java (LoadBalance implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.RouterFactory (plain text file with the content: xxx=com.xxx.XxxRouterFactory)\n\n</code></pre>\n<p>XxxRouterFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.RouterFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRouterFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RouterFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; List&lt;Invoker&lt;T&gt;&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation) <span class=\"hljs-keyword\">throws</span> RpcException {\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.RouterFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRouterFactory</span>\n</code></pre>\n"
+  "__html": "<h1>Router Extension</h1>\n<h2>Summary</h2>\n<p>Pick one from service providers and fire the invocation.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.RouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.Router</code></li>\n</ul>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.ScriptRouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.FileRouterFactory</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRouterFactory.java (LoadBalance implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.RouterFactory (plain text file with the content: xxx=com.xxx.XxxRouterFactory)\n\n</code></pre>\n<p>XxxRouterFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.RouterFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRouterFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RouterFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; List&lt;Invoker&lt;T&gt;&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation) <span class=\"hljs-keyword\">throws</span> RpcException {\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.RouterFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRouterFactory</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/router.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/serialize.json b/en-us/docs/dev/impls/serialize.json
index 088f47e3..bba59d71 100644
--- a/en-us/docs/dev/impls/serialize.json
+++ b/en-us/docs/dev/impls/serialize.json
@@ -1,4 +1,6 @@
 {
   "filename": "serialize.md",
-  "__html": "<h1>Serialization Extension</h1>\n<h2>Summary</h2>\n<p>Extension to serializing java object into byte code stream for transporting on the network, and vise versa.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectInput</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectOutput</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- protocol serialization style --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if serialization is not configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.dubbo.DubboSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.hessian.Hessian2Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.JavaSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.CompactedJavaSerialization</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxSerialization.java (Serialization implementation)\n                |-XxxObjectInput.java (ObjectInput implementation)\n                |-XxxObjectOutput.java (ObjectOutput implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.serialize.Serialization (plain text file with the content: xxx=com.xxx.XxxSerialization)\n</code></pre>\n<p>XxxSerialization.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.Serialization;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectInput;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectOutput;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxSerialization</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serialization</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectOutput <span class=\"hljs-title\">serialize</span><span class=\"hljs-params\">(Parameters parameters, OutputStream output)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectOutput(output);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectInput <span class=\"hljs-title\">deserialize</span><span class=\"hljs-params\">(Parameters parameters, InputStream input)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectInput(input);\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.serialize.Serialization:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxSerialization</span>\n</code></pre>\n"
+  "__html": "<h1>Serialization Extension</h1>\n<h2>Summary</h2>\n<p>Extension to serializing java object into byte code stream for transporting on the network, and vise versa.</p>\n<h2>Extension Interface</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectInput</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectOutput</code></li>\n</ul>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- protocol serialization style --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if serialization is not configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.dubbo.DubboSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.hessian.Hessian2Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.JavaSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.CompactedJavaSerialization</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxSerialization.java (Serialization implementation)\n                |-XxxObjectInput.java (ObjectInput implementation)\n                |-XxxObjectOutput.java (ObjectOutput implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.serialize.Serialization (plain text file with the content: xxx=com.xxx.XxxSerialization)\n</code></pre>\n<p>XxxSerialization.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.Serialization;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectInput;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectOutput;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxSerialization</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serialization</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectOutput <span class=\"hljs-title\">serialize</span><span class=\"hljs-params\">(Parameters parameters, OutputStream output)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectOutput(output);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectInput <span class=\"hljs-title\">deserialize</span><span class=\"hljs-params\">(Parameters parameters, InputStream input)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectInput(input);\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.serialize.Serialization:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxSerialization</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/serialize.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/status-checker.json b/en-us/docs/dev/impls/status-checker.json
index c73dcaa1..4a1a6182 100644
--- a/en-us/docs/dev/impls/status-checker.json
+++ b/en-us/docs/dev/impls/status-checker.json
@@ -1,4 +1,6 @@
 {
   "filename": "status-checker.md",
-  "__html": "<h1>StatusChecker Extension</h1>\n<h2>Summary</h2>\n<p>Extension to check status of resources service depends on. This status checker can be used in both telnet status command and status page.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.status.StatusChecker</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if no status attribute is configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.status.support.MemoryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.common.status.support.LoadStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ServerStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ThreadPoolStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.registry.directory.RegistryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.SpringStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.DataSourceStatusChecker</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxStatusChecker.java (StatusChecker implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.status.StatusChecker (plain text file with the content: xxx=com.xxx.XxxStatusChecker)\n</code></pre>\n<p>XxxStatusChecker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.status.StatusChecker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxStatusChecker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">StatusChecker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">check</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.status.StatusChecker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxStatusChecker</span>\n</code></pre>\n"
+  "__html": "<h1>StatusChecker Extension</h1>\n<h2>Summary</h2>\n<p>Extension to check status of resources service depends on. This status checker can be used in both telnet status command and status page.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.status.StatusChecker</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if no status attribute is configured in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.status.support.MemoryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.common.status.support.LoadStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ServerStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ThreadPoolStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.registry.directory.RegistryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.SpringStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.DataSourceStatusChecker</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxStatusChecker.java (StatusChecker implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.status.StatusChecker (plain text file with the content: xxx=com.xxx.XxxStatusChecker)\n</code></pre>\n<p>XxxStatusChecker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.status.StatusChecker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxStatusChecker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">StatusChecker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">check</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.status.StatusChecker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxStatusChecker</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/status-checker.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/telnet-handler.json b/en-us/docs/dev/impls/telnet-handler.json
index 438a2d22..fa7a17eb 100644
--- a/en-us/docs/dev/impls/telnet-handler.json
+++ b/en-us/docs/dev/impls/telnet-handler.json
@@ -1,4 +1,6 @@
 {
   "filename": "telnet-handler.md",
-  "__html": "<h1>TelnetHandler Extension</h1>\n<h2>Summary</h2>\n<p>Extension to telnet command. All server should support telnet access for operation convenience.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.remoting.telnet.TelnetHandler</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if telnet attribute is not specified in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ClearTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ExitTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.HelpTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.StatusTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ListTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ChangeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CurrentTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.InvokeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.TraceTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CountTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.PortTelnetHandler</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTelnetHandler.java (TelnetHandler implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.telnet.TelnetHandler (plain text file with the content: xxx=com.xxx.XxxTelnetHandler)\n</code></pre>\n<p>XxxTelnetHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.telnet.TelnetHandler;\n \n<span class=\"hljs-meta\">@Help</span>(parameter=<span class=\"hljs-string\">\"...\"</span>, summary=<span class=\"hljs-string\">\"...\"</span>, detail=<span class=\"hljs-string\">\"...\"</span>)\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTelnetHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">TelnetHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">telnet</span><span class=\"hljs-params\">(Channel channel, String message)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.telnet.TelnetHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTelnetHandler</span>\n</code></pre>\n<h2>用法</h2>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 20880\ndubbo&gt; xxx args\n</code></pre>\n"
+  "__html": "<h1>TelnetHandler Extension</h1>\n<h2>Summary</h2>\n<p>Extension to telnet command. All server should support telnet access for operation convenience.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.remoting.telnet.TelnetHandler</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, will take effect if telnet attribute is not specified in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ClearTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ExitTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.HelpTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.StatusTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ListTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ChangeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CurrentTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.InvokeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.TraceTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CountTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.PortTelnetHandler</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTelnetHandler.java (TelnetHandler implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.telnet.TelnetHandler (plain text file with the content: xxx=com.xxx.XxxTelnetHandler)\n</code></pre>\n<p>XxxTelnetHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.telnet.TelnetHandler;\n \n<span class=\"hljs-meta\">@Help</span>(parameter=<span class=\"hljs-string\">\"...\"</span>, summary=<span class=\"hljs-string\">\"...\"</span>, detail=<span class=\"hljs-string\">\"...\"</span>)\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTelnetHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">TelnetHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">telnet</span><span class=\"hljs-params\">(Channel channel, String message)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.telnet.TelnetHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTelnetHandler</span>\n</code></pre>\n<h2>用法</h2>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 20880\ndubbo&gt; xxx args\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/telnet-handler.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/threadpool.json b/en-us/docs/dev/impls/threadpool.json
index eeb4c06f..83c0b9c2 100644
--- a/en-us/docs/dev/impls/threadpool.json
+++ b/en-us/docs/dev/impls/threadpool.json
@@ -1,4 +1,6 @@
 {
   "filename": "threadpool.md",
-  "__html": "<h1>ThreadPool Extension</h1>\n<h2>Summary</h2>\n<p>Thread pool strategy extension for service provider. When server receives one request, it needs a thread from thread pool to execute business logic in service provider.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.threadpool.ThreadPool</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it will take effect when threadpool attribute is not specified in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.threadpool.FixedThreadPool</code></li>\n<li><code>com.alibaba.dubbo.common.threadpool.CachedThreadPool</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxThreadPool.java (ThreadPool implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.threadpool.ThreadPool (plain text file with the content: xxx=com.xxx.XxxThreadPool)\n</code></pre>\n<p>XxxThreadPool.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.threadpool.ThreadPool;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.Executor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxThreadPool</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ThreadPool</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Executor <span class=\"hljs-title\">getExecutor</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.threadpool.ThreadPool:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxThreadPool</span>\n</code></pre>\n"
+  "__html": "<h1>ThreadPool Extension</h1>\n<h2>Summary</h2>\n<p>Thread pool strategy extension for service provider. When server receives one request, it needs a thread from thread pool to execute business logic in service provider.</p>\n<h2>Extension Interface</h2>\n<p><code>com.alibaba.dubbo.common.threadpool.ThreadPool</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it will take effect when threadpool attribute is not specified in &lt;dubbo:protocol&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.threadpool.FixedThreadPool</code></li>\n<li><code>com.alibaba.dubbo.common.threadpool.CachedThreadPool</code></li>\n</ul>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxThreadPool.java (ThreadPool implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.threadpool.ThreadPool (plain text file with the content: xxx=com.xxx.XxxThreadPool)\n</code></pre>\n<p>XxxThreadPool.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.threadpool.ThreadPool;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.Executor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxThreadPool</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ThreadPool</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Executor <span class=\"hljs-title\">getExecutor</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.threadpool.ThreadPool:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxThreadPool</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/threadpool.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/impls/validation.json b/en-us/docs/dev/impls/validation.json
index 60cb5fcb..57102e2b 100644
--- a/en-us/docs/dev/impls/validation.json
+++ b/en-us/docs/dev/impls/validation.json
@@ -1,4 +1,6 @@
 {
   "filename": "validation.md",
-  "__html": "<h1>Validation Extension</h1>\n<h2>Summary</h2>\n<p>Extension for parameter validation.</p>\n<h2>Extension Inteface</h2>\n<p><code>com.alibaba.dubbo.validation.Validation</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it will take effect when there's no validation attribute specified in &lt;dubbo:service&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.validation.support.jvalidation.JValidation</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxValidation.java (Validation implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.validation.Validation (plain text file with the content: xxx=com.xxx.XxxValidation)\n</code></pre>\n<p>XxxValidation.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validation;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidation</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validation</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxValidator.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validator;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidator</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validator</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">validate</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.validation.Validation:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxValidation</span>\n</code></pre>\n"
+  "__html": "<h1>Validation Extension</h1>\n<h2>Summary</h2>\n<p>Extension for parameter validation.</p>\n<h2>Extension Inteface</h2>\n<p><code>com.alibaba.dubbo.validation.Validation</code></p>\n<h2>Extension Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- default configuration, it will take effect when there's no validation attribute specified in &lt;dubbo:service&gt; --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>Existing Extension</h2>\n<p><code>com.alibaba.dubbo.validation.support.jvalidation.JValidation</code></p>\n<h2>Extension Guide</h2>\n<p>Directory layout:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxValidation.java (Validation implementation)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.validation.Validation (plain text file with the content: xxx=com.xxx.XxxValidation)\n</code></pre>\n<p>XxxValidation.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validation;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidation</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validation</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxValidator.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validator;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidator</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validator</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">validate</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.validation.Validation:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxValidation</span>\n</code></pre>\n",
+  "link": "/en-us/docs/dev/impls/validation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/introduction.json b/en-us/docs/dev/introduction.json
index 78764a95..7235c07f 100644
--- a/en-us/docs/dev/introduction.json
+++ b/en-us/docs/dev/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": ""
+  "__html": "",
+  "link": "/en-us/docs/dev/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/release.json b/en-us/docs/dev/release.json
index 2f86e433..463c963b 100644
--- a/en-us/docs/dev/release.json
+++ b/en-us/docs/dev/release.json
@@ -1,4 +1,6 @@
 {
   "filename": "release.md",
-  "__html": "<h1>Versions</h1>\n<p><strong>New feature development</strong> and <strong>stability improvement</strong> are equally important to product. But adding new features will affect stability, dubbo uses the following version development pattern to achieve a good balance.</p>\n<h2>Two versions evolving at the same time</h2>\n<ul>\n<li>BugFix Version:low version,e.g. <code>2.4.x</code>. This is called the GA version, which can be applied in production. We are supposed only to fix bugs in this version, and increase the third version number when release.</li>\n<li>Feature Version:high version, e.g. <code>2.5.x</code>. We add new features to this version, so applications have opportunities try new features.</li>\n</ul>\n<p>When features in <code>2.5.x</code> are proved stable enough, we will announce <code>2.5.x</code> as a beta release.</p>\n<p>When <code>2.5.x</code> proved stable after enough test on enough applications:</p>\n<ul>\n<li><code>2.5.x</code>, the GA Version, only do BugFix, the main version to be used. We can try to promote applications to upgrade to GA at the desired time.</li>\n<li><code>2.4.x</code>, no longer maintained. When bugs appear, applications have no choice but upgrade to the latest stable version- Sunset Clause</li>\n<li>We create a new branch <code>2.6.0</code> based on <code>2.5.x</code> for new features.</li>\n</ul>\n<h2>Pros</h2>\n<ul>\n<li>GA Version are promised stable:\n<ul>\n<li>only BugFix</li>\n<li>GA Version got enough tests before promotion</li>\n</ul>\n</li>\n<li>New features can respond quickly in Feature Version and allow applications to try that</li>\n<li>Significantly reduces development and maintenance costs</li>\n</ul>\n<h2>The responsibilities of users</h2>\n<p>Users should always keep in track with the GA Version, make sure all bugs were fixed.</p>\n<p>There is a fake proposition: regular upgrades bring more risks. Here's the reasons:</p>\n<ul>\n<li>GA remains stable after a trial period.</li>\n<li>Bugs find on GA will be fixed immediately.</li>\n<li>Comparing with the on-need-upgrade (only upgrade when find a serious problem, and may span multiple versions), upgrade periodically can flat risk. Experienced a long cycle of large projects, students will have such an experience, the tripartite library version does not upgrade for a long time, the result of the problem had to upgrade to the new version (across multiple versions) a huge risk.</li>\n</ul>\n"
+  "__html": "<h1>Versions</h1>\n<p><strong>New feature development</strong> and <strong>stability improvement</strong> are equally important to product. But adding new features will affect stability, dubbo uses the following version development pattern to achieve a good balance.</p>\n<h2>Two versions evolving at the same time</h2>\n<ul>\n<li>BugFix Version:low version,e.g. <code>2.4.x</code>. This is called the GA version, which can be applied in production. We are supposed only to fix bugs in this version, and increase the third version number when release.</li>\n<li>Feature Version:high version, e.g. <code>2.5.x</code>. We add new features to this version, so applications have opportunities try new features.</li>\n</ul>\n<p>When features in <code>2.5.x</code> are proved stable enough, we will announce <code>2.5.x</code> as a beta release.</p>\n<p>When <code>2.5.x</code> proved stable after enough test on enough applications:</p>\n<ul>\n<li><code>2.5.x</code>, the GA Version, only do BugFix, the main version to be used. We can try to promote applications to upgrade to GA at the desired time.</li>\n<li><code>2.4.x</code>, no longer maintained. When bugs appear, applications have no choice but upgrade to the latest stable version- Sunset Clause</li>\n<li>We create a new branch <code>2.6.0</code> based on <code>2.5.x</code> for new features.</li>\n</ul>\n<h2>Pros</h2>\n<ul>\n<li>GA Version are promised stable:\n<ul>\n<li>only BugFix</li>\n<li>GA Version got enough tests before promotion</li>\n</ul>\n</li>\n<li>New features can respond quickly in Feature Version and allow applications to try that</li>\n<li>Significantly reduces development and maintenance costs</li>\n</ul>\n<h2>The responsibilities of users</h2>\n<p>Users should always keep in track with the GA Version, make sure all bugs were fixed.</p>\n<p>There is a fake proposition: regular upgrades bring more risks. Here's the reasons:</p>\n<ul>\n<li>GA remains stable after a trial period.</li>\n<li>Bugs find on GA will be fixed immediately.</li>\n<li>Comparing with the on-need-upgrade (only upgrade when find a serious problem, and may span multiple versions), upgrade periodically can flat risk. Experienced a long cycle of large projects, students will have such an experience, the tripartite library version does not upgrade for a long time, the result of the problem had to upgrade to the new version (across multiple versions) a huge risk.</li>\n</ul>\n",
+  "link": "/en-us/docs/dev/release.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/label-an-issue-guide.html b/en-us/docs/developers/committer-guide/label-an-issue-guide.html
new file mode 100644
index 00000000..615bbeb9
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue-guide.html
@@ -0,0 +1,73 @@
+<!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="label-an-issue-guide" />
+	<meta name="description" content="label-an-issue-guide" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Label an Issue</h1>
+<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>
+<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href="https://github.com/apache/incubator-dubbo/milestones">milestone</a></strong>.</p>
+<p>Some frequently used labels:</p>
+<ul>
+<li>
+<p>Help Wanted</p>
+<ul>
+<li>help wanted</li>
+<li>good first issue</li>
+</ul>
+</li>
+<li>
+<p>Prority</p>
+<ul>
+<li>priority/blocker</li>
+<li>priority/high</li>
+<li>priority/low</li>
+<li>priority/normal</li>
+</ul>
+</li>
+<li>
+<p>Status</p>
+<ul>
+<li>status/need-triage</li>
+<li>status/DO-NOT-MERGE</li>
+<li>status/READY-TO-MERGE</li>
+<li>status/invalid</li>
+<li>status/wontfix</li>
+</ul>
+</li>
+<li>
+<p>Type</p>
+<ul>
+<li>type/bug</li>
+<li>type/documentation</li>
+<li>type/enhancement</li>
+<li>type/feature</li>
+</ul>
+</li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/label-an-issue-guide.json b/en-us/docs/developers/committer-guide/label-an-issue-guide.json
new file mode 100644
index 00000000..2b883d74
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue-guide.md",
+  "__html": "<h1>Label an Issue</h1>\n<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>\n<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href=\"https://github.com/apache/incubator-dubbo/milestones\">milestone</a></strong>.</p>\n<p>Some frequently used labels:</p>\n<ul>\n<li>\n<p>Help Wanted</p>\n<ul>\n<li>help wanted</li>\n<li>good first issue</li>\n</ul>\n</li>\n<li>\n<p>Prority</p>\n<ul>\n<li>priority/blocker</li>\n<li>priority/high</li>\n<li>priority/low</li>\n<li>priority/normal</li>\n</ul>\n</li>\n<li>\n<p>Status</p>\n<ul>\n<li>status/need-triage</li>\n<li>status/DO-NOT-MERGE</li>\n<li>status/READY-TO-MERGE</li>\n<li>status/invalid</li>\n<li>status/wontfix</li>\n</ul>\n</li>\n<li>\n<p>Type</p>\n<ul>\n<li>type/bug</li>\n<li>type/documentation</li>\n<li>type/enhancement</li>\n<li>type/feature</li>\n</ul>\n</li>\n</ul>\n",
+  "link": "/en-us/docs/developers/committer-guide/label-an-issue-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html b/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html
new file mode 100644
index 00000000..5bd8f347
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html
@@ -0,0 +1,73 @@
+<!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="label-an-issue-guide_dev" />
+	<meta name="description" content="label-an-issue-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Label an Issue</h1>
+<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>
+<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href="https://github.com/apache/incubator-dubbo/milestones">milestone</a></strong>.</p>
+<p>Some frequently used labels:</p>
+<ul>
+<li>
+<p>Help Wanted</p>
+<ul>
+<li>help wanted</li>
+<li>good first issue</li>
+</ul>
+</li>
+<li>
+<p>Prority</p>
+<ul>
+<li>priority/blocker</li>
+<li>priority/high</li>
+<li>priority/low</li>
+<li>priority/normal</li>
+</ul>
+</li>
+<li>
+<p>Status</p>
+<ul>
+<li>status/need-triage</li>
+<li>status/DO-NOT-MERGE</li>
+<li>status/READY-TO-MERGE</li>
+<li>status/invalid</li>
+<li>status/wontfix</li>
+</ul>
+</li>
+<li>
+<p>Type</p>
+<ul>
+<li>type/bug</li>
+<li>type/documentation</li>
+<li>type/enhancement</li>
+<li>type/feature</li>
+</ul>
+</li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.json b/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.json
new file mode 100644
index 00000000..57d40c6c
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue-guide_dev.md",
+  "__html": "<h1>Label an Issue</h1>\n<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>\n<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href=\"https://github.com/apache/incubator-dubbo/milestones\">milestone</a></strong>.</p>\n<p>Some frequently used labels:</p>\n<ul>\n<li>\n<p>Help Wanted</p>\n<ul>\n<li>help wanted</li>\n<li>good first issue</li>\n</ul>\n</li>\n<li>\n<p>Prority</p>\n<ul>\n<li>priority/blocker</li>\n<li>priority/high</li>\n<li>priority/low</li>\n<li>priority/normal</li>\n</ul>\n</li>\n<li>\n<p>Status</p>\n<ul>\n<li>status/need-triage</li>\n<li>status/DO-NOT-MERGE</li>\n<li>status/READY-TO-MERGE</li>\n<li>status/invalid</li>\n<li>status/wontfix</li>\n</ul>\n</li>\n<li>\n<p>Type</p>\n<ul>\n<li>type/bug</li>\n<li>type/documentation</li>\n<li>type/enhancement</li>\n<li>type/feature</li>\n</ul>\n</li>\n</ul>\n",
+  "link": "/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/label-an-issue.html b/en-us/docs/developers/committer-guide/label-an-issue.html
new file mode 100644
index 00000000..778c1b22
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue.html
@@ -0,0 +1,73 @@
+<!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="label-an-issue" />
+	<meta name="description" content="label-an-issue" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Label an Issue</h1>
+<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>
+<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href="https://github.com/apache/incubator-dubbo/milestones">milestone</a></strong>.</p>
+<p>Some frequently used labels:</p>
+<ul>
+<li>
+<p>Help Wanted</p>
+<ul>
+<li>help wanted</li>
+<li>good first issue</li>
+</ul>
+</li>
+<li>
+<p>Prority</p>
+<ul>
+<li>priority/blocker</li>
+<li>priority/high</li>
+<li>priority/low</li>
+<li>priority/normal</li>
+</ul>
+</li>
+<li>
+<p>Status</p>
+<ul>
+<li>status/need-triage</li>
+<li>status/DO-NOT-MERGE</li>
+<li>status/READY-TO-MERGE</li>
+<li>status/invalid</li>
+<li>status/wontfix</li>
+</ul>
+</li>
+<li>
+<p>Type</p>
+<ul>
+<li>type/bug</li>
+<li>type/documentation</li>
+<li>type/enhancement</li>
+<li>type/feature</li>
+</ul>
+</li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/label-an-issue.json b/en-us/docs/developers/committer-guide/label-an-issue.json
new file mode 100644
index 00000000..7a5918d7
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue.md",
+  "__html": "<h1>Label an Issue</h1>\n<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>\n<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href=\"https://github.com/apache/incubator-dubbo/milestones\">milestone</a></strong>.</p>\n<p>Some frequently used labels:</p>\n<ul>\n<li>\n<p>Help Wanted</p>\n<ul>\n<li>help wanted</li>\n<li>good first issue</li>\n</ul>\n</li>\n<li>\n<p>Prority</p>\n<ul>\n<li>priority/blocker</li>\n<li>priority/high</li>\n<li>priority/low</li>\n<li>priority/normal</li>\n</ul>\n</li>\n<li>\n<p>Status</p>\n<ul>\n<li>status/need-triage</li>\n<li>status/DO-NOT-MERGE</li>\n<li>status/READY-TO-MERGE</li>\n<li>status/invalid</li>\n<li>status/wontfix</li>\n</ul>\n</li>\n<li>\n<p>Type</p>\n<ul>\n<li>type/bug</li>\n<li>type/documentation</li>\n<li>type/enhancement</li>\n<li>type/feature</li>\n</ul>\n</li>\n</ul>\n",
+  "link": "/en-us/docs/developers/committer-guide/label-an-issue.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/label-an-issue_dev.html b/en-us/docs/developers/committer-guide/label-an-issue_dev.html
new file mode 100644
index 00000000..cb6a0872
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue_dev.html
@@ -0,0 +1,73 @@
+<!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="label-an-issue_dev" />
+	<meta name="description" content="label-an-issue_dev" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Label an Issue</h1>
+<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>
+<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href="https://github.com/apache/incubator-dubbo/milestones">milestone</a></strong>.</p>
+<p>Some frequently used labels:</p>
+<ul>
+<li>
+<p>Help Wanted</p>
+<ul>
+<li>help wanted</li>
+<li>good first issue</li>
+</ul>
+</li>
+<li>
+<p>Prority</p>
+<ul>
+<li>priority/blocker</li>
+<li>priority/high</li>
+<li>priority/low</li>
+<li>priority/normal</li>
+</ul>
+</li>
+<li>
+<p>Status</p>
+<ul>
+<li>status/need-triage</li>
+<li>status/DO-NOT-MERGE</li>
+<li>status/READY-TO-MERGE</li>
+<li>status/invalid</li>
+<li>status/wontfix</li>
+</ul>
+</li>
+<li>
+<p>Type</p>
+<ul>
+<li>type/bug</li>
+<li>type/documentation</li>
+<li>type/enhancement</li>
+<li>type/feature</li>
+</ul>
+</li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/label-an-issue_dev.json b/en-us/docs/developers/committer-guide/label-an-issue_dev.json
new file mode 100644
index 00000000..38bf200c
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/label-an-issue_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue_dev.md",
+  "__html": "<h1>Label an Issue</h1>\n<p>If you are handling an issue, remember to <strong>mark the issue cearly with one or more labels</strong> whenever you think it's meaningful. With labels on, other developers can easily recognize problems, classify them or track progress.</p>\n<p>For issues or pull requests that need coding and further version release to fix, you should always <strong>mark it with a <a href=\"https://github.com/apache/incubator-dubbo/milestones\">milestone</a></strong>.</p>\n<p>Some frequently used labels:</p>\n<ul>\n<li>\n<p>Help Wanted</p>\n<ul>\n<li>help wanted</li>\n<li>good first issue</li>\n</ul>\n</li>\n<li>\n<p>Prority</p>\n<ul>\n<li>priority/blocker</li>\n<li>priority/high</li>\n<li>priority/low</li>\n<li>priority/normal</li>\n</ul>\n</li>\n<li>\n<p>Status</p>\n<ul>\n<li>status/need-triage</li>\n<li>status/DO-NOT-MERGE</li>\n<li>status/READY-TO-MERGE</li>\n<li>status/invalid</li>\n<li>status/wontfix</li>\n</ul>\n</li>\n<li>\n<p>Type</p>\n<ul>\n<li>type/bug</li>\n<li>type/documentation</li>\n<li>type/enhancement</li>\n<li>type/feature</li>\n</ul>\n</li>\n</ul>\n",
+  "link": "/en-us/docs/developers/committer-guide/label-an-issue_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/new-committer-guide.html b/en-us/docs/developers/committer-guide/new-committer-guide.html
new file mode 100644
index 00000000..3bd7580d
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/new-committer-guide.html
@@ -0,0 +1,116 @@
+<!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="new-committer-guide" />
+	<meta name="description" content="new-committer-guide" />
+	<!-- 网页标签标题 -->
+	<title>new-committer-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Apache Committer Guide</h1>
+<h2>First: How to become a committer</h2>
+<h3>Initial committers at the project incubator stage</h3>
+<p>At the project incubator stage, there will be an initial committers list in the proposal of the incubator project. Confirm that you are one of the initial committers. After the vote is passed in the Apache incubator community, these committers can start preparing their account. See <a href="https://wiki.apache.org/incubator/">incubator wiki</a> for details.</p>
+<h3>The active contributor is elected as a committer</h3>
+<p>At the late development stage, an active contributor can be elected as a committer. See <a href="https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer">how to become a committer</a></p>
+<h2>Second: The individual contributor signs ICLA</h2>
+<h3>1, Apache ID</h3>
+<p>Choose a Apache ID not in the <a href="http://people.apache.org/committer-index.html">apache committers list page</a>.</p>
+<h3>2, Individual Contributor License Agreement  (ICLA):</h3>
+<p>Download the <a href="https://www.apache.org/licenses/icla.pdf">ICLA template</a>. After filling the icla.pdf with personal information correctly, print, sign, scan, and send it in mail as an attachment to the secretary <a href="mailto:secretary@apache.org">secretary@apache.org</a>, the secretary will help to create the Apache user ID. At the same time, a <a href="mailto:your-id@apache.org">your-id@apache.org</a> mailbox will be created. You can see if the user has been created on the [apache committers list page (<a href="http://people.apache.org/committer-index.html">http://people.apache.org/committer-index.html</a>).</p>
+<h2>Third: Join The Apache Developer Group</h2>
+<ul>
+<li>
+<p>1, login via the <a href="https://id.apache.org/">Apache account tool</a>, when you login at the first time, you can select the &quot;Change password?&quot; checkbox  to get the initial password. Then the initial password will be sent to the forward mailbox (the developer mail recorded in the project incubator proposal)</p>
+</li>
+<li>
+<p>2, about Apache mailbox: does not have its own mail content storage server. It needs to borrow the mail content storage and mail sending functions of other mail providers. In many voting sessions, Apache mailbox is recommended.</p>
+</li>
+</ul>
+<p>There is a question about how to configure the <a href="http://apache.org">apache.org</a> mailbox forwarding function using other mailboxes.</p>
+<ol>
+<li>
+<p>inbox: to receive mails that sent to <a href="mailto:youer-id@apache.org">youer-id@apache.org</a> mailbox. The forward mailbox configured in the Apache account tool in the first step can use the forward mailbox to pick up incoming mail.</p>
+</li>
+<li>
+<p>the Outbox: emails sent out will show the sender as  <a href="mailto:your-id@apache.org">your-id@apache.org</a> account. Please refer to: <a href="https://reference.apache.org/committer/email">set up Apache mailbox guide</a> and <a href="http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html">Gmail mailbox setting</a>. In other mailbox service settings, this forwarding mode is not easy to find. Gmail is the most convenient, which is recommended  (no advertising).</p>
+</li>
+</ol>
+<ul>
+<li>
+<p>3, Modify the homepage URL option in the edit page, homepage link of  your account can be added in <a href="http://people.apache.org/committer-index.html">apache committer index page</a></p>
+</li>
+<li>
+<p>4, Modify the GitHub account in the edit page, and an email will be sent to invite you to join the <a href="http://github.com/apache-commiiters">github.com/apache-commiiters</a> group. Now, please learn from the way <a href="http://www.apache.org/foundation/how-it-works.html#developers">ASF works</a> to do some basic preparation of ASF development.</p>
+</li>
+</ul>
+<h2>Fourth: To obtain write permission of the project</h2>
+<p>Operation of the <a href="https://gitbox.apache.org/setup/">GitBox account link tool</a></p>
+<h3>1, Apache account authorization</h3>
+<p>According to the prompt, the OAuth protocol of Apache account is authorized to login.</p>
+<h3>2, Github account authorization</h3>
+<p>According to the prompt, the OAuth protocol of Github account is authorized to login.</p>
+<h3>3, Set up GitHub account in <a href="http://github.com">github.com</a>, two-factors authorization (2FA)</h3>
+<ul>
+<li>
+<ol>
+<li>install &quot;Google Authenticator&quot; app on your cell phone</li>
+</ol>
+</li>
+<li>2), Following the <a href="https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/">authorized GitHub 2FA wiki</a>,  you can operation step by step .</li>
+</ul>
+<p>In the <a href="https://github.com/settings/two_factor_authentication/verify">two-factors authorization authentication (2. Scan this barcode with your app.)</a> page, it is not recommended to select a two-dimensional code with a cell phone, because some of the cell phones will not be able to scan.</p>
+<p>Please open the cell phone &quot;Google Authenticator&quot; app, click &quot;+&quot; to select &quot;input the secret key&quot;: write the GitHub account in the account name input box. In your &quot;secret key&quot; input box, write the text of the &quot;enter this text code&quot; link in the open web page. After clicking &quot;add&quot; in app, 6 digit dynamic will be generated for this account. Write the 6 digit number to the text box in the web page, and then click &quot;Enable&quot;. In this way, the 2fa is set successfully.</p>
+<ul>
+<li>
+<p>3), logout and login to Github again, and one more step will appear after entering user name and password. Fill in the 6 digit number dynamic password  generated by the app</p>
+</li>
+<li>
+<p>4),It will take about half an hour, and you will be notified by mail that you have joined the XX project-committers developer group. You can also check it in the [apache teams] (<a href="https://github.com/orgs/apache/teams">https://github.com/orgs/apache/teams</a>) page yourself.</p>
+</li>
+<li>
+<p>5), After the 2fa has been submitted, you will have the permission check problem for the cloned projects. The solution is one of below two:</p>
+</li>
+<li>
+<p>A. Apply for Access Token</p>
+</li>
+</ul>
+<p>When access token is generated on GitHub, the token where the instruction line needs a password is pasted.</p>
+<p>Refer to website <a href="https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled">referenced link one</a> and <a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/">referenced link two</a></p>
+<ul>
+<li>B. switch to SSH</li>
+</ul>
+<p>ssh-keygen then paste the content in the pub file into GitHub.</p>
+<p><strong>Note</strong>: ensure that GitHub's 2fa is &quot;enabled&quot;. When you set 2fa to &quot;off&quot;, it will be delisted by the corresponding Apache committer write permission group until you set it up again.</p>
+<h2>Fifth: other</h2>
+<h3>The Apache way</h3>
+<p>See <a href="http://apache.org/foundation/governance/">wiki</a>.</p>
+<p>The community is more important than the code
+If not discussed in the community (mailing list), just as it did not happen</p>
+<h3>A small benefit</h3>
+<p>Jetbrains company gives Apache committers a small benefit, which is free to use IDEA's full series products. The specific address is: <a href="https://www.jetbrains.com/shop/eform/apache?Product=ALL">https://www.jetbrains.com/shop/eform/apache?Product=ALL</a></p>
+<h3>Reference wiki</h3>
+<p><a href="https://www.apache.org/dev/new-committers-guide.html">https://www.apache.org/dev/new-committers-guide.html</a></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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/new-committer-guide.json b/en-us/docs/developers/committer-guide/new-committer-guide.json
new file mode 100644
index 00000000..beaa1130
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/new-committer-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-committer-guide.md",
+  "__html": "<h1>Apache Committer Guide</h1>\n<h2>First: How to become a committer</h2>\n<h3>Initial committers at the project incubator stage</h3>\n<p>At the project incubator stage, there will be an initial committers list in the proposal of the incubator project. Confirm that you are one of the initial committers. After the vote is passed in the Apache incubator community, these committers can start preparing their account. See <a href=\"https://wiki.apache.org/incubator/\">incubator wiki</a> for details.</p>\n<h3>The active contributor is elected as a committer</h3>\n<p>At the late development stage, an active contributor can be elected as a committer. See <a href=\"https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer\">how to become a committer</a></p>\n<h2>Second: The individual contributor signs ICLA</h2>\n<h3>1, Apache ID</h3>\n<p>Choose a Apache ID not in the <a href=\"http://people.apache.org/committer-index.html\">apache committers list page</a>.</p>\n<h3>2, Individual Contributor License Agreement  (ICLA):</h3>\n<p>Download the <a href=\"https://www.apache.org/licenses/icla.pdf\">ICLA template</a>. After filling the icla.pdf with personal information correctly, print, sign, scan, and send it in mail as an attachment to the secretary <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a>, the secretary will help to create the Apache user ID. At the same time, a <a href=\"mailto:your-id@apache.org\">your-id@apache.org</a> mailbox will be created. You can see if the user has been created on the [apache committers list page (<a href=\"http://people.apache.org/committer-index.html\">http://people.apache.org/committer-index.html</a>).</p>\n<h2>Third: Join The Apache Developer Group</h2>\n<ul>\n<li>\n<p>1, login via the <a href=\"https://id.apache.org/\">Apache account tool</a>, when you login at the first time, you can select the &quot;Change password?&quot; checkbox  to get the initial password. Then the initial password will be sent to the forward mailbox (the developer mail recorded in the project incubator proposal)</p>\n</li>\n<li>\n<p>2, about Apache mailbox: does not have its own mail content storage server. It needs to borrow the mail content storage and mail sending functions of other mail providers. In many voting sessions, Apache mailbox is recommended.</p>\n</li>\n</ul>\n<p>There is a question about how to configure the <a href=\"http://apache.org\">apache.org</a> mailbox forwarding function using other mailboxes.</p>\n<ol>\n<li>\n<p>inbox: to receive mails that sent to <a href=\"mailto:youer-id@apache.org\">youer-id@apache.org</a> mailbox. The forward mailbox configured in the Apache account tool in the first step can use the forward mailbox to pick up incoming mail.</p>\n</li>\n<li>\n<p>the Outbox: emails sent out will show the sender as  <a href=\"mailto:your-id@apache.org\">your-id@apache.org</a> account. Please refer to: <a href=\"https://reference.apache.org/committer/email\">set up Apache mailbox guide</a> and <a href=\"http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html\">Gmail mailbox setting</a>. In other mailbox service settings, this forwarding mode is not easy to find. Gmail is the most convenient, which is recommended  (no advertising).</p>\n</li>\n</ol>\n<ul>\n<li>\n<p>3, Modify the homepage URL option in the edit page, homepage link of  your account can be added in <a href=\"http://people.apache.org/committer-index.html\">apache committer index page</a></p>\n</li>\n<li>\n<p>4, Modify the GitHub account in the edit page, and an email will be sent to invite you to join the <a href=\"http://github.com/apache-commiiters\">github.com/apache-commiiters</a> group. Now, please learn from the way <a href=\"http://www.apache.org/foundation/how-it-works.html#developers\">ASF works</a> to do some basic preparation of ASF development.</p>\n</li>\n</ul>\n<h2>Fourth: To obtain write permission of the project</h2>\n<p>Operation of the <a href=\"https://gitbox.apache.org/setup/\">GitBox account link tool</a></p>\n<h3>1, Apache account authorization</h3>\n<p>According to the prompt, the OAuth protocol of Apache account is authorized to login.</p>\n<h3>2, Github account authorization</h3>\n<p>According to the prompt, the OAuth protocol of Github account is authorized to login.</p>\n<h3>3, Set up GitHub account in <a href=\"http://github.com\">github.com</a>, two-factors authorization (2FA)</h3>\n<ul>\n<li>\n<ol>\n<li>install &quot;Google Authenticator&quot; app on your cell phone</li>\n</ol>\n</li>\n<li>2), Following the <a href=\"https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/\">authorized GitHub 2FA wiki</a>,  you can operation step by step .</li>\n</ul>\n<p>In the <a href=\"https://github.com/settings/two_factor_authentication/verify\">two-factors authorization authentication (2. Scan this barcode with your app.)</a> page, it is not recommended to select a two-dimensional code with a cell phone, because some of the cell phones will not be able to scan.</p>\n<p>Please open the cell phone &quot;Google Authenticator&quot; app, click &quot;+&quot; to select &quot;input the secret key&quot;: write the GitHub account in the account name input box. In your &quot;secret key&quot; input box, write the text of the &quot;enter this text code&quot; link in the open web page. After clicking &quot;add&quot; in app, 6 digit dynamic will be generated for this account. Write the 6 digit number to the text box in the web page, and then click &quot;Enable&quot;. In this way, the 2fa is set successfully.</p>\n<ul>\n<li>\n<p>3), logout and login to Github again, and one more step will appear after entering user name and password. Fill in the 6 digit number dynamic password  generated by the app</p>\n</li>\n<li>\n<p>4),It will take about half an hour, and you will be notified by mail that you have joined the XX project-committers developer group. You can also check it in the [apache teams] (<a href=\"https://github.com/orgs/apache/teams\">https://github.com/orgs/apache/teams</a>) page yourself.</p>\n</li>\n<li>\n<p>5), After the 2fa has been submitted, you will have the permission check problem for the cloned projects. The solution is one of below two:</p>\n</li>\n<li>\n<p>A. Apply for Access Token</p>\n</li>\n</ul>\n<p>When access token is generated on GitHub, the token where the instruction line needs a password is pasted.</p>\n<p>Refer to website <a href=\"https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled\">referenced link one</a> and <a href=\"https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/\">referenced link two</a></p>\n<ul>\n<li>B. switch to SSH</li>\n</ul>\n<p>ssh-keygen then paste the content in the pub file into GitHub.</p>\n<p><strong>Note</strong>: ensure that GitHub's 2fa is &quot;enabled&quot;. When you set 2fa to &quot;off&quot;, it will be delisted by the corresponding Apache committer write permission group until you set it up again.</p>\n<h2>Fifth: other</h2>\n<h3>The Apache way</h3>\n<p>See <a href=\"http://apache.org/foundation/governance/\">wiki</a>.</p>\n<p>The community is more important than the code\nIf not discussed in the community (mailing list), just as it did not happen</p>\n<h3>A small benefit</h3>\n<p>Jetbrains company gives Apache committers a small benefit, which is free to use IDEA's full series products. The specific address is: <a href=\"https://www.jetbrains.com/shop/eform/apache?Product=ALL\">https://www.jetbrains.com/shop/eform/apache?Product=ALL</a></p>\n<h3>Reference wiki</h3>\n<p><a href=\"https://www.apache.org/dev/new-committers-guide.html\">https://www.apache.org/dev/new-committers-guide.html</a></p>\n",
+  "link": "/en-us/docs/developers/committer-guide/new-committer-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/new-committer-guide_dev.html b/en-us/docs/developers/committer-guide/new-committer-guide_dev.html
new file mode 100644
index 00000000..f08dbc0f
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/new-committer-guide_dev.html
@@ -0,0 +1,116 @@
+<!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="new-committer-guide_dev" />
+	<meta name="description" content="new-committer-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>new-committer-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Apache Committer Guide</h1>
+<h2>First: How to become a committer</h2>
+<h3>Initial committers at the project incubator stage</h3>
+<p>At the project incubator stage, there will be an initial committers list in the proposal of the incubator project. Confirm that you are one of the initial committers. After the vote is passed in the Apache incubator community, these committers can start preparing their account. See <a href="https://wiki.apache.org/incubator/">incubator wiki</a> for details.</p>
+<h3>The active contributor is elected as a committer</h3>
+<p>At the late development stage, an active contributor can be elected as a committer. See <a href="https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer">how to become a committer</a></p>
+<h2>Second: The individual contributor signs ICLA</h2>
+<h3>1, Apache ID</h3>
+<p>Choose a Apache ID not in the <a href="http://people.apache.org/committer-index.html">apache committers list page</a>.</p>
+<h3>2, Individual Contributor License Agreement  (ICLA):</h3>
+<p>Download the <a href="https://www.apache.org/licenses/icla.pdf">ICLA template</a>. After filling the icla.pdf with personal information correctly, print, sign, scan, and send it in mail as an attachment to the secretary <a href="mailto:secretary@apache.org">secretary@apache.org</a>, the secretary will help to create the Apache user ID. At the same time, a <a href="mailto:your-id@apache.org">your-id@apache.org</a> mailbox will be created. You can see if the user has been created on the [apache committers list page (<a href="http://people.apache.org/committer-index.html">http://people.apache.org/committer-index.html</a>).</p>
+<h2>Third: Join The Apache Developer Group</h2>
+<ul>
+<li>
+<p>1, login via the <a href="https://id.apache.org/">Apache account tool</a>, when you login at the first time, you can select the &quot;Change password?&quot; checkbox  to get the initial password. Then the initial password will be sent to the forward mailbox (the developer mail recorded in the project incubator proposal)</p>
+</li>
+<li>
+<p>2, about Apache mailbox: does not have its own mail content storage server. It needs to borrow the mail content storage and mail sending functions of other mail providers. In many voting sessions, Apache mailbox is recommended.</p>
+</li>
+</ul>
+<p>There is a question about how to configure the <a href="http://apache.org">apache.org</a> mailbox forwarding function using other mailboxes.</p>
+<ol>
+<li>
+<p>inbox: to receive mails that sent to <a href="mailto:youer-id@apache.org">youer-id@apache.org</a> mailbox. The forward mailbox configured in the Apache account tool in the first step can use the forward mailbox to pick up incoming mail.</p>
+</li>
+<li>
+<p>the Outbox: emails sent out will show the sender as  <a href="mailto:your-id@apache.org">your-id@apache.org</a> account. Please refer to: <a href="https://reference.apache.org/committer/email">set up Apache mailbox guide</a> and <a href="http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html">Gmail mailbox setting</a>. In other mailbox service settings, this forwarding mode is not easy to find. Gmail is the most convenient, which is recommended  (no advertising).</p>
+</li>
+</ol>
+<ul>
+<li>
+<p>3, Modify the homepage URL option in the edit page, homepage link of  your account can be added in <a href="http://people.apache.org/committer-index.html">apache committer index page</a></p>
+</li>
+<li>
+<p>4, Modify the GitHub account in the edit page, and an email will be sent to invite you to join the <a href="http://github.com/apache-commiiters">github.com/apache-commiiters</a> group. Now, please learn from the way <a href="http://www.apache.org/foundation/how-it-works.html#developers">ASF works</a> to do some basic preparation of ASF development.</p>
+</li>
+</ul>
+<h2>Fourth: To obtain write permission of the project</h2>
+<p>Operation of the <a href="https://gitbox.apache.org/setup/">GitBox account link tool</a></p>
+<h3>1, Apache account authorization</h3>
+<p>According to the prompt, the OAuth protocol of Apache account is authorized to login.</p>
+<h3>2, Github account authorization</h3>
+<p>According to the prompt, the OAuth protocol of Github account is authorized to login.</p>
+<h3>3, Set up GitHub account in <a href="http://github.com">github.com</a>, two-factors authorization (2FA)</h3>
+<ul>
+<li>
+<ol>
+<li>install &quot;Google Authenticator&quot; app on your cell phone</li>
+</ol>
+</li>
+<li>2), Following the <a href="https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/">authorized GitHub 2FA wiki</a>,  you can operation step by step .</li>
+</ul>
+<p>In the <a href="https://github.com/settings/two_factor_authentication/verify">two-factors authorization authentication (2. Scan this barcode with your app.)</a> page, it is not recommended to select a two-dimensional code with a cell phone, because some of the cell phones will not be able to scan.</p>
+<p>Please open the cell phone &quot;Google Authenticator&quot; app, click &quot;+&quot; to select &quot;input the secret key&quot;: write the GitHub account in the account name input box. In your &quot;secret key&quot; input box, write the text of the &quot;enter this text code&quot; link in the open web page. After clicking &quot;add&quot; in app, 6 digit dynamic will be generated for this account. Write the 6 digit number to the text box in the web page, and then click &quot;Enable&quot;. In this way, the 2fa is set successfully.</p>
+<ul>
+<li>
+<p>3), logout and login to Github again, and one more step will appear after entering user name and password. Fill in the 6 digit number dynamic password  generated by the app</p>
+</li>
+<li>
+<p>4),It will take about half an hour, and you will be notified by mail that you have joined the XX project-committers developer group. You can also check it in the [apache teams] (<a href="https://github.com/orgs/apache/teams">https://github.com/orgs/apache/teams</a>) page yourself.</p>
+</li>
+<li>
+<p>5), After the 2fa has been submitted, you will have the permission check problem for the cloned projects. The solution is one of below two:</p>
+</li>
+<li>
+<p>A. Apply for Access Token</p>
+</li>
+</ul>
+<p>When access token is generated on GitHub, the token where the instruction line needs a password is pasted.</p>
+<p>Refer to website <a href="https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled">referenced link one</a> and <a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/">referenced link two</a></p>
+<ul>
+<li>B. switch to SSH</li>
+</ul>
+<p>ssh-keygen then paste the content in the pub file into GitHub.</p>
+<p><strong>Note</strong>: ensure that GitHub's 2fa is &quot;enabled&quot;. When you set 2fa to &quot;off&quot;, it will be delisted by the corresponding Apache committer write permission group until you set it up again.</p>
+<h2>Fifth: other</h2>
+<h3>The Apache way</h3>
+<p>See <a href="http://apache.org/foundation/governance/">wiki</a>.</p>
+<p>The community is more important than the code
+If not discussed in the community (mailing list), just as it did not happen</p>
+<h3>A small benefit</h3>
+<p>Jetbrains company gives Apache committers a small benefit, which is free to use IDEA's full series products. The specific address is: <a href="https://www.jetbrains.com/shop/eform/apache?Product=ALL">https://www.jetbrains.com/shop/eform/apache?Product=ALL</a></p>
+<h3>Reference wiki</h3>
+<p><a href="https://www.apache.org/dev/new-committers-guide.html">https://www.apache.org/dev/new-committers-guide.html</a></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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/new-committer-guide_dev.json b/en-us/docs/developers/committer-guide/new-committer-guide_dev.json
new file mode 100644
index 00000000..0acdd651
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/new-committer-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-committer-guide_dev.md",
+  "__html": "<h1>Apache Committer Guide</h1>\n<h2>First: How to become a committer</h2>\n<h3>Initial committers at the project incubator stage</h3>\n<p>At the project incubator stage, there will be an initial committers list in the proposal of the incubator project. Confirm that you are one of the initial committers. After the vote is passed in the Apache incubator community, these committers can start preparing their account. See <a href=\"https://wiki.apache.org/incubator/\">incubator wiki</a> for details.</p>\n<h3>The active contributor is elected as a committer</h3>\n<p>At the late development stage, an active contributor can be elected as a committer. See <a href=\"https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer\">how to become a committer</a></p>\n<h2>Second: The individual contributor signs ICLA</h2>\n<h3>1, Apache ID</h3>\n<p>Choose a Apache ID not in the <a href=\"http://people.apache.org/committer-index.html\">apache committers list page</a>.</p>\n<h3>2, Individual Contributor License Agreement  (ICLA):</h3>\n<p>Download the <a href=\"https://www.apache.org/licenses/icla.pdf\">ICLA template</a>. After filling the icla.pdf with personal information correctly, print, sign, scan, and send it in mail as an attachment to the secretary <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a>, the secretary will help to create the Apache user ID. At the same time, a <a href=\"mailto:your-id@apache.org\">your-id@apache.org</a> mailbox will be created. You can see if the user has been created on the [apache committers list page (<a href=\"http://people.apache.org/committer-index.html\">http://people.apache.org/committer-index.html</a>).</p>\n<h2>Third: Join The Apache Developer Group</h2>\n<ul>\n<li>\n<p>1, login via the <a href=\"https://id.apache.org/\">Apache account tool</a>, when you login at the first time, you can select the &quot;Change password?&quot; checkbox  to get the initial password. Then the initial password will be sent to the forward mailbox (the developer mail recorded in the project incubator proposal)</p>\n</li>\n<li>\n<p>2, about Apache mailbox: does not have its own mail content storage server. It needs to borrow the mail content storage and mail sending functions of other mail providers. In many voting sessions, Apache mailbox is recommended.</p>\n</li>\n</ul>\n<p>There is a question about how to configure the <a href=\"http://apache.org\">apache.org</a> mailbox forwarding function using other mailboxes.</p>\n<ol>\n<li>\n<p>inbox: to receive mails that sent to <a href=\"mailto:youer-id@apache.org\">youer-id@apache.org</a> mailbox. The forward mailbox configured in the Apache account tool in the first step can use the forward mailbox to pick up incoming mail.</p>\n</li>\n<li>\n<p>the Outbox: emails sent out will show the sender as  <a href=\"mailto:your-id@apache.org\">your-id@apache.org</a> account. Please refer to: <a href=\"https://reference.apache.org/committer/email\">set up Apache mailbox guide</a> and <a href=\"http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html\">Gmail mailbox setting</a>. In other mailbox service settings, this forwarding mode is not easy to find. Gmail is the most convenient, which is recommended  (no advertising).</p>\n</li>\n</ol>\n<ul>\n<li>\n<p>3, Modify the homepage URL option in the edit page, homepage link of  your account can be added in <a href=\"http://people.apache.org/committer-index.html\">apache committer index page</a></p>\n</li>\n<li>\n<p>4, Modify the GitHub account in the edit page, and an email will be sent to invite you to join the <a href=\"http://github.com/apache-commiiters\">github.com/apache-commiiters</a> group. Now, please learn from the way <a href=\"http://www.apache.org/foundation/how-it-works.html#developers\">ASF works</a> to do some basic preparation of ASF development.</p>\n</li>\n</ul>\n<h2>Fourth: To obtain write permission of the project</h2>\n<p>Operation of the <a href=\"https://gitbox.apache.org/setup/\">GitBox account link tool</a></p>\n<h3>1, Apache account authorization</h3>\n<p>According to the prompt, the OAuth protocol of Apache account is authorized to login.</p>\n<h3>2, Github account authorization</h3>\n<p>According to the prompt, the OAuth protocol of Github account is authorized to login.</p>\n<h3>3, Set up GitHub account in <a href=\"http://github.com\">github.com</a>, two-factors authorization (2FA)</h3>\n<ul>\n<li>\n<ol>\n<li>install &quot;Google Authenticator&quot; app on your cell phone</li>\n</ol>\n</li>\n<li>2), Following the <a href=\"https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/\">authorized GitHub 2FA wiki</a>,  you can operation step by step .</li>\n</ul>\n<p>In the <a href=\"https://github.com/settings/two_factor_authentication/verify\">two-factors authorization authentication (2. Scan this barcode with your app.)</a> page, it is not recommended to select a two-dimensional code with a cell phone, because some of the cell phones will not be able to scan.</p>\n<p>Please open the cell phone &quot;Google Authenticator&quot; app, click &quot;+&quot; to select &quot;input the secret key&quot;: write the GitHub account in the account name input box. In your &quot;secret key&quot; input box, write the text of the &quot;enter this text code&quot; link in the open web page. After clicking &quot;add&quot; in app, 6 digit dynamic will be generated for this account. Write the 6 digit number to the text box in the web page, and then click &quot;Enable&quot;. In this way, the 2fa is set successfully.</p>\n<ul>\n<li>\n<p>3), logout and login to Github again, and one more step will appear after entering user name and password. Fill in the 6 digit number dynamic password  generated by the app</p>\n</li>\n<li>\n<p>4),It will take about half an hour, and you will be notified by mail that you have joined the XX project-committers developer group. You can also check it in the [apache teams] (<a href=\"https://github.com/orgs/apache/teams\">https://github.com/orgs/apache/teams</a>) page yourself.</p>\n</li>\n<li>\n<p>5), After the 2fa has been submitted, you will have the permission check problem for the cloned projects. The solution is one of below two:</p>\n</li>\n<li>\n<p>A. Apply for Access Token</p>\n</li>\n</ul>\n<p>When access token is generated on GitHub, the token where the instruction line needs a password is pasted.</p>\n<p>Refer to website <a href=\"https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled\">referenced link one</a> and <a href=\"https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/\">referenced link two</a></p>\n<ul>\n<li>B. switch to SSH</li>\n</ul>\n<p>ssh-keygen then paste the content in the pub file into GitHub.</p>\n<p><strong>Note</strong>: ensure that GitHub's 2fa is &quot;enabled&quot;. When you set 2fa to &quot;off&quot;, it will be delisted by the corresponding Apache committer write permission group until you set it up again.</p>\n<h2>Fifth: other</h2>\n<h3>The Apache way</h3>\n<p>See <a href=\"http://apache.org/foundation/governance/\">wiki</a>.</p>\n<p>The community is more important than the code\nIf not discussed in the community (mailing list), just as it did not happen</p>\n<h3>A small benefit</h3>\n<p>Jetbrains company gives Apache committers a small benefit, which is free to use IDEA's full series products. The specific address is: <a href=\"https://www.jetbrains.com/shop/eform/apache?Product=ALL\">https://www.jetbrains.com/shop/eform/apache?Product=ALL</a></p>\n<h3>Reference wiki</h3>\n<p><a href=\"https://www.apache.org/dev/new-committers-guide.html\">https://www.apache.org/dev/new-committers-guide.html</a></p>\n",
+  "link": "/en-us/docs/developers/committer-guide/new-committer-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/website-guide.html b/en-us/docs/developers/committer-guide/website-guide.html
new file mode 100644
index 00000000..2173181c
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/website-guide.html
@@ -0,0 +1,37 @@
+<!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="website-guide" />
+	<meta name="description" content="website-guide" />
+	<!-- 网页标签标题 -->
+	<title>website-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Website Guide</h1>
+<ol>
+<li>The website repository of Apache Dubbo(incubating) is <a href="https://github.com/apache/incubator-dubbo-website">https://github.com/apache/incubator-dubbo-website</a></li>
+<li>After building the website, it'll be published to <a href="http://dubbo.apache.org">dubbo.apache.org</a> automatically, you can also trigger it manually via <a href="https://selfserve.apache.org">https://selfserve.apache.org</a> (need to login with Apache account)</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/website-guide.json b/en-us/docs/developers/committer-guide/website-guide.json
new file mode 100644
index 00000000..1d3eb814
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/website-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "website-guide.md",
+  "__html": "<h1>Website Guide</h1>\n<ol>\n<li>The website repository of Apache Dubbo(incubating) is <a href=\"https://github.com/apache/incubator-dubbo-website\">https://github.com/apache/incubator-dubbo-website</a></li>\n<li>After building the website, it'll be published to <a href=\"http://dubbo.apache.org\">dubbo.apache.org</a> automatically, you can also trigger it manually via <a href=\"https://selfserve.apache.org\">https://selfserve.apache.org</a> (need to login with Apache account)</li>\n</ol>\n",
+  "link": "/en-us/docs/developers/committer-guide/website-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/website-guide_dev.html b/en-us/docs/developers/committer-guide/website-guide_dev.html
new file mode 100644
index 00000000..503da1eb
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/website-guide_dev.html
@@ -0,0 +1,37 @@
+<!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="website-guide_dev" />
+	<meta name="description" content="website-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>website-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Website Guide</h1>
+<ol>
+<li>The website repository of Apache Dubbo(incubating) is <a href="https://github.com/apache/incubator-dubbo-website">https://github.com/apache/incubator-dubbo-website</a></li>
+<li>After building the website, it'll be published to <a href="http://dubbo.apache.org">dubbo.apache.org</a> automatically, you can also trigger it manually via <a href="https://selfserve.apache.org">https://selfserve.apache.org</a> (need to login with Apache account)</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/committer-guide/website-guide_dev.json b/en-us/docs/developers/committer-guide/website-guide_dev.json
new file mode 100644
index 00000000..87a1a2cc
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/website-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "website-guide_dev.md",
+  "__html": "<h1>Website Guide</h1>\n<ol>\n<li>The website repository of Apache Dubbo(incubating) is <a href=\"https://github.com/apache/incubator-dubbo-website\">https://github.com/apache/incubator-dubbo-website</a></li>\n<li>After building the website, it'll be published to <a href=\"http://dubbo.apache.org\">dubbo.apache.org</a> automatically, you can also trigger it manually via <a href=\"https://selfserve.apache.org\">https://selfserve.apache.org</a> (need to login with Apache account)</li>\n</ol>\n",
+  "link": "/en-us/docs/developers/committer-guide/website-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/cla-signing-guide.html b/en-us/docs/developers/contributor-guide/cla-signing-guide.html
new file mode 100644
index 00000000..22944a5d
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/cla-signing-guide.html
@@ -0,0 +1,59 @@
+<!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="cla-signing-guide" />
+	<meta name="description" content="cla-signing-guide" />
+	<!-- 网页标签标题 -->
+	<title>cla-signing-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>CLA Signing Guide</h1>
+<p>You are required to sign the Apache ICLA under the following condition:</p>
+<ul>
+<li>You have made lots of contribution to Dubbo before Dubbo get donated to Apache, and you haven't sign the Alibaba-CLA before.</li>
+<li>You have made lots of contribution to Dubbo, and you are invited to become committer of Dubbo, and you have not signed Alibaba-CLA or Apache ICLA before.</li>
+</ul>
+<h4>Steps</h4>
+<ul>
+<li>Download this <a href="https://www.apache.org/licenses/icla.pdf">pdf</a></li>
+<li>Fill in the necessary blanks</li>
+<li>Print it out</li>
+<li>Sign the printed file</li>
+<li>Scan it</li>
+<li>Send an email to <a href="mailto:secretary@apache.org">secretary@apache.org</a> and cc <a href="mailto:private@dubbo.apache.org">private@dubbo.apache.org</a>:
+<ul>
+<li>entitled with &quot;ICLA submission&quot;</li>
+<li>please also provide the link to your github account in the email body</li>
+<li>remember to add you ICLA as attachment.</li>
+</ul>
+</li>
+</ul>
+<h4>Explanation to the fields</h4>
+<ul>
+<li>Mailing address: Your company address in English is preferred.</li>
+<li>preferred apache id(s): if you are invited to become committers, you have to choose one apache id, otherwise you can leave it blank.</li>
+<li>notify project: Dubbo  (This means Dubbo is the project who notifies you to sign the ICLA)</li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/cla-signing-guide.json b/en-us/docs/developers/contributor-guide/cla-signing-guide.json
new file mode 100644
index 00000000..4eb5f123
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/cla-signing-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "cla-signing-guide.md",
+  "__html": "<h1>CLA Signing Guide</h1>\n<p>You are required to sign the Apache ICLA under the following condition:</p>\n<ul>\n<li>You have made lots of contribution to Dubbo before Dubbo get donated to Apache, and you haven't sign the Alibaba-CLA before.</li>\n<li>You have made lots of contribution to Dubbo, and you are invited to become committer of Dubbo, and you have not signed Alibaba-CLA or Apache ICLA before.</li>\n</ul>\n<h4>Steps</h4>\n<ul>\n<li>Download this <a href=\"https://www.apache.org/licenses/icla.pdf\">pdf</a></li>\n<li>Fill in the necessary blanks</li>\n<li>Print it out</li>\n<li>Sign the printed file</li>\n<li>Scan it</li>\n<li>Send an email to <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a> and cc <a href=\"mailto:private@dubbo.apache.org\">private@dubbo.apache.org</a>:\n<ul>\n<li>entitled with &quot;ICLA submission&quot;</li>\n<li>please also provide the link to your github account in the email body</li>\n<li>remember to add you ICLA as attachment.</li>\n</ul>\n</li>\n</ul>\n<h4>Explanation to the fields</h4>\n<ul>\n<li>Mailing address: Your company address in English is preferred.</li>\n<li>preferred apache id(s): if you are invited to become committers, you have to choose one apache id, otherwise you can leave it blank.</li>\n<li>notify project: Dubbo  (This means Dubbo is the project who notifies you to sign the ICLA)</li>\n</ul>\n",
+  "link": "/en-us/docs/developers/contributor-guide/cla-signing-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html b/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html
new file mode 100644
index 00000000..55afe9dd
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html
@@ -0,0 +1,59 @@
+<!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="cla-signing-guide_dev" />
+	<meta name="description" content="cla-signing-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>cla-signing-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>CLA Signing Guide</h1>
+<p>You are required to sign the Apache ICLA under the following condition:</p>
+<ul>
+<li>You have made lots of contribution to Dubbo before Dubbo get donated to Apache, and you haven't sign the Alibaba-CLA before.</li>
+<li>You have made lots of contribution to Dubbo, and you are invited to become committer of Dubbo, and you have not signed Alibaba-CLA or Apache ICLA before.</li>
+</ul>
+<h4>Steps</h4>
+<ul>
+<li>Download this <a href="https://www.apache.org/licenses/icla.pdf">pdf</a></li>
+<li>Fill in the necessary blanks</li>
+<li>Print it out</li>
+<li>Sign the printed file</li>
+<li>Scan it</li>
+<li>Send an email to <a href="mailto:secretary@apache.org">secretary@apache.org</a> and cc <a href="mailto:private@dubbo.apache.org">private@dubbo.apache.org</a>:
+<ul>
+<li>entitled with &quot;ICLA submission&quot;</li>
+<li>please also provide the link to your github account in the email body</li>
+<li>remember to add you ICLA as attachment.</li>
+</ul>
+</li>
+</ul>
+<h4>Explanation to the fields</h4>
+<ul>
+<li>Mailing address: Your company address in English is preferred.</li>
+<li>preferred apache id(s): if you are invited to become committers, you have to choose one apache id, otherwise you can leave it blank.</li>
+<li>notify project: Dubbo  (This means Dubbo is the project who notifies you to sign the ICLA)</li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.json b/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.json
new file mode 100644
index 00000000..3ad99cb3
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "cla-signing-guide_dev.md",
+  "__html": "<h1>CLA Signing Guide</h1>\n<p>You are required to sign the Apache ICLA under the following condition:</p>\n<ul>\n<li>You have made lots of contribution to Dubbo before Dubbo get donated to Apache, and you haven't sign the Alibaba-CLA before.</li>\n<li>You have made lots of contribution to Dubbo, and you are invited to become committer of Dubbo, and you have not signed Alibaba-CLA or Apache ICLA before.</li>\n</ul>\n<h4>Steps</h4>\n<ul>\n<li>Download this <a href=\"https://www.apache.org/licenses/icla.pdf\">pdf</a></li>\n<li>Fill in the necessary blanks</li>\n<li>Print it out</li>\n<li>Sign the printed file</li>\n<li>Scan it</li>\n<li>Send an email to <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a> and cc <a href=\"mailto:private@dubbo.apache.org\">private@dubbo.apache.org</a>:\n<ul>\n<li>entitled with &quot;ICLA submission&quot;</li>\n<li>please also provide the link to your github account in the email body</li>\n<li>remember to add you ICLA as attachment.</li>\n</ul>\n</li>\n</ul>\n<h4>Explanation to the fields</h4>\n<ul>\n<li>Mailing address: Your company address in English is preferred.</li>\n<li>preferred apache id(s): if you are invited to become committers, you have to choose one apache id, otherwise you can leave it blank.</li>\n<li>notify project: Dubbo  (This means Dubbo is the project who notifies you to sign the ICLA)</li>\n</ul>\n",
+  "link": "/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/dubbo-extension-guide.html b/en-us/docs/developers/contributor-guide/dubbo-extension-guide.html
new file mode 100644
index 00000000..f9bb796c
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/dubbo-extension-guide.html
@@ -0,0 +1,67 @@
+<!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-extension-guide" />
+	<meta name="description" content="dubbo-extension-guide" />
+	<!-- 网页标签标题 -->
+	<title>dubbo-extension-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Extension guide</h1>
+<p>Dubbo Use microkernel + plugin design pattern. Microkernel is only responsible for assembling plugins, the functions of Dubbo are implemented by extension points(plugins), which means that all functions of Dubbo can be replaced by user customized extension.</p>
+<h2>Dubbo Ecosystem</h2>
+<p>We recommend you to put extension to Dubbo <a href="https://github.com/dubbo">ecosystem</a>. Using this pattern will keep the core repository cleaner and decrease the maintains work. With less code also speed up core repository build process.</p>
+<h2>Dependency</h2>
+<p>Implement your own Dubbo extension, in general is just dependence on API jar correspond to what you want.
+For example:</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.dubbo<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>dubbo-serialization-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${dubbo.version}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
+<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
+</code></pre>
+<h2>Src Guide</h2>
+<p>Usually, implement special extension, just need reference the <a href="http://dubbo.apache.org/#/docs/dev/build.md?lang=en-us">Developer Guide</a> docs. Implement necessary interface and adapt extension to dubbo. Besides, some others should be considered:</p>
+<ol>
+<li>Well tested. You should write unit test and mock test to eliminate potential bugs.</li>
+<li>No warning, if some warning cannot to avoid, use @SuppressWarnings to suppress it, but do not abuse it.</li>
+<li>README. Add necessary readme to show how to use your extension, and something to take notice.</li>
+<li>License. Make sure of use Apache License 2.0.</li>
+</ol>
+<h2>Notify the Community</h2>
+<ol>
+<li>Commit your code to <a href="https://github.com">GitHub</a>.</li>
+<li>Join the mail list (recommended). <a href="https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide">HowTo</a></li>
+<li>Send email to <a href="mailto:dev@incubator.dubbo.apache.org">dev@incubator.dubbo.apache.org</a> to notify the community</li>
+<li>Usually, after sending email, community will discuss your extension, and Administrators of dubbo group will contact you for transfer project to dubbo ecosystem.</li>
+</ol>
+<h2>Transfer Project to Dubbo Group</h2>
+<ol>
+<li>Administrators of dubbo group will ask you, grant your project owner to dubbo.</li>
+<li>Administrators of dubbo group will create a new project under dubbo group and invite you join the project.</li>
+<li>Once you accept the invitation, you can transfer your project to new project under dubbo group.</li>
+<li>Existing members of dubbo group will do the code review. After that you may make some improvement to code.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/dubbo-extension-guide.json b/en-us/docs/developers/contributor-guide/dubbo-extension-guide.json
new file mode 100644
index 00000000..c5c864e2
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/dubbo-extension-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-extension-guide.md",
+  "__html": "<h1>Extension guide</h1>\n<p>Dubbo Use microkernel + plugin design pattern. Microkernel is only responsible for assembling plugins, the functions of Dubbo are implemented by extension points(plugins), which means that all functions of Dubbo can be replaced by user customized extension.</p>\n<h2>Dubbo Ecosystem</h2>\n<p>We recommend you to put extension to Dubbo <a href=\"https://github.com/dubbo\">ecosystem</a>. Using this pattern will keep the core repository cleaner and decrease the maintains work. With less code also speed up core repository build process.</p>\n<h2>Dependency</h2>\n<p>Implement your own Dubbo extension, in general is just dependence on API jar correspond to what you want.\nFor example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-serialization-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>${dubbo.version}<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Src Guide</h2>\n<p>Usually, implement special extension, just need reference the <a href=\"http://dubbo.apache.org/#/docs/dev/build.md?lang=en-us\">Developer Guide</a> docs. Implement necessary interface and adapt extension to dubbo. Besides, some others should be considered:</p>\n<ol>\n<li>Well tested. You should write unit test and mock test to eliminate potential bugs.</li>\n<li>No warning, if some warning cannot to avoid, use @SuppressWarnings to suppress it, but do not abuse it.</li>\n<li>README. Add necessary readme to show how to use your extension, and something to take notice.</li>\n<li>License. Make sure of use Apache License 2.0.</li>\n</ol>\n<h2>Notify the Community</h2>\n<ol>\n<li>Commit your code to <a href=\"https://github.com\">GitHub</a>.</li>\n<li>Join the mail list (recommended). <a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide\">HowTo</a></li>\n<li>Send email to <a href=\"mailto:dev@incubator.dubbo.apache.org\">dev@incubator.dubbo.apache.org</a> to notify the community</li>\n<li>Usually, after sending email, community will discuss your extension, and Administrators of dubbo group will contact you for transfer project to dubbo ecosystem.</li>\n</ol>\n<h2>Transfer Project to Dubbo Group</h2>\n<ol>\n<li>Administrators of dubbo group will ask you, grant your project owner to dubbo.</li>\n<li>Administrators of dubbo group will create a new project under dubbo group and invite you join the project.</li>\n<li>Once you accept the invitation, you can transfer your project to new project under dubbo group.</li>\n<li>Existing members of dubbo group will do the code review. After that you may make some improvement to code.</li>\n</ol>\n",
+  "link": "/en-us/docs/developers/contributor-guide/dubbo-extension-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html b/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html
new file mode 100644
index 00000000..8c5285bb
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html
@@ -0,0 +1,67 @@
+<!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-extension-guide_dev" />
+	<meta name="description" content="dubbo-extension-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>dubbo-extension-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Extension guide</h1>
+<p>Dubbo Use microkernel + plugin design pattern. Microkernel is only responsible for assembling plugins, the functions of Dubbo are implemented by extension points(plugins), which means that all functions of Dubbo can be replaced by user customized extension.</p>
+<h2>Dubbo Ecosystem</h2>
+<p>We recommend you to put extension to Dubbo <a href="https://github.com/dubbo">ecosystem</a>. Using this pattern will keep the core repository cleaner and decrease the maintains work. With less code also speed up core repository build process.</p>
+<h2>Dependency</h2>
+<p>Implement your own Dubbo extension, in general is just dependence on API jar correspond to what you want.
+For example:</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.dubbo<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>dubbo-serialization-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${dubbo.version}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
+<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
+</code></pre>
+<h2>Src Guide</h2>
+<p>Usually, implement special extension, just need reference the <a href="http://dubbo.apache.org/#/docs/dev/build.md?lang=en-us">Developer Guide</a> docs. Implement necessary interface and adapt extension to dubbo. Besides, some others should be considered:</p>
+<ol>
+<li>Well tested. You should write unit test and mock test to eliminate potential bugs.</li>
+<li>No warning, if some warning cannot to avoid, use @SuppressWarnings to suppress it, but do not abuse it.</li>
+<li>README. Add necessary readme to show how to use your extension, and something to take notice.</li>
+<li>License. Make sure of use Apache License 2.0.</li>
+</ol>
+<h2>Notify the Community</h2>
+<ol>
+<li>Commit your code to <a href="https://github.com">GitHub</a>.</li>
+<li>Join the mail list (recommended). <a href="https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide">HowTo</a></li>
+<li>Send email to <a href="mailto:dev@incubator.dubbo.apache.org">dev@incubator.dubbo.apache.org</a> to notify the community</li>
+<li>Usually, after sending email, community will discuss your extension, and Administrators of dubbo group will contact you for transfer project to dubbo ecosystem.</li>
+</ol>
+<h2>Transfer Project to Dubbo Group</h2>
+<ol>
+<li>Administrators of dubbo group will ask you, grant your project owner to dubbo.</li>
+<li>Administrators of dubbo group will create a new project under dubbo group and invite you join the project.</li>
+<li>Once you accept the invitation, you can transfer your project to new project under dubbo group.</li>
+<li>Existing members of dubbo group will do the code review. After that you may make some improvement to code.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.json b/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.json
new file mode 100644
index 00000000..a5894e99
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-extension-guide_dev.md",
+  "__html": "<h1>Extension guide</h1>\n<p>Dubbo Use microkernel + plugin design pattern. Microkernel is only responsible for assembling plugins, the functions of Dubbo are implemented by extension points(plugins), which means that all functions of Dubbo can be replaced by user customized extension.</p>\n<h2>Dubbo Ecosystem</h2>\n<p>We recommend you to put extension to Dubbo <a href=\"https://github.com/dubbo\">ecosystem</a>. Using this pattern will keep the core repository cleaner and decrease the maintains work. With less code also speed up core repository build process.</p>\n<h2>Dependency</h2>\n<p>Implement your own Dubbo extension, in general is just dependence on API jar correspond to what you want.\nFor example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-serialization-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>${dubbo.version}<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Src Guide</h2>\n<p>Usually, implement special extension, just need reference the <a href=\"http://dubbo.apache.org/#/docs/dev/build.md?lang=en-us\">Developer Guide</a> docs. Implement necessary interface and adapt extension to dubbo. Besides, some others should be considered:</p>\n<ol>\n<li>Well tested. You should write unit test and mock test to eliminate potential bugs.</li>\n<li>No warning, if some warning cannot to avoid, use @SuppressWarnings to suppress it, but do not abuse it.</li>\n<li>README. Add necessary readme to show how to use your extension, and something to take notice.</li>\n<li>License. Make sure of use Apache License 2.0.</li>\n</ol>\n<h2>Notify the Community</h2>\n<ol>\n<li>Commit your code to <a href=\"https://github.com\">GitHub</a>.</li>\n<li>Join the mail list (recommended). <a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide\">HowTo</a></li>\n<li>Send email to <a href=\"mailto:dev@incubator.dubbo.apache.org\">dev@incubator.dubbo.apache.org</a> to notify the community</li>\n<li>Usually, after sending email, community will discuss your extension, and Administrators of dubbo group will contact you for transfer project to dubbo ecosystem.</li>\n</ol>\n<h2>Transfer Project to Dubbo Group</h2>\n<ol>\n<li>Administrators of dubbo group will ask you, grant your project owner to dubbo.</li>\n<li>Administrators of dubbo group will create a new project under dubbo group and invite you join the project.</li>\n<li>Once you accept the invitation, you can transfer your project to new project under dubbo group.</li>\n<li>Existing members of dubbo group will do the code review. After that you may make some improvement to code.</li>\n</ol>\n",
+  "link": "/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.html b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.html
new file mode 100644
index 00000000..e7b5ffbc
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.html
@@ -0,0 +1,110 @@
+<!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="mailing-list-subscription-guide" />
+	<meta name="description" content="mailing-list-subscription-guide" />
+	<!-- 网页标签标题 -->
+	<title>mailing-list-subscription-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Mailing list subscription guide</h1>
+<p>The Dubbo developer mailing list (<a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a>) for Apache Incubator has been established, please feel free to subscribe and refer to [1] for more details.</p>
+<p>Here is a brief guide specific to Dubbo:</p>
+<ol>
+<li>Send an email to <a href="mailto:dev-subscribe@dubbo.incubator.apache.org">dev-subscribe@dubbo.incubator.apache.org</a>, you can have empty subject and empty content. You will receive an email with the following content:</li>
+</ol>
+<pre><code>from: dev-help@dubbo.apache.org
+reply-to: dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+to: hello@example.com
+date: Sat, Feb 24, 2018 at 3:12 PM
+subject: confirm subscribe to dev@dubbo.apache.org
+mailed-by: apache.org
+
+Hi! This is the ezmlm program. I'm managing the
+dev@dubbo.apache.org mailing list.
+
+I'm working for my owner, who can be reached
+at dev-owner@dubbo.apache.org.
+
+To confirm that you would like
+
+   hello@example.com
+
+added to the dev mailing list, please send
+a short reply to this address:
+
+   dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+
+Usually, this happens when you just hit the &quot;reply&quot; button.
+If this does not work, simply copy the address and paste it into
+the &quot;To:&quot; field of a new message.
+
+or click here:
+        mailto:dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+
+...
+</code></pre>
+<ol start="2">
+<li>Reply the email directly, you can have empty subject and empty content. You will receive an email with the following content:</li>
+</ol>
+<pre><code>from: dev-help@dubbo.apache.org
+to: hello@example.com
+date: Sat, Feb 24, 2018 at 3:14 PM
+subject: WELCOME to dev@dubbo.apache.org
+mailed-by: apache.org
+
+Hi! This is the ezmlm program. I'm managing the
+dev@dubbo.apache.org mailing list.
+
+I'm working for my owner, who can be reached
+at dev-owner@dubbo.apache.org.
+
+Acknowledgment: I have added the address
+
+   hello@example.com
+
+to the dev mailing list.
+
+Welcome to dev@dubbo.apache.org!
+
+Please save this message so that you know the address you are
+subscribed under, in case you later want to unsubscribe or change your
+subscription address.
+
+...
+</code></pre>
+<ol start="3">
+<li>
+<p>After that, you will receive any email that is posted to this mailing list. If you have any further questions, just send email to <a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a> and hopefully someone will answer your questions.</p>
+</li>
+<li>
+<p>If you want to unsubscribe, just send an email to <a href="mailto:dev-unsubscribe@dubbo.incubator.apache.org">dev-unsubscribe@dubbo.incubator.apache.org</a>, and follow the steps once you get an reply.</p>
+</li>
+</ol>
+<blockquote>
+<p>Note that both <a href="mailto:dev@dubbo.apache.org">dev@dubbo.apache.org</a> and <a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a> should work, you can pick any of it.</p>
+</blockquote>
+<p>[1] <a href="http://apache.org/foundation/mailinglists.html#subscribing">http://apache.org/foundation/mailinglists.html#subscribing</a></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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.json b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.json
new file mode 100644
index 00000000..4d3c0b66
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "mailing-list-subscription-guide.md",
+  "__html": "<h1>Mailing list subscription guide</h1>\n<p>The Dubbo developer mailing list (<a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>) for Apache Incubator has been established, please feel free to subscribe and refer to [1] for more details.</p>\n<p>Here is a brief guide specific to Dubbo:</p>\n<ol>\n<li>Send an email to <a href=\"mailto:dev-subscribe@dubbo.incubator.apache.org\">dev-subscribe@dubbo.incubator.apache.org</a>, you can have empty subject and empty content. You will receive an email with the following content:</li>\n</ol>\n<pre><code>from: dev-help@dubbo.apache.org\nreply-to: dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org\nto: hello@example.com\ndate: Sat, Feb 24, 2018 at 3:12 PM\nsubject: confirm subscribe to dev@dubbo.apache.org\nmailed-by: apache.org\n\nHi! This is the ezmlm program. I'm managing the\ndev@dubbo.apache.org mailing list.\n\nI'm working for my owner, who can be reached\nat dev-owner@dubbo.apache.org.\n\nTo confirm that you would like\n\n   hello@example.com\n\nadded to the dev mailing list, please send\na short reply to this address:\n\n   dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org\n\nUsually, this happens when you just hit the &quot;reply&quot; button.\nIf this does not work, simply copy the address and paste it into\nthe &quot;To:&quot; field of a new message.\n\nor click here:\n        mailto:dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org\n\n...\n</code></pre>\n<ol start=\"2\">\n<li>Reply the email directly, you can have empty subject and empty content. You will receive an email with the following content:</li>\n</ol>\n<pre><code>from: dev-help@dubbo.apache.org\nto: hello@example.com\ndate: Sat, Feb 24, 2018 at 3:14 PM\nsubject: WELCOME to dev@dubbo.apache.org\nmailed-by: apache.org\n\nHi! This is the ezmlm program. I'm managing the\ndev@dubbo.apache.org mailing list.\n\nI'm working for my owner, who can be reached\nat dev-owner@dubbo.apache.org.\n\nAcknowledgment: I have added the address\n\n   hello@example.com\n\nto the dev mailing list.\n\nWelcome to dev@dubbo.apache.org!\n\nPlease save this message so that you know the address you are\nsubscribed under, in case you later want to unsubscribe or change your\nsubscription address.\n\n...\n</code></pre>\n<ol start=\"3\">\n<li>\n<p>After that, you will receive any email that is posted to this mailing list. If you have any further questions, just send email to <a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a> and hopefully someone will answer your questions.</p>\n</li>\n<li>\n<p>If you want to unsubscribe, just send an email to <a href=\"mailto:dev-unsubscribe@dubbo.incubator.apache.org\">dev-unsubscribe@dubbo.incubator.apache.org</a>, and follow the steps once you get an reply.</p>\n</li>\n</ol>\n<blockquote>\n<p>Note that both <a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a> and <a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a> should work, you can pick any of it.</p>\n</blockquote>\n<p>[1] <a href=\"http://apache.org/foundation/mailinglists.html#subscribing\">http://apache.org/foundation/mailinglists.html#subscribing</a></p>\n",
+  "link": "/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html
new file mode 100644
index 00000000..7b5ccd5a
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html
@@ -0,0 +1,110 @@
+<!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="mailing-list-subscription-guide_dev" />
+	<meta name="description" content="mailing-list-subscription-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>mailing-list-subscription-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Mailing list subscription guide</h1>
+<p>The Dubbo developer mailing list (<a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a>) for Apache Incubator has been established, please feel free to subscribe and refer to [1] for more details.</p>
+<p>Here is a brief guide specific to Dubbo:</p>
+<ol>
+<li>Send an email to <a href="mailto:dev-subscribe@dubbo.incubator.apache.org">dev-subscribe@dubbo.incubator.apache.org</a>, you can have empty subject and empty content. You will receive an email with the following content:</li>
+</ol>
+<pre><code>from: dev-help@dubbo.apache.org
+reply-to: dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+to: hello@example.com
+date: Sat, Feb 24, 2018 at 3:12 PM
+subject: confirm subscribe to dev@dubbo.apache.org
+mailed-by: apache.org
+
+Hi! This is the ezmlm program. I'm managing the
+dev@dubbo.apache.org mailing list.
+
+I'm working for my owner, who can be reached
+at dev-owner@dubbo.apache.org.
+
+To confirm that you would like
+
+   hello@example.com
+
+added to the dev mailing list, please send
+a short reply to this address:
+
+   dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+
+Usually, this happens when you just hit the &quot;reply&quot; button.
+If this does not work, simply copy the address and paste it into
+the &quot;To:&quot; field of a new message.
+
+or click here:
+        mailto:dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org
+
+...
+</code></pre>
+<ol start="2">
+<li>Reply the email directly, you can have empty subject and empty content. You will receive an email with the following content:</li>
+</ol>
+<pre><code>from: dev-help@dubbo.apache.org
+to: hello@example.com
+date: Sat, Feb 24, 2018 at 3:14 PM
+subject: WELCOME to dev@dubbo.apache.org
+mailed-by: apache.org
+
+Hi! This is the ezmlm program. I'm managing the
+dev@dubbo.apache.org mailing list.
+
+I'm working for my owner, who can be reached
+at dev-owner@dubbo.apache.org.
+
+Acknowledgment: I have added the address
+
+   hello@example.com
+
+to the dev mailing list.
+
+Welcome to dev@dubbo.apache.org!
+
+Please save this message so that you know the address you are
+subscribed under, in case you later want to unsubscribe or change your
+subscription address.
+
+...
+</code></pre>
+<ol start="3">
+<li>
+<p>After that, you will receive any email that is posted to this mailing list. If you have any further questions, just send email to <a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a> and hopefully someone will answer your questions.</p>
+</li>
+<li>
+<p>If you want to unsubscribe, just send an email to <a href="mailto:dev-unsubscribe@dubbo.incubator.apache.org">dev-unsubscribe@dubbo.incubator.apache.org</a>, and follow the steps once you get an reply.</p>
+</li>
+</ol>
+<blockquote>
+<p>Note that both <a href="mailto:dev@dubbo.apache.org">dev@dubbo.apache.org</a> and <a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a> should work, you can pick any of it.</p>
+</blockquote>
+<p>[1] <a href="http://apache.org/foundation/mailinglists.html#subscribing">http://apache.org/foundation/mailinglists.html#subscribing</a></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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json
new file mode 100644
index 00000000..30ba569d
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "mailing-list-subscription-guide_dev.md",
+  "__html": "<h1>Mailing list subscription guide</h1>\n<p>The Dubbo developer mailing list (<a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>) for Apache Incubator has been established, please feel free to subscribe and refer to [1] for more details.</p>\n<p>Here is a brief guide specific to Dubbo:</p>\n<ol>\n<li>Send an email to <a href=\"mailto:dev-subscribe@dubbo.incubator.apache.org\">dev-subscribe@dubbo.incubator.apache.org</a>, you can have empty subject and empty content. You will receive an email with the following content:</li>\n</ol>\n<pre><code>from: dev-help@dubbo.apache.org\nreply-to: dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org\nto: hello@example.com\ndate: Sat, Feb 24, 2018 at 3:12 PM\nsubject: confirm subscribe to dev@dubbo.apache.org\nmailed-by: apache.org\n\nHi! This is the ezmlm program. I'm managing the\ndev@dubbo.apache.org mailing list.\n\nI'm working for my owner, who can be reached\nat dev-owner@dubbo.apache.org.\n\nTo confirm that you would like\n\n   hello@example.com\n\nadded to the dev mailing list, please send\na short reply to this address:\n\n   dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org\n\nUsually, this happens when you just hit the &quot;reply&quot; button.\nIf this does not work, simply copy the address and paste it into\nthe &quot;To:&quot; field of a new message.\n\nor click here:\n        mailto:dev-sc.xxxxxxx.xxxxxxxx-hello=example.com@dubbo.apache.org\n\n...\n</code></pre>\n<ol start=\"2\">\n<li>Reply the email directly, you can have empty subject and empty content. You will receive an email with the following content:</li>\n</ol>\n<pre><code>from: dev-help@dubbo.apache.org\nto: hello@example.com\ndate: Sat, Feb 24, 2018 at 3:14 PM\nsubject: WELCOME to dev@dubbo.apache.org\nmailed-by: apache.org\n\nHi! This is the ezmlm program. I'm managing the\ndev@dubbo.apache.org mailing list.\n\nI'm working for my owner, who can be reached\nat dev-owner@dubbo.apache.org.\n\nAcknowledgment: I have added the address\n\n   hello@example.com\n\nto the dev mailing list.\n\nWelcome to dev@dubbo.apache.org!\n\nPlease save this message so that you know the address you are\nsubscribed under, in case you later want to unsubscribe or change your\nsubscription address.\n\n...\n</code></pre>\n<ol start=\"3\">\n<li>\n<p>After that, you will receive any email that is posted to this mailing list. If you have any further questions, just send email to <a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a> and hopefully someone will answer your questions.</p>\n</li>\n<li>\n<p>If you want to unsubscribe, just send an email to <a href=\"mailto:dev-unsubscribe@dubbo.incubator.apache.org\">dev-unsubscribe@dubbo.incubator.apache.org</a>, and follow the steps once you get an reply.</p>\n</li>\n</ol>\n<blockquote>\n<p>Note that both <a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a> and <a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a> should work, you can pick any of it.</p>\n</blockquote>\n<p>[1] <a href=\"http://apache.org/foundation/mailinglists.html#subscribing\">http://apache.org/foundation/mailinglists.html#subscribing</a></p>\n",
+  "link": "/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/new-contributor-guide.html b/en-us/docs/developers/contributor-guide/new-contributor-guide.html
new file mode 100644
index 00000000..f30a3295
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/new-contributor-guide.html
@@ -0,0 +1,56 @@
+<!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="new-contributor-guide" />
+	<meta name="description" content="new-contributor-guide" />
+	<!-- 网页标签标题 -->
+	<title>new-contributor-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>New contributor guide</h1>
+<p>This is a guide for new comers who wants to contribute to Dubbo.</p>
+<h3>Subscribe to the mailing list</h3>
+<p>The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this <a href="https://github.com/apache/incubator-dubbo/issues/1393">issue</a> for detailed documentation on how to subscribe.</p>
+<ul>
+<li><a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a>: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.</li>
+<li><a href="mailto:commits@dubbo.incubator.apache.org">commits@dubbo.incubator.apache.org</a>: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.</li>
+<li><a href="mailto:issues@dubbo.incubator.apache.org">issues@dubbo.incubator.apache.org</a>: all the JIRA <a href="https://issues.apache.org/jira/projects/DUBBO/issues">issues</a> and updates will be sent to this mailing list. The Dubbo community has decided to use github issues rather than JIRA issues, therefore it is expected that most of the issues will be tracked by github issues. The JIRA issues are used to track ASF related issues.</li>
+</ul>
+<h3>Reporting issue</h3>
+<h3>Sending pull request</h3>
+<ul>
+<li>Follow the checklist in the <a href="https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md">pull request template</a></li>
+<li>Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:</li>
+</ul>
+<pre><code class="language-sh">git remote add upstream git@github.com:apache/incubator-dubbo.git
+git fetch upstream
+git rebase upstream/master
+git checkout -b your_awesome_patch
+... add some work
+git push origin your_awesome_patch
+</code></pre>
+<h3>Code convention</h3>
+<p>Please check the <a href="https://github.com/apache/incubator-dubbo/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for code convention.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/new-contributor-guide.json b/en-us/docs/developers/contributor-guide/new-contributor-guide.json
new file mode 100644
index 00000000..557bb689
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/new-contributor-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-contributor-guide.md",
+  "__html": "<h1>New contributor guide</h1>\n<p>This is a guide for new comers who wants to contribute to Dubbo.</p>\n<h3>Subscribe to the mailing list</h3>\n<p>The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this <a href=\"https://github.com/apache/incubator-dubbo/issues/1393\">issue</a> for detailed documentation on how to subscribe.</p>\n<ul>\n<li><a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.</li>\n<li><a href=\"mailto:commits@dubbo.incubator.apache.org\">commits@dubbo.incubator.apache.org</a>: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.</li>\n<li><a href=\"mailto:issues@dubbo.incubator.apache.org\">issues@dubbo.incubator.apache.org</a>: all the JIRA <a href=\"https://issues.apache.org/jira/projects/DUBBO/issues\">issues</a> and updates will be sent to this mailing list. The Dubbo community has decided to use github issues rather than JIRA issues, therefore it is expected that most of the issues will be tracked by github issues. The JIRA issues are used to track ASF related issues.</li>\n</ul>\n<h3>Reporting issue</h3>\n<h3>Sending pull request</h3>\n<ul>\n<li>Follow the checklist in the <a href=\"https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md\">pull request template</a></li>\n<li>Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:</li>\n</ul>\n<pre><code class=\"language-sh\">git remote add upstream git@github.com:apache/incubator-dubbo.git\ngit fetch upstream\ngit rebase upstream/master\ngit checkout -b your_awesome_patch\n... add some work\ngit push origin your_awesome_patch\n</code></pre>\n<h3>Code convention</h3>\n<p>Please check the <a href=\"https://github.com/apache/incubator-dubbo/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for code convention.</p>\n",
+  "link": "/en-us/docs/developers/contributor-guide/new-contributor-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html b/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html
new file mode 100644
index 00000000..8a28717c
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html
@@ -0,0 +1,56 @@
+<!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="new-contributor-guide_dev" />
+	<meta name="description" content="new-contributor-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>new-contributor-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>New contributor guide</h1>
+<p>This is a guide for new comers who wants to contribute to Dubbo.</p>
+<h3>Subscribe to the mailing list</h3>
+<p>The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this <a href="https://github.com/apache/incubator-dubbo/issues/1393">issue</a> for detailed documentation on how to subscribe.</p>
+<ul>
+<li><a href="mailto:dev@dubbo.incubator.apache.org">dev@dubbo.incubator.apache.org</a>: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.</li>
+<li><a href="mailto:commits@dubbo.incubator.apache.org">commits@dubbo.incubator.apache.org</a>: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.</li>
+<li><a href="mailto:issues@dubbo.incubator.apache.org">issues@dubbo.incubator.apache.org</a>: all the JIRA <a href="https://issues.apache.org/jira/projects/DUBBO/issues">issues</a> and updates will be sent to this mailing list. The Dubbo community has decided to use github issues rather than JIRA issues, therefore it is expected that most of the issues will be tracked by github issues. The JIRA issues are used to track ASF related issues.</li>
+</ul>
+<h3>Reporting issue</h3>
+<h3>Sending pull request</h3>
+<ul>
+<li>Follow the checklist in the <a href="https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md">pull request template</a></li>
+<li>Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:</li>
+</ul>
+<pre><code class="language-sh">git remote add upstream git@github.com:apache/incubator-dubbo.git
+git fetch upstream
+git rebase upstream/master
+git checkout -b your_awesome_patch
+... add some work
+git push origin your_awesome_patch
+</code></pre>
+<h3>Code convention</h3>
+<p>Please check the <a href="https://github.com/apache/incubator-dubbo/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a> for code convention.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.json b/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.json
new file mode 100644
index 00000000..29fc468a
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-contributor-guide_dev.md",
+  "__html": "<h1>New contributor guide</h1>\n<p>This is a guide for new comers who wants to contribute to Dubbo.</p>\n<h3>Subscribe to the mailing list</h3>\n<p>The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this <a href=\"https://github.com/apache/incubator-dubbo/issues/1393\">issue</a> for detailed documentation on how to subscribe.</p>\n<ul>\n<li><a href=\"mailto:dev@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.</li>\n<li><a href=\"mailto:commits@dubbo.incubator.apache.org\">commits@dubbo.incubator.apache.org</a>: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.</li>\n<li><a href=\"mailto:issues@dubbo.incubator.apache.org\">issues@dubbo.incubator.apache.org</a>: all the JIRA <a href=\"https://issues.apache.org/jira/projects/DUBBO/issues\">issues</a> and updates will be sent to this mailing list. The Dubbo community has decided to use github issues rather than JIRA issues, therefore it is expected that most of the issues will be tracked by github issues. The JIRA issues are used to track ASF related issues.</li>\n</ul>\n<h3>Reporting issue</h3>\n<h3>Sending pull request</h3>\n<ul>\n<li>Follow the checklist in the <a href=\"https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md\">pull request template</a></li>\n<li>Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:</li>\n</ul>\n<pre><code class=\"language-sh\">git remote add upstream git@github.com:apache/incubator-dubbo.git\ngit fetch upstream\ngit rebase upstream/master\ngit checkout -b your_awesome_patch\n... add some work\ngit push origin your_awesome_patch\n</code></pre>\n<h3>Code convention</h3>\n<p>Please check the <a href=\"https://github.com/apache/incubator-dubbo/blob/master/CONTRIBUTING.md\">CONTRIBUTING.md</a> for code convention.</p>\n",
+  "link": "/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/software-donation-guide.html b/en-us/docs/developers/contributor-guide/software-donation-guide.html
new file mode 100644
index 00000000..5e39fa89
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/software-donation-guide.html
@@ -0,0 +1,132 @@
+<!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="software-donation-guide" />
+	<meta name="description" content="software-donation-guide" />
+	<!-- 网页标签标题 -->
+	<title>software-donation-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Software donation guide</h1>
+<p>Before you go through this guide, make sure you have confirmed with PPMC that a SGA is actually needed.</p>
+<p>If you are donating significant amount of code or documentation to Apache Dubbo (incubating), you will be required to sign a <a href="https://www.apache.org/licenses/#grants">Software Grant</a> before your code/doc could be merged.</p>
+<h4>Steps</h4>
+<ol>
+<li>Download this <a href="https://www.apache.org/licenses/software-grant-template.pdf">pdf</a></li>
+<li>Print it out</li>
+<li>Fill in the blanks (see below as an example)</li>
+<li>Request your boss to sign it</li>
+<li>Scan it</li>
+<li>Send an email to <a href="mailto:secretary@apache.org">secretary@apache.org</a> and cc <a href="mailto:private@dubbo.apache.org">private@dubbo.apache.org</a></li>
+</ol>
+<h4>Example:</h4>
+<p>Below is an text versioned <strong>example</strong>, original text could be found <a href="https://www.apache.org/licenses/software-grant.txt">here</a></p>
+<pre><code>License Agreement
+
+
+    This License Agreement is entered into as of the _12th_ day of
+___April____, __2018__ by ___ABC Software Co., Ltd.____ (&quot;Licensor&quot;),
+in favor of The Apache Software Foundation, a Delaware nonstock
+membership corporation (the &quot;Foundation&quot;).
+
+    WHEREAS, Licensor owns or has sufficient rights to contribute the
+software source code and other related intellectual property as
+itemized on Exhibit A (&quot;Software&quot;) under the terms of this agreement
+to the Foundation for use within Foundation software development
+projects (&quot;Projects&quot;).
+
+    NOW, THEREFORE, FOR GOOD AND VALUABLE CONSIDERATION, the receipt
+and legal sufficiency of which are hereby acknowledged, the parties
+hereto, intending to be legally bound, agree as follows:
+
+1. Subject to the terms and conditions of this License, Licensor
+hereby grants to the Foundation:
+
+  a) a non-exclusive, worldwide, royalty-free, irrevocable
+     copyright license to reproduce, prepare derivative works of,
+     publicly display, publicly perform, distribute and sublicense,
+     internally and externally, the Software and such derivative
+     works, in source code and object code form; and,
+
+  b) a non-exclusive, worldwide, royalty-free, irrevocable
+     patent license under Licensed Patents to make, use, sell,
+     offer to sell, import and otherwise transfer the Software
+     in source code and object code form. &quot;Licensed Patents&quot; mean
+     patent claims owned by Licensor which are necessarily
+     infringed by the use or sale of the Software alone.
+
+2. Licensor represents that, to Licensor's knowledge, Licensor is
+legally entitled to grant the above license. Licensor agrees to notify
+the Foundation of any facts or circumstances of which Licensor becomes
+aware and which makes or would make Licensor's representations in this
+License Agreement inaccurate in any respect.
+
+3. This Software is provided AS-IS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER THE LICENSOR NOR ITS
+SUPPLIERS WILL BE LIABLE TO THE FOUNDATION OR ITS LICENSEES FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+THE USE OR DISTRIBUTION OF THE WORK OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+This License Agreement is the entire agreement of the parties
+with respect to its subject matter, and may only be amended by a
+writing signed by each party. This License Agreement may be
+executed in one or more counterparts, each of which shall be
+considered an original.
+
+    IN WITNESS WHEREOF, Licensor has executed this License Agreement
+as of the date first written above.
+
+
+    LICENSOR:
+
+
+    Signed By: _____________________________________   &lt;--- Your boss's sign here
+
+    Print Name: _____Lei Li_________________________   &lt;--- Your boss's name here
+
+    Title: ____Director_____________________________   &lt;--- Your boss's title here
+
+    Representing: ____ABC Software Co., Ltd. _______ 
+
+    ________________________________________________
+
+    Contact Name: ____Lei Li________________________   &lt;--- Your boss's name here
+
+    Contact Email: ____lilei@abc.com________________   &lt;--- Your boss's email here
+
+Exhibit A
+
+List of software and other intellectual property covered by this agreement:
+
+* Github address where your code is hosted
+* Pull request link
+</code></pre>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/software-donation-guide.json b/en-us/docs/developers/contributor-guide/software-donation-guide.json
new file mode 100644
index 00000000..cb38b004
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/software-donation-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "software-donation-guide.md",
+  "__html": "<h1>Software donation guide</h1>\n<p>Before you go through this guide, make sure you have confirmed with PPMC that a SGA is actually needed.</p>\n<p>If you are donating significant amount of code or documentation to Apache Dubbo (incubating), you will be required to sign a <a href=\"https://www.apache.org/licenses/#grants\">Software Grant</a> before your code/doc could be merged.</p>\n<h4>Steps</h4>\n<ol>\n<li>Download this <a href=\"https://www.apache.org/licenses/software-grant-template.pdf\">pdf</a></li>\n<li>Print it out</li>\n<li>Fill in the blanks (see below as an example)</li>\n<li>Request your boss to sign it</li>\n<li>Scan it</li>\n<li>Send an email to <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a> and cc <a href=\"mailto:private@dubbo.apache.org\">private@dubbo.apache.org</a></li>\n</ol>\n<h4>Example:</h4>\n<p>Below is an text versioned <strong>example</strong>, original text could be found <a href=\"https://www.apache.org/licenses/software-grant.txt\">here</a></p>\n<pre><code>License Agreement\n\n\n    This License Agreement is entered into as of the _12th_ day of\n___April____, __2018__ by ___ABC Software Co., Ltd.____ (&quot;Licensor&quot;),\nin favor of The Apache Software Foundation, a Delaware nonstock\nmembership corporation (the &quot;Foundation&quot;).\n\n    WHEREAS, Licensor owns or has sufficient rights to contribute the\nsoftware source code and other related intellectual property as\nitemized on Exhibit A (&quot;Software&quot;) under the terms of this agreement\nto the Foundation for use within Foundation software development\nprojects (&quot;Projects&quot;).\n\n    NOW, THEREFORE, FOR GOOD AND VALUABLE CONSIDERATION, the receipt\nand legal sufficiency of which are hereby acknowledged, the parties\nhereto, intending to be legally bound, agree as follows:\n\n1. Subject to the terms and conditions of this License, Licensor\nhereby grants to the Foundation:\n\n  a) a non-exclusive, worldwide, royalty-free, irrevocable\n     copyright license to reproduce, prepare derivative works of,\n     publicly display, publicly perform, distribute and sublicense,\n     internally and externally, the Software and such derivative\n     works, in source code and object code form; and,\n\n  b) a non-exclusive, worldwide, royalty-free, irrevocable\n     patent license under Licensed Patents to make, use, sell,\n     offer to sell, import and otherwise transfer the Software\n     in source code and object code form. &quot;Licensed Patents&quot; mean\n     patent claims owned by Licensor which are necessarily\n     infringed by the use or sale of the Software alone.\n\n2. Licensor represents that, to Licensor's knowledge, Licensor is\nlegally entitled to grant the above license. Licensor agrees to notify\nthe Foundation of any facts or circumstances of which Licensor becomes\naware and which makes or would make Licensor's representations in this\nLicense Agreement inaccurate in any respect.\n\n3. This Software is provided AS-IS, WITHOUT WARRANTIES OR CONDITIONS\nOF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,\nANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY\nOR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER THE LICENSOR NOR ITS\nSUPPLIERS WILL BE LIABLE TO THE FOUNDATION OR ITS LICENSEES FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OR DISTRIBUTION OF THE WORK OR THE EXERCISE OF ANY RIGHTS\nGRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\nThis License Agreement is the entire agreement of the parties\nwith respect to its subject matter, and may only be amended by a\nwriting signed by each party. This License Agreement may be\nexecuted in one or more counterparts, each of which shall be\nconsidered an original.\n\n    IN WITNESS WHEREOF, Licensor has executed this License Agreement\nas of the date first written above.\n\n\n    LICENSOR:\n\n\n    Signed By: _____________________________________   &lt;--- Your boss's sign here\n\n    Print Name: _____Lei Li_________________________   &lt;--- Your boss's name here\n\n    Title: ____Director_____________________________   &lt;--- Your boss's title here\n\n    Representing: ____ABC Software Co., Ltd. _______ \n\n    ________________________________________________\n\n    Contact Name: ____Lei Li________________________   &lt;--- Your boss's name here\n\n    Contact Email: ____lilei@abc.com________________   &lt;--- Your boss's email here\n\nExhibit A\n\nList of software and other intellectual property covered by this agreement:\n\n* Github address where your code is hosted\n* Pull request link\n</code></pre>\n",
+  "link": "/en-us/docs/developers/contributor-guide/software-donation-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html b/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html
new file mode 100644
index 00000000..7a091d67
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html
@@ -0,0 +1,132 @@
+<!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="software-donation-guide_dev" />
+	<meta name="description" content="software-donation-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>software-donation-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Software donation guide</h1>
+<p>Before you go through this guide, make sure you have confirmed with PPMC that a SGA is actually needed.</p>
+<p>If you are donating significant amount of code or documentation to Apache Dubbo (incubating), you will be required to sign a <a href="https://www.apache.org/licenses/#grants">Software Grant</a> before your code/doc could be merged.</p>
+<h4>Steps</h4>
+<ol>
+<li>Download this <a href="https://www.apache.org/licenses/software-grant-template.pdf">pdf</a></li>
+<li>Print it out</li>
+<li>Fill in the blanks (see below as an example)</li>
+<li>Request your boss to sign it</li>
+<li>Scan it</li>
+<li>Send an email to <a href="mailto:secretary@apache.org">secretary@apache.org</a> and cc <a href="mailto:private@dubbo.apache.org">private@dubbo.apache.org</a></li>
+</ol>
+<h4>Example:</h4>
+<p>Below is an text versioned <strong>example</strong>, original text could be found <a href="https://www.apache.org/licenses/software-grant.txt">here</a></p>
+<pre><code>License Agreement
+
+
+    This License Agreement is entered into as of the _12th_ day of
+___April____, __2018__ by ___ABC Software Co., Ltd.____ (&quot;Licensor&quot;),
+in favor of The Apache Software Foundation, a Delaware nonstock
+membership corporation (the &quot;Foundation&quot;).
+
+    WHEREAS, Licensor owns or has sufficient rights to contribute the
+software source code and other related intellectual property as
+itemized on Exhibit A (&quot;Software&quot;) under the terms of this agreement
+to the Foundation for use within Foundation software development
+projects (&quot;Projects&quot;).
+
+    NOW, THEREFORE, FOR GOOD AND VALUABLE CONSIDERATION, the receipt
+and legal sufficiency of which are hereby acknowledged, the parties
+hereto, intending to be legally bound, agree as follows:
+
+1. Subject to the terms and conditions of this License, Licensor
+hereby grants to the Foundation:
+
+  a) a non-exclusive, worldwide, royalty-free, irrevocable
+     copyright license to reproduce, prepare derivative works of,
+     publicly display, publicly perform, distribute and sublicense,
+     internally and externally, the Software and such derivative
+     works, in source code and object code form; and,
+
+  b) a non-exclusive, worldwide, royalty-free, irrevocable
+     patent license under Licensed Patents to make, use, sell,
+     offer to sell, import and otherwise transfer the Software
+     in source code and object code form. &quot;Licensed Patents&quot; mean
+     patent claims owned by Licensor which are necessarily
+     infringed by the use or sale of the Software alone.
+
+2. Licensor represents that, to Licensor's knowledge, Licensor is
+legally entitled to grant the above license. Licensor agrees to notify
+the Foundation of any facts or circumstances of which Licensor becomes
+aware and which makes or would make Licensor's representations in this
+License Agreement inaccurate in any respect.
+
+3. This Software is provided AS-IS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER THE LICENSOR NOR ITS
+SUPPLIERS WILL BE LIABLE TO THE FOUNDATION OR ITS LICENSEES FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+THE USE OR DISTRIBUTION OF THE WORK OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+This License Agreement is the entire agreement of the parties
+with respect to its subject matter, and may only be amended by a
+writing signed by each party. This License Agreement may be
+executed in one or more counterparts, each of which shall be
+considered an original.
+
+    IN WITNESS WHEREOF, Licensor has executed this License Agreement
+as of the date first written above.
+
+
+    LICENSOR:
+
+
+    Signed By: _____________________________________   &lt;--- Your boss's sign here
+
+    Print Name: _____Lei Li_________________________   &lt;--- Your boss's name here
+
+    Title: ____Director_____________________________   &lt;--- Your boss's title here
+
+    Representing: ____ABC Software Co., Ltd. _______ 
+
+    ________________________________________________
+
+    Contact Name: ____Lei Li________________________   &lt;--- Your boss's name here
+
+    Contact Email: ____lilei@abc.com________________   &lt;--- Your boss's email here
+
+Exhibit A
+
+List of software and other intellectual property covered by this agreement:
+
+* Github address where your code is hosted
+* Pull request link
+</code></pre>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/software-donation-guide_dev.json b/en-us/docs/developers/contributor-guide/software-donation-guide_dev.json
new file mode 100644
index 00000000..060641f8
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/software-donation-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "software-donation-guide_dev.md",
+  "__html": "<h1>Software donation guide</h1>\n<p>Before you go through this guide, make sure you have confirmed with PPMC that a SGA is actually needed.</p>\n<p>If you are donating significant amount of code or documentation to Apache Dubbo (incubating), you will be required to sign a <a href=\"https://www.apache.org/licenses/#grants\">Software Grant</a> before your code/doc could be merged.</p>\n<h4>Steps</h4>\n<ol>\n<li>Download this <a href=\"https://www.apache.org/licenses/software-grant-template.pdf\">pdf</a></li>\n<li>Print it out</li>\n<li>Fill in the blanks (see below as an example)</li>\n<li>Request your boss to sign it</li>\n<li>Scan it</li>\n<li>Send an email to <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a> and cc <a href=\"mailto:private@dubbo.apache.org\">private@dubbo.apache.org</a></li>\n</ol>\n<h4>Example:</h4>\n<p>Below is an text versioned <strong>example</strong>, original text could be found <a href=\"https://www.apache.org/licenses/software-grant.txt\">here</a></p>\n<pre><code>License Agreement\n\n\n    This License Agreement is entered into as of the _12th_ day of\n___April____, __2018__ by ___ABC Software Co., Ltd.____ (&quot;Licensor&quot;),\nin favor of The Apache Software Foundation, a Delaware nonstock\nmembership corporation (the &quot;Foundation&quot;).\n\n    WHEREAS, Licensor owns or has sufficient rights to contribute the\nsoftware source code and other related intellectual property as\nitemized on Exhibit A (&quot;Software&quot;) under the terms of this agreement\nto the Foundation for use within Foundation software development\nprojects (&quot;Projects&quot;).\n\n    NOW, THEREFORE, FOR GOOD AND VALUABLE CONSIDERATION, the receipt\nand legal sufficiency of which are hereby acknowledged, the parties\nhereto, intending to be legally bound, agree as follows:\n\n1. Subject to the terms and conditions of this License, Licensor\nhereby grants to the Foundation:\n\n  a) a non-exclusive, worldwide, royalty-free, irrevocable\n     copyright license to reproduce, prepare derivative works of,\n     publicly display, publicly perform, distribute and sublicense,\n     internally and externally, the Software and such derivative\n     works, in source code and object code form; and,\n\n  b) a non-exclusive, worldwide, royalty-free, irrevocable\n     patent license under Licensed Patents to make, use, sell,\n     offer to sell, import and otherwise transfer the Software\n     in source code and object code form. &quot;Licensed Patents&quot; mean\n     patent claims owned by Licensor which are necessarily\n     infringed by the use or sale of the Software alone.\n\n2. Licensor represents that, to Licensor's knowledge, Licensor is\nlegally entitled to grant the above license. Licensor agrees to notify\nthe Foundation of any facts or circumstances of which Licensor becomes\naware and which makes or would make Licensor's representations in this\nLicense Agreement inaccurate in any respect.\n\n3. This Software is provided AS-IS, WITHOUT WARRANTIES OR CONDITIONS\nOF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,\nANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY\nOR FITNESS FOR A PARTICULAR PURPOSE.  NEITHER THE LICENSOR NOR ITS\nSUPPLIERS WILL BE LIABLE TO THE FOUNDATION OR ITS LICENSEES FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED\nAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OR DISTRIBUTION OF THE WORK OR THE EXERCISE OF ANY RIGHTS\nGRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\nThis License Agreement is the entire agreement of the parties\nwith respect to its subject matter, and may only be amended by a\nwriting signed by each party. This License Agreement may be\nexecuted in one or more counterparts, each of which shall be\nconsidered an original.\n\n    IN WITNESS WHEREOF, Licensor has executed this License Agreement\nas of the date first written above.\n\n\n    LICENSOR:\n\n\n    Signed By: _____________________________________   &lt;--- Your boss's sign here\n\n    Print Name: _____Lei Li_________________________   &lt;--- Your boss's name here\n\n    Title: ____Director_____________________________   &lt;--- Your boss's title here\n\n    Representing: ____ABC Software Co., Ltd. _______ \n\n    ________________________________________________\n\n    Contact Name: ____Lei Li________________________   &lt;--- Your boss's name here\n\n    Contact Email: ____lilei@abc.com________________   &lt;--- Your boss's email here\n\nExhibit A\n\nList of software and other intellectual property covered by this agreement:\n\n* Github address where your code is hosted\n* Pull request link\n</code></pre>\n",
+  "link": "/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/test-coverage-guide.html b/en-us/docs/developers/contributor-guide/test-coverage-guide.html
new file mode 100644
index 00000000..66ee8793
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/test-coverage-guide.html
@@ -0,0 +1,53 @@
+<!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="test-coverage-guide" />
+	<meta name="description" content="test-coverage-guide" />
+	<!-- 网页标签标题 -->
+	<title>test-coverage-guide</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Test coverage guide</h1>
+<h3>1.The benefits of unit testing</h3>
+<ul>
+<li>Unit test code can help everyone to go into details and understand the function of the code.</li>
+<li>We can find bugs by test case, and then enhance the robustness of the code.</li>
+<li>Test case code is also the demo usage of the core code.</li>
+</ul>
+<h3>2.Some design principle of unit test case</h3>
+<ul>
+<li>Steps, fine-grained and combination conditions should be well designed.</li>
+<li>Attention to boundary condition test</li>
+<li>Test code should also be designed without writing useless code.</li>
+<li>When you find a <code>method</code> that is hard to write unit test, if you can be sure the <code>method</code> is &quot;smelly code&quot;, then  refactor it with the committer.</li>
+<li>The mock framework in dubbo is: <a href="http://site.mockito.org/">mockito</a>. Some tutorials:<a href="http://www.baeldung.com/bdd-mockito">mockito tutorial</a>,<a href="https://dzone.com/refcardz/mockito">mockito refcard</a></li>
+<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>
+</ul>
+<h3>3.The specified value of the test coverage</h3>
+<ul>
+<li>In the stage, the test coverage specified value of delta changed codes is :&gt;=60%. The higher, the better.</li>
+<li>We can see the coverage report in this page: <a href="https://codecov.io/gh/apache/incubator-dubbo">https://codecov.io/gh/apache/incubator-dubbo</a></li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/test-coverage-guide.json b/en-us/docs/developers/contributor-guide/test-coverage-guide.json
new file mode 100644
index 00000000..cbb496a9
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/test-coverage-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "test-coverage-guide.md",
+  "__html": "<h1>Test coverage guide</h1>\n<h3>1.The benefits of unit testing</h3>\n<ul>\n<li>Unit test code can help everyone to go into details and understand the function of the code.</li>\n<li>We can find bugs by test case, and then enhance the robustness of the code.</li>\n<li>Test case code is also the demo usage of the core code.</li>\n</ul>\n<h3>2.Some design principle of unit test case</h3>\n<ul>\n<li>Steps, fine-grained and combination conditions should be well designed.</li>\n<li>Attention to boundary condition test</li>\n<li>Test code should also be designed without writing useless code.</li>\n<li>When you find a <code>method</code> that is hard to write unit test, if you can be sure the <code>method</code> is &quot;smelly code&quot;, then  refactor it with the committer.</li>\n<li>The mock framework in dubbo is: <a href=\"http://site.mockito.org/\">mockito</a>. Some tutorials:<a href=\"http://www.baeldung.com/bdd-mockito\">mockito tutorial</a>,<a href=\"https://dzone.com/refcardz/mockito\">mockito refcard</a></li>\n<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>\n</ul>\n<h3>3.The specified value of the test coverage</h3>\n<ul>\n<li>In the stage, the test coverage specified value of delta changed codes is :&gt;=60%. The higher, the better.</li>\n<li>We can see the coverage report in this page: <a href=\"https://codecov.io/gh/apache/incubator-dubbo\">https://codecov.io/gh/apache/incubator-dubbo</a></li>\n</ul>\n",
+  "link": "/en-us/docs/developers/contributor-guide/test-coverage-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html b/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html
new file mode 100644
index 00000000..528777f6
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html
@@ -0,0 +1,53 @@
+<!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="test-coverage-guide_dev" />
+	<meta name="description" content="test-coverage-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>test-coverage-guide_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Test coverage guide</h1>
+<h3>1.The benefits of unit testing</h3>
+<ul>
+<li>Unit test code can help everyone to go into details and understand the function of the code.</li>
+<li>We can find bugs by test case, and then enhance the robustness of the code.</li>
+<li>Test case code is also the demo usage of the core code.</li>
+</ul>
+<h3>2.Some design principle of unit test case</h3>
+<ul>
+<li>Steps, fine-grained and combination conditions should be well designed.</li>
+<li>Attention to boundary condition test</li>
+<li>Test code should also be designed without writing useless code.</li>
+<li>When you find a <code>method</code> that is hard to write unit test, if you can be sure the <code>method</code> is &quot;smelly code&quot;, then  refactor it with the committer.</li>
+<li>The mock framework in dubbo is: <a href="http://site.mockito.org/">mockito</a>. Some tutorials:<a href="http://www.baeldung.com/bdd-mockito">mockito tutorial</a>,<a href="https://dzone.com/refcardz/mockito">mockito refcard</a></li>
+<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>
+</ul>
+<h3>3.The specified value of the test coverage</h3>
+<ul>
+<li>In the stage, the test coverage specified value of delta changed codes is :&gt;=60%. The higher, the better.</li>
+<li>We can see the coverage report in this page: <a href="https://codecov.io/gh/apache/incubator-dubbo">https://codecov.io/gh/apache/incubator-dubbo</a></li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.json b/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.json
new file mode 100644
index 00000000..c8e5b7cc
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "test-coverage-guide_dev.md",
+  "__html": "<h1>Test coverage guide</h1>\n<h3>1.The benefits of unit testing</h3>\n<ul>\n<li>Unit test code can help everyone to go into details and understand the function of the code.</li>\n<li>We can find bugs by test case, and then enhance the robustness of the code.</li>\n<li>Test case code is also the demo usage of the core code.</li>\n</ul>\n<h3>2.Some design principle of unit test case</h3>\n<ul>\n<li>Steps, fine-grained and combination conditions should be well designed.</li>\n<li>Attention to boundary condition test</li>\n<li>Test code should also be designed without writing useless code.</li>\n<li>When you find a <code>method</code> that is hard to write unit test, if you can be sure the <code>method</code> is &quot;smelly code&quot;, then  refactor it with the committer.</li>\n<li>The mock framework in dubbo is: <a href=\"http://site.mockito.org/\">mockito</a>. Some tutorials:<a href=\"http://www.baeldung.com/bdd-mockito\">mockito tutorial</a>,<a href=\"https://dzone.com/refcardz/mockito\">mockito refcard</a></li>\n<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>\n</ul>\n<h3>3.The specified value of the test coverage</h3>\n<ul>\n<li>In the stage, the test coverage specified value of delta changed codes is :&gt;=60%. The higher, the better.</li>\n<li>We can see the coverage report in this page: <a href=\"https://codecov.io/gh/apache/incubator-dubbo\">https://codecov.io/gh/apache/incubator-dubbo</a></li>\n</ul>\n",
+  "link": "/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/developers_dev.json b/en-us/docs/developers/developers_dev.json
index 20f6f6ff..4878333d 100644
--- a/en-us/docs/developers/developers_dev.json
+++ b/en-us/docs/developers/developers_dev.json
@@ -1,4 +1,6 @@
 {
   "filename": "developers_dev.md",
-  "__html": "<h2>Developers</h2>\n<p>This page shows Dubbo developers. Please file PR to add or change items.</p>\n<h3>Committers</h3>\n<table>\n<thead>\n<tr>\n<th>Apache ID</th>\n<th>Name</th>\n<th>Organization</th>\n<th>Role</th>\n<th>TimeZone</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>jmclean</td>\n<td>Justin Mclean</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+11</td>\n</tr>\n<tr>\n<td>markt</td>\n<td>Mark Thomas</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+0</td>\n</tr>\n<tr>\n<td>wave</td>\n<td>Dave Fisher</td>\n<td></td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>johndament</td>\n<td>John D. Ament</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>jfclere</td>\n<td>Jean-Frederic Clere</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>huxing</td>\n<td>Huxing Zhang</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>vongosling</td>\n<td>Von Gosling</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>leonleeldc</td>\n<td>Dingcheng Li</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>iluo</td>\n<td>Ian Luo</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujun</td>\n<td>Jun Liu</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>zhangliang</td>\n<td>Liang Zhang</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujieqin</td>\n<td>Liujie Qin</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mercyblitz</td>\n<td>Mercy Ma</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>wangxin</td>\n<td>Xin Wang</td>\n<td>Weidian</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yuyijq</td>\n<td>Zhaohui Yu</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yiji</td>\n<td>Shang Zonghai</td>\n<td>Youzan</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>hyunkun</td>\n<td>YunKun Huang</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>jerrick</td>\n<td>Yong Zhu</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>kimmking</td>\n<td>Kimm King</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>carryxyh</td>\n<td>Yuhang Xiu</td>\n<td>Netease</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>min</td>\n<td>Minxuan Zhuang</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mjk</td>\n<td>Jinkai Ma</td>\n<td>Handuyishe</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n<h3>Contributors</h3>\n<table>\n<thead>\n<tr>\n<th>Github ID</th>\n<th>Github URL</th>\n<th>Organization</th>\n<th>TimeZone</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>leyou240</td>\n<td><a href=\"https://github.com/leyou240\">https://github.com/leyou240</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>chenzhiguo</td>\n<td><a href=\"https://github.com/chenzhiguo\">https://github.com/chenzhiguo</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>biyuhao</td>\n<td><a href=\"https://github.com/biyuhao\">https://github.com/biyuhao</a></td>\n<td>Asiainfo-sec</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<h2>Developers</h2>\n<p>This page shows Dubbo developers. Please file PR to add or change items.</p>\n<h3>Committers</h3>\n<table>\n<thead>\n<tr>\n<th>Apache ID</th>\n<th>Name</th>\n<th>Organization</th>\n<th>Role</th>\n<th>TimeZone</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>jmclean</td>\n<td>Justin Mclean</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+11</td>\n</tr>\n<tr>\n<td>markt</td>\n<td>Mark Thomas</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+0</td>\n</tr>\n<tr>\n<td>wave</td>\n<td>Dave Fisher</td>\n<td></td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>johndament</td>\n<td>John D. Ament</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>jfclere</td>\n<td>Jean-Frederic Clere</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>huxing</td>\n<td>Huxing Zhang</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>vongosling</td>\n<td>Von Gosling</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>leonleeldc</td>\n<td>Dingcheng Li</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>iluo</td>\n<td>Ian Luo</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujun</td>\n<td>Jun Liu</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>zhangliang</td>\n<td>Liang Zhang</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujieqin</td>\n<td>Liujie Qin</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mercyblitz</td>\n<td>Mercy Ma</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>wangxin</td>\n<td>Xin Wang</td>\n<td>Weidian</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yuyijq</td>\n<td>Zhaohui Yu</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yiji</td>\n<td>Shang Zonghai</td>\n<td>Youzan</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>hyunkun</td>\n<td>YunKun Huang</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>jerrick</td>\n<td>Yong Zhu</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>kimmking</td>\n<td>Kimm King</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>carryxyh</td>\n<td>Yuhang Xiu</td>\n<td>Netease</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>min</td>\n<td>Minxuan Zhuang</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mjk</td>\n<td>Jinkai Ma</td>\n<td>Handuyishe</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n<h3>Contributors</h3>\n<table>\n<thead>\n<tr>\n<th>Github ID</th>\n<th>Github URL</th>\n<th>Organization</th>\n<th>TimeZone</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>leyou240</td>\n<td><a href=\"https://github.com/leyou240\">https://github.com/leyou240</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>chenzhiguo</td>\n<td><a href=\"https://github.com/chenzhiguo\">https://github.com/chenzhiguo</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>biyuhao</td>\n<td><a href=\"https://github.com/biyuhao\">https://github.com/biyuhao</a></td>\n<td>Asiainfo-sec</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/developers/developers_dev.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/developers/faq.html b/en-us/docs/developers/faq.html
new file mode 100644
index 00000000..aa0104c5
--- /dev/null
+++ b/en-us/docs/developers/faq.html
@@ -0,0 +1,54 @@
+<!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="faq" />
+	<meta name="description" content="faq" />
+	<!-- 网页标签标题 -->
+	<title>faq</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>FAQ</h1>
+<h3>Where is dubbo-admin?</h3>
+<p>dubbo-admin has been moved from core repository to <a href="https://github.com/apache/incubator-dubbo-ops">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>
+<h3>Which version should I choose?</h3>
+<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>
+<ul>
+<li>
+<p>2.7.x (master): requires Java 1.8, major feature branch.</p>
+</li>
+<li>
+<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>
+</li>
+<li>
+<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>
+</li>
+</ul>
+<p>check <a href="https://github.com/apache/incubator-dubbo/issues/1208">this</a> for detailed version management plan.</p>
+<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>
+<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>
+<h4>How to register ip correctly in docker?</h4>
+<p><a href="https://github.com/alibaba/dubbo/issues/742">Example question</a></p>
+<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker">here</a>.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/faq.json b/en-us/docs/developers/faq.json
new file mode 100644
index 00000000..c8cc0fdb
--- /dev/null
+++ b/en-us/docs/developers/faq.json
@@ -0,0 +1,6 @@
+{
+  "filename": "faq.md",
+  "__html": "<h1>FAQ</h1>\n<h3>Where is dubbo-admin?</h3>\n<p>dubbo-admin has been moved from core repository to <a href=\"https://github.com/apache/incubator-dubbo-ops\">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>\n<h3>Which version should I choose?</h3>\n<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>\n<ul>\n<li>\n<p>2.7.x (master): requires Java 1.8, major feature branch.</p>\n</li>\n<li>\n<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>\n</li>\n<li>\n<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>\n</li>\n</ul>\n<p>check <a href=\"https://github.com/apache/incubator-dubbo/issues/1208\">this</a> for detailed version management plan.</p>\n<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>\n<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>\n<h4>How to register ip correctly in docker?</h4>\n<p><a href=\"https://github.com/alibaba/dubbo/issues/742\">Example question</a></p>\n<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">here</a>.</p>\n",
+  "link": "/en-us/docs/developers/faq.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/guide_dev.json b/en-us/docs/developers/guide_dev.json
index ee49af1d..ef68c4de 100644
--- a/en-us/docs/developers/guide_dev.json
+++ b/en-us/docs/developers/guide_dev.json
@@ -1,4 +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 Contributor License Agreement. Signing the contributor’s agreement does not grant anyone commit rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. Active contributors might be asked to join the core team, and given the ability to merge pull requests.</p>\n<h3>Contact</h3>\n<h4>Mailing list</h4>\n<p>The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this <a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide\">guide</a> for detailed documentation on how to subscribe.</p>\n<ul>\n<li><a href=\"mailto:dev-subscribe@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.</li>\n<li><a href=\"mailto:commits-subscribe@dubbo.incubator.apache.org\">commits@dubbo.incubator.apache.org</a>: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.</li>\n<li><a href=\"mailto:notification-subscribe@dubbo.incubator.apache.org\">notification@dubbo.incubator.apache.org</a>: all the Github <a href=\"https://github.com/apache/incubator-dubbo/issues\">issue</a> updates and <a href=\"https://github.com/apache/incubator-dubbo/pulls\">pull request</a> updates will be sent to this mailing list.</li>\n</ul>\n<h3>Reporting issue</h3>\n<p>Please follow the <a href=\"https://github.com/apache/incubator-dubbo/issues/new?template=dubbo-issue-report-template.md\">template</a> for reporting any issues.</p>\n<h3>Code Conventions</h3>\n<p>Our code style is almost in line with the standard java conventions (Popular IDE's default setting satisfy this), with the following additional restricts:</p>\n<ul>\n<li>\n<p>If there are more than 120 characters in current line, start a new line.</p>\n</li>\n<li>\n<p>Make sure all new .java files to have a simple Javadoc class comment with at least a @date tag identifying birth, and preferably at least a paragraph on what the class is for.</p>\n</li>\n<li>\n<p>Add the ASF license header comment to all new .java files (copy from existing files in the project)</p>\n</li>\n<li>\n<p>Make sure no @author tag added to the file you contribute since @author tag is not used at Apache, other ways such as cvs will record all your contributions fairly.</p>\n</li>\n<li>\n<p>Add some Javadocs and, if you change the namespace, some XSD doc elements.</p>\n</li>\n<li>\n<p>A few unit tests should be added for a new feature or an important bugfix.</p>\n</li>\n<li>\n<p>If no-one else is using your branch, please rebase it against the current master (or other target branch in the main project).</p>\n</li>\n<li>\n<p>When writing a commit message please follow these conventions, if you are fixing an existing issue please add Fixes #XXX at the end of the commit message (where XXX is the issue number).</p>\n</li>\n</ul>\n<h3>Contribution flow</h3>\n<p>This is a rough outline of what a contributor's workflow looks like:</p>\n<ul>\n<li>Fork the current repository</li>\n<li>Create a topic branch from where to base the contribution. This is usually master.</li>\n<li>Make commits of logical units.</li>\n<li>Make sure commit messages are in the proper format (see below).</li>\n<li>Push changes in a topic branch to your forked repository.</li>\n<li>Follow the checklist in the <a href=\"https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md\">pull request template</a></li>\n<li>Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:</li>\n</ul>\n<pre><code>git remote add upstream git@github.com:apache/incubator-dubbo.git\ngit fetch upstream\ngit rebase upstream/master\ngit checkout -b your_awesome_patch\n... add some work\ngit push origin your_awesome_patch\n</code></pre>\n<ul>\n<li>Submit a pull request to apache/incubator-dubbo and wait for the reply.</li>\n</ul>\n<p>Thanks for contributing!</p>\n<h3>Code style</h3>\n<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.\nIf you use Eclipse you can config manually by referencing the same file.</p>\n"
+  "__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 Contributor License Agreement. Signing the contributor’s agreement does not grant anyone commit rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. Active contributors might be asked to join the core team, and given the ability to merge pull requests.</p>\n<h3>Contact</h3>\n<h4>Mailing list</h4>\n<p>The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this <a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide\">guide</a> for detailed documentation on how to subscribe.</p>\n<ul>\n<li><a href=\"mailto:dev-subscribe@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>: the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.</li>\n<li><a href=\"mailto:commits-subscribe@dubbo.incubator.apache.org\">commits@dubbo.incubator.apache.org</a>: all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.</li>\n<li><a href=\"mailto:notification-subscribe@dubbo.incubator.apache.org\">notification@dubbo.incubator.apache.org</a>: all the Github <a href=\"https://github.com/apache/incubator-dubbo/issues\">issue</a> updates and <a href=\"https://github.com/apache/incubator-dubbo/pulls\">pull request</a> updates will be sent to this mailing list.</li>\n</ul>\n<h3>Reporting issue</h3>\n<p>Please follow the <a href=\"https://github.com/apache/incubator-dubbo/issues/new?template=dubbo-issue-report-template.md\">template</a> for reporting any issues.</p>\n<h3>Code Conventions</h3>\n<p>Our code style is almost in line with the standard java conventions (Popular IDE's default setting satisfy this), with the following additional restricts:</p>\n<ul>\n<li>\n<p>If there are more than 120 characters in current line, start a new line.</p>\n</li>\n<li>\n<p>Make sure all new .java files to have a simple Javadoc class comment with at least a @date tag identifying birth, and preferably at least a paragraph on what the class is for.</p>\n</li>\n<li>\n<p>Add the ASF license header comment to all new .java files (copy from existing files in the project)</p>\n</li>\n<li>\n<p>Make sure no @author tag added to the file you contribute since @author tag is not used at Apache, other ways such as cvs will record all your contributions fairly.</p>\n</li>\n<li>\n<p>Add some Javadocs and, if you change the namespace, some XSD doc elements.</p>\n</li>\n<li>\n<p>A few unit tests should be added for a new feature or an important bugfix.</p>\n</li>\n<li>\n<p>If no-one else is using your branch, please rebase it against the current master (or other target branch in the main project).</p>\n</li>\n<li>\n<p>When writing a commit message please follow these conventions, if you are fixing an existing issue please add Fixes #XXX at the end of the commit message (where XXX is the issue number).</p>\n</li>\n</ul>\n<h3>Contribution flow</h3>\n<p>This is a rough outline of what a contributor's workflow looks like:</p>\n<ul>\n<li>Fork the current repository</li>\n<li>Create a topic branch from where to base the contribution. This is usually master.</li>\n<li>Make commits of logical units.</li>\n<li>Make sure commit messages are in the proper format (see below).</li>\n<li>Push changes in a topic branch to your forked repository.</li>\n<li>Follow the checklist in the <a href=\"https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md\">pull request template</a></li>\n<li>Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:</li>\n</ul>\n<pre><code>git remote add upstream git@github.com:apache/incubator-dubbo.git\ngit fetch upstream\ngit rebase upstream/master\ngit checkout -b your_awesome_patch\n... add some work\ngit push origin your_awesome_patch\n</code></pre>\n<ul>\n<li>Submit a pull request to apache/incubator-dubbo and wait for the reply.</li>\n</ul>\n<p>Thanks for contributing!</p>\n<h3>Code style</h3>\n<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.\nIf you use Eclipse you can config manually by referencing the same file.</p>\n",
+  "link": "/en-us/docs/developers/guide_dev.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/developers/user-guide/faq-dev.html b/en-us/docs/developers/user-guide/faq-dev.html
new file mode 100644
index 00000000..d34464a3
--- /dev/null
+++ b/en-us/docs/developers/user-guide/faq-dev.html
@@ -0,0 +1,54 @@
+<!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="faq-dev" />
+	<meta name="description" content="faq-dev" />
+	<!-- 网页标签标题 -->
+	<title>faq-dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>FAQ</h1>
+<h3>Where is dubbo-admin?</h3>
+<p>dubbo-admin has been moved from core repository to <a href="https://github.com/apache/incubator-dubbo-ops">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>
+<h3>Which version should I choose?</h3>
+<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>
+<ul>
+<li>
+<p>2.7.x (master): requires Java 1.8, major feature branch.</p>
+</li>
+<li>
+<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>
+</li>
+<li>
+<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>
+</li>
+</ul>
+<p>check <a href="https://github.com/apache/incubator-dubbo/issues/1208">this</a> for detailed version management plan.</p>
+<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>
+<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>
+<h4>How to register ip correctly in docker?</h4>
+<p><a href="https://github.com/alibaba/dubbo/issues/742">Example question</a></p>
+<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker">here</a>.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/user-guide/faq-dev.json b/en-us/docs/developers/user-guide/faq-dev.json
new file mode 100644
index 00000000..769bfc12
--- /dev/null
+++ b/en-us/docs/developers/user-guide/faq-dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "faq-dev.md",
+  "__html": "<h1>FAQ</h1>\n<h3>Where is dubbo-admin?</h3>\n<p>dubbo-admin has been moved from core repository to <a href=\"https://github.com/apache/incubator-dubbo-ops\">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>\n<h3>Which version should I choose?</h3>\n<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>\n<ul>\n<li>\n<p>2.7.x (master): requires Java 1.8, major feature branch.</p>\n</li>\n<li>\n<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>\n</li>\n<li>\n<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>\n</li>\n</ul>\n<p>check <a href=\"https://github.com/apache/incubator-dubbo/issues/1208\">this</a> for detailed version management plan.</p>\n<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>\n<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>\n<h4>How to register ip correctly in docker?</h4>\n<p><a href=\"https://github.com/alibaba/dubbo/issues/742\">Example question</a></p>\n<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">here</a>.</p>\n",
+  "link": "/en-us/docs/developers/user-guide/faq-dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/user-guide/faq.html b/en-us/docs/developers/user-guide/faq.html
new file mode 100644
index 00000000..aa0104c5
--- /dev/null
+++ b/en-us/docs/developers/user-guide/faq.html
@@ -0,0 +1,54 @@
+<!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="faq" />
+	<meta name="description" content="faq" />
+	<!-- 网页标签标题 -->
+	<title>faq</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>FAQ</h1>
+<h3>Where is dubbo-admin?</h3>
+<p>dubbo-admin has been moved from core repository to <a href="https://github.com/apache/incubator-dubbo-ops">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>
+<h3>Which version should I choose?</h3>
+<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>
+<ul>
+<li>
+<p>2.7.x (master): requires Java 1.8, major feature branch.</p>
+</li>
+<li>
+<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>
+</li>
+<li>
+<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>
+</li>
+</ul>
+<p>check <a href="https://github.com/apache/incubator-dubbo/issues/1208">this</a> for detailed version management plan.</p>
+<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>
+<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>
+<h4>How to register ip correctly in docker?</h4>
+<p><a href="https://github.com/alibaba/dubbo/issues/742">Example question</a></p>
+<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker">here</a>.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/user-guide/faq.json b/en-us/docs/developers/user-guide/faq.json
new file mode 100644
index 00000000..5b32c930
--- /dev/null
+++ b/en-us/docs/developers/user-guide/faq.json
@@ -0,0 +1,6 @@
+{
+  "filename": "faq.md",
+  "__html": "<h1>FAQ</h1>\n<h3>Where is dubbo-admin?</h3>\n<p>dubbo-admin has been moved from core repository to <a href=\"https://github.com/apache/incubator-dubbo-ops\">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>\n<h3>Which version should I choose?</h3>\n<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>\n<ul>\n<li>\n<p>2.7.x (master): requires Java 1.8, major feature branch.</p>\n</li>\n<li>\n<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>\n</li>\n<li>\n<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>\n</li>\n</ul>\n<p>check <a href=\"https://github.com/apache/incubator-dubbo/issues/1208\">this</a> for detailed version management plan.</p>\n<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>\n<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>\n<h4>How to register ip correctly in docker?</h4>\n<p><a href=\"https://github.com/alibaba/dubbo/issues/742\">Example question</a></p>\n<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">here</a>.</p>\n",
+  "link": "/en-us/docs/developers/user-guide/faq.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/user-guide/faq_dev.html b/en-us/docs/developers/user-guide/faq_dev.html
new file mode 100644
index 00000000..108bf129
--- /dev/null
+++ b/en-us/docs/developers/user-guide/faq_dev.html
@@ -0,0 +1,54 @@
+<!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="faq_dev" />
+	<meta name="description" content="faq_dev" />
+	<!-- 网页标签标题 -->
+	<title>faq_dev</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="/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 href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/docs/user/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/developers/developers_dev.html">DEVELOPERS</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/index.html">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community/index.html">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="/en-us/blog/download.html">DOWNLOAD</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>Documentation</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>User doc</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Preface<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/background.html" target="_self">Background</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/requirements.html" target="_self">Requirements</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/architecture.html" target="_self">Architecture</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/preface/usage.html" target="_self">Usage</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/dependencies.html" target="_self">Dependencies</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/maturity.html" target="_self">Maturality</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Configuration<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/xml.html" target="_self">XML configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/properties.html" target="_self">Properties configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/api.html" target="_self">API configuration</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/configuration/annotation.html" target="_self">Annotation configuration</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Demos<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/preflight-check.html" target="_self">Start check</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/fault-tolerent-strategy.html" target="_self">Fault-tolerent strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/loadbalance.html" target="_self">Load balance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/thread-model.html" target="_self">Thread model</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/explicit-target.html" target="_self">Connecting certain provider straightly</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/subscribe-only.html" target="_self">Subscribe only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/registry-only.html" target="_self">Registry only</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/static-service.html" target="_self">Static service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-protocols.html" target="_self">Multi-protocols</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-registry.html" target="_self">Multi-registries</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-group.html" target="_self">Service group</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/multi-versions.html" target="_self">Multi-versions</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/group-merger.html" target="_self">Group merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/parameter-validation.html" target="_self">Parameter validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/result-cache.html" target="_self">Result cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-reference.html" target="_self">Generic reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/generic-service.html" target="_self">Generic service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/echo-service.html" target="_self">Echo service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/context.html" target="_self">Context</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/attachment.html" target="_self">Attachment</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/async-call.html" target="_self">Asynchronous call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-call.html" target="_self">Local call</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/callback-parameter.html" target="_self">Callback parameter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/events-notify.html" target="_self">Events notify</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-stub.html" target="_self">Local stub</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/local-mock.html" target="_self">Local mock</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/delay-publish.html" target="_self">Delay publish</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/concurrency-control.html" target="_self">Concurrency control</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-connections.html" target="_self">Connections limitation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/lazy-connect.html" target="_self">Lazy connect</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/stickiness.html" target="_self">Stickness connections</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/token-authorization.html" target="_self">Token authorization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/routing-rule.html" target="_self">Routing rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/config-rule.html" target="_self">Configuration rule</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-downgrade.html" target="_self">Service downgrade</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/graceful-shutdown.html" target="_self">Graceful shutdown</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/hostname-binding.html" target="_self">Hostname binding</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/logger-strategy.html" target="_self">Logger strategy</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/accesslog.html" target="_self">Accesslog</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/service-container.html" target="_self">Service container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/reference-config-cache.html" target="_self">Reference config cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/distributed-transaction.html" target="_self">Distributed transaction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/dump.html" target="_self">Automatic thread dump</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/demos/serialization.html" target="_self">Serialization with FST and Kyro</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/api.html" target="_self">API configuration reference</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Schema configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Protocol configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Registry configuration reference<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/introduction.html" target="_self">Introduction</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/multicast.html" target="_self">Multicast registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/redis.html" target="_self">Redis registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/user/references/registry/simple.html" target="_self">Simple registry</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/telnet.html" target="_self">Telnet command</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/references/maven.html" target="_self">Maven plugin</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/best-practice.html" target="_self">Best practice</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/recommend.html" target="_self">Recommended usage</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/capacity-plan.html" target="_self">Capacity plan</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/perf-test.html" target="_self">Performance testing reports</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/user/coveragence.html" target="_self">Test coverage report</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Developer guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/build.html" target="_self">How To Build</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/design.html" target="_self">Architecture</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/SPI.html" target="_self">How SPI Works</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/implementation.html" target="_self">Init, Process, Protocols</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI Extensions<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/protocol.html" target="_self">Protocol</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/filter.html" target="_self">Filter</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/invoker-listener.html" target="_self">InvokerListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exporter-listener.html" target="_self">ExporterListener</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cluster.html" target="_self">Cluster</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/router.html" target="_self">Router</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/load-balance.html" target="_self">LoadBalance</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/merger.html" target="_self">Merger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/registry.html" target="_self">Registry</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/monitor.html" target="_self">Monitor</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/extension-factory.html" target="_self">ExtensionFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/proxy-factory.html" target="_self">ProxyFactory</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/compiler.html" target="_self">Compiler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/dispatcher.html" target="_self">Dispatcher</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/threadpool.html" target="_self">Threadpool</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/serialize.html" target="_self">Serialization</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/remoting.html" target="_self">Remoting</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/exchanger.html" target="_self">Exchanger</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/networker.html" target="_self">Networker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/telnet-handler.html" target="_self">TelnetHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/status-checker.html" target="_self">StatusChecker</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/container.html" target="_self">Container</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/page.html" target="_self">PageHandler</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/cache.html" target="_self">Cache</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/validation.html" target="_self">Validation</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/dev/impls/logger-adapter.html" target="_self">LoggerAdapter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contract.html" target="_self">Contract</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/coding.html" target="_self">Code Style</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/release.html" target="_self">Versions</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/contribution.html" target="_self">Contribution</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/checklist.html" target="_self">Checklist</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/code-smell.html" target="_self">Code Smell</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/en-us/docs/dev/TCK.html" target="_self">TCK</a></li></ul></li><li class="menu-item menu-item-level-1"><span>Admin guide</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Installation<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/provider-demo.html" target="_self">Install provider demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/consumer-demo.html" target="_self">Install consumer demo</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/zookeeper.html" target="_self">Install Zookeeper configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/redis.html" target="_self">Install Redis configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-registry-center.html" target="_self">Install Simple configuration center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/simple-monitor-center.html" target="_self">Install Simple monitor center</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/install/admin-console.html" target="_self">Install admin console</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>Operation manual<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin console operation guide</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/pinpoint.html" target="_self">Tracking with Pinpoint</a></li><li class="menu-item menu-item-level-3"><a href="/en-us/docs/admin/ops/skywalking.html" target="_self">Tracking with Skywalking</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>FAQ</h1>
+<h3>Where is dubbo-admin?</h3>
+<p>dubbo-admin has been moved from core repository to <a href="https://github.com/apache/incubator-dubbo-ops">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>
+<h3>Which version should I choose?</h3>
+<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>
+<ul>
+<li>
+<p>2.7.x (master): requires Java 1.8, major feature branch.</p>
+</li>
+<li>
+<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>
+</li>
+<li>
+<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>
+</li>
+</ul>
+<p>check <a href="https://github.com/apache/incubator-dubbo/issues/1208">this</a> for detailed version management plan.</p>
+<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>
+<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>
+<h4>How to register ip correctly in docker?</h4>
+<p><a href="https://github.com/alibaba/dubbo/issues/742">Example question</a></p>
+<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker">here</a>.</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">Foundation</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">License</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">Events</a></dd><dd><a href="http://www.apache.org/foundation/sponsorship.html" target="_self">Sponsorship</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">Thanks</a></dd></dl></div><div class="col col-4"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/user/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/dev/build.html" target="_self">Developer guide</a></dd><dd><a href="/en-us/docs/admin/ops/dubbo-ops.html" target="_self">Admin manual</a></dd></dl></div><div class="col col-4"><dl><dt>Resources</dt><dd><a href="/en-us/blog/index.html" target="_self">Blog</a></dd><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://www.apache.org/security/" target="_self">Security</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/en-us/docs/developers/user-guide/faq_dev.json b/en-us/docs/developers/user-guide/faq_dev.json
new file mode 100644
index 00000000..768f33fd
--- /dev/null
+++ b/en-us/docs/developers/user-guide/faq_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "faq_dev.md",
+  "__html": "<h1>FAQ</h1>\n<h3>Where is dubbo-admin?</h3>\n<p>dubbo-admin has been moved from core repository to <a href=\"https://github.com/apache/incubator-dubbo-ops\">https://github.com/apache/incubator-dubbo-ops</a> since 2.6.1</p>\n<h3>Which version should I choose?</h3>\n<p>Currently, dubbo keeps 3 versions evolve in parallel:</p>\n<ul>\n<li>\n<p>2.7.x (master): requires Java 1.8, major feature branch.</p>\n</li>\n<li>\n<p>2.6.x: requires Java 1.6, minor feature &amp; bugfix branch, GA, production ready.</p>\n</li>\n<li>\n<p>2.5.x: requires Java 1.6, maintenance branch, only accept security vulnerability and critical bugfix, expected to be EOL soon.</p>\n</li>\n</ul>\n<p>check <a href=\"https://github.com/apache/incubator-dubbo/issues/1208\">this</a> for detailed version management plan.</p>\n<p>For contributors, please make sure all changes on the right branch, that is, most of the pull request should go to 2.7.x, and be backported to 2.6.x and 2.5.x if necessary. If the fix is specific to a branch, please make sure your pull request goes to the right branch.</p>\n<p>For committers, make sure select the right label and target branch for every PR, and don't forget to back port the fix to lower version is necessary.</p>\n<h4>How to register ip correctly in docker?</h4>\n<p><a href=\"https://github.com/alibaba/dubbo/issues/742\">Example question</a></p>\n<p>Dubbo supports specifying ip/port via system environment variables, examples can be found <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">here</a>.</p>\n",
+  "link": "/en-us/docs/developers/user-guide/faq_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/README.json b/en-us/docs/user/README.json
index 540ab4d2..9eab64e2 100644
--- a/en-us/docs/user/README.json
+++ b/en-us/docs/user/README.json
@@ -1,4 +1,6 @@
 {
   "filename": "README.md",
-  "__html": "<h1>dubbo-user-book</h1>\n<p>The dubbo cookbook, covering almost all features of dubbo framework.</p>\n"
+  "__html": "<h1>dubbo-user-book</h1>\n<p>The dubbo cookbook, covering almost all features of dubbo framework.</p>\n",
+  "link": "/en-us/docs/user/README.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/SUMMARY.json b/en-us/docs/user/SUMMARY.json
index 8422475f..5045a872 100644
--- a/en-us/docs/user/SUMMARY.json
+++ b/en-us/docs/user/SUMMARY.json
@@ -1,4 +1,6 @@
 {
   "filename": "SUMMARY.md",
-  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./preface/index.md\">1 Preface</a>\n<ul>\n<li><a href=\"./preface/background.md\">1.1 Background</a></li>\n<li><a href=\"./preface/requirements.md\">1.2 Requirements</a></li>\n<li><a href=\"./preface/architecture.md\">1.3 Architecture</a></li>\n<li><a href=\"./preface/usage.md\">1.4 Usage</a></li>\n</ul>\n</li>\n<li><a href=\"./quick-start.md\">2 Quick start</a></li>\n<li><a href=\"./dependencies.md\">3 Dependencies</a></li>\n<li><a href=\"./maturity.md\">4 maturality</a></li>\n<li><a href=\"./configuration/index.md\">5 Configuration</a>\n<ul>\n<li><a href=\"./configuration/xml.md\">5.1 XML configuration</a></li>\n<li><a href=\"./configuration/properties.md\">5.2 Properties configuration</a></li>\n<li><a href=\"./configuration/api.md\">5.3 API configuration</a></li>\n<li><a href=\"./configuration/annotation.md\">5.4 Annotation configuration</a></li>\n</ul>\n</li>\n<li><a href=\"./demos/index.md\">6 Demos</a>\n<ul>\n<li><a href=\"./demos/preflight-check.md\">6.1 Start check</a></li>\n<li><a href=\"./demos/fault-tolerent-strategy.md\">6.2 Fault-tolerent strategy</a></li>\n<li><a href=\"./demos/loadbalance.md\">6.3 Load balance</a></li>\n<li><a href=\"./demos/thread-model.md\">6.4 Thread model</a></li>\n<li><a href=\"./demos/explicit-target.md\">6.5 Connecting certain provider straightly</a></li>\n<li><a href=\"./demos/subscribe-only.md\">6.6 Subscribe only</a></li>\n<li><a href=\"./demos/registry-only.md\">6.7 Registry only</a></li>\n<li><a href=\"./demos/static-service.md\">6.8 Static service</a></li>\n<li><a href=\"./demos/multi-protocols.md\">6.9 Multi-protocols</a></li>\n<li><a href=\"./demos/multi-registry.md\">6.10 Multi-registries</a></li>\n<li><a href=\"./demos/service-group.md\">6.11 Service group</a></li>\n<li><a href=\"./demos/multi-versions.md\">6.12 Multi-versions</a></li>\n<li><a href=\"./demos/group-merger.md\">6.13 Group merger</a></li>\n<li><a href=\"./demos/parameter-validation.md\">6.14 Parameter validation</a></li>\n<li><a href=\"./demos/result-cache.md\">6.15 Result cache</a></li>\n<li><a href=\"./demos/generic-reference.md\">6.16 Generic reference</a></li>\n<li><a href=\"./demos/generic-service.md\">6.17 Generic service</a></li>\n<li><a href=\"./demos/echo-service.md\">6.18 Echo service</a></li>\n<li><a href=\"./demos/context.md\">6.19 Context</a></li>\n<li><a href=\"./demos/attachment.md\">6.20 Attachment</a></li>\n<li><a href=\"./demos/async-call.md\">6.21 Asynchronous call</a></li>\n<li><a href=\"./demos/local-call.md\">6.22 Local call</a></li>\n<li><a href=\"./demos/callback-parameter.md\">6.23 Callback parameter</a></li>\n<li><a href=\"./demos/events-notify.md\">6.24 Events notify</a></li>\n<li><a href=\"./demos/local-stub.md\">6.25 Local stub</a></li>\n<li><a href=\"./demos/local-mock.md\">6.26 Local mock</a></li>\n<li><a href=\"./demos/delay-publish.md\">6.27 Delay publish</a></li>\n<li><a href=\"./demos/concurrency-control.md\">6.28 Concurrency control</a></li>\n<li><a href=\"./demos/config-connections.md\">6.29 Connections limitation</a></li>\n<li><a href=\"./demos/lazy-connect.md\">6.30 Lazy connect</a></li>\n<li><a href=\"./demos/stickiness.md\">6.31 Stickness connections</a></li>\n<li><a href=\"./demos/token-authorization.md\">6.32 Token authorization</a></li>\n<li><a href=\"./demos/routing-rule.md\">6.33 Routing rule</a></li>\n<li><a href=\"./demos/config-rule.md\">6.34 Configuration rule</a></li>\n<li><a href=\"./demos/service-donwngrade.md\">6.35 Service downgrade</a></li>\n<li><a href=\"./demos/graceful-shutdown.md\">6.36 Graceful shutdown</a></li>\n<li><a href=\"./demos/hostname-binding.md\">6.37 Hostname binding </a></li>\n<li><a href=\"./demos/logger-strategy.md\">6.38 Logger strategy</a></li>\n<li><a href=\"./demos/accesslog.md\">6.39 Accesslog</a></li>\n<li><a href=\"./demos/service-container.md\">6.40 Service container</a></li>\n<li><a href=\"./demos/reference-config-cache.md\">6.41 Reference config cache</a></li>\n<li><a href=\"./demos/distributed-transaction.md\">6.42 Distributed transaction</a></li>\n<li><a href=\"./demos/dump.md\">6.43 Dumping thread stack automatically</a></li>\n<li><a href=\"./demos/netty4.md\">6.44 Netty4</a></li>\n</ul>\n</li>\n<li><a href=\"./references/api.md\">7 API introduction</a></li>\n<li><a href=\"./references/xml/introduction.md\">8 Schema configuration introduction</a>\n<ul>\n<li><a href=\"./references/xml/dubbo-service.md\">8.1 dubbo:service</a></li>\n<li><a href=\"./references/xml/dubbo-reference.md\">8.2 dubbo:reference</a></li>\n<li><a href=\"./references/xml/dubbo-protocol.md\">8.3 dubbo:protocol</a></li>\n<li><a href=\"./references/xml/dubbo-registry.md\">8.4 dubbo:registry</a></li>\n<li><a href=\"./references/xml/dubbo-monitor.md\">8.5 dubbo:monitor</a></li>\n<li><a href=\"./references/xml/dubbo-application.md\">8.6 dubbo:application</a></li>\n<li><a href=\"./references/xml/dubbo-module.md\">8.7 dubbo:module</a></li>\n<li><a href=\"./references/xml/dubbo-provider.md\">8.8 dubbo:provider</a></li>\n<li><a href=\"./references/xml/dubbo-consumer.md\">8.9 dubbo:consumer</a></li>\n<li><a href=\"./references/xml/dubbo-method.md\">8.10 dubbo:method</a></li>\n<li><a href=\"./references/xml/dubbo-argument.md\">8.11 dubbo:argument</a></li>\n<li><a href=\"./references/xml/dubbo-parameter.md\">8.12 dubbo:parameter</a></li>\n</ul>\n</li>\n<li><a href=\"./references/protocol/introduction.md\">9 Protocol introduction</a>\n<ul>\n<li><a href=\"./references/protocol/dubbo.md\">9.1 dubbo://</a></li>\n<li><a href=\"./references/protocol/rmi.md\">9.2 rmi//</a></li>\n<li><a href=\"./references/protocol/hessian.md\">9.3 hessian://</a></li>\n<li><a href=\"./references/protocol/http.md\">9.4 http://</a></li>\n<li><a href=\"./references/protocol/webservice.md\">9.5 webservice://</a></li>\n<li><a href=\"./references/protocol/thrift.md\">9.6 thrift://</a></li>\n<li><a href=\"./references/protocol/memcached.md\">9.7 memcached://</a></li>\n<li><a href=\"./references/protocol/redis.md\">9.8 redis://</a></li>\n</ul>\n</li>\n<li><a href=\"./references/registry/introduction.md\">10 registry introduction</a>\n<ul>\n<li><a href=\"./references/registry/multicast.md\">10.1 Multicast registry</a></li>\n<li><a href=\"./references/registry/zookeeper.md\">10.2 Zookeeper registry</a></li>\n<li><a href=\"./references/registry/redis.md\">10.3 Redis registry</a></li>\n<li><a href=\"./references/registry/simple.md\">10.4 Simple registry</a></li>\n</ul>\n</li>\n<li><a href=\"./references/telnet.md\">11 Telnet command</a></li>\n<li><a href=\"./references/maven.md\">12 maven plugins</a></li>\n<li><a href=\"./best-practice.md\">13 Servitization best practice</a></li>\n<li><a href=\"./recommend.md\">14 Recommended usage</a></li>\n<li><a href=\"./capacity-plan.md\">15 Capacity plan</a></li>\n<li><a href=\"./perf-test.md\">16 Performance testing reports</a></li>\n<li><a href=\"./coveragence.md\">17 Test coverage report</a></li>\n</ul>\n"
+  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./preface/index.md\">1 Preface</a>\n<ul>\n<li><a href=\"./preface/background.md\">1.1 Background</a></li>\n<li><a href=\"./preface/requirements.md\">1.2 Requirements</a></li>\n<li><a href=\"./preface/architecture.md\">1.3 Architecture</a></li>\n<li><a href=\"./preface/usage.md\">1.4 Usage</a></li>\n</ul>\n</li>\n<li><a href=\"./quick-start.md\">2 Quick start</a></li>\n<li><a href=\"./dependencies.md\">3 Dependencies</a></li>\n<li><a href=\"./maturity.md\">4 maturality</a></li>\n<li><a href=\"./configuration/index.md\">5 Configuration</a>\n<ul>\n<li><a href=\"./configuration/xml.md\">5.1 XML configuration</a></li>\n<li><a href=\"./configuration/properties.md\">5.2 Properties configuration</a></li>\n<li><a href=\"./configuration/api.md\">5.3 API configuration</a></li>\n<li><a href=\"./configuration/annotation.md\">5.4 Annotation configuration</a></li>\n</ul>\n</li>\n<li><a href=\"./demos/index.md\">6 Demos</a>\n<ul>\n<li><a href=\"./demos/preflight-check.md\">6.1 Start check</a></li>\n<li><a href=\"./demos/fault-tolerent-strategy.md\">6.2 Fault-tolerent strategy</a></li>\n<li><a href=\"./demos/loadbalance.md\">6.3 Load balance</a></li>\n<li><a href=\"./demos/thread-model.md\">6.4 Thread model</a></li>\n<li><a href=\"./demos/explicit-target.md\">6.5 Connecting certain provider straightly</a></li>\n<li><a href=\"./demos/subscribe-only.md\">6.6 Subscribe only</a></li>\n<li><a href=\"./demos/registry-only.md\">6.7 Registry only</a></li>\n<li><a href=\"./demos/static-service.md\">6.8 Static service</a></li>\n<li><a href=\"./demos/multi-protocols.md\">6.9 Multi-protocols</a></li>\n<li><a href=\"./demos/multi-registry.md\">6.10 Multi-registries</a></li>\n<li><a href=\"./demos/service-group.md\">6.11 Service group</a></li>\n<li><a href=\"./demos/multi-versions.md\">6.12 Multi-versions</a></li>\n<li><a href=\"./demos/group-merger.md\">6.13 Group merger</a></li>\n<li><a href=\"./demos/parameter-validation.md\">6.14 Parameter validation</a></li>\n<li><a href=\"./demos/result-cache.md\">6.15 Result cache</a></li>\n<li><a href=\"./demos/generic-reference.md\">6.16 Generic reference</a></li>\n<li><a href=\"./demos/generic-service.md\">6.17 Generic service</a></li>\n<li><a href=\"./demos/echo-service.md\">6.18 Echo service</a></li>\n<li><a href=\"./demos/context.md\">6.19 Context</a></li>\n<li><a href=\"./demos/attachment.md\">6.20 Attachment</a></li>\n<li><a href=\"./demos/async-call.md\">6.21 Asynchronous call</a></li>\n<li><a href=\"./demos/local-call.md\">6.22 Local call</a></li>\n<li><a href=\"./demos/callback-parameter.md\">6.23 Callback parameter</a></li>\n<li><a href=\"./demos/events-notify.md\">6.24 Events notify</a></li>\n<li><a href=\"./demos/local-stub.md\">6.25 Local stub</a></li>\n<li><a href=\"./demos/local-mock.md\">6.26 Local mock</a></li>\n<li><a href=\"./demos/delay-publish.md\">6.27 Delay publish</a></li>\n<li><a href=\"./demos/concurrency-control.md\">6.28 Concurrency control</a></li>\n<li><a href=\"./demos/config-connections.md\">6.29 Connections limitation</a></li>\n<li><a href=\"./demos/lazy-connect.md\">6.30 Lazy connect</a></li>\n<li><a href=\"./demos/stickiness.md\">6.31 Stickness connections</a></li>\n<li><a href=\"./demos/token-authorization.md\">6.32 Token authorization</a></li>\n<li><a href=\"./demos/routing-rule.md\">6.33 Routing rule</a></li>\n<li><a href=\"./demos/config-rule.md\">6.34 Configuration rule</a></li>\n<li><a href=\"./demos/service-donwngrade.md\">6.35 Service downgrade</a></li>\n<li><a href=\"./demos/graceful-shutdown.md\">6.36 Graceful shutdown</a></li>\n<li><a href=\"./demos/hostname-binding.md\">6.37 Hostname binding </a></li>\n<li><a href=\"./demos/logger-strategy.md\">6.38 Logger strategy</a></li>\n<li><a href=\"./demos/accesslog.md\">6.39 Accesslog</a></li>\n<li><a href=\"./demos/service-container.md\">6.40 Service container</a></li>\n<li><a href=\"./demos/reference-config-cache.md\">6.41 Reference config cache</a></li>\n<li><a href=\"./demos/distributed-transaction.md\">6.42 Distributed transaction</a></li>\n<li><a href=\"./demos/dump.md\">6.43 Dumping thread stack automatically</a></li>\n<li><a href=\"./demos/netty4.md\">6.44 Netty4</a></li>\n</ul>\n</li>\n<li><a href=\"./references/api.md\">7 API introduction</a></li>\n<li><a href=\"./references/xml/introduction.md\">8 Schema configuration introduction</a>\n<ul>\n<li><a href=\"./references/xml/dubbo-service.md\">8.1 dubbo:service</a></li>\n<li><a href=\"./references/xml/dubbo-reference.md\">8.2 dubbo:reference</a></li>\n<li><a href=\"./references/xml/dubbo-protocol.md\">8.3 dubbo:protocol</a></li>\n<li><a href=\"./references/xml/dubbo-registry.md\">8.4 dubbo:registry</a></li>\n<li><a href=\"./references/xml/dubbo-monitor.md\">8.5 dubbo:monitor</a></li>\n<li><a href=\"./references/xml/dubbo-application.md\">8.6 dubbo:application</a></li>\n<li><a href=\"./references/xml/dubbo-module.md\">8.7 dubbo:module</a></li>\n<li><a href=\"./references/xml/dubbo-provider.md\">8.8 dubbo:provider</a></li>\n<li><a href=\"./references/xml/dubbo-consumer.md\">8.9 dubbo:consumer</a></li>\n<li><a href=\"./references/xml/dubbo-method.md\">8.10 dubbo:method</a></li>\n<li><a href=\"./references/xml/dubbo-argument.md\">8.11 dubbo:argument</a></li>\n<li><a href=\"./references/xml/dubbo-parameter.md\">8.12 dubbo:parameter</a></li>\n</ul>\n</li>\n<li><a href=\"./references/protocol/introduction.md\">9 Protocol introduction</a>\n<ul>\n<li><a href=\"./references/protocol/dubbo.md\">9.1 dubbo://</a></li>\n<li><a href=\"./references/protocol/rmi.md\">9.2 rmi//</a></li>\n<li><a href=\"./references/protocol/hessian.md\">9.3 hessian://</a></li>\n<li><a href=\"./references/protocol/http.md\">9.4 http://</a></li>\n<li><a href=\"./references/protocol/webservice.md\">9.5 webservice://</a></li>\n<li><a href=\"./references/protocol/thrift.md\">9.6 thrift://</a></li>\n<li><a href=\"./references/protocol/memcached.md\">9.7 memcached://</a></li>\n<li><a href=\"./references/protocol/redis.md\">9.8 redis://</a></li>\n</ul>\n</li>\n<li><a href=\"./references/registry/introduction.md\">10 registry introduction</a>\n<ul>\n<li><a href=\"./references/registry/multicast.md\">10.1 Multicast registry</a></li>\n<li><a href=\"./references/registry/zookeeper.md\">10.2 Zookeeper registry</a></li>\n<li><a href=\"./references/registry/redis.md\">10.3 Redis registry</a></li>\n<li><a href=\"./references/registry/simple.md\">10.4 Simple registry</a></li>\n</ul>\n</li>\n<li><a href=\"./references/telnet.md\">11 Telnet command</a></li>\n<li><a href=\"./references/maven.md\">12 maven plugins</a></li>\n<li><a href=\"./best-practice.md\">13 Servitization best practice</a></li>\n<li><a href=\"./recommend.md\">14 Recommended usage</a></li>\n<li><a href=\"./capacity-plan.md\">15 Capacity plan</a></li>\n<li><a href=\"./perf-test.md\">16 Performance testing reports</a></li>\n<li><a href=\"./coveragence.md\">17 Test coverage report</a></li>\n</ul>\n",
+  "link": "/en-us/docs/user/SUMMARY.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/benchmark-tool.json b/en-us/docs/user/benchmark-tool.json
index 2a59dc3b..437e8bdf 100644
--- a/en-us/docs/user/benchmark-tool.json
+++ b/en-us/docs/user/benchmark-tool.json
@@ -1,4 +1,6 @@
 {
   "filename": "benchmark-tool.md",
-  "__html": "<h1>Beanchmark testing tool installer</h1>\n<ul>\n<li>download: git clone <a href=\"https://github.com/apache/incubator-dubbo.git\">https://github.com/apache/incubator-dubbo.git</a></li>\n<li>compile benchmark: cd incubator-dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>uncompress benchmark: incubator-dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>Read ReadMe.txt (the contents are as follows, in the compressed package.)</p>\n<ul>\n<li>\n<p>Build a new benchmark project, such as demo.benchmark</p>\n</li>\n<li>\n<p>Import the your own interface api jar and dubbo.benchmark.jar (Unzip dubbo.benchmark.tar.gz, under the lib directory )</p>\n</li>\n<li>\n<p>Create a new class to implement AbstractClientRunnable</p>\n<ul>\n<li>Implement the constructor of the parent class</li>\n<li>Implement the invoke method and create a local interface proxy by serviceFactory,and finish your own business logic, as follows:</li>\n</ul>\n<pre><code class=\"language-java\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(ServiceFactory serviceFactory)</span> </span>{\n        DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);\n        <span class=\"hljs-keyword\">return</span> demoService.sendRequest(<span class=\"hljs-string\">\"hello\"</span>);\n    }\n</code></pre>\n</li>\n<li>\n<p>Make your own benchmark project into a jar package, such as demo.benchmark.jar</p>\n</li>\n<li>\n<p>Put the demo.benchmark.jar and service API jar into directory dubbo.benchmark/lib</p>\n</li>\n<li>\n<p>Configuring duubo.properties</p>\n</li>\n<li>\n<p>Run run.bat(windows) or <a href=\"http://run.sh\">run.sh</a>(linux)</p>\n</li>\n</ul>\n<p>If you want to test the different versions of Dubbo, you can replace the jar of the Dubbo.</p>\n"
+  "__html": "<h1>Beanchmark testing tool installer</h1>\n<ul>\n<li>download: git clone <a href=\"https://github.com/apache/incubator-dubbo.git\">https://github.com/apache/incubator-dubbo.git</a></li>\n<li>compile benchmark: cd incubator-dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>uncompress benchmark: incubator-dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>Read ReadMe.txt (the contents are as follows, in the compressed package.)</p>\n<ul>\n<li>\n<p>Build a new benchmark project, such as demo.benchmark</p>\n</li>\n<li>\n<p>Import the your own interface api jar and dubbo.benchmark.jar (Unzip dubbo.benchmark.tar.gz, under the lib directory )</p>\n</li>\n<li>\n<p>Create a new class to implement AbstractClientRunnable</p>\n<ul>\n<li>Implement the constructor of the parent class</li>\n<li>Implement the invoke method and create a local interface proxy by serviceFactory,and finish your own business logic, as follows:</li>\n</ul>\n<pre><code class=\"language-java\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(ServiceFactory serviceFactory)</span> </span>{\n        DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);\n        <span class=\"hljs-keyword\">return</span> demoService.sendRequest(<span class=\"hljs-string\">\"hello\"</span>);\n    }\n</code></pre>\n</li>\n<li>\n<p>Make your own benchmark project into a jar package, such as demo.benchmark.jar</p>\n</li>\n<li>\n<p>Put the demo.benchmark.jar and service API jar into directory dubbo.benchmark/lib</p>\n</li>\n<li>\n<p>Configuring duubo.properties</p>\n</li>\n<li>\n<p>Run run.bat(windows) or <a href=\"http://run.sh\">run.sh</a>(linux)</p>\n</li>\n</ul>\n<p>If you want to test the different versions of Dubbo, you can replace the jar of the Dubbo.</p>\n",
+  "link": "/en-us/docs/user/benchmark-tool.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/best-practice.json b/en-us/docs/user/best-practice.json
index 6c24ceb4..b618e662 100644
--- a/en-us/docs/user/best-practice.json
+++ b/en-us/docs/user/best-practice.json
@@ -1,4 +1,6 @@
 {
   "filename": "best-practice.md",
-  "__html": "<h1>Servitization best practice</h1>\n<h2>Modularization</h2>\n<p>It is recommended to put service interfaces, service models, service exceptions, and so on in the API package,Because the service model and exception are part of the API, it is also in conformity with the modularization principle:Reusing the publish equivalence principle (REP) and the Common Reuse Principle (CRP).</p>\n<p>If you need, you can also consider placing a spring reference configuration in the API package, so that the user can only use the configuration in the spring loading process, and the configuration suggestion is placed in the package directory of the module, so as not to conflict, eg:<code>com/alibaba/china/xxx/dubbo-reference.xml</code>。</p>\n<h2>Granularity</h2>\n<p>The service interface should have large granularity as possible.Each service method should represent a function rather than a step of a function, otherwise it will be faced with distributed transaction problem. Dubbo does not provide distributed transaction support at present.</p>\n<p>The service interface recommends the division of the business scene as a unit and abstract the similar business to prevent the explosion of the number of interfaces.</p>\n<p>It is not recommended to use an too abstract universal interface, such as Map query (Map), which has no explicit semantics, which will inconvenience later maintenance.</p>\n<h2>Version</h2>\n<p>Each interface should define a version number to provide possible subsequent incompatible upgrades,eg: <code>&lt;dubbo:service interface=&quot;com.xxx.XxxService&quot; version=&quot;1.0&quot; /&gt;</code>。</p>\n<p>It is recommended to use a two bit version number, because the third - bit version number is usually compatible with a compatible upgrade, and a change of service version is required only when incompatible.</p>\n<p>When incompatible, half of the provider is upgraded to a new version, and all the consumers are upgraded to a new version, and the remaining half providers are upgraded to a new version.</p>\n<h2>Compatibility</h2>\n<p>The service interface adds method or the service model adds fields. It can be backward compatible, delete methods or delete fields, and will not be compatible. The new fields of the enumerated type are not compatible, so we need to upgrade by changing the version number.</p>\n<p>The compatibility of each protocol is different, see: <a href=\"./references/protocol/introduction.md\">Protocol introduction</a></p>\n<h2>Enumeration type</h2>\n<p>If it is a complete set, you can use Enum, eg:<code>ENABLE</code>, <code>DISABLE</code>。</p>\n<p>If it is the type of business, there will be an obvious type of increase in the future, and it is not recommended to use  <code>Enum</code>, and it is not recommended to use Enum and can be replaced by  <code>String</code> .</p>\n<p>If you use<code>Enum</code>in the return value,And add the  <code>Enum</code> value,suggestions to upgrade the service consumption, so that the service provider does not return a new value.</p>\n<p>If the  <code>Enum</code>  value is used in the incoming parameter,and add the <code>Enum</code> value,it is suggested that the service provider be upgraded first, so that the service consumer will not pass the new value.</p>\n<h2>Serialization</h2>\n<p>The service parameters and return values suggest that the POJO object is used, that is, the object of the attribute is represented by the <code>setter</code>, <code>getter</code> method.</p>\n<p>Service parameters and return values do not recommend the use of interfaces, because data model abstraction is of little significance, and serialization requires interfaces to implement meta information of classes, and can not play the purpose of hiding implementation.</p>\n<p>Service parameters and return values must be byValue, but not byReference. The reference or return values of consumers and providers are not the same, but the values are the same. Dubbo does not support remote objects.</p>\n<h2>Exception</h2>\n<p>It is suggested that abnormal reporting errors are used rather than return error codes, and exception information can carry more information and have more semantic friendliness.</p>\n<p>If you are worried about performance problems, you can use the override () method of fillInStackTrace () out of the exception class as an empty method to make it not a copy of the stack information when necessary.</p>\n<p>Query method is not recommended throws checked, otherwise the caller in the query will be too much <code>try...catch, and can not be processed.</code></p>\n<p>Service providers should not throw the exception of DAO or SQL to the consumer side. They should package the exception that consumers do not care about in service implementation, otherwise consumers may not be able to serialize the corresponding exception.</p>\n<h2>Call</h2>\n<p>Not just because it is a Dubbo call, wrap the call logic eith <code>try...catch</code>clause. <code>try...catch</code> should be added to the appropriate rollback boundary.</p>\n<p>The check logic for the input parameters should be available at the Provider side. For performance considerations, the service implementer may consider adding a service Stub class to the API package to complete the test.</p>\n"
+  "__html": "<h1>Servitization best practice</h1>\n<h2>Modularization</h2>\n<p>It is recommended to put service interfaces, service models, service exceptions, and so on in the API package,Because the service model and exception are part of the API, it is also in conformity with the modularization principle:Reusing the publish equivalence principle (REP) and the Common Reuse Principle (CRP).</p>\n<p>If you need, you can also consider placing a spring reference configuration in the API package, so that the user can only use the configuration in the spring loading process, and the configuration suggestion is placed in the package directory of the module, so as not to conflict, eg:<code>com/alibaba/china/xxx/dubbo-reference.xml</code>。</p>\n<h2>Granularity</h2>\n<p>The service interface should have large granularity as possible.Each service method should represent a function rather than a step of a function, otherwise it will be faced with distributed transaction problem. Dubbo does not provide distributed transaction support at present.</p>\n<p>The service interface recommends the division of the business scene as a unit and abstract the similar business to prevent the explosion of the number of interfaces.</p>\n<p>It is not recommended to use an too abstract universal interface, such as Map query (Map), which has no explicit semantics, which will inconvenience later maintenance.</p>\n<h2>Version</h2>\n<p>Each interface should define a version number to provide possible subsequent incompatible upgrades,eg: <code>&lt;dubbo:service interface=&quot;com.xxx.XxxService&quot; version=&quot;1.0&quot; /&gt;</code>。</p>\n<p>It is recommended to use a two bit version number, because the third - bit version number is usually compatible with a compatible upgrade, and a change of service version is required only when incompatible.</p>\n<p>When incompatible, half of the provider is upgraded to a new version, and all the consumers are upgraded to a new version, and the remaining half providers are upgraded to a new version.</p>\n<h2>Compatibility</h2>\n<p>The service interface adds method or the service model adds fields. It can be backward compatible, delete methods or delete fields, and will not be compatible. The new fields of the enumerated type are not compatible, so we need to upgrade by changing the version number.</p>\n<p>The compatibility of each protocol is different, see: <a href=\"./references/protocol/introduction.md\">Protocol introduction</a></p>\n<h2>Enumeration type</h2>\n<p>If it is a complete set, you can use Enum, eg:<code>ENABLE</code>, <code>DISABLE</code>。</p>\n<p>If it is the type of business, there will be an obvious type of increase in the future, and it is not recommended to use  <code>Enum</code>, and it is not recommended to use Enum and can be replaced by  <code>String</code> .</p>\n<p>If you use<code>Enum</code>in the return value,And add the  <code>Enum</code> value,suggestions to upgrade the service consumption, so that the service provider does not return a new value.</p>\n<p>If the  <code>Enum</code>  value is used in the incoming parameter,and add the <code>Enum</code> value,it is suggested that the service provider be upgraded first, so that the service consumer will not pass the new value.</p>\n<h2>Serialization</h2>\n<p>The service parameters and return values suggest that the POJO object is used, that is, the object of the attribute is represented by the <code>setter</code>, <code>getter</code> method.</p>\n<p>Service parameters and return values do not recommend the use of interfaces, because data model abstraction is of little significance, and serialization requires interfaces to implement meta information of classes, and can not play the purpose of hiding implementation.</p>\n<p>Service parameters and return values must be byValue, but not byReference. The reference or return values of consumers and providers are not the same, but the values are the same. Dubbo does not support remote objects.</p>\n<h2>Exception</h2>\n<p>It is suggested that abnormal reporting errors are used rather than return error codes, and exception information can carry more information and have more semantic friendliness.</p>\n<p>If you are worried about performance problems, you can use the override () method of fillInStackTrace () out of the exception class as an empty method to make it not a copy of the stack information when necessary.</p>\n<p>Query method is not recommended throws checked, otherwise the caller in the query will be too much <code>try...catch, and can not be processed.</code></p>\n<p>Service providers should not throw the exception of DAO or SQL to the consumer side. They should package the exception that consumers do not care about in service implementation, otherwise consumers may not be able to serialize the corresponding exception.</p>\n<h2>Call</h2>\n<p>Not just because it is a Dubbo call, wrap the call logic eith <code>try...catch</code>clause. <code>try...catch</code> should be added to the appropriate rollback boundary.</p>\n<p>The check logic for the input parameters should be available at the Provider side. For performance considerations, the service implementer may consider adding a service Stub class to the API package to complete the test.</p>\n",
+  "link": "/en-us/docs/user/best-practice.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/capacity-plan.json b/en-us/docs/user/capacity-plan.json
index c0f4eddd..e7979572 100644
--- a/en-us/docs/user/capacity-plan.json
+++ b/en-us/docs/user/capacity-plan.json
@@ -1,4 +1,6 @@
 {
   "filename": "capacity-plan.md",
-  "__html": "<h1>Capacity plan</h1>\n<p>The following data for reference:</p>\n<h2>Use member service project of Dubbo</h2>\n<ul>\n<li>Receive 400,000,000 remote calls one day</li>\n<li>Use 12 standard servers to provide services (CPU:8 core, memory: 8G)</li>\n<li>The average load is less than 1 (For 8 core CPU, the load is very low)</li>\n<li>The average response time is 2.3 to 2.5 ms,Network cost about 1.5 to 1.6 ms(Related to the size of the packet )</li>\n</ul>\n<h2>Use product authorization service project of Dubbo</h2>\n<ul>\n<li>Receive 300,000,000 remote calls one day</li>\n<li>Use 8 standard servers to provide services (CPU:8 core, memory: 8G)</li>\n<li>The average load is less than 1 (For 8 core CPU, the load is very low)</li>\n<li>The average response time is  1.4 to 2.8 ms,Network cost about 1.0 to 1.1 ms(Related to the size of the packet )</li>\n</ul>\n"
+  "__html": "<h1>Capacity plan</h1>\n<p>The following data for reference:</p>\n<h2>Use member service project of Dubbo</h2>\n<ul>\n<li>Receive 400,000,000 remote calls one day</li>\n<li>Use 12 standard servers to provide services (CPU:8 core, memory: 8G)</li>\n<li>The average load is less than 1 (For 8 core CPU, the load is very low)</li>\n<li>The average response time is 2.3 to 2.5 ms,Network cost about 1.5 to 1.6 ms(Related to the size of the packet )</li>\n</ul>\n<h2>Use product authorization service project of Dubbo</h2>\n<ul>\n<li>Receive 300,000,000 remote calls one day</li>\n<li>Use 8 standard servers to provide services (CPU:8 core, memory: 8G)</li>\n<li>The average load is less than 1 (For 8 core CPU, the load is very low)</li>\n<li>The average response time is  1.4 to 2.8 ms,Network cost about 1.0 to 1.1 ms(Related to the size of the packet )</li>\n</ul>\n",
+  "link": "/en-us/docs/user/capacity-plan.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/annotation.json b/en-us/docs/user/configuration/annotation.json
index ff5c4ba8..7f71921a 100644
--- a/en-us/docs/user/configuration/annotation.json
+++ b/en-us/docs/user/configuration/annotation.json
@@ -1,4 +1,6 @@
 {
   "filename": "annotation.md",
-  "__html": "<h1>Annotation Configuration</h1>\n<p>Requires<code>2.5.7</code> or higher</p>\n<h2>Provider Side</h2>\n<h3><code>Service</code> annotation for exporting</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n \n<span class=\"hljs-meta\">@Service</span>(timeout = <span class=\"hljs-number\">5000</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotateServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">AnnotateService</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>Use JavaConfig for common parts</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"provider-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>Path to scan</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service.impl\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>Consumer Side</h2>\n<h3><code>Reference</code> annotation for reference</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotationConsumeService</span> </span>{\n\n    <span class=\"hljs-meta\">@com</span>.alibaba.dubbo.config.annotation.Reference\n    <span class=\"hljs-keyword\">public</span> AnnotateService annotateService;\n    \n    <span class=\"hljs-comment\">// ...</span>\n}\n\n</code></pre>\n<h3>Use JavaConfig for common parts</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"consumer-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n        consumerConfig.setTimeout(<span class=\"hljs-number\">3000</span>);\n        <span class=\"hljs-keyword\">return</span> consumerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>Path to scan</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>NOTES</h2>\n<p>All annotations in 2.5.7 will be removed later, if you have used these annotations in your project, please upgrade to the latest version.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:annotation</span> <span class=\"hljs-attr\">package</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span> /&gt;</span> \n</code></pre>\n"
+  "__html": "<h1>Annotation Configuration</h1>\n<p>Requires<code>2.5.7</code> or higher</p>\n<h2>Provider Side</h2>\n<h3><code>Service</code> annotation for exporting</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n \n<span class=\"hljs-meta\">@Service</span>(timeout = <span class=\"hljs-number\">5000</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotateServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">AnnotateService</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>Use JavaConfig for common parts</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"provider-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>Path to scan</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service.impl\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>Consumer Side</h2>\n<h3><code>Reference</code> annotation for reference</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotationConsumeService</span> </span>{\n\n    <span class=\"hljs-meta\">@com</span>.alibaba.dubbo.config.annotation.Reference\n    <span class=\"hljs-keyword\">public</span> AnnotateService annotateService;\n    \n    <span class=\"hljs-comment\">// ...</span>\n}\n\n</code></pre>\n<h3>Use JavaConfig for common parts</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"consumer-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n        consumerConfig.setTimeout(<span class=\"hljs-number\">3000</span>);\n        <span class=\"hljs-keyword\">return</span> consumerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>Path to scan</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>NOTES</h2>\n<p>All annotations in 2.5.7 will be removed later, if you have used these annotations in your project, please upgrade to the latest version.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:annotation</span> <span class=\"hljs-attr\">package</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span> /&gt;</span> \n</code></pre>\n",
+  "link": "/en-us/docs/user/configuration/annotation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/api.json b/en-us/docs/user/configuration/api.json
index fa8c9d34..6602b52a 100644
--- a/en-us/docs/user/configuration/api.json
+++ b/en-us/docs/user/configuration/api.json
@@ -1,4 +1,6 @@
 {
   "filename": "api.md",
-  "__html": "<h1>API Configuration</h1>\n<p>All API properties have counterparts in XML, see <a href=\"../references/xml/introduction.md\">XML References</a> for details. For example <code>ApplicationConfig.setName(&quot;xxx&quot;)</code> equals to  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>Provider Side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ProviderConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ServiceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxServiceImpl;\n \n<span class=\"hljs-comment\">// Implementation</span>\nXxxService xxxService = <span class=\"hljs-keyword\">new</span> XxxServiceImpl();\n \n<span class=\"hljs-comment\">// Application Info</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"xxx\"</span>);\n \n<span class=\"hljs-comment\">// Registry Info</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// Protocol</span>\nProtocolConfig protocol = <span class=\"hljs-keyword\">new</span> ProtocolConfig();\nprotocol.setName(<span class=\"hljs-string\">\"dubbo\"</span>);\nprotocol.setPort(<span class=\"hljs-number\">12345</span>);\nprotocol.setThreads(<span class=\"hljs-number\">200</span>);\n \n<span class=\"hljs-comment\">// NOTES: ServiceConfig holds the serversocket instance and keeps connections to registry, please cache it for performance.</span>\n \n<span class=\"hljs-comment\">// Exporting</span>\nServiceConfig&lt;XxxService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// In case of memory leak, please cache.</span>\nservice.setApplication(application);\nservice.setRegistry(registry); <span class=\"hljs-comment\">// Use setRegistries() for multi-registry case</span>\nservice.setProtocol(protocol); <span class=\"hljs-comment\">// Use setProtocols() for multi-protocol case</span>\nservice.setInterface(XxxService.class);\nservice.setRef(xxxService);\nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// Local export and register</span>\nservice.export();\n</code></pre>\n<h2>Consumer Side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ConsumerConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ReferenceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n \n<span class=\"hljs-comment\">// Application Info</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"yyy\"</span>);\n \n<span class=\"hljs-comment\">// Registry Info</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// NOTES: ReferenceConfig holds the connections to registry and providers, please cache it for performance.</span>\n \n<span class=\"hljs-comment\">// Refer remote service</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// In case of memory leak, please cache.</span>\nreference.setApplication(application);\nreference.setRegistry(registry); \nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// Use xxxService just like a local bean</span>\nXxxService xxxService = reference.get(); <span class=\"hljs-comment\">// NOTES: Please cache this proxy instance.</span>\n</code></pre>\n<h2>Specials</h2>\n<p>Only care about the differences:</p>\n<h3>Configuration of Method level</h3>\n<pre><code class=\"language-java\">...\n \n<span class=\"hljs-comment\">// Method level config</span>\nList&lt;MethodConfig&gt; methods = <span class=\"hljs-keyword\">new</span> ArrayList&lt;MethodConfig&gt;();\nMethodConfig method = <span class=\"hljs-keyword\">new</span> MethodConfig();\nmethod.setName(<span class=\"hljs-string\">\"createXxx\"</span>);\nmethod.setTimeout(<span class=\"hljs-number\">10000</span>);\nmethod.setRetries(<span class=\"hljs-number\">0</span>);\nmethods.add(method);\n \n<span class=\"hljs-comment\">// Referring</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\n...\nreference.setMethods(methods); \n \n...\n</code></pre>\n<h3>Peer to Peer</h3>\n<pre><code class=\"language-java\">\n...\n \nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); \n<span class=\"hljs-comment\">// If you know the address of the provider and want to bypass the registry, use `reference.setUrl()` to specify the provider directly. Refer [How to Invoke a specific provider](../demos/explicit-target.md) for details.</span>\nreference.setUrl(<span class=\"hljs-string\">\"dubbo://10.20.130.230:20880/com.xxx.XxxService\"</span>); \n \n...\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>When should we usd API: API is very useful for integrating with systems like OpenAPI, ESB, Test, Mock, etc. General Providers and Consumers, we still recommend use <a href=\"../configuration/xml.md\">XML Configuration</a>. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>API Configuration</h1>\n<p>All API properties have counterparts in XML, see <a href=\"../references/xml/introduction.md\">XML References</a> for details. For example <code>ApplicationConfig.setName(&quot;xxx&quot;)</code> equals to  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>Provider Side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ProviderConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ServiceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxServiceImpl;\n \n<span class=\"hljs-comment\">// Implementation</span>\nXxxService xxxService = <span class=\"hljs-keyword\">new</span> XxxServiceImpl();\n \n<span class=\"hljs-comment\">// Application Info</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"xxx\"</span>);\n \n<span class=\"hljs-comment\">// Registry Info</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// Protocol</span>\nProtocolConfig protocol = <span class=\"hljs-keyword\">new</span> ProtocolConfig();\nprotocol.setName(<span class=\"hljs-string\">\"dubbo\"</span>);\nprotocol.setPort(<span class=\"hljs-number\">12345</span>);\nprotocol.setThreads(<span class=\"hljs-number\">200</span>);\n \n<span class=\"hljs-comment\">// NOTES: ServiceConfig holds the serversocket instance and keeps connections to registry, please cache it for performance.</span>\n \n<span class=\"hljs-comment\">// Exporting</span>\nServiceConfig&lt;XxxService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// In case of memory leak, please cache.</span>\nservice.setApplication(application);\nservice.setRegistry(registry); <span class=\"hljs-comment\">// Use setRegistries() for multi-registry case</span>\nservice.setProtocol(protocol); <span class=\"hljs-comment\">// Use setProtocols() for multi-protocol case</span>\nservice.setInterface(XxxService.class);\nservice.setRef(xxxService);\nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// Local export and register</span>\nservice.export();\n</code></pre>\n<h2>Consumer Side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ConsumerConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ReferenceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n \n<span class=\"hljs-comment\">// Application Info</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"yyy\"</span>);\n \n<span class=\"hljs-comment\">// Registry Info</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// NOTES: ReferenceConfig holds the connections to registry and providers, please cache it for performance.</span>\n \n<span class=\"hljs-comment\">// Refer remote service</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// In case of memory leak, please cache.</span>\nreference.setApplication(application);\nreference.setRegistry(registry); \nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// Use xxxService just like a local bean</span>\nXxxService xxxService = reference.get(); <span class=\"hljs-comment\">// NOTES: Please cache this proxy instance.</span>\n</code></pre>\n<h2>Specials</h2>\n<p>Only care about the differences:</p>\n<h3>Configuration of Method level</h3>\n<pre><code class=\"language-java\">...\n \n<span class=\"hljs-comment\">// Method level config</span>\nList&lt;MethodConfig&gt; methods = <span class=\"hljs-keyword\">new</span> ArrayList&lt;MethodConfig&gt;();\nMethodConfig method = <span class=\"hljs-keyword\">new</span> MethodConfig();\nmethod.setName(<span class=\"hljs-string\">\"createXxx\"</span>);\nmethod.setTimeout(<span class=\"hljs-number\">10000</span>);\nmethod.setRetries(<span class=\"hljs-number\">0</span>);\nmethods.add(method);\n \n<span class=\"hljs-comment\">// Referring</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\n...\nreference.setMethods(methods); \n \n...\n</code></pre>\n<h3>Peer to Peer</h3>\n<pre><code class=\"language-java\">\n...\n \nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); \n<span class=\"hljs-comment\">// If you know the address of the provider and want to bypass the registry, use `reference.setUrl()` to specify the provider directly. Refer [How to Invoke a specific provider](../demos/explicit-target.md) for details.</span>\nreference.setUrl(<span class=\"hljs-string\">\"dubbo://10.20.130.230:20880/com.xxx.XxxService\"</span>); \n \n...\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>When should we usd API: API is very useful for integrating with systems like OpenAPI, ESB, Test, Mock, etc. General Providers and Consumers, we still recommend use <a href=\"../configuration/xml.md\">XML Configuration</a>. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/configuration/api.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/index.json b/en-us/docs/user/configuration/index.json
index 628af347..b41e028a 100644
--- a/en-us/docs/user/configuration/index.json
+++ b/en-us/docs/user/configuration/index.json
@@ -1,4 +1,6 @@
 {
   "filename": "index.md",
-  "__html": "<h1>Configuration</h1>\n"
+  "__html": "<h1>Configuration</h1>\n",
+  "link": "/en-us/docs/user/configuration/index.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/properties.json b/en-us/docs/user/configuration/properties.json
index d8194b26..ee16faa1 100644
--- a/en-us/docs/user/configuration/properties.json
+++ b/en-us/docs/user/configuration/properties.json
@@ -1,4 +1,6 @@
 {
   "filename": "properties.md",
-  "__html": "<h1>Properties Configuration</h1>\n<p>If your application is simple enough, say, you do not need multi-registries or multi-protocols, and you want to share configuration among Spring containers. You can use <code>dubbo.properties</code> as default configuration.</p>\n<p>Dubbo will load dubbo.properties under the root of classpath automatically, you can also specify the path for loading this file by using JVM parameter: <code>-Ddubbo.properties.file=xxx.properties</code>.</p>\n<h2>Mapping Rules</h2>\n<p>Combine the tag name and attribute name of the XML tag, use <code>.</code> to split. One property per line.</p>\n<ul>\n<li><code>dubbo.application.name=foo</code> equals to <code>&lt;dubbo:application name=&quot;foo&quot; /&gt;</code></li>\n<li><code>dubbo.registry.address=10.20.153.10:9090</code> equals to <code>&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>If you have more than one tags in a XML configuration, you can use the <code>id</code> value to distinguish. If you don't specify a id, ti will applied to all tags.</p>\n<ul>\n<li><code>dubbo.protocol.rmi.port=1234</code> equals to <code>&lt;dubbo:protocol id=&quot;rmi&quot; name=&quot;rmi&quot; port=&quot;1099&quot; /&gt;</code></li>\n<li><code>dubbo.registry.china.address=10.20.153.10:9090</code> equals to <code>&lt;dubbo:registry id=&quot;china&quot; address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>Here is a typical dubbo.properties demo configuration:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">foo</span>\n<span class=\"hljs-meta\">dubbo.application.owner</span>=<span class=\"hljs-string\">bar</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">10.20.153.10:9090</span>\n</code></pre>\n<h2>Overrides and Priorities</h2>\n<p><img src=\"../sources/images/dubbo-properties-override.jpg\" alt=\"properties-override\"></p>\n<p>Priorities from high to low:</p>\n<ul>\n<li>\n<p>JVM -D parameters, you can easily override configuration when deploying or starting applications, e.g., change the port of dubbo protocol.</p>\n</li>\n<li>\n<p>XML, the properties present in XML will override that in dubbo.properties.</p>\n</li>\n<li>\n<p>Properties, the default value, only works when it is not configured with XML or JVM.</p>\n</li>\n</ul>\n<p>1: If more than one dubbo.properties under classpath, say, two jars contains dubbo.properties separately, Dubbo will arbitarily choose one to to load, and log Error info.<br>\n2: If <code>id</code> not configured on <code>protocol</code>, will use <code>name</code> property as default</p>\n"
+  "__html": "<h1>Properties Configuration</h1>\n<p>If your application is simple enough, say, you do not need multi-registries or multi-protocols, and you want to share configuration among Spring containers. You can use <code>dubbo.properties</code> as default configuration.</p>\n<p>Dubbo will load dubbo.properties under the root of classpath automatically, you can also specify the path for loading this file by using JVM parameter: <code>-Ddubbo.properties.file=xxx.properties</code>.</p>\n<h2>Mapping Rules</h2>\n<p>Combine the tag name and attribute name of the XML tag, use <code>.</code> to split. One property per line.</p>\n<ul>\n<li><code>dubbo.application.name=foo</code> equals to <code>&lt;dubbo:application name=&quot;foo&quot; /&gt;</code></li>\n<li><code>dubbo.registry.address=10.20.153.10:9090</code> equals to <code>&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>If you have more than one tags in a XML configuration, you can use the <code>id</code> value to distinguish. If you don't specify a id, ti will applied to all tags.</p>\n<ul>\n<li><code>dubbo.protocol.rmi.port=1234</code> equals to <code>&lt;dubbo:protocol id=&quot;rmi&quot; name=&quot;rmi&quot; port=&quot;1099&quot; /&gt;</code></li>\n<li><code>dubbo.registry.china.address=10.20.153.10:9090</code> equals to <code>&lt;dubbo:registry id=&quot;china&quot; address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>Here is a typical dubbo.properties demo configuration:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">foo</span>\n<span class=\"hljs-meta\">dubbo.application.owner</span>=<span class=\"hljs-string\">bar</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">10.20.153.10:9090</span>\n</code></pre>\n<h2>Overrides and Priorities</h2>\n<p><img src=\"../sources/images/dubbo-properties-override.jpg\" alt=\"properties-override\"></p>\n<p>Priorities from high to low:</p>\n<ul>\n<li>\n<p>JVM -D parameters, you can easily override configuration when deploying or starting applications, e.g., change the port of dubbo protocol.</p>\n</li>\n<li>\n<p>XML, the properties present in XML will override that in dubbo.properties.</p>\n</li>\n<li>\n<p>Properties, the default value, only works when it is not configured with XML or JVM.</p>\n</li>\n</ul>\n<p>1: If more than one dubbo.properties under classpath, say, two jars contains dubbo.properties separately, Dubbo will arbitarily choose one to to load, and log Error info.<br>\n2: If <code>id</code> not configured on <code>protocol</code>, will use <code>name</code> property as default</p>\n",
+  "link": "/en-us/docs/user/configuration/properties.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/xml.json b/en-us/docs/user/configuration/xml.json
index 0b4c59a3..4e34b8d7 100644
--- a/en-us/docs/user/configuration/xml.json
+++ b/en-us/docs/user/configuration/xml.json
@@ -1,4 +1,6 @@
 {
   "filename": "xml.md",
-  "__html": "<h1>XML Configuration</h1>\n<p>About the XML configuration items, see:<a href=\"../references/xml/introduction.md\">XML References</a>. If you prefer use API directly instead of using Spring, see <a href=\"./api.md\">API Configuration</a>. Want a example of how to use configuration, see <a href=\"../quick-start.md\">Quick Start</a>。</p>\n<h2>provider.xml demo</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hello-world-app\"</span>  /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>  \n    <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\">\"20880\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoServiceLocal\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoServiceRemote\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>All tags support custom parameters, so we can meet the special config requirements at different extension points, such as:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"queue\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:protocol</span>&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xmlns:p</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/p\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span> <span class=\"hljs-attr\">p:queue</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>The relations between configuration tags</h2>\n<p><img src=\"../sources/images/dubbo-config.jpg\" alt=\"dubbo-config\"></p>\n<table>\n<thead>\n<tr>\n<th>tag</th>\n<th>purpose</th>\n<th>introduction</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>&lt;dubbo:service/&gt;</code></td>\n<td>Service Export</td>\n<td>Used to export service, define service metadata, export service with multiple protocols, register service to multiple registries</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:reference/&gt;</code></td>\n<td>Service Reference</td>\n<td>Used to create a remote proxy, subscribe to multiple registries</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:protocol/&gt;</code></td>\n<td>Protocol Config</td>\n<td>Configure the protocol for services on provider side, the consumer side follows.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:application/&gt;</code></td>\n<td>Application Config</td>\n<td>Applies to both provider and consumer.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:module/&gt;</code></td>\n<td>Module Config</td>\n<td>Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:registry/&gt;</code></td>\n<td>Registry Center</td>\n<td>Registry info: address, protocol, etc.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:monitor/&gt;</code></td>\n<td>Monitor Center</td>\n<td>Monitor info: address, address, etc. Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:provider/&gt;</code></td>\n<td>Default Config for Providers</td>\n<td>Default Config for ServiceConfigs. Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:consumer/&gt;</code></td>\n<td>Default Config for Consumers</td>\n<td>Default Config for ReferenceConfigs. Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:method/&gt;</code></td>\n<td>Method level Config</td>\n<td>Method level Config for ServiceConfig and ReferenceConfig.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:argument/&gt;</code></td>\n<td>Argument Config</td>\n<td>Used to specify the method parameter configuration.</td>\n</tr>\n</tbody>\n</table>\n<h2>Overrides and Priorities</h2>\n<p>Take timeout as an example, here is the priorities, from high to low (retries, loadbalance, actives also applies  the same rule):</p>\n<ul>\n<li>method level,interface level,default/global level。</li>\n<li>at the same leveel, consumer has higher priority than provider</li>\n</ul>\n<p>Configurations on the provider side are passed to the consumer side through registry in the form of URL.</p>\n<p><img src=\"../sources/images/dubbo-config-override.jpg\" alt=\"dubbo-config-override\"></p>\n<p>It is recommended that the provider set a timeout for every service, because the provider knows exactly how long a method needs to be executed. If a consumer cites multiple services at the same time, it doesn't need to care about the timeout settings of each service.</p>\n<p>Theoretically, almost all configuration items supported in ReferenceConfig can be configured with a default value using ConsumerConfig, ServiceConfig, ProviderConfig.</p>\n<p>1: Requires spring <code>3.2.16+</code>, see announcement for details:<code>xmlns:p=&quot;http://www.springframework.org/schema/p&quot;</code>  \n2: The reference bean obeys lazy init by default, only if it is refered by other beans or other instance try to get its instance using <code>getBean()</code> method  will the reference be initialized. If you need eager init, config this way: <code>&lt;dubbo:reference ... init=&quot;true&quot; /&gt;</code></p>\n"
+  "__html": "<h1>XML Configuration</h1>\n<p>About the XML configuration items, see:<a href=\"../references/xml/introduction.md\">XML References</a>. If you prefer use API directly instead of using Spring, see <a href=\"./api.md\">API Configuration</a>. Want a example of how to use configuration, see <a href=\"../quick-start.md\">Quick Start</a>。</p>\n<h2>provider.xml demo</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hello-world-app\"</span>  /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>  \n    <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\">\"20880\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoServiceLocal\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoServiceRemote\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>All tags support custom parameters, so we can meet the special config requirements at different extension points, such as:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"queue\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:protocol</span>&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xmlns:p</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/p\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span> <span class=\"hljs-attr\">p:queue</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>The relations between configuration tags</h2>\n<p><img src=\"../sources/images/dubbo-config.jpg\" alt=\"dubbo-config\"></p>\n<table>\n<thead>\n<tr>\n<th>tag</th>\n<th>purpose</th>\n<th>introduction</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>&lt;dubbo:service/&gt;</code></td>\n<td>Service Export</td>\n<td>Used to export service, define service metadata, export service with multiple protocols, register service to multiple registries</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:reference/&gt;</code></td>\n<td>Service Reference</td>\n<td>Used to create a remote proxy, subscribe to multiple registries</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:protocol/&gt;</code></td>\n<td>Protocol Config</td>\n<td>Configure the protocol for services on provider side, the consumer side follows.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:application/&gt;</code></td>\n<td>Application Config</td>\n<td>Applies to both provider and consumer.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:module/&gt;</code></td>\n<td>Module Config</td>\n<td>Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:registry/&gt;</code></td>\n<td>Registry Center</td>\n<td>Registry info: address, protocol, etc.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:monitor/&gt;</code></td>\n<td>Monitor Center</td>\n<td>Monitor info: address, address, etc. Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:provider/&gt;</code></td>\n<td>Default Config for Providers</td>\n<td>Default Config for ServiceConfigs. Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:consumer/&gt;</code></td>\n<td>Default Config for Consumers</td>\n<td>Default Config for ReferenceConfigs. Optional.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:method/&gt;</code></td>\n<td>Method level Config</td>\n<td>Method level Config for ServiceConfig and ReferenceConfig.</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:argument/&gt;</code></td>\n<td>Argument Config</td>\n<td>Used to specify the method parameter configuration.</td>\n</tr>\n</tbody>\n</table>\n<h2>Overrides and Priorities</h2>\n<p>Take timeout as an example, here is the priorities, from high to low (retries, loadbalance, actives also applies  the same rule):</p>\n<ul>\n<li>method level,interface level,default/global level。</li>\n<li>at the same leveel, consumer has higher priority than provider</li>\n</ul>\n<p>Configurations on the provider side are passed to the consumer side through registry in the form of URL.</p>\n<p><img src=\"../sources/images/dubbo-config-override.jpg\" alt=\"dubbo-config-override\"></p>\n<p>It is recommended that the provider set a timeout for every service, because the provider knows exactly how long a method needs to be executed. If a consumer cites multiple services at the same time, it doesn't need to care about the timeout settings of each service.</p>\n<p>Theoretically, almost all configuration items supported in ReferenceConfig can be configured with a default value using ConsumerConfig, ServiceConfig, ProviderConfig.</p>\n<p>1: Requires spring <code>3.2.16+</code>, see announcement for details:<code>xmlns:p=&quot;http://www.springframework.org/schema/p&quot;</code>  \n2: The reference bean obeys lazy init by default, only if it is refered by other beans or other instance try to get its instance using <code>getBean()</code> method  will the reference be initialized. If you need eager init, config this way: <code>&lt;dubbo:reference ... init=&quot;true&quot; /&gt;</code></p>\n",
+  "link": "/en-us/docs/user/configuration/xml.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/coveragence.json b/en-us/docs/user/coveragence.json
index 16c17d93..3b9bc7f6 100644
--- a/en-us/docs/user/coveragence.json
+++ b/en-us/docs/user/coveragence.json
@@ -1,4 +1,6 @@
 {
   "filename": "coveragence.md",
-  "__html": "<h1>Test coverage report</h1>\n<p>Based on version <code>2.0.12</code>,Statistics on 2012-02-03</p>\n<p><img src=\"sources/images/code-quality1.jpg\" alt=\"/sources/images/code-quality1.jpg\"></p>\n<p><img src=\"sources/images/code-quality2.jpg\" alt=\"/sources/images/code-quality2.jpg\"></p>\n<p><img src=\"sources/images/code-quality3.jpg\" alt=\"/sources/images/code-quality3.jpg\"></p>\n<p><img src=\"sources/images/code-quality4.jpg\" alt=\"/sources/images/code-quality4.jpg\"></p>\n<p><img src=\"sources/images/code-quality5.jpg\" alt=\"/sources/images/code-quality5.jpg\"></p>\n<p><img src=\"sources/images/code-quality6.jpg\" alt=\"/sources/images/code-quality6.jpg\"></p>\n<p><img src=\"sources/images/code-quality7.jpg\" alt=\"/sources/images/code-quality7.jpg\"></p>\n<p><img src=\"sources/images/code-coverage.jpg\" alt=\"/sources/images/code-coverage.jpg\"></p>\n<p><img src=\"sources/images/code-tendency.jpg\" alt=\"/sources/images/code-tendency.jpg\"></p>\n<p><img src=\"sources/images/code-dependency.jpg\" alt=\"/sources/images/code-dependency.jpg\"></p>\n"
+  "__html": "<h1>Test coverage report</h1>\n<p>Based on version <code>2.0.12</code>,Statistics on 2012-02-03</p>\n<p><img src=\"sources/images/code-quality1.jpg\" alt=\"/sources/images/code-quality1.jpg\"></p>\n<p><img src=\"sources/images/code-quality2.jpg\" alt=\"/sources/images/code-quality2.jpg\"></p>\n<p><img src=\"sources/images/code-quality3.jpg\" alt=\"/sources/images/code-quality3.jpg\"></p>\n<p><img src=\"sources/images/code-quality4.jpg\" alt=\"/sources/images/code-quality4.jpg\"></p>\n<p><img src=\"sources/images/code-quality5.jpg\" alt=\"/sources/images/code-quality5.jpg\"></p>\n<p><img src=\"sources/images/code-quality6.jpg\" alt=\"/sources/images/code-quality6.jpg\"></p>\n<p><img src=\"sources/images/code-quality7.jpg\" alt=\"/sources/images/code-quality7.jpg\"></p>\n<p><img src=\"sources/images/code-coverage.jpg\" alt=\"/sources/images/code-coverage.jpg\"></p>\n<p><img src=\"sources/images/code-tendency.jpg\" alt=\"/sources/images/code-tendency.jpg\"></p>\n<p><img src=\"sources/images/code-dependency.jpg\" alt=\"/sources/images/code-dependency.jpg\"></p>\n",
+  "link": "/en-us/docs/user/coveragence.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/accesslog.json b/en-us/docs/user/demos/accesslog.json
index 1baf9aab..aa761f82 100644
--- a/en-us/docs/user/demos/accesslog.json
+++ b/en-us/docs/user/demos/accesslog.json
@@ -1,4 +1,6 @@
 {
   "filename": "accesslog.md",
-  "__html": "<h1>Access Log</h1>\n<p>If you want to logging the access information for each provide service,you can turn on the <code>accesslog</code> switch,which like the access log of <code>Apache</code>.</p>\n<p><strong>Note:</strong>\nThe size of the access log maybe too much,please check the disk capacity.\nNow I will show you how to config the access log.</p>\n<h2>Logging by logging framework</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>The above configuration will turn on <code>accesslog</code> switch for all provide services,and logging the access log with logging framework(log4j/logback/slf4j...).You can config the logging framework of <code>logger</code> and <code>appender</code> for logging the access log.The simplest way is config logger name with <code>dubbo.accesslog</code>. The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"accesslogAppender\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.core.rolling.RollingFileAppender\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">file</span>&gt;</span>${loggingRoot}/accesslog/logging.log<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">file</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">encoding</span>&gt;</span>${loggingCharset}<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">encoding</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">append</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">append</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">rollingPolicy</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">FileNamePattern</span>&gt;</span>${loggingRoot}/accesslog/%d{yyyyMMdd}/logging.log.%d{yyyyMMdd}%i.gz\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">FileNamePattern</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">MaxHistory</span>&gt;</span>15<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">MaxHistory</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">TimeBasedFileNamingAndTriggeringPolicy</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">MaxFileSize</span>&gt;</span>1024MB<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">MaxFileSize</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">TimeBasedFileNamingAndTriggeringPolicy</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">rollingPolicy</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">layout</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.classic.PatternLayout\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pattern</span>&gt;</span>&lt;![CDATA[%level|%d{yyyy-MM-dd HH:mm:ss}|%m%n}]]&gt;<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">pattern</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">layout</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">appender</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo.accesslog\"</span> <span class=\"hljs-attr\">level</span>=<span class=\"hljs-string\">\"INFO\"</span> <span class=\"hljs-attr\">additivity</span>=<span class=\"hljs-string\">\"false\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"accesslogAppender\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">logger</span>&gt;</span>\n</code></pre>\n<p>The above is the demonstration of logback framework.Other logging framework is same <a href=\"http://too.It\">too.It</a> will logging the access log of all provide services into single file(<code>accesslog/logging.log</code>). And you can also config the access log of each provide service to logging separately,Only change <code>name</code> attribute of the <code>logger</code> tag,set the <code>name</code> attribute to <code>dubbo.accesslog.serviceInterfaceClassFullName</code>.The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo.accesslog.com.dubbo.FooServiceInterface\"</span> <span class=\"hljs-attr\">level</span>=<span class=\"hljs-string\">\"INFO\"</span> <span class=\"hljs-attr\">additivity</span>=<span class=\"hljs-string\">\"false\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"fooServiceAccesslogAppender\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">logger</span>&gt;</span>\n</code></pre>\n<p>If you only want logging the access log of specified provide service,but not all <a href=\"http://services.It\">services.It</a>'s supported too.The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<h2>Logging by specified file path</h2>\n<p>You can specify the file path with the <code>accesslog</code> attribute.The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"/home/admin/logs/service/accesslog.log\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"/home/admin/logs/service/accesslog.log\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Access Log</h1>\n<p>If you want to logging the access information for each provide service,you can turn on the <code>accesslog</code> switch,which like the access log of <code>Apache</code>.</p>\n<p><strong>Note:</strong>\nThe size of the access log maybe too much,please check the disk capacity.\nNow I will show you how to config the access log.</p>\n<h2>Logging by logging framework</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>The above configuration will turn on <code>accesslog</code> switch for all provide services,and logging the access log with logging framework(log4j/logback/slf4j...).You can config the logging framework of <code>logger</code> and <code>appender</code> for logging the access log.The simplest way is config logger name with <code>dubbo.accesslog</code>. The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"accesslogAppender\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.core.rolling.RollingFileAppender\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">file</span>&gt;</span>${loggingRoot}/accesslog/logging.log<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">file</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">encoding</span>&gt;</span>${loggingCharset}<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">encoding</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">append</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">append</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">rollingPolicy</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">FileNamePattern</span>&gt;</span>${loggingRoot}/accesslog/%d{yyyyMMdd}/logging.log.%d{yyyyMMdd}%i.gz\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">FileNamePattern</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">MaxHistory</span>&gt;</span>15<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">MaxHistory</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">TimeBasedFileNamingAndTriggeringPolicy</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">MaxFileSize</span>&gt;</span>1024MB<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">MaxFileSize</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">TimeBasedFileNamingAndTriggeringPolicy</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">rollingPolicy</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">layout</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"ch.qos.logback.classic.PatternLayout\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pattern</span>&gt;</span>&lt;![CDATA[%level|%d{yyyy-MM-dd HH:mm:ss}|%m%n}]]&gt;<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">pattern</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">layout</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">appender</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo.accesslog\"</span> <span class=\"hljs-attr\">level</span>=<span class=\"hljs-string\">\"INFO\"</span> <span class=\"hljs-attr\">additivity</span>=<span class=\"hljs-string\">\"false\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"accesslogAppender\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">logger</span>&gt;</span>\n</code></pre>\n<p>The above is the demonstration of logback framework.Other logging framework is same <a href=\"http://too.It\">too.It</a> will logging the access log of all provide services into single file(<code>accesslog/logging.log</code>). And you can also config the access log of each provide service to logging separately,Only change <code>name</code> attribute of the <code>logger</code> tag,set the <code>name</code> attribute to <code>dubbo.accesslog.serviceInterfaceClassFullName</code>.The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo.accesslog.com.dubbo.FooServiceInterface\"</span> <span class=\"hljs-attr\">level</span>=<span class=\"hljs-string\">\"INFO\"</span> <span class=\"hljs-attr\">additivity</span>=<span class=\"hljs-string\">\"false\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"fooServiceAccesslogAppender\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">logger</span>&gt;</span>\n</code></pre>\n<p>If you only want logging the access log of specified provide service,but not all <a href=\"http://services.It\">services.It</a>'s supported too.The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<h2>Logging by specified file path</h2>\n<p>You can specify the file path with the <code>accesslog</code> attribute.The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"/home/admin/logs/service/accesslog.log\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"/home/admin/logs/service/accesslog.log\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/accesslog.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/async-call.json b/en-us/docs/user/demos/async-call.json
index d702d8ec..e8c99242 100644
--- a/en-us/docs/user/demos/async-call.json
+++ b/en-us/docs/user/demos/async-call.json
@@ -1,4 +1,6 @@
 {
   "filename": "async-call.md",
-  "__html": "<h1>Asynchronous Call</h1>\n<p>As dubbo is based on a non-blocking NIO network layer, the client can start parallel call to multiple remote services without explicitly starting mulithreads, which costs relatively fewer resources.</p>\n<p><img src=\"../sources/images/future.jpg\" alt=\"/user-guide/images/future.jpg\"></p>\n<p>You can config at <code>consumer.xml</code> for setup asynchronous call some remote service.</p>\n<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\">\"fooService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.foo.FooService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.bar.BarService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Configure the above configuration information,you can invoke the remote service in your code.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// the invoke will return null immediately</span>\nfooService.findFoo(fooId);\n<span class=\"hljs-comment\">// get current invoke Future instance,when the remote service has return result,will notify this Future instance.</span>\nFuture&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture();\n\n<span class=\"hljs-comment\">// the invoke will return null immediately</span>\nbarService.findBar(barId);\n<span class=\"hljs-comment\">// get current invoke Future instance,when the remote service has return result,will notify this Future instance.</span>\nFuture&lt;Bar&gt; barFuture = RpcContext.getContext().getFuture();\n\n<span class=\"hljs-comment\">// now the request of findFoo and findBar was executed at same time,The client not need setup multithreading for parallel call, which is NIO-based non-blocking implementation of parallel calls</span>\n\n<span class=\"hljs-comment\">// Current thread will be blocking,and wait findFoo has return. when remote service has return findFoo result,the current thread will be wake up.</span>\nFoo foo = fooFuture.get();\n<span class=\"hljs-comment\">// same to findFoo</span>\nBar bar = barFuture.get();\n\n<span class=\"hljs-comment\">// if findFoo expend five second for wait remote service  return result,and findBar expend six second. Actually,only expend six second will get findFoo and findBar result,and proceed to the next step.</span>\n</code></pre>\n<p>You can also set whether to wait for the message to be sent:</p>\n<ul>\n<li><code>sent=&quot;true&quot;</code> wait for the message to be send,if send failure,will throw exception.</li>\n<li><code>sent=&quot;false&quot;</code> do not wait for the message to be send,when the message will push into io queue,will return immediately.</li>\n</ul>\n<p>The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">sent</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>if you only want to asynchronous call,and don't care the return.you can config <code>return=&quot;false&quot;</code>,To reduce the cost of creating and managing Future objects.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">return</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p><strong>Note</strong>\n<code>2.0.6+</code> version supported.</p>\n"
+  "__html": "<h1>Asynchronous Call</h1>\n<p>As dubbo is based on a non-blocking NIO network layer, the client can start parallel call to multiple remote services without explicitly starting mulithreads, which costs relatively fewer resources.</p>\n<p><img src=\"../sources/images/future.jpg\" alt=\"/user-guide/images/future.jpg\"></p>\n<p>You can config at <code>consumer.xml</code> for setup asynchronous call some remote service.</p>\n<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\">\"fooService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.foo.FooService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.bar.BarService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Configure the above configuration information,you can invoke the remote service in your code.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// the invoke will return null immediately</span>\nfooService.findFoo(fooId);\n<span class=\"hljs-comment\">// get current invoke Future instance,when the remote service has return result,will notify this Future instance.</span>\nFuture&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture();\n\n<span class=\"hljs-comment\">// the invoke will return null immediately</span>\nbarService.findBar(barId);\n<span class=\"hljs-comment\">// get current invoke Future instance,when the remote service has return result,will notify this Future instance.</span>\nFuture&lt;Bar&gt; barFuture = RpcContext.getContext().getFuture();\n\n<span class=\"hljs-comment\">// now the request of findFoo and findBar was executed at same time,The client not need setup multithreading for parallel call, which is NIO-based non-blocking implementation of parallel calls</span>\n\n<span class=\"hljs-comment\">// Current thread will be blocking,and wait findFoo has return. when remote service has return findFoo result,the current thread will be wake up.</span>\nFoo foo = fooFuture.get();\n<span class=\"hljs-comment\">// same to findFoo</span>\nBar bar = barFuture.get();\n\n<span class=\"hljs-comment\">// if findFoo expend five second for wait remote service  return result,and findBar expend six second. Actually,only expend six second will get findFoo and findBar result,and proceed to the next step.</span>\n</code></pre>\n<p>You can also set whether to wait for the message to be sent:</p>\n<ul>\n<li><code>sent=&quot;true&quot;</code> wait for the message to be send,if send failure,will throw exception.</li>\n<li><code>sent=&quot;false&quot;</code> do not wait for the message to be send,when the message will push into io queue,will return immediately.</li>\n</ul>\n<p>The Example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">sent</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>if you only want to asynchronous call,and don't care the return.you can config <code>return=&quot;false&quot;</code>,To reduce the cost of creating and managing Future objects.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">return</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p><strong>Note</strong>\n<code>2.0.6+</code> version supported.</p>\n",
+  "link": "/en-us/docs/user/demos/async-call.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/attachment.json b/en-us/docs/user/demos/attachment.json
index d8aa5249..e4a06271 100644
--- a/en-us/docs/user/demos/attachment.json
+++ b/en-us/docs/user/demos/attachment.json
@@ -1,4 +1,6 @@
 {
   "filename": "attachment.md",
-  "__html": "<h1>Implicit parameters</h1>\n<p>You can implicitly pass parameters between service consumers and providers via <code>setAttachment</code> and<code>getAttachment</code> on <code>RpcContext</code>.\n<img src=\"../sources/images/context.png\" alt=\"/user-guide/images/context.png\"></p>\n<h2>Set the implicit parameters at service consumer side</h2>\n<p>Via <code>setAttachment</code> on <code>RpcContext</code> set key/value pair for implicitly pass parameters.When finished once remote invoke,will be clear,so multi-invoke must set multi-times.</p>\n<pre><code class=\"language-java\">RpcContext.getContext().setAttachment(<span class=\"hljs-string\">\"index\"</span>, <span class=\"hljs-string\">\"1\"</span>); <span class=\"hljs-comment\">// implicitly pass parameters,behind the remote call will implicitly send these parameters to the server side, similar to the cookie, for the framework of integration, not recommended for regular business use</span>\nxxxService.xxx(); <span class=\"hljs-comment\">// remote call</span>\n<span class=\"hljs-comment\">// ...</span>\n</code></pre>\n<h2>Fetch the implicit parameters at service provider side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// get parameters which passed by the consumer side,for the framework of integration, not recommended for regular business use</span>\n        String index = RpcContext.getContext().getAttachment(<span class=\"hljs-string\">\"index\"</span>);\n    }\n}\n</code></pre>\n"
+  "__html": "<h1>Implicit parameters</h1>\n<p>You can implicitly pass parameters between service consumers and providers via <code>setAttachment</code> and<code>getAttachment</code> on <code>RpcContext</code>.\n<img src=\"../sources/images/context.png\" alt=\"/user-guide/images/context.png\"></p>\n<h2>Set the implicit parameters at service consumer side</h2>\n<p>Via <code>setAttachment</code> on <code>RpcContext</code> set key/value pair for implicitly pass parameters.When finished once remote invoke,will be clear,so multi-invoke must set multi-times.</p>\n<pre><code class=\"language-java\">RpcContext.getContext().setAttachment(<span class=\"hljs-string\">\"index\"</span>, <span class=\"hljs-string\">\"1\"</span>); <span class=\"hljs-comment\">// implicitly pass parameters,behind the remote call will implicitly send these parameters to the server side, similar to the cookie, for the framework of integration, not recommended for regular business use</span>\nxxxService.xxx(); <span class=\"hljs-comment\">// remote call</span>\n<span class=\"hljs-comment\">// ...</span>\n</code></pre>\n<h2>Fetch the implicit parameters at service provider side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// get parameters which passed by the consumer side,for the framework of integration, not recommended for regular business use</span>\n        String index = RpcContext.getContext().getAttachment(<span class=\"hljs-string\">\"index\"</span>);\n    }\n}\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/attachment.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/callback-parameter.json b/en-us/docs/user/demos/callback-parameter.json
index fea3b805..a9979bc1 100644
--- a/en-us/docs/user/demos/callback-parameter.json
+++ b/en-us/docs/user/demos/callback-parameter.json
@@ -1,4 +1,6 @@
 {
   "filename": "callback-parameter.md",
-  "__html": "<h1>Callback parameter</h1>\n<p>The parameter callback is the same as calling a local callback or listener, just declare which parameter is a callback type in Spring's configuration file, and Dubbo will generate a reverse proxy based on the long connection so that client logic can be called from the server.Can ref to <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback\">Sample code in the dubbo project</a>.</p>\n<h2>Example of service interface</h2>\n<h3>CallbackService.java</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span></span>;\n}\n</code></pre>\n<h3>CallbackListener.java</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span></span>;\n}\n</code></pre>\n<h2>Example of service provider interface implementation</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback.impl;\n\n<span class=\"hljs-keyword\">import</span> java.text.SimpleDateFormat;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n<span class=\"hljs-keyword\">import</span> java.util.Map;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.ConcurrentHashMap;\n\n<span class=\"hljs-keyword\">import</span> com.callback.CallbackListener;\n<span class=\"hljs-keyword\">import</span> com.callback.CallbackService;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CallbackServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Map&lt;String, CallbackListener&gt; listeners = <span class=\"hljs-keyword\">new</span> ConcurrentHashMap&lt;String, CallbackListener&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">CallbackServiceImpl</span><span class=\"hljs-params\">()</span> </span>{\n        Thread t = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">while</span>(<span class=\"hljs-keyword\">true</span>) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        <span class=\"hljs-keyword\">for</span>(Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()){\n                           <span class=\"hljs-keyword\">try</span> {\n                               entry.getValue().changed(getChanged(entry.getKey()));\n                           } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                               listeners.remove(entry.getKey());\n                           }\n                        }\n                        Thread.sleep(<span class=\"hljs-number\">5000</span>); <span class=\"hljs-comment\">// Timed trigger change notification</span>\n                    } <span class=\"hljs-keyword\">catch</span> (Throwable t) { <span class=\"hljs-comment\">// Defense fault tolerance</span>\n                        t.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.setDaemon(<span class=\"hljs-keyword\">true</span>);\n        t.start();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span> </span>{\n        listeners.put(key, listener);\n        listener.changed(getChanged(key)); <span class=\"hljs-comment\">// send change notification</span>\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> String <span class=\"hljs-title\">getChanged</span><span class=\"hljs-params\">(String key)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Changed: \"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date());\n    }\n}\n</code></pre>\n<h2>Example of service provider configuration</h2>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.callback.impl.CallbackServiceImpl\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"callbackService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"addListener\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--also can via specified argument type--&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--&lt;dubbo:argument type=\"com.demo.CallbackListener\" callback=\"true\" /&gt;--&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h2>Example of service consumer configuration</h2>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> /&gt;</span>\n</code></pre>\n<h2>Example of service consumer call</h2>\n<pre><code class=\"language-java\">ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"classpath:consumer.xml\"</span>);\ncontext.start();\n\nCallbackService callbackService = (CallbackService) context.getBean(<span class=\"hljs-string\">\"callbackService\"</span>);\n\ncallbackService.addListener(<span class=\"hljs-string\">\"foo.bar\"</span>, <span class=\"hljs-keyword\">new</span> CallbackListener(){\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"callback1:\"</span> + msg);\n    }\n});\n</code></pre>\n<p><strong>NOTE</strong> <code>2.0.6+</code> version supported.</p>\n"
+  "__html": "<h1>Callback parameter</h1>\n<p>The parameter callback is the same as calling a local callback or listener, just declare which parameter is a callback type in Spring's configuration file, and Dubbo will generate a reverse proxy based on the long connection so that client logic can be called from the server.Can ref to <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback\">Sample code in the dubbo project</a>.</p>\n<h2>Example of service interface</h2>\n<h3>CallbackService.java</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span></span>;\n}\n</code></pre>\n<h3>CallbackListener.java</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span></span>;\n}\n</code></pre>\n<h2>Example of service provider interface implementation</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback.impl;\n\n<span class=\"hljs-keyword\">import</span> java.text.SimpleDateFormat;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n<span class=\"hljs-keyword\">import</span> java.util.Map;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.ConcurrentHashMap;\n\n<span class=\"hljs-keyword\">import</span> com.callback.CallbackListener;\n<span class=\"hljs-keyword\">import</span> com.callback.CallbackService;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CallbackServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Map&lt;String, CallbackListener&gt; listeners = <span class=\"hljs-keyword\">new</span> ConcurrentHashMap&lt;String, CallbackListener&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">CallbackServiceImpl</span><span class=\"hljs-params\">()</span> </span>{\n        Thread t = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">while</span>(<span class=\"hljs-keyword\">true</span>) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        <span class=\"hljs-keyword\">for</span>(Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()){\n                           <span class=\"hljs-keyword\">try</span> {\n                               entry.getValue().changed(getChanged(entry.getKey()));\n                           } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                               listeners.remove(entry.getKey());\n                           }\n                        }\n                        Thread.sleep(<span class=\"hljs-number\">5000</span>); <span class=\"hljs-comment\">// Timed trigger change notification</span>\n                    } <span class=\"hljs-keyword\">catch</span> (Throwable t) { <span class=\"hljs-comment\">// Defense fault tolerance</span>\n                        t.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.setDaemon(<span class=\"hljs-keyword\">true</span>);\n        t.start();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span> </span>{\n        listeners.put(key, listener);\n        listener.changed(getChanged(key)); <span class=\"hljs-comment\">// send change notification</span>\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> String <span class=\"hljs-title\">getChanged</span><span class=\"hljs-params\">(String key)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Changed: \"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date());\n    }\n}\n</code></pre>\n<h2>Example of service provider configuration</h2>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.callback.impl.CallbackServiceImpl\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"callbackService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"addListener\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--also can via specified argument type--&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--&lt;dubbo:argument type=\"com.demo.CallbackListener\" callback=\"true\" /&gt;--&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h2>Example of service consumer configuration</h2>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> /&gt;</span>\n</code></pre>\n<h2>Example of service consumer call</h2>\n<pre><code class=\"language-java\">ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"classpath:consumer.xml\"</span>);\ncontext.start();\n\nCallbackService callbackService = (CallbackService) context.getBean(<span class=\"hljs-string\">\"callbackService\"</span>);\n\ncallbackService.addListener(<span class=\"hljs-string\">\"foo.bar\"</span>, <span class=\"hljs-keyword\">new</span> CallbackListener(){\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"callback1:\"</span> + msg);\n    }\n});\n</code></pre>\n<p><strong>NOTE</strong> <code>2.0.6+</code> version supported.</p>\n",
+  "link": "/en-us/docs/user/demos/callback-parameter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/concurrency-control.json b/en-us/docs/user/demos/concurrency-control.json
index f2bd0eca..154834d3 100644
--- a/en-us/docs/user/demos/concurrency-control.json
+++ b/en-us/docs/user/demos/concurrency-control.json
@@ -1,4 +1,6 @@
 {
   "filename": "concurrency-control.md",
-  "__html": "<h1>Parallel control</h1>\n<h2>Example of configuration</h2>\n<ul>\n<li>Example 1: Control the concurrency of all method for a specified service interface at server-side</li>\n</ul>\n<p>Limit each method of <code>com.foo.BarService</code> to no more than 10 concurrent server-side executions (or take up thread pool threads):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<ul>\n<li>Example 2: Control the concurrency of specified method for a specified service interface at server-side</li>\n</ul>\n<p>Limit the <code>sayHello</code> method of <code>com.foo.BarService</code> to no more than 10 concurrent server-side executions(or take up thread pool threads):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<ul>\n<li>Example 3: Control the concurrency of all method for a specified service interface at client-side\nLimit each method of <code>com.foo.BarService</code> to no more than 10 concurrent client-side executions (or take up thread pool threads):</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<ul>\n<li>Example 4: Control the concurrency of specified method for a specified service interface at client-side\nLimit the <code>sayHello</code> method of <code>com.foo.BarService</code> to no more than 10 concurrent client-side executions(or take up thread pool threads):</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>If <code>&lt;dubbo:service&gt;</code> and <code>&lt;dubbo:reference&gt;</code> are both configured with <code>actives</code>,<code>&lt;dubbo:reference&gt;</code> is preferred.Ref to:<a href=\"./config-rule.md\">Configuration coverage strategy</a>.</p>\n<h2>Load Balance</h2>\n<p>You can config the <code>loadbalance</code> attribute with <code>leastactive</code> at server-side or client-side,then the framework will make consumer call the minimum number of concurrent one.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Parallel control</h1>\n<h2>Example of configuration</h2>\n<ul>\n<li>Example 1: Control the concurrency of all method for a specified service interface at server-side</li>\n</ul>\n<p>Limit each method of <code>com.foo.BarService</code> to no more than 10 concurrent server-side executions (or take up thread pool threads):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<ul>\n<li>Example 2: Control the concurrency of specified method for a specified service interface at server-side</li>\n</ul>\n<p>Limit the <code>sayHello</code> method of <code>com.foo.BarService</code> to no more than 10 concurrent server-side executions(or take up thread pool threads):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<ul>\n<li>Example 3: Control the concurrency of all method for a specified service interface at client-side\nLimit each method of <code>com.foo.BarService</code> to no more than 10 concurrent client-side executions (or take up thread pool threads):</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<ul>\n<li>Example 4: Control the concurrency of specified method for a specified service interface at client-side\nLimit the <code>sayHello</code> method of <code>com.foo.BarService</code> to no more than 10 concurrent client-side executions(or take up thread pool threads):</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>If <code>&lt;dubbo:service&gt;</code> and <code>&lt;dubbo:reference&gt;</code> are both configured with <code>actives</code>,<code>&lt;dubbo:reference&gt;</code> is preferred.Ref to:<a href=\"./config-rule.md\">Configuration coverage strategy</a>.</p>\n<h2>Load Balance</h2>\n<p>You can config the <code>loadbalance</code> attribute with <code>leastactive</code> at server-side or client-side,then the framework will make consumer call the minimum number of concurrent one.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/concurrency-control.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/config-connections.json b/en-us/docs/user/demos/config-connections.json
index 596f8747..bcb36924 100644
--- a/en-us/docs/user/demos/config-connections.json
+++ b/en-us/docs/user/demos/config-connections.json
@@ -1,4 +1,6 @@
 {
   "filename": "config-connections.md",
-  "__html": "<h1>Config connections</h1>\n<h2>Control connections at server-side</h2>\n<p>Limit server-side accept to no more than 10 connections</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h2>Control connections at client-side</h2>\n<p>Limit client-side creating connection to no more than 10 connections for interface <code>com.foo.BarService</code>.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p><strong>NOTE:</strong> If used default protocol(<code>dubbo</code> protocol), and the value of  <code>connections</code> attribute is great than 0,then each service reference will has itself connection,else all service which belong to same remote server will share only one connection. In this framework,we called <code>private</code> connection or <code>share</code> connection.</p>\n<p>If <code>&lt;dubbo:service&gt;</code> and <code>&lt;dubbo:reference&gt;</code> are both configured accepts/connections,<code>&lt;dubbo:reference&gt;</code> is preferred,Ref to <a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/demos/config-rule.html\">Configuration coverage strategy</a>.</p>\n<ul>\n<li>: Because connection is connect on Server,so configure at Provider.</li>\n</ul>\n"
+  "__html": "<h1>Config connections</h1>\n<h2>Control connections at server-side</h2>\n<p>Limit server-side accept to no more than 10 connections</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h2>Control connections at client-side</h2>\n<p>Limit client-side creating connection to no more than 10 connections for interface <code>com.foo.BarService</code>.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p><strong>NOTE:</strong> If used default protocol(<code>dubbo</code> protocol), and the value of  <code>connections</code> attribute is great than 0,then each service reference will has itself connection,else all service which belong to same remote server will share only one connection. In this framework,we called <code>private</code> connection or <code>share</code> connection.</p>\n<p>If <code>&lt;dubbo:service&gt;</code> and <code>&lt;dubbo:reference&gt;</code> are both configured accepts/connections,<code>&lt;dubbo:reference&gt;</code> is preferred,Ref to <a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/demos/config-rule.html\">Configuration coverage strategy</a>.</p>\n<ul>\n<li>: Because connection is connect on Server,so configure at Provider.</li>\n</ul>\n",
+  "link": "/en-us/docs/user/demos/config-connections.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/config-rule.json b/en-us/docs/user/demos/config-rule.json
index 00698d6e..1e1013a0 100644
--- a/en-us/docs/user/demos/config-rule.json
+++ b/en-us/docs/user/demos/config-rule.json
@@ -1,4 +1,6 @@
 {
   "filename": "config-rule.md",
-  "__html": "<h1>Configure rule</h1>\n<p>Write then dynamic configuration to the registry center,This feature is usually done by the monitoring center or the center's page.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000\"</span>));\n</code></pre>\n<p>In the config override url:</p>\n<ul>\n<li><code>override://</code> Indicates that the data is overwritten,support <code>override</code> and  <code>absent</code>,can extends,<strong>Required</strong>.</li>\n<li><code>0.0.0.0</code> Indicates that the configurations is valid for all IP addresses,If only want to overwritten specified ip data,you can replace that specified ip address.<strong>Required</strong>.</li>\n<li><code>com.foo.BarService</code> Indicates that is valid for specified service,<strong>Required</strong>.</li>\n<li><code>category=configurators</code> Indicates that the data is dynamic configuration,<strong>Required</strong>。</li>\n<li><code>dynamic=false</code> Indicates that the data is persistent,When the registered party withdraws,the data is still stored in the registry <strong>Required</strong>。</li>\n<li><code>enabled=true</code> override strategy is enable,can absent,if absent,then enable.</li>\n<li><code>application=foo</code> Indicates that is valid for specified application,can absent,if absent,then valid for all application.</li>\n<li><code>timeout=1000</code> Indicates that the value of the <code>timeout</code> parameter that satisfies the above conditions is overwritten by 1000,if want to override another parameters, add directly to the <code>override</code> URL parameter.</li>\n</ul>\n<p>Example:</p>\n<ol>\n<li>\n<p>Disable service provider.(Usually used to temporarily kick off a provider machine, similar to the prohibition of consumer access, please use the routing rules)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;disbaled=true\n</code></pre>\n</li>\n<li>\n<p>Adjustment weight:(Usually used to capacity assessment,default is 100)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;weight=200\n</code></pre>\n</li>\n<li>\n<p>Adjustment load balance strategy.(default random)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;loadbalance=leastactive\n</code></pre>\n</li>\n<li>\n<p>Service downgrade:(Usually used to temporarily mask an error of non-critical services)</p>\n<pre><code>override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\n</code></pre>\n</li>\n</ol>\n<p><strong>NOTE</strong>: <code>2.2.0+</code> version supported.</p>\n"
+  "__html": "<h1>Configure rule</h1>\n<p>Write then dynamic configuration to the registry center,This feature is usually done by the monitoring center or the center's page.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000\"</span>));\n</code></pre>\n<p>In the config override url:</p>\n<ul>\n<li><code>override://</code> Indicates that the data is overwritten,support <code>override</code> and  <code>absent</code>,can extends,<strong>Required</strong>.</li>\n<li><code>0.0.0.0</code> Indicates that the configurations is valid for all IP addresses,If only want to overwritten specified ip data,you can replace that specified ip address.<strong>Required</strong>.</li>\n<li><code>com.foo.BarService</code> Indicates that is valid for specified service,<strong>Required</strong>.</li>\n<li><code>category=configurators</code> Indicates that the data is dynamic configuration,<strong>Required</strong>。</li>\n<li><code>dynamic=false</code> Indicates that the data is persistent,When the registered party withdraws,the data is still stored in the registry <strong>Required</strong>。</li>\n<li><code>enabled=true</code> override strategy is enable,can absent,if absent,then enable.</li>\n<li><code>application=foo</code> Indicates that is valid for specified application,can absent,if absent,then valid for all application.</li>\n<li><code>timeout=1000</code> Indicates that the value of the <code>timeout</code> parameter that satisfies the above conditions is overwritten by 1000,if want to override another parameters, add directly to the <code>override</code> URL parameter.</li>\n</ul>\n<p>Example:</p>\n<ol>\n<li>\n<p>Disable service provider.(Usually used to temporarily kick off a provider machine, similar to the prohibition of consumer access, please use the routing rules)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;disbaled=true\n</code></pre>\n</li>\n<li>\n<p>Adjustment weight:(Usually used to capacity assessment,default is 100)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;weight=200\n</code></pre>\n</li>\n<li>\n<p>Adjustment load balance strategy.(default random)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;loadbalance=leastactive\n</code></pre>\n</li>\n<li>\n<p>Service downgrade:(Usually used to temporarily mask an error of non-critical services)</p>\n<pre><code>override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\n</code></pre>\n</li>\n</ol>\n<p><strong>NOTE</strong>: <code>2.2.0+</code> version supported.</p>\n",
+  "link": "/en-us/docs/user/demos/config-rule.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/context.json b/en-us/docs/user/demos/context.json
index 89835341..59aaed5f 100644
--- a/en-us/docs/user/demos/context.json
+++ b/en-us/docs/user/demos/context.json
@@ -1,4 +1,6 @@
 {
   "filename": "context.md",
-  "__html": "<h1>Context Information</h1>\n<p>All environment information of during the current call will put into the context,and all configuration information will convert the parameters of <code>URL</code> instance,Ref to the column of <strong>URL parameters</strong> at the <a href=\"../references/xml/introduction.md\">schema configuration reference book</a></p>\n<p><code>RpcContext</code> is a temporary status recorder of <code>ThreadLocal</code>,when accept <code>RPC</code> request or send <code>RPC</code> request,The <code>RpcContext</code> will be  changed.Such as: <code>A</code> call <code>B</code> and <code>B</code> call <code>C</code>. On <code>B</code> machine,before <code>B</code> call <code>C</code>,the <code>RpcContext</code> will record the information of <code>A</code> call <code>B</code>.After <code>B</code> call <code>C</code>,the <code>RpcContext</code> record the information of <code>B</code> call <code>C</code>.</p>\n<h2>At service consumer</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// remote invoke</span>\nxxxService.xxx();\n<span class=\"hljs-comment\">// if return true,then the current side is consumer.</span>\n<span class=\"hljs-keyword\">boolean</span> isConsumerSide = RpcContext.getContext().isConsumerSide();\n<span class=\"hljs-comment\">// get the provider ip address of the last invoke.</span>\nString serverIP = RpcContext.getContext().getRemoteHost();\n<span class=\"hljs-comment\">// because all configuration information has convert the URL's  parameters,so at this place can get the application parameter value.</span>\nString application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n<span class=\"hljs-comment\">// Note:every rpc invoke,then context will be changed.</span>\nyyyService.yyy();\n</code></pre>\n<h2>At service provider</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// if return true,then the current side is provider.</span>\n        <span class=\"hljs-keyword\">boolean</span> isProviderSide = RpcContext.getContext().isProviderSide();\n        <span class=\"hljs-comment\">// get the invoker ip</span>\n        String clientIP = RpcContext.getContext().getRemoteHost();\n        <span class=\"hljs-comment\">// because all configuration information has convert the URL's  parameters,so at this place can get the application parameter value.</span>\n        String application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n        <span class=\"hljs-comment\">// Note:every rpc invoke,then context will be changed.</span>\n        yyyService.yyy();;\n    }\n}\n</code></pre>\n"
+  "__html": "<h1>Context Information</h1>\n<p>All environment information of during the current call will put into the context,and all configuration information will convert the parameters of <code>URL</code> instance,Ref to the column of <strong>URL parameters</strong> at the <a href=\"../references/xml/introduction.md\">schema configuration reference book</a></p>\n<p><code>RpcContext</code> is a temporary status recorder of <code>ThreadLocal</code>,when accept <code>RPC</code> request or send <code>RPC</code> request,The <code>RpcContext</code> will be  changed.Such as: <code>A</code> call <code>B</code> and <code>B</code> call <code>C</code>. On <code>B</code> machine,before <code>B</code> call <code>C</code>,the <code>RpcContext</code> will record the information of <code>A</code> call <code>B</code>.After <code>B</code> call <code>C</code>,the <code>RpcContext</code> record the information of <code>B</code> call <code>C</code>.</p>\n<h2>At service consumer</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// remote invoke</span>\nxxxService.xxx();\n<span class=\"hljs-comment\">// if return true,then the current side is consumer.</span>\n<span class=\"hljs-keyword\">boolean</span> isConsumerSide = RpcContext.getContext().isConsumerSide();\n<span class=\"hljs-comment\">// get the provider ip address of the last invoke.</span>\nString serverIP = RpcContext.getContext().getRemoteHost();\n<span class=\"hljs-comment\">// because all configuration information has convert the URL's  parameters,so at this place can get the application parameter value.</span>\nString application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n<span class=\"hljs-comment\">// Note:every rpc invoke,then context will be changed.</span>\nyyyService.yyy();\n</code></pre>\n<h2>At service provider</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// if return true,then the current side is provider.</span>\n        <span class=\"hljs-keyword\">boolean</span> isProviderSide = RpcContext.getContext().isProviderSide();\n        <span class=\"hljs-comment\">// get the invoker ip</span>\n        String clientIP = RpcContext.getContext().getRemoteHost();\n        <span class=\"hljs-comment\">// because all configuration information has convert the URL's  parameters,so at this place can get the application parameter value.</span>\n        String application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n        <span class=\"hljs-comment\">// Note:every rpc invoke,then context will be changed.</span>\n        yyyService.yyy();;\n    }\n}\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/context.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/delay-publish.json b/en-us/docs/user/demos/delay-publish.json
index a8e96c97..8b836981 100644
--- a/en-us/docs/user/demos/delay-publish.json
+++ b/en-us/docs/user/demos/delay-publish.json
@@ -1,4 +1,6 @@
 {
   "filename": "delay-publish.md",
-  "__html": "<h1>Delay publish service</h1>\n<p>If your services need time to warm up, such as: initialization cache or another reference resources has to be ready. You can use the delay feature to delay publishing services. We fine-tuned the service delay exposure logic in Dubbo 2.6.5, delaying the countdown of services that require delayed exposure until Spring initialization is complete. You won't be aware of this change while using Dubbo, so please be assured that use.</p>\n<h2>Prior to Dubbo-2.6.5</h2>\n<h3>Delay five second publish</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h3>Delay until Spring initialization is complete before exposing the service</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"-1\"</span> /&gt;</span>\n</code></pre>\n<h2>Dubbo-2.6.5 and later</h2>\n<p>All services will be exposed after Spring initialization is complete, and you don't need to configure delay if you don't need to delay exposing the service.</p>\n<h3>Delay five second publish</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h2>The initialization deadlock problem of Spring 2.x</h2>\n<h3>Trigger condition</h3>\n<p>The service has already published when <code>Spring</code> parse the <code>&lt;dubbo:service /&gt;</code> element,but the <code>Spring</code> is still initializing other beans.If there is a request coming in, and the service implementation class has a call to <code>applicationContext.getBean ()</code> usage.</p>\n<ol>\n<li>\n<p>Request thread applicationContext.getBean() call, the first synchronization <code>singletonObjects</code> determine whether the existence of the bean, the synchronization does not exist to initialize the <code>beanDefinitionMap</code>, and re-synchronize <code>singletonObjects</code> write Bean instance cache.</p>\n<p><img src=\"../sources/images/lock-get-bean.jpg\" alt=\"deadlock\"></p>\n</li>\n<li>\n<p>But the <code>Spring</code> initialization thread,because need to determine the <code>Bean</code> is exist,Directly synchronize beanDefinitionMap to initialize, and synchronize singletonObjects write Bean instance cache.</p>\n<p><img src=\"../sources/images/lock-init-context.jpg\" alt=\"/user-guide/images/lock-init-context.jpg\"></p>\n</li>\n</ol>\n<p>This will cause the getBean thread to lock the singletonObjects first, then lock the beanDefinitionMap, and lock the singletonObjects again.The Spring initialization thread, the first lock beanDefinitionMap, then lock singletonObjects. Reverse lock thread deadlock, can not provide services, can not start.</p>\n<h3>Avoid ways</h3>\n<ol>\n<li>It is highly recommended not to call applicationContext.getBean() in the service implementation class, all using Spring's beans using IoC injection.</li>\n<li>If you really want to tune getBean(), you can put the configuration of Dubbo Spring final loading.</li>\n<li>If you do not want to rely on the configuration order, you can use <code>&lt;dubbo:provider delay =&quot;-1&quot;/&gt;</code> to make Dubbo expose the service after the Spring container has been initialized.</li>\n<li>If you use getBean() extensively, the equivalent of degenerating Spring to factory mode is to isolate Dubbo's service from a separate Spring container.</li>\n</ol>\n"
+  "__html": "<h1>Delay publish service</h1>\n<p>If your services need time to warm up, such as: initialization cache or another reference resources has to be ready. You can use the delay feature to delay publishing services. We fine-tuned the service delay exposure logic in Dubbo 2.6.5, delaying the countdown of services that require delayed exposure until Spring initialization is complete. You won't be aware of this change while using Dubbo, so please be assured that use.</p>\n<h2>Prior to Dubbo-2.6.5</h2>\n<h3>Delay five second publish</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h3>Delay until Spring initialization is complete before exposing the service</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"-1\"</span> /&gt;</span>\n</code></pre>\n<h2>Dubbo-2.6.5 and later</h2>\n<p>All services will be exposed after Spring initialization is complete, and you don't need to configure delay if you don't need to delay exposing the service.</p>\n<h3>Delay five second publish</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h2>The initialization deadlock problem of Spring 2.x</h2>\n<h3>Trigger condition</h3>\n<p>The service has already published when <code>Spring</code> parse the <code>&lt;dubbo:service /&gt;</code> element,but the <code>Spring</code> is still initializing other beans.If there is a request coming in, and the service implementation class has a call to <code>applicationContext.getBean ()</code> usage.</p>\n<ol>\n<li>\n<p>Request thread applicationContext.getBean() call, the first synchronization <code>singletonObjects</code> determine whether the existence of the bean, the synchronization does not exist to initialize the <code>beanDefinitionMap</code>, and re-synchronize <code>singletonObjects</code> write Bean instance cache.</p>\n<p><img src=\"../sources/images/lock-get-bean.jpg\" alt=\"deadlock\"></p>\n</li>\n<li>\n<p>But the <code>Spring</code> initialization thread,because need to determine the <code>Bean</code> is exist,Directly synchronize beanDefinitionMap to initialize, and synchronize singletonObjects write Bean instance cache.</p>\n<p><img src=\"../sources/images/lock-init-context.jpg\" alt=\"/user-guide/images/lock-init-context.jpg\"></p>\n</li>\n</ol>\n<p>This will cause the getBean thread to lock the singletonObjects first, then lock the beanDefinitionMap, and lock the singletonObjects again.The Spring initialization thread, the first lock beanDefinitionMap, then lock singletonObjects. Reverse lock thread deadlock, can not provide services, can not start.</p>\n<h3>Avoid ways</h3>\n<ol>\n<li>It is highly recommended not to call applicationContext.getBean() in the service implementation class, all using Spring's beans using IoC injection.</li>\n<li>If you really want to tune getBean(), you can put the configuration of Dubbo Spring final loading.</li>\n<li>If you do not want to rely on the configuration order, you can use <code>&lt;dubbo:provider delay =&quot;-1&quot;/&gt;</code> to make Dubbo expose the service after the Spring container has been initialized.</li>\n<li>If you use getBean() extensively, the equivalent of degenerating Spring to factory mode is to isolate Dubbo's service from a separate Spring container.</li>\n</ol>\n",
+  "link": "/en-us/docs/user/demos/delay-publish.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/distributed-transaction.json b/en-us/docs/user/demos/distributed-transaction.json
index 20351e91..7bb5203d 100644
--- a/en-us/docs/user/demos/distributed-transaction.json
+++ b/en-us/docs/user/demos/distributed-transaction.json
@@ -1,4 +1,6 @@
 {
   "filename": "distributed-transaction.md",
-  "__html": "<h1>Distributed transaction</h1>\n<p>Distributed transactions are based on the JTA / XA specification(this feature has not yet been implemented)</p>\n<p>Two-phase commit:</p>\n<p><img src=\"../sources/images/jta-xa.jpg\" alt=\"/user-guide/images/jta-xa.jpg\"></p>\n"
+  "__html": "<h1>Distributed transaction</h1>\n<p>Distributed transactions are based on the JTA / XA specification(this feature has not yet been implemented)</p>\n<p>Two-phase commit:</p>\n<p><img src=\"../sources/images/jta-xa.jpg\" alt=\"/user-guide/images/jta-xa.jpg\"></p>\n",
+  "link": "/en-us/docs/user/demos/distributed-transaction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/dump.json b/en-us/docs/user/demos/dump.json
index 00e7d358..f19d8b5d 100644
--- a/en-us/docs/user/demos/dump.json
+++ b/en-us/docs/user/demos/dump.json
@@ -1,4 +1,6 @@
 {
   "filename": "dump.md",
-  "__html": "<h1>Dump</h1>\n<p>When the business thread pool is full, we need to know what resources/conditions are waiting for the thread , to find the bottleneck point of the system or abnormal point. <code>dubbo</code> automatically export thread stack through <code>Jstack</code> to keep the scene for easy to troubleshoot the problem.</p>\n<p>Default policy:</p>\n<ul>\n<li>Export file path,user.home directory</li>\n<li>Export interval,The shortest interval allows you to export every 10 minutes</li>\n</ul>\n<p>Specified export file path:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.application.dump.directory</span>=<span class=\"hljs-string\">/tmp</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">...</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"dump.directory\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"/tmp\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Dump</h1>\n<p>When the business thread pool is full, we need to know what resources/conditions are waiting for the thread , to find the bottleneck point of the system or abnormal point. <code>dubbo</code> automatically export thread stack through <code>Jstack</code> to keep the scene for easy to troubleshoot the problem.</p>\n<p>Default policy:</p>\n<ul>\n<li>Export file path,user.home directory</li>\n<li>Export interval,The shortest interval allows you to export every 10 minutes</li>\n</ul>\n<p>Specified export file path:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.application.dump.directory</span>=<span class=\"hljs-string\">/tmp</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">...</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"dump.directory\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"/tmp\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/dump.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/echo-service.json b/en-us/docs/user/demos/echo-service.json
index 6f39d215..5e324c54 100644
--- a/en-us/docs/user/demos/echo-service.json
+++ b/en-us/docs/user/demos/echo-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "echo-service.md",
-  "__html": "<h1>Echo Testing</h1>\n<p>Echo testing is used for check the service is available,Echo testing is performed according to the normal request flow and is able to test whether the entire call is unobstructed and can be used for monitoring.</p>\n<p>All the services will be automatically implemented <code>EchoService</code> interface,just cast any service reference to <code>EchoService</code> to use it.</p>\n<p>Spring configuration:</p>\n<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\">\"memberService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MemberService\"</span> /&gt;</span>\n</code></pre>\n<p>The java code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// reference the remote service</span>\nMemberService memberService = ctx.getBean(<span class=\"hljs-string\">\"memberService\"</span>);\n<span class=\"hljs-comment\">// case the service reference to EchoService</span>\nEchoService echoService = (EchoService) memberService;\n\n<span class=\"hljs-comment\">// Echo test usability</span>\nString status = echoService.$echo(<span class=\"hljs-string\">\"OK\"</span>);\n\n<span class=\"hljs-keyword\">assert</span>(status.equals(<span class=\"hljs-string\">\"OK\"</span>));\n</code></pre>\n"
+  "__html": "<h1>Echo Testing</h1>\n<p>Echo testing is used for check the service is available,Echo testing is performed according to the normal request flow and is able to test whether the entire call is unobstructed and can be used for monitoring.</p>\n<p>All the services will be automatically implemented <code>EchoService</code> interface,just cast any service reference to <code>EchoService</code> to use it.</p>\n<p>Spring configuration:</p>\n<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\">\"memberService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MemberService\"</span> /&gt;</span>\n</code></pre>\n<p>The java code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// reference the remote service</span>\nMemberService memberService = ctx.getBean(<span class=\"hljs-string\">\"memberService\"</span>);\n<span class=\"hljs-comment\">// case the service reference to EchoService</span>\nEchoService echoService = (EchoService) memberService;\n\n<span class=\"hljs-comment\">// Echo test usability</span>\nString status = echoService.$echo(<span class=\"hljs-string\">\"OK\"</span>);\n\n<span class=\"hljs-keyword\">assert</span>(status.equals(<span class=\"hljs-string\">\"OK\"</span>));\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/echo-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/events-notify.json b/en-us/docs/user/demos/events-notify.json
index fd6109c2..df380837 100644
--- a/en-us/docs/user/demos/events-notify.json
+++ b/en-us/docs/user/demos/events-notify.json
@@ -1,4 +1,6 @@
 {
   "filename": "events-notify.md",
-  "__html": "<h1>Event Notify</h1>\n<p>Before calling, after calling, when an exception occurs,will trigger <code>oninvoke</code>, <code>onreturn</code>, <code>onthrow</code> events.You can configure which method to notify when an event occurs.</p>\n<h2>Service Interface</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span></span>;\n}\n</code></pre>\n<h2>Service provider implement the service.</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NormalDemoService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Person(id, <span class=\"hljs-string\">\"charles`son\"</span>, <span class=\"hljs-number\">4</span>);\n    }\n}\n</code></pre>\n<h2>Service provider configure the service which it provided.</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rpc-callback-demo\"</span> /&gt;</span>\n<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>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NormalDemoService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span>/&gt;</span>\n</code></pre>\n<h2>Declare the Callback interface at service consumer-side.</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span></span>;\n}\n</code></pre>\n<h2>Implement the Callback at service consumer-side.</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NotifyImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Person&gt;    ret    = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Person&gt;();\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Throwable&gt; errors = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Throwable&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"onreturn:\"</span> + msg);\n        ret.put(id, msg);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span> </span>{\n        errors.put(id, ex);\n    }\n}\n</code></pre>\n<h2>Configure the Callback at service consumer-side.</h2>\n<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\">\"demoCallback\"</span> <span class=\"hljs-attr\">class</span> = <span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NofifyImpl\"</span> /&gt;</span>\n<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\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span> &gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"get\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">onreturn</span> = <span class=\"hljs-string\">\"demoCallback.onreturn\"</span> <span class=\"hljs-attr\">onthrow</span>=<span class=\"hljs-string\">\"demoCallback.onthrow\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p><code>callback</code> and<code>async</code> functions are orthogonally decomposed. <code>async = true</code> means that the result is returned immediately.<code>onreturn</code> means that a callback is required.</p>\n<p>There are several situations with the tow attributes[^2].</p>\n<ul>\n<li>Asynchronous callback mode:<code>async=true onreturn=&quot;xxx&quot;</code></li>\n<li>Synchronous callback mode:<code>async=false onreturn=&quot;xxx&quot;</code></li>\n<li>Asynchronous no callback:<code>async=true</code></li>\n<li>Synchronous no callback:<code>async=true</code></li>\n</ul>\n<h2>Testing code</h2>\n<pre><code class=\"language-java\">IDemoService demoService = (IDemoService) context.getBean(<span class=\"hljs-string\">\"demoService\"</span>);\nNofifyImpl notify = (NofifyImpl) context.getBean(<span class=\"hljs-string\">\"demoCallback\"</span>);\n<span class=\"hljs-keyword\">int</span> requestId = <span class=\"hljs-number\">2</span>;\nPerson ret = demoService.get(requestId);\nAssert.assertEquals(<span class=\"hljs-keyword\">null</span>, ret);\n<span class=\"hljs-comment\">//for Test:Just used to illustrate the normal callback callback, the specific business decisions.</span>\n<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-number\">10</span>; i++) {\n    <span class=\"hljs-keyword\">if</span> (!notify.ret.containsKey(requestId)) {\n        Thread.sleep(<span class=\"hljs-number\">200</span>);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-keyword\">break</span>;\n    }\n}\nAssert.assertEquals(requestId, notify.ret.get(requestId).getId());\n</code></pre>\n<p><strong>NOTE</strong><code>2.0.7+</code> version,<code>async=false</code> is default.</p>\n"
+  "__html": "<h1>Event Notify</h1>\n<p>Before calling, after calling, when an exception occurs,will trigger <code>oninvoke</code>, <code>onreturn</code>, <code>onthrow</code> events.You can configure which method to notify when an event occurs.</p>\n<h2>Service Interface</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span></span>;\n}\n</code></pre>\n<h2>Service provider implement the service.</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NormalDemoService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Person(id, <span class=\"hljs-string\">\"charles`son\"</span>, <span class=\"hljs-number\">4</span>);\n    }\n}\n</code></pre>\n<h2>Service provider configure the service which it provided.</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rpc-callback-demo\"</span> /&gt;</span>\n<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>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NormalDemoService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span>/&gt;</span>\n</code></pre>\n<h2>Declare the Callback interface at service consumer-side.</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span></span>;\n}\n</code></pre>\n<h2>Implement the Callback at service consumer-side.</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NotifyImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Person&gt;    ret    = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Person&gt;();\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Throwable&gt; errors = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Throwable&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"onreturn:\"</span> + msg);\n        ret.put(id, msg);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span> </span>{\n        errors.put(id, ex);\n    }\n}\n</code></pre>\n<h2>Configure the Callback at service consumer-side.</h2>\n<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\">\"demoCallback\"</span> <span class=\"hljs-attr\">class</span> = <span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NofifyImpl\"</span> /&gt;</span>\n<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\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span> &gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"get\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">onreturn</span> = <span class=\"hljs-string\">\"demoCallback.onreturn\"</span> <span class=\"hljs-attr\">onthrow</span>=<span class=\"hljs-string\">\"demoCallback.onthrow\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p><code>callback</code> and<code>async</code> functions are orthogonally decomposed. <code>async = true</code> means that the result is returned immediately.<code>onreturn</code> means that a callback is required.</p>\n<p>There are several situations with the tow attributes[^2].</p>\n<ul>\n<li>Asynchronous callback mode:<code>async=true onreturn=&quot;xxx&quot;</code></li>\n<li>Synchronous callback mode:<code>async=false onreturn=&quot;xxx&quot;</code></li>\n<li>Asynchronous no callback:<code>async=true</code></li>\n<li>Synchronous no callback:<code>async=true</code></li>\n</ul>\n<h2>Testing code</h2>\n<pre><code class=\"language-java\">IDemoService demoService = (IDemoService) context.getBean(<span class=\"hljs-string\">\"demoService\"</span>);\nNofifyImpl notify = (NofifyImpl) context.getBean(<span class=\"hljs-string\">\"demoCallback\"</span>);\n<span class=\"hljs-keyword\">int</span> requestId = <span class=\"hljs-number\">2</span>;\nPerson ret = demoService.get(requestId);\nAssert.assertEquals(<span class=\"hljs-keyword\">null</span>, ret);\n<span class=\"hljs-comment\">//for Test:Just used to illustrate the normal callback callback, the specific business decisions.</span>\n<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-number\">10</span>; i++) {\n    <span class=\"hljs-keyword\">if</span> (!notify.ret.containsKey(requestId)) {\n        Thread.sleep(<span class=\"hljs-number\">200</span>);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-keyword\">break</span>;\n    }\n}\nAssert.assertEquals(requestId, notify.ret.get(requestId).getId());\n</code></pre>\n<p><strong>NOTE</strong><code>2.0.7+</code> version,<code>async=false</code> is default.</p>\n",
+  "link": "/en-us/docs/user/demos/events-notify.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/explicit-target.json b/en-us/docs/user/demos/explicit-target.json
index def03a5e..8184204c 100644
--- a/en-us/docs/user/demos/explicit-target.json
+++ b/en-us/docs/user/demos/explicit-target.json
@@ -1,4 +1,6 @@
 {
   "filename": "explicit-target.md",
-  "__html": "<h1>Explicit target</h1>\n<p>In the development and testing environment, it is often necessary to bypass the registry and test only designated service providers. In this case, point-to-point direct connection may be required, and the service provider will ignore the list of provider registration providers. The interface A configure Point-to-point, does not affect the B interface to obtain a list from the registry.</p>\n<p><img src=\"../sources/images/dubbo-directly.jpg\" alt=\"/user-guide/images/dubbo-directly.jpg\"></p>\n<h2>Configure with XML</h2>\n<p>If it is online demand needs the point-to-point feature,You can configure the specified provider url at <code>&lt;dubbo:reference&gt;</code>.it will bypass the registry, multiple addresses separated by semicolons, the following configuration:</p>\n<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\">\"xxxService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"dubbo://localhost:20890\"</span> /&gt;</span>\n</code></pre>\n<h2>Configure with the <code>-D</code> argument</h2>\n<p>Add the -D parameter mapping service address to the JVM startup parameters:</p>\n<pre><code class=\"language-sh\">java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890\n</code></pre>\n<h2>Configure with the <code>.properties</code> file</h2>\n<p>If you have more services, you can also use file mapping to specify the mapping file path with <code>-Ddubbo.resolve.file</code>. This configuration takes precedence over the configuration in<code>&lt;dubbo: reference&gt;</code>, for example:</p>\n<pre><code class=\"language-sh\">java -Ddubbo.resolve.file=xxx.properties\n</code></pre>\n<p>Then add the configuration in the mapping file <code>xxx.properties</code>, where key is the service name and value is the service provider URL:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">com.alibaba.xxx.XxxService</span>=<span class=\"hljs-string\">dubbo://localhost:20890</span>\n</code></pre>\n<p><strong>NOTE</strong> To avoid complicating the online environment, do not use this feature online and should only be used during the testing phase</p>\n"
+  "__html": "<h1>Explicit target</h1>\n<p>In the development and testing environment, it is often necessary to bypass the registry and test only designated service providers. In this case, point-to-point direct connection may be required, and the service provider will ignore the list of provider registration providers. The interface A configure Point-to-point, does not affect the B interface to obtain a list from the registry.</p>\n<p><img src=\"../sources/images/dubbo-directly.jpg\" alt=\"/user-guide/images/dubbo-directly.jpg\"></p>\n<h2>Configure with XML</h2>\n<p>If it is online demand needs the point-to-point feature,You can configure the specified provider url at <code>&lt;dubbo:reference&gt;</code>.it will bypass the registry, multiple addresses separated by semicolons, the following configuration:</p>\n<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\">\"xxxService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"dubbo://localhost:20890\"</span> /&gt;</span>\n</code></pre>\n<h2>Configure with the <code>-D</code> argument</h2>\n<p>Add the -D parameter mapping service address to the JVM startup parameters:</p>\n<pre><code class=\"language-sh\">java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890\n</code></pre>\n<h2>Configure with the <code>.properties</code> file</h2>\n<p>If you have more services, you can also use file mapping to specify the mapping file path with <code>-Ddubbo.resolve.file</code>. This configuration takes precedence over the configuration in<code>&lt;dubbo: reference&gt;</code>, for example:</p>\n<pre><code class=\"language-sh\">java -Ddubbo.resolve.file=xxx.properties\n</code></pre>\n<p>Then add the configuration in the mapping file <code>xxx.properties</code>, where key is the service name and value is the service provider URL:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">com.alibaba.xxx.XxxService</span>=<span class=\"hljs-string\">dubbo://localhost:20890</span>\n</code></pre>\n<p><strong>NOTE</strong> To avoid complicating the online environment, do not use this feature online and should only be used during the testing phase</p>\n",
+  "link": "/en-us/docs/user/demos/explicit-target.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/fault-tolerent-strategy.json b/en-us/docs/user/demos/fault-tolerent-strategy.json
index 62fc8d8f..65c9a35b 100644
--- a/en-us/docs/user/demos/fault-tolerent-strategy.json
+++ b/en-us/docs/user/demos/fault-tolerent-strategy.json
@@ -1,4 +1,6 @@
 {
   "filename": "fault-tolerent-strategy.md",
-  "__html": "<h1>Fault Tolerance Strategy</h1>\n<p>Dubbo offers a variety of fault-tolerant scenarios when a cluster call fails, with a default failover retry.</p>\n<p><img src=\"../sources/images/cluster.jpg\" alt=\"cluster\"></p>\n<p>The relationship between nodes:</p>\n<ul>\n<li>This <code>Invoker</code> is the callable Service's abstract of the<code>Provider</code>, and the <code>Invoker</code> packaging the<code>Provider</code>'s address and <code>Service</code>'s interface.</li>\n<li>The <code>Directory</code> represent multiple <code>Invoker</code>,You can think of it as <code>List&lt;Invoker&gt;</code>,But unlike <code>List</code>,its value  can be dynamically changing.such as registry push changes</li>\n<li>The <code>Cluster</code> disguises multiple<code>Invoker</code> in <code>Directory</code> as a<code>Invoker</code>,The upper transparent, masquerade process contains fault-tolerant logic, call failed, try another</li>\n<li>The <code>Router</code> is responsible for selecting subsets according to routing rules from multiple <code>Invoker</code>s, such as read-write separation, application isolation, etc.</li>\n<li><code>LoadBalance</code> is responsible for selecting a specific one from multiple<code>Invoker</code> for this call. The selection process includes the load balancing algorithm. If the call fails, it needs to be re-selected</li>\n</ul>\n<h2>Cluster fault-tolerant mode</h2>\n<p>You can also customize the cluster fault tolerance strategy, see <a href=\"../../dev/impls/cluster.md\">Cluster extension</a> for more details.</p>\n<h2>Failover Cluster</h2>\n<p>Failure automatically switch, when there is failure, retry the other server (default). Usually used for read operations, but retries can result in longer delays. The times of retries can be set via <code>retries =2</code> (excluding the first time).</p>\n<p>The times of retries is configured as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<h3>Failfast Cluster</h3>\n<p>Fast failure, only made a call, failure immediately error. Usually used for non-idempotent write operations, such as adding records</p>\n<h3>Failsafe Cluster</h3>\n<p>Failure of security, anomalies, directly ignored. Usually used to write audit logs and other operations.</p>\n<h3>Failback Cluster</h3>\n<p>Failure automatically restored, failed to record the background request, regular retransmission. Usually used for message notification operations.</p>\n<h3>Forking Cluster</h3>\n<p>Multiple servers are invoked in parallel, returning as soon as one succeeds. Usually used for real-time demanding read operations, but need to waste more service resources. The maximum number of parallelism can be set with <code>forks=2</code>.</p>\n<h3>Broadcast Cluster</h3>\n<p>Calling all providers broadcast, one by one call, any error is reported (<code>2.1.0+</code>). It is usually used to notify all providers to update local resource information such as caches or logs.</p>\n<h2>Cluster mode configuration</h2>\n<p>Follow the example below to configure cluster mode on service providers and consumers</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Fault Tolerance Strategy</h1>\n<p>Dubbo offers a variety of fault-tolerant scenarios when a cluster call fails, with a default failover retry.</p>\n<p><img src=\"../sources/images/cluster.jpg\" alt=\"cluster\"></p>\n<p>The relationship between nodes:</p>\n<ul>\n<li>This <code>Invoker</code> is the callable Service's abstract of the<code>Provider</code>, and the <code>Invoker</code> packaging the<code>Provider</code>'s address and <code>Service</code>'s interface.</li>\n<li>The <code>Directory</code> represent multiple <code>Invoker</code>,You can think of it as <code>List&lt;Invoker&gt;</code>,But unlike <code>List</code>,its value  can be dynamically changing.such as registry push changes</li>\n<li>The <code>Cluster</code> disguises multiple<code>Invoker</code> in <code>Directory</code> as a<code>Invoker</code>,The upper transparent, masquerade process contains fault-tolerant logic, call failed, try another</li>\n<li>The <code>Router</code> is responsible for selecting subsets according to routing rules from multiple <code>Invoker</code>s, such as read-write separation, application isolation, etc.</li>\n<li><code>LoadBalance</code> is responsible for selecting a specific one from multiple<code>Invoker</code> for this call. The selection process includes the load balancing algorithm. If the call fails, it needs to be re-selected</li>\n</ul>\n<h2>Cluster fault-tolerant mode</h2>\n<p>You can also customize the cluster fault tolerance strategy, see <a href=\"../../dev/impls/cluster.md\">Cluster extension</a> for more details.</p>\n<h2>Failover Cluster</h2>\n<p>Failure automatically switch, when there is failure, retry the other server (default). Usually used for read operations, but retries can result in longer delays. The times of retries can be set via <code>retries =2</code> (excluding the first time).</p>\n<p>The times of retries is configured as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<h3>Failfast Cluster</h3>\n<p>Fast failure, only made a call, failure immediately error. Usually used for non-idempotent write operations, such as adding records</p>\n<h3>Failsafe Cluster</h3>\n<p>Failure of security, anomalies, directly ignored. Usually used to write audit logs and other operations.</p>\n<h3>Failback Cluster</h3>\n<p>Failure automatically restored, failed to record the background request, regular retransmission. Usually used for message notification operations.</p>\n<h3>Forking Cluster</h3>\n<p>Multiple servers are invoked in parallel, returning as soon as one succeeds. Usually used for real-time demanding read operations, but need to waste more service resources. The maximum number of parallelism can be set with <code>forks=2</code>.</p>\n<h3>Broadcast Cluster</h3>\n<p>Calling all providers broadcast, one by one call, any error is reported (<code>2.1.0+</code>). It is usually used to notify all providers to update local resource information such as caches or logs.</p>\n<h2>Cluster mode configuration</h2>\n<p>Follow the example below to configure cluster mode on service providers and consumers</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n<p>OR</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/fault-tolerent-strategy.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/generic-reference.json b/en-us/docs/user/demos/generic-reference.json
index 0ccf686b..4d73e9a4 100644
--- a/en-us/docs/user/demos/generic-reference.json
+++ b/en-us/docs/user/demos/generic-reference.json
@@ -1,4 +1,6 @@
 {
   "filename": "generic-reference.md",
-  "__html": "<h1>Generic Reference</h1>\n<p>Generic invocation is mainly used when the client does not have API interface or model class,  all POJOs in parameters and return values are represented by <code>Map</code>.Commonly used for framework integration such as: implementing a common service testing framework, all service implementations can be invoked via <code>GenericService</code>.</p>\n<h2>Use generic invocation via Spring</h2>\n<p>Declared in the Spring configuration file <code>generic =&quot; true &quot;</code>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">generic</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>In Java code, get <code>barService</code> and start generic invocation:</p>\n<pre><code class=\"language-java\">GenericService barService = (GenericService) applicationContext.getBean(<span class=\"hljs-string\">\"barService\"</span>);\nObject result = barService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] { <span class=\"hljs-string\">\"java.lang.String\"</span> }, <span class=\"hljs-keyword\">new</span> Object[] { <span class=\"hljs-string\">\"World\"</span> });\n</code></pre>\n<h2>Use generic invocation via API</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.service.GenericService;\n...\n\n<span class=\"hljs-comment\">// reference remote service</span>\n<span class=\"hljs-comment\">// The instance is very heavy, which encapsulates all the registration center and service provider connection, please cache</span>\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type service interface name</span>\nreference.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n<span class=\"hljs-comment\">// declared as generic service</span>\nreference.setGeneric(<span class=\"hljs-keyword\">true</span>);  \n\n<span class=\"hljs-comment\">// service stub type is also the com.alibaba.dubbo.rpc.service.GenericService</span>\nGenericService genericService = reference.get();\n\n<span class=\"hljs-comment\">// basic types and Date, List, Map, etc. do not need conversion, direct use them</span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"java.lang.String\"</span>}, <span class=\"hljs-keyword\">new</span> Object[] {<span class=\"hljs-string\">\"world\"</span>});\n\n<span class=\"hljs-comment\">// map POJO parameters, if the return value is POJO will automatically turn into map</span>\nMap&lt;String, Object&gt; person = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;();\nperson.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>);\nperson.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>);\n<span class=\"hljs-comment\">// if the return value is POJO will automatically turn into map</span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"findPerson\"</span>, <span class=\"hljs-keyword\">new</span> String[]\n{<span class=\"hljs-string\">\"com.xxx.Person\"</span>}, <span class=\"hljs-keyword\">new</span> Object[]{person});\n\n...\n</code></pre>\n<h2>Further explanation of generalized types</h2>\n<p>Consider POJO like this:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PersonImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Person</span> </span>{\n    <span class=\"hljs-keyword\">private</span> String name;\n    <span class=\"hljs-keyword\">private</span> String password;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getPassword</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> password;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setPassword</span><span class=\"hljs-params\">(String password)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.password = password;\n    }\n}\n</code></pre>\n<p>The POJO data:</p>\n<pre><code class=\"language-java\">Person person = <span class=\"hljs-keyword\">new</span> PersonImpl();\nperson.setName(<span class=\"hljs-string\">\"xxx\"</span>);\nperson.setPassword(<span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n<p>Data represented by <code>Map</code>:</p>\n<pre><code class=\"language-java\">Map&lt;String, Object&gt; map = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;();\n<span class=\"hljs-comment\">// Note: If the parameter type is an interface, or List lost the generic class, you can specify the type of the class attribute</span>\nmap.put(<span class=\"hljs-string\">\"class\"</span>, <span class=\"hljs-string\">\"com.xxx.PersonImpl\"</span>);\nmap.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>);\nmap.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n"
+  "__html": "<h1>Generic Reference</h1>\n<p>Generic invocation is mainly used when the client does not have API interface or model class,  all POJOs in parameters and return values are represented by <code>Map</code>.Commonly used for framework integration such as: implementing a common service testing framework, all service implementations can be invoked via <code>GenericService</code>.</p>\n<h2>Use generic invocation via Spring</h2>\n<p>Declared in the Spring configuration file <code>generic =&quot; true &quot;</code>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">generic</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>In Java code, get <code>barService</code> and start generic invocation:</p>\n<pre><code class=\"language-java\">GenericService barService = (GenericService) applicationContext.getBean(<span class=\"hljs-string\">\"barService\"</span>);\nObject result = barService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] { <span class=\"hljs-string\">\"java.lang.String\"</span> }, <span class=\"hljs-keyword\">new</span> Object[] { <span class=\"hljs-string\">\"World\"</span> });\n</code></pre>\n<h2>Use generic invocation via API</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.service.GenericService;\n...\n\n<span class=\"hljs-comment\">// reference remote service</span>\n<span class=\"hljs-comment\">// The instance is very heavy, which encapsulates all the registration center and service provider connection, please cache</span>\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type service interface name</span>\nreference.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n<span class=\"hljs-comment\">// declared as generic service</span>\nreference.setGeneric(<span class=\"hljs-keyword\">true</span>);  \n\n<span class=\"hljs-comment\">// service stub type is also the com.alibaba.dubbo.rpc.service.GenericService</span>\nGenericService genericService = reference.get();\n\n<span class=\"hljs-comment\">// basic types and Date, List, Map, etc. do not need conversion, direct use them</span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"java.lang.String\"</span>}, <span class=\"hljs-keyword\">new</span> Object[] {<span class=\"hljs-string\">\"world\"</span>});\n\n<span class=\"hljs-comment\">// map POJO parameters, if the return value is POJO will automatically turn into map</span>\nMap&lt;String, Object&gt; person = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;();\nperson.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>);\nperson.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>);\n<span class=\"hljs-comment\">// if the return value is POJO will automatically turn into map</span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"findPerson\"</span>, <span class=\"hljs-keyword\">new</span> String[]\n{<span class=\"hljs-string\">\"com.xxx.Person\"</span>}, <span class=\"hljs-keyword\">new</span> Object[]{person});\n\n...\n</code></pre>\n<h2>Further explanation of generalized types</h2>\n<p>Consider POJO like this:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PersonImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Person</span> </span>{\n    <span class=\"hljs-keyword\">private</span> String name;\n    <span class=\"hljs-keyword\">private</span> String password;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getPassword</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> password;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setPassword</span><span class=\"hljs-params\">(String password)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.password = password;\n    }\n}\n</code></pre>\n<p>The POJO data:</p>\n<pre><code class=\"language-java\">Person person = <span class=\"hljs-keyword\">new</span> PersonImpl();\nperson.setName(<span class=\"hljs-string\">\"xxx\"</span>);\nperson.setPassword(<span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n<p>Data represented by <code>Map</code>:</p>\n<pre><code class=\"language-java\">Map&lt;String, Object&gt; map = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;();\n<span class=\"hljs-comment\">// Note: If the parameter type is an interface, or List lost the generic class, you can specify the type of the class attribute</span>\nmap.put(<span class=\"hljs-string\">\"class\"</span>, <span class=\"hljs-string\">\"com.xxx.PersonImpl\"</span>);\nmap.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>);\nmap.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/generic-reference.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/generic-service.json b/en-us/docs/user/demos/generic-service.json
index 6ac90150..bfbd1bb7 100644
--- a/en-us/docs/user/demos/generic-service.json
+++ b/en-us/docs/user/demos/generic-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "generic-service.md",
-  "__html": "<h1>Generic Service</h1>\n<p>The implementation of the generic interface is mainly used when there is no API interface and model class on the server side. All POJOs in the parameters and return values are represented by the Map and are usually used for framework integration. For example, to implement a universal remote service Mock framework, handle all service requests by implementing the GenericService interface.</p>\n<p>In Java code, implement <code>GenericService</code> interface:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MyGenericService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GenericService</span> </span>{\n\n    <span class=\"hljs-keyword\">public</span> Object $invoke(String methodName, String[] parameterTypes, Object[] args) <span class=\"hljs-keyword\">throws</span> GenericException {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"sayHello\"</span>.equals(methodName)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Welcome \"</span> + args[<span class=\"hljs-number\">0</span>];\n        }\n    }\n}\n</code></pre>\n<h2>Export generic implements via Spring</h2>\n<p>Declared in the Spring configuration file:</p>\n<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\">\"genericService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.foo.MyGenericService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"genericService\"</span> /&gt;</span>\n</code></pre>\n<h2>Export generic implements via API</h2>\n<pre><code class=\"language-java\">...\n<span class=\"hljs-comment\">// use com.alibaba.dubbo.rpc.service.GenericService can replace all implements</span>\nGenericService xxxService = <span class=\"hljs-keyword\">new</span> XxxGenericService();\n\n<span class=\"hljs-comment\">// The instance is very heavy, which encapsulates all the registration center and service provider connection, please cache</span>\nServiceConfig&lt;GenericService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type service interface name</span>\nservice.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n<span class=\"hljs-comment\">// point to a generic serivce instance</span>\nservice.setRef(xxxService);\n\n<span class=\"hljs-comment\">// export service to registration center</span>\nservice.export();\n</code></pre>\n"
+  "__html": "<h1>Generic Service</h1>\n<p>The implementation of the generic interface is mainly used when there is no API interface and model class on the server side. All POJOs in the parameters and return values are represented by the Map and are usually used for framework integration. For example, to implement a universal remote service Mock framework, handle all service requests by implementing the GenericService interface.</p>\n<p>In Java code, implement <code>GenericService</code> interface:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MyGenericService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GenericService</span> </span>{\n\n    <span class=\"hljs-keyword\">public</span> Object $invoke(String methodName, String[] parameterTypes, Object[] args) <span class=\"hljs-keyword\">throws</span> GenericException {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"sayHello\"</span>.equals(methodName)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Welcome \"</span> + args[<span class=\"hljs-number\">0</span>];\n        }\n    }\n}\n</code></pre>\n<h2>Export generic implements via Spring</h2>\n<p>Declared in the Spring configuration file:</p>\n<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\">\"genericService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.foo.MyGenericService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"genericService\"</span> /&gt;</span>\n</code></pre>\n<h2>Export generic implements via API</h2>\n<pre><code class=\"language-java\">...\n<span class=\"hljs-comment\">// use com.alibaba.dubbo.rpc.service.GenericService can replace all implements</span>\nGenericService xxxService = <span class=\"hljs-keyword\">new</span> XxxGenericService();\n\n<span class=\"hljs-comment\">// The instance is very heavy, which encapsulates all the registration center and service provider connection, please cache</span>\nServiceConfig&lt;GenericService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// weak type service interface name</span>\nservice.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n<span class=\"hljs-comment\">// point to a generic serivce instance</span>\nservice.setRef(xxxService);\n\n<span class=\"hljs-comment\">// export service to registration center</span>\nservice.export();\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/generic-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/graceful-shutdown.json b/en-us/docs/user/demos/graceful-shutdown.json
index 16253ec1..e2554fe5 100644
--- a/en-us/docs/user/demos/graceful-shutdown.json
+++ b/en-us/docs/user/demos/graceful-shutdown.json
@@ -1,4 +1,6 @@
 {
   "filename": "graceful-shutdown.md",
-  "__html": "<h1>Graceful Shutdown</h1>\n<p>Dubbo is graceful shutdown through the <code>ShutdownHook</code> of the JDK, so graceful shutdowns are not performed if you force shutdown the command, such as <code>kill -9 PID</code>, and will only be executed if <code>kill PID</code> is passed.</p>\n<h2>Howto</h2>\n<h3>Service provider</h3>\n<ul>\n<li>When stop, first marked as not receiving new requests, the new request directly return the error, so that the client retries other machines.</li>\n<li>Then check thread pool thread is running, if any, waiting for all threads to complete execution, unless overtime, then forced to close.</li>\n</ul>\n<h3>Service consumer</h3>\n<ul>\n<li>When stop, No longer initiate a new request, all request on the client that got an error.</li>\n<li>Then check the request has not returned the response, waiting for the response to return, unless overtime, then forced to close.</li>\n</ul>\n<h2>Configuration shutdown wait time</h2>\n<p>Set graceful shutdown timeout, the default timeout is 10 seconds, if the overtime is forced to close.</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.service.shutdown.wait</span>=<span class=\"hljs-string\">15000</span>\n</code></pre>\n<p>If ShutdownHook does not take effect, you can call it yourself, <strong>in tomcat, it is recommended by extending the ContextListener and call the following code for graceful shutdown</strong>:</p>\n<pre><code class=\"language-java\">ProtocolConfig.destroyAll();\n</code></pre>\n"
+  "__html": "<h1>Graceful Shutdown</h1>\n<p>Dubbo is graceful shutdown through the <code>ShutdownHook</code> of the JDK, so graceful shutdowns are not performed if you force shutdown the command, such as <code>kill -9 PID</code>, and will only be executed if <code>kill PID</code> is passed.</p>\n<h2>Howto</h2>\n<h3>Service provider</h3>\n<ul>\n<li>When stop, first marked as not receiving new requests, the new request directly return the error, so that the client retries other machines.</li>\n<li>Then check thread pool thread is running, if any, waiting for all threads to complete execution, unless overtime, then forced to close.</li>\n</ul>\n<h3>Service consumer</h3>\n<ul>\n<li>When stop, No longer initiate a new request, all request on the client that got an error.</li>\n<li>Then check the request has not returned the response, waiting for the response to return, unless overtime, then forced to close.</li>\n</ul>\n<h2>Configuration shutdown wait time</h2>\n<p>Set graceful shutdown timeout, the default timeout is 10 seconds, if the overtime is forced to close.</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.service.shutdown.wait</span>=<span class=\"hljs-string\">15000</span>\n</code></pre>\n<p>If ShutdownHook does not take effect, you can call it yourself, <strong>in tomcat, it is recommended by extending the ContextListener and call the following code for graceful shutdown</strong>:</p>\n<pre><code class=\"language-java\">ProtocolConfig.destroyAll();\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/graceful-shutdown.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/group-merger.json b/en-us/docs/user/demos/group-merger.json
index 189100ef..1f593da2 100644
--- a/en-us/docs/user/demos/group-merger.json
+++ b/en-us/docs/user/demos/group-merger.json
@@ -1,4 +1,6 @@
 {
   "filename": "group-merger.md",
-  "__html": "<h1>Group Merger</h1>\n<p>According to the group to invoke server and return the merge result <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, such as the menu service, the same interface, but there are a variety of implementations, using group distinction, consumers call each group and get the results, the merger can merge the resules, so that you can achieve aggregation Menu Item.</p>\n<p>Related code can refer to <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge\">dubbo project example</a></p>\n<h2>Configuration</h2>\n<p>Merge all groups</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>Merge the specified group</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"aaa,bbb\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>The specified method to merge the results, other unspecified methods, will only call one group</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>The Specified a method does not merge the results, others merge the results</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Specify the merge strategy, the default according to the type of return value automatically match, if the same type has two mergers, you need to specify the name of the merger<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"mymerge\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Specify the merge method, it will call the return type's method for merging, the merging method parameter type must be the return type</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\".addAll\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>since <code>2.1.0</code> began to support <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>See also:<a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/demos/group-merger.html\">merger extensions</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Group Merger</h1>\n<p>According to the group to invoke server and return the merge result <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, such as the menu service, the same interface, but there are a variety of implementations, using group distinction, consumers call each group and get the results, the merger can merge the resules, so that you can achieve aggregation Menu Item.</p>\n<p>Related code can refer to <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge\">dubbo project example</a></p>\n<h2>Configuration</h2>\n<p>Merge all groups</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>Merge the specified group</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"aaa,bbb\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>The specified method to merge the results, other unspecified methods, will only call one group</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>The Specified a method does not merge the results, others merge the results</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Specify the merge strategy, the default according to the type of return value automatically match, if the same type has two mergers, you need to specify the name of the merger<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"mymerge\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>Specify the merge method, it will call the return type's method for merging, the merging method parameter type must be the return type</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\".addAll\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>since <code>2.1.0</code> began to support <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>See also:<a href=\"http://dubbo.apache.org/books/dubbo-user-book-en/demos/group-merger.html\">merger extensions</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/group-merger.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/hostname-binding.json b/en-us/docs/user/demos/hostname-binding.json
index 9608553d..4f74f927 100644
--- a/en-us/docs/user/demos/hostname-binding.json
+++ b/en-us/docs/user/demos/hostname-binding.json
@@ -1,4 +1,6 @@
 {
   "filename": "hostname-binding.md",
-  "__html": "<h1>Hostname Binding</h1>\n<h2>Lookup order</h2>\n<p>Default host IP lookup order:</p>\n<ul>\n<li>Get local address via <code>LocalHost.getLocalHost()</code>.</li>\n<li>If it is <code>127. *</code> loopback address, then scan the network for host IP</li>\n</ul>\n<h2>Host configuration</h2>\n<p>Registered address if it is not correct, such as the need to register public address, you can do this:</p>\n<ol>\n<li>\n<p>edit <code>/etc/hosts</code> : add machinename and public ip, such as:</p>\n<pre><code>test1 205.182.23.201\n</code></pre>\n</li>\n<li>\n<p>in <code>dubbo.xml</code> add host address configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">host</span>=<span class=\"hljs-string\">\"205.182.23.201\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>or config that in <code>dubbo.properties</code>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.host</span>=<span class=\"hljs-string\">205.182.23.201</span>\n</code></pre>\n</li>\n</ol>\n<h2>Port configuration</h2>\n<p>The default port and protocol:</p>\n<table>\n<thead>\n<tr>\n<th>Protocol</th>\n<th>Port</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo</td>\n<td>20880</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1099</td>\n</tr>\n<tr>\n<td>http</td>\n<td>80</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>80</td>\n</tr>\n<tr>\n<td>webservice</td>\n<td>80</td>\n</tr>\n<tr>\n<td>memcached</td>\n<td>11211</td>\n</tr>\n<tr>\n<td>redis</td>\n<td>6379</td>\n</tr>\n</tbody>\n</table>\n<p>You can configure the port as follows:</p>\n<ol>\n<li>\n<p>in <code>dubbo.xml</code> add port configuration:</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>or config that in <code>dubbo.properties</code>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.dubbo.port</span>=<span class=\"hljs-string\">20880</span>\n</code></pre>\n</li>\n</ol>\n"
+  "__html": "<h1>Hostname Binding</h1>\n<h2>Lookup order</h2>\n<p>Default host IP lookup order:</p>\n<ul>\n<li>Get local address via <code>LocalHost.getLocalHost()</code>.</li>\n<li>If it is <code>127. *</code> loopback address, then scan the network for host IP</li>\n</ul>\n<h2>Host configuration</h2>\n<p>Registered address if it is not correct, such as the need to register public address, you can do this:</p>\n<ol>\n<li>\n<p>edit <code>/etc/hosts</code> : add machinename and public ip, such as:</p>\n<pre><code>test1 205.182.23.201\n</code></pre>\n</li>\n<li>\n<p>in <code>dubbo.xml</code> add host address configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">host</span>=<span class=\"hljs-string\">\"205.182.23.201\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>or config that in <code>dubbo.properties</code>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.host</span>=<span class=\"hljs-string\">205.182.23.201</span>\n</code></pre>\n</li>\n</ol>\n<h2>Port configuration</h2>\n<p>The default port and protocol:</p>\n<table>\n<thead>\n<tr>\n<th>Protocol</th>\n<th>Port</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo</td>\n<td>20880</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1099</td>\n</tr>\n<tr>\n<td>http</td>\n<td>80</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>80</td>\n</tr>\n<tr>\n<td>webservice</td>\n<td>80</td>\n</tr>\n<tr>\n<td>memcached</td>\n<td>11211</td>\n</tr>\n<tr>\n<td>redis</td>\n<td>6379</td>\n</tr>\n</tbody>\n</table>\n<p>You can configure the port as follows:</p>\n<ol>\n<li>\n<p>in <code>dubbo.xml</code> add port configuration:</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>or config that in <code>dubbo.properties</code>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.dubbo.port</span>=<span class=\"hljs-string\">20880</span>\n</code></pre>\n</li>\n</ol>\n",
+  "link": "/en-us/docs/user/demos/hostname-binding.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/index.json b/en-us/docs/user/demos/index.json
index ab115dcf..21a2911a 100644
--- a/en-us/docs/user/demos/index.json
+++ b/en-us/docs/user/demos/index.json
@@ -1,4 +1,6 @@
 {
   "filename": "index.md",
-  "__html": "<h1>Example</h1>\n"
+  "__html": "<h1>Example</h1>\n",
+  "link": "/en-us/docs/user/demos/index.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/introduction.json b/en-us/docs/user/demos/introduction.json
index 87fcbad7..62fb593b 100644
--- a/en-us/docs/user/demos/introduction.json
+++ b/en-us/docs/user/demos/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<blockquote>\n<p><img src=\"../sources/images/check.gif\" alt=\"warning\">To complete run, please see:<a href=\"quickstart.md\">Quickstart</a>, here just lists the configuration of various scenarios\n<img src=\"../sources/images/check.gif\" alt=\"warning\">The following examples are all based on Spring configuration:<a href=\"../configuration/xml.md\">Xml configuration</a> for reference, if you do not want to use Spring, but want to be use it via the directly API, please see:<a href=\"../configuration/api.md\">API configuration</a></p>\n</blockquote>\n"
+  "__html": "<blockquote>\n<p><img src=\"../sources/images/check.gif\" alt=\"warning\">To complete run, please see:<a href=\"quickstart.md\">Quickstart</a>, here just lists the configuration of various scenarios\n<img src=\"../sources/images/check.gif\" alt=\"warning\">The following examples are all based on Spring configuration:<a href=\"../configuration/xml.md\">Xml configuration</a> for reference, if you do not want to use Spring, but want to be use it via the directly API, please see:<a href=\"../configuration/api.md\">API configuration</a></p>\n</blockquote>\n",
+  "link": "/en-us/docs/user/demos/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/lazy-connect.json b/en-us/docs/user/demos/lazy-connect.json
index 14b09c82..d73e4fe5 100644
--- a/en-us/docs/user/demos/lazy-connect.json
+++ b/en-us/docs/user/demos/lazy-connect.json
@@ -1,4 +1,6 @@
 {
   "filename": "lazy-connect.md",
-  "__html": "<h1>Lazy Connect</h1>\n<p>Lazy connect can reduce the number of keep-alive connections. When a call is initiated, create a keep-alive connection.<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<pre><code class=\"language-xml\"><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\">lazy</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Note: This configuration takes effect only for dubbo protocols that use keep-alive connections. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Lazy Connect</h1>\n<p>Lazy connect can reduce the number of keep-alive connections. When a call is initiated, create a keep-alive connection.<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<pre><code class=\"language-xml\"><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\">lazy</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Note: This configuration takes effect only for dubbo protocols that use keep-alive connections. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/lazy-connect.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/loadbalance.json b/en-us/docs/user/demos/loadbalance.json
index 11ef4920..b5762392 100644
--- a/en-us/docs/user/demos/loadbalance.json
+++ b/en-us/docs/user/demos/loadbalance.json
@@ -1,4 +1,6 @@
 {
   "filename": "loadbalance.md",
-  "__html": "<h1>LoadBalance</h1>\n<p>Dubbo offers a number of balancing strategies for cluster load balancing, which defaults to <code>random</code>.</p>\n<p>You can extend the load balancing strategy by yourself, see: <a href=\"../../dev/impls/load-balance.md\">LoadBalance extension</a></p>\n<h2>LoadBalance strategy</h2>\n<h3>Random LoadBalance</h3>\n<ul>\n<li><strong>Ramdom</strong>, set random probabilities by weight.</li>\n<li>The probability of collisions on one section is high, but the larger the amount of calls, the more uniform the distribution. And when use weight based on probability the distribution turns out to be uniform, which also helps to dynamically adjust the provider weights.</li>\n</ul>\n<h3>RoundRobin LoadBalance</h3>\n<ul>\n<li><strong>RoundRobin</strong>, use the weight's common advisor to determine round robin ratio.</li>\n<li>Traffic flow to slower providers may cause requests piled up, e.g., if there's a provider processing requests in a very slow speed, but it's still alive, which means it can receive request as normal. According to RoundRobin policy, consumers will continuously send requests to this provider on predetermined pace, have no aware of the provider's bad status. Finally, we will get many requests stuck on this unhealthy provider.</li>\n</ul>\n<h3>LeastActive LoadBalance</h3>\n<ul>\n<li><strong>LeastActive</strong>, a random mechanism based on actives, <code>actives</code> means the num of requests a consumer have sent but not return yet。</li>\n<li>Slower providers will receive fewer requests, cause slower provider have higher <code>actives</code>.</li>\n</ul>\n<h3>ConsistentHash LoadBalance</h3>\n<ul>\n<li><strong>ConsistentHash</strong>, the same parameters of the request is always sent to the same provider.</li>\n<li>When a provider fails, the original request to the provider, based on the virtual node algorithm, averages to other providers, does not cause drastic changes.</li>\n<li>Algorithm reference:<a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></li>\n<li>By default only the first parameter Hash, if you want to modify, please configure <code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;</code></li>\n<li>By default 160 virtual nodes, if you want to modify, please configure <code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;</code></li>\n</ul>\n<p>See the algorithm at <a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></p>\n<h2>Configuration</h2>\n<h3>Server service level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>Client service level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>Server method level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h3>Client method level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>LoadBalance</h1>\n<p>Dubbo offers a number of balancing strategies for cluster load balancing, which defaults to <code>random</code>.</p>\n<p>You can extend the load balancing strategy by yourself, see: <a href=\"../../dev/impls/load-balance.md\">LoadBalance extension</a></p>\n<h2>LoadBalance strategy</h2>\n<h3>Random LoadBalance</h3>\n<ul>\n<li><strong>Ramdom</strong>, set random probabilities by weight.</li>\n<li>The probability of collisions on one section is high, but the larger the amount of calls, the more uniform the distribution. And when use weight based on probability the distribution turns out to be uniform, which also helps to dynamically adjust the provider weights.</li>\n</ul>\n<h3>RoundRobin LoadBalance</h3>\n<ul>\n<li><strong>RoundRobin</strong>, use the weight's common advisor to determine round robin ratio.</li>\n<li>Traffic flow to slower providers may cause requests piled up, e.g., if there's a provider processing requests in a very slow speed, but it's still alive, which means it can receive request as normal. According to RoundRobin policy, consumers will continuously send requests to this provider on predetermined pace, have no aware of the provider's bad status. Finally, we will get many requests stuck on this unhealthy provider.</li>\n</ul>\n<h3>LeastActive LoadBalance</h3>\n<ul>\n<li><strong>LeastActive</strong>, a random mechanism based on actives, <code>actives</code> means the num of requests a consumer have sent but not return yet。</li>\n<li>Slower providers will receive fewer requests, cause slower provider have higher <code>actives</code>.</li>\n</ul>\n<h3>ConsistentHash LoadBalance</h3>\n<ul>\n<li><strong>ConsistentHash</strong>, the same parameters of the request is always sent to the same provider.</li>\n<li>When a provider fails, the original request to the provider, based on the virtual node algorithm, averages to other providers, does not cause drastic changes.</li>\n<li>Algorithm reference:<a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></li>\n<li>By default only the first parameter Hash, if you want to modify, please configure <code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;</code></li>\n<li>By default 160 virtual nodes, if you want to modify, please configure <code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;</code></li>\n</ul>\n<p>See the algorithm at <a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></p>\n<h2>Configuration</h2>\n<h3>Server service level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>Client service level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>Server method level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h3>Client method level</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/loadbalance.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/local-call.json b/en-us/docs/user/demos/local-call.json
index 8704a1bb..b14f1d73 100644
--- a/en-us/docs/user/demos/local-call.json
+++ b/en-us/docs/user/demos/local-call.json
@@ -1,4 +1,6 @@
 {
   "filename": "local-call.md",
-  "__html": "<h1>Local call</h1>\n<p>The local call uses the <code>injvm</code> protocol, a pseudo-protocol that does not turn on the port, does not initiate remote calls, is directly associated within the JVM, but executes the Dubbo Filter chain.</p>\n<h2>Configuration</h2>\n<p>Configure <code>injvm</code> protocol</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>Configure default provider</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>Configure default service</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>Use injvm first</p>\n<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\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<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>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>Note: Both service provider and service references need to declare <code>injvm=&quot;true&quot;</code></p>\n<h2>Automatically exposed, local service references</h2>\n<p><code>2.2.0</code> or later, each service is exposed locally by default. When referring to the service, the local service is referenced by default. If you want to reference a remote service, you can use the following configuration to force a reference to a remote service.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">scope</span>=<span class=\"hljs-string\">\"remote\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Local call</h1>\n<p>The local call uses the <code>injvm</code> protocol, a pseudo-protocol that does not turn on the port, does not initiate remote calls, is directly associated within the JVM, but executes the Dubbo Filter chain.</p>\n<h2>Configuration</h2>\n<p>Configure <code>injvm</code> protocol</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>Configure default provider</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>Configure default service</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>Use injvm first</p>\n<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\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<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>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>Note: Both service provider and service references need to declare <code>injvm=&quot;true&quot;</code></p>\n<h2>Automatically exposed, local service references</h2>\n<p><code>2.2.0</code> or later, each service is exposed locally by default. When referring to the service, the local service is referenced by default. If you want to reference a remote service, you can use the following configuration to force a reference to a remote service.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">scope</span>=<span class=\"hljs-string\">\"remote\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/local-call.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/local-mock.json b/en-us/docs/user/demos/local-mock.json
index 8f62100c..760cc465 100644
--- a/en-us/docs/user/demos/local-mock.json
+++ b/en-us/docs/user/demos/local-mock.json
@@ -1,4 +1,6 @@
 {
   "filename": "local-mock.md",
-  "__html": "<h1>Local mock</h1>\n<p>Local mock <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is usually used for service downgrade, such as a verification service, the client does not throw an exception when the service provider hangs up all the time, but returns the authorization failed through the Mock data.</p>\n<p>Configured in the spring configuration file as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"com.foo.BarServiceMock\"</span> /&gt;</span>\n</code></pre>\n<p>Mock implementation in the project <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceMock</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// You can return mock data, this method is only executed when an RpcException is thrown.</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"mock data\"</span>;\n    }\n}\n</code></pre>\n<p>If the service consumer often needs <code>try-catch</code> to catch exceptions, such as:</p>\n<pre><code class=\"language-java\">Offer offer = <span class=\"hljs-keyword\">null</span>;\n<span class=\"hljs-keyword\">try</span> {\n    offer = offerService.findOffer(offerId);\n} <span class=\"hljs-keyword\">catch</span> (RpcException e) {\n   logger.error(e);\n}\n</code></pre>\n<p>Consider changing to Mock implementation and return null in Mock implementation. If you just want to simply ignore the exception, <code>2.0.11</code> version or later version is available:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"return null\"</span> /&gt;</span>\n</code></pre>\n<h2>Advanced Usage</h2>\n<h3>return</h3>\n<p><code>return</code> can be used to return an object's string representation as the mocked return value. The legal values incude:</p>\n<ul>\n<li><em>empty</em>: empty value, default value for primary type, and empty value for collections.</li>\n<li><em>null</em>: <code>null</code></li>\n<li><em>true</em>: <code>true</code></li>\n<li><em>false</em>: <code>false</code></li>\n<li><em>JSON format</em>: a mocked return value in JSON format, will be deserialized at runtime</li>\n</ul>\n<h3>throw</h3>\n<p><code>throw</code> can be used to throw an exception object as the mocked return value.</p>\n<p>Throw a default RPCException when invocation gets wrong:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw\"</span> /&gt;</span>\n</code></pre>\n<p>Throw a specified exception when invocation gets wrong:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>force &amp; fail</h3>\n<p>Since <code>2.6.6</code> and above, it is possible to use <code>fail:</code> and <code>force:</code> in Spring's XML configuration to define mock behavior. <code>force:</code> means the mocked value is forced to use no matter the invocation gets wrong or not, in fact, the remote invocation will not happen at all. <code>fail:</code> is consistent with the default behavior, that is, mock happens only when invocation gets wrong. Futhermore, both <code>force:</code> and <code>fail:</code> can be used together with <code>throw</code> or <code>return</code> to define the mock behavior further.</p>\n<p>Force to return the specified value:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:return fake\"</span> /&gt;</span>\n</code></pre>\n<p>Force to throw the specified exception:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>Specify Mock For Particular Method Only</h3>\n<p>Mock behavior can be specified on the method level. Assume there are a couple of methods on <code>com.foo.BarService</code>, we can specify the mock behavior for one particular method only, say <code>sayHello()</code>. In the example below, &quot;fake&quot; is forced to return everytime when <code>sayHello()</code> is called, but other methods will not be effected:</p>\n<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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"sayHello.mock\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"force:return fake\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Mock is a subset of the Stub. If you use Stub, you may need to rely on the RpcException class. If you use Mock, you do not need to rely on RpcException, when throwing RpcException, it will callback Mock implementation class. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>BarServiceMock implements BarService and has a no-argument constructor. <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Local mock</h1>\n<p>Local mock <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is usually used for service downgrade, such as a verification service, the client does not throw an exception when the service provider hangs up all the time, but returns the authorization failed through the Mock data.</p>\n<p>Configured in the spring configuration file as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"com.foo.BarServiceMock\"</span> /&gt;</span>\n</code></pre>\n<p>Mock implementation in the project <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceMock</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// You can return mock data, this method is only executed when an RpcException is thrown.</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"mock data\"</span>;\n    }\n}\n</code></pre>\n<p>If the service consumer often needs <code>try-catch</code> to catch exceptions, such as:</p>\n<pre><code class=\"language-java\">Offer offer = <span class=\"hljs-keyword\">null</span>;\n<span class=\"hljs-keyword\">try</span> {\n    offer = offerService.findOffer(offerId);\n} <span class=\"hljs-keyword\">catch</span> (RpcException e) {\n   logger.error(e);\n}\n</code></pre>\n<p>Consider changing to Mock implementation and return null in Mock implementation. If you just want to simply ignore the exception, <code>2.0.11</code> version or later version is available:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"return null\"</span> /&gt;</span>\n</code></pre>\n<h2>Advanced Usage</h2>\n<h3>return</h3>\n<p><code>return</code> can be used to return an object's string representation as the mocked return value. The legal values incude:</p>\n<ul>\n<li><em>empty</em>: empty value, default value for primary type, and empty value for collections.</li>\n<li><em>null</em>: <code>null</code></li>\n<li><em>true</em>: <code>true</code></li>\n<li><em>false</em>: <code>false</code></li>\n<li><em>JSON format</em>: a mocked return value in JSON format, will be deserialized at runtime</li>\n</ul>\n<h3>throw</h3>\n<p><code>throw</code> can be used to throw an exception object as the mocked return value.</p>\n<p>Throw a default RPCException when invocation gets wrong:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw\"</span> /&gt;</span>\n</code></pre>\n<p>Throw a specified exception when invocation gets wrong:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>force &amp; fail</h3>\n<p>Since <code>2.6.6</code> and above, it is possible to use <code>fail:</code> and <code>force:</code> in Spring's XML configuration to define mock behavior. <code>force:</code> means the mocked value is forced to use no matter the invocation gets wrong or not, in fact, the remote invocation will not happen at all. <code>fail:</code> is consistent with the default behavior, that is, mock happens only when invocation gets wrong. Futhermore, both <code>force:</code> and <code>fail:</code> can be used together with <code>throw</code> or <code>return</code> to define the mock behavior further.</p>\n<p>Force to return the specified value:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:return fake\"</span> /&gt;</span>\n</code></pre>\n<p>Force to throw the specified exception:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>Specify Mock For Particular Method Only</h3>\n<p>Mock behavior can be specified on the method level. Assume there are a couple of methods on <code>com.foo.BarService</code>, we can specify the mock behavior for one particular method only, say <code>sayHello()</code>. In the example below, &quot;fake&quot; is forced to return everytime when <code>sayHello()</code> is called, but other methods will not be effected:</p>\n<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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"sayHello.mock\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"force:return fake\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Mock is a subset of the Stub. If you use Stub, you may need to rely on the RpcException class. If you use Mock, you do not need to rely on RpcException, when throwing RpcException, it will callback Mock implementation class. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>BarServiceMock implements BarService and has a no-argument constructor. <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/local-mock.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/local-stub.json b/en-us/docs/user/demos/local-stub.json
index 5f08fc87..735e29f7 100644
--- a/en-us/docs/user/demos/local-stub.json
+++ b/en-us/docs/user/demos/local-stub.json
@@ -1,4 +1,6 @@
 {
   "filename": "local-stub.md",
-  "__html": "<h1>Local stub</h1>\n<p>When using rpc, the client usually only the interface, but sometimes the client also want to perform part of the logic in the client. For example: do ThreadLocal cache, verify parameters, return mock data when call fails., etc.</p>\n<p>To solve this problem, you can configure the stub in the API, so that when the client generates the proxy instance, it passes the proxy to the <code>Stub</code> via the constructor <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, and then you can implement your logic in the stub implementation code.</p>\n<p><img src=\"../sources/images/stub.jpg\" alt=\"/user-guide/images/stub.jpg\"></p>\n<p>Configured in the spring configuration file as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"com.foo.BarServiceStub\"</span> /&gt;</span>\n</code></pre>\n<p>Provide Stub implementation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceStub</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> BarService barService;\n\n    <span class=\"hljs-comment\">// The real remote proxy object is passed in through the constructor</span>\n    <span class=\"hljs-keyword\">public</span> (BarService barService) {\n        <span class=\"hljs-keyword\">this</span>.barService = barService;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// The following code is executed on the client. You can do local ThreadLocal caching on the client side, or verify parameters, etc.</span>\n        <span class=\"hljs-keyword\">try</span> {\n            <span class=\"hljs-keyword\">return</span> barService.sayHello(name);\n        } <span class=\"hljs-keyword\">catch</span> (Exception e) {\n            <span class=\"hljs-comment\">// You can return the mock data.</span>\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"MockData\"</span>;\n        }\n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>The Stub must have a constructor that can pass in the proxy. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>BarServiceStub implements BarService ,it has a constructor passed in the remote BarService instance <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Local stub</h1>\n<p>When using rpc, the client usually only the interface, but sometimes the client also want to perform part of the logic in the client. For example: do ThreadLocal cache, verify parameters, return mock data when call fails., etc.</p>\n<p>To solve this problem, you can configure the stub in the API, so that when the client generates the proxy instance, it passes the proxy to the <code>Stub</code> via the constructor <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, and then you can implement your logic in the stub implementation code.</p>\n<p><img src=\"../sources/images/stub.jpg\" alt=\"/user-guide/images/stub.jpg\"></p>\n<p>Configured in the spring configuration file as follows:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"com.foo.BarServiceStub\"</span> /&gt;</span>\n</code></pre>\n<p>Provide Stub implementation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceStub</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> BarService barService;\n\n    <span class=\"hljs-comment\">// The real remote proxy object is passed in through the constructor</span>\n    <span class=\"hljs-keyword\">public</span> (BarService barService) {\n        <span class=\"hljs-keyword\">this</span>.barService = barService;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// The following code is executed on the client. You can do local ThreadLocal caching on the client side, or verify parameters, etc.</span>\n        <span class=\"hljs-keyword\">try</span> {\n            <span class=\"hljs-keyword\">return</span> barService.sayHello(name);\n        } <span class=\"hljs-keyword\">catch</span> (Exception e) {\n            <span class=\"hljs-comment\">// You can return the mock data.</span>\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"MockData\"</span>;\n        }\n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>The Stub must have a constructor that can pass in the proxy. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>BarServiceStub implements BarService ,it has a constructor passed in the remote BarService instance <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/local-stub.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/logger-strategy.json b/en-us/docs/user/demos/logger-strategy.json
index 99a7c8b3..bfaa4ce6 100644
--- a/en-us/docs/user/demos/logger-strategy.json
+++ b/en-us/docs/user/demos/logger-strategy.json
@@ -1,4 +1,6 @@
 {
   "filename": "logger-strategy.md",
-  "__html": "<h1>Logger adapter</h1>\n<p><code>2.2.1</code> or later, dubbo support log4j、slf4j、jcl、jdk adapters <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, you can also explicitly configure the log output policy in the following ways:</p>\n<ol start=\"0\">\n<li>\n<p>Command</p>\n<pre><code class=\"language-sh\">java -Ddubbo.application.logger=log4j\n</code></pre>\n</li>\n<li>\n<p>Configure in <code>dubbo.properties</code></p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.logger</span>=<span class=\"hljs-string\">log4j</span>\n</code></pre>\n</li>\n<li>\n<p>Configure in <code>dubbo.xml</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"log4j\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Custom Extensions<a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/logger-adapter.html\">logger-adapter</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Logger adapter</h1>\n<p><code>2.2.1</code> or later, dubbo support log4j、slf4j、jcl、jdk adapters <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>, you can also explicitly configure the log output policy in the following ways:</p>\n<ol start=\"0\">\n<li>\n<p>Command</p>\n<pre><code class=\"language-sh\">java -Ddubbo.application.logger=log4j\n</code></pre>\n</li>\n<li>\n<p>Configure in <code>dubbo.properties</code></p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.logger</span>=<span class=\"hljs-string\">log4j</span>\n</code></pre>\n</li>\n<li>\n<p>Configure in <code>dubbo.xml</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"log4j\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Custom Extensions<a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/logger-adapter.html\">logger-adapter</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/logger-strategy.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/multi-protocols.json b/en-us/docs/user/demos/multi-protocols.json
index cac6db8c..bf73dab6 100644
--- a/en-us/docs/user/demos/multi-protocols.json
+++ b/en-us/docs/user/demos/multi-protocols.json
@@ -1,4 +1,6 @@
 {
   "filename": "multi-protocols.md",
-  "__html": "<h1>Multiple protocols</h1>\n<p>Dubbo allows you to configure multiple protocols, support different protocols on different services, or support multiple protocols on the same service.</p>\n<h2>Every service export to one specific protocol separately</h2>\n<p>Different protocol performance is not the same. Such as big data should use short connection protocol, small data and concurrent should use long connection protocol.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- multiple protocols --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Use dubbo protocol to expose the service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Use rmi protocol to expose services --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>One service export to several protocols</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- multiple protocols--&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service exposes multiple protocols --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo,hessian\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Multiple protocols</h1>\n<p>Dubbo allows you to configure multiple protocols, support different protocols on different services, or support multiple protocols on the same service.</p>\n<h2>Every service export to one specific protocol separately</h2>\n<p>Different protocol performance is not the same. Such as big data should use short connection protocol, small data and concurrent should use long connection protocol.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- multiple protocols --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Use dubbo protocol to expose the service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Use rmi protocol to expose services --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>One service export to several protocols</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- multiple protocols--&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service exposes multiple protocols --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo,hessian\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/multi-protocols.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/multi-registry.json b/en-us/docs/user/demos/multi-registry.json
index fefd8942..a07fb593 100644
--- a/en-us/docs/user/demos/multi-registry.json
+++ b/en-us/docs/user/demos/multi-registry.json
@@ -1,4 +1,6 @@
 {
   "filename": "multi-registry.md",
-  "__html": "<h1>Multiple registries</h1>\n<p>Dubbo supports the same service to register multiple registries, or different services were registered to different registries, or even reference the same name service from different registries. In addition, the registry supports custom extensions <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h2>One service register to multiple registries</h2>\n<p>For example: Alibaba some services are not deployed in Qingdao, only deployed in Hangzhou. While other applications in Qingdao need to reference this service, you can register your services to both registries at the same time.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Multi registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hangzhouRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qingdaoRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.151:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service register to multiple registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"hangzhouRegistry,qingdaoRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>Different services register to different registries</h2>\n<p>For example: Some CRM services are specifically designed for international stations, and some services are specifically designed for Chinese stations.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Multi registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service register to Chinese station registry --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service register to international station registry --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>Reference services from multiple registries</h2>\n<p>For example: CRM needs to call the PC2 service of Chinese station and international station at the same time. PC2 is deployed in both Chinese station and international station. The interfaces and version numbers are the same, but the database used is different.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Multi registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Reference Chinese station service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Reference international station service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>When testing, the service needs to be temporarily register to two registries, which can use vertical signs to separate multiple different registry addresses:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- The vertical separation means that multiple registries are connected at the same time. Multiple cluster addresses of the same registry are separated by commas --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090|10.20.154.177:9010\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service reference --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>custom registry, see:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/registry.html\">registry extension</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Multiple registries</h1>\n<p>Dubbo supports the same service to register multiple registries, or different services were registered to different registries, or even reference the same name service from different registries. In addition, the registry supports custom extensions <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h2>One service register to multiple registries</h2>\n<p>For example: Alibaba some services are not deployed in Qingdao, only deployed in Hangzhou. While other applications in Qingdao need to reference this service, you can register your services to both registries at the same time.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Multi registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hangzhouRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qingdaoRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.151:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service register to multiple registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"hangzhouRegistry,qingdaoRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>Different services register to different registries</h2>\n<p>For example: Some CRM services are specifically designed for international stations, and some services are specifically designed for Chinese stations.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Multi registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service register to Chinese station registry --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Service register to international station registry --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>Reference services from multiple registries</h2>\n<p>For example: CRM needs to call the PC2 service of Chinese station and international station at the same time. PC2 is deployed in both Chinese station and international station. The interfaces and version numbers are the same, but the database used is different.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Multi registries --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Reference Chinese station service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- Reference international station service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>When testing, the service needs to be temporarily register to two registries, which can use vertical signs to separate multiple different registry addresses:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- The vertical separation means that multiple registries are connected at the same time. Multiple cluster addresses of the same registry are separated by commas --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090|10.20.154.177:9010\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service reference --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>custom registry, see:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/registry.html\">registry extension</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/multi-registry.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/multi-versions.json b/en-us/docs/user/demos/multi-versions.json
index 6b2ee649..9d0ddc77 100644
--- a/en-us/docs/user/demos/multi-versions.json
+++ b/en-us/docs/user/demos/multi-versions.json
@@ -1,4 +1,6 @@
 {
   "filename": "multi-versions.md",
-  "__html": "<h1>Multi versions</h1>\n<p>When an interface to achieve an incompatible upgrade, you can use the version number transition. Different versions of the services do not reference each other.</p>\n<p>You can follow the steps below for version migration:</p>\n<ol start=\"0\">\n<li>In the low pressure period, upgrade to half of the provider to the new version</li>\n<li>Then upgrade all consumers to the new version</li>\n<li>Then upgrade the remaining half providers to the new version</li>\n</ol>\n<p>Old version of the service provider configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>New version of the service provider configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>Old version of the service consumer configuration:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>New version of the service consumer configuration:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>If you do not need to distinguish between versions, can be configured as follows <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> or later support <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Multi versions</h1>\n<p>When an interface to achieve an incompatible upgrade, you can use the version number transition. Different versions of the services do not reference each other.</p>\n<p>You can follow the steps below for version migration:</p>\n<ol start=\"0\">\n<li>In the low pressure period, upgrade to half of the provider to the new version</li>\n<li>Then upgrade all consumers to the new version</li>\n<li>Then upgrade the remaining half providers to the new version</li>\n</ol>\n<p>Old version of the service provider configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>New version of the service provider configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>Old version of the service consumer configuration:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>New version of the service consumer configuration:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>If you do not need to distinguish between versions, can be configured as follows <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> or later support <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/multi-versions.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/netty4.json b/en-us/docs/user/demos/netty4.json
index 7257d2e4..d6e4d333 100644
--- a/en-us/docs/user/demos/netty4.json
+++ b/en-us/docs/user/demos/netty4.json
@@ -1,4 +1,6 @@
 {
   "filename": "netty4.md",
-  "__html": "<p>Add support for netty4 communication module in 2.5.6 version of dubbo, enabled as follows:</p>\n<p>provider:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>consumer:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n\n</code></pre>\n<blockquote>\n<p><strong>NOTES</strong></p>\n<ol>\n<li>If provider need to use different communication layer framework for different protocols , please configure multiple protocols separately.</li>\n<li>consumer configuration as follow:</li>\n</ol>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n</blockquote>\n<blockquote>\n<p>Next we will continue to do something:</p>\n<ol>\n<li>We will provide a reference data on the performance test indicators and performance test comparison with the version of netty 3.</li>\n</ol>\n</blockquote>\n"
+  "__html": "<p>Add support for netty4 communication module in 2.5.6 version of dubbo, enabled as follows:</p>\n<p>provider:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>consumer:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n\n</code></pre>\n<blockquote>\n<p><strong>NOTES</strong></p>\n<ol>\n<li>If provider need to use different communication layer framework for different protocols , please configure multiple protocols separately.</li>\n<li>consumer configuration as follow:</li>\n</ol>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n</blockquote>\n<blockquote>\n<p>Next we will continue to do something:</p>\n<ol>\n<li>We will provide a reference data on the performance test indicators and performance test comparison with the version of netty 3.</li>\n</ol>\n</blockquote>\n",
+  "link": "/en-us/docs/user/demos/netty4.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/parameter-validation.json b/en-us/docs/user/demos/parameter-validation.json
index 58b41687..f95dff49 100644
--- a/en-us/docs/user/demos/parameter-validation.json
+++ b/en-us/docs/user/demos/parameter-validation.json
@@ -1,4 +1,6 @@
 {
   "filename": "parameter-validation.md",
-  "__html": "<h1>Parameter Validation</h1>\n<p>The parameter validation <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is based on [JSR303] (<a href=\"https://jcp.org/en/jsr/detail?id=303\">https://jcp.org/en/jsr/detail?id=303</a>). The user simply add the validation annotation of the JSR303 and declares the filter for validation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Maven Dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>javax.validation<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>validation-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>1.0.0.GA<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.hibernate<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hibernate-validator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.2.0.Final<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Sample</h2>\n<h3>Example of Parameter Annotation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> java.io.Serializable;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n \n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Future;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Max;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Past;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Pattern;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Size;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationParameter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-keyword\">long</span> serialVersionUID = <span class=\"hljs-number\">7158911668568000392L</span>;\n \n    <span class=\"hljs-meta\">@NotNull</span> <span class=\"hljs-comment\">// Required </span>\n    <span class=\"hljs-meta\">@Size</span>(min = <span class=\"hljs-number\">1</span>, max = <span class=\"hljs-number\">20</span>) <span class=\"hljs-comment\">// range</span>\n    <span class=\"hljs-keyword\">private</span> String name;\n \n    <span class=\"hljs-meta\">@NotNull</span>(groups = ValidationService.Save.class) <span class=\"hljs-comment\">// It is not allowed to be blank when saving. When it is updated, it is allowed to be blank, indicating that the field is not updated </span>\n    <span class=\"hljs-meta\">@Pattern</span>(regexp = <span class=\"hljs-string\">\"^\\\\s*\\\\w+(?:\\\\.{0,1}[\\\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\\\.[a-zA-Z]+\\\\s*$\"</span>)\n    <span class=\"hljs-keyword\">private</span> String email;\n \n    <span class=\"hljs-meta\">@Min</span>(<span class=\"hljs-number\">18</span>) <span class=\"hljs-comment\">// min value</span>\n    <span class=\"hljs-meta\">@Max</span>(<span class=\"hljs-number\">100</span>) <span class=\"hljs-comment\">// max value</span>\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">int</span> age;\n \n    <span class=\"hljs-meta\">@Past</span> <span class=\"hljs-comment\">// Must be a past time</span>\n    <span class=\"hljs-keyword\">private</span> Date loginDate;\n \n    <span class=\"hljs-meta\">@Future</span> <span class=\"hljs-comment\">// Must be a future time</span>\n    <span class=\"hljs-keyword\">private</span> Date expiryDate;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getEmail</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setEmail</span><span class=\"hljs-params\">(String email)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.email = email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getAge</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setAge</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> age)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.age = age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getLoginDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setLoginDate</span><span class=\"hljs-params\">(Date loginDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.loginDate = loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getExpiryDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> expiryDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setExpiryDate</span><span class=\"hljs-params\">(Date expiryDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.expiryDate = expiryDate;\n    }\n}\n</code></pre>\n<h3>Example of group validation</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\">ValidationService</span> </span>{ <span class=\"hljs-comment\">// By default, service interfaces are used to differentiate authentication scenarios. For example:@NotNull(groups = ValidationService.class)   </span>\n    <span class=\"hljs-meta\">@interface</span> Save{} <span class=\"hljs-comment\">// The same name as the method interface, the first letter capitalized, used to distinguish between authentication scene. For example:@NotNull(groups = ValidationService.Save.class),option</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>Example of Cascading Validation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.GroupSequence;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{   \n    <span class=\"hljs-meta\">@GroupSequence</span>(Update.class) <span class=\"hljs-comment\">// validate the Update group rules at the same time</span>\n    <span class=\"hljs-meta\">@interface</span> Save{}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n \n    <span class=\"hljs-meta\">@interface</span> Update{} \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>Example of parameter validation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(@NotNull ValidationParameter parameter)</span></span>; <span class=\"hljs-comment\">// Param must not be null</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">delete</span><span class=\"hljs-params\">(@Min(<span class=\"hljs-number\">1</span>)</span> <span class=\"hljs-keyword\">int</span> id)</span>; <span class=\"hljs-comment\">// validate the range</span>\n}\n</code></pre>\n<h2>Configuration</h2>\n<h3>Validate Parameter on the client</h3>\n<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\">\"validationService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h3>Validate Parameter on the server</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"validationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h2>Validate Exception</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n<span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n \n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationParameter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationService;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationConsumer</span> </span>{   \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        String config = ValidationConsumer.class.getPackage().getName().replace(<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'/'</span>) + <span class=\"hljs-string\">\"/validation-consumer.xml\"</span>;\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(config);\n        context.start();\n        ValidationService validationService = (ValidationService)context.getBean(<span class=\"hljs-string\">\"validationService\"</span>);\n        <span class=\"hljs-comment\">// Error</span>\n        <span class=\"hljs-keyword\">try</span> {\n            parameter = <span class=\"hljs-keyword\">new</span> ValidationParameter();\n            validationService.save(parameter);\n            System.out.println(<span class=\"hljs-string\">\"Validation ERROR\"</span>);\n        } <span class=\"hljs-keyword\">catch</span> (RpcException e) { <span class=\"hljs-comment\">// throw RpcException</span>\n            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); <span class=\"hljs-comment\">// Inside a ConstraintViolationException</span>\n            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); <span class=\"hljs-comment\">// You can get the collection of validation error details</span>\n            System.out.println(violations);\n        }\n    } \n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.1.0</code> version. If you want to know how to use it, refer to  [Sample code in dubbo project] (<a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation\">https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation</a>) <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>The validation method is extensible, refer to <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation\">Developer Extension</a> in the developer's manual. <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Parameter Validation</h1>\n<p>The parameter validation <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is based on [JSR303] (<a href=\"https://jcp.org/en/jsr/detail?id=303\">https://jcp.org/en/jsr/detail?id=303</a>). The user simply add the validation annotation of the JSR303 and declares the filter for validation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Maven Dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>javax.validation<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>validation-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>1.0.0.GA<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.hibernate<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hibernate-validator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.2.0.Final<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Sample</h2>\n<h3>Example of Parameter Annotation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> java.io.Serializable;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n \n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Future;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Max;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Past;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Pattern;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Size;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationParameter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-keyword\">long</span> serialVersionUID = <span class=\"hljs-number\">7158911668568000392L</span>;\n \n    <span class=\"hljs-meta\">@NotNull</span> <span class=\"hljs-comment\">// Required </span>\n    <span class=\"hljs-meta\">@Size</span>(min = <span class=\"hljs-number\">1</span>, max = <span class=\"hljs-number\">20</span>) <span class=\"hljs-comment\">// range</span>\n    <span class=\"hljs-keyword\">private</span> String name;\n \n    <span class=\"hljs-meta\">@NotNull</span>(groups = ValidationService.Save.class) <span class=\"hljs-comment\">// It is not allowed to be blank when saving. When it is updated, it is allowed to be blank, indicating that the field is not updated </span>\n    <span class=\"hljs-meta\">@Pattern</span>(regexp = <span class=\"hljs-string\">\"^\\\\s*\\\\w+(?:\\\\.{0,1}[\\\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\\\.[a-zA-Z]+\\\\s*$\"</span>)\n    <span class=\"hljs-keyword\">private</span> String email;\n \n    <span class=\"hljs-meta\">@Min</span>(<span class=\"hljs-number\">18</span>) <span class=\"hljs-comment\">// min value</span>\n    <span class=\"hljs-meta\">@Max</span>(<span class=\"hljs-number\">100</span>) <span class=\"hljs-comment\">// max value</span>\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">int</span> age;\n \n    <span class=\"hljs-meta\">@Past</span> <span class=\"hljs-comment\">// Must be a past time</span>\n    <span class=\"hljs-keyword\">private</span> Date loginDate;\n \n    <span class=\"hljs-meta\">@Future</span> <span class=\"hljs-comment\">// Must be a future time</span>\n    <span class=\"hljs-keyword\">private</span> Date expiryDate;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getEmail</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setEmail</span><span class=\"hljs-params\">(String email)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.email = email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getAge</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setAge</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> age)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.age = age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getLoginDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setLoginDate</span><span class=\"hljs-params\">(Date loginDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.loginDate = loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getExpiryDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> expiryDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setExpiryDate</span><span class=\"hljs-params\">(Date expiryDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.expiryDate = expiryDate;\n    }\n}\n</code></pre>\n<h3>Example of group validation</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\">ValidationService</span> </span>{ <span class=\"hljs-comment\">// By default, service interfaces are used to differentiate authentication scenarios. For example:@NotNull(groups = ValidationService.class)   </span>\n    <span class=\"hljs-meta\">@interface</span> Save{} <span class=\"hljs-comment\">// The same name as the method interface, the first letter capitalized, used to distinguish between authentication scene. For example:@NotNull(groups = ValidationService.Save.class),option</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>Example of Cascading Validation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.GroupSequence;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{   \n    <span class=\"hljs-meta\">@GroupSequence</span>(Update.class) <span class=\"hljs-comment\">// validate the Update group rules at the same time</span>\n    <span class=\"hljs-meta\">@interface</span> Save{}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n \n    <span class=\"hljs-meta\">@interface</span> Update{} \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>Example of parameter validation</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(@NotNull ValidationParameter parameter)</span></span>; <span class=\"hljs-comment\">// Param must not be null</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">delete</span><span class=\"hljs-params\">(@Min(<span class=\"hljs-number\">1</span>)</span> <span class=\"hljs-keyword\">int</span> id)</span>; <span class=\"hljs-comment\">// validate the range</span>\n}\n</code></pre>\n<h2>Configuration</h2>\n<h3>Validate Parameter on the client</h3>\n<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\">\"validationService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h3>Validate Parameter on the server</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"validationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h2>Validate Exception</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n<span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n \n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationParameter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationService;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationConsumer</span> </span>{   \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        String config = ValidationConsumer.class.getPackage().getName().replace(<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'/'</span>) + <span class=\"hljs-string\">\"/validation-consumer.xml\"</span>;\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(config);\n        context.start();\n        ValidationService validationService = (ValidationService)context.getBean(<span class=\"hljs-string\">\"validationService\"</span>);\n        <span class=\"hljs-comment\">// Error</span>\n        <span class=\"hljs-keyword\">try</span> {\n            parameter = <span class=\"hljs-keyword\">new</span> ValidationParameter();\n            validationService.save(parameter);\n            System.out.println(<span class=\"hljs-string\">\"Validation ERROR\"</span>);\n        } <span class=\"hljs-keyword\">catch</span> (RpcException e) { <span class=\"hljs-comment\">// throw RpcException</span>\n            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); <span class=\"hljs-comment\">// Inside a ConstraintViolationException</span>\n            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); <span class=\"hljs-comment\">// You can get the collection of validation error details</span>\n            System.out.println(violations);\n        }\n    } \n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.1.0</code> version. If you want to know how to use it, refer to  [Sample code in dubbo project] (<a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation\">https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation</a>) <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>The validation method is extensible, refer to <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation\">Developer Extension</a> in the developer's manual. <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/parameter-validation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/preflight-check.json b/en-us/docs/user/demos/preflight-check.json
index 5b9c5c4d..17ab13d7 100644
--- a/en-us/docs/user/demos/preflight-check.json
+++ b/en-us/docs/user/demos/preflight-check.json
@@ -1,4 +1,6 @@
 {
   "filename": "preflight-check.md",
-  "__html": "<h1>Check on start up</h1>\n<p>By default dubbo will check if the dependent service is available at startup . It will throw an exception to prevent Spring complete initialization when it is not available, so that you can find the problems early before publishing you application, the default setting: <code>check=true</code>.</p>\n<p>You can turn off checking by <code>check=false</code>. For example, some services do not care it when you run testing, or you must have one started firstly because of circular dependency.</p>\n<p>In addition, if your Spring bean is lazy-loaded or you delay reference service with API programming, turn off the check,\notherwise the service will throw an exception when the service is temporarily unavailable ,then get a null reference.  If you configure <code>check=false</code> ,you can get a reference . When the service is restored, the service can automatically reconnect.</p>\n<h2>Example</h2>\n<h3>Use the spring configuration file</h3>\n<p>Disable the startup check of a service (throw some exception/error when no provider is provided):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span> = <span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">check</span> = <span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>Disable startup checking for all services (throw some exception/error when not provided):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">check</span> = <span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>Disable the registration center startup check (registration subscription failed error):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<h3>Use dubbo.properties</h3>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.reference.com.foo.BarService.check</span> = <span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.reference.check</span> = <span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.consumer.check</span> = <span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.registry.check</span> = <span class=\"hljs-string\">false</span>\n</code></pre>\n<h3>Use the -D parameter</h3>\n<pre><code class=\"language-sh\">java -Ddubbo.reference.com.foo.BarService.check = <span class=\"hljs-literal\">false</span>\njava -Ddubbo.reference.check = <span class=\"hljs-literal\">false</span>\njava -Ddubbo.consumer.check = <span class=\"hljs-literal\">false</span>\njava -Ddubbo.registry.check = <span class=\"hljs-literal\">false</span>\n</code></pre>\n<h2>Configuration Meaning</h2>\n<p><code>dubbo.reference.check=false</code>,  Change the check value of all references forcibly, even if the configuration has a declaration, it also will be overwritten.</p>\n<p><code>dubbo.consumer.check=false</code>  The default value of <code>check</code>.  It will not be affected if there is an explicit declaration in the configuration such as<code></code>&lt;dubbo: reference check =&quot; true &quot;/&gt;`.</p>\n<p><code>dubbo.registry.check=false</code>, The two configuration above is to express success of the subscription. If the subscription is also allowed to start when the registration fails for the provider list is empty, you need to use this configuration. The system will try again in the background regularly.</p>\n"
+  "__html": "<h1>Check on start up</h1>\n<p>By default dubbo will check if the dependent service is available at startup . It will throw an exception to prevent Spring complete initialization when it is not available, so that you can find the problems early before publishing you application, the default setting: <code>check=true</code>.</p>\n<p>You can turn off checking by <code>check=false</code>. For example, some services do not care it when you run testing, or you must have one started firstly because of circular dependency.</p>\n<p>In addition, if your Spring bean is lazy-loaded or you delay reference service with API programming, turn off the check,\notherwise the service will throw an exception when the service is temporarily unavailable ,then get a null reference.  If you configure <code>check=false</code> ,you can get a reference . When the service is restored, the service can automatically reconnect.</p>\n<h2>Example</h2>\n<h3>Use the spring configuration file</h3>\n<p>Disable the startup check of a service (throw some exception/error when no provider is provided):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span> = <span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">check</span> = <span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>Disable startup checking for all services (throw some exception/error when not provided):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">check</span> = <span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>Disable the registration center startup check (registration subscription failed error):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<h3>Use dubbo.properties</h3>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.reference.com.foo.BarService.check</span> = <span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.reference.check</span> = <span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.consumer.check</span> = <span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.registry.check</span> = <span class=\"hljs-string\">false</span>\n</code></pre>\n<h3>Use the -D parameter</h3>\n<pre><code class=\"language-sh\">java -Ddubbo.reference.com.foo.BarService.check = <span class=\"hljs-literal\">false</span>\njava -Ddubbo.reference.check = <span class=\"hljs-literal\">false</span>\njava -Ddubbo.consumer.check = <span class=\"hljs-literal\">false</span>\njava -Ddubbo.registry.check = <span class=\"hljs-literal\">false</span>\n</code></pre>\n<h2>Configuration Meaning</h2>\n<p><code>dubbo.reference.check=false</code>,  Change the check value of all references forcibly, even if the configuration has a declaration, it also will be overwritten.</p>\n<p><code>dubbo.consumer.check=false</code>  The default value of <code>check</code>.  It will not be affected if there is an explicit declaration in the configuration such as<code></code>&lt;dubbo: reference check =&quot; true &quot;/&gt;`.</p>\n<p><code>dubbo.registry.check=false</code>, The two configuration above is to express success of the subscription. If the subscription is also allowed to start when the registration fails for the provider list is empty, you need to use this configuration. The system will try again in the background regularly.</p>\n",
+  "link": "/en-us/docs/user/demos/preflight-check.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/reference-config-cache.json b/en-us/docs/user/demos/reference-config-cache.json
index 308b1667..9011b608 100644
--- a/en-us/docs/user/demos/reference-config-cache.json
+++ b/en-us/docs/user/demos/reference-config-cache.json
@@ -1,4 +1,6 @@
 {
   "filename": "reference-config-cache.md",
-  "__html": "<h1>ReferenceConfig Cache</h1>\n<p>The instance of <code>ReferenceConfig</code> is heavy. It encapsulates the connection to the registry and the connection to the provider, so it need to be cached. Otherwise, repeatedly generating <code>ReferenceConfig</code> may cause performance problems , memory and connection leaks. This problem is easy to ignored when programming in API mode.</p>\n<p>Therefore, since <code>2.4.0</code>, dubbo provides a simple utility ReferenceConfigCache for caching instances of <code>ReferenceConfig</code>.</p>\n<p>Use as follows:</p>\n<pre><code class=\"language-java\">ReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n......\nReferenceConfigCache cache = ReferenceConfigCache.getCache();\n<span class=\"hljs-comment\">// cache.get will cache the instance of Reference ,and call ReferenceConfig.get method to start ReferenceConfig</span>\nXxxService xxxService = cache.get(reference);\n<span class=\"hljs-comment\">// Note: Cache will hold ReferenceConfig, do not call destroy method of ReferenceConfig outside. If you do this, it will invalidate ReferenceConfig in Cache!</span>\n<span class=\"hljs-comment\">// Use xxxService instance</span>\nxxxService.sayHello();\n</code></pre>\n<p>Destroy <code>ReferenceConfig</code> in the Cache, it also remove <code>ReferenceConfig</code> and release the corresponding resources。</p>\n<pre><code class=\"language-java\">ReferenceConfigCache cache = ReferenceConfigCache.getCache();\ncache.destroy(reference);\n</code></pre>\n<p>By default ,<code>ReferenceConfigCache</code> caches one <code>ReferenceConfig</code> for the same service Group, interface, version. The key of <code>ReferenceConfigCache</code> is from the group of service Group, interface, and the version.</p>\n<p>You can modify the strategy. Define an instance of KeyGenerator, pass it as parameter of getCache method. Refer to <code>ReferenceConfigCache</code> for information。</p>\n<pre><code class=\"language-java\">KeyGenerator keyGenerator = <span class=\"hljs-keyword\">new</span> ...\nReferenceConfigCache cache = ReferenceConfigCache.getCache(keyGenerator );\n</code></pre>\n"
+  "__html": "<h1>ReferenceConfig Cache</h1>\n<p>The instance of <code>ReferenceConfig</code> is heavy. It encapsulates the connection to the registry and the connection to the provider, so it need to be cached. Otherwise, repeatedly generating <code>ReferenceConfig</code> may cause performance problems , memory and connection leaks. This problem is easy to ignored when programming in API mode.</p>\n<p>Therefore, since <code>2.4.0</code>, dubbo provides a simple utility ReferenceConfigCache for caching instances of <code>ReferenceConfig</code>.</p>\n<p>Use as follows:</p>\n<pre><code class=\"language-java\">ReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n......\nReferenceConfigCache cache = ReferenceConfigCache.getCache();\n<span class=\"hljs-comment\">// cache.get will cache the instance of Reference ,and call ReferenceConfig.get method to start ReferenceConfig</span>\nXxxService xxxService = cache.get(reference);\n<span class=\"hljs-comment\">// Note: Cache will hold ReferenceConfig, do not call destroy method of ReferenceConfig outside. If you do this, it will invalidate ReferenceConfig in Cache!</span>\n<span class=\"hljs-comment\">// Use xxxService instance</span>\nxxxService.sayHello();\n</code></pre>\n<p>Destroy <code>ReferenceConfig</code> in the Cache, it also remove <code>ReferenceConfig</code> and release the corresponding resources。</p>\n<pre><code class=\"language-java\">ReferenceConfigCache cache = ReferenceConfigCache.getCache();\ncache.destroy(reference);\n</code></pre>\n<p>By default ,<code>ReferenceConfigCache</code> caches one <code>ReferenceConfig</code> for the same service Group, interface, version. The key of <code>ReferenceConfigCache</code> is from the group of service Group, interface, and the version.</p>\n<p>You can modify the strategy. Define an instance of KeyGenerator, pass it as parameter of getCache method. Refer to <code>ReferenceConfigCache</code> for information。</p>\n<pre><code class=\"language-java\">KeyGenerator keyGenerator = <span class=\"hljs-keyword\">new</span> ...\nReferenceConfigCache cache = ReferenceConfigCache.getCache(keyGenerator );\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/reference-config-cache.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/registry-only.json b/en-us/docs/user/demos/registry-only.json
index 4175056c..bf0bce3a 100644
--- a/en-us/docs/user/demos/registry-only.json
+++ b/en-us/docs/user/demos/registry-only.json
@@ -1,4 +1,6 @@
 {
   "filename": "registry-only.md",
-  "__html": "<h1>Register only</h1>\n<p>You have two mirroring environments, two registries.\nYou have deployed one service at only one of the registries, another registries have not had time to deploy, and other applications at both registries need to rely on the service.\nAt this time, the service provider registers service to another registrar, but the service consumers do not consume the service from another registrar.</p>\n<p>Disable subscription configuration</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">subscribe</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090?subscribe=false\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Register only</h1>\n<p>You have two mirroring environments, two registries.\nYou have deployed one service at only one of the registries, another registries have not had time to deploy, and other applications at both registries need to rely on the service.\nAt this time, the service provider registers service to another registrar, but the service consumers do not consume the service from another registrar.</p>\n<p>Disable subscription configuration</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">subscribe</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090?subscribe=false\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/registry-only.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/result-cache.json b/en-us/docs/user/demos/result-cache.json
index 2a7935d1..df26d314 100644
--- a/en-us/docs/user/demos/result-cache.json
+++ b/en-us/docs/user/demos/result-cache.json
@@ -1,4 +1,6 @@
 {
   "filename": "result-cache.md",
-  "__html": "<h1>Cache Result</h1>\n<p>Cache Result <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is used to speed up access to popular data. Dubbo provides declarative caching to reduce the user work of adding cache <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>Cache Type</h2>\n<ul>\n<li><code>lru</code> Delete excess cache Based on the principle of least recently used.  The hottest data is cached.</li>\n<li><code>threadlocal</code> The current thread cache. For example, a page have a lot of portal and each portal need to check user information,  you can reduce this redundant visit with this cache.</li>\n<li><code>jcache</code> integrate with <a href=\"http://jcp.org/en/jsr/detail?id=107%27\">JSR107</a> , you can bridge a variety of cache implementation。</li>\n</ul>\n<p>Caching type can be extended,refer to:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/cache.html\">Cache extension</a></p>\n<h2>Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n</code></pre>\n<p>or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.1.0</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache\">Sample</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Cache Result</h1>\n<p>Cache Result <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is used to speed up access to popular data. Dubbo provides declarative caching to reduce the user work of adding cache <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>Cache Type</h2>\n<ul>\n<li><code>lru</code> Delete excess cache Based on the principle of least recently used.  The hottest data is cached.</li>\n<li><code>threadlocal</code> The current thread cache. For example, a page have a lot of portal and each portal need to check user information,  you can reduce this redundant visit with this cache.</li>\n<li><code>jcache</code> integrate with <a href=\"http://jcp.org/en/jsr/detail?id=107%27\">JSR107</a> , you can bridge a variety of cache implementation。</li>\n</ul>\n<p>Caching type can be extended,refer to:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/cache.html\">Cache extension</a></p>\n<h2>Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n</code></pre>\n<p>or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.1.0</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache\">Sample</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/result-cache.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/routing-rule.json b/en-us/docs/user/demos/routing-rule.json
index d4a7e9a7..25097e9c 100644
--- a/en-us/docs/user/demos/routing-rule.json
+++ b/en-us/docs/user/demos/routing-rule.json
@@ -1,4 +1,6 @@
 {
   "filename": "routing-rule.md",
-  "__html": "<h1>Routing Rules</h1>\n<p>The routing rules <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> determine the target server of one service call. It has two kinds of routing rules: conditional routing rules and script routing rules. It also support extension<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Write Routing Rules</h2>\n<p>Writing routing rules to the registry is usually done by the monitoring center or the console page.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"condition://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=\"</span> + URL.encode(<span class=\"hljs-string\">\"host = 10.20.153.10 =&gt; host = 10.20.153.11\"</span>)));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>condition://</code> It indicates the type of routing rules, supports routing rules and script routing rules, and can be extended. <strong>Required</strong>。</li>\n<li><code>0.0.0.0</code> It indicates that all IP addresses are valid. If you want to take effect for only one IP address, fill in the IP address. <strong>Required</strong>。</li>\n<li><code>com.foo.BarService</code> It indicates that the specified service is effective. <strong>Required</strong>。</li>\n<li><code>group=foo</code> It indicates that the specified service in specified group is effective. When absent, the specified service which dosen't configure group is effective.</li>\n<li><code>version=1.0</code>It indicates that the specified service in specified version is effective. When absent, the specified service which dosen't configure version is effective.</li>\n<li><code>category=routers</code> It indicates that the data is a dynamic configuration type. <strong>Required</strong>。</li>\n<li><code>dynamic=false</code> It indicates that it is persistent data. When the registrant exits, the data is still stored in the registry. <strong>Required</strong>。</li>\n<li><code>enabled=true</code> It indicates whether this routing rules is effective. Option, and default effective.</li>\n<li><code>force=false</code> It indicates whether it is forced to be executed when the routing result is null. If it is not enforced, the route will be automatically invalidated. Option, and default <code>false</code>.</li>\n<li><code>runtime=false</code> It indicates whether to execute routing rules at every call. If not, the result is only pre-executed and cached when the provider's address list changes.  It will get routing result from cache when the service is invoked. If you use parameter routing, you must to configure it as <code>true</code>. Be careful that the configuration will affect the performance. Option, and default <code>false</code>.</li>\n<li><code>priority=1</code> The priority of the routing rules. it is used for sorting, the greater the priority, the more front execution. Option, and default <code>0</code>。</li>\n<li><code>rule=URL.encode(&quot;host = 10.20.153.10 =&gt; host = 10.20.153.11&quot;)</code> It indicates the content of routing rule,<strong>Required</strong>。</li>\n</ul>\n<h2>Conditional routing rules</h2>\n<p>Routing rules based on conditional expressions, such as:<code>host = 10.20.153.10 =&gt; host = 10.20.153.11</code></p>\n<h3>Rules:</h3>\n<ul>\n<li>The previous of <code>=&gt;</code> is matched condition for consumer. All parameters compare with URL of consumers. When the consumer meet the condition, it will continue to execute the behind filter rules for consumer.</li>\n<li>After the <code>=&gt;</code> aims to filter the provider address list.  All the parameters are compared against the provider's URL, and consumer get only the filtered address list at finally.</li>\n<li>If the previous condition for consumer is empty, it means all consumers can matched. such as : <code>=&gt; host != 10.20.153.11</code></li>\n<li>If the filter condition for provider is empty, it means it is forbidden to visit. such as :<code>host = 10.20.153.10 =&gt;</code></li>\n</ul>\n<h3>Expressions:</h3>\n<p>Parameter Support:</p>\n<ul>\n<li>Service call information, such as: method, argument etc. Parameter routing is currently not supported</li>\n<li>URL field (On URL own), such as: protocol, host, port etc.</li>\n<li>All parameters on the URL. such as: application, organization etc.</li>\n</ul>\n<p>Condition Support:</p>\n<ul>\n<li>Equal sign <code>=</code> indicates match. such as: <code>host = 10.20.153.10</code></li>\n<li>Not equal sign <code>!=</code> indicates &quot;does not match&quot;. such as: <code>host != 10.20.153.10</code>.</li>\n</ul>\n<p>Value Support:</p>\n<ul>\n<li>Separate multiple values with a comma <code>,</code> .  Such as:<code>host != 10.20.153.10,10.20.153.11</code></li>\n<li>End with  <code>*</code> to indicate wildcard.  Such as: <code>host != 10.20.*</code></li>\n<li>Start with <code>$</code> to indicate reference to consumer parameters. Such as: <code>host = $host</code></li>\n</ul>\n<h3>Samples</h3>\n<ol start=\"0\">\n<li>\n<p>Exclude pre-release machine:</p>\n<pre><code>=&gt; host != 172.22.3.91\n</code></pre>\n</li>\n<li>\n<p>Whitelist <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code>host != 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>Blacklist:</p>\n<pre><code>host = 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>Service boarding application only expose part of the machine to prevent the entire cluster hanging up:</p>\n<pre><code>=&gt; host = 172.22.3.1*,172.22.3.2*\n</code></pre>\n</li>\n<li>\n<p>Additional machines for important applications:</p>\n<pre><code>application != kylin =&gt; host != 172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>Read and write separation:</p>\n<pre><code>method = find*,list*,get*,is* =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\nmethod != find*,list*,get*,is* =&gt; host = 172.22.3.97,172.22.3.98\n</code></pre>\n</li>\n<li>\n<p>Separation of Front and Background Application:</p>\n<pre><code>application = bops =&gt; host = 172.22.3.91,172.22.3.92,172.22.3.93\napplication != bops =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>Isolate different network segments:</p>\n<pre><code>host != 172.22.3.* =&gt; host != 172.22.3.*\n</code></pre>\n</li>\n<li>\n<p>Providers and consumers deployed in the same cluster, the machine only visit the local service:</p>\n<pre><code>=&gt; host = $host\n</code></pre>\n</li>\n</ol>\n<h2>Script routing rules</h2>\n<p>Script routing rules <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> support all scripts of JDK script engine. such as: javascript, jruby, groovy, etc. Configure the script type by <code>type=javascript</code>, the default is javascript.</p>\n<pre><code>&quot;script://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=&quot; + URL.encode(&quot;(function route(invokers) { ... } (invokers))&quot;)\n</code></pre>\n<p>Routing rules that base on script engine is as follow:</p>\n<pre><code class=\"language-javascript\">(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">route</span>(<span class=\"hljs-params\">invokers</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> result = <span class=\"hljs-keyword\">new</span> java.util.ArrayList(invokers.size());\n    <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i &lt; invokers.size(); i ++) {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"10.20.153.10\"</span>.equals(invokers.get(i).getUrl().getHost())) {\n            result.add(invokers.get(i));\n        }\n    }\n    <span class=\"hljs-keyword\">return</span> result;\n} (invokers)); <span class=\"hljs-comment\">// Indicates that the method is executed immediately</span>\n</code></pre>\n<h2>Tag routing rules</h2>\n<p>Tag routing rules <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup> , when the application configures the <code>TagRouter</code> , a tagged dubbo invocation can intelligently route to the service provider which has the corresponding tag.</p>\n<h3>Provider</h3>\n<ol>\n<li>configure TagRouter for the application</li>\n</ol>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n    ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n    applicationConfig.setName(<span class=\"hljs-string\">\"provider-book\"</span>);\n    applicationConfig.setQosEnable(<span class=\"hljs-keyword\">false</span>);\n    <span class=\"hljs-comment\">// instruct tag router</span>\n    Map&lt;String,String&gt; parameters = <span class=\"hljs-keyword\">new</span> HashMap&lt;&gt;();\n    parameters.put(Constants.ROUTER_KEY, <span class=\"hljs-string\">\"tag\"</span>);\n    applicationConfig.setParameters(parameters);\n    <span class=\"hljs-keyword\">return</span> applicationConfig;\n}\n</code></pre>\n<ol start=\"2\">\n<li>configure specfic tag for the provider</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProviderConfig <span class=\"hljs-title\">providerConfig</span><span class=\"hljs-params\">()</span></span>{\n\tProviderConfig providerConfig = <span class=\"hljs-keyword\">new</span> ProviderConfig();\n\tproviderConfig.setTag(<span class=\"hljs-string\">\"red\"</span>);\n\t<span class=\"hljs-keyword\">return</span> providerConfig;\n}\n</code></pre>\n<p>The application which configures no tag will be considered as the default application, and these default apps will be treated as downgrades when the invocation fails to match the provider.</p>\n<h3>Consumer</h3>\n<pre><code class=\"language-Java\">RpcContext.getContext().setAttachment(Constants.REQUEST_TAG_KEY,<span class=\"hljs-string\">\"red\"</span>);\n</code></pre>\n<p>The scope of the <code>request.tag</code> is for each invocation, using the attachment to pass the request tag. Note that the value stored in the attachment will be passed continuously in a complete remote invocation, thanks to this feature, we only need to set the tag at the beginning of a invocation.</p>\n<blockquote>\n<p>Currently, only <strong>hardcoding</strong> is supported to set requestTag. Note that RpcContext is thread-bound, elegantly using the TagRouter feature, it is recommended to set the request tag via a servlet filter (in the web environment) or a custom dubbo SPI filter.</p>\n</blockquote>\n<h3>Rules:</h3>\n<ol>\n<li>\n<p><code>request.tag=red</code> will firstlt choose the provider which configures as <code>tag=red</code>. If there is no service corresponding to the request tag in the cluster, it will downgrade to <code>tag=null</code> provider, seen as default provider。</p>\n</li>\n<li>\n<p>when <code>request.tag=null</code>, only <code>tag=null</code>  provider will be matched. Even if there are services available in the cluster, the tags do not match, they cannot be called. This is different from rule 1. Tagged invocation can be downgraded to untagged services, but invocations that do not carry tags/carry other types of tags can never be accessed other tag services.</p>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.2.0</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Routing Rules Extension Point: <a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/router.html\">Route Extension</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Note: A service can only have one whitelist rule, otherwise the two rules will be filtered out. <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>Note: Scripts have no sandbox constraints, can execute arbitrary code, and poses a backdoor risk. <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>Support since <code>2.7.0</code> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Routing Rules</h1>\n<p>The routing rules <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> determine the target server of one service call. It has two kinds of routing rules: conditional routing rules and script routing rules. It also support extension<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Write Routing Rules</h2>\n<p>Writing routing rules to the registry is usually done by the monitoring center or the console page.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"condition://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=\"</span> + URL.encode(<span class=\"hljs-string\">\"host = 10.20.153.10 =&gt; host = 10.20.153.11\"</span>)));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>condition://</code> It indicates the type of routing rules, supports routing rules and script routing rules, and can be extended. <strong>Required</strong>。</li>\n<li><code>0.0.0.0</code> It indicates that all IP addresses are valid. If you want to take effect for only one IP address, fill in the IP address. <strong>Required</strong>。</li>\n<li><code>com.foo.BarService</code> It indicates that the specified service is effective. <strong>Required</strong>。</li>\n<li><code>group=foo</code> It indicates that the specified service in specified group is effective. When absent, the specified service which dosen't configure group is effective.</li>\n<li><code>version=1.0</code>It indicates that the specified service in specified version is effective. When absent, the specified service which dosen't configure version is effective.</li>\n<li><code>category=routers</code> It indicates that the data is a dynamic configuration type. <strong>Required</strong>。</li>\n<li><code>dynamic=false</code> It indicates that it is persistent data. When the registrant exits, the data is still stored in the registry. <strong>Required</strong>。</li>\n<li><code>enabled=true</code> It indicates whether this routing rules is effective. Option, and default effective.</li>\n<li><code>force=false</code> It indicates whether it is forced to be executed when the routing result is null. If it is not enforced, the route will be automatically invalidated. Option, and default <code>false</code>.</li>\n<li><code>runtime=false</code> It indicates whether to execute routing rules at every call. If not, the result is only pre-executed and cached when the provider's address list changes.  It will get routing result from cache when the service is invoked. If you use parameter routing, you must to configure it as <code>true</code>. Be careful that the configuration will affect the performance. Option, and default <code>false</code>.</li>\n<li><code>priority=1</code> The priority of the routing rules. it is used for sorting, the greater the priority, the more front execution. Option, and default <code>0</code>。</li>\n<li><code>rule=URL.encode(&quot;host = 10.20.153.10 =&gt; host = 10.20.153.11&quot;)</code> It indicates the content of routing rule,<strong>Required</strong>。</li>\n</ul>\n<h2>Conditional routing rules</h2>\n<p>Routing rules based on conditional expressions, such as:<code>host = 10.20.153.10 =&gt; host = 10.20.153.11</code></p>\n<h3>Rules:</h3>\n<ul>\n<li>The previous of <code>=&gt;</code> is matched condition for consumer. All parameters compare with URL of consumers. When the consumer meet the condition, it will continue to execute the behind filter rules for consumer.</li>\n<li>After the <code>=&gt;</code> aims to filter the provider address list.  All the parameters are compared against the provider's URL, and consumer get only the filtered address list at finally.</li>\n<li>If the previous condition for consumer is empty, it means all consumers can matched. such as : <code>=&gt; host != 10.20.153.11</code></li>\n<li>If the filter condition for provider is empty, it means it is forbidden to visit. such as :<code>host = 10.20.153.10 =&gt;</code></li>\n</ul>\n<h3>Expressions:</h3>\n<p>Parameter Support:</p>\n<ul>\n<li>Service call information, such as: method, argument etc. Parameter routing is currently not supported</li>\n<li>URL field (On URL own), such as: protocol, host, port etc.</li>\n<li>All parameters on the URL. such as: application, organization etc.</li>\n</ul>\n<p>Condition Support:</p>\n<ul>\n<li>Equal sign <code>=</code> indicates match. such as: <code>host = 10.20.153.10</code></li>\n<li>Not equal sign <code>!=</code> indicates &quot;does not match&quot;. such as: <code>host != 10.20.153.10</code>.</li>\n</ul>\n<p>Value Support:</p>\n<ul>\n<li>Separate multiple values with a comma <code>,</code> .  Such as:<code>host != 10.20.153.10,10.20.153.11</code></li>\n<li>End with  <code>*</code> to indicate wildcard.  Such as: <code>host != 10.20.*</code></li>\n<li>Start with <code>$</code> to indicate reference to consumer parameters. Such as: <code>host = $host</code></li>\n</ul>\n<h3>Samples</h3>\n<ol start=\"0\">\n<li>\n<p>Exclude pre-release machine:</p>\n<pre><code>=&gt; host != 172.22.3.91\n</code></pre>\n</li>\n<li>\n<p>Whitelist <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code>host != 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>Blacklist:</p>\n<pre><code>host = 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>Service boarding application only expose part of the machine to prevent the entire cluster hanging up:</p>\n<pre><code>=&gt; host = 172.22.3.1*,172.22.3.2*\n</code></pre>\n</li>\n<li>\n<p>Additional machines for important applications:</p>\n<pre><code>application != kylin =&gt; host != 172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>Read and write separation:</p>\n<pre><code>method = find*,list*,get*,is* =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\nmethod != find*,list*,get*,is* =&gt; host = 172.22.3.97,172.22.3.98\n</code></pre>\n</li>\n<li>\n<p>Separation of Front and Background Application:</p>\n<pre><code>application = bops =&gt; host = 172.22.3.91,172.22.3.92,172.22.3.93\napplication != bops =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>Isolate different network segments:</p>\n<pre><code>host != 172.22.3.* =&gt; host != 172.22.3.*\n</code></pre>\n</li>\n<li>\n<p>Providers and consumers deployed in the same cluster, the machine only visit the local service:</p>\n<pre><code>=&gt; host = $host\n</code></pre>\n</li>\n</ol>\n<h2>Script routing rules</h2>\n<p>Script routing rules <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> support all scripts of JDK script engine. such as: javascript, jruby, groovy, etc. Configure the script type by <code>type=javascript</code>, the default is javascript.</p>\n<pre><code>&quot;script://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=&quot; + URL.encode(&quot;(function route(invokers) { ... } (invokers))&quot;)\n</code></pre>\n<p>Routing rules that base on script engine is as follow:</p>\n<pre><code class=\"language-javascript\">(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">route</span>(<span class=\"hljs-params\">invokers</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> result = <span class=\"hljs-keyword\">new</span> java.util.ArrayList(invokers.size());\n    <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i &lt; invokers.size(); i ++) {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"10.20.153.10\"</span>.equals(invokers.get(i).getUrl().getHost())) {\n            result.add(invokers.get(i));\n        }\n    }\n    <span class=\"hljs-keyword\">return</span> result;\n} (invokers)); <span class=\"hljs-comment\">// Indicates that the method is executed immediately</span>\n</code></pre>\n<h2>Tag routing rules</h2>\n<p>Tag routing rules <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup> , when the application configures the <code>TagRouter</code> , a tagged dubbo invocation can intelligently route to the service provider which has the corresponding tag.</p>\n<h3>Provider</h3>\n<ol>\n<li>configure TagRouter for the application</li>\n</ol>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n    ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n    applicationConfig.setName(<span class=\"hljs-string\">\"provider-book\"</span>);\n    applicationConfig.setQosEnable(<span class=\"hljs-keyword\">false</span>);\n    <span class=\"hljs-comment\">// instruct tag router</span>\n    Map&lt;String,String&gt; parameters = <span class=\"hljs-keyword\">new</span> HashMap&lt;&gt;();\n    parameters.put(Constants.ROUTER_KEY, <span class=\"hljs-string\">\"tag\"</span>);\n    applicationConfig.setParameters(parameters);\n    <span class=\"hljs-keyword\">return</span> applicationConfig;\n}\n</code></pre>\n<ol start=\"2\">\n<li>configure specfic tag for the provider</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProviderConfig <span class=\"hljs-title\">providerConfig</span><span class=\"hljs-params\">()</span></span>{\n\tProviderConfig providerConfig = <span class=\"hljs-keyword\">new</span> ProviderConfig();\n\tproviderConfig.setTag(<span class=\"hljs-string\">\"red\"</span>);\n\t<span class=\"hljs-keyword\">return</span> providerConfig;\n}\n</code></pre>\n<p>The application which configures no tag will be considered as the default application, and these default apps will be treated as downgrades when the invocation fails to match the provider.</p>\n<h3>Consumer</h3>\n<pre><code class=\"language-Java\">RpcContext.getContext().setAttachment(Constants.REQUEST_TAG_KEY,<span class=\"hljs-string\">\"red\"</span>);\n</code></pre>\n<p>The scope of the <code>request.tag</code> is for each invocation, using the attachment to pass the request tag. Note that the value stored in the attachment will be passed continuously in a complete remote invocation, thanks to this feature, we only need to set the tag at the beginning of a invocation.</p>\n<blockquote>\n<p>Currently, only <strong>hardcoding</strong> is supported to set requestTag. Note that RpcContext is thread-bound, elegantly using the TagRouter feature, it is recommended to set the request tag via a servlet filter (in the web environment) or a custom dubbo SPI filter.</p>\n</blockquote>\n<h3>Rules:</h3>\n<ol>\n<li>\n<p><code>request.tag=red</code> will firstlt choose the provider which configures as <code>tag=red</code>. If there is no service corresponding to the request tag in the cluster, it will downgrade to <code>tag=null</code> provider, seen as default provider。</p>\n</li>\n<li>\n<p>when <code>request.tag=null</code>, only <code>tag=null</code>  provider will be matched. Even if there are services available in the cluster, the tags do not match, they cannot be called. This is different from rule 1. Tagged invocation can be downgraded to untagged services, but invocations that do not carry tags/carry other types of tags can never be accessed other tag services.</p>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.2.0</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Routing Rules Extension Point: <a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/router.html\">Route Extension</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Note: A service can only have one whitelist rule, otherwise the two rules will be filtered out. <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>Note: Scripts have no sandbox constraints, can execute arbitrary code, and poses a backdoor risk. <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>Support since <code>2.7.0</code> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/routing-rule.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/serialization.json b/en-us/docs/user/demos/serialization.json
index 33e0c3f5..cb1f95c0 100644
--- a/en-us/docs/user/demos/serialization.json
+++ b/en-us/docs/user/demos/serialization.json
@@ -1,4 +1,6 @@
 {
   "filename": "serialization.md",
-  "__html": "<h2><font size=6>Using Efficient Java Serialization in Dubbo (Kryo and FST)</font></h2>\n<h2>Start Kryo and FST</h2>\n<p><font size=3>Using Kryo and FST is very simple, just add an attribute to the dubbo RPC XML configurition:</font></p>\n<pre><code>&lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;kryo&quot;/&gt;\n</code></pre>\n<pre><code>&lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;fst&quot;/&gt;\n</code></pre>\n<h2>Register serialized class</h2>\n<p><font size=3>For releasing the high ability of Kryo and FST, it's best to register the classes that need serializing into the dubbo system. For example, we can implement the following callback interface: </font></p>\n<pre><code>public class SerializationOptimizerImpl implements SerializationOptimizer {\n\n    public Collection&lt;Class&gt; getSerializableClasses() {\n        List&lt;Class&gt; classes = new LinkedList&lt;Class&gt;();\n        classes.add(BidRequest.class);\n        classes.add(BidResponse.class);\n        classes.add(Device.class);\n        classes.add(Geo.class);\n        classes.add(Impression.class);\n        classes.add(SeatBid.class);\n        return classes;\n    }\n}\n</code></pre>\n<p><font size=3>Then add in the XML configuration:</font></p>\n<pre><code>&lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;kryo&quot; optimizer=&quot;com.alibaba.dubbo.demo.SerializationOptimizerImpl&quot;/&gt;\n</code></pre>\n<p><font size=3>After registering these classes, serialization performance can be greatly improved, especially for small numbers of nested objects.</p>\n<p>Of course, when serializing a class, you might also cascade references to many classes, such as Java collection classes. In this case, we've automatically registered common classes in the JDK, so you don't need to register them repeatedly (and of course, it doesn't matter if you register them again), including:</font></p>\n<pre><code>GregorianCalendar\nInvocationHandler\nBigDecimal\nBigInteger\nPattern\nBitSet\nURI\nUUID\nHashMap\nArrayList\nLinkedList\nHashSet\nTreeSet\nHashtable\nDate\nCalendar\nConcurrentHashMap\nSimpleDateFormat\nVector\nBitSet\nStringBuffer\nStringBuilder\nObject\nObject[]\nString[]\nbyte[]\nchar[]\nint[]\nfloat[]\ndouble[]\n</code></pre>\n<p><font size=3>Since registering serialized classes is only for performance optimization purposes, it doesn't matter if you forget to register some classes. In fact, Kryo and FST generally perform better than Hessian and Dubbo serializations even if no classes are registered.</font></p>\n"
+  "__html": "<h2><font size=6>Using Efficient Java Serialization in Dubbo (Kryo and FST)</font></h2>\n<h2>Start Kryo and FST</h2>\n<p><font size=3>Using Kryo and FST is very simple, just add an attribute to the dubbo RPC XML configurition:</font></p>\n<pre><code>&lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;kryo&quot;/&gt;\n</code></pre>\n<pre><code>&lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;fst&quot;/&gt;\n</code></pre>\n<h2>Register serialized class</h2>\n<p><font size=3>For releasing the high ability of Kryo and FST, it's best to register the classes that need serializing into the dubbo system. For example, we can implement the following callback interface: </font></p>\n<pre><code>public class SerializationOptimizerImpl implements SerializationOptimizer {\n\n    public Collection&lt;Class&gt; getSerializableClasses() {\n        List&lt;Class&gt; classes = new LinkedList&lt;Class&gt;();\n        classes.add(BidRequest.class);\n        classes.add(BidResponse.class);\n        classes.add(Device.class);\n        classes.add(Geo.class);\n        classes.add(Impression.class);\n        classes.add(SeatBid.class);\n        return classes;\n    }\n}\n</code></pre>\n<p><font size=3>Then add in the XML configuration:</font></p>\n<pre><code>&lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;kryo&quot; optimizer=&quot;com.alibaba.dubbo.demo.SerializationOptimizerImpl&quot;/&gt;\n</code></pre>\n<p><font size=3>After registering these classes, serialization performance can be greatly improved, especially for small numbers of nested objects.</p>\n<p>Of course, when serializing a class, you might also cascade references to many classes, such as Java collection classes. In this case, we've automatically registered common classes in the JDK, so you don't need to register them repeatedly (and of course, it doesn't matter if you register them again), including:</font></p>\n<pre><code>GregorianCalendar\nInvocationHandler\nBigDecimal\nBigInteger\nPattern\nBitSet\nURI\nUUID\nHashMap\nArrayList\nLinkedList\nHashSet\nTreeSet\nHashtable\nDate\nCalendar\nConcurrentHashMap\nSimpleDateFormat\nVector\nBitSet\nStringBuffer\nStringBuilder\nObject\nObject[]\nString[]\nbyte[]\nchar[]\nint[]\nfloat[]\ndouble[]\n</code></pre>\n<p><font size=3>Since registering serialized classes is only for performance optimization purposes, it doesn't matter if you forget to register some classes. In fact, Kryo and FST generally perform better than Hessian and Dubbo serializations even if no classes are registered.</font></p>\n",
+  "link": "/en-us/docs/user/demos/serialization.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/service-container.json b/en-us/docs/user/demos/service-container.json
index ee10d151..b3e6c24b 100644
--- a/en-us/docs/user/demos/service-container.json
+++ b/en-us/docs/user/demos/service-container.json
@@ -1,4 +1,6 @@
 {
   "filename": "service-container.md",
-  "__html": "<h1>Service container</h1>\n<p>The service container is a standalone launcher because the backend service does not require the functionality of a Web container ,such as Tomcat or JBoss. If you insist on using web containers to load service providers, that increase complexity and is waste of resources.</p>\n<p>The service container is just a simple Main method and loads a simple Spring container to expose the service.</p>\n<p>The content of Service container can be extended, built-in spring, jetty, log4j etc..  This can be expanded with <a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/container.html\">Container Extension Points</a>. Configure it with the -D parameter in the java command or <code>dubbo.properties</code>.</p>\n<h2>Container type</h2>\n<h3>Spring Container</h3>\n<ul>\n<li>\n<p>Automatically load all spring configurations in the <code>META-INF/spring</code>.</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.spring.config</span>=<span class=\"hljs-string\">classpath*:META-INF/spring/*.xml</span>\n</code></pre>\n</li>\n</ul>\n<h3>Jetty Container</h3>\n<ul>\n<li>Start an embedded Jetty for reporting status.</li>\n<li>Configure:\n<ul>\n<li><code>dubbo.jetty.port=8080</code>: configure jetty start up port</li>\n<li><code>dubbo.jetty.directory=/foo/bar</code>: static file that can be visited by jetty directly.</li>\n<li><code>dubbo.jetty.page=log,status,system</code>: configure the displayed page, loading all pages by default</li>\n</ul>\n</li>\n</ul>\n<h3>Log4j Container</h3>\n<ul>\n<li>Automatic configuration log4j configuration. At the start of the multi-process, log files automatically by process sub-directory.</li>\n<li>Configure:\n<ul>\n<li><code>dubbo.log4j.file=/foo/bar.log</code>: configure log file path</li>\n<li><code>dubbo.log4j.level=WARN</code>: configure log level</li>\n<li><code>dubbo.log4j.subdirectory=20880</code>: configure log sub directory for multi-process startup and avoiding conflict</li>\n</ul>\n</li>\n</ul>\n<h2>Container startup</h2>\n<p>load spring by default.</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main\n</code></pre>\n<p>Load the container that passed in by the main method</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<p>Load the container that passed in by the JVM option.</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j\n</code></pre>\n<p>Load the container that passed in by <code>dubbo.properties</code> in the classpath.</p>\n<pre><code>dubbo.container=spring,jetty,log4j\n</code></pre>\n"
+  "__html": "<h1>Service container</h1>\n<p>The service container is a standalone launcher because the backend service does not require the functionality of a Web container ,such as Tomcat or JBoss. If you insist on using web containers to load service providers, that increase complexity and is waste of resources.</p>\n<p>The service container is just a simple Main method and loads a simple Spring container to expose the service.</p>\n<p>The content of Service container can be extended, built-in spring, jetty, log4j etc..  This can be expanded with <a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/container.html\">Container Extension Points</a>. Configure it with the -D parameter in the java command or <code>dubbo.properties</code>.</p>\n<h2>Container type</h2>\n<h3>Spring Container</h3>\n<ul>\n<li>\n<p>Automatically load all spring configurations in the <code>META-INF/spring</code>.</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.spring.config</span>=<span class=\"hljs-string\">classpath*:META-INF/spring/*.xml</span>\n</code></pre>\n</li>\n</ul>\n<h3>Jetty Container</h3>\n<ul>\n<li>Start an embedded Jetty for reporting status.</li>\n<li>Configure:\n<ul>\n<li><code>dubbo.jetty.port=8080</code>: configure jetty start up port</li>\n<li><code>dubbo.jetty.directory=/foo/bar</code>: static file that can be visited by jetty directly.</li>\n<li><code>dubbo.jetty.page=log,status,system</code>: configure the displayed page, loading all pages by default</li>\n</ul>\n</li>\n</ul>\n<h3>Log4j Container</h3>\n<ul>\n<li>Automatic configuration log4j configuration. At the start of the multi-process, log files automatically by process sub-directory.</li>\n<li>Configure:\n<ul>\n<li><code>dubbo.log4j.file=/foo/bar.log</code>: configure log file path</li>\n<li><code>dubbo.log4j.level=WARN</code>: configure log level</li>\n<li><code>dubbo.log4j.subdirectory=20880</code>: configure log sub directory for multi-process startup and avoiding conflict</li>\n</ul>\n</li>\n</ul>\n<h2>Container startup</h2>\n<p>load spring by default.</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main\n</code></pre>\n<p>Load the container that passed in by the main method</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<p>Load the container that passed in by the JVM option.</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j\n</code></pre>\n<p>Load the container that passed in by <code>dubbo.properties</code> in the classpath.</p>\n<pre><code>dubbo.container=spring,jetty,log4j\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/service-container.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/service-downgrade.json b/en-us/docs/user/demos/service-downgrade.json
index 84ef50af..b1e4b76d 100644
--- a/en-us/docs/user/demos/service-downgrade.json
+++ b/en-us/docs/user/demos/service-downgrade.json
@@ -1,4 +1,6 @@
 {
   "filename": "service-downgrade.md",
-  "__html": "<h1>Service-Downgrade</h1>\n<p>You can temporarilly shield a non-critical service through the service downgrade and define the return policy for it.</p>\n<p>Publish dynamic configuration rule to the registry:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\"</span>));\n</code></pre>\n<ul>\n<li>\n<p>The configuration <code>mock=force:return+null</code> means that all calls of this service will return null value directly,without making remote calls.Usually used to reduce the effect of some slow non-critical services.</p>\n</li>\n<li>\n<p>Also you can change that configuration to <code>mock=fail:return+null</code>.Then you will get null value after a failed call.Consumer will try to make a remote call to get the truely result if succeed,and if the call failed you will get null value.Usually used to tolerate some non-critical services.</p>\n</li>\n</ul>\n"
+  "__html": "<h1>Service-Downgrade</h1>\n<p>You can temporarilly shield a non-critical service through the service downgrade and define the return policy for it.</p>\n<p>Publish dynamic configuration rule to the registry:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\"</span>));\n</code></pre>\n<ul>\n<li>\n<p>The configuration <code>mock=force:return+null</code> means that all calls of this service will return null value directly,without making remote calls.Usually used to reduce the effect of some slow non-critical services.</p>\n</li>\n<li>\n<p>Also you can change that configuration to <code>mock=fail:return+null</code>.Then you will get null value after a failed call.Consumer will try to make a remote call to get the truely result if succeed,and if the call failed you will get null value.Usually used to tolerate some non-critical services.</p>\n</li>\n</ul>\n",
+  "link": "/en-us/docs/user/demos/service-downgrade.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/service-group.json b/en-us/docs/user/demos/service-group.json
index dc1aa32b..8beb908f 100644
--- a/en-us/docs/user/demos/service-group.json
+++ b/en-us/docs/user/demos/service-group.json
@@ -1,4 +1,6 @@
 {
   "filename": "service-group.md",
-  "__html": "<h1>Service Group</h1>\n<p>When you have multi-impls of a interface,you can distinguish them with the group.</p>\n<h2>Service</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n</code></pre>\n<h2>Reference</h2>\n<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\">\"feedbackIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"memberIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndewxService\"</span> /&gt;</span>\n</code></pre>\n<p>Any group <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>supported after version <code>2.2.0</code> ,always select only one available group of implementations to invoke. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Service Group</h1>\n<p>When you have multi-impls of a interface,you can distinguish them with the group.</p>\n<h2>Service</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n</code></pre>\n<h2>Reference</h2>\n<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\">\"feedbackIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"memberIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndewxService\"</span> /&gt;</span>\n</code></pre>\n<p>Any group <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>supported after version <code>2.2.0</code> ,always select only one available group of implementations to invoke. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/demos/service-group.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/static-service.json b/en-us/docs/user/demos/static-service.json
index a44e7970..26e4e734 100644
--- a/en-us/docs/user/demos/static-service.json
+++ b/en-us/docs/user/demos/static-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "static-service.md",
-  "__html": "<h1>Static Service</h1>\n<ul>\n<li>Sometimes we want to manually manage the registration and deregistration for service provider, we need to set registry to non-dynamoic mode.</li>\n</ul>\n<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\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<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\">\"10.20.141.150:9090?dynamic=false\"</span> /&gt;</span>\n</code></pre>\n<p>dynamic mode is disabled when service provider initially registers, then we need to enable it manually. When disconnects, the setting will not be deleted automatically, need to disable it manually.</p>\n<p>For a third party service provider like “memcachd”, it can directly write the address information of service provider to registry, which can be used by consumer.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo\"</span>));\n</code></pre>\n"
+  "__html": "<h1>Static Service</h1>\n<ul>\n<li>Sometimes we want to manually manage the registration and deregistration for service provider, we need to set registry to non-dynamoic mode.</li>\n</ul>\n<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\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<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\">\"10.20.141.150:9090?dynamic=false\"</span> /&gt;</span>\n</code></pre>\n<p>dynamic mode is disabled when service provider initially registers, then we need to enable it manually. When disconnects, the setting will not be deleted automatically, need to disable it manually.</p>\n<p>For a third party service provider like “memcachd”, it can directly write the address information of service provider to registry, which can be used by consumer.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo\"</span>));\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/static-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/stickiness.json b/en-us/docs/user/demos/stickiness.json
index 36c13f44..80555d0c 100644
--- a/en-us/docs/user/demos/stickiness.json
+++ b/en-us/docs/user/demos/stickiness.json
@@ -1,4 +1,6 @@
 {
   "filename": "stickiness.md",
-  "__html": "<h1>stickiness</h1>\n<p>Sticky connections are used for stateful services, as much as possible so that clients always make calls to the same provider, unless the provider hangs up and connects to the other one.</p>\n<p>Sticky connections will automatically open <a href=\"./lazy-connect.md\">Delayed Connections</a> to reduce the number of long connections.</p>\n<pre><code class=\"language-xml\"><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\">sticky</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>stickiness</h1>\n<p>Sticky connections are used for stateful services, as much as possible so that clients always make calls to the same provider, unless the provider hangs up and connects to the other one.</p>\n<p>Sticky connections will automatically open <a href=\"./lazy-connect.md\">Delayed Connections</a> to reduce the number of long connections.</p>\n<pre><code class=\"language-xml\"><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\">sticky</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/stickiness.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/subscribe-only.json b/en-us/docs/user/demos/subscribe-only.json
index 7e4fdba1..aaea2e09 100644
--- a/en-us/docs/user/demos/subscribe-only.json
+++ b/en-us/docs/user/demos/subscribe-only.json
@@ -1,4 +1,6 @@
 {
   "filename": "subscribe-only.md",
-  "__html": "<h1>Subscribe only</h1>\n<p>To facilitate the development of tests, it is common to have a registry of all services available in develop environment.And the registration of a service provider under development may affect consumers' inability to run.</p>\n<p>You can let service provider developers only subscribe to services only (services developed may rely on other services) ,don't register services under development and testing services under development with directly connection.</p>\n<p><img src=\"../sources/images/subscribe-only.jpg\" alt=\"/user-guide/images/subscribe-only.jpg\"></p>\n<p>User configuration:</p>\n<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\">\"10.20.153.10:9090\"</span> <span class=\"hljs-attr\">register</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<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\">\"10.20.153.10:9090?register=false\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Subscribe only</h1>\n<p>To facilitate the development of tests, it is common to have a registry of all services available in develop environment.And the registration of a service provider under development may affect consumers' inability to run.</p>\n<p>You can let service provider developers only subscribe to services only (services developed may rely on other services) ,don't register services under development and testing services under development with directly connection.</p>\n<p><img src=\"../sources/images/subscribe-only.jpg\" alt=\"/user-guide/images/subscribe-only.jpg\"></p>\n<p>User configuration:</p>\n<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\">\"10.20.153.10:9090\"</span> <span class=\"hljs-attr\">register</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<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\">\"10.20.153.10:9090?register=false\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/subscribe-only.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/thread-model.json b/en-us/docs/user/demos/thread-model.json
index b670ee48..0e94f1e9 100644
--- a/en-us/docs/user/demos/thread-model.json
+++ b/en-us/docs/user/demos/thread-model.json
@@ -1,4 +1,6 @@
 {
   "filename": "thread-model.md",
-  "__html": "<h1>Thread Model</h1>\n<h2>Thread Model</h2>\n<ul>\n<li>If events handing can be executed quickly without sending new request like marking in memory. Events should be handled by I/O thread since it reduces thread dispatching.</li>\n<li>If event handling will be executed slowly or needs to send new I/O request like querying from database, events should be handled in thread pool. Otherwise, I/O thread will be blocked and then will be not able to receive requests.</li>\n<li>If events are handled by I/O thread, and send new I/O requests during the handling like sending a l login request during connect event, it will alert with “Potentially leading to deadlock”, but deadlock will not happen actually.</li>\n</ul>\n<p><img src=\"../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol\"></p>\n<p>Thus, we need different dispatch strategies and different thread pool configurations to face difference scenarios.</p>\n<pre><code class=\"language-xml\"><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\">dispatcher</span>=<span class=\"hljs-string\">\"all\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n<h2>Dispatcher</h2>\n<ul>\n<li>all: All messages will be dispatched to thread pool, including request, response, connect event, disconnect event and heartbeat.</li>\n<li>direct: All messages will not be dispatched to thread pool and will be executed directly by I/O thread.</li>\n<li>message: Only request, response messages will be dispatched to I/O thread. Other messages like disconnect, connect, heartbeat messages will be executed by I/O thread.</li>\n<li>execution: Only request message will be dispatched to thread pool. Other messages like response, connect, disconnect, heartbeat will be directly executed by I/O thread.</li>\n<li>connection: I/O thread will put disconnect and connect events in the queue and execute them sequentially, other messages will be dispatched to the thread pool.</li>\n</ul>\n<h2>Thread pool</h2>\n<ul>\n<li>fixed: A fixed size of thread pool. It creates threads when starts, never shut down.(default).</li>\n<li>cached: A cached thread pool. Automatically delete the thread when it’s in idle for one minute. Recreate when needed.</li>\n<li>limit: elastic thread pool. But it can only increase the size of the thread pool. The reason is to avoid performance issue caused by traffic spike when decrease the size of the thread pool.</li>\n</ul>\n"
+  "__html": "<h1>Thread Model</h1>\n<h2>Thread Model</h2>\n<ul>\n<li>If events handing can be executed quickly without sending new request like marking in memory. Events should be handled by I/O thread since it reduces thread dispatching.</li>\n<li>If event handling will be executed slowly or needs to send new I/O request like querying from database, events should be handled in thread pool. Otherwise, I/O thread will be blocked and then will be not able to receive requests.</li>\n<li>If events are handled by I/O thread, and send new I/O requests during the handling like sending a l login request during connect event, it will alert with “Potentially leading to deadlock”, but deadlock will not happen actually.</li>\n</ul>\n<p><img src=\"../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol\"></p>\n<p>Thus, we need different dispatch strategies and different thread pool configurations to face difference scenarios.</p>\n<pre><code class=\"language-xml\"><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\">dispatcher</span>=<span class=\"hljs-string\">\"all\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n<h2>Dispatcher</h2>\n<ul>\n<li>all: All messages will be dispatched to thread pool, including request, response, connect event, disconnect event and heartbeat.</li>\n<li>direct: All messages will not be dispatched to thread pool and will be executed directly by I/O thread.</li>\n<li>message: Only request, response messages will be dispatched to I/O thread. Other messages like disconnect, connect, heartbeat messages will be executed by I/O thread.</li>\n<li>execution: Only request message will be dispatched to thread pool. Other messages like response, connect, disconnect, heartbeat will be directly executed by I/O thread.</li>\n<li>connection: I/O thread will put disconnect and connect events in the queue and execute them sequentially, other messages will be dispatched to the thread pool.</li>\n</ul>\n<h2>Thread pool</h2>\n<ul>\n<li>fixed: A fixed size of thread pool. It creates threads when starts, never shut down.(default).</li>\n<li>cached: A cached thread pool. Automatically delete the thread when it’s in idle for one minute. Recreate when needed.</li>\n<li>limit: elastic thread pool. But it can only increase the size of the thread pool. The reason is to avoid performance issue caused by traffic spike when decrease the size of the thread pool.</li>\n</ul>\n",
+  "link": "/en-us/docs/user/demos/thread-model.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/token-authorization.json b/en-us/docs/user/demos/token-authorization.json
index ee4af79a..48402460 100644
--- a/en-us/docs/user/demos/token-authorization.json
+++ b/en-us/docs/user/demos/token-authorization.json
@@ -1,4 +1,6 @@
 {
   "filename": "token-authorization.md",
-  "__html": "<h1>Token Authorization</h1>\n<p>Through the token authorization control center at the registry to decide whether to issue tokens to consumers, you can prevent consumers from bypassing the registry access provider, another through the registry can flexibly change the authorization without modification or upgrade provider</p>\n<p><img src=\"../sources/images/dubbo-token.jpg\" alt=\"/user-guide/images/dubbo-token.jpg\"></p>\n<p>You can turn on token authentication globally:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Random token , generated using a UUID--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Fixed token, equivalent to the password--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>Of course can turn on token authentication at service level:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Random token , generated using a UUID--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Fixed token, equivalent to the password--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>Also can turn on token authentication at protocol level:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Random token , generated using a UUID--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Fixed token, equivalent to the password--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Token Authorization</h1>\n<p>Through the token authorization control center at the registry to decide whether to issue tokens to consumers, you can prevent consumers from bypassing the registry access provider, another through the registry can flexibly change the authorization without modification or upgrade provider</p>\n<p><img src=\"../sources/images/dubbo-token.jpg\" alt=\"/user-guide/images/dubbo-token.jpg\"></p>\n<p>You can turn on token authentication globally:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Random token , generated using a UUID--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Fixed token, equivalent to the password--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>Of course can turn on token authentication at service level:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Random token , generated using a UUID--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Fixed token, equivalent to the password--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>Also can turn on token authentication at protocol level:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Random token , generated using a UUID--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--Fixed token, equivalent to the password--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/demos/token-authorization.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/dependencies.json b/en-us/docs/user/dependencies.json
index 89f4f306..d6dfe181 100644
--- a/en-us/docs/user/dependencies.json
+++ b/en-us/docs/user/dependencies.json
@@ -1,4 +1,6 @@
 {
   "filename": "dependencies.md",
-  "__html": "<h1>Dependencies</h1>\n<h2>Necessary dependencies</h2>\n<p>JDK 1.6+ <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>Default dependencies</h2>\n<p>use <code>mvn dependency:tree &gt; dep.log</code>  command to analysis,Dubbo default depends on the following 3rd party libraries:</p>\n<pre><code>[INFO] +- com.alibaba:dubbo:jar:2.5.9-SNAPSHOT:compile\n[INFO] |  +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile\n[INFO] |  +- org.javassist:javassist:jar:3.21.0-GA:compile\n[INFO] |  \\- org.jboss.netty:netty:jar:3.2.5.Final:compile\n</code></pre>\n<p>All dependencies here are selected for the default configuration of the Dubbo, which are based on stability and performance considerations.</p>\n<ul>\n<li>javassist.jar <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>: if <code>&lt;dubbo:provider proxy=&quot;jdk&quot; /&gt;</code> or <code>&lt;dubbo:consumer proxy=&quot;jdk&quot; /&gt;</code>,or <code>&lt;dubbo:application compiler=&quot;jdk&quot; /&gt;</code>, is not required.</li>\n<li>spring-context.jar <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>: If you are using <code>ServiceConfig</code> and <code>ReferenceConfig</code> API calls, is not required.</li>\n<li>netty.jar <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>: if <code>&lt;dubbo:protocol server=&quot;mina&quot;/&gt;</code> or <code>&lt;dubbo:protocol server=&quot;grizzly&quot;/&gt;</code>,Then change to mina.jar or grizzly.jar. If <code>&lt;protocol name=&quot;rmi&quot;/&gt;</code>, is not required.</li>\n</ul>\n<h2>Optinal dependencies</h2>\n<p>These dependencies  needs to be added to project manually,when you need them.</p>\n<ul>\n<li>netty-all 4.0.35.Final</li>\n<li>mina: 1.1.7</li>\n<li>grizzly: 2.1.4</li>\n<li>httpclient: 4.5.3</li>\n<li>hessian_lite: 3.2.1-fixed</li>\n<li>fastjson: 1.2.31</li>\n<li>zookeeper: 3.4.9</li>\n<li>jedis: 2.9.0</li>\n<li>xmemcached: 1.3.6</li>\n<li>hessian: 4.0.38</li>\n<li>jetty: 6.1.26</li>\n<li>hibernate-validator: 5.4.1.Final</li>\n<li>zkclient: 0.2</li>\n<li>curator: 2.12.0</li>\n<li>cxf: 3.0.14</li>\n<li>thrift: 0.8.0</li>\n<li>servlet: 3.0 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup></li>\n<li>validation-api: <a href=\"http://1.1.0.GA\">1.1.0.GA</a> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:1\">[5:1]</a></sup></li>\n<li>jcache: 1.0.0 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:2\">[5:2]</a></sup></li>\n<li>javax.el: 3.0.1-b08 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:3\">[5:3]</a></sup></li>\n<li>kryo: 4.0.1</li>\n<li>kryo-serializers: 0.42</li>\n<li>fst: 2.48-jdk-6</li>\n<li>resteasy: 3.0.19.Final</li>\n<li>tomcat-embed-core: 8.0.11</li>\n<li>slf4j: 1.7.25</li>\n<li>log4j: 1.2.16</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>In theory, Dubbo only depend on JDK, not depend on any 3rd party libs, you can finish logic by useing  JDK. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Bytecode generation <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Configuration parsing <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>Network transmission <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>JAVAEE <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:1\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:2\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Dependencies</h1>\n<h2>Necessary dependencies</h2>\n<p>JDK 1.6+ <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>Default dependencies</h2>\n<p>use <code>mvn dependency:tree &gt; dep.log</code>  command to analysis,Dubbo default depends on the following 3rd party libraries:</p>\n<pre><code>[INFO] +- com.alibaba:dubbo:jar:2.5.9-SNAPSHOT:compile\n[INFO] |  +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile\n[INFO] |  +- org.javassist:javassist:jar:3.21.0-GA:compile\n[INFO] |  \\- org.jboss.netty:netty:jar:3.2.5.Final:compile\n</code></pre>\n<p>All dependencies here are selected for the default configuration of the Dubbo, which are based on stability and performance considerations.</p>\n<ul>\n<li>javassist.jar <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>: if <code>&lt;dubbo:provider proxy=&quot;jdk&quot; /&gt;</code> or <code>&lt;dubbo:consumer proxy=&quot;jdk&quot; /&gt;</code>,or <code>&lt;dubbo:application compiler=&quot;jdk&quot; /&gt;</code>, is not required.</li>\n<li>spring-context.jar <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>: If you are using <code>ServiceConfig</code> and <code>ReferenceConfig</code> API calls, is not required.</li>\n<li>netty.jar <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>: if <code>&lt;dubbo:protocol server=&quot;mina&quot;/&gt;</code> or <code>&lt;dubbo:protocol server=&quot;grizzly&quot;/&gt;</code>,Then change to mina.jar or grizzly.jar. If <code>&lt;protocol name=&quot;rmi&quot;/&gt;</code>, is not required.</li>\n</ul>\n<h2>Optinal dependencies</h2>\n<p>These dependencies  needs to be added to project manually,when you need them.</p>\n<ul>\n<li>netty-all 4.0.35.Final</li>\n<li>mina: 1.1.7</li>\n<li>grizzly: 2.1.4</li>\n<li>httpclient: 4.5.3</li>\n<li>hessian_lite: 3.2.1-fixed</li>\n<li>fastjson: 1.2.31</li>\n<li>zookeeper: 3.4.9</li>\n<li>jedis: 2.9.0</li>\n<li>xmemcached: 1.3.6</li>\n<li>hessian: 4.0.38</li>\n<li>jetty: 6.1.26</li>\n<li>hibernate-validator: 5.4.1.Final</li>\n<li>zkclient: 0.2</li>\n<li>curator: 2.12.0</li>\n<li>cxf: 3.0.14</li>\n<li>thrift: 0.8.0</li>\n<li>servlet: 3.0 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup></li>\n<li>validation-api: <a href=\"http://1.1.0.GA\">1.1.0.GA</a> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:1\">[5:1]</a></sup></li>\n<li>jcache: 1.0.0 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:2\">[5:2]</a></sup></li>\n<li>javax.el: 3.0.1-b08 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:3\">[5:3]</a></sup></li>\n<li>kryo: 4.0.1</li>\n<li>kryo-serializers: 0.42</li>\n<li>fst: 2.48-jdk-6</li>\n<li>resteasy: 3.0.19.Final</li>\n<li>tomcat-embed-core: 8.0.11</li>\n<li>slf4j: 1.7.25</li>\n<li>log4j: 1.2.16</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>In theory, Dubbo only depend on JDK, not depend on any 3rd party libs, you can finish logic by useing  JDK. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Bytecode generation <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Configuration parsing <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>Network transmission <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>JAVAEE <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:1\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:2\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/dependencies.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/maturity.json b/en-us/docs/user/maturity.json
index e48a4dac..7185c060 100644
--- a/en-us/docs/user/maturity.json
+++ b/en-us/docs/user/maturity.json
@@ -1,4 +1,6 @@
 {
   "filename": "maturity.md",
-  "__html": "<h1>Maturity</h1>\n<h2>Function maturity</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Maturity</th>\n<th>Strength</th>\n<th>Problem</th>\n<th>Advise</th>\n<th>User</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Concurrency control</td>\n<td>Tested</td>\n<td>concurrency control</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Connection control</td>\n<td>Tested</td>\n<td>connection number control</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Connecting certain provider straightly</td>\n<td>Tested</td>\n<td>Provider service for point-to-point connecting straightly,for test</td>\n<td></td>\n<td>Can be used in the test environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Grouping polymerization</td>\n<td>Tested</td>\n<td>Return vlue of grouping polymerization, service for menu aggregation and other services</td>\n<td>Used in special scenes</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Parameters validator</td>\n<td>Tested</td>\n<td>parameters validator,JSR303  validation framework integration</td>\n<td>Have effect on Performance</td>\n<td>On trial</td>\n<td>LaiWang</td>\n</tr>\n<tr>\n<td>Result cache</td>\n<td>Tested</td>\n<td>result cache,for accelerating requests</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Generic reference</td>\n<td>Stable</td>\n<td>Generic reference,remote call without a business interface class,for test platforms, open api proxy service, and so on</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Generic service</td>\n<td>Stable</td>\n<td>Generic service,no interface class is required to implement any interface,for mock paltform</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Echo test</td>\n<td>Tested</td>\n<td>echo test</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Attachment</td>\n<td>Stable</td>\n<td>Attachment</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Asynchronous call</td>\n<td>Tested</td>\n<td>Unavailable asynchronous call</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Local call</td>\n<td>Tested</td>\n<td>Local call</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Callback parameter</td>\n<td>Tested</td>\n<td>Callback parameter</td>\n<td>Used in special scenes</td>\n<td>On trial</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Events notify</td>\n<td>Tested</td>\n<td>Events notify, triggering before and after the remote call is executed</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Local stub</td>\n<td>Stable</td>\n<td>Performing part of the logic on the client side</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Local mock</td>\n<td>Stable</td>\n<td>Forged return results, which can be executed when failed, or directly executed, for service degradation</td>\n<td>Need support of registry</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Delay publish</td>\n<td>Stable</td>\n<td>Delay publish,used to wait for the application to load warmup data,or wait for spring context to load completly</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Lazy connect</td>\n<td>Tested</td>\n<td>Delay setting up connections,when invocation is set up</td>\n<td></td>\n<td>On trial</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Stickness connections</td>\n<td>Tested</td>\n<td>Stickness connections,always make a request to the same provider service unless the service is down, and then switch to another</td>\n<td></td>\n<td>On trial</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Token authorization</td>\n<td>Tested</td>\n<td>Token authorization,  is used for service authorization</td>\n<td>Need support of registry</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Routing rule</td>\n<td>Tested</td>\n<td>Dynamically determining the call relationship</td>\n<td>Need support of registry</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Configuration rule</td>\n<td>Tested</td>\n<td>Distribute the configuration dynamically ,is the switch of business logic</td>\n<td>Need support of registry</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Accesslog</td>\n<td>Tested</td>\n<td>Accesslog,used to record call information</td>\n<td>Local storage, impact performance, limited by disk size</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Distributed transaction</td>\n<td>Research</td>\n<td>JTA/XA three phase submission transaction(TCC)</td>\n<td>Unstable</td>\n<td>Unavailable</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<h2>Strategy maturity</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Maturity</th>\n<th>Strength</th>\n<th>Problem</th>\n<th>Advise</th>\n<th>User</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Zookeeper registry</td>\n<td>Stable</td>\n<td>Support the cluster,have various of related open source products, dubbo-2.3.3  and above versions are recommended</td>\n<td>Depended on the stability of zookeeper</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Redis registry</td>\n<td>Stable</td>\n<td>Support the client - based double - write clustering method with high performance</td>\n<td>Please ensure server time synchronization,be used to check the expired dirty data of heartbeat</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Multicast registry</td>\n<td>Tested</td>\n<td>Decentration,no registry needs to be installed</td>\n<td>Depending on the network topology  and routing, there is a risk across the server rooms</td>\n<td>Can be used in a small range , in developement/test  environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Simple registry</td>\n<td>Tested</td>\n<td>Dogfooding,the registry itself is also a standard RPC service</td>\n<td>No cluster support, may occur single-point failure</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Simple monitor system</td>\n<td>Stable</td>\n<td>Support JFreeChart statistics report</td>\n<td>No cluster support, may occur single-point failure,but the failure does not affect the RPC call</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Dubbo protocol</td>\n<td>Stable</td>\n<td>Use NIO to reuse a single long connection and use a thread pool to process requests concurrently, Reduce handshake and increase concurrency efficiency, good performance</td>\n<td>A single connection will become a bottleneck in the transmission of large files</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Rmi protocol</td>\n<td>Stable</td>\n<td>Interoperable with native RMI, based on the TCP protocol</td>\n<td>Occasionally the connection fails, and the stub needs to be rebuilt</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Hessian protocol</td>\n<td>Stable</td>\n<td>Interoperable with native Hessian, based on the HTTP protocol</td>\n<td>Hessian.jar support is required, and the overhead of HTTP short connections is large</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Netty Transporter</td>\n<td>Stable</td>\n<td>The NIO framework of JBoss, has good performance</td>\n<td>A request sends two events and needs to shield useless events</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Mina Transporter</td>\n<td>Stable</td>\n<td>Classic NIO framework,stable</td>\n<td>The dispatch of the message queue is not timely, under great pressure, there will be FullGC</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Grizzly Transporter</td>\n<td>Tested</td>\n<td>The NIO framework of Sun,applied in the GlassFish container</td>\n<td>The thread pool is not extensible, and Filter can't intercept the next filter</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Hessian Serialization</td>\n<td>Stable</td>\n<td>Good performance,multilingual support (recommended)</td>\n<td>The compatibility of various versions of Hessian is not good, it may be in conflict with the Hessian used in the application, and the Dubbo is embedded with the source code of the hessian3.2.1</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Dubbo Serialization</td>\n<td>Tested</td>\n<td>The performance is better in a large number of POJO transmission by not transmitting the class information of POJO.</td>\n<td>When a field is added to the parameter object, an external file declaration is required</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Json Serialization</td>\n<td>Tested</td>\n<td>pure text,can be cross-language parsed,default using FastJson</td>\n<td>Poor performance</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Java Serialization</td>\n<td>Stable</td>\n<td>Java native support</td>\n<td>Poor performance</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Javassist ProxyFactory</td>\n<td>Stable</td>\n<td>Bytecode generation instead of reflection,good performance(recommended)</td>\n<td>Depending on the javassist.jar and taking up the JVM's Perm memory, the Perm may have to be larger:java -XX:PermSize=128m</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Jdk ProxyFactory</td>\n<td>Stable</td>\n<td>JDK native support</td>\n<td>Poor performance</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Failover Cluster</td>\n<td>Stable</td>\n<td>Failure automatically switches, when failure occurs, retries other servers, usually used for read operations.(recommended)</td>\n<td>Retry will lead to longer delays</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Failfast Cluster</td>\n<td>Stable</td>\n<td>Fast failure, only one call, failure to be reported immediately, usually used for non idempotent writing.</td>\n<td>If a server is being restarted, a call failure may occur</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Failsafe Cluster</td>\n<td>Stable</td>\n<td>Failsafe, when abnormal, directly ignored, usually used to write to the audit log and other operations</td>\n<td>Call information loss</td>\n<td>Can be used in the production environment</td>\n<td>Monitor</td>\n</tr>\n<tr>\n<td>Failback Cluster</td>\n<td>Tested</td>\n<td>Failure auto recovery, backstage record failure request, regular retransmission, usually used for message notification operations</td>\n<td>Unreliable, lost when restart the server</td>\n<td>Can be used in the production environment</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Forking Cluster</td>\n<td>Tested</td>\n<td>Multiple servers are invoked in parallel, as long as one success is returned, often used for high real-time reading operations.</td>\n<td>Need to waste more service resources</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Broadcast Cluster</td>\n<td>Tested</td>\n<td>A broadcast calls all providers, one by one, and any error is wrongly reported, usually used to update the provider's local state</td>\n<td>The speed is slow, and any false report is wrong.</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Random LoadBalance</td>\n<td>Stable</td>\n<td>Random probability, set random probability according to weight(recommended)</td>\n<td>The probability of a collision on a cross section is high. When retrying, there may be an unequal instantaneous pressure.</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>RoundRobin LoadBalance</td>\n<td>Stable</td>\n<td>Round Robin,setting wheel based ratio according to the weight after the Convention</td>\n<td>There is a slow machine accumulation request problem, and extreme circumstances may cause an avalanche</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>LeastActive LoadBalance</td>\n<td>Stable</td>\n<td>The least active call number, the random number of the same active number, the active number is the count difference before and after the call, making the slow machine receive less request.</td>\n<td>Do not support the weight, in the capacity planning, not to pressure a machine oriented pressure measurement by weight capacity</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>ConsistentHash LoadBalance</td>\n<td>Stable</td>\n<td>The consistency hash, the same parameters always request to the same provider, when one provider hung, originally sent to the provider's request, based on virtual nodes, spread to other providers, will not cause dramatic changes</td>\n<td>Uneven distribution of pressure</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Condition routing rule</td>\n<td>Stable</td>\n<td>Routing rules based on conditional expressions, simple and easy to use</td>\n<td>There are some complex multi branch conditions, and the rules are difficult to describe</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Script routing rules</td>\n<td>Tested</td>\n<td>Routing rules based on the script engine, powerful</td>\n<td>No sandbox is running, scripting ability is too powerful and may be the back door</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Spring Container</td>\n<td>Stable</td>\n<td>Automatically load all Spring configurations under the META-INF/spring directory</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Jetty Container</td>\n<td>Stable</td>\n<td>Start an embedded Jetty for reporting state</td>\n<td>When a large number of pages are accessed, the threads and memory of the server are affected</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Log4j Container</td>\n<td>Stable</td>\n<td>Configuring the configuration of the log4j automatically, automatically subdirecting the log files by process at the startup of multiple processes</td>\n<td>The user can't control the configuration of log4j, inflexible</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<h1>Maturity</h1>\n<h2>Function maturity</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Maturity</th>\n<th>Strength</th>\n<th>Problem</th>\n<th>Advise</th>\n<th>User</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Concurrency control</td>\n<td>Tested</td>\n<td>concurrency control</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Connection control</td>\n<td>Tested</td>\n<td>connection number control</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Connecting certain provider straightly</td>\n<td>Tested</td>\n<td>Provider service for point-to-point connecting straightly,for test</td>\n<td></td>\n<td>Can be used in the test environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Grouping polymerization</td>\n<td>Tested</td>\n<td>Return vlue of grouping polymerization, service for menu aggregation and other services</td>\n<td>Used in special scenes</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Parameters validator</td>\n<td>Tested</td>\n<td>parameters validator,JSR303  validation framework integration</td>\n<td>Have effect on Performance</td>\n<td>On trial</td>\n<td>LaiWang</td>\n</tr>\n<tr>\n<td>Result cache</td>\n<td>Tested</td>\n<td>result cache,for accelerating requests</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Generic reference</td>\n<td>Stable</td>\n<td>Generic reference,remote call without a business interface class,for test platforms, open api proxy service, and so on</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Generic service</td>\n<td>Stable</td>\n<td>Generic service,no interface class is required to implement any interface,for mock paltform</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Echo test</td>\n<td>Tested</td>\n<td>echo test</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Attachment</td>\n<td>Stable</td>\n<td>Attachment</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Asynchronous call</td>\n<td>Tested</td>\n<td>Unavailable asynchronous call</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Local call</td>\n<td>Tested</td>\n<td>Local call</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Callback parameter</td>\n<td>Tested</td>\n<td>Callback parameter</td>\n<td>Used in special scenes</td>\n<td>On trial</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Events notify</td>\n<td>Tested</td>\n<td>Events notify, triggering before and after the remote call is executed</td>\n<td></td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Local stub</td>\n<td>Stable</td>\n<td>Performing part of the logic on the client side</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Local mock</td>\n<td>Stable</td>\n<td>Forged return results, which can be executed when failed, or directly executed, for service degradation</td>\n<td>Need support of registry</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Delay publish</td>\n<td>Stable</td>\n<td>Delay publish,used to wait for the application to load warmup data,or wait for spring context to load completly</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Lazy connect</td>\n<td>Tested</td>\n<td>Delay setting up connections,when invocation is set up</td>\n<td></td>\n<td>On trial</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Stickness connections</td>\n<td>Tested</td>\n<td>Stickness connections,always make a request to the same provider service unless the service is down, and then switch to another</td>\n<td></td>\n<td>On trial</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Token authorization</td>\n<td>Tested</td>\n<td>Token authorization,  is used for service authorization</td>\n<td>Need support of registry</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Routing rule</td>\n<td>Tested</td>\n<td>Dynamically determining the call relationship</td>\n<td>Need support of registry</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Configuration rule</td>\n<td>Tested</td>\n<td>Distribute the configuration dynamically ,is the switch of business logic</td>\n<td>Need support of registry</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Accesslog</td>\n<td>Tested</td>\n<td>Accesslog,used to record call information</td>\n<td>Local storage, impact performance, limited by disk size</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Distributed transaction</td>\n<td>Research</td>\n<td>JTA/XA three phase submission transaction(TCC)</td>\n<td>Unstable</td>\n<td>Unavailable</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<h2>Strategy maturity</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Maturity</th>\n<th>Strength</th>\n<th>Problem</th>\n<th>Advise</th>\n<th>User</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Zookeeper registry</td>\n<td>Stable</td>\n<td>Support the cluster,have various of related open source products, dubbo-2.3.3  and above versions are recommended</td>\n<td>Depended on the stability of zookeeper</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Redis registry</td>\n<td>Stable</td>\n<td>Support the client - based double - write clustering method with high performance</td>\n<td>Please ensure server time synchronization,be used to check the expired dirty data of heartbeat</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Multicast registry</td>\n<td>Tested</td>\n<td>Decentration,no registry needs to be installed</td>\n<td>Depending on the network topology  and routing, there is a risk across the server rooms</td>\n<td>Can be used in a small range , in developement/test  environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Simple registry</td>\n<td>Tested</td>\n<td>Dogfooding,the registry itself is also a standard RPC service</td>\n<td>No cluster support, may occur single-point failure</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Simple monitor system</td>\n<td>Stable</td>\n<td>Support JFreeChart statistics report</td>\n<td>No cluster support, may occur single-point failure,but the failure does not affect the RPC call</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Dubbo protocol</td>\n<td>Stable</td>\n<td>Use NIO to reuse a single long connection and use a thread pool to process requests concurrently, Reduce handshake and increase concurrency efficiency, good performance</td>\n<td>A single connection will become a bottleneck in the transmission of large files</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Rmi protocol</td>\n<td>Stable</td>\n<td>Interoperable with native RMI, based on the TCP protocol</td>\n<td>Occasionally the connection fails, and the stub needs to be rebuilt</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Hessian protocol</td>\n<td>Stable</td>\n<td>Interoperable with native Hessian, based on the HTTP protocol</td>\n<td>Hessian.jar support is required, and the overhead of HTTP short connections is large</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Netty Transporter</td>\n<td>Stable</td>\n<td>The NIO framework of JBoss, has good performance</td>\n<td>A request sends two events and needs to shield useless events</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Mina Transporter</td>\n<td>Stable</td>\n<td>Classic NIO framework,stable</td>\n<td>The dispatch of the message queue is not timely, under great pressure, there will be FullGC</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Grizzly Transporter</td>\n<td>Tested</td>\n<td>The NIO framework of Sun,applied in the GlassFish container</td>\n<td>The thread pool is not extensible, and Filter can't intercept the next filter</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Hessian Serialization</td>\n<td>Stable</td>\n<td>Good performance,multilingual support (recommended)</td>\n<td>The compatibility of various versions of Hessian is not good, it may be in conflict with the Hessian used in the application, and the Dubbo is embedded with the source code of the hessian3.2.1</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Dubbo Serialization</td>\n<td>Tested</td>\n<td>The performance is better in a large number of POJO transmission by not transmitting the class information of POJO.</td>\n<td>When a field is added to the parameter object, an external file declaration is required</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Json Serialization</td>\n<td>Tested</td>\n<td>pure text,can be cross-language parsed,default using FastJson</td>\n<td>Poor performance</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Java Serialization</td>\n<td>Stable</td>\n<td>Java native support</td>\n<td>Poor performance</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Javassist ProxyFactory</td>\n<td>Stable</td>\n<td>Bytecode generation instead of reflection,good performance(recommended)</td>\n<td>Depending on the javassist.jar and taking up the JVM's Perm memory, the Perm may have to be larger:java -XX:PermSize=128m</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Jdk ProxyFactory</td>\n<td>Stable</td>\n<td>JDK native support</td>\n<td>Poor performance</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Failover Cluster</td>\n<td>Stable</td>\n<td>Failure automatically switches, when failure occurs, retries other servers, usually used for read operations.(recommended)</td>\n<td>Retry will lead to longer delays</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Failfast Cluster</td>\n<td>Stable</td>\n<td>Fast failure, only one call, failure to be reported immediately, usually used for non idempotent writing.</td>\n<td>If a server is being restarted, a call failure may occur</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Failsafe Cluster</td>\n<td>Stable</td>\n<td>Failsafe, when abnormal, directly ignored, usually used to write to the audit log and other operations</td>\n<td>Call information loss</td>\n<td>Can be used in the production environment</td>\n<td>Monitor</td>\n</tr>\n<tr>\n<td>Failback Cluster</td>\n<td>Tested</td>\n<td>Failure auto recovery, backstage record failure request, regular retransmission, usually used for message notification operations</td>\n<td>Unreliable, lost when restart the server</td>\n<td>Can be used in the production environment</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Forking Cluster</td>\n<td>Tested</td>\n<td>Multiple servers are invoked in parallel, as long as one success is returned, often used for high real-time reading operations.</td>\n<td>Need to waste more service resources</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Broadcast Cluster</td>\n<td>Tested</td>\n<td>A broadcast calls all providers, one by one, and any error is wrongly reported, usually used to update the provider's local state</td>\n<td>The speed is slow, and any false report is wrong.</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Random LoadBalance</td>\n<td>Stable</td>\n<td>Random probability, set random probability according to weight(recommended)</td>\n<td>The probability of a collision on a cross section is high. When retrying, there may be an unequal instantaneous pressure.</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>RoundRobin LoadBalance</td>\n<td>Stable</td>\n<td>Round Robin,setting wheel based ratio according to the weight after the Convention</td>\n<td>There is a slow machine accumulation request problem, and extreme circumstances may cause an avalanche</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>LeastActive LoadBalance</td>\n<td>Stable</td>\n<td>The least active call number, the random number of the same active number, the active number is the count difference before and after the call, making the slow machine receive less request.</td>\n<td>Do not support the weight, in the capacity planning, not to pressure a machine oriented pressure measurement by weight capacity</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>ConsistentHash LoadBalance</td>\n<td>Stable</td>\n<td>The consistency hash, the same parameters always request to the same provider, when one provider hung, originally sent to the provider's request, based on virtual nodes, spread to other providers, will not cause dramatic changes</td>\n<td>Uneven distribution of pressure</td>\n<td>Can be used in the production environment</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Condition routing rule</td>\n<td>Stable</td>\n<td>Routing rules based on conditional expressions, simple and easy to use</td>\n<td>There are some complex multi branch conditions, and the rules are difficult to describe</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Script routing rules</td>\n<td>Tested</td>\n<td>Routing rules based on the script engine, powerful</td>\n<td>No sandbox is running, scripting ability is too powerful and may be the back door</td>\n<td>On trial</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Spring Container</td>\n<td>Stable</td>\n<td>Automatically load all Spring configurations under the META-INF/spring directory</td>\n<td></td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Jetty Container</td>\n<td>Stable</td>\n<td>Start an embedded Jetty for reporting state</td>\n<td>When a large number of pages are accessed, the threads and memory of the server are affected</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Log4j Container</td>\n<td>Stable</td>\n<td>Configuring the configuration of the log4j automatically, automatically subdirecting the log files by process at the startup of multiple processes</td>\n<td>The user can't control the configuration of log4j, inflexible</td>\n<td>Can be used in the production environment</td>\n<td>Alibaba</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/maturity.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/perf-test.json b/en-us/docs/user/perf-test.json
index b1f18c45..29b07d42 100644
--- a/en-us/docs/user/perf-test.json
+++ b/en-us/docs/user/perf-test.json
@@ -1,4 +1,6 @@
 {
   "filename": "perf-test.md",
-  "__html": "<h1>Performance test report</h1>\n<h2>Test instructions</h2>\n<ol start=\"0\">\n<li>In this performance test, the performance of all Dubbo 2.0 supported protocols in different sizes and data types is tested and compared with the Dubbo 1.0.</li>\n<li>The overall performance is increased by 1.0 compared with 10%, and the average increase is 10%. The performance improvement of 10%~50% can also be achieved by using the new Dubbo serialization of Dubbo 2.0 .</li>\n<li>In the stability test, because the underlying communication framework is changed from Mina to netty, the growth of objects in old area is greatly reduced, and the 50 hour operation increases less than 200m and no fullgc.</li>\n<li>There is a problem: performance of 2.0 is less than 1.0 in 50K data, and it is doubted that it may be a buffer setting problem, and the next version will be further confirmed.</li>\n</ol>\n<h2>Test environment</h2>\n<h3>Hardware deployment and parameter adjustment</h3>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>CPU</th>\n<th>Memory</th>\n<th>Network</th>\n<th>Disk</th>\n<th>Kernel</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Tecal BH620</td>\n<td>model name : Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz cache size : 8192 KB processor_count : 16</td>\n<td>Total System Memory: 6G Hardware Memory Info:  Size: 4096MB</td>\n<td>eth0: Link is up at 1000 Mbps, full duplex. peth0: Link is up at 1000 Mbps, full duplex.</td>\n<td>/dev/sda: 597.9 GB</td>\n<td>2.6.18-128.el5xen x86_64</td>\n</tr>\n</tbody>\n</table>\n<h3>Software architecture</h3>\n<table>\n<thead>\n<tr>\n<th>Software name and version</th>\n<th>key parameter</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>java version &quot;1.6.0_18&quot; Java(TM) SE Runtime Environment (build 1.6.0_18-b07) Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)</td>\n<td>-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70</td>\n</tr>\n<tr>\n<td><a href=\"http://jboss-4.0.5.GA\">jboss-4.0.5.GA</a></td>\n<td></td>\n</tr>\n<tr>\n<td>httpd-2.0.61</td>\n<td>KeepAlive On MaxKeepAliveRequests 100000 KeepAliveTimeout 180 MaxRequestsPerChild 1000000 <IfModule worker.c>         StartServers 5         MaxClients 1024         MinSpareThreads 25         MaxSpareThreads 75         ThreadsPerChild 64         ThreadLimit 128         ServerLimit 16 </IfModule></td>\n</tr>\n</tbody>\n</table>\n<h2>Test purpose</h2>\n<h3>Expected performance indicators (quantized)</h3>\n<table>\n<thead>\n<tr>\n<th>Scene name</th>\n<th>Corresponding index name</th>\n<th>Range of expected values</th>\n<th>Actual value</th>\n<th>Whether or not to meet expectations (yes / no)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1k data</td>\n<td>Response time</td>\n<td>0.9ms</td>\n<td>0.79ms</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td>1k data</td>\n<td>TPS</td>\n<td>10000</td>\n<td>11994</td>\n<td>Yes</td>\n</tr>\n</tbody>\n</table>\n<h3>Expected operating conditions (non quantified, optional)</h3>\n<ul>\n<li>The performance of 2.0 is not less than 1, and the performance of the intermodulation of 2.0 and 1.0 is not significantly reduced. In addition to 50K string, the rest are passed</li>\n<li>JVM memory is running stable, no OOM, and there is no reasonable large object in the heap memory. Passed</li>\n<li>CPU, memory, network, disk, file handle are occupied smoothly. Passed</li>\n<li>There is no frequent thread lock, and the number of threads is stable. Passed</li>\n<li>Business thread load balance. Passed</li>\n</ul>\n<h2>Test script</h2>\n<ol start=\"0\">\n<li>\n<p>Performance test scence (10 concurrency)</p>\n<ul>\n<li>Pass in 1K String, do not do anything, return the original</li>\n<li>Pass in 50K String, do not do anything, return the original</li>\n<li>Pass in 200K String, do not do anything, return the original</li>\n<li>Incoming 1K POJO (nested complex person objects) without any processing, return to the original</li>\n</ul>\n<p>The above scenario is tested for 10 minutes in Dubbo 1.0, Dubbo 2.0 (hessian2 serialization), Dubbo 2.0 (Dubbo serialization), RMI, Hessian 3.2.0, HTTP (JSON serialization). It mainly examines the performance of serialization and network IO, so the server has no business logic. 10 is to consider the concurrent HTTP protocol in high with the use of CPU high rate may hit the bottleneck.</p>\n</li>\n<li>\n<p>Concurrent scene (20 concurrency)\n1K String is introduced into the server segment for 1W times, and a random number is regenerated each time and then assembled. Examine whether business threads can be assigned to each CPU.</p>\n</li>\n<li>\n<p>Stability scence (20 concurrency)\nAt the same time, we call the 1 parameter String (5K) method, the 1 parameter is the person object method, the 1 parameter is map (the value is 3 person), and it runs for 50 hours continuously.</p>\n</li>\n<li>\n<p>High pressure scene (20 concurrency)\nOn the basis of the stability scenario, the providers and consumers are arranged into 2 sets (one machine and 2 instances), and the parameters of String are 20byte to 200K, and are randomly transformed every 10 minutes.</p>\n</li>\n</ol>\n<h2>Test result</h2>\n<h3>Scene name: scence POJO</h3>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1 (hessian2 serialization+mina)</td>\n<td>10813.5</td>\n<td>0.9</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>11994</td>\n<td>0.79</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>13620</td>\n<td>0.67</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>2461.79</td>\n<td>4</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>2417.7</td>\n<td>4.1</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>8179.08</td>\n<td>1.15</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>10.92</td>\n<td>-12.22</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>13.56</td>\n<td>-15.19</td>\n</tr>\n</tbody>\n</table>\n<p>POJO TPS</p>\n<p><img src=\"./sources/images/pojotps.png\" alt=\"pojotps.png\"></p>\n<p>POJO Response</p>\n<p><img src=\"./sources/images/pojores.png\" alt=\"pojores.png\"></p>\n<h3>Scene name: scence 1k string</h3>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2 serialization+mina)</td>\n<td>11940</td>\n<td>0.8</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>14402</td>\n<td>0.64</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>15096</td>\n<td>0.6</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>11136.02</td>\n<td>0.81</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>11426.83</td>\n<td>0.79</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>8919.27</td>\n<td>1.04</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>20.62</td>\n<td>-20.00</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>4.82</td>\n<td>-6.25</td>\n</tr>\n</tbody>\n</table>\n<p>1k TPS</p>\n<p><img src=\"./sources/images/1ktps.png\" alt=\"1ktps.png\"></p>\n<p>1k Response</p>\n<p><img src=\"./sources/images/1kres.png\" alt=\"1kres.png\"></p>\n<h3>Scene name: scence 50k string</h3>\n<table>\n<thead>\n<tr>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2 serialization+mina</td>\n<td>1962.7</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>1293</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>1966</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>3349.88</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>1925.33</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>3247.1</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>-34.12</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>52.05</td>\n</tr>\n</tbody>\n</table>\n<p>50K TPS</p>\n<p><img src=\"./sources/images/50ktps.png\" alt=\"50ktps.png\"></p>\n<p>50K Response</p>\n<p><img src=\"./sources/images/50kres.png\" alt=\"50kres.png\"></p>\n<h3>Scene name: scence 200k string</h3>\n<table>\n<thead>\n<tr>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2 serialization+mina)</td>\n<td>324.2</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>362.92</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>569.5</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1031.28</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>628.06</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>1011.97</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>11.94</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>56.92</td>\n</tr>\n</tbody>\n</table>\n<p>200K TPS</p>\n<p><img src=\"./sources/images/200ktps.png\" alt=\"200ktps.png\"></p>\n<p><strong>200K Response</strong></p>\n<p><img src=\"./sources/images/200kres.png\" alt=\"200kres.png\"></p>\n<h2>Test analysis</h2>\n<h3>Performance analysis and evaluation</h3>\n<p>The performance test conclusion of Dubbo 2 has been improved and improved from performance, memory footprint and stability. Because of its memory management, the change of Mina into netty greatly reduces the 1 version of the large memory sawtooth in high concurrency and large data.</p>\n<h3>Performance comparison analysis (new and old environment, different data magnitude, etc.)</h3>\n<p>The performance of Dubbo 2 is compared with that of Dubbo 1, which is all hessian2 serialization. The performance is improved (except for 50K String). See the performance data of the fifth chapter in detail.</p>\n<p>For compatibility default serialization and 1 consistent with hessian2, such as have higher requirements on the performance of Dubbo serialization can be used, which is in the process of complicated object, can be obtained in 50% large data upgrade (but it is not recommended for use Dubbo protocol).</p>\n<p>The purpose of Dubbo is to meet the RPC calls with high concurrent and small data volume. The performance is not good under large data volume. It is recommended to use RMI or HTTP protocol.</p>\n<h3>Test limitation analysis (optional)</h3>\n<p>This performance test examines the performance of the Dubbo itself, and the performance of the actual use needs to be verified.</p>\n<p>Because the performance of Dubbo itself is in millisecond and the base number is small, performance improvement may not change the performance of the application as a whole.</p>\n<p>All the monitoring charts are not listed because of the limit of length.</p>\n"
+  "__html": "<h1>Performance test report</h1>\n<h2>Test instructions</h2>\n<ol start=\"0\">\n<li>In this performance test, the performance of all Dubbo 2.0 supported protocols in different sizes and data types is tested and compared with the Dubbo 1.0.</li>\n<li>The overall performance is increased by 1.0 compared with 10%, and the average increase is 10%. The performance improvement of 10%~50% can also be achieved by using the new Dubbo serialization of Dubbo 2.0 .</li>\n<li>In the stability test, because the underlying communication framework is changed from Mina to netty, the growth of objects in old area is greatly reduced, and the 50 hour operation increases less than 200m and no fullgc.</li>\n<li>There is a problem: performance of 2.0 is less than 1.0 in 50K data, and it is doubted that it may be a buffer setting problem, and the next version will be further confirmed.</li>\n</ol>\n<h2>Test environment</h2>\n<h3>Hardware deployment and parameter adjustment</h3>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>CPU</th>\n<th>Memory</th>\n<th>Network</th>\n<th>Disk</th>\n<th>Kernel</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Tecal BH620</td>\n<td>model name : Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz cache size : 8192 KB processor_count : 16</td>\n<td>Total System Memory: 6G Hardware Memory Info:  Size: 4096MB</td>\n<td>eth0: Link is up at 1000 Mbps, full duplex. peth0: Link is up at 1000 Mbps, full duplex.</td>\n<td>/dev/sda: 597.9 GB</td>\n<td>2.6.18-128.el5xen x86_64</td>\n</tr>\n</tbody>\n</table>\n<h3>Software architecture</h3>\n<table>\n<thead>\n<tr>\n<th>Software name and version</th>\n<th>key parameter</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>java version &quot;1.6.0_18&quot; Java(TM) SE Runtime Environment (build 1.6.0_18-b07) Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)</td>\n<td>-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70</td>\n</tr>\n<tr>\n<td><a href=\"http://jboss-4.0.5.GA\">jboss-4.0.5.GA</a></td>\n<td></td>\n</tr>\n<tr>\n<td>httpd-2.0.61</td>\n<td>KeepAlive On MaxKeepAliveRequests 100000 KeepAliveTimeout 180 MaxRequestsPerChild 1000000 <IfModule worker.c>         StartServers 5         MaxClients 1024         MinSpareThreads 25         MaxSpareThreads 75         ThreadsPerChild 64         ThreadLimit 128         ServerLimit 16 </IfModule></td>\n</tr>\n</tbody>\n</table>\n<h2>Test purpose</h2>\n<h3>Expected performance indicators (quantized)</h3>\n<table>\n<thead>\n<tr>\n<th>Scene name</th>\n<th>Corresponding index name</th>\n<th>Range of expected values</th>\n<th>Actual value</th>\n<th>Whether or not to meet expectations (yes / no)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1k data</td>\n<td>Response time</td>\n<td>0.9ms</td>\n<td>0.79ms</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td>1k data</td>\n<td>TPS</td>\n<td>10000</td>\n<td>11994</td>\n<td>Yes</td>\n</tr>\n</tbody>\n</table>\n<h3>Expected operating conditions (non quantified, optional)</h3>\n<ul>\n<li>The performance of 2.0 is not less than 1, and the performance of the intermodulation of 2.0 and 1.0 is not significantly reduced. In addition to 50K string, the rest are passed</li>\n<li>JVM memory is running stable, no OOM, and there is no reasonable large object in the heap memory. Passed</li>\n<li>CPU, memory, network, disk, file handle are occupied smoothly. Passed</li>\n<li>There is no frequent thread lock, and the number of threads is stable. Passed</li>\n<li>Business thread load balance. Passed</li>\n</ul>\n<h2>Test script</h2>\n<ol start=\"0\">\n<li>\n<p>Performance test scence (10 concurrency)</p>\n<ul>\n<li>Pass in 1K String, do not do anything, return the original</li>\n<li>Pass in 50K String, do not do anything, return the original</li>\n<li>Pass in 200K String, do not do anything, return the original</li>\n<li>Incoming 1K POJO (nested complex person objects) without any processing, return to the original</li>\n</ul>\n<p>The above scenario is tested for 10 minutes in Dubbo 1.0, Dubbo 2.0 (hessian2 serialization), Dubbo 2.0 (Dubbo serialization), RMI, Hessian 3.2.0, HTTP (JSON serialization). It mainly examines the performance of serialization and network IO, so the server has no business logic. 10 is to consider the concurrent HTTP protocol in high with the use of CPU high rate may hit the bottleneck.</p>\n</li>\n<li>\n<p>Concurrent scene (20 concurrency)\n1K String is introduced into the server segment for 1W times, and a random number is regenerated each time and then assembled. Examine whether business threads can be assigned to each CPU.</p>\n</li>\n<li>\n<p>Stability scence (20 concurrency)\nAt the same time, we call the 1 parameter String (5K) method, the 1 parameter is the person object method, the 1 parameter is map (the value is 3 person), and it runs for 50 hours continuously.</p>\n</li>\n<li>\n<p>High pressure scene (20 concurrency)\nOn the basis of the stability scenario, the providers and consumers are arranged into 2 sets (one machine and 2 instances), and the parameters of String are 20byte to 200K, and are randomly transformed every 10 minutes.</p>\n</li>\n</ol>\n<h2>Test result</h2>\n<h3>Scene name: scence POJO</h3>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1 (hessian2 serialization+mina)</td>\n<td>10813.5</td>\n<td>0.9</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>11994</td>\n<td>0.79</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>13620</td>\n<td>0.67</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>2461.79</td>\n<td>4</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>2417.7</td>\n<td>4.1</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>8179.08</td>\n<td>1.15</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>10.92</td>\n<td>-12.22</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>13.56</td>\n<td>-15.19</td>\n</tr>\n</tbody>\n</table>\n<p>POJO TPS</p>\n<p><img src=\"./sources/images/pojotps.png\" alt=\"pojotps.png\"></p>\n<p>POJO Response</p>\n<p><img src=\"./sources/images/pojores.png\" alt=\"pojores.png\"></p>\n<h3>Scene name: scence 1k string</h3>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2 serialization+mina)</td>\n<td>11940</td>\n<td>0.8</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>14402</td>\n<td>0.64</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>15096</td>\n<td>0.6</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>11136.02</td>\n<td>0.81</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>11426.83</td>\n<td>0.79</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>8919.27</td>\n<td>1.04</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>20.62</td>\n<td>-20.00</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>4.82</td>\n<td>-6.25</td>\n</tr>\n</tbody>\n</table>\n<p>1k TPS</p>\n<p><img src=\"./sources/images/1ktps.png\" alt=\"1ktps.png\"></p>\n<p>1k Response</p>\n<p><img src=\"./sources/images/1kres.png\" alt=\"1kres.png\"></p>\n<h3>Scene name: scence 50k string</h3>\n<table>\n<thead>\n<tr>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2 serialization+mina</td>\n<td>1962.7</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>1293</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>1966</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>3349.88</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>1925.33</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>3247.1</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>-34.12</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>52.05</td>\n</tr>\n</tbody>\n</table>\n<p>50K TPS</p>\n<p><img src=\"./sources/images/50ktps.png\" alt=\"50ktps.png\"></p>\n<p>50K Response</p>\n<p><img src=\"./sources/images/50kres.png\" alt=\"50kres.png\"></p>\n<h3>Scene name: scence 200k string</h3>\n<table>\n<thead>\n<tr>\n<th>TPS success avg value</th>\n<th>Response time avg value(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2 serialization+mina)</td>\n<td>324.2</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2 serialization+netty)</td>\n<td>362.92</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo serialization+netty)</td>\n<td>569.5</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1031.28</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>628.06</td>\n</tr>\n<tr>\n<td>http(json serialization)</td>\n<td>1011.97</td>\n</tr>\n<tr>\n<td>The default percentage of 2.0 and 1.0</td>\n<td>11.94</td>\n</tr>\n<tr>\n<td>Dubbo serialization compared to the percentage of hessian2 serialization</td>\n<td>56.92</td>\n</tr>\n</tbody>\n</table>\n<p>200K TPS</p>\n<p><img src=\"./sources/images/200ktps.png\" alt=\"200ktps.png\"></p>\n<p><strong>200K Response</strong></p>\n<p><img src=\"./sources/images/200kres.png\" alt=\"200kres.png\"></p>\n<h2>Test analysis</h2>\n<h3>Performance analysis and evaluation</h3>\n<p>The performance test conclusion of Dubbo 2 has been improved and improved from performance, memory footprint and stability. Because of its memory management, the change of Mina into netty greatly reduces the 1 version of the large memory sawtooth in high concurrency and large data.</p>\n<h3>Performance comparison analysis (new and old environment, different data magnitude, etc.)</h3>\n<p>The performance of Dubbo 2 is compared with that of Dubbo 1, which is all hessian2 serialization. The performance is improved (except for 50K String). See the performance data of the fifth chapter in detail.</p>\n<p>For compatibility default serialization and 1 consistent with hessian2, such as have higher requirements on the performance of Dubbo serialization can be used, which is in the process of complicated object, can be obtained in 50% large data upgrade (but it is not recommended for use Dubbo protocol).</p>\n<p>The purpose of Dubbo is to meet the RPC calls with high concurrent and small data volume. The performance is not good under large data volume. It is recommended to use RMI or HTTP protocol.</p>\n<h3>Test limitation analysis (optional)</h3>\n<p>This performance test examines the performance of the Dubbo itself, and the performance of the actual use needs to be verified.</p>\n<p>Because the performance of Dubbo itself is in millisecond and the base number is small, performance improvement may not change the performance of the application as a whole.</p>\n<p>All the monitoring charts are not listed because of the limit of length.</p>\n",
+  "link": "/en-us/docs/user/perf-test.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/preface/architecture.json b/en-us/docs/user/preface/architecture.json
index 831ddb0e..ebafde92 100644
--- a/en-us/docs/user/preface/architecture.json
+++ b/en-us/docs/user/preface/architecture.json
@@ -1,4 +1,6 @@
 {
   "filename": "architecture.md",
-  "__html": "<h1>Architecture</h1>\n<p><img src=\"../sources/images/dubbo-architecture.jpg\" alt=\"dubbo-architucture\"></p>\n<h5>Specification of Node's Role</h5>\n<table>\n<thead>\n<tr>\n<th>Node</th>\n<th>Role Spec</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Provider</code></td>\n<td>The provider exposes remote services</td>\n</tr>\n<tr>\n<td><code>Consumer</code></td>\n<td>The consumer calls the remote services</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>The registry is responsible for service discovery and configuration</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>The monitor counts the number of service invocations and time-consuming</td>\n</tr>\n<tr>\n<td><code>Container</code></td>\n<td>The container manages the services's lifetime</td>\n</tr>\n</tbody>\n</table>\n<h5>Service relationship</h5>\n<ol start=\"0\">\n<li><code>Container</code> is responsible for launching, loading, and running the service <code>Provider</code>.</li>\n<li><code>Provider</code> registers its services to <code>Register</code> at the time it starts.</li>\n<li><code>Consumer</code> subscribes the services it needs from the <code>Register</code> when it starts.</li>\n<li><code>Register</code> returns the <code>Provider</code>s list to <code>Consumer</code>, when it changes, the <code>Register</code> will push the changed data to <code>Consumer</code> through long connection.</li>\n<li><code>Consumer</code> selects one of the <code>Provider</code>s based on soft load balancing algorithm and executes the invocation, if fails, it will choose another <code>Provider</code>.</li>\n<li>Both <code>Consumer</code> and <code>Provider</code> will count the number service invocations and time-consuming in memory, and send the statistics to <code>Monitor</code> every minute.</li>\n</ol>\n<p>Dubbo has the following features: Connectivity, Robustness, Scalability and Upgradeability.</p>\n<h2>Connectivity</h2>\n<ul>\n<li><code>Register</code> is responsible for the registration and search of service addresses, like directory services, <code>Provider</code> and <code>Consumer</code> only interact with the registry during startup, and the registry does not forward requests, so it is less stressed</li>\n<li>'Monitor' is responsible for counting the number of service invocations and time-consuming, the statistics will assembles in <code>Provider</code>'s and <code>Consumer</code>'s memory first and  then sent to <code>Monitor</code></li>\n<li>'Provider' registers services to 'Register' and report time-consuming statistic(not include network overhead) to 'Monitor'</li>\n<li>'Consumer' gets a list of service provider addresses from <code>Registry</code>, call the provider directly according to the LB algorithm, report the time-consuming statistic to <code>Monitor</code>, which includes network overhead</li>\n<li>The connections between <code>Register</code>, <code>Provider</code> and <code>Consumer</code> are long connections, <code>Moniter</code> is an exception</li>\n<li><code>Register</code> is aware of the existence of <code>Provider</code> through the long connection, when <code>Provider</code> gets down, <code>Provider</code> will push the event to <code>Consumer</code></li>\n<li>It doesn't affect the already running instances of <code>Provider</code> and <code>Consumer</code> even all of the <code>Register</code> and <code>Monitor</code> get down, since <code>Consumer</code> got a cache of <code>Provider</code>s list</li>\n<li><code>Register</code> and <code>Monitor</code> are optional, <code>Consumer</code> can connect <code>Provider</code> directly</li>\n</ul>\n<h2>Robustness</h2>\n<ul>\n<li><code>Monitor</code>'s downtime doesn't affect the usage, only lose some sampling data</li>\n<li>When the DB server goes down, <code>Register</code> can return service <code>Provider</code>s list to <code>Consumer</code> by checking its cache, but new <code>Provider</code> cannot regiter any services</li>\n<li><code>Register</code> is a peer cluster, it will automatically switch to another when any instance goes down</li>\n<li>Even all <code>Register</code>'s instances go down, <code>Provider</code> and <code>Consumer</code> can still conmunicate by checking their local cache</li>\n<li>Service <code>Provider</code>s are stateless, one instance's downtime doesn't affect the usage</li>\n<li>After all the <code>Provider</code>s of one service go down, <code>Consumer</code> can not use the that service, and infinitely reconnect to wait for service <code>Provider</code> to recover</li>\n</ul>\n<h2>Scalability</h2>\n<ul>\n<li><code>Register</code> is a peer cluster that can dynamically increases its instances,  all clients will automatically discover the new instances.</li>\n<li><code>Provider</code> is stateless, it can dynamically increases the deployment instances, and the registry will push the new service provider information to the <code>Consumer</code>.</li>\n</ul>\n<h2>Upgradeablity</h2>\n<p>When the service cluster is further expanded and the IT governance structure is further upgraded, dynamic deployment is needed, and the current distributed service architecture will not bring resistance. Here is a possible future architecture:</p>\n<p><img src=\"../sources/images/dubbo-architecture-future.jpg\" alt=\"dubbo-architucture-futures\"></p>\n<h5>Specification of Node's Role</h5>\n<table>\n<thead>\n<tr>\n<th>Node</th>\n<th>Role Spec</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Deployer</code></td>\n<td>Local proxy for automatic services deployment</td>\n</tr>\n<tr>\n<td><code>Repository</code></td>\n<td>The repository is used to store application packages</td>\n</tr>\n<tr>\n<td><code>Scheduler</code></td>\n<td>The scheduler automatically increases or decreases service providers based on the access pressure</td>\n</tr>\n<tr>\n<td><code>Admin</code></td>\n<td>Unified management console</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>the registry is responsible for service discovery and configuration</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>The monitor counts the service call times and time-consuming</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<h1>Architecture</h1>\n<p><img src=\"../sources/images/dubbo-architecture.jpg\" alt=\"dubbo-architucture\"></p>\n<h5>Specification of Node's Role</h5>\n<table>\n<thead>\n<tr>\n<th>Node</th>\n<th>Role Spec</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Provider</code></td>\n<td>The provider exposes remote services</td>\n</tr>\n<tr>\n<td><code>Consumer</code></td>\n<td>The consumer calls the remote services</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>The registry is responsible for service discovery and configuration</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>The monitor counts the number of service invocations and time-consuming</td>\n</tr>\n<tr>\n<td><code>Container</code></td>\n<td>The container manages the services's lifetime</td>\n</tr>\n</tbody>\n</table>\n<h5>Service relationship</h5>\n<ol start=\"0\">\n<li><code>Container</code> is responsible for launching, loading, and running the service <code>Provider</code>.</li>\n<li><code>Provider</code> registers its services to <code>Register</code> at the time it starts.</li>\n<li><code>Consumer</code> subscribes the services it needs from the <code>Register</code> when it starts.</li>\n<li><code>Register</code> returns the <code>Provider</code>s list to <code>Consumer</code>, when it changes, the <code>Register</code> will push the changed data to <code>Consumer</code> through long connection.</li>\n<li><code>Consumer</code> selects one of the <code>Provider</code>s based on soft load balancing algorithm and executes the invocation, if fails, it will choose another <code>Provider</code>.</li>\n<li>Both <code>Consumer</code> and <code>Provider</code> will count the number service invocations and time-consuming in memory, and send the statistics to <code>Monitor</code> every minute.</li>\n</ol>\n<p>Dubbo has the following features: Connectivity, Robustness, Scalability and Upgradeability.</p>\n<h2>Connectivity</h2>\n<ul>\n<li><code>Register</code> is responsible for the registration and search of service addresses, like directory services, <code>Provider</code> and <code>Consumer</code> only interact with the registry during startup, and the registry does not forward requests, so it is less stressed</li>\n<li>'Monitor' is responsible for counting the number of service invocations and time-consuming, the statistics will assembles in <code>Provider</code>'s and <code>Consumer</code>'s memory first and  then sent to <code>Monitor</code></li>\n<li>'Provider' registers services to 'Register' and report time-consuming statistic(not include network overhead) to 'Monitor'</li>\n<li>'Consumer' gets a list of service provider addresses from <code>Registry</code>, call the provider directly according to the LB algorithm, report the time-consuming statistic to <code>Monitor</code>, which includes network overhead</li>\n<li>The connections between <code>Register</code>, <code>Provider</code> and <code>Consumer</code> are long connections, <code>Moniter</code> is an exception</li>\n<li><code>Register</code> is aware of the existence of <code>Provider</code> through the long connection, when <code>Provider</code> gets down, <code>Provider</code> will push the event to <code>Consumer</code></li>\n<li>It doesn't affect the already running instances of <code>Provider</code> and <code>Consumer</code> even all of the <code>Register</code> and <code>Monitor</code> get down, since <code>Consumer</code> got a cache of <code>Provider</code>s list</li>\n<li><code>Register</code> and <code>Monitor</code> are optional, <code>Consumer</code> can connect <code>Provider</code> directly</li>\n</ul>\n<h2>Robustness</h2>\n<ul>\n<li><code>Monitor</code>'s downtime doesn't affect the usage, only lose some sampling data</li>\n<li>When the DB server goes down, <code>Register</code> can return service <code>Provider</code>s list to <code>Consumer</code> by checking its cache, but new <code>Provider</code> cannot regiter any services</li>\n<li><code>Register</code> is a peer cluster, it will automatically switch to another when any instance goes down</li>\n<li>Even all <code>Register</code>'s instances go down, <code>Provider</code> and <code>Consumer</code> can still conmunicate by checking their local cache</li>\n<li>Service <code>Provider</code>s are stateless, one instance's downtime doesn't affect the usage</li>\n<li>After all the <code>Provider</code>s of one service go down, <code>Consumer</code> can not use the that service, and infinitely reconnect to wait for service <code>Provider</code> to recover</li>\n</ul>\n<h2>Scalability</h2>\n<ul>\n<li><code>Register</code> is a peer cluster that can dynamically increases its instances,  all clients will automatically discover the new instances.</li>\n<li><code>Provider</code> is stateless, it can dynamically increases the deployment instances, and the registry will push the new service provider information to the <code>Consumer</code>.</li>\n</ul>\n<h2>Upgradeablity</h2>\n<p>When the service cluster is further expanded and the IT governance structure is further upgraded, dynamic deployment is needed, and the current distributed service architecture will not bring resistance. Here is a possible future architecture:</p>\n<p><img src=\"../sources/images/dubbo-architecture-future.jpg\" alt=\"dubbo-architucture-futures\"></p>\n<h5>Specification of Node's Role</h5>\n<table>\n<thead>\n<tr>\n<th>Node</th>\n<th>Role Spec</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Deployer</code></td>\n<td>Local proxy for automatic services deployment</td>\n</tr>\n<tr>\n<td><code>Repository</code></td>\n<td>The repository is used to store application packages</td>\n</tr>\n<tr>\n<td><code>Scheduler</code></td>\n<td>The scheduler automatically increases or decreases service providers based on the access pressure</td>\n</tr>\n<tr>\n<td><code>Admin</code></td>\n<td>Unified management console</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>the registry is responsible for service discovery and configuration</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>The monitor counts the service call times and time-consuming</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/preface/architecture.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/preface/background.json b/en-us/docs/user/preface/background.json
index 33aa0392..80de0712 100644
--- a/en-us/docs/user/preface/background.json
+++ b/en-us/docs/user/preface/background.json
@@ -1,4 +1,6 @@
 {
   "filename": "background.md",
-  "__html": "<h1>Background</h1>\n<p>With the fast development of Internet, the scale of web applications expands unceasingly, and finally we find that the traditional vertical architecture(monolithic) can not handle this any more. Distributed service architecture and the flow computing architecture are imperative, and a governance system is urgently needed to ensure an orderly evolution of the architecture.</p>\n<p><img src=\"../sources/images/dubbo-architecture-roadmap.jpg\" alt=\"image\"></p>\n<h4>Monolithic architecture</h4>\n<p>When the traffic is very low, there is only one application, all the features are deployed together to reduce the deployment node and cost. At this point, the data access framework (ORM) is the key to simplifying the workload of the CRUD.</p>\n<h4>Vertical architecture</h4>\n<p>When the traffic gets heavier, add monolithic application instances can not accelerate the access very well, one way to improve efficiency is to split the monolithic into discrete applications. At this point, the Web framework (MVC) used to accelerate front-end page development is the key.</p>\n<h4>Distributed service architecture</h4>\n<p>When there are more and more vertical applications, the interaction between applications is inevitable, some core businesses are extracted and served as independent services, which gradually forms a stable service center,this way the front-end application can respond to the changeable market demand more quickly. At this point, the distributed service framework (RPC) for business reuse and integration is the key.</p>\n<h4>Flow computing architecture</h4>\n<p>When there are more and more services, capacity evaluation becomes difficult, and also services with small scales often causes waste of resources. To solve these problems, a scheduling center should be added to manage the cluster capacity based on traffics and to improve the utilization of the cluster. At this time, the resource scheduling and governance centers (SOA), which are used to improve machine utilization, are the keys.</p>\n"
+  "__html": "<h1>Background</h1>\n<p>With the fast development of Internet, the scale of web applications expands unceasingly, and finally we find that the traditional vertical architecture(monolithic) can not handle this any more. Distributed service architecture and the flow computing architecture are imperative, and a governance system is urgently needed to ensure an orderly evolution of the architecture.</p>\n<p><img src=\"../sources/images/dubbo-architecture-roadmap.jpg\" alt=\"image\"></p>\n<h4>Monolithic architecture</h4>\n<p>When the traffic is very low, there is only one application, all the features are deployed together to reduce the deployment node and cost. At this point, the data access framework (ORM) is the key to simplifying the workload of the CRUD.</p>\n<h4>Vertical architecture</h4>\n<p>When the traffic gets heavier, add monolithic application instances can not accelerate the access very well, one way to improve efficiency is to split the monolithic into discrete applications. At this point, the Web framework (MVC) used to accelerate front-end page development is the key.</p>\n<h4>Distributed service architecture</h4>\n<p>When there are more and more vertical applications, the interaction between applications is inevitable, some core businesses are extracted and served as independent services, which gradually forms a stable service center,this way the front-end application can respond to the changeable market demand more quickly. At this point, the distributed service framework (RPC) for business reuse and integration is the key.</p>\n<h4>Flow computing architecture</h4>\n<p>When there are more and more services, capacity evaluation becomes difficult, and also services with small scales often causes waste of resources. To solve these problems, a scheduling center should be added to manage the cluster capacity based on traffics and to improve the utilization of the cluster. At this time, the resource scheduling and governance centers (SOA), which are used to improve machine utilization, are the keys.</p>\n",
+  "link": "/en-us/docs/user/preface/background.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/preface/index.json b/en-us/docs/user/preface/index.json
index f0ea2a7c..6f386e37 100644
--- a/en-us/docs/user/preface/index.json
+++ b/en-us/docs/user/preface/index.json
@@ -1,4 +1,6 @@
 {
   "filename": "index.md",
-  "__html": "<h1>Introduction</h1>\n"
+  "__html": "<h1>Introduction</h1>\n",
+  "link": "/en-us/docs/user/preface/index.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/preface/requirements.json b/en-us/docs/user/preface/requirements.json
index 4543c5bc..76caefc3 100644
--- a/en-us/docs/user/preface/requirements.json
+++ b/en-us/docs/user/preface/requirements.json
@@ -1,4 +1,6 @@
 {
   "filename": "requirements.md",
-  "__html": "<h1>Requirements</h1>\n<p><img src=\"../sources/images/dubbo-service-governance.jpg\" alt=\"image\"></p>\n<p>Before the advent of large-scare services, an application might just exposes or references remote service by using RMI or Hessian, the call is done by configuring serive URL, and load balance is done through hardwares, like F5.</p>\n<p><strong>When there are more and more services, it becomes very difficult to configure the service URL, the single point pressure of F5 hardware load balancer is also increasing.</strong> At this point, a service registry is needed to dynamically register and discover services to make the service's location transparent. By obtaining the list of service provider addresses in the consumer side, the soft load balancing and Failover can be realized, this reduces the dependence on the F5 hardware load balacer and some of the costs.</p>\n<p><strong>When things go further, the service dependencies become so complex that it can't even tell which applications to start before, even the architect can't fully describe the application architecture relationships</strong>. At this time, automatically draw the dependency diagram of the applications is needed to help the architect to be clear of the relationship.</p>\n<p><strong>Then, the traffic becomes even heavier, the capacity problem of the service is exposed, how many machines are needed to support this service? When should the machine be added?</strong> To solve these problems, first, the daily service calls and the amount of response time should be counted as a reference for capacity planning. Second, dynamically adjust the weight, increase the weight of an online machine, and recorded the response time changes until it reaches the threshold, record the visits times at this time, then multiply this number of visits by the total number of machines to calculate the capacity in turn.</p>\n<p>Above are the most basic requirements of Dubbo.</p>\n"
+  "__html": "<h1>Requirements</h1>\n<p><img src=\"../sources/images/dubbo-service-governance.jpg\" alt=\"image\"></p>\n<p>Before the advent of large-scare services, an application might just exposes or references remote service by using RMI or Hessian, the call is done by configuring serive URL, and load balance is done through hardwares, like F5.</p>\n<p><strong>When there are more and more services, it becomes very difficult to configure the service URL, the single point pressure of F5 hardware load balancer is also increasing.</strong> At this point, a service registry is needed to dynamically register and discover services to make the service's location transparent. By obtaining the list of service provider addresses in the consumer side, the soft load balancing and Failover can be realized, this reduces the dependence on the F5 hardware load balacer and some of the costs.</p>\n<p><strong>When things go further, the service dependencies become so complex that it can't even tell which applications to start before, even the architect can't fully describe the application architecture relationships</strong>. At this time, automatically draw the dependency diagram of the applications is needed to help the architect to be clear of the relationship.</p>\n<p><strong>Then, the traffic becomes even heavier, the capacity problem of the service is exposed, how many machines are needed to support this service? When should the machine be added?</strong> To solve these problems, first, the daily service calls and the amount of response time should be counted as a reference for capacity planning. Second, dynamically adjust the weight, increase the weight of an online machine, and recorded the response time changes until it reaches the threshold, record the visits times at this time, then multiply this number of visits by the total number of machines to calculate the capacity in turn.</p>\n<p>Above are the most basic requirements of Dubbo.</p>\n",
+  "link": "/en-us/docs/user/preface/requirements.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/preface/usage.json b/en-us/docs/user/preface/usage.json
index 0a38ab46..0f843c25 100644
--- a/en-us/docs/user/preface/usage.json
+++ b/en-us/docs/user/preface/usage.json
@@ -1,4 +1,6 @@
 {
   "filename": "usage.md",
-  "__html": "<h1>Usage</h1>\n<h2>Spring configuration of local service</h2>\n<p>local.xml:</p>\n<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\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n<h2>Spring configuration of remote service</h2>\n<p>The remote configuration can be done by very little change based on the local configuration:</p>\n<ul>\n<li>split the <code>local.xml</code> into two part, put the service define part into <code>remote-privider.xml</code>(exists in the provider node), meanwhile the refrence part into <code>remote-consumer.xml</code>(exists in the consumer node).</li>\n<li>add <code>&lt;dubbo:service&gt;</code> to the provider's configuration, and <code>&lt;dubbo:reference&gt;</code> to the consumer's configuration.</li>\n</ul>\n<p>remote-provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- define remote service bean the same way as local service bean --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- expose the remote service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span> \n</code></pre>\n<p>remote-consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- reference the remote service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- use remote service the same say as local service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span> \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Usage</h1>\n<h2>Spring configuration of local service</h2>\n<p>local.xml:</p>\n<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\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n<h2>Spring configuration of remote service</h2>\n<p>The remote configuration can be done by very little change based on the local configuration:</p>\n<ul>\n<li>split the <code>local.xml</code> into two part, put the service define part into <code>remote-privider.xml</code>(exists in the provider node), meanwhile the refrence part into <code>remote-consumer.xml</code>(exists in the consumer node).</li>\n<li>add <code>&lt;dubbo:service&gt;</code> to the provider's configuration, and <code>&lt;dubbo:reference&gt;</code> to the consumer's configuration.</li>\n</ul>\n<p>remote-provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- define remote service bean the same way as local service bean --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- expose the remote service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span> \n</code></pre>\n<p>remote-consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- reference the remote service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- use remote service the same say as local service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span> \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/preface/usage.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/quick-start.json b/en-us/docs/user/quick-start.json
index 2521efe8..8c3bafcf 100644
--- a/en-us/docs/user/quick-start.json
+++ b/en-us/docs/user/quick-start.json
@@ -1,4 +1,6 @@
 {
   "filename": "quick-start.md",
-  "__html": "<h1>Quick start</h1>\n<p>The most common way to use Dubbo is to run it in Spring framework. The following content will guide you to develop a Dubbo application with Spring framework's <a href=\"https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/xsd-configuration.html\">XML configuration</a>.</p>\n<p>If you don't want to rely on Spring, you can try using <a href=\"./configuration/api.md\">API configuration</a>.</p>\n<p>First let's create a root directory called dubbo-demo:</p>\n<pre><code>mkdir dubbo-demo\ncd dubbo-demo\n</code></pre>\n<p>Next, we are going to create 3 sub-directories under root directory:</p>\n<ul>\n<li>dubbo-demo-api: the common service api</li>\n<li>dubbo-demo-provider: the demo provider codes</li>\n<li>dubbo-demo-consumer: the demo consumer codes</li>\n</ul>\n<h2>Service provider</h2>\n<h3>Defining service interfaces</h3>\n<p>DemoService.java <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.demo;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">DemoService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n\n}\n</code></pre>\n<p>The proejct structure should look like this:</p>\n<pre><code>.\n├── dubbo-demo-api\n│   ├── pom.xml\n│   └── src\n│       └── main\n│           └── java\n│               └── org\n│                   └── apache\n│                       └── dubbo\n│                           └── demo\n│                               └── DemoService.java\n</code></pre>\n<h3>Implement interface in service provider</h3>\n<p>DemoServiceImpl.java <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.demo.provider;\n<span class=\"hljs-keyword\">import</span> org.apache.dubbo.demo.DemoService;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<h3>Exposing service with Spring configuration</h3>\n<p>provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- provider's application name, used for tracing dependency relationship --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- use multicast registry center to export service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- use dubbo protocol to export service on port 20880 --&gt;</span>\n    <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\">\"20880\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service implementation, as same as regular local bean --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.provider.DemoServiceImpl\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- declare the service interface to be exported --&gt;</span>\n    <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.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>The demo uses multicast as the registry since it is simple and does not require to extra installation.\nIf you prefer a registiry like zookeeper, please check out examples <a href=\"https://github.com/dubbo/dubbo-samples\">here</a>.</p>\n<h3>Configure the logging system</h3>\n<p>Dubbo use log4j as logging system by default, it also support slf4j, Apache Commons Logging, and JUL logging.</p>\n<p>Following is a sample configuration:</p>\n<p>log4j.properties</p>\n<pre><code>###set log levels###\nlog4j.rootLogger=info, stdout\n###output to the console###\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.Target=System.out\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n\n</code></pre>\n<h3>Bootstrap the service provider</h3>\n<p>Provider.java</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.demo.provider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Provider</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        System.setProperty(<span class=\"hljs-string\">\"java.net.preferIPv4Stack\"</span>, <span class=\"hljs-string\">\"true\"</span>);\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-string\">\"META-INF/spring/dubbo-demo-provider.xml\"</span>});\n        context.start();\n        System.out.println(<span class=\"hljs-string\">\"Provider started.\"</span>);\n        System.in.read(); <span class=\"hljs-comment\">// press any key to exit</span>\n    }\n}\n</code></pre>\n<p>Finally, the project structure should look like this:</p>\n<pre><code>├── dubbo-demo-provider\n│   ├── pom.xml\n│   └── src\n│       └── main\n│           ├── java\n│           │   └── org\n│           │       └── apache\n│           │           └── dubbo\n│           │               └── demo\n│           │                   └── provider\n│           │                       ├── DemoServiceImpl.java\n│           │                       └── Provider.java\n│           └── resources\n│               ├── META-INF\n│               │   └── spring\n│               │       └── dubbo-demo-provider.xml\n│               └── log4j.properties\n</code></pre>\n<h2>Service consumer</h2>\n<p>Complete installation steps, see:<a href=\"../admin/install/consumer-demo.md\">Consumer demo installation</a></p>\n<h3>Using the Spring configuration to reference a remote service</h3>\n<p>consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),\n    don't set it same as provider --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-consumer\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- use multicast registry center to discover service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- generate proxy for the remote service, then demoService can be used in the same way as the\n    local regular interface --&gt;</span>\n    <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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.DemoService\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>Bootstrap the consumer</h3>\n<p>Consumer.java <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n<span class=\"hljs-keyword\">import</span> org.apache.dubbo.demo.DemoService;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Consumer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"META-INF/spring/dubbo-demo-consumer.xml\"</span>});\n        context.start();\n        <span class=\"hljs-comment\">// Obtaining a remote service proxy</span>\n        DemoService demoService = (DemoService)context.getBean(<span class=\"hljs-string\">\"demoService\"</span>);\n        <span class=\"hljs-comment\">// Executing remote methods</span>\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span>);\n        <span class=\"hljs-comment\">// Display the call result</span>\n        System.out.println(hello);\n    }\n}\n</code></pre>\n<h3>Config the logging system</h3>\n<p>This is the same as how to config it on provider side.</p>\n<p>Finally, the project structure should be look like this:</p>\n<pre><code>├── dubbo-demo-consumer\n│   ├── pom.xml\n│   └── src\n│       └── main\n│           ├── java\n│           │   └── org\n│           │       └── apache\n│           │           └── dubbo\n│           │               └── demo\n│           │                   └── consumer\n│           │                       └── Consumer.java\n│           └── resources\n│               ├── META-INF\n│               │   └── spring\n│               │       └── dubbo-demo-consumer.xml\n│               └── log4j.properties\n</code></pre>\n<h2>Start the demo</h2>\n<h3>Start service provider</h3>\n<p>Run the <code>org.apache.dubbo.demo.provider.Provider</code> class to start the provider.</p>\n<h3>Start service consumer</h3>\n<p>Run the <code>org.apache.dubbo.demo.provider.Consumer</code> class to start the consumer, and you should be able to see the following result:</p>\n<pre><code>Hello world\n</code></pre>\n<h2>Complete example</h2>\n<p>You can find the complete example code in the Github repository.</p>\n<ul>\n<li><a href=\"../admin/install/provider-demo.md\">Provider demo</a></li>\n<li><a href=\"../admin/install/consumer-demo.md\">Consumer demo</a></li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>The interface needs to be packaged separately, shared by the service provider and the consumer <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Hidden realization of service consumer <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>IoC injection can also be used <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Quick start</h1>\n<p>The most common way to use Dubbo is to run it in Spring framework. The following content will guide you to develop a Dubbo application with Spring framework's <a href=\"https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/xsd-configuration.html\">XML configuration</a>.</p>\n<p>If you don't want to rely on Spring, you can try using <a href=\"./configuration/api.md\">API configuration</a>.</p>\n<p>First let's create a root directory called dubbo-demo:</p>\n<pre><code>mkdir dubbo-demo\ncd dubbo-demo\n</code></pre>\n<p>Next, we are going to create 3 sub-directories under root directory:</p>\n<ul>\n<li>dubbo-demo-api: the common service api</li>\n<li>dubbo-demo-provider: the demo provider codes</li>\n<li>dubbo-demo-consumer: the demo consumer codes</li>\n</ul>\n<h2>Service provider</h2>\n<h3>Defining service interfaces</h3>\n<p>DemoService.java <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.demo;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">DemoService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n\n}\n</code></pre>\n<p>The proejct structure should look like this:</p>\n<pre><code>.\n├── dubbo-demo-api\n│   ├── pom.xml\n│   └── src\n│       └── main\n│           └── java\n│               └── org\n│                   └── apache\n│                       └── dubbo\n│                           └── demo\n│                               └── DemoService.java\n</code></pre>\n<h3>Implement interface in service provider</h3>\n<p>DemoServiceImpl.java <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.demo.provider;\n<span class=\"hljs-keyword\">import</span> org.apache.dubbo.demo.DemoService;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<h3>Exposing service with Spring configuration</h3>\n<p>provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- provider's application name, used for tracing dependency relationship --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- use multicast registry center to export service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- use dubbo protocol to export service on port 20880 --&gt;</span>\n    <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\">\"20880\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service implementation, as same as regular local bean --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.provider.DemoServiceImpl\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- declare the service interface to be exported --&gt;</span>\n    <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.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>The demo uses multicast as the registry since it is simple and does not require to extra installation.\nIf you prefer a registiry like zookeeper, please check out examples <a href=\"https://github.com/dubbo/dubbo-samples\">here</a>.</p>\n<h3>Configure the logging system</h3>\n<p>Dubbo use log4j as logging system by default, it also support slf4j, Apache Commons Logging, and JUL logging.</p>\n<p>Following is a sample configuration:</p>\n<p>log4j.properties</p>\n<pre><code>###set log levels###\nlog4j.rootLogger=info, stdout\n###output to the console###\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.Target=System.out\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n\n</code></pre>\n<h3>Bootstrap the service provider</h3>\n<p>Provider.java</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.demo.provider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Provider</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        System.setProperty(<span class=\"hljs-string\">\"java.net.preferIPv4Stack\"</span>, <span class=\"hljs-string\">\"true\"</span>);\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-string\">\"META-INF/spring/dubbo-demo-provider.xml\"</span>});\n        context.start();\n        System.out.println(<span class=\"hljs-string\">\"Provider started.\"</span>);\n        System.in.read(); <span class=\"hljs-comment\">// press any key to exit</span>\n    }\n}\n</code></pre>\n<p>Finally, the project structure should look like this:</p>\n<pre><code>├── dubbo-demo-provider\n│   ├── pom.xml\n│   └── src\n│       └── main\n│           ├── java\n│           │   └── org\n│           │       └── apache\n│           │           └── dubbo\n│           │               └── demo\n│           │                   └── provider\n│           │                       ├── DemoServiceImpl.java\n│           │                       └── Provider.java\n│           └── resources\n│               ├── META-INF\n│               │   └── spring\n│               │       └── dubbo-demo-provider.xml\n│               └── log4j.properties\n</code></pre>\n<h2>Service consumer</h2>\n<p>Complete installation steps, see:<a href=\"../admin/install/consumer-demo.md\">Consumer demo installation</a></p>\n<h3>Using the Spring configuration to reference a remote service</h3>\n<p>consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),\n    don't set it same as provider --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-consumer\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- use multicast registry center to discover service --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- generate proxy for the remote service, then demoService can be used in the same way as the\n    local regular interface --&gt;</span>\n    <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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.DemoService\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>Bootstrap the consumer</h3>\n<p>Consumer.java <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n<span class=\"hljs-keyword\">import</span> org.apache.dubbo.demo.DemoService;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Consumer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"META-INF/spring/dubbo-demo-consumer.xml\"</span>});\n        context.start();\n        <span class=\"hljs-comment\">// Obtaining a remote service proxy</span>\n        DemoService demoService = (DemoService)context.getBean(<span class=\"hljs-string\">\"demoService\"</span>);\n        <span class=\"hljs-comment\">// Executing remote methods</span>\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span>);\n        <span class=\"hljs-comment\">// Display the call result</span>\n        System.out.println(hello);\n    }\n}\n</code></pre>\n<h3>Config the logging system</h3>\n<p>This is the same as how to config it on provider side.</p>\n<p>Finally, the project structure should be look like this:</p>\n<pre><code>├── dubbo-demo-consumer\n│   ├── pom.xml\n│   └── src\n│       └── main\n│           ├── java\n│           │   └── org\n│           │       └── apache\n│           │           └── dubbo\n│           │               └── demo\n│           │                   └── consumer\n│           │                       └── Consumer.java\n│           └── resources\n│               ├── META-INF\n│               │   └── spring\n│               │       └── dubbo-demo-consumer.xml\n│               └── log4j.properties\n</code></pre>\n<h2>Start the demo</h2>\n<h3>Start service provider</h3>\n<p>Run the <code>org.apache.dubbo.demo.provider.Provider</code> class to start the provider.</p>\n<h3>Start service consumer</h3>\n<p>Run the <code>org.apache.dubbo.demo.provider.Consumer</code> class to start the consumer, and you should be able to see the following result:</p>\n<pre><code>Hello world\n</code></pre>\n<h2>Complete example</h2>\n<p>You can find the complete example code in the Github repository.</p>\n<ul>\n<li><a href=\"../admin/install/provider-demo.md\">Provider demo</a></li>\n<li><a href=\"../admin/install/consumer-demo.md\">Consumer demo</a></li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>The interface needs to be packaged separately, shared by the service provider and the consumer <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Hidden realization of service consumer <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>IoC injection can also be used <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/quick-start.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/recommend.json b/en-us/docs/user/recommend.json
index bb28661a..243fec63 100644
--- a/en-us/docs/user/recommend.json
+++ b/en-us/docs/user/recommend.json
@@ -1,4 +1,6 @@
 {
   "filename": "recommend.md",
-  "__html": "<h1>Recommended usage</h1>\n<h2>Configuring the attributes of the consumer side as much as possible on the provider side</h2>\n<p>the reason is:</p>\n<ul>\n<li>Service providers are more aware of service performance parameters than service users,Such as the timeout time of the call, the reasonable retry times, and so on.</li>\n<li>If  a attribute is configurated in provider side,  not configurated in consumer side,  consumer service will use the attribute in provider side. That is to say, the provider side's attribute can be used as consumer's default value <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>. Otherwise, consumer service will use consumer-side's attribute,but can't cnotrol the provider service,it's usually unreasonable.</li>\n</ul>\n<p>Configuring the attributes of the consumer side as much as possible on the provider side,Make the provider service developer think more about the characteristics and quality of the provider side service.</p>\n<p>Examples:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"300\"</span> <span class=\"hljs-attr\">retry</span>=<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"random\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"0\"</span>\n/&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.WorldService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"300\"</span> <span class=\"hljs-attr\">retry</span>=<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"random\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"0\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findAllPerson\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"10000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"5\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>/&gt;</span>\n</code></pre>\n<p>The consumer side properties that can be configured on provider are:</p>\n<ol start=\"0\">\n<li><code>timeout</code> Method call timeout</li>\n<li><code>retries</code> The number of failed retries, default value is 1 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></li>\n<li><code>loadbalance</code> Load balance algorithm <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,default algorithm is random <code>random</code>,and polling <code>roundrobin</code>、least active <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> <code>leastactive</code></li>\n<li><code>actives</code> Consumer side, maximum concurrent call limitation. That is , when the concurrent requests of consumer service reach maximum  configuration,the new call will wait until to catch a timeout error.\nConfigurated in  <code>dubbo:method</code>(method level configuration) , then the concurrent limitation point at method.Configurated in <code>dubbo:service</code>(service level configuration),then the concurrent limitation point at service.</li>\n</ol>\n<p>Detailed configuration instructions see:<a href=\"./references/xml/introduction.md\">Dubbo configuration introduction</a></p>\n<h2>Configuring reasonable provider end properties on provider</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"200\"</span> /&gt;</span> \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"200\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findAllPerson\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"50\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>The provider side properties that can be configured on provider service are:</p>\n<ol start=\"0\">\n<li><code>threads</code> service thread pool size</li>\n<li><code>executes</code> If concurrent requests number that a provider service handled reach the maximum thead pool count , the new call will wait,then the consumer call may catch a timeout error. Configurated in  <code>dubbo:method</code>(method level configuration) , then the concurrent limitation point at method.Configurated in <code>dubbo:service</code>(service level configuration),then the concurrent limitation point at service.</li>\n</ol>\n<h2>Configuration management information</h2>\n<p>Now we have the owner information and organization infomation to differentiate the sites。It's easy to contact with the service owners when there is a problem, please write at least two persons for backup. The information of owners and organizations can be seen in the registry.</p>\n<p>application configuration owners,organizations:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> <span class=\"hljs-attr\">organization</span>=<span class=\"hljs-string\">”intl”</span> /&gt;</span>\n</code></pre>\n<p>service configuration owners:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> /&gt;</span>\n</code></pre>\n<p>reference configuration owners:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> /&gt;</span>\n</code></pre>\n<p><code>dubbo:service</code>、<code>dubbo:reference</code> have no configuration owner, then use the owner configured in <code>dubbo:application</code>.</p>\n<h2>Set up the Dubbo cache file</h2>\n<p>Provider service list caching file:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">file</span>=<span class=\"hljs-string\">”${user.home}/output/dubbo.cache”</span> /&gt;</span>\n</code></pre>\n<p>Notations:</p>\n<ol start=\"0\">\n<li>You can modify  the cahe file path of the application according to the needs. Ensure that the file will not be cleared during the release process.</li>\n<li>If there are more than one application process, do not use the same file path to avoid the content being overwritten.</li>\n</ol>\n<p>This file caches the list of the registry and the list of service providers. With this configuration, when the application is restarted , if  the Dubbo registry is not available, the application will read the information from the service provider list from the cache file. That can ensure the availability of the application.</p>\n<h2>Monitor configuration</h2>\n<ol start=\"0\">\n<li>\n<p>Expose service with a fixed port, instead of using a random port</p>\n<p>In this way, when there is a delay in the registry push, the consumer can also call the  original provider service address hrough the cache list and succeed。</p>\n</li>\n<li>\n<p>Use Dragoon's HTTP monitoring item to monitor the service provider on the registry</p>\n<p>The state of Dragoon monitoring service in the registry : <a href=\"http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5\">http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5</a> Ensure that the service exists on the registry .</p>\n</li>\n<li>\n<p>Service provider,use Dragoon's telnet mommand or shell monitor  command</p>\n<p>Monitoring service provider port status :<code>echo status | nc -i 1 20880 | grep OK | wc -l</code>, 20880 is the service port</p>\n</li>\n<li>\n<p>Service consumer side, cast the service to EchoService,and call <code>$echo()</code>  to test whether the provider of the service is available</p>\n<p>eg: <code>assertEqauls(“OK”, ((EchoService)memberService).$echo(“OK”));</code></p>\n</li>\n</ol>\n<h2>Don't use the configuration of dubbo.properties file, suggeset to use  the configuration of XML</h2>\n<p>All of the configuration items in the dubbo can be configured in the spring configuration file,and can be configured for a single service.</p>\n<p>The Dubbo default value is used if completely not set up , please see the instructions in the article  <a href=\"./references/xml/introduction.md\">Dubbo configuration introduction</a> .</p>\n<h3>The relation between attribute name of dubbo.properties and XML</h3>\n<ol start=\"0\">\n<li>\n<p>application name <code>dubbo.application.name</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"myalibaba\"</span> &gt;</span>\n</code></pre>\n</li>\n<li>\n<p>registry address <code>dubbo.registry.address</code></p>\n<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\">\"11.22.33.44:9090\"</span> &gt;</span>\n</code></pre>\n</li>\n<li>\n<p>call timeout <code>dubbo.service.*.timeout</code></p>\n<p>Timeout can be set in multiple configuration items <code>timeout</code>,cover from top to bottom (The top one have a higher priority )<sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>,The coverage strategy of other parameters(<code>retries</code>、<code>loadbalance</code>、<code>actives</code> and so on)is:</p>\n<p>Certain method  Configuration of a provider service</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findPerson\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>Configuration of a provider specific interface</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"200\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>Service provider protocol <code>dubbo.service.protocol</code>、Service monitor port <code>dubbo.service.server.port</code></p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>Service thread pool size <code>dubbo.service.max.thread.threads.size</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>No provider throws exceptions (Fast-Fail) when the consumer is started ()\n<code>alibaba.intl.commons.dubbo.service.allow.no.provider</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Overlay rules for configuration: 1) The method level configuration has a higher priority than the interface level, that is to say,small scope have a high priority 2) Consumer side configuration has a higher priority than provider side, better than global configuration, the last one is the Dubbo hard coded configuration value(<a href=\"./configuration/properties.md\">Dubbo configuration introduction</a>) <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>With the first call, the call will be called 3 times <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>How to select a service to call when there are multiple Provider services <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>It means that consumer service can call the best provider service, and reduce to call the the slow provider service. <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><code>timeout</code> Can be set in multiple places, configuration items and overlay rules: <a href=\"./references/xml/introduction.md\">Dubbo Schema configuration introduction</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Recommended usage</h1>\n<h2>Configuring the attributes of the consumer side as much as possible on the provider side</h2>\n<p>the reason is:</p>\n<ul>\n<li>Service providers are more aware of service performance parameters than service users,Such as the timeout time of the call, the reasonable retry times, and so on.</li>\n<li>If  a attribute is configurated in provider side,  not configurated in consumer side,  consumer service will use the attribute in provider side. That is to say, the provider side's attribute can be used as consumer's default value <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>. Otherwise, consumer service will use consumer-side's attribute,but can't cnotrol the provider service,it's usually unreasonable.</li>\n</ul>\n<p>Configuring the attributes of the consumer side as much as possible on the provider side,Make the provider service developer think more about the characteristics and quality of the provider side service.</p>\n<p>Examples:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"300\"</span> <span class=\"hljs-attr\">retry</span>=<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"random\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"0\"</span>\n/&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.WorldService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"300\"</span> <span class=\"hljs-attr\">retry</span>=<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"random\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"0\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findAllPerson\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"10000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"5\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>/&gt;</span>\n</code></pre>\n<p>The consumer side properties that can be configured on provider are:</p>\n<ol start=\"0\">\n<li><code>timeout</code> Method call timeout</li>\n<li><code>retries</code> The number of failed retries, default value is 1 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></li>\n<li><code>loadbalance</code> Load balance algorithm <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,default algorithm is random <code>random</code>,and polling <code>roundrobin</code>、least active <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> <code>leastactive</code></li>\n<li><code>actives</code> Consumer side, maximum concurrent call limitation. That is , when the concurrent requests of consumer service reach maximum  configuration,the new call will wait until to catch a timeout error.\nConfigurated in  <code>dubbo:method</code>(method level configuration) , then the concurrent limitation point at method.Configurated in <code>dubbo:service</code>(service level configuration),then the concurrent limitation point at service.</li>\n</ol>\n<p>Detailed configuration instructions see:<a href=\"./references/xml/introduction.md\">Dubbo configuration introduction</a></p>\n<h2>Configuring reasonable provider end properties on provider</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"200\"</span> /&gt;</span> \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"200\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findAllPerson\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"50\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>The provider side properties that can be configured on provider service are:</p>\n<ol start=\"0\">\n<li><code>threads</code> service thread pool size</li>\n<li><code>executes</code> If concurrent requests number that a provider service handled reach the maximum thead pool count , the new call will wait,then the consumer call may catch a timeout error. Configurated in  <code>dubbo:method</code>(method level configuration) , then the concurrent limitation point at method.Configurated in <code>dubbo:service</code>(service level configuration),then the concurrent limitation point at service.</li>\n</ol>\n<h2>Configuration management information</h2>\n<p>Now we have the owner information and organization infomation to differentiate the sites。It's easy to contact with the service owners when there is a problem, please write at least two persons for backup. The information of owners and organizations can be seen in the registry.</p>\n<p>application configuration owners,organizations:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> <span class=\"hljs-attr\">organization</span>=<span class=\"hljs-string\">”intl”</span> /&gt;</span>\n</code></pre>\n<p>service configuration owners:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> /&gt;</span>\n</code></pre>\n<p>reference configuration owners:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> /&gt;</span>\n</code></pre>\n<p><code>dubbo:service</code>、<code>dubbo:reference</code> have no configuration owner, then use the owner configured in <code>dubbo:application</code>.</p>\n<h2>Set up the Dubbo cache file</h2>\n<p>Provider service list caching file:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">file</span>=<span class=\"hljs-string\">”${user.home}/output/dubbo.cache”</span> /&gt;</span>\n</code></pre>\n<p>Notations:</p>\n<ol start=\"0\">\n<li>You can modify  the cahe file path of the application according to the needs. Ensure that the file will not be cleared during the release process.</li>\n<li>If there are more than one application process, do not use the same file path to avoid the content being overwritten.</li>\n</ol>\n<p>This file caches the list of the registry and the list of service providers. With this configuration, when the application is restarted , if  the Dubbo registry is not available, the application will read the information from the service provider list from the cache file. That can ensure the availability of the application.</p>\n<h2>Monitor configuration</h2>\n<ol start=\"0\">\n<li>\n<p>Expose service with a fixed port, instead of using a random port</p>\n<p>In this way, when there is a delay in the registry push, the consumer can also call the  original provider service address hrough the cache list and succeed。</p>\n</li>\n<li>\n<p>Use Dragoon's HTTP monitoring item to monitor the service provider on the registry</p>\n<p>The state of Dragoon monitoring service in the registry : <a href=\"http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5\">http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5</a> Ensure that the service exists on the registry .</p>\n</li>\n<li>\n<p>Service provider,use Dragoon's telnet mommand or shell monitor  command</p>\n<p>Monitoring service provider port status :<code>echo status | nc -i 1 20880 | grep OK | wc -l</code>, 20880 is the service port</p>\n</li>\n<li>\n<p>Service consumer side, cast the service to EchoService,and call <code>$echo()</code>  to test whether the provider of the service is available</p>\n<p>eg: <code>assertEqauls(“OK”, ((EchoService)memberService).$echo(“OK”));</code></p>\n</li>\n</ol>\n<h2>Don't use the configuration of dubbo.properties file, suggeset to use  the configuration of XML</h2>\n<p>All of the configuration items in the dubbo can be configured in the spring configuration file,and can be configured for a single service.</p>\n<p>The Dubbo default value is used if completely not set up , please see the instructions in the article  <a href=\"./references/xml/introduction.md\">Dubbo configuration introduction</a> .</p>\n<h3>The relation between attribute name of dubbo.properties and XML</h3>\n<ol start=\"0\">\n<li>\n<p>application name <code>dubbo.application.name</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"myalibaba\"</span> &gt;</span>\n</code></pre>\n</li>\n<li>\n<p>registry address <code>dubbo.registry.address</code></p>\n<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\">\"11.22.33.44:9090\"</span> &gt;</span>\n</code></pre>\n</li>\n<li>\n<p>call timeout <code>dubbo.service.*.timeout</code></p>\n<p>Timeout can be set in multiple configuration items <code>timeout</code>,cover from top to bottom (The top one have a higher priority )<sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>,The coverage strategy of other parameters(<code>retries</code>、<code>loadbalance</code>、<code>actives</code> and so on)is:</p>\n<p>Certain method  Configuration of a provider service</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findPerson\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>Configuration of a provider specific interface</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"200\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>Service provider protocol <code>dubbo.service.protocol</code>、Service monitor port <code>dubbo.service.server.port</code></p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>Service thread pool size <code>dubbo.service.max.thread.threads.size</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>No provider throws exceptions (Fast-Fail) when the consumer is started ()\n<code>alibaba.intl.commons.dubbo.service.allow.no.provider</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Overlay rules for configuration: 1) The method level configuration has a higher priority than the interface level, that is to say,small scope have a high priority 2) Consumer side configuration has a higher priority than provider side, better than global configuration, the last one is the Dubbo hard coded configuration value(<a href=\"./configuration/properties.md\">Dubbo configuration introduction</a>) <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>With the first call, the call will be called 3 times <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>How to select a service to call when there are multiple Provider services <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>It means that consumer service can call the best provider service, and reduce to call the the slow provider service. <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><code>timeout</code> Can be set in multiple places, configuration items and overlay rules: <a href=\"./references/xml/introduction.md\">Dubbo Schema configuration introduction</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/recommend.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/api.json b/en-us/docs/user/references/api.json
index b39754b8..7c26f9db 100644
--- a/en-us/docs/user/references/api.json
+++ b/en-us/docs/user/references/api.json
@@ -1,4 +1,6 @@
 {
   "filename": "api.md",
-  "__html": "<h1>API Reference</h1>\n<p>Generally speaking, dubbo keeps its functionality no intrusive as much as possible, but for some particular features, there's no other way not only API can achieve. <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p>These APIs are summarized here below:</p>\n<h2>Configuration API</h2>\n<pre><code>com.alibaba.dubbo.config.ServiceConfig\ncom.alibaba.dubbo.config.ReferenceConfig\ncom.alibaba.dubbo.config.ProtocolConfig\ncom.alibaba.dubbo.config.RegistryConfig\ncom.alibaba.dubbo.config.MonitorConfig\ncom.alibaba.dubbo.config.ApplicationConfig\ncom.alibaba.dubbo.config.ModuleConfig\ncom.alibaba.dubbo.config.ProviderConfig\ncom.alibaba.dubbo.config.ConsumerConfig\ncom.alibaba.dubbo.config.MethodConfig\ncom.alibaba.dubbo.config.ArgumentConfig\n</code></pre>\n<p>Pls. refer to <a href=\"../configuration/api.md\">API Configuration</a> for further information.</p>\n<h2>Annotation API</h2>\n<pre><code>com.alibaba.dubbo.config.annotation.Service\ncom.alibaba.dubbo.config.annotation.Reference\n</code></pre>\n<p>Pls. refer to <a href=\"../configuration/annotation.md\">Annotation Configuration</a> for further information.</p>\n<h2>Model API</h2>\n<pre><code>com.alibaba.dubbo.common.URL\ncom.alibaba.dubbo.rpc.RpcException\n</code></pre>\n<h2>Context API</h2>\n<pre><code>com.alibaba.dubbo.rpc.RpcContext\n</code></pre>\n<p>Pls. refer to <a href=\"../demos/context.md\">context</a> &amp; <a href=\"../demos/attachment.md\">pass parameter in attachment</a> &amp; <a href=\"../demos/async-call.md\">asynchronous call</a> for further information.</p>\n<h2>Service API</h2>\n<pre><code>com.alibaba.dubbo.rpc.service.GenericService\ncom.alibaba.dubbo.rpc.service.GenericException\n</code></pre>\n<p>Pls. refer to <a href=\"../demos/generic-reference.md\">generic reference</a> &amp; <a href=\"../demos/generic-service.md\">generic service</a> for further information.</p>\n<pre><code>com.alibaba.dubbo.rpc.service.EchoService\n</code></pre>\n<p>Pls. refer to <a href=\"../demos/echo-service.md\">test via echo service</a> for further details.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Attention: do not rely on APIs other than what're mentioned here, otherwise your application may face the risk of incompatibility after upgrade dubbo. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>API Reference</h1>\n<p>Generally speaking, dubbo keeps its functionality no intrusive as much as possible, but for some particular features, there's no other way not only API can achieve. <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p>These APIs are summarized here below:</p>\n<h2>Configuration API</h2>\n<pre><code>com.alibaba.dubbo.config.ServiceConfig\ncom.alibaba.dubbo.config.ReferenceConfig\ncom.alibaba.dubbo.config.ProtocolConfig\ncom.alibaba.dubbo.config.RegistryConfig\ncom.alibaba.dubbo.config.MonitorConfig\ncom.alibaba.dubbo.config.ApplicationConfig\ncom.alibaba.dubbo.config.ModuleConfig\ncom.alibaba.dubbo.config.ProviderConfig\ncom.alibaba.dubbo.config.ConsumerConfig\ncom.alibaba.dubbo.config.MethodConfig\ncom.alibaba.dubbo.config.ArgumentConfig\n</code></pre>\n<p>Pls. refer to <a href=\"../configuration/api.md\">API Configuration</a> for further information.</p>\n<h2>Annotation API</h2>\n<pre><code>com.alibaba.dubbo.config.annotation.Service\ncom.alibaba.dubbo.config.annotation.Reference\n</code></pre>\n<p>Pls. refer to <a href=\"../configuration/annotation.md\">Annotation Configuration</a> for further information.</p>\n<h2>Model API</h2>\n<pre><code>com.alibaba.dubbo.common.URL\ncom.alibaba.dubbo.rpc.RpcException\n</code></pre>\n<h2>Context API</h2>\n<pre><code>com.alibaba.dubbo.rpc.RpcContext\n</code></pre>\n<p>Pls. refer to <a href=\"../demos/context.md\">context</a> &amp; <a href=\"../demos/attachment.md\">pass parameter in attachment</a> &amp; <a href=\"../demos/async-call.md\">asynchronous call</a> for further information.</p>\n<h2>Service API</h2>\n<pre><code>com.alibaba.dubbo.rpc.service.GenericService\ncom.alibaba.dubbo.rpc.service.GenericException\n</code></pre>\n<p>Pls. refer to <a href=\"../demos/generic-reference.md\">generic reference</a> &amp; <a href=\"../demos/generic-service.md\">generic service</a> for further information.</p>\n<pre><code>com.alibaba.dubbo.rpc.service.EchoService\n</code></pre>\n<p>Pls. refer to <a href=\"../demos/echo-service.md\">test via echo service</a> for further details.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Attention: do not rely on APIs other than what're mentioned here, otherwise your application may face the risk of incompatibility after upgrade dubbo. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/references/api.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/maven.json b/en-us/docs/user/references/maven.json
index 1c2c1097..0c2d232d 100644
--- a/en-us/docs/user/references/maven.json
+++ b/en-us/docs/user/references/maven.json
@@ -1,4 +1,6 @@
 {
   "filename": "maven.md",
-  "__html": "<h1>Maven Plugin Reference</h1>\n<h2>Start a simple registry server</h2>\n<p>Start a simple registry server listening on port 9099 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">mvn dubbo:registry -Dport=9099 \n</code></pre>\n<h2>Generate a service provider demo application</h2>\n<p>Generate a service provider with the specified interface and version:</p>\n<pre><code class=\"language-sh\">mvn dubbo:create -Dapplication=xxx -Dpackage=com.alibaba.xxx -Dservice=XxxService,YyyService -Dversion=1.0.0 \n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Default port is 9090 if the port is not specified <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Maven Plugin Reference</h1>\n<h2>Start a simple registry server</h2>\n<p>Start a simple registry server listening on port 9099 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">mvn dubbo:registry -Dport=9099 \n</code></pre>\n<h2>Generate a service provider demo application</h2>\n<p>Generate a service provider with the specified interface and version:</p>\n<pre><code class=\"language-sh\">mvn dubbo:create -Dapplication=xxx -Dpackage=com.alibaba.xxx -Dservice=XxxService,YyyService -Dversion=1.0.0 \n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Default port is 9090 if the port is not specified <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/references/maven.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/dubbo.json b/en-us/docs/user/references/protocol/dubbo.json
index 1841a456..a1917086 100644
--- a/en-us/docs/user/references/protocol/dubbo.json
+++ b/en-us/docs/user/references/protocol/dubbo.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo.md",
-  "__html": "<h1>dubbo://</h1>\n<p>Dubbo protocol which is the default protocol of Dubbo RPC Framework uses a single long connection and NIO asynchronous communication,it is suitable for small data but with high concurrency RPC call and the number of consumer machine is much greater than provider</p>\n<p>On the other hand, the Dubbo protocol is not suitable for transmitting large amounts of data, such as file transmission, video transmission, etc., unless the request is very low.</p>\n<p><img src=\"../../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol.jpg\"></p>\n<ul>\n<li>Transporter: mina, netty, grizzy</li>\n<li>Serialization: dubbo, hessian2, java, json</li>\n<li>Dispatcher: all, direct, message, execution, connection</li>\n<li>ThreadPool: fixed, cached</li>\n</ul>\n<h2>Features</h2>\n<p>The default protocol is Dubbo protocol ,based on netty  <code>3.2.5.Final</code> and Hessian2 <code>3.2.1-fixed-2(Alibaba embed version)</code>.</p>\n<ul>\n<li>Default connection number: single connection</li>\n<li>Default connection mode: long connection</li>\n<li>Transmission protocol: TCP</li>\n<li>Transmission mode: NIO asynchronous transmission</li>\n<li>Serialization: Hessian2 serialization</li>\n<li>Scope of application: incoming and outgoing data packets are small (recommended less than 100K),try not to transfer large files or large strings with Dubbo protocol.</li>\n<li>Applicable scenarios:: most RPC scenarios</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return values must implement <code>Serializable</code> interface</li>\n<li>Parameters and return values can not be customized to implement <code>List</code>,<code>Map</code>, <code>Number</code>,<code>Date</code>, <code>Calendar</code> interface, can only be implemented with the JDK, because Hessian2 will do some special treatment, Attribute values in the class will be lost.</li>\n<li>Hessian serialization:to solve compatibility issues, only serialize class name,all the fields declared by the class,not included static fields,method information</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Data transformation</th>\n<th>Cases</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A-&gt;B</td>\n<td>Class A has one more property than Class B</td>\n<td>It doesn't throw exception ,Class B doesn't have Class A new property,other is normal</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>enum Class A has one more new enum than enum Class B,when use Class A new enum to transfor to B</td>\n<td>throw exception</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>enum Class A has one more new enum than enum Class B,when don't use Class A new enum to transfor to B</td>\n<td>It doesn't throw exception</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>Class A and Class B have same property name,but the property type is different</td>\n<td>throw exception</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>serialId is not same</td>\n<td>normal</td>\n</tr>\n</tbody>\n</table>\n<p>The interface new addition method has no effect on the client. If the method is not required by the client, the client does not need to redeploy it. The input parameter and result class add new properties, and if the client does not need new properties, it does not need to be redeployed too.</p>\n<p>The change of input parameter and result property name has no effect on client serialization, but if the client is not redeployed, no matter the input or output, the value of which property name had change is not available.</p>\n<p>Summary: the server side and the client do not need to be fully consistent with the domain objects,but you still should know about what would happen.</p>\n<h2>Configuration</h2>\n<p>configure protocol</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20880\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20881\"</span> /&gt;</span>\n</code></pre>\n<p>configure protocol options:</p>\n<pre><code class=\"language-xml\"><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\">“9090”</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">“dubbo”</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">“hessian2”</span> <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">“UTF-8”</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">“fixed”</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">“100”</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">“0”</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">“9”</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">“8192”</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">“1000”</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">“8388608”</span> /&gt;</span>\n</code></pre>\n<p>configure multiple connectios:</p>\n<p>Dubbo protocol default uses a single long connection per service per consumer for each service provider,and multiple connections can be used if the amount of data is large</p>\n<pre><code class=\"language-xml\"><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\">connections</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<ul>\n<li><code>&lt;dubbo:service connections=&quot;0&quot;&gt;</code>  OR <code>&lt;dubbo:reference connections=&quot;0&quot;&gt;</code> It means that the service uses a share long connection per provider. <code>default</code></li>\n<li><code>&lt;dubbo:service connections=&quot;1&quot;&gt;</code> OR <code>&lt;dubbo:reference connections=&quot;1&quot;&gt;</code> It means that the service uses a separate long connection.</li>\n<li><code>&lt;dubbo:service connections=&quot;2&quot;&gt;</code> OR<code>&lt;dubbo:reference connections=&quot;2&quot;&gt;</code> It means that the service uses two separate long connection.</li>\n</ul>\n<p>To prevent being hung up by a large number of connections, you can limit the number of connections at the service provider side.</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n</code></pre>\n<p>or configure in <code>dubbo.properties</code>:</p>\n<pre><code>dubbo.service.protocol=dubbo\n</code></pre>\n"
+  "__html": "<h1>dubbo://</h1>\n<p>Dubbo protocol which is the default protocol of Dubbo RPC Framework uses a single long connection and NIO asynchronous communication,it is suitable for small data but with high concurrency RPC call and the number of consumer machine is much greater than provider</p>\n<p>On the other hand, the Dubbo protocol is not suitable for transmitting large amounts of data, such as file transmission, video transmission, etc., unless the request is very low.</p>\n<p><img src=\"../../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol.jpg\"></p>\n<ul>\n<li>Transporter: mina, netty, grizzy</li>\n<li>Serialization: dubbo, hessian2, java, json</li>\n<li>Dispatcher: all, direct, message, execution, connection</li>\n<li>ThreadPool: fixed, cached</li>\n</ul>\n<h2>Features</h2>\n<p>The default protocol is Dubbo protocol ,based on netty  <code>3.2.5.Final</code> and Hessian2 <code>3.2.1-fixed-2(Alibaba embed version)</code>.</p>\n<ul>\n<li>Default connection number: single connection</li>\n<li>Default connection mode: long connection</li>\n<li>Transmission protocol: TCP</li>\n<li>Transmission mode: NIO asynchronous transmission</li>\n<li>Serialization: Hessian2 serialization</li>\n<li>Scope of application: incoming and outgoing data packets are small (recommended less than 100K),try not to transfer large files or large strings with Dubbo protocol.</li>\n<li>Applicable scenarios:: most RPC scenarios</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return values must implement <code>Serializable</code> interface</li>\n<li>Parameters and return values can not be customized to implement <code>List</code>,<code>Map</code>, <code>Number</code>,<code>Date</code>, <code>Calendar</code> interface, can only be implemented with the JDK, because Hessian2 will do some special treatment, Attribute values in the class will be lost.</li>\n<li>Hessian serialization:to solve compatibility issues, only serialize class name,all the fields declared by the class,not included static fields,method information</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>Data transformation</th>\n<th>Cases</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A-&gt;B</td>\n<td>Class A has one more property than Class B</td>\n<td>It doesn't throw exception ,Class B doesn't have Class A new property,other is normal</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>enum Class A has one more new enum than enum Class B,when use Class A new enum to transfor to B</td>\n<td>throw exception</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>enum Class A has one more new enum than enum Class B,when don't use Class A new enum to transfor to B</td>\n<td>It doesn't throw exception</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>Class A and Class B have same property name,but the property type is different</td>\n<td>throw exception</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>serialId is not same</td>\n<td>normal</td>\n</tr>\n</tbody>\n</table>\n<p>The interface new addition method has no effect on the client. If the method is not required by the client, the client does not need to redeploy it. The input parameter and result class add new properties, and if the client does not need new properties, it does not need to be redeployed too.</p>\n<p>The change of input parameter and result property name has no effect on client serialization, but if the client is not redeployed, no matter the input or output, the value of which property name had change is not available.</p>\n<p>Summary: the server side and the client do not need to be fully consistent with the domain objects,but you still should know about what would happen.</p>\n<h2>Configuration</h2>\n<p>configure protocol</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20880\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20881\"</span> /&gt;</span>\n</code></pre>\n<p>configure protocol options:</p>\n<pre><code class=\"language-xml\"><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\">“9090”</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">“dubbo”</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">“hessian2”</span> <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">“UTF-8”</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">“fixed”</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">“100”</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">“0”</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">“9”</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">“8192”</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">“1000”</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">“8388608”</span> /&gt;</span>\n</code></pre>\n<p>configure multiple connectios:</p>\n<p>Dubbo protocol default uses a single long connection per service per consumer for each service provider,and multiple connections can be used if the amount of data is large</p>\n<pre><code class=\"language-xml\"><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\">connections</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<ul>\n<li><code>&lt;dubbo:service connections=&quot;0&quot;&gt;</code>  OR <code>&lt;dubbo:reference connections=&quot;0&quot;&gt;</code> It means that the service uses a share long connection per provider. <code>default</code></li>\n<li><code>&lt;dubbo:service connections=&quot;1&quot;&gt;</code> OR <code>&lt;dubbo:reference connections=&quot;1&quot;&gt;</code> It means that the service uses a separate long connection.</li>\n<li><code>&lt;dubbo:service connections=&quot;2&quot;&gt;</code> OR<code>&lt;dubbo:reference connections=&quot;2&quot;&gt;</code> It means that the service uses two separate long connection.</li>\n</ul>\n<p>To prevent being hung up by a large number of connections, you can limit the number of connections at the service provider side.</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n</code></pre>\n<p>or configure in <code>dubbo.properties</code>:</p>\n<pre><code>dubbo.service.protocol=dubbo\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/protocol/dubbo.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/hessian.json b/en-us/docs/user/references/protocol/hessian.json
index ceb70f10..fb97d7fe 100644
--- a/en-us/docs/user/references/protocol/hessian.json
+++ b/en-us/docs/user/references/protocol/hessian.json
@@ -1,4 +1,6 @@
 {
   "filename": "hessian.md",
-  "__html": "<h1>hessian://</h1>\n<p>Hessian protocol is used for integrate Hessian services, and it use http protocol to  communicate and expose services by servlet.Dubbo use Jetty server as default servlet container.</p>\n<p>Dubbo's Hessian protocol interoperates with native Hessian services:</p>\n<ul>\n<li>Providers use Dubbo's Hessian protocol to expose services that consumers call directly using standard Hessian interfaces</li>\n<li>Alternatively, the provider exposes the service using standard Hessian and the consumer calls it using Dubbo's Hessian protocol.</li>\n</ul>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: Hessian binary serialization</li>\n<li>Scope of application: Incoming and outgoing parameter packets are large, the number of providers is more than that of consumers and can transfer files.</li>\n<li>Applicable scenarios: page transfer, file transfer, or interoperability with native hessian services</li>\n</ul>\n<h2>dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.caucho<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hessian<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.0.7<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return class must implement <code>Serializable</code> interface</li>\n<li>Parameters and return values can not be customized to implement <code>List</code>,<code>Map</code>, <code>Number</code>,<code>Date</code>, <code>Calendar</code> interface, can only be implemented with the JDK, because Hessian2 will do some special treatment, Attribute values in the class will be lost.</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure hessian protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8081\"</span> /&gt;</span>\n</code></pre>\n<p>configure direct connect mode:</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"HelloWorld\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"hessian://10.20.153.10:8080/helloWorld\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>hessian://</h1>\n<p>Hessian protocol is used for integrate Hessian services, and it use http protocol to  communicate and expose services by servlet.Dubbo use Jetty server as default servlet container.</p>\n<p>Dubbo's Hessian protocol interoperates with native Hessian services:</p>\n<ul>\n<li>Providers use Dubbo's Hessian protocol to expose services that consumers call directly using standard Hessian interfaces</li>\n<li>Alternatively, the provider exposes the service using standard Hessian and the consumer calls it using Dubbo's Hessian protocol.</li>\n</ul>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: Hessian binary serialization</li>\n<li>Scope of application: Incoming and outgoing parameter packets are large, the number of providers is more than that of consumers and can transfer files.</li>\n<li>Applicable scenarios: page transfer, file transfer, or interoperability with native hessian services</li>\n</ul>\n<h2>dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.caucho<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hessian<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.0.7<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return class must implement <code>Serializable</code> interface</li>\n<li>Parameters and return values can not be customized to implement <code>List</code>,<code>Map</code>, <code>Number</code>,<code>Date</code>, <code>Calendar</code> interface, can only be implemented with the JDK, because Hessian2 will do some special treatment, Attribute values in the class will be lost.</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure hessian protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8081\"</span> /&gt;</span>\n</code></pre>\n<p>configure direct connect mode:</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"HelloWorld\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"hessian://10.20.153.10:8080/helloWorld\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/protocol/hessian.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/http.json b/en-us/docs/user/references/protocol/http.json
index 7aa19aec..d1173587 100644
--- a/en-us/docs/user/references/protocol/http.json
+++ b/en-us/docs/user/references/protocol/http.json
@@ -1,4 +1,6 @@
 {
   "filename": "http.md",
-  "__html": "<h1>http://</h1>\n<p>Dubbo http protocol is base on HTTP form and Spring's HttpInvoker</p>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: form serialization</li>\n<li>Scope of application: Available browser view, the form or URL can be passed parameters, Temporary files are not supported.</li>\n<li>Applicable scenarios: Services that need to be available to both application and browser</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return values must be consistent with Bean specifications</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure http protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"http\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n</code></pre>\n<p>configure Jetty Server (default):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>configure Servlet Bridge Server (recommend):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span> /&gt;</span>\n</code></pre>\n<p>configure DispatcherServlet:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<p>Note that if you use servlets to dispatch requests:</p>\n<ul>\n<li>the port of protocol <code>&lt;dubbo:protocol port=&quot;8080&quot; /&gt;</code> must same as  servlet container's.</li>\n<li>the context path of protocol <code>&lt;dubbo:protocol contextpath=&quot;foo&quot; /&gt;</code> must same as servlet application's.</li>\n</ul>\n"
+  "__html": "<h1>http://</h1>\n<p>Dubbo http protocol is base on HTTP form and Spring's HttpInvoker</p>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: form serialization</li>\n<li>Scope of application: Available browser view, the form or URL can be passed parameters, Temporary files are not supported.</li>\n<li>Applicable scenarios: Services that need to be available to both application and browser</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return values must be consistent with Bean specifications</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure http protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"http\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n</code></pre>\n<p>configure Jetty Server (default):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>configure Servlet Bridge Server (recommend):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span> /&gt;</span>\n</code></pre>\n<p>configure DispatcherServlet:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<p>Note that if you use servlets to dispatch requests:</p>\n<ul>\n<li>the port of protocol <code>&lt;dubbo:protocol port=&quot;8080&quot; /&gt;</code> must same as  servlet container's.</li>\n<li>the context path of protocol <code>&lt;dubbo:protocol contextpath=&quot;foo&quot; /&gt;</code> must same as servlet application's.</li>\n</ul>\n",
+  "link": "/en-us/docs/user/references/protocol/http.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/introduction.json b/en-us/docs/user/references/protocol/introduction.json
index 4d79ef65..4697b279 100644
--- a/en-us/docs/user/references/protocol/introduction.json
+++ b/en-us/docs/user/references/protocol/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>Protocol reference Book</h1>\n<p>Dubbo protocol is recommended. The performance of each protocol, see:<a href=\"../../perf-test.md\">Performance</a></p>\n"
+  "__html": "<h1>Protocol reference Book</h1>\n<p>Dubbo protocol is recommended. The performance of each protocol, see:<a href=\"../../perf-test.md\">Performance</a></p>\n",
+  "link": "/en-us/docs/user/references/protocol/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/memcached.json b/en-us/docs/user/references/protocol/memcached.json
index 07a54d64..838e53a2 100644
--- a/en-us/docs/user/references/protocol/memcached.json
+++ b/en-us/docs/user/references/protocol/memcached.json
@@ -1,4 +1,6 @@
 {
   "filename": "memcached.md",
-  "__html": "<h1>memcached://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register memcached service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash\"</span>));\n</code></pre>\n<h2>Use in client</h2>\n<p>get service reference:</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> /&gt;</span>\n</code></pre>\n<p>or direct access by IP:</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> /&gt;</span>\n</code></pre>\n<p>you can also use a custom interface:</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.CacheService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> /&gt;</span>\n</code></pre>\n<p>The method name is the same as the standard method name of memcached, just like get(key), set(key, value), delete(key)。</p>\n<p>If the method name and the memcached standard method name are not the same, you need to configure the mapping</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.CacheService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> <span class=\"hljs-attr\">p:set</span>=<span class=\"hljs-string\">\"putFoo\"</span> <span class=\"hljs-attr\">p:get</span>=<span class=\"hljs-string\">\"getFoo\"</span> <span class=\"hljs-attr\">p:delete</span>=<span class=\"hljs-string\">\"removeFoo\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>memcached://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register memcached service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash\"</span>));\n</code></pre>\n<h2>Use in client</h2>\n<p>get service reference:</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> /&gt;</span>\n</code></pre>\n<p>or direct access by IP:</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> /&gt;</span>\n</code></pre>\n<p>you can also use a custom interface:</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.CacheService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> /&gt;</span>\n</code></pre>\n<p>The method name is the same as the standard method name of memcached, just like get(key), set(key, value), delete(key)。</p>\n<p>If the method name and the memcached standard method name are not the same, you need to configure the mapping</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.CacheService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> <span class=\"hljs-attr\">p:set</span>=<span class=\"hljs-string\">\"putFoo\"</span> <span class=\"hljs-attr\">p:get</span>=<span class=\"hljs-string\">\"getFoo\"</span> <span class=\"hljs-attr\">p:delete</span>=<span class=\"hljs-string\">\"removeFoo\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/protocol/memcached.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/redis.json b/en-us/docs/user/references/protocol/redis.json
index ad566ccd..c05d6398 100644
--- a/en-us/docs/user/references/protocol/redis.json
+++ b/en-us/docs/user/references/protocol/redis.json
@@ -1,4 +1,6 @@
 {
   "filename": "redis.md",
-  "__html": "<h1>redis://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register redis service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"redis://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash\"</span>));\n</code></pre>\n<h2>Use in client</h2>\n<p>get service reference:</p>\n<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\">\"store\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> /&gt;</span>\n</code></pre>\n<p>or direct access by IP:</p>\n<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\">\"store\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"redis://10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>you can also use a custom interface:</p>\n<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\">\"store\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.StoreService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"redis://10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>The method name is the same as the standard method name of memcached, just like get(key), set(key, value), delete(key)。</p>\n<p>If the method name and the memcached standard method name are not the same, you need to configure the mapping</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.CacheService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> <span class=\"hljs-attr\">p:set</span>=<span class=\"hljs-string\">\"putFoo\"</span> <span class=\"hljs-attr\">p:get</span>=<span class=\"hljs-string\">\"getFoo\"</span> <span class=\"hljs-attr\">p:delete</span>=<span class=\"hljs-string\">\"removeFoo\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>redis://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register redis service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"redis://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash\"</span>));\n</code></pre>\n<h2>Use in client</h2>\n<p>get service reference:</p>\n<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\">\"store\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> /&gt;</span>\n</code></pre>\n<p>or direct access by IP:</p>\n<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\">\"store\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"java.util.Map\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"redis://10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>you can also use a custom interface:</p>\n<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\">\"store\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.StoreService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"redis://10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>The method name is the same as the standard method name of memcached, just like get(key), set(key, value), delete(key)。</p>\n<p>If the method name and the memcached standard method name are not the same, you need to configure the mapping</p>\n<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\">\"cache\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.CacheService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"memcached://10.20.153.10:11211\"</span> <span class=\"hljs-attr\">p:set</span>=<span class=\"hljs-string\">\"putFoo\"</span> <span class=\"hljs-attr\">p:get</span>=<span class=\"hljs-string\">\"getFoo\"</span> <span class=\"hljs-attr\">p:delete</span>=<span class=\"hljs-string\">\"removeFoo\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/protocol/redis.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/rmi.json b/en-us/docs/user/references/protocol/rmi.json
index 7212146d..47c2e91f 100644
--- a/en-us/docs/user/references/protocol/rmi.json
+++ b/en-us/docs/user/references/protocol/rmi.json
@@ -1,4 +1,6 @@
 {
   "filename": "rmi.md",
-  "__html": "<h1>rmi://</h1>\n<p>The RMI protocol uses the JDK standard <code>java.rmi.*</code> Implementation, using a block short connection and JDK standard serialization.</p>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: Java standard Object Serialization</li>\n<li>Scope of application:the number of providers is more than that of consumers and can transfer files.</li>\n<li>Applicable scenarios: Conventional remote service method calls, interoperating with native RMI services</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return values must implement <code>Serializable</code> interface</li>\n<li>The timeout configuration for RMI  is invalid, you need to use java startup parameter settings:<code>-Dsun.rmi.transport.tcp.responseTimeout=3000</code>,see the RMI configuration below</li>\n</ul>\n<h2>Configuration in dubbo.properties</h2>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.service.protocol</span>=<span class=\"hljs-string\">rmi</span>\n</code></pre>\n<h2>RMI Configuration</h2>\n<pre><code class=\"language-sh\">java -Dsun.rmi.transport.tcp.responseTimeout=3000\n</code></pre>\n<p>more RMI options please check <a href=\"http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html\">JDK Document</a></p>\n<h2>Interface</h2>\n<p>If the service interface implement the <code>java.rmi.Remote</code> interface, it can interoperate with the native RMI, ie:</p>\n<ul>\n<li>Providers expose services using Dubbo's RMI protocol, consumers call directly with the standard RMI interface,</li>\n<li>Or the provider exposes services using standard RMI, and consumers invoke with Dubbo's RMI protocol.</li>\n</ul>\n<p>If the service interface doesn't implement the <code>java.rmi.Remote</code> interface:</p>\n<ul>\n<li>Default Dubbo will automatically generate a <code>com.xxx.XxxService$Remote</code> interface and implement the<code>java.rmi.Remote</code> interface, expose the service as this interface,</li>\n<li>But if <code>&lt;dubbo: protocol name = 'rmi' codec = 'spring' /&gt;</code>is set, the<code>$Remote</code> interface will not be generated, but Spring's <code>RmiInvocationHandler</code> interface will be used to expose services.</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure RMI protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"rmi1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"rmi2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"2099\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi1\"</span> /&gt;</span>\n</code></pre>\n<p>Compatible with Spring:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">\"spring\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>rmi://</h1>\n<p>The RMI protocol uses the JDK standard <code>java.rmi.*</code> Implementation, using a block short connection and JDK standard serialization.</p>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: Java standard Object Serialization</li>\n<li>Scope of application:the number of providers is more than that of consumers and can transfer files.</li>\n<li>Applicable scenarios: Conventional remote service method calls, interoperating with native RMI services</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return values must implement <code>Serializable</code> interface</li>\n<li>The timeout configuration for RMI  is invalid, you need to use java startup parameter settings:<code>-Dsun.rmi.transport.tcp.responseTimeout=3000</code>,see the RMI configuration below</li>\n</ul>\n<h2>Configuration in dubbo.properties</h2>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.service.protocol</span>=<span class=\"hljs-string\">rmi</span>\n</code></pre>\n<h2>RMI Configuration</h2>\n<pre><code class=\"language-sh\">java -Dsun.rmi.transport.tcp.responseTimeout=3000\n</code></pre>\n<p>more RMI options please check <a href=\"http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html\">JDK Document</a></p>\n<h2>Interface</h2>\n<p>If the service interface implement the <code>java.rmi.Remote</code> interface, it can interoperate with the native RMI, ie:</p>\n<ul>\n<li>Providers expose services using Dubbo's RMI protocol, consumers call directly with the standard RMI interface,</li>\n<li>Or the provider exposes services using standard RMI, and consumers invoke with Dubbo's RMI protocol.</li>\n</ul>\n<p>If the service interface doesn't implement the <code>java.rmi.Remote</code> interface:</p>\n<ul>\n<li>Default Dubbo will automatically generate a <code>com.xxx.XxxService$Remote</code> interface and implement the<code>java.rmi.Remote</code> interface, expose the service as this interface,</li>\n<li>But if <code>&lt;dubbo: protocol name = 'rmi' codec = 'spring' /&gt;</code>is set, the<code>$Remote</code> interface will not be generated, but Spring's <code>RmiInvocationHandler</code> interface will be used to expose services.</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure RMI protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"rmi1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"rmi2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"2099\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi1\"</span> /&gt;</span>\n</code></pre>\n<p>Compatible with Spring:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">\"spring\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/protocol/rmi.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/thrift.json b/en-us/docs/user/references/protocol/thrift.json
index 4fab92d5..89a3d811 100644
--- a/en-us/docs/user/references/protocol/thrift.json
+++ b/en-us/docs/user/references/protocol/thrift.json
@@ -1,4 +1,6 @@
 {
   "filename": "thrift.md",
-  "__html": "<h1>thrift://</h1>\n<p>The current dubbo support thrift protocol is an extension of the thrift native protocol, adding some additional header information to the native protocol, such as service name, magic number, and so on.</p>\n<p>The use of dubbo thrift protocol also need to use thrift idl compiler to generate the corresponding java code, follow-up version will do some enhancement in this aspect.</p>\n<h2>dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.thrift<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>libthrift<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.8.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"thrift\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"3030\"</span> /&gt;</span>\n</code></pre>\n<h2>Example</h2>\n<p>you can check <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/com/alibaba/dubbo/rpc/protocol/thrift/examples\">dubbo thrift example</a></p>\n<h2>Common problem</h2>\n<ul>\n<li>Thrift does not support null values, that is, you can not pass null values</li>\n</ul>\n"
+  "__html": "<h1>thrift://</h1>\n<p>The current dubbo support thrift protocol is an extension of the thrift native protocol, adding some additional header information to the native protocol, such as service name, magic number, and so on.</p>\n<p>The use of dubbo thrift protocol also need to use thrift idl compiler to generate the corresponding java code, follow-up version will do some enhancement in this aspect.</p>\n<h2>dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.thrift<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>libthrift<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.8.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Configuration</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"thrift\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"3030\"</span> /&gt;</span>\n</code></pre>\n<h2>Example</h2>\n<p>you can check <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/com/alibaba/dubbo/rpc/protocol/thrift/examples\">dubbo thrift example</a></p>\n<h2>Common problem</h2>\n<ul>\n<li>Thrift does not support null values, that is, you can not pass null values</li>\n</ul>\n",
+  "link": "/en-us/docs/user/references/protocol/thrift.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/webservice.json b/en-us/docs/user/references/protocol/webservice.json
index dc85fe97..58b14009 100644
--- a/en-us/docs/user/references/protocol/webservice.json
+++ b/en-us/docs/user/references/protocol/webservice.json
@@ -1,4 +1,6 @@
 {
   "filename": "webservice.md",
-  "__html": "<h1>webservice://</h1>\n<p>WebService-based remote calling protocol,base on <a href=\"http://cxf.apache.org\">Apache CXF</a>  <code>frontend-simple</code> and  <code>transports-http</code> implements。</p>\n<p>Interoperable with native WebService services:</p>\n<ul>\n<li>Providers expose services using Dubbo's WebService protocol, which consumers invoke directly using the standard WebService interface,</li>\n<li>Or the provider exposes the service using the standard WebService, which consumers invoke using the Dubbo WebService protocol.</li>\n</ul>\n<h2>dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.cxf<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>cxf-rt-frontend-simple<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.6.1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.cxf<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>cxf-rt-transports-http<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.6.1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: SOAP text serialization</li>\n<li>Applicable scenarios: System integration, cross-language calls</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return class should implement <code>Serializable</code> interface</li>\n<li>Parameters should try to use the basic types and POJO</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure webservice protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"webservice\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"webservice\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"webservice\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"webservice1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"webservice\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"webservice2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"webservice\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8081\"</span> /&gt;</span>\n</code></pre>\n<p>configure direct connect mode:</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"HelloWorld\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"webservice://10.20.153.10:8080/com.foo.HelloWorld\"</span> /&gt;</span>\n</code></pre>\n<p>WSDL:</p>\n<pre><code>http://10.20.153.10:8080/com.foo.HelloWorld?wsdl\n</code></pre>\n<p>Jetty Server (Default):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>Servlet Bridge Server (recommend):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span> /&gt;</span>\n</code></pre>\n<p>configure DispatcherServlet:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<p>Note that if you use servlets to dispatch requests:</p>\n<ul>\n<li>the port of protocol <code>&lt;dubbo:protocol port=&quot;8080&quot; /&gt;</code> must same as  servlet container's.</li>\n<li>the context path of protocol <code>&lt;dubbo:protocol contextpath=&quot;foo&quot; /&gt;</code> must same as servlet application's.</li>\n</ul>\n"
+  "__html": "<h1>webservice://</h1>\n<p>WebService-based remote calling protocol,base on <a href=\"http://cxf.apache.org\">Apache CXF</a>  <code>frontend-simple</code> and  <code>transports-http</code> implements。</p>\n<p>Interoperable with native WebService services:</p>\n<ul>\n<li>Providers expose services using Dubbo's WebService protocol, which consumers invoke directly using the standard WebService interface,</li>\n<li>Or the provider exposes the service using the standard WebService, which consumers invoke using the Dubbo WebService protocol.</li>\n</ul>\n<h2>dependency</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.cxf<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>cxf-rt-frontend-simple<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.6.1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.cxf<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>cxf-rt-transports-http<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.6.1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>Features</h2>\n<ul>\n<li>Number of connections: multiple connections</li>\n<li>Connection: short connection</li>\n<li>Transmission protocol: HTTP</li>\n<li>Transmission: synchronous transmission</li>\n<li>Serialization: SOAP text serialization</li>\n<li>Applicable scenarios: System integration, cross-language calls</li>\n</ul>\n<h2>Constraint</h2>\n<ul>\n<li>Parameters and return class should implement <code>Serializable</code> interface</li>\n<li>Parameters should try to use the basic types and POJO</li>\n</ul>\n<h2>Configuration</h2>\n<p>configure webservice protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"webservice\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>configure provider level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"webservice\"</span> /&gt;</span>\n</code></pre>\n<p>configure service level default protocol:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"webservice\"</span> /&gt;</span>\n</code></pre>\n<p>configure multiple port:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"webservice1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"webservice\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"webservice2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"webservice\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8081\"</span> /&gt;</span>\n</code></pre>\n<p>configure direct connect mode:</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"HelloWorld\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"webservice://10.20.153.10:8080/com.foo.HelloWorld\"</span> /&gt;</span>\n</code></pre>\n<p>WSDL:</p>\n<pre><code>http://10.20.153.10:8080/com.foo.HelloWorld?wsdl\n</code></pre>\n<p>Jetty Server (Default):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>Servlet Bridge Server (recommend):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span> /&gt;</span>\n</code></pre>\n<p>configure DispatcherServlet:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<p>Note that if you use servlets to dispatch requests:</p>\n<ul>\n<li>the port of protocol <code>&lt;dubbo:protocol port=&quot;8080&quot; /&gt;</code> must same as  servlet container's.</li>\n<li>the context path of protocol <code>&lt;dubbo:protocol contextpath=&quot;foo&quot; /&gt;</code> must same as servlet application's.</li>\n</ul>\n",
+  "link": "/en-us/docs/user/references/protocol/webservice.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/qos.json b/en-us/docs/user/references/qos.json
index e2ef5ea2..73fb1885 100644
--- a/en-us/docs/user/references/qos.json
+++ b/en-us/docs/user/references/qos.json
@@ -1,4 +1,6 @@
 {
   "filename": "qos.md",
-  "__html": "<h1>Telnet (new version) Command Usage</h1>\n<p>dubbo 2.5.8 version refactor the telnet module, providing new telnet command support.</p>\n<h3>Port</h3>\n<p>the port of new version telnet is different from the port of dubbo protocol. The default port is <code>22222</code>, which can be changed by modifying configuration file <code>dubbo.properties</code></p>\n<pre><code>dubbo.application.qos.port=33333\n</code></pre>\n<p>or by modifying the JVM parameter</p>\n<pre><code>-Ddubbo.application.qos.port=33333\n</code></pre>\n<h3>Safety</h3>\n<p>By default, dubbo can receive any command sent from the host, which can be changed by modifying the configuration file <code>dubbo.properties</code></p>\n<pre><code>dubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<p>or by configuring the JVM parameter</p>\n<pre><code>-Ddubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<p>to reject command sent from the remote host, allowing only the local server to run the command</p>\n<h3>Telnet and http protocol</h3>\n<p>The telnet module supports both http and telnet protocol, in order to facilitate the use of various situations</p>\n<p>For example,</p>\n<pre><code>➜  ~ telnet localhost 22222\nTrying ::1...\ntelnet: connect to address ::1: Connection refused\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is '^]'.\n  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄\n  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███\n  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███\n  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███\n  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███\n  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀\n\n\ndubbo&gt;ls\nAs Provider side:\n+----------------------------------+---+\n|       Provider Service Name      |PUB|\n+----------------------------------+---+\n|com.alibaba.dubbo.demo.DemoService| N |\n+----------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n\ndubbo&gt;\n</code></pre>\n<pre><code>➜  ~ curl &quot;localhost:22222/ls?arg1=xxx&amp;arg2=xxxx&quot;\nAs Provider side:\n+----------------------------------+---+\n|       Provider Service Name      |PUB|\n+----------------------------------+---+\n|com.alibaba.dubbo.demo.DemoService| N |\n+----------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<h3>ls List consumers and providers</h3>\n<pre><code>dubbo&gt;ls\nAs Provider side:\n+----------------------------------+---+\n|       Provider Service Name      |PUB|\n+----------------------------------+---+\n|com.alibaba.dubbo.demo.DemoService| Y |\n+----------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>List the services of the provides and the consumers that dubbo provide</p>\n<h3>Online service command</h3>\n<p>When using delay publishing function(com.alibaba.dubbo.config.AbstractServiceConfig#register set as false), you can use “online” command to online the service</p>\n<pre><code>//online all services\ndubbo&gt;online\nOK\n\n//online part of servies according to regularity.\ndubbo&gt;online com.*\nOK\n</code></pre>\n<p>Common usage situations:</p>\n<ul>\n<li>Because there is no JIT or the related resources warm-up, when the machine is restarted and the online QPS is relatively high , a large amount of timeout situations may occur. At this time,the problem can be solved by distributing the batch service and increasing the traffic gradually.</li>\n<li>A machine needs to be back online after going offline due to some reasons.</li>\n</ul>\n<h3>Offline service Command</h3>\n<p>Offline command can be used if temporary offline service is needed when fault occurs.</p>\n<pre><code>//offline all service \ndubbo&gt;offline\nOK\n\n//offline some services according to regular rules\ndubbo&gt;offline com.*\nOK\n</code></pre>\n<h3>help command</h3>\n<pre><code>//list all commands\ndubbo&gt;help\n\n//list the specific use case of a command \ndubbo&gt;help online\n+--------------+----------------------------------------------------------------------------------+\n| COMMAND NAME | online                                                                           |\n+--------------+----------------------------------------------------------------------------------+\n|      EXAMPLE | online dubbo                                                                     |\n|              | online xx.xx.xxx.service                                                         |\n+--------------+----------------------------------------------------------------------------------+\ndubbo&gt;\n</code></pre>\n"
+  "__html": "<h1>Telnet (new version) Command Usage</h1>\n<p>dubbo 2.5.8 version refactor the telnet module, providing new telnet command support.</p>\n<h3>Port</h3>\n<p>the port of new version telnet is different from the port of dubbo protocol. The default port is <code>22222</code>, which can be changed by modifying configuration file <code>dubbo.properties</code></p>\n<pre><code>dubbo.application.qos.port=33333\n</code></pre>\n<p>or by modifying the JVM parameter</p>\n<pre><code>-Ddubbo.application.qos.port=33333\n</code></pre>\n<h3>Safety</h3>\n<p>By default, dubbo can receive any command sent from the host, which can be changed by modifying the configuration file <code>dubbo.properties</code></p>\n<pre><code>dubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<p>or by configuring the JVM parameter</p>\n<pre><code>-Ddubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<p>to reject command sent from the remote host, allowing only the local server to run the command</p>\n<h3>Telnet and http protocol</h3>\n<p>The telnet module supports both http and telnet protocol, in order to facilitate the use of various situations</p>\n<p>For example,</p>\n<pre><code>➜  ~ telnet localhost 22222\nTrying ::1...\ntelnet: connect to address ::1: Connection refused\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is '^]'.\n  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄\n  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███\n  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███\n  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███\n  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███\n  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███\n  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀\n\n\ndubbo&gt;ls\nAs Provider side:\n+----------------------------------+---+\n|       Provider Service Name      |PUB|\n+----------------------------------+---+\n|com.alibaba.dubbo.demo.DemoService| N |\n+----------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n\ndubbo&gt;\n</code></pre>\n<pre><code>➜  ~ curl &quot;localhost:22222/ls?arg1=xxx&amp;arg2=xxxx&quot;\nAs Provider side:\n+----------------------------------+---+\n|       Provider Service Name      |PUB|\n+----------------------------------+---+\n|com.alibaba.dubbo.demo.DemoService| N |\n+----------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<h3>ls List consumers and providers</h3>\n<pre><code>dubbo&gt;ls\nAs Provider side:\n+----------------------------------+---+\n|       Provider Service Name      |PUB|\n+----------------------------------+---+\n|com.alibaba.dubbo.demo.DemoService| Y |\n+----------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>List the services of the provides and the consumers that dubbo provide</p>\n<h3>Online service command</h3>\n<p>When using delay publishing function(com.alibaba.dubbo.config.AbstractServiceConfig#register set as false), you can use “online” command to online the service</p>\n<pre><code>//online all services\ndubbo&gt;online\nOK\n\n//online part of servies according to regularity.\ndubbo&gt;online com.*\nOK\n</code></pre>\n<p>Common usage situations:</p>\n<ul>\n<li>Because there is no JIT or the related resources warm-up, when the machine is restarted and the online QPS is relatively high , a large amount of timeout situations may occur. At this time,the problem can be solved by distributing the batch service and increasing the traffic gradually.</li>\n<li>A machine needs to be back online after going offline due to some reasons.</li>\n</ul>\n<h3>Offline service Command</h3>\n<p>Offline command can be used if temporary offline service is needed when fault occurs.</p>\n<pre><code>//offline all service \ndubbo&gt;offline\nOK\n\n//offline some services according to regular rules\ndubbo&gt;offline com.*\nOK\n</code></pre>\n<h3>help command</h3>\n<pre><code>//list all commands\ndubbo&gt;help\n\n//list the specific use case of a command \ndubbo&gt;help online\n+--------------+----------------------------------------------------------------------------------+\n| COMMAND NAME | online                                                                           |\n+--------------+----------------------------------------------------------------------------------+\n|      EXAMPLE | online dubbo                                                                     |\n|              | online xx.xx.xxx.service                                                         |\n+--------------+----------------------------------------------------------------------------------+\ndubbo&gt;\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/qos.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/registry/introduction.json b/en-us/docs/user/references/registry/introduction.json
index 6f72fc4c..f2223ea3 100644
--- a/en-us/docs/user/references/registry/introduction.json
+++ b/en-us/docs/user/references/registry/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h2>Registry Server References</h2>\n<p>It is recommended to use <a href=\"./zookeeper.md\">zookeeper registry server</a></p>\n"
+  "__html": "<h2>Registry Server References</h2>\n<p>It is recommended to use <a href=\"./zookeeper.md\">zookeeper registry server</a></p>\n",
+  "link": "/en-us/docs/user/references/registry/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/registry/multicast.json b/en-us/docs/user/references/registry/multicast.json
index 549bbfaf..8ee5a928 100644
--- a/en-us/docs/user/references/registry/multicast.json
+++ b/en-us/docs/user/references/registry/multicast.json
@@ -1,4 +1,6 @@
 {
   "filename": "multicast.md",
-  "__html": "<h1>Multicast Registry</h1>\n<p>Multicast registry doesn't require to setup any central node. Just like IP address broadcast, dubbo service providers and consumers can discover each other through this mechanism.</p>\n<p><img src=\"../../sources/images/multicast.jpg\" alt=\"/user-guide/images/multicast.jpg\"></p>\n<ol start=\"0\">\n<li>Service provider broadcasts its address when it boots up.</li>\n<li>Service consumer broadcasts its subscription request when it boots up.</li>\n<li>Once service provider receives subscription request, it unicasts its own address to the corresponding consumer, if <code>unicast=false</code> is set, then broadcast will be used instead.</li>\n<li>When service consumer receives provider's address, it can start RPC invocation on the received address.</li>\n</ol>\n<p>Multicast is limited to network topology, and is only suitable for development purpose or small deployment. The valid multcast addresses scope is: 224.0.0.0 - 239.255.255.255.</p>\n<h2>Configuration</h2>\n<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\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"multicast\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"224.5.6.7:1234\"</span> /&gt;</span>\n</code></pre>\n<p>In order to avoid multicast as much as possible, dubbo uses unicast for address information from service provider to service consumer, if there are multiple consumer processes on one single machine, consumers need to set <code>unicast=false</code>, otherwise only one consumer can be able to receive the address info:</p>\n<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\">\"multicast://224.5.6.7:1234?unicast=false\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"multicast\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"224.5.6.7:1234\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"unicast\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:registry</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>Multicast Registry</h1>\n<p>Multicast registry doesn't require to setup any central node. Just like IP address broadcast, dubbo service providers and consumers can discover each other through this mechanism.</p>\n<p><img src=\"../../sources/images/multicast.jpg\" alt=\"/user-guide/images/multicast.jpg\"></p>\n<ol start=\"0\">\n<li>Service provider broadcasts its address when it boots up.</li>\n<li>Service consumer broadcasts its subscription request when it boots up.</li>\n<li>Once service provider receives subscription request, it unicasts its own address to the corresponding consumer, if <code>unicast=false</code> is set, then broadcast will be used instead.</li>\n<li>When service consumer receives provider's address, it can start RPC invocation on the received address.</li>\n</ol>\n<p>Multicast is limited to network topology, and is only suitable for development purpose or small deployment. The valid multcast addresses scope is: 224.0.0.0 - 239.255.255.255.</p>\n<h2>Configuration</h2>\n<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\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"multicast\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"224.5.6.7:1234\"</span> /&gt;</span>\n</code></pre>\n<p>In order to avoid multicast as much as possible, dubbo uses unicast for address information from service provider to service consumer, if there are multiple consumer processes on one single machine, consumers need to set <code>unicast=false</code>, otherwise only one consumer can be able to receive the address info:</p>\n<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\">\"multicast://224.5.6.7:1234?unicast=false\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"multicast\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"224.5.6.7:1234\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"unicast\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:registry</span>&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/registry/multicast.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/registry/redis.json b/en-us/docs/user/references/registry/redis.json
index 5f1fc463..c7f046e8 100644
--- a/en-us/docs/user/references/registry/redis.json
+++ b/en-us/docs/user/references/registry/redis.json
@@ -1,4 +1,6 @@
 {
   "filename": "redis.md",
-  "__html": "<h1>Redis Registry Server</h1>\n<p>It is a registry server implementation <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> based on redis <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<p><img src=\"../../sources/images/dubbo-redis-registry.jpg\" alt=\"/user-guide/images/dubbo-redis-registry.jpg\"></p>\n<p>Use key/map structure in redis to save the registration info:</p>\n<ul>\n<li>Main key for service name and type</li>\n<li>Key in the map is URL address</li>\n<li>Value in the map is the expiration time. Monitor center uses it to track and remove dirty data <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup></li>\n</ul>\n<p>Publish/Subscribe events in redis is leveraged for data change notification:</p>\n<ul>\n<li>Distinguish event type with event's value: <code>register</code>, <code>unregister</code>, <code>subscribe</code>, <code>unsubscribe</code>.</li>\n<li>Regular subscriber subscribes the particular key presenting service provider, then will receive <code>register</code> and <code>unregister</code> events fired from the specified service.</li>\n<li>Monitor center subscribes <code>/dubbo/*</code> via <code>psubscribe</code>, then will receive all change notifications from all services.</li>\n</ul>\n<p>Procedure:</p>\n<ol start=\"0\">\n<li>When service provider boots up, it adds its address under <code>Key:/dubbo/com.foo.BarService/providers</code>.</li>\n<li>Then service provider sends <code>register</code> event to <code>Channel:/dubbo/com.foo.BarService/providers</code></li>\n<li>When service consumer boots up, it subscribe events <code>register</code> and <code>unregister</code> from <code>Channel:/dubbo/com.foo.BarService/providers</code></li>\n<li>Then service consumer add its address under <code>Key:/dubbo/com.foo.BarService/providers</code></li>\n<li>When service consumer receives events <code>register</code> and <code>unregister</code>, it will fetch provider's addresses from <code>Key:/dubbo/com.foo.BarService/providers</code></li>\n<li>When monitor center boots up, it subscribes events <code>register</code>, <code>unregister</code>, <code>subscribe</code>, and <code>unsubsribe</code>.</li>\n<li>After monitor center receives <code>register</code> and <code>unregister</code>, it fetches provider's addresses from <code>Key:/dubbo/com.foo.BarService/providers</code></li>\n<li>After monitor center receives <code>subscribe</code> and <code>unsubscribe</code>, it fetches consumer's addresses from <code>Key:/dubbo/com.foo.BarService/consumers</code></li>\n</ol>\n<h2>Configuration</h2>\n<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\">\"redis://10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<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\">\"redis://10.20.153.10:6379?backup=10.20.153.11:6379,10.20.153.12:6379\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"redis\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"redis\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:6379,10.20.153.11:6379,10.20.153.12:6379\"</span> /&gt;</span>\n</code></pre>\n<h2>Options</h2>\n<ul>\n<li>Config key's prefix in redis via <code>&lt;dubbo:registry group=&quot;dubbo&quot; /&gt;</code>, the default value is <code>dubbo</code>.</li>\n<li>Config redis cluster strategy via <code>&lt;dubbo:registry cluster=&quot;replicate&quot; /&gt;</code>, the default value is <code>failover</code>:\n<ul>\n<li><code>failover</code>: when read/write error happens, try another instance, require the cluster to support data replication.</li>\n<li><code>replicate</code>: client writes to all nodes of the cluster, but only peeks a random node for read. The cluster doesn't need to take care of data replication, but may require more nodes and higher performance for each node, compared to option 1.</li>\n</ul>\n</li>\n</ul>\n<h2>Declaration of Reliability</h2>\n<p>A home-brewed service registry server is used in Alibaba instead of redis server. Redis based registry center does not have long-run practice within Alibaba, therefore we cannot guarantee its reliability. This registry server implementation is provided for dubbo community, and its reliability relies on redis itself largely.</p>\n<h2>Installation</h2>\n<p>Pls. refer to <a href=\"http://dubbo.apache.org/books/dubbo-admin-book/install/redis.html\">redis install manual</a> for how to install a redis based registry server. To set it up, specify <code>dubbo.registry.addrss</code> to <code>redis://127.0.0.1:6379</code> in <code>conf/dubbo.properties</code> for both provider and consumer (you can refer to <a href=\"../../preface/usage.md\">quick start</a>) after install a redis server.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.1.0</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"http://redis.io\">Redis</a> is a high performance KV cache server <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Heartbeat mechanism is used to detect the dirty data in redis. It requires time among servers must be sync in advanced, otherwise expiration check may inaccurate, plus, heartbeats may add extra pressure on servers. <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Redis Registry Server</h1>\n<p>It is a registry server implementation <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> based on redis <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<p><img src=\"../../sources/images/dubbo-redis-registry.jpg\" alt=\"/user-guide/images/dubbo-redis-registry.jpg\"></p>\n<p>Use key/map structure in redis to save the registration info:</p>\n<ul>\n<li>Main key for service name and type</li>\n<li>Key in the map is URL address</li>\n<li>Value in the map is the expiration time. Monitor center uses it to track and remove dirty data <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup></li>\n</ul>\n<p>Publish/Subscribe events in redis is leveraged for data change notification:</p>\n<ul>\n<li>Distinguish event type with event's value: <code>register</code>, <code>unregister</code>, <code>subscribe</code>, <code>unsubscribe</code>.</li>\n<li>Regular subscriber subscribes the particular key presenting service provider, then will receive <code>register</code> and <code>unregister</code> events fired from the specified service.</li>\n<li>Monitor center subscribes <code>/dubbo/*</code> via <code>psubscribe</code>, then will receive all change notifications from all services.</li>\n</ul>\n<p>Procedure:</p>\n<ol start=\"0\">\n<li>When service provider boots up, it adds its address under <code>Key:/dubbo/com.foo.BarService/providers</code>.</li>\n<li>Then service provider sends <code>register</code> event to <code>Channel:/dubbo/com.foo.BarService/providers</code></li>\n<li>When service consumer boots up, it subscribe events <code>register</code> and <code>unregister</code> from <code>Channel:/dubbo/com.foo.BarService/providers</code></li>\n<li>Then service consumer add its address under <code>Key:/dubbo/com.foo.BarService/providers</code></li>\n<li>When service consumer receives events <code>register</code> and <code>unregister</code>, it will fetch provider's addresses from <code>Key:/dubbo/com.foo.BarService/providers</code></li>\n<li>When monitor center boots up, it subscribes events <code>register</code>, <code>unregister</code>, <code>subscribe</code>, and <code>unsubsribe</code>.</li>\n<li>After monitor center receives <code>register</code> and <code>unregister</code>, it fetches provider's addresses from <code>Key:/dubbo/com.foo.BarService/providers</code></li>\n<li>After monitor center receives <code>subscribe</code> and <code>unsubscribe</code>, it fetches consumer's addresses from <code>Key:/dubbo/com.foo.BarService/consumers</code></li>\n</ol>\n<h2>Configuration</h2>\n<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\">\"redis://10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<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\">\"redis://10.20.153.10:6379?backup=10.20.153.11:6379,10.20.153.12:6379\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"redis\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:6379\"</span> /&gt;</span>\n</code></pre>\n<p>Or</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"redis\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:6379,10.20.153.11:6379,10.20.153.12:6379\"</span> /&gt;</span>\n</code></pre>\n<h2>Options</h2>\n<ul>\n<li>Config key's prefix in redis via <code>&lt;dubbo:registry group=&quot;dubbo&quot; /&gt;</code>, the default value is <code>dubbo</code>.</li>\n<li>Config redis cluster strategy via <code>&lt;dubbo:registry cluster=&quot;replicate&quot; /&gt;</code>, the default value is <code>failover</code>:\n<ul>\n<li><code>failover</code>: when read/write error happens, try another instance, require the cluster to support data replication.</li>\n<li><code>replicate</code>: client writes to all nodes of the cluster, but only peeks a random node for read. The cluster doesn't need to take care of data replication, but may require more nodes and higher performance for each node, compared to option 1.</li>\n</ul>\n</li>\n</ul>\n<h2>Declaration of Reliability</h2>\n<p>A home-brewed service registry server is used in Alibaba instead of redis server. Redis based registry center does not have long-run practice within Alibaba, therefore we cannot guarantee its reliability. This registry server implementation is provided for dubbo community, and its reliability relies on redis itself largely.</p>\n<h2>Installation</h2>\n<p>Pls. refer to <a href=\"http://dubbo.apache.org/books/dubbo-admin-book/install/redis.html\">redis install manual</a> for how to install a redis based registry server. To set it up, specify <code>dubbo.registry.addrss</code> to <code>redis://127.0.0.1:6379</code> in <code>conf/dubbo.properties</code> for both provider and consumer (you can refer to <a href=\"../../preface/usage.md\">quick start</a>) after install a redis server.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Support since <code>2.1.0</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"http://redis.io\">Redis</a> is a high performance KV cache server <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Heartbeat mechanism is used to detect the dirty data in redis. It requires time among servers must be sync in advanced, otherwise expiration check may inaccurate, plus, heartbeats may add extra pressure on servers. <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/references/registry/redis.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/registry/simple.json b/en-us/docs/user/references/registry/simple.json
index 077966ac..f1b25286 100644
--- a/en-us/docs/user/references/registry/simple.json
+++ b/en-us/docs/user/references/registry/simple.json
@@ -1,4 +1,6 @@
 {
   "filename": "simple.md",
-  "__html": "<h1>Simple Registry Server</h1>\n<p>Simple registry server itself is a regular dubbo service. In this way, third-party dependency is unnecessary, and communication keeps consistent at the same moment.</p>\n<h2>Configuration</h2>\n<p>Register simple registry server as dubbo service:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- application info configuration --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"simple-registry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service protocol configuration --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"9090\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service configuration --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.registry.RegistryService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"registryService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"N/A\"</span> <span class=\"hljs-attr\">ondisconnect</span>=<span class=\"hljs-string\">\"disconnect\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"subscribe\"</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"unsubscribe\"</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- simple registry server implementation, register other implementation if cluster ability is a requirement--&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registryService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.registry.simple.SimpleRegistryService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>Reference simple registry server service:</p>\n<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\">\"127.0.0.1:9090\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.registry.RegistryService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"simple\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">...</span> &gt;</span>\n</code></pre>\n<p>Or:</p>\n<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\">\"127.0.0.1:9090\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"simple\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<h2>Applicability</h2>\n<p>This <code>SimpleRegistryService</code> is just a simple implementation for register server, and it doesn't have cluster support. It is useful for the implementation reference for the custom registery server, but not suitable for use in production environment directly.</p>\n"
+  "__html": "<h1>Simple Registry Server</h1>\n<p>Simple registry server itself is a regular dubbo service. In this way, third-party dependency is unnecessary, and communication keeps consistent at the same moment.</p>\n<h2>Configuration</h2>\n<p>Register simple registry server as dubbo service:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- application info configuration --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"simple-registry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service protocol configuration --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"9090\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- service configuration --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.registry.RegistryService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"registryService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"N/A\"</span> <span class=\"hljs-attr\">ondisconnect</span>=<span class=\"hljs-string\">\"disconnect\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"subscribe\"</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"unsubscribe\"</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- simple registry server implementation, register other implementation if cluster ability is a requirement--&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registryService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.registry.simple.SimpleRegistryService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>Reference simple registry server service:</p>\n<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\">\"127.0.0.1:9090\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.registry.RegistryService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"simple\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">...</span> &gt;</span>\n</code></pre>\n<p>Or:</p>\n<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\">\"127.0.0.1:9090\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"simple\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<h2>Applicability</h2>\n<p>This <code>SimpleRegistryService</code> is just a simple implementation for register server, and it doesn't have cluster support. It is useful for the implementation reference for the custom registery server, but not suitable for use in production environment directly.</p>\n",
+  "link": "/en-us/docs/user/references/registry/simple.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/registry/zookeeper.json b/en-us/docs/user/references/registry/zookeeper.json
index 2448e424..389a3d7e 100644
--- a/en-us/docs/user/references/registry/zookeeper.json
+++ b/en-us/docs/user/references/registry/zookeeper.json
@@ -1,4 +1,6 @@
 {
   "filename": "zookeeper.md",
-  "__html": "<h1>Zookeeper Registry Server</h1>\n<p><a href=\"http://zookeeper.apache.org\">Zookeeper</a> is the child project of apache hadoop. Since it offers tree-like directory service and supports change notification, it's suitable to use it as dubbo's registry server. It's a field-proven product, therefore it's recommended to use it in the production environment. <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p><img src=\"../../sources/images/zookeeper.jpg\" alt=\"/user-guide/images/zookeeper.jpg\"></p>\n<p>Description on registration procedure:</p>\n<ul>\n<li>When service provider boots up: write service URL address under directory <code>/dubbo/com.foo.BarService/providers</code></li>\n<li>When service consumer boots up: subscribe to <code>/dubbo/com.foo.BarService/providers</code> for provider's URL addresses. At the same time, write consumer's URL address under <code>/dubbo/com.foo.BarService/providers</code>.</li>\n<li>When monitor center boots up: subscribe to <code>/dubbo/com.foo.BarService</code> for the URL addresses from all providers and consumers.</li>\n</ul>\n<p>The following abilities are supported:</p>\n<ul>\n<li>When provider stops by accident, registry server can remove its info automatically.</li>\n<li>When registry server reboots, all registration data and subscription requests can be recovered automatically.</li>\n<li>When session is expired, all registration data and subscription requests can be recovered automatically.</li>\n<li>When <code>&lt;dubbo:registry check=&quot;false&quot; /&gt;</code> is configured, failed requests for subscription and registration will be recorded and kept retrying in the background.</li>\n<li>Configure <code>&lt;dubbo:registry username=&quot;admin&quot; password=&quot;1234&quot; /&gt;</code> for zookeeper login.</li>\n<li>Configure <code>&lt;dubbo:registry group=&quot;dubbo&quot; /&gt;</code> for dubbo's root node on zookeeper. Default root node will be used if it's not specified.</li>\n<li>Support to use wildcard <code>*</code> in <code>&lt;dubbo:reference group=&quot;*&quot; version=&quot;*&quot; /&gt;</code> in order to subscribe all groups and all versions for the services to be referenced.</li>\n</ul>\n<h2>How to Use</h2>\n<p>Add zookeeper client dependency in both provider and consumer:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.zookeeper<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>zookeeper<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>3.3.3<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<p>Or <a href=\"http://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper\">download</a> directly from apache.</p>\n<p>Dubbo supports two zookeeper clients: zkclient and curator:</p>\n<h3>Use zkclient</h3>\n<p>Since <code>2.2.0</code> dubbo uses zkclient by default, in order to improve the robustness. <a href=\"https://github.com/sgroschupf/zkclient\">zkclient</a> is a zookeeper client implementation open-sourced by Datameer.</p>\n<p>Default configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"zkclient\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">dubbo.registry.client=zkclient\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">zookeeper://10.20.153.10:2181?client=zkclient\n</code></pre>\n<p>In order to use it, need to explicitly declare the following maven dependency or <a href=\"http://repo1.maven.org/maven2/com/github/sgroschupf/zkclient\">download its client</a>.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.github.sgroschupf<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>zkclient<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h3>Use curator</h3>\n<p>Since <code>2.3.0</code> dubbo also supports curator but explicit configuration is required. <a href=\"https://github.com/Netflix/curator\">Curator</a> is the zookeeper client open-sourced by Netflix.</p>\n<p>In order to switch to curator, use the configuration below:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"curator\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">dubbo.registry.client=curator\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">zookeeper://10.20.153.10:2181?client=curator\n</code></pre>\n<p>Also need to explicitly add maven dependency or directly <a href=\"http://repo1.maven.org/maven2/com/netflix/curator/curator-framework\">download</a> the jar:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.netflix.curator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>curator-framework<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>1.1.10<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<p>Zookeeper single node configuration:</p>\n<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://10.20.153.10:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Zookeeper cluster configuration:</p>\n<pre><code class=\"language-xml\">\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Configure single zookeeper to serve as multiple registry servers:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"china\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"intl\"</span> /&gt;</span>\n</code></pre>\n<h2>Zookeeper Installation</h2>\n<p>Pls. refer to <a href=\"http://dubbo.apache.org/books/dubbo-admin-book/install/zookeeper.html\">zookeeper install manual</a> for how to install zookeeper based registry server. To set it up, specify <code>dubbo.registry.address</code> to <code>zookeeper://127.0.0.1:2181</code> in <code>conf/dubbo.properties</code> for both provider and consumer (you can refer to <a href=\"../../preface/usage.md\">quick start</a>) after install a zookeeper server.</p>\n<h2>Declaration of Reliability</h2>\n<p>A home-brewed service registry server is used in Alibaba instead of zookeeper server. Zookeeper based registry center does not have long-run practice within Alibaba, therefore we cannot guarantee its reliability. Zookeeper registry server is provided for dubbo community, and its reliability relies on zookeeper itself largely.</p>\n<h2>Declaration of Compatibility</h2>\n<p>The original designed data structure for zookeeper in <code>2.0.8</code> has the limitation that data type cannot extended, it's redesigned in <code>2.0.9</code>. But at the same time incompatibility is introduced, thereby <code>2.0.9</code> is required for all service providers and service consumers.</p>\n<p>Since <code>2.2.0</code> zkclient is used by default, therefore its dependency is needed.</p>\n<p>Since <code>2.3.0</code> curator is supported as alternative option.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Suggest to use <code>2.3.3</code> or above for zookeeper registry client <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Zookeeper Registry Server</h1>\n<p><a href=\"http://zookeeper.apache.org\">Zookeeper</a> is the child project of apache hadoop. Since it offers tree-like directory service and supports change notification, it's suitable to use it as dubbo's registry server. It's a field-proven product, therefore it's recommended to use it in the production environment. <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p><img src=\"../../sources/images/zookeeper.jpg\" alt=\"/user-guide/images/zookeeper.jpg\"></p>\n<p>Description on registration procedure:</p>\n<ul>\n<li>When service provider boots up: write service URL address under directory <code>/dubbo/com.foo.BarService/providers</code></li>\n<li>When service consumer boots up: subscribe to <code>/dubbo/com.foo.BarService/providers</code> for provider's URL addresses. At the same time, write consumer's URL address under <code>/dubbo/com.foo.BarService/providers</code>.</li>\n<li>When monitor center boots up: subscribe to <code>/dubbo/com.foo.BarService</code> for the URL addresses from all providers and consumers.</li>\n</ul>\n<p>The following abilities are supported:</p>\n<ul>\n<li>When provider stops by accident, registry server can remove its info automatically.</li>\n<li>When registry server reboots, all registration data and subscription requests can be recovered automatically.</li>\n<li>When session is expired, all registration data and subscription requests can be recovered automatically.</li>\n<li>When <code>&lt;dubbo:registry check=&quot;false&quot; /&gt;</code> is configured, failed requests for subscription and registration will be recorded and kept retrying in the background.</li>\n<li>Configure <code>&lt;dubbo:registry username=&quot;admin&quot; password=&quot;1234&quot; /&gt;</code> for zookeeper login.</li>\n<li>Configure <code>&lt;dubbo:registry group=&quot;dubbo&quot; /&gt;</code> for dubbo's root node on zookeeper. Default root node will be used if it's not specified.</li>\n<li>Support to use wildcard <code>*</code> in <code>&lt;dubbo:reference group=&quot;*&quot; version=&quot;*&quot; /&gt;</code> in order to subscribe all groups and all versions for the services to be referenced.</li>\n</ul>\n<h2>How to Use</h2>\n<p>Add zookeeper client dependency in both provider and consumer:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.zookeeper<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>zookeeper<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>3.3.3<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<p>Or <a href=\"http://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper\">download</a> directly from apache.</p>\n<p>Dubbo supports two zookeeper clients: zkclient and curator:</p>\n<h3>Use zkclient</h3>\n<p>Since <code>2.2.0</code> dubbo uses zkclient by default, in order to improve the robustness. <a href=\"https://github.com/sgroschupf/zkclient\">zkclient</a> is a zookeeper client implementation open-sourced by Datameer.</p>\n<p>Default configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"zkclient\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">dubbo.registry.client=zkclient\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">zookeeper://10.20.153.10:2181?client=zkclient\n</code></pre>\n<p>In order to use it, need to explicitly declare the following maven dependency or <a href=\"http://repo1.maven.org/maven2/com/github/sgroschupf/zkclient\">download its client</a>.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.github.sgroschupf<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>zkclient<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h3>Use curator</h3>\n<p>Since <code>2.3.0</code> dubbo also supports curator but explicit configuration is required. <a href=\"https://github.com/Netflix/curator\">Curator</a> is the zookeeper client open-sourced by Netflix.</p>\n<p>In order to switch to curator, use the configuration below:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"curator\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">dubbo.registry.client=curator\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\">zookeeper://10.20.153.10:2181?client=curator\n</code></pre>\n<p>Also need to explicitly add maven dependency or directly <a href=\"http://repo1.maven.org/maven2/com/netflix/curator/curator-framework\">download</a> the jar:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.netflix.curator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>curator-framework<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>1.1.10<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<p>Zookeeper single node configuration:</p>\n<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://10.20.153.10:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Zookeeper cluster configuration:</p>\n<pre><code class=\"language-xml\">\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181\"</span> /&gt;</span>\n</code></pre>\n<p>Configure single zookeeper to serve as multiple registry servers:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"china\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"intl\"</span> /&gt;</span>\n</code></pre>\n<h2>Zookeeper Installation</h2>\n<p>Pls. refer to <a href=\"http://dubbo.apache.org/books/dubbo-admin-book/install/zookeeper.html\">zookeeper install manual</a> for how to install zookeeper based registry server. To set it up, specify <code>dubbo.registry.address</code> to <code>zookeeper://127.0.0.1:2181</code> in <code>conf/dubbo.properties</code> for both provider and consumer (you can refer to <a href=\"../../preface/usage.md\">quick start</a>) after install a zookeeper server.</p>\n<h2>Declaration of Reliability</h2>\n<p>A home-brewed service registry server is used in Alibaba instead of zookeeper server. Zookeeper based registry center does not have long-run practice within Alibaba, therefore we cannot guarantee its reliability. Zookeeper registry server is provided for dubbo community, and its reliability relies on zookeeper itself largely.</p>\n<h2>Declaration of Compatibility</h2>\n<p>The original designed data structure for zookeeper in <code>2.0.8</code> has the limitation that data type cannot extended, it's redesigned in <code>2.0.9</code>. But at the same time incompatibility is introduced, thereby <code>2.0.9</code> is required for all service providers and service consumers.</p>\n<p>Since <code>2.2.0</code> zkclient is used by default, therefore its dependency is needed.</p>\n<p>Since <code>2.3.0</code> curator is supported as alternative option.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Suggest to use <code>2.3.3</code> or above for zookeeper registry client <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/references/registry/zookeeper.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/telnet.json b/en-us/docs/user/references/telnet.json
index 51f0b943..dd64c7a6 100644
--- a/en-us/docs/user/references/telnet.json
+++ b/en-us/docs/user/references/telnet.json
@@ -1,4 +1,6 @@
 {
   "filename": "telnet.md",
-  "__html": "<h1>Telnet Command Reference</h1>\n<p>Since <code>2.0.5</code> dubbo starts supporting to use telnet command to govern services.</p>\n<h2>How To Use</h2>\n<pre><code class=\"language-sh\">telnet localhost 20880\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\"><span class=\"hljs-built_in\">echo</span> status | nc -i 1 localhost 20880\n</code></pre>\n<p>It is possible to extend command <code>status</code> to check more resources, pls. refer to <a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/status-checker.html\">extension references</a> for more details.</p>\n<h2>Supported Commands</h2>\n<p>The built-in telnet commands are listed below. Furthermore, it is possible to extend telnet commands, pls. refer to\n<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/telnet-handler.html\">extend telnet command</a> for more details.</p>\n<h3><code>ls</code></h3>\n<ol start=\"0\">\n<li><code>ls</code>: list services</li>\n<li><code>ls -l</code>: list services in more details</li>\n<li><code>ls XxxService</code>: list methods for the particular service</li>\n<li><code>ls -l XxxService</code>: list methods for the particular service in more dtails</li>\n</ol>\n<h3><code>ps</code></h3>\n<ol start=\"0\">\n<li><code>ps</code>: list service ports</li>\n<li><code>ps -l</code>: list service addresses</li>\n<li><code>ps 20880</code>: show connection info for the particular port</li>\n<li><code>ps -l 20880</code>: show connection info for the particular port in more details</li>\n</ol>\n<h3><code>cd</code></h3>\n<ol start=\"0\">\n<li><code>cd XxxService</code>: switch default service. When default service is set, service parameter can be ignored in all commands when it's needed</li>\n<li><code>cd /</code>: reset default service</li>\n</ol>\n<h3><code>pwd</code></h3>\n<p><code>pwd</code>: show what current default service is</p>\n<h3><code>trace</code></h3>\n<ol start=\"0\">\n<li><code>trace XxxService</code>: trace method invocation once for the given service</li>\n<li><code>trace XxxService 10</code>: trace method invocations 10 times for the given service</li>\n<li><code>trace XxxService xxxMethod</code>: trace particular method invocation once for the given service</li>\n<li><code>trace XxxService xxxMethod 10</code>: trace particular method invocations 10 times for the given service</li>\n</ol>\n<h3><code>count</code></h3>\n<ol start=\"0\">\n<li><code>count XxxService</code>: count method invocation once for the given service</li>\n<li><code>count XxxService 10</code>: count method invocations 10 times for the given service</li>\n<li><code>count XxxService xxxMethod</code>: count particular method invocation once for the given service</li>\n<li><code>count XxxService xxxMethod 10</code>: count particular method invocation 10 times for the given service</li>\n</ol>\n<h3><code>invoke</code></h3>\n<ol start=\"0\">\n<li><code>invoke XxxService.xxxMethod({&quot;prop&quot;: &quot;value&quot;})</code>: invoke particular method for the given service</li>\n<li><code>invoke xxxMethod({&quot;prop&quot;: &quot;value&quot;})</code>: invoke particular method for the default service</li>\n</ol>\n<h3><code>status</code></h3>\n<ol start=\"0\">\n<li><code>status</code>: show summarized status. This status summarizes statuses from all resources, and it shows OK when all resources are OK, shows ERROR when any resource has ERROR, and WARN when any has WARN.</li>\n<li><code>status -l</code>: show status list</li>\n</ol>\n<h3><code>log</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></h3>\n<ol start=\"0\">\n<li><code>log debug</code>: modify logger level to debug</li>\n<li><code>log 100</code>: examine the last 100 characters from the file logger</li>\n</ol>\n<h3><code>help</code></h3>\n<ol start=\"0\">\n<li><code>help</code>: show help for telnet commands</li>\n<li><code>help xxx</code>: 显示xxx命令的详细帮助信息</li>\n<li><code>help xxx</code>: show help for particular telnet command</li>\n</ol>\n<h3><code>clear</code></h3>\n<ol start=\"0\">\n<li><code>clear</code>: clear screen</li>\n<li><code>clear 100</code>: only clear particular lines on the screen</li>\n</ol>\n<h3><code>exit</code></h3>\n<p><code>exit</code>: exit current telnet session</p>\n<h2>QoS' Parameters</h2>\n<p>You can use parameters that QoS provides to config its startup. These parameters include:</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Explanation</th>\n<th>Default</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>qosEnable</td>\n<td>Activate QoS or not</td>\n<td>true</td>\n</tr>\n<tr>\n<td>qosPort</td>\n<td>The port QoS would bind to</td>\n<td>22222</td>\n</tr>\n<tr>\n<td>qosAcceptForeignIp</td>\n<td>Enable remote access or not</td>\n<td>false</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>Attention. From 2.6.4/2.7.0, <code>qosAcceptForeignIp</code> is set to <code>false</code> by default, because it's risky if this property is set to <code>true</code>. Think twice before you turn it on.</p>\n</blockquote>\n<p>You can configure these parameters in the following ways:</p>\n<ul>\n<li>System property</li>\n<li><code>dubbo.properties</code></li>\n<li>XML</li>\n<li>Spring-boot auto configuration</li>\n</ul>\n<p>They have priority in the following order: system property &gt; <code>dubbo.properties</code> &gt; XML &gt; spring-boot.</p>\n<h3>System Property</h3>\n<pre><code>-Ddubbo.application.qos.enable=true\n-Ddubbo.application.qos.port=33333\n-Ddubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h3><code>Dubbo.properties</code></h3>\n<p>Create a <code>dubbo.properties</code> file in this directory <code>src/main/resources</code> in your project, and copy the following codes into it:</p>\n<pre><code>dubbo.application.qos.enable=true\ndubbo.application.qos.port=33333\ndubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h3>XML</h3>\n<p>If you are going to config using XML, you can try this:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.enable\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.accept.foreign.ip\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.port\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"33333\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n  <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\">\"20880\"</span>/&gt;</span>\n  <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.demo.provider.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.provider.DemoServiceImpl\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>spring-boot auto configuration</h3>\n<p>If you are developing a spring-boot application, you can configure in <code>application.properties</code> or <code>application.yml</code>:</p>\n<pre><code>dubbo.application.qosEnable=true\ndubbo.application.qosPort=33333\ndubbo.application.qosAcceptForeignIp=false\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>support since <code>2.0.6</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Telnet Command Reference</h1>\n<p>Since <code>2.0.5</code> dubbo starts supporting to use telnet command to govern services.</p>\n<h2>How To Use</h2>\n<pre><code class=\"language-sh\">telnet localhost 20880\n</code></pre>\n<p>Or:</p>\n<pre><code class=\"language-sh\"><span class=\"hljs-built_in\">echo</span> status | nc -i 1 localhost 20880\n</code></pre>\n<p>It is possible to extend command <code>status</code> to check more resources, pls. refer to <a href=\"http://dubbo.apache.org/books/dubbo-dev-book-en/impls/status-checker.html\">extension references</a> for more details.</p>\n<h2>Supported Commands</h2>\n<p>The built-in telnet commands are listed below. Furthermore, it is possible to extend telnet commands, pls. refer to\n<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/telnet-handler.html\">extend telnet command</a> for more details.</p>\n<h3><code>ls</code></h3>\n<ol start=\"0\">\n<li><code>ls</code>: list services</li>\n<li><code>ls -l</code>: list services in more details</li>\n<li><code>ls XxxService</code>: list methods for the particular service</li>\n<li><code>ls -l XxxService</code>: list methods for the particular service in more dtails</li>\n</ol>\n<h3><code>ps</code></h3>\n<ol start=\"0\">\n<li><code>ps</code>: list service ports</li>\n<li><code>ps -l</code>: list service addresses</li>\n<li><code>ps 20880</code>: show connection info for the particular port</li>\n<li><code>ps -l 20880</code>: show connection info for the particular port in more details</li>\n</ol>\n<h3><code>cd</code></h3>\n<ol start=\"0\">\n<li><code>cd XxxService</code>: switch default service. When default service is set, service parameter can be ignored in all commands when it's needed</li>\n<li><code>cd /</code>: reset default service</li>\n</ol>\n<h3><code>pwd</code></h3>\n<p><code>pwd</code>: show what current default service is</p>\n<h3><code>trace</code></h3>\n<ol start=\"0\">\n<li><code>trace XxxService</code>: trace method invocation once for the given service</li>\n<li><code>trace XxxService 10</code>: trace method invocations 10 times for the given service</li>\n<li><code>trace XxxService xxxMethod</code>: trace particular method invocation once for the given service</li>\n<li><code>trace XxxService xxxMethod 10</code>: trace particular method invocations 10 times for the given service</li>\n</ol>\n<h3><code>count</code></h3>\n<ol start=\"0\">\n<li><code>count XxxService</code>: count method invocation once for the given service</li>\n<li><code>count XxxService 10</code>: count method invocations 10 times for the given service</li>\n<li><code>count XxxService xxxMethod</code>: count particular method invocation once for the given service</li>\n<li><code>count XxxService xxxMethod 10</code>: count particular method invocation 10 times for the given service</li>\n</ol>\n<h3><code>invoke</code></h3>\n<ol start=\"0\">\n<li><code>invoke XxxService.xxxMethod({&quot;prop&quot;: &quot;value&quot;})</code>: invoke particular method for the given service</li>\n<li><code>invoke xxxMethod({&quot;prop&quot;: &quot;value&quot;})</code>: invoke particular method for the default service</li>\n</ol>\n<h3><code>status</code></h3>\n<ol start=\"0\">\n<li><code>status</code>: show summarized status. This status summarizes statuses from all resources, and it shows OK when all resources are OK, shows ERROR when any resource has ERROR, and WARN when any has WARN.</li>\n<li><code>status -l</code>: show status list</li>\n</ol>\n<h3><code>log</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></h3>\n<ol start=\"0\">\n<li><code>log debug</code>: modify logger level to debug</li>\n<li><code>log 100</code>: examine the last 100 characters from the file logger</li>\n</ol>\n<h3><code>help</code></h3>\n<ol start=\"0\">\n<li><code>help</code>: show help for telnet commands</li>\n<li><code>help xxx</code>: 显示xxx命令的详细帮助信息</li>\n<li><code>help xxx</code>: show help for particular telnet command</li>\n</ol>\n<h3><code>clear</code></h3>\n<ol start=\"0\">\n<li><code>clear</code>: clear screen</li>\n<li><code>clear 100</code>: only clear particular lines on the screen</li>\n</ol>\n<h3><code>exit</code></h3>\n<p><code>exit</code>: exit current telnet session</p>\n<h2>QoS' Parameters</h2>\n<p>You can use parameters that QoS provides to config its startup. These parameters include:</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Explanation</th>\n<th>Default</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>qosEnable</td>\n<td>Activate QoS or not</td>\n<td>true</td>\n</tr>\n<tr>\n<td>qosPort</td>\n<td>The port QoS would bind to</td>\n<td>22222</td>\n</tr>\n<tr>\n<td>qosAcceptForeignIp</td>\n<td>Enable remote access or not</td>\n<td>false</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>Attention. From 2.6.4/2.7.0, <code>qosAcceptForeignIp</code> is set to <code>false</code> by default, because it's risky if this property is set to <code>true</code>. Think twice before you turn it on.</p>\n</blockquote>\n<p>You can configure these parameters in the following ways:</p>\n<ul>\n<li>System property</li>\n<li><code>dubbo.properties</code></li>\n<li>XML</li>\n<li>Spring-boot auto configuration</li>\n</ul>\n<p>They have priority in the following order: system property &gt; <code>dubbo.properties</code> &gt; XML &gt; spring-boot.</p>\n<h3>System Property</h3>\n<pre><code>-Ddubbo.application.qos.enable=true\n-Ddubbo.application.qos.port=33333\n-Ddubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h3><code>Dubbo.properties</code></h3>\n<p>Create a <code>dubbo.properties</code> file in this directory <code>src/main/resources</code> in your project, and copy the following codes into it:</p>\n<pre><code>dubbo.application.qos.enable=true\ndubbo.application.qos.port=33333\ndubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h3>XML</h3>\n<p>If you are going to config using XML, you can try this:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.enable\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.accept.foreign.ip\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.port\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"33333\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n  <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\">\"20880\"</span>/&gt;</span>\n  <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.demo.provider.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.provider.DemoServiceImpl\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>spring-boot auto configuration</h3>\n<p>If you are developing a spring-boot application, you can configure in <code>application.properties</code> or <code>application.yml</code>:</p>\n<pre><code>dubbo.application.qosEnable=true\ndubbo.application.qosPort=33333\ndubbo.application.qosAcceptForeignIp=false\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>support since <code>2.0.6</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/references/telnet.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-application.json b/en-us/docs/user/references/xml/dubbo-application.json
index efdb5e4e..515ae1e5 100644
--- a/en-us/docs/user/references/xml/dubbo-application.json
+++ b/en-us/docs/user/references/xml/dubbo-application.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-application.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:application</h1>\n<p>Application configuration. The corresponding class: <code>com.alibaba.dubbo.config.ApplicationConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>application</td>\n<td>string</td>\n<td><b>Y</b></td>\n<td></td>\n<td>service governance</td>\n<td>Application name is the unique identifier of an application. It is for registry combing the dependencies of applications. Note: Consumer and provider application name should not be the same, and this parameter is not a match condition. As a suggestion, you can name it as your project name. For example, kylin application invokes the service of morgan application, then you can name kylin application as &quot;kylin&quot;, and morgan application as &quot;morgan&quot;. Maybe kylin also works as a provider, but kylin should still called &quot;kylin&quot;. In this way, registry can understand the dependence of applications</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>version</td>\n<td>application.version</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>The version of current application</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Application manager. Pls. fill in the mailbox prefix of the person in charge</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>organization</td>\n<td>organization</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Organization name is for registry distinguishing between the source of service. As a suggestion, this property should be written in config file directly. Such as china,intl,itu,crm,asc,dw,aliexpress etc.</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>architecture <br class=\"atl-forced-newline\" /></td>\n<td>architecture <br class=\"atl-forced-newline\" /></td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>The architecture of service layering. Like intl,china and so on. Different architecture use different layer</td>\n<td>above 2.0.7</td>\n</tr>\n<tr>\n<td>environment</td>\n<td>environment</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Application environment. Like develop,test,product. Work as the limit condition of developing new function</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>compiler</td>\n<td>compiler</td>\n<td>string</td>\n<td>N</td>\n<td>javassist</td>\n<td>performance optimization</td>\n<td>Java class <a href=\"http://compile.It\">compile.It</a> is used for the generating of dynamic class. The options are JDK and javassist</td>\n<td>above 2.1.0</td>\n</tr>\n<tr>\n<td>logger</td>\n<td>logger</td>\n<td>string</td>\n<td>N</td>\n<td>slf4j</td>\n<td>performance optimization</td>\n<td>The format of log output,The options are slf4j,jcl,log4j,log4j2 and jdk</td>\n<td>above 2.2.0</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:application</h1>\n<p>Application configuration. The corresponding class: <code>com.alibaba.dubbo.config.ApplicationConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>application</td>\n<td>string</td>\n<td><b>Y</b></td>\n<td></td>\n<td>service governance</td>\n<td>Application name is the unique identifier of an application. It is for registry combing the dependencies of applications. Note: Consumer and provider application name should not be the same, and this parameter is not a match condition. As a suggestion, you can name it as your project name. For example, kylin application invokes the service of morgan application, then you can name kylin application as &quot;kylin&quot;, and morgan application as &quot;morgan&quot;. Maybe kylin also works as a provider, but kylin should still called &quot;kylin&quot;. In this way, registry can understand the dependence of applications</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>version</td>\n<td>application.version</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>The version of current application</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Application manager. Pls. fill in the mailbox prefix of the person in charge</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>organization</td>\n<td>organization</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Organization name is for registry distinguishing between the source of service. As a suggestion, this property should be written in config file directly. Such as china,intl,itu,crm,asc,dw,aliexpress etc.</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>architecture <br class=\"atl-forced-newline\" /></td>\n<td>architecture <br class=\"atl-forced-newline\" /></td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>The architecture of service layering. Like intl,china and so on. Different architecture use different layer</td>\n<td>above 2.0.7</td>\n</tr>\n<tr>\n<td>environment</td>\n<td>environment</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Application environment. Like develop,test,product. Work as the limit condition of developing new function</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>compiler</td>\n<td>compiler</td>\n<td>string</td>\n<td>N</td>\n<td>javassist</td>\n<td>performance optimization</td>\n<td>Java class <a href=\"http://compile.It\">compile.It</a> is used for the generating of dynamic class. The options are JDK and javassist</td>\n<td>above 2.1.0</td>\n</tr>\n<tr>\n<td>logger</td>\n<td>logger</td>\n<td>string</td>\n<td>N</td>\n<td>slf4j</td>\n<td>performance optimization</td>\n<td>The format of log output,The options are slf4j,jcl,log4j,log4j2 and jdk</td>\n<td>above 2.2.0</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-application.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-argument.json b/en-us/docs/user/references/xml/dubbo-argument.json
index 631933af..3c9f9363 100644
--- a/en-us/docs/user/references/xml/dubbo-argument.json
+++ b/en-us/docs/user/references/xml/dubbo-argument.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-argument.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:argument</h1>\n<p>Method argument configuration. The corresponding class:<code>com.alibaba.dubbo.config.ArgumentConfig</code>. This tag is child of <code>&lt;dubbo:method&gt;</code>, which is for feature description of method argument, such as:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findXxx\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"3000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"0\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>index</td>\n<td></td>\n<td>int</td>\n<td><b>Y</b></td>\n<td></td>\n<td>identification</td>\n<td>method name</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>type</td>\n<td></td>\n<td>String</td>\n<td>Index and type choose one</td>\n<td></td>\n<td>identification</td>\n<td>Find index of argument by it</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>callback</td>\n<td>&lt;metodName&gt;&lt;index&gt;.retries</td>\n<td>boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Mark whether this argument is a callback service. If true, provider will generate reverse proxy,which can invoke consumer in turn. Generally for event pushing</td>\n<td>above 2.0.6</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:argument</h1>\n<p>Method argument configuration. The corresponding class:<code>com.alibaba.dubbo.config.ArgumentConfig</code>. This tag is child of <code>&lt;dubbo:method&gt;</code>, which is for feature description of method argument, such as:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findXxx\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"3000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"0\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>index</td>\n<td></td>\n<td>int</td>\n<td><b>Y</b></td>\n<td></td>\n<td>identification</td>\n<td>method name</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>type</td>\n<td></td>\n<td>String</td>\n<td>Index and type choose one</td>\n<td></td>\n<td>identification</td>\n<td>Find index of argument by it</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>callback</td>\n<td>&lt;metodName&gt;&lt;index&gt;.retries</td>\n<td>boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Mark whether this argument is a callback service. If true, provider will generate reverse proxy,which can invoke consumer in turn. Generally for event pushing</td>\n<td>above 2.0.6</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-argument.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-consumer.json b/en-us/docs/user/references/xml/dubbo-consumer.json
index 5e98acc8..41a16a56 100644
--- a/en-us/docs/user/references/xml/dubbo-consumer.json
+++ b/en-us/docs/user/references/xml/dubbo-consumer.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-consumer.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:consumer</h1>\n<p>Consumer default configuration. The corresponding clas: <code>com.alibaba.dubbo.config.ConsumerConfig</code>. It is also default configuration of <code>&lt;dubbo:reference&gt;</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>timeout</td>\n<td>default.timeout</td>\n<td>int</td>\n<td>N</td>\n<td>1000</td>\n<td>performance optimization</td>\n<td>invoking timeout(ms)</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>default.retries</td>\n<td>int</td>\n<td>N</td>\n<td>2</td>\n<td>performance optimization</td>\n<td>Invoking retry times, exclude the first invoking. Set 0 to disable it</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>default.loadbalance</td>\n<td>string</td>\n<td>N</td>\n<td>random</td>\n<td>performance optimization</td>\n<td>Load balancing strategy. Choices:random, roundrobin(polling), leastactive(invoking least active service)</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>async</td>\n<td>default.async</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>performance optimization</td>\n<td>Whether invoke asynchronously</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>default.connections</td>\n<td>int</td>\n<td>N</td>\n<td>100</td>\n<td>performance optimization</td>\n<td>The maximum number of connections of per service provider. Only short link protocol such as rmi,http,hessian etc. supports. Long link protocol such as dubbo doesn't support</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>generic</td>\n<td>generic</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>service governance</td>\n<td>Whether default generic interface. A instance of GenericService will be got if true.</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>check</td>\n<td>check</td>\n<td>boolean</td>\n<td>N</td>\n<td>true</td>\n<td>service governance</td>\n<td>Whether check the survival of provider. If true, throw exception when no provider of some services is alive. Otherwise, just ignore it</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>string</td>\n<td>N</td>\n<td>javassist</td>\n<td>performance optimization</td>\n<td>Java class <a href=\"http://compile.It\">compile.It</a> is used for the generating of dynamic class. The options are JDK and javassist</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Application manager. Pls. fill in the mailbox prefix of the person in charge</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>default.actives</td>\n<td>int</td>\n<td>N</td>\n<td>0</td>\n<td>performance optimization</td>\n<td>The max concurrency of per service method for each corresponding consumer</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>default.cluster</td>\n<td>string</td>\n<td>N</td>\n<td>failover</td>\n<td>performance optimization</td>\n<td>Cluster tolerance. Choices:failover/failfast/failsafe/failback/forking</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>reference.filter</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>The name of filter which intercepts consumer remote invoke. Multiple names are separated by commas</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>invoker.listener</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>The consumer referenced service listener name. Multiple names are separated by commas</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>registry</td>\n<td></td>\n<td>string</td>\n<td>N</td>\n<td>register with the registry</td>\n<td>configuration relevant</td>\n<td>Register with the designated registry. Generally,for multiple registries, and value is the &quot;id&quot; of &lt;dubbo:registry&gt;. Multiple registries are separated by commas.If you do not want to register the service to any registry,pls set &quot;N/A&quot;</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>The layer of consumer. Such as: biz, dao, intl:web, china:acton</td>\n<td>above 2.0.7</td>\n</tr>\n<tr>\n<td>init</td>\n<td>init</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>performance optimization</td>\n<td>If true, initialize when &quot;afterPropertiesSet()&quot; is invoked. Otherwise wait until the instance is referenced to initialize</td>\n<td>above 2.0.10</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>cache</td>\n<td>string/boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Cache return result, and key is call parameters. Choices: lru, threadlocal, jcache and so on</td>\n<td>at least 2.1.0</td>\n</tr>\n<tr>\n<td>validation</td>\n<td>validation</td>\n<td>boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Whether enable JSR303 standard annotation validation</td>\n<td>at least 2.1.0</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:consumer</h1>\n<p>Consumer default configuration. The corresponding clas: <code>com.alibaba.dubbo.config.ConsumerConfig</code>. It is also default configuration of <code>&lt;dubbo:reference&gt;</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>timeout</td>\n<td>default.timeout</td>\n<td>int</td>\n<td>N</td>\n<td>1000</td>\n<td>performance optimization</td>\n<td>invoking timeout(ms)</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>default.retries</td>\n<td>int</td>\n<td>N</td>\n<td>2</td>\n<td>performance optimization</td>\n<td>Invoking retry times, exclude the first invoking. Set 0 to disable it</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>default.loadbalance</td>\n<td>string</td>\n<td>N</td>\n<td>random</td>\n<td>performance optimization</td>\n<td>Load balancing strategy. Choices:random, roundrobin(polling), leastactive(invoking least active service)</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>async</td>\n<td>default.async</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>performance optimization</td>\n<td>Whether invoke asynchronously</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>default.connections</td>\n<td>int</td>\n<td>N</td>\n<td>100</td>\n<td>performance optimization</td>\n<td>The maximum number of connections of per service provider. Only short link protocol such as rmi,http,hessian etc. supports. Long link protocol such as dubbo doesn't support</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>generic</td>\n<td>generic</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>service governance</td>\n<td>Whether default generic interface. A instance of GenericService will be got if true.</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>check</td>\n<td>check</td>\n<td>boolean</td>\n<td>N</td>\n<td>true</td>\n<td>service governance</td>\n<td>Whether check the survival of provider. If true, throw exception when no provider of some services is alive. Otherwise, just ignore it</td>\n<td>above 1.0.16</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>string</td>\n<td>N</td>\n<td>javassist</td>\n<td>performance optimization</td>\n<td>Java class <a href=\"http://compile.It\">compile.It</a> is used for the generating of dynamic class. The options are JDK and javassist</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Application manager. Pls. fill in the mailbox prefix of the person in charge</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>default.actives</td>\n<td>int</td>\n<td>N</td>\n<td>0</td>\n<td>performance optimization</td>\n<td>The max concurrency of per service method for each corresponding consumer</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>default.cluster</td>\n<td>string</td>\n<td>N</td>\n<td>failover</td>\n<td>performance optimization</td>\n<td>Cluster tolerance. Choices:failover/failfast/failsafe/failback/forking</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>reference.filter</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>The name of filter which intercepts consumer remote invoke. Multiple names are separated by commas</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>invoker.listener</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>The consumer referenced service listener name. Multiple names are separated by commas</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>registry</td>\n<td></td>\n<td>string</td>\n<td>N</td>\n<td>register with the registry</td>\n<td>configuration relevant</td>\n<td>Register with the designated registry. Generally,for multiple registries, and value is the &quot;id&quot; of &lt;dubbo:registry&gt;. Multiple registries are separated by commas.If you do not want to register the service to any registry,pls set &quot;N/A&quot;</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>The layer of consumer. Such as: biz, dao, intl:web, china:acton</td>\n<td>above 2.0.7</td>\n</tr>\n<tr>\n<td>init</td>\n<td>init</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>performance optimization</td>\n<td>If true, initialize when &quot;afterPropertiesSet()&quot; is invoked. Otherwise wait until the instance is referenced to initialize</td>\n<td>above 2.0.10</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>cache</td>\n<td>string/boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Cache return result, and key is call parameters. Choices: lru, threadlocal, jcache and so on</td>\n<td>at least 2.1.0</td>\n</tr>\n<tr>\n<td>validation</td>\n<td>validation</td>\n<td>boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Whether enable JSR303 standard annotation validation</td>\n<td>at least 2.1.0</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-consumer.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-method.json b/en-us/docs/user/references/xml/dubbo-method.json
index 02c0c0fe..30e47cbb 100644
--- a/en-us/docs/user/references/xml/dubbo-method.json
+++ b/en-us/docs/user/references/xml/dubbo-method.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-method.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:method</h1>\n<p>Method level configuration. The corresponding class: <code>com.alibaba.dubbo.config.MethodConfig</code>. This tag is a child tag of <code>&lt;dubbo:service&gt;</code> or <code>&lt;dubbo:reference&gt;</code>, for accuracy to method level.</p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td></td>\n<td>string</td>\n<td><b>Y</b></td>\n<td></td>\n<td>identifier</td>\n<td>Method name</td>\n<td>above 1.0.8</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>&lt;metodName&gt;.timeout</td>\n<td>int</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; timeout</td>\n<td>performance optimization</td>\n<td>Method call timeout(ms)</td>\n<td>above 1.0.8</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>&lt;metodName&gt;.retries</td>\n<td>int</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; retries</td>\n<td>performance optimization</td>\n<td>Invoking retry times, exclude the first invoking. Set 0 to disable it</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>&lt;metodName&gt;.loadbalance</td>\n<td>string</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; loadbalance</td>\n<td>performance optimization</td>\n<td>Load balancing strategy. Choices:random, roundrobin(polling), leastactive(invoking least active service)</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>async</td>\n<td>&lt;metodName&gt;.async</td>\n<td>boolean</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; async</td>\n<td>performance optimization</td>\n<td>Whether invoke asynchronously</td>\n<td>above 1.0.9</td>\n</tr>\n<tr>\n<td>sent</td>\n<td>&lt;methodName&gt;.sent</td>\n<td>boolean</td>\n<td>N</td>\n<td>true</td>\n<td>performance optimization</td>\n<td>Generally used when async is true, and If true, indicate that the network has sent out data</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>&lt;metodName&gt;.actives</td>\n<td>int</td>\n<td>N</td>\n<td>0</td>\n<td>performance optimization</td>\n<td>The max concurrency of per service method for each corresponding consumer</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>&lt;metodName&gt;.executes</td>\n<td>int</td>\n<td>N</td>\n<td>0</td>\n<td>performance optimization</td>\n<td>The maximum number of threads of per service method is limited- -. Only take effect when &lt;dubbo:method&gt; is &lt;dubbo:service&gt; child tag</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>deprecated</td>\n<td>&lt;methodName&gt;.deprecated</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>service governance</td>\n<td>Whether is deprecated method. Only take effect when &lt;dubbo:method&gt; is &lt;dubbo:service&gt; child tag</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>sticky</td>\n<td>&lt;methodName&gt;.sticky</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>service governance</td>\n<td>If true, all methods on this interface use the same provider. If more complex rules are required, use routing</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>return</td>\n<td>&lt;methodName&gt;.return</td>\n<td>boolean</td>\n<td>N</td>\n<td>true</td>\n<td>performance optimization</td>\n<td>Whether need return value. Only take effect when async is true. If true, return future, or callback such as &quot;onreturn&quot; method. Otherwise, return null.</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>oninvoke</td>\n<td></td>\n<td>String</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>Intercept before invoke</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>onreturn</td>\n<td></td>\n<td>String</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>Intercept after invoke</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>onthrow</td>\n<td></td>\n<td>String</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>Intercept when catch exception</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>&lt;methodName&gt;.cache</td>\n<td>string/boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Cache return result, and key is call parameters. Choices: lru, threadlocal, jcache and so on</td>\n<td>at least 2.1.0</td>\n</tr>\n<tr>\n<td>validation</td>\n<td>&lt;methodName&gt;.validation</td>\n<td>boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Whether enable JSR303 standard annotation validation</td>\n<td>at least 2.1.0</td>\n</tr>\n</tbody>\n</table>\n<p>For example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findXxx\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"3000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:method</h1>\n<p>Method level configuration. The corresponding class: <code>com.alibaba.dubbo.config.MethodConfig</code>. This tag is a child tag of <code>&lt;dubbo:service&gt;</code> or <code>&lt;dubbo:reference&gt;</code>, for accuracy to method level.</p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td></td>\n<td>string</td>\n<td><b>Y</b></td>\n<td></td>\n<td>identifier</td>\n<td>Method name</td>\n<td>above 1.0.8</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>&lt;metodName&gt;.timeout</td>\n<td>int</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; timeout</td>\n<td>performance optimization</td>\n<td>Method call timeout(ms)</td>\n<td>above 1.0.8</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>&lt;metodName&gt;.retries</td>\n<td>int</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; retries</td>\n<td>performance optimization</td>\n<td>Invoking retry times, exclude the first invoking. Set 0 to disable it</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>&lt;metodName&gt;.loadbalance</td>\n<td>string</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; loadbalance</td>\n<td>performance optimization</td>\n<td>Load balancing strategy. Choices:random, roundrobin(polling), leastactive(invoking least active service)</td>\n<td>above 2.0.0</td>\n</tr>\n<tr>\n<td>async</td>\n<td>&lt;metodName&gt;.async</td>\n<td>boolean</td>\n<td>N</td>\n<td>&lt;dubbo:reference&gt; async</td>\n<td>performance optimization</td>\n<td>Whether invoke asynchronously</td>\n<td>above 1.0.9</td>\n</tr>\n<tr>\n<td>sent</td>\n<td>&lt;methodName&gt;.sent</td>\n<td>boolean</td>\n<td>N</td>\n<td>true</td>\n<td>performance optimization</td>\n<td>Generally used when async is true, and If true, indicate that the network has sent out data</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>&lt;metodName&gt;.actives</td>\n<td>int</td>\n<td>N</td>\n<td>0</td>\n<td>performance optimization</td>\n<td>The max concurrency of per service method for each corresponding consumer</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>&lt;metodName&gt;.executes</td>\n<td>int</td>\n<td>N</td>\n<td>0</td>\n<td>performance optimization</td>\n<td>The maximum number of threads of per service method is limited- -. Only take effect when &lt;dubbo:method&gt; is &lt;dubbo:service&gt; child tag</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>deprecated</td>\n<td>&lt;methodName&gt;.deprecated</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>service governance</td>\n<td>Whether is deprecated method. Only take effect when &lt;dubbo:method&gt; is &lt;dubbo:service&gt; child tag</td>\n<td>above 2.0.5</td>\n</tr>\n<tr>\n<td>sticky</td>\n<td>&lt;methodName&gt;.sticky</td>\n<td>boolean</td>\n<td>N</td>\n<td>false</td>\n<td>service governance</td>\n<td>If true, all methods on this interface use the same provider. If more complex rules are required, use routing</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>return</td>\n<td>&lt;methodName&gt;.return</td>\n<td>boolean</td>\n<td>N</td>\n<td>true</td>\n<td>performance optimization</td>\n<td>Whether need return value. Only take effect when async is true. If true, return future, or callback such as &quot;onreturn&quot; method. Otherwise, return null.</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>oninvoke</td>\n<td></td>\n<td>String</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>Intercept before invoke</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>onreturn</td>\n<td></td>\n<td>String</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>Intercept after invoke</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>onthrow</td>\n<td></td>\n<td>String</td>\n<td>N</td>\n<td></td>\n<td>performance optimization</td>\n<td>Intercept when catch exception</td>\n<td>above 2.0.6</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>&lt;methodName&gt;.cache</td>\n<td>string/boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Cache return result, and key is call parameters. Choices: lru, threadlocal, jcache and so on</td>\n<td>at least 2.1.0</td>\n</tr>\n<tr>\n<td>validation</td>\n<td>&lt;methodName&gt;.validation</td>\n<td>boolean</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Whether enable JSR303 standard annotation validation</td>\n<td>at least 2.1.0</td>\n</tr>\n</tbody>\n</table>\n<p>For example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findXxx\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"3000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-method.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-module.json b/en-us/docs/user/references/xml/dubbo-module.json
index b767b9f0..e7236c60 100644
--- a/en-us/docs/user/references/xml/dubbo-module.json
+++ b/en-us/docs/user/references/xml/dubbo-module.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-module.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:module</h1>\n<p>Module configuration. The corresponding class <code>com.alibaba.dubbo.config.ModuleConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>The corresponding class</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>module</td>\n<td>string</td>\n<td><b>Y</b></td>\n<td></td>\n<td>service governance</td>\n<td>Module name is for registry combing the dependencies of modules.</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>version</td>\n<td>module.version</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>module version</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Module manager, Pls. fill in the mailbox prefix of the person in charge</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>organization</td>\n<td>organization</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Organization name is for registry distinguishing between the source of service. As a suggestion, this property should be written in config file directly. Such as china,intl,itu,crm,asc,dw,aliexpress etc.</td>\n<td>above 2.2.0</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:module</h1>\n<p>Module configuration. The corresponding class <code>com.alibaba.dubbo.config.ModuleConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>The corresponding class</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>module</td>\n<td>string</td>\n<td><b>Y</b></td>\n<td></td>\n<td>service governance</td>\n<td>Module name is for registry combing the dependencies of modules.</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>version</td>\n<td>module.version</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>module version</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Module manager, Pls. fill in the mailbox prefix of the person in charge</td>\n<td>above 2.2.0</td>\n</tr>\n<tr>\n<td>organization</td>\n<td>organization</td>\n<td>string</td>\n<td>N</td>\n<td></td>\n<td>service governance</td>\n<td>Organization name is for registry distinguishing between the source of service. As a suggestion, this property should be written in config file directly. Such as china,intl,itu,crm,asc,dw,aliexpress etc.</td>\n<td>above 2.2.0</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-module.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-monitor.json b/en-us/docs/user/references/xml/dubbo-monitor.json
index 0b4a862e..dc12d5a3 100644
--- a/en-us/docs/user/references/xml/dubbo-monitor.json
+++ b/en-us/docs/user/references/xml/dubbo-monitor.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-monitor.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:monitor</h1>\n<p>Monitor center configuration. The corresponding class: <code>com.alibaba.dubbo.config.MonitorConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>The corresponding class</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>protocol</td>\n<td>protocol</td>\n<td>string</td>\n<td>N</td>\n<td>dubbo</td>\n<td>service governance</td>\n<td>Monitor center protocol. &quot;registry&quot; means looking up monitor center from registry. Others mean communicating to monitor center directly</td>\n<td>above 2.0.9</td>\n</tr>\n<tr>\n<td>address</td>\n<td>&lt;url&gt;</td>\n<td>string</td>\n<td>N</td>\n<td>N/A</td>\n<td>service governance</td>\n<td>Communicating to monitor center directly. address=&quot;10.20.130.230:12080&quot;</td>\n<td>above 1.0.16</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:monitor</h1>\n<p>Monitor center configuration. The corresponding class: <code>com.alibaba.dubbo.config.MonitorConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>The corresponding class</th>\n<th>Type</th>\n<th>Requisite</th>\n<th>Default</th>\n<th>Effect</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>protocol</td>\n<td>protocol</td>\n<td>string</td>\n<td>N</td>\n<td>dubbo</td>\n<td>service governance</td>\n<td>Monitor center protocol. &quot;registry&quot; means looking up monitor center from registry. Others mean communicating to monitor center directly</td>\n<td>above 2.0.9</td>\n</tr>\n<tr>\n<td>address</td>\n<td>&lt;url&gt;</td>\n<td>string</td>\n<td>N</td>\n<td>N/A</td>\n<td>service governance</td>\n<td>Communicating to monitor center directly. address=&quot;10.20.130.230:12080&quot;</td>\n<td>above 1.0.16</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-monitor.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-parameter.json b/en-us/docs/user/references/xml/dubbo-parameter.json
index 202de5da..5b09c53b 100644
--- a/en-us/docs/user/references/xml/dubbo-parameter.json
+++ b/en-us/docs/user/references/xml/dubbo-parameter.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-parameter.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:parameter</h1>\n<p>Optional parameter configuration. The corresponding class is <code>java.util.Map</code>. This tag is used as a sub tag to configure custom parameters for extending <code>&lt;dubbo:protocol&gt;</code>, <code>&lt;dubbo:service&gt;</code>, <code>&lt;dubbo:provider&gt;</code>, <code>&lt;dubbo:reference&gt;</code> or <code>&lt;dubbo:consumer&gt;</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>key</td>\n<td>key</td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service governance</td>\n<td>routing parameter key</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>value</td>\n<td>value</td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service governance</td>\n<td>routing parameter value</td>\n<td>Above 2.0.0</td>\n</tr>\n</tbody>\n</table>\n<p>For example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"napoli\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/napoli.queue.name\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:protocol</span>&gt;</span>\n</code></pre>\n<p>you can also use it like this:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span> <span class=\"hljs-attr\">p:queue</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:parameter</h1>\n<p>Optional parameter configuration. The corresponding class is <code>java.util.Map</code>. This tag is used as a sub tag to configure custom parameters for extending <code>&lt;dubbo:protocol&gt;</code>, <code>&lt;dubbo:service&gt;</code>, <code>&lt;dubbo:provider&gt;</code>, <code>&lt;dubbo:reference&gt;</code> or <code>&lt;dubbo:consumer&gt;</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>key</td>\n<td>key</td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service governance</td>\n<td>routing parameter key</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>value</td>\n<td>value</td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service governance</td>\n<td>routing parameter value</td>\n<td>Above 2.0.0</td>\n</tr>\n</tbody>\n</table>\n<p>For example:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"napoli\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/napoli.queue.name\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:protocol</span>&gt;</span>\n</code></pre>\n<p>you can also use it like this:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span> <span class=\"hljs-attr\">p:queue</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-parameter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-protocol.json b/en-us/docs/user/references/xml/dubbo-protocol.json
index 733cc2b8..550ff7b5 100644
--- a/en-us/docs/user/references/xml/dubbo-protocol.json
+++ b/en-us/docs/user/references/xml/dubbo-protocol.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-protocol.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:protocol</h1>\n<p>Service provider protocol configuration. The corresponding class is <code>com.alibaba.dubbo.config.ProtocolConfig</code>. If you need to support multiple protocols, you could declare multiple <code>&lt;dubbo:protocol&gt;</code> tags, and specify the protocol via <code>protocol</code> property.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Configuration association</td>\n<td>Bean Id of the protocol, can be referenced in &lt;dubbo:service protocol=&quot;&quot;&gt; The default value is equal to the value of <code>name</code> attribute while <code>id</code> is not filled. If <code>name</code> value has already existed, it will add index to it's suffix.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>name</td>\n<td>&lt;protocol&gt;</td>\n<td>string</td>\n<td><b>True</b></td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol name</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>port</td>\n<td>&lt;port&gt;</td>\n<td>int</td>\n<td>False</td>\n<td>The default port of dubbo protocol is 20880, rmi protocol is 1099, http and hessian protocol are 80;It will allocate the default port if <code>port</code> is not filled; It will allocate an unused port if <code>port</code> equals <code>-1</code>. To ensure the ports scope is controllable, the port will increase based on the corresponding protocol default port after Dubbo 2.4.0+</td>\n<td>Service discovery</td>\n<td>Service port</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>host</td>\n<td>&lt;host&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>Find local IP automatically</td>\n<td>Service discovery</td>\n<td>-The host name of services, to specify VIP and domain, or having multiple network cards. If null, it will find local IP automatically- It's recommended to let Dubbo find local IP automatically</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>threadpool</td>\n<td>threadpool</td>\n<td>string</td>\n<td>False</td>\n<td>fixed</td>\n<td>Performance optimize</td>\n<td>The type of Thread Pool, fixed/cached are available</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>threads</td>\n<td>threads</td>\n<td>int</td>\n<td>False</td>\n<td>200</td>\n<td>Performance optimize</td>\n<td>The size of the services' Thread Pool(Fixed)</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>iothreads</td>\n<td>threads</td>\n<td>int</td>\n<td>False</td>\n<td>The count of CPU + 1</td>\n<td>Performance optimize</td>\n<td>The size of io Thread Pool(Fixed)</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accepts</td>\n<td>accepts</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum connection count of the service provider</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>payload</td>\n<td>payload</td>\n<td>int</td>\n<td>False</td>\n<td>8388608(=8M)</td>\n<td>Performance optimize</td>\n<td>The length limit of request and response, unit is byte</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>codec</td>\n<td>codec</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol encoding</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>serialization</td>\n<td>serialization</td>\n<td>string</td>\n<td>False</td>\n<td>The default serialization of dubbo protocol is hessian2, rmi protocol is java, http protocol is json</td>\n<td>Performance optimize</td>\n<td>Protocol serialization, It's used when a protocol has multiple serializations. For example, <code>dubbo</code> protocol has 4 serializations, they are <code>dubbo</code>, <code>hessian2</code>, <code>java</code> and <code>compactedjava</code>.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accesslog</td>\n<td>accesslog</td>\n<td>string/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td><code>true</code> will write access log to logger. Specifying it to a log path, you can write access logs to special log file.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>path</td>\n<td>&lt;path&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Context path, the prefix of the service path</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>transporter</td>\n<td>transporter</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is netty</td>\n<td>Performance optimize</td>\n<td>The server and client implements of the protocol. For example, mina and netty for dubbo protocol. You can configure server or client side separately.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>server</td>\n<td>server</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is netty, http protocol is servlet</td>\n<td>Performance optimize</td>\n<td>The server implement of the protocol. For example, mina and netty for dubbo ptotocol, jetty and servlet for http protocol.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>client</td>\n<td>client</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is netty</td>\n<td>Performance optimize</td>\n<td>The client implement of the protocol. For example, mina and netty for dubbo protocol.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dispatcher</td>\n<td>dispatcher</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is all</td>\n<td>Performance optimize</td>\n<td>specify the thread model of the way to dispatching. Such as <code>all</code>, <code>direct</code>, <code>message</code>, <code>execution</code>, and <code>connection</code> for dubbo protocol.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>queues</td>\n<td>queues</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The queue size of the Thread Pool. It's recommended not to specify it in order to invoke other provides rather than queueing unless you have special requirement.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>charset</td>\n<td>charset</td>\n<td>string</td>\n<td>False</td>\n<td>UTF-8</td>\n<td>Performance optimize</td>\n<td>Serialization encoding</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>buffer</td>\n<td>buffer</td>\n<td>int</td>\n<td>False</td>\n<td>8192</td>\n<td>Performance optimize</td>\n<td>The buffer size of networking IO</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>heartbeat</td>\n<td>heartbeat</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>Heartbeat interval. For long connection, it's difficult to receive closing event while the physical layer is disconnected. So heartbeat is necessary to help checking the connection quality</td>\n<td>Above 2.0.10</td>\n</tr>\n<tr>\n<td>telnet</td>\n<td>telnet</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Supported telnet commands, use <code>,</code> to separate commands.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service discovery</td>\n<td>Whether registering the corresponding services to registry center</td>\n<td>Above 2.0.8</td>\n</tr>\n<tr>\n<td>contextpath</td>\n<td>contextpath</td>\n<td>String</td>\n<td>False</td>\n<td>Default value is an empty string</td>\n<td>Service discovery</td>\n<td></td>\n<td>Above 2.0.6</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:protocol</h1>\n<p>Service provider protocol configuration. The corresponding class is <code>com.alibaba.dubbo.config.ProtocolConfig</code>. If you need to support multiple protocols, you could declare multiple <code>&lt;dubbo:protocol&gt;</code> tags, and specify the protocol via <code>protocol</code> property.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Configuration association</td>\n<td>Bean Id of the protocol, can be referenced in &lt;dubbo:service protocol=&quot;&quot;&gt; The default value is equal to the value of <code>name</code> attribute while <code>id</code> is not filled. If <code>name</code> value has already existed, it will add index to it's suffix.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>name</td>\n<td>&lt;protocol&gt;</td>\n<td>string</td>\n<td><b>True</b></td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol name</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>port</td>\n<td>&lt;port&gt;</td>\n<td>int</td>\n<td>False</td>\n<td>The default port of dubbo protocol is 20880, rmi protocol is 1099, http and hessian protocol are 80;It will allocate the default port if <code>port</code> is not filled; It will allocate an unused port if <code>port</code> equals <code>-1</code>. To ensure the ports scope is controllable, the port will increase based on the corresponding protocol default port after Dubbo 2.4.0+</td>\n<td>Service discovery</td>\n<td>Service port</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>host</td>\n<td>&lt;host&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>Find local IP automatically</td>\n<td>Service discovery</td>\n<td>-The host name of services, to specify VIP and domain, or having multiple network cards. If null, it will find local IP automatically- It's recommended to let Dubbo find local IP automatically</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>threadpool</td>\n<td>threadpool</td>\n<td>string</td>\n<td>False</td>\n<td>fixed</td>\n<td>Performance optimize</td>\n<td>The type of Thread Pool, fixed/cached are available</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>threads</td>\n<td>threads</td>\n<td>int</td>\n<td>False</td>\n<td>200</td>\n<td>Performance optimize</td>\n<td>The size of the services' Thread Pool(Fixed)</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>iothreads</td>\n<td>threads</td>\n<td>int</td>\n<td>False</td>\n<td>The count of CPU + 1</td>\n<td>Performance optimize</td>\n<td>The size of io Thread Pool(Fixed)</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accepts</td>\n<td>accepts</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum connection count of the service provider</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>payload</td>\n<td>payload</td>\n<td>int</td>\n<td>False</td>\n<td>8388608(=8M)</td>\n<td>Performance optimize</td>\n<td>The length limit of request and response, unit is byte</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>codec</td>\n<td>codec</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol encoding</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>serialization</td>\n<td>serialization</td>\n<td>string</td>\n<td>False</td>\n<td>The default serialization of dubbo protocol is hessian2, rmi protocol is java, http protocol is json</td>\n<td>Performance optimize</td>\n<td>Protocol serialization, It's used when a protocol has multiple serializations. For example, <code>dubbo</code> protocol has 4 serializations, they are <code>dubbo</code>, <code>hessian2</code>, <code>java</code> and <code>compactedjava</code>.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accesslog</td>\n<td>accesslog</td>\n<td>string/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td><code>true</code> will write access log to logger. Specifying it to a log path, you can write access logs to special log file.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>path</td>\n<td>&lt;path&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Context path, the prefix of the service path</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>transporter</td>\n<td>transporter</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is netty</td>\n<td>Performance optimize</td>\n<td>The server and client implements of the protocol. For example, mina and netty for dubbo protocol. You can configure server or client side separately.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>server</td>\n<td>server</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is netty, http protocol is servlet</td>\n<td>Performance optimize</td>\n<td>The server implement of the protocol. For example, mina and netty for dubbo ptotocol, jetty and servlet for http protocol.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>client</td>\n<td>client</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is netty</td>\n<td>Performance optimize</td>\n<td>The client implement of the protocol. For example, mina and netty for dubbo protocol.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dispatcher</td>\n<td>dispatcher</td>\n<td>string</td>\n<td>False</td>\n<td>The default value of dubbo protocol is all</td>\n<td>Performance optimize</td>\n<td>specify the thread model of the way to dispatching. Such as <code>all</code>, <code>direct</code>, <code>message</code>, <code>execution</code>, and <code>connection</code> for dubbo protocol.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>queues</td>\n<td>queues</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The queue size of the Thread Pool. It's recommended not to specify it in order to invoke other provides rather than queueing unless you have special requirement.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>charset</td>\n<td>charset</td>\n<td>string</td>\n<td>False</td>\n<td>UTF-8</td>\n<td>Performance optimize</td>\n<td>Serialization encoding</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>buffer</td>\n<td>buffer</td>\n<td>int</td>\n<td>False</td>\n<td>8192</td>\n<td>Performance optimize</td>\n<td>The buffer size of networking IO</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>heartbeat</td>\n<td>heartbeat</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>Heartbeat interval. For long connection, it's difficult to receive closing event while the physical layer is disconnected. So heartbeat is necessary to help checking the connection quality</td>\n<td>Above 2.0.10</td>\n</tr>\n<tr>\n<td>telnet</td>\n<td>telnet</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Supported telnet commands, use <code>,</code> to separate commands.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service discovery</td>\n<td>Whether registering the corresponding services to registry center</td>\n<td>Above 2.0.8</td>\n</tr>\n<tr>\n<td>contextpath</td>\n<td>contextpath</td>\n<td>String</td>\n<td>False</td>\n<td>Default value is an empty string</td>\n<td>Service discovery</td>\n<td></td>\n<td>Above 2.0.6</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-protocol.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-provider.json b/en-us/docs/user/references/xml/dubbo-provider.json
index 8bff57e4..54a1904b 100644
--- a/en-us/docs/user/references/xml/dubbo-provider.json
+++ b/en-us/docs/user/references/xml/dubbo-provider.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-provider.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:provider</h1>\n<p>The default configuration of service provider. The corresponding class is <code>com.alibaba.dubbo.config.ProviderConfig</code>. This tag provider default values for <code>&lt;dubbo:service&gt;</code> and <code>&lt;dubbo:protocol&gt;</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Configuration association</td>\n<td>Bean Id of the protocol, can be referenced in &lt;dubbo:service proivder=&quot;&quot;&gt;</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>&lt;protocol&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol name</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>host</td>\n<td>&lt;host&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>Find local IP automatically</td>\n<td>Service discovery</td>\n<td>The host name of services, to specify VIP and domain, or having multiple network cards. If null, it will find local IP automatically. It's recommended to let Dubbo find local IP automatically</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>threads</td>\n<td>threads</td>\n<td>int</td>\n<td>False</td>\n<td>200</td>\n<td>Performance optimize</td>\n<td>The size of the services' Thread Pool(Fixed)</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>payload</td>\n<td>payload</td>\n<td>int</td>\n<td>False</td>\n<td>8388608(=8M)</td>\n<td>Performance optimize</td>\n<td>The length limit of request and response, unit is byte</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>path</td>\n<td>&lt;path&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Context path of the service provider, the prefix of the service path</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>server</td>\n<td>server</td>\n<td>string</td>\n<td>False</td>\n<td>Default is netty for dubbo protocol, servlet for http protocol</td>\n<td>Performance optimize</td>\n<td>The server implement of the protocol. For example, mina and netty for dubbo ptotocol, jetty and servlet for http protocol.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>client</td>\n<td>client</td>\n<td>string</td>\n<td>False</td>\n<td>Default is netty for dubbo protocol</td>\n<td>Performance optimize</td>\n<td>The client implement of the protocol. For example, mina and netty for dubbo protocol.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>codec</td>\n<td>codec</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol encoding</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>serialization</td>\n<td>serialization</td>\n<td>string</td>\n<td>False</td>\n<td>Default is hessian2 for dubbo protocol, json for http protocol</td>\n<td>Performance optimize</td>\n<td>Protocol serialization, It's used when a protocol has multiple serializations. For example, <code>dubbo</code> protocol has 4 serializations, they are <code>dubbo</code>, <code>hessian2</code>, <code>java</code> and <code>compactedjava</code>, <code>http</code> protocol has <code>json</code> and <code>xml</code>.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>default</td>\n<td></td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Configuration association</td>\n<td>To specify the default protocol for support multiple protocols.</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>service.filter</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The filter name of the RPC process of the provider, use <code>,</code> to separate multiple filter names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>exporter.listener</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The listener name of the provider, use <code>,</code> to separate multiple listener names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>threadpool</td>\n<td>threadpool</td>\n<td>string</td>\n<td>False</td>\n<td>fixed</td>\n<td>Performance optimize</td>\n<td>The type of Thread Pool, fixed/cached are available</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accepts</td>\n<td>accepts</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum connection count of the service provider</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>version</td>\n<td>version</td>\n<td>string</td>\n<td>False</td>\n<td>0.0.0</td>\n<td>Service discovery</td>\n<td>Service version. It's recommended to use 2 digitals such as <code>1.0</code>. It's necessary to upgrade version only when the service is not compatible.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>The group of the service providers. It can distinguish services when it has multiple implements.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>delay</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The delay time(ms) for registering services.  When set to -1, it indicates that the services will expose to registry after the Spring context is initialized</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>default.timeout</td>\n<td>int</td>\n<td>False</td>\n<td>1000</td>\n<td>Performance optimize</td>\n<td>The RPC timeout(ms)</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>default.retries</td>\n<td>int</td>\n<td>False</td>\n<td>2</td>\n<td>Performance optimize</td>\n<td>The retry count for RPC, not including the first invoke. Please set it to 0 if don't need to retry.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>default.connections</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum connections of every provider. For short connection such as rmi, http and hessian, it's connection limit, but for long connection such as dubbo, it's connection count.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>default.loadbalance</td>\n<td>string</td>\n<td>False</td>\n<td>random</td>\n<td>Performance optimize</td>\n<td>Strategy of load balance, <code>random</code>, <code>roundrobin</code> and <code>leastactive</code> are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>async</td>\n<td>default.async</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Performance optimize</td>\n<td>Asynchronous execution, not reliable. It does not block the execution thread just only ignores the return value.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>stub</td>\n<td>stub</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default proxy class name, which is the interface name with <code>Local</code> as the suffix.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>mock</td>\n<td>mock</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default mock class name, which is the interface name with <code>Mock</code> suffix.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>token</td>\n<td>token</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Enable token validation. Disable token if it's null. It will generate token randomly when it is enable.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>registry</td>\n<td>registry</td>\n<td>string</td>\n<td>False</td>\n<td>By default, register to all registries</td>\n<td>Configuration association</td>\n<td>Register services to specified registry while having multiple registries. It is the <code>id</code> value of the &lt;dubbo:registry&gt;. If don't want to register to any registry, set it as <code>N/A</code></td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dynamic</td>\n<td>dynamic</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether the service is registered dynamically. If false, services will be showed as <code>disable</code>, you need to enable it manually. And you also need to disable it when provider shut down.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accesslog</td>\n<td>accesslog</td>\n<td>string/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> will write access log to logger. Specifying it to a log path, you can write access logs to special log file.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The owner of the service. It's used for service governance.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>document</td>\n<td>document</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Service document URL</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>weight</td>\n<td>weight</td>\n<td>int</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The weight of the service</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>executes</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum parallel execution request count per method per service for the provider.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>default.actives</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum concurrent calls per method per service of the consumer.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>string</td>\n<td>False</td>\n<td>javassist</td>\n<td>Performance optimize</td>\n<td>The proxy implement, jdk/javassist are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>default.cluster</td>\n<td>string</td>\n<td>False</td>\n<td>failover</td>\n<td>Performance optimize</td>\n<td>failover/failfast/failsafe/failback/forking are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>deprecated</td>\n<td>deprecated</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Mark the service is deprecated. If true, there will log an error log on the client side.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>queues</td>\n<td>queues</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The queue size of the Thread Pool. It's recommended not to specify it in order to invoke other provides rather than queueing unless you have special requirement.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>charset</td>\n<td>charset</td>\n<td>string</td>\n<td>False</td>\n<td>UTF-8</td>\n<td>Performance optimize</td>\n<td>Serialization encoding</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>buffer</td>\n<td>buffer</td>\n<td>int</td>\n<td>False</td>\n<td>8192</td>\n<td>Performance optimize</td>\n<td>The buffer size of networking IO</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>iothreads</td>\n<td>iothreads</td>\n<td>int</td>\n<td>False</td>\n<td>CPU + 1</td>\n<td>Performance optimize</td>\n<td>The size of io Thread Pool(Fixed). These threads are used to receive, serialize and deserialize IO data. See <code>threads</code> for configuring business thread pool. It's not recommended to configure this.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>telnet</td>\n<td>telnet</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Supported telnet commands, use <code>,</code> to separate commands.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>contextpath</td>\n<td>contextpath</td>\n<td>String</td>\n<td>False</td>\n<td>Empty string</td>\n<td>Service governance</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The biz layer of the service provider, such as biz, dao, intl:web and china:acton.</td>\n<td>Above 2.0.7</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:provider</h1>\n<p>The default configuration of service provider. The corresponding class is <code>com.alibaba.dubbo.config.ProviderConfig</code>. This tag provider default values for <code>&lt;dubbo:service&gt;</code> and <code>&lt;dubbo:protocol&gt;</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Configuration association</td>\n<td>Bean Id of the protocol, can be referenced in &lt;dubbo:service proivder=&quot;&quot;&gt;</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>&lt;protocol&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol name</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>host</td>\n<td>&lt;host&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>Find local IP automatically</td>\n<td>Service discovery</td>\n<td>The host name of services, to specify VIP and domain, or having multiple network cards. If null, it will find local IP automatically. It's recommended to let Dubbo find local IP automatically</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>threads</td>\n<td>threads</td>\n<td>int</td>\n<td>False</td>\n<td>200</td>\n<td>Performance optimize</td>\n<td>The size of the services' Thread Pool(Fixed)</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>payload</td>\n<td>payload</td>\n<td>int</td>\n<td>False</td>\n<td>8388608(=8M)</td>\n<td>Performance optimize</td>\n<td>The length limit of request and response, unit is byte</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>path</td>\n<td>&lt;path&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Context path of the service provider, the prefix of the service path</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>server</td>\n<td>server</td>\n<td>string</td>\n<td>False</td>\n<td>Default is netty for dubbo protocol, servlet for http protocol</td>\n<td>Performance optimize</td>\n<td>The server implement of the protocol. For example, mina and netty for dubbo ptotocol, jetty and servlet for http protocol.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>client</td>\n<td>client</td>\n<td>string</td>\n<td>False</td>\n<td>Default is netty for dubbo protocol</td>\n<td>Performance optimize</td>\n<td>The client implement of the protocol. For example, mina and netty for dubbo protocol.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>codec</td>\n<td>codec</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Performance optimize</td>\n<td>Protocol encoding</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>serialization</td>\n<td>serialization</td>\n<td>string</td>\n<td>False</td>\n<td>Default is hessian2 for dubbo protocol, json for http protocol</td>\n<td>Performance optimize</td>\n<td>Protocol serialization, It's used when a protocol has multiple serializations. For example, <code>dubbo</code> protocol has 4 serializations, they are <code>dubbo</code>, <code>hessian2</code>, <code>java</code> and <code>compactedjava</code>, <code>http</code> protocol has <code>json</code> and <code>xml</code>.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>default</td>\n<td></td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Configuration association</td>\n<td>To specify the default protocol for support multiple protocols.</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>service.filter</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The filter name of the RPC process of the provider, use <code>,</code> to separate multiple filter names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>exporter.listener</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The listener name of the provider, use <code>,</code> to separate multiple listener names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>threadpool</td>\n<td>threadpool</td>\n<td>string</td>\n<td>False</td>\n<td>fixed</td>\n<td>Performance optimize</td>\n<td>The type of Thread Pool, fixed/cached are available</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accepts</td>\n<td>accepts</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum connection count of the service provider</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>version</td>\n<td>version</td>\n<td>string</td>\n<td>False</td>\n<td>0.0.0</td>\n<td>Service discovery</td>\n<td>Service version. It's recommended to use 2 digitals such as <code>1.0</code>. It's necessary to upgrade version only when the service is not compatible.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>The group of the service providers. It can distinguish services when it has multiple implements.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>delay</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The delay time(ms) for registering services.  When set to -1, it indicates that the services will expose to registry after the Spring context is initialized</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>default.timeout</td>\n<td>int</td>\n<td>False</td>\n<td>1000</td>\n<td>Performance optimize</td>\n<td>The RPC timeout(ms)</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>default.retries</td>\n<td>int</td>\n<td>False</td>\n<td>2</td>\n<td>Performance optimize</td>\n<td>The retry count for RPC, not including the first invoke. Please set it to 0 if don't need to retry.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>default.connections</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum connections of every provider. For short connection such as rmi, http and hessian, it's connection limit, but for long connection such as dubbo, it's connection count.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>default.loadbalance</td>\n<td>string</td>\n<td>False</td>\n<td>random</td>\n<td>Performance optimize</td>\n<td>Strategy of load balance, <code>random</code>, <code>roundrobin</code> and <code>leastactive</code> are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>async</td>\n<td>default.async</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Performance optimize</td>\n<td>Asynchronous execution, not reliable. It does not block the execution thread just only ignores the return value.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>stub</td>\n<td>stub</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default proxy class name, which is the interface name with <code>Local</code> as the suffix.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>mock</td>\n<td>mock</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default mock class name, which is the interface name with <code>Mock</code> suffix.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>token</td>\n<td>token</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Enable token validation. Disable token if it's null. It will generate token randomly when it is enable.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>registry</td>\n<td>registry</td>\n<td>string</td>\n<td>False</td>\n<td>By default, register to all registries</td>\n<td>Configuration association</td>\n<td>Register services to specified registry while having multiple registries. It is the <code>id</code> value of the &lt;dubbo:registry&gt;. If don't want to register to any registry, set it as <code>N/A</code></td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dynamic</td>\n<td>dynamic</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether the service is registered dynamically. If false, services will be showed as <code>disable</code>, you need to enable it manually. And you also need to disable it when provider shut down.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accesslog</td>\n<td>accesslog</td>\n<td>string/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> will write access log to logger. Specifying it to a log path, you can write access logs to special log file.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The owner of the service. It's used for service governance.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>document</td>\n<td>document</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Service document URL</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>weight</td>\n<td>weight</td>\n<td>int</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The weight of the service</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>executes</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum parallel execution request count per method per service for the provider.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>default.actives</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum concurrent calls per method per service of the consumer.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>string</td>\n<td>False</td>\n<td>javassist</td>\n<td>Performance optimize</td>\n<td>The proxy implement, jdk/javassist are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>default.cluster</td>\n<td>string</td>\n<td>False</td>\n<td>failover</td>\n<td>Performance optimize</td>\n<td>failover/failfast/failsafe/failback/forking are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>deprecated</td>\n<td>deprecated</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Mark the service is deprecated. If true, there will log an error log on the client side.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>queues</td>\n<td>queues</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The queue size of the Thread Pool. It's recommended not to specify it in order to invoke other provides rather than queueing unless you have special requirement.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>charset</td>\n<td>charset</td>\n<td>string</td>\n<td>False</td>\n<td>UTF-8</td>\n<td>Performance optimize</td>\n<td>Serialization encoding</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>buffer</td>\n<td>buffer</td>\n<td>int</td>\n<td>False</td>\n<td>8192</td>\n<td>Performance optimize</td>\n<td>The buffer size of networking IO</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>iothreads</td>\n<td>iothreads</td>\n<td>int</td>\n<td>False</td>\n<td>CPU + 1</td>\n<td>Performance optimize</td>\n<td>The size of io Thread Pool(Fixed). These threads are used to receive, serialize and deserialize IO data. See <code>threads</code> for configuring business thread pool. It's not recommended to configure this.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>telnet</td>\n<td>telnet</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Supported telnet commands, use <code>,</code> to separate commands.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>contextpath</td>\n<td>contextpath</td>\n<td>String</td>\n<td>False</td>\n<td>Empty string</td>\n<td>Service governance</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The biz layer of the service provider, such as biz, dao, intl:web and china:acton.</td>\n<td>Above 2.0.7</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-provider.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-reference.json b/en-us/docs/user/references/xml/dubbo-reference.json
index 9c75ba28..5246d944 100644
--- a/en-us/docs/user/references/xml/dubbo-reference.json
+++ b/en-us/docs/user/references/xml/dubbo-reference.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-reference.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:reference</h1>\n<p>The configuration of service consumer. The corresponding class is<code>com.alibaba.dubbo.config.ReferenceConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Configuration association</td>\n<td>Bean Id of the service reference</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>interface</td>\n<td></td>\n<td>class</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>Interface name of the service</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>version</td>\n<td>version</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Service version, must be equal to the provider's version</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>The group of the service reference, must be equal to the provider's group. It can distinguish services when it has multiple implements.</td>\n<td>Above 1.0.7</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>timeout</td>\n<td>long</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; timeout</td>\n<td>Performance optimize</td>\n<td>The RPC timeout(ms)</td>\n<td>Above 1.0.5</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>retries</td>\n<td>int</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; retries</td>\n<td>Performance optimize</td>\n<td>The retry count for RPC, not including the first invoke. Please set it to 0 if don't need to retry.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>connections</td>\n<td>int</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; connections</td>\n<td>Performance optimize</td>\n<td>The maximum connections of every provider. For short connection such as rmi, http and hessian, it's connection limit, but for long connection such as dubbo, it's connection count.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>loadbalance</td>\n<td>string</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; loadbalance</td>\n<td>Performance optimize</td>\n<td>Strategy of load balance, <code>random</code>, <code>roundrobin</code> and <code>leastactive</code> are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>async</td>\n<td>async</td>\n<td>boolean</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; async</td>\n<td>Performance optimize</td>\n<td>Asynchronous execution, not reliable. It does not block the execution thread just only ignores the return value.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>generic</td>\n<td>generic</td>\n<td>boolean</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; generic</td>\n<td>Service governance</td>\n<td>Enable generic interface. If true, the reference will return <code>GenericService</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>check</td>\n<td>check</td>\n<td>boolean</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; check</td>\n<td>Service governance</td>\n<td>Check the exist of the provider. If true, it will throw exception when provider is not exist. If false, will ignore.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>url</td>\n<td>url</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Connect to the provider directly via this url. It will bypass the registry.</td>\n<td>Above 1.0.6</td>\n</tr>\n<tr>\n<td>stub</td>\n<td>stub</td>\n<td>class/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The local proxy class name of the client, it's used to execute local logic such as caching. The proxy class must have a constructor with the remote proxy object as a parameter, such as <code>public XxxServiceLocal(XxxService xxxService)</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>mock</td>\n<td>mock</td>\n<td>class/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The mock class name. It's called when the RPC is failed, such as timeout or IO exception. The mock class must carry a  none parameter constructor. The difference between mock and local proxy is that local proxy is always invoked before RPC but mock is invoked only when exception after RPC.</td>\n<td>Above 1.0.13</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>cache</td>\n<td>string/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>lru, threadlocal, jcache等Using RPC parameters as the key to cache the result. <code>lru</code>, <code>threadlocal</code> and <code>jcache</code> are available.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>validation</td>\n<td>validation</td>\n<td>boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Enable JSR303 annotation validation. If true, it will validate the method parameters' annotations.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>boolean</td>\n<td>False</td>\n<td>javassist</td>\n<td>Performance optimize</td>\n<td>The proxy implement, jdk/javassist are available.</td>\n<td>Above 2.0.2</td>\n</tr>\n<tr>\n<td>client</td>\n<td>client</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The transport type of the client, such as netty and mina for dubbo protocol.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>registry</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>By default, it will merge all the service providers that getting from all registries</td>\n<td>Configuration association</td>\n<td>Get provider lists from the specified registry. It is the <code>id</code> value of the &lt;dubbo:registry&gt;, use <code>,</code> to separate multiple regsitries id.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The owner of the service. It's used for service governance.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>actives</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum concurrent calls per method per service of the consumer.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>cluster</td>\n<td>string</td>\n<td>False</td>\n<td>failover</td>\n<td>Performance optimize</td>\n<td>failover/failfast/failsafe/failback/forking are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>reference.filter</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The filter name of the RPC process of the reference, use <code>,</code> to separate multiple filter names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>invoker.listener</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The listener name of the reference, use <code>,</code> to separate multiple listener names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The biz layer of the service provider, such as biz, dao, intl:web and china:acton.</td>\n<td>Above 2.0.7</td>\n</tr>\n<tr>\n<td>init</td>\n<td>init</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Performance optimize</td>\n<td>If true, init the service reference when <code>afterPropertiesSet()</code>is invoked, or it will init later only when it is referenced and autowired.</td>\n<td>Above 2.0.10</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>protocol</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Only invoke the  providers with specified protocol, and ignore other protocol providers.</td>\n<td>Above 2.2.0</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:reference</h1>\n<p>The configuration of service consumer. The corresponding class is<code>com.alibaba.dubbo.config.ReferenceConfig</code></p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Configuration association</td>\n<td>Bean Id of the service reference</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>interface</td>\n<td></td>\n<td>class</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>Interface name of the service</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>version</td>\n<td>version</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>Service version, must be equal to the provider's version</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>The group of the service reference, must be equal to the provider's group. It can distinguish services when it has multiple implements.</td>\n<td>Above 1.0.7</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>timeout</td>\n<td>long</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; timeout</td>\n<td>Performance optimize</td>\n<td>The RPC timeout(ms)</td>\n<td>Above 1.0.5</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>retries</td>\n<td>int</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; retries</td>\n<td>Performance optimize</td>\n<td>The retry count for RPC, not including the first invoke. Please set it to 0 if don't need to retry.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>connections</td>\n<td>int</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; connections</td>\n<td>Performance optimize</td>\n<td>The maximum connections of every provider. For short connection such as rmi, http and hessian, it's connection limit, but for long connection such as dubbo, it's connection count.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>loadbalance</td>\n<td>string</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; loadbalance</td>\n<td>Performance optimize</td>\n<td>Strategy of load balance, <code>random</code>, <code>roundrobin</code> and <code>leastactive</code> are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>async</td>\n<td>async</td>\n<td>boolean</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; async</td>\n<td>Performance optimize</td>\n<td>Asynchronous execution, not reliable. It does not block the execution thread just only ignores the return value.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>generic</td>\n<td>generic</td>\n<td>boolean</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; generic</td>\n<td>Service governance</td>\n<td>Enable generic interface. If true, the reference will return <code>GenericService</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>check</td>\n<td>check</td>\n<td>boolean</td>\n<td>False</td>\n<td>By default, use &lt;dubbo:consumer&gt; check</td>\n<td>Service governance</td>\n<td>Check the exist of the provider. If true, it will throw exception when provider is not exist. If false, will ignore.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>url</td>\n<td>url</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Connect to the provider directly via this url. It will bypass the registry.</td>\n<td>Above 1.0.6</td>\n</tr>\n<tr>\n<td>stub</td>\n<td>stub</td>\n<td>class/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The local proxy class name of the client, it's used to execute local logic such as caching. The proxy class must have a constructor with the remote proxy object as a parameter, such as <code>public XxxServiceLocal(XxxService xxxService)</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>mock</td>\n<td>mock</td>\n<td>class/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The mock class name. It's called when the RPC is failed, such as timeout or IO exception. The mock class must carry a  none parameter constructor. The difference between mock and local proxy is that local proxy is always invoked before RPC but mock is invoked only when exception after RPC.</td>\n<td>Above 1.0.13</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>cache</td>\n<td>string/boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>lru, threadlocal, jcache等Using RPC parameters as the key to cache the result. <code>lru</code>, <code>threadlocal</code> and <code>jcache</code> are available.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>validation</td>\n<td>validation</td>\n<td>boolean</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Enable JSR303 annotation validation. If true, it will validate the method parameters' annotations.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>boolean</td>\n<td>False</td>\n<td>javassist</td>\n<td>Performance optimize</td>\n<td>The proxy implement, jdk/javassist are available.</td>\n<td>Above 2.0.2</td>\n</tr>\n<tr>\n<td>client</td>\n<td>client</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The transport type of the client, such as netty and mina for dubbo protocol.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>registry</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>By default, it will merge all the service providers that getting from all registries</td>\n<td>Configuration association</td>\n<td>Get provider lists from the specified registry. It is the <code>id</code> value of the &lt;dubbo:registry&gt;, use <code>,</code> to separate multiple regsitries id.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The owner of the service. It's used for service governance.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>actives</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum concurrent calls per method per service of the consumer.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>cluster</td>\n<td>string</td>\n<td>False</td>\n<td>failover</td>\n<td>Performance optimize</td>\n<td>failover/failfast/failsafe/failback/forking are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>reference.filter</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The filter name of the RPC process of the reference, use <code>,</code> to separate multiple filter names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>invoker.listener</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The listener name of the reference, use <code>,</code> to separate multiple listener names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The biz layer of the service provider, such as biz, dao, intl:web and china:acton.</td>\n<td>Above 2.0.7</td>\n</tr>\n<tr>\n<td>init</td>\n<td>init</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Performance optimize</td>\n<td>If true, init the service reference when <code>afterPropertiesSet()</code>is invoked, or it will init later only when it is referenced and autowired.</td>\n<td>Above 2.0.10</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>protocol</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Only invoke the  providers with specified protocol, and ignore other protocol providers.</td>\n<td>Above 2.2.0</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-reference.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-registry.json b/en-us/docs/user/references/xml/dubbo-registry.json
index 2d0909ed..d3373325 100644
--- a/en-us/docs/user/references/xml/dubbo-registry.json
+++ b/en-us/docs/user/references/xml/dubbo-registry.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-registry.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:registry</h1>\n<p>The configuration of the registry center. The corresponding class is <code>com.alibaba.dubbo.config.RegistryConfig</code>. If you have multiple different registries, you can declare multiple <code>&lt;dubbo:registry&gt;</code> tags, and then reference specified registry with <code>registry</code> property in <code>&lt;dubbo:service&gt;</code> or <code>&lt;dubbo:reference&gt;</code> tag.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Configuration association</td>\n<td>Bean Id of the registry center, can be referenced in &lt;dubbo:service registry=&quot;&quot;&gt;or  &lt;dubbo:reference registry=&quot;&quot;&gt;</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>address</td>\n<td>&lt;host:port&gt;</td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>The address of the registry center. If the address has no port, default port 9999 will be adopted. Multiple addresses within the same cluster use <code>,</code> to seperate, such as <code>ip:port,ip:port</code>. Multiple registries within different cluster, please configure different <code>dubbo:registry</code> tag.</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>&lt;protocol&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Service discovery</td>\n<td>The protocol of the registry center. <code>dubbo</code>, <code>http</code>, <code>local</code> are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>port</td>\n<td>&lt;port&gt;</td>\n<td>int</td>\n<td>False</td>\n<td>9090</td>\n<td>Service discovery</td>\n<td>The default port of the registry. When the <code>address</code> has no port, this default port will be adopted.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>username</td>\n<td>&lt;username&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The usename of the registry. Do not set it if the registry doesn't need validation.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>password</td>\n<td>&lt;password&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The password of the registry. Do not set it if the registry doesn't need validation.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>transport</td>\n<td>registry.transporter</td>\n<td>string</td>\n<td>False</td>\n<td>netty</td>\n<td>Performance optimize</td>\n<td>mina, netty are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>registry.timeout</td>\n<td>int</td>\n<td>False</td>\n<td>5000</td>\n<td>Performance optimize</td>\n<td>The timeout(ms) of the request to registry.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>session</td>\n<td>registry.session</td>\n<td>int</td>\n<td>False</td>\n<td>60000</td>\n<td>Performance optimize</td>\n<td>The session timeout(ms) of the registry. It's used to check whether the providers are alive. It depends on the implement of the registry. For example, for HeartBeat implement, the timeout is the interval of two heart beats.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>file</td>\n<td>registry.file</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The local file to cache the address list of registries and providers. When application restarts, it will restore the registries and providers. Please use different file for different registy.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>check</td>\n<td>check</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether throwing exception while the registry isn't existed.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>whether registering to the registry center. If false, just subscribing, not registering.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>subscribe</td>\n<td>subscribe</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>whether subscribing from the registry center. If false, just registering, not subscribing.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dynamic</td>\n<td>dynamic</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether the service is registered dynamically. If false, services will be showed as <code>disable</code>, you need to enable it manually. And you also need to disable it when provider shut down.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Service governance</td>\n<td>Service registration grouping, cross-group services will not affect each other, and can not be called each other, suitable for environmental isolation.</td>\n<td>Above 2.0.5</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:registry</h1>\n<p>The configuration of the registry center. The corresponding class is <code>com.alibaba.dubbo.config.RegistryConfig</code>. If you have multiple different registries, you can declare multiple <code>&lt;dubbo:registry&gt;</code> tags, and then reference specified registry with <code>registry</code> property in <code>&lt;dubbo:service&gt;</code> or <code>&lt;dubbo:reference&gt;</code> tag.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Configuration association</td>\n<td>Bean Id of the registry center, can be referenced in &lt;dubbo:service registry=&quot;&quot;&gt;or  &lt;dubbo:reference registry=&quot;&quot;&gt;</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>address</td>\n<td>&lt;host:port&gt;</td>\n<td>string</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>The address of the registry center. If the address has no port, default port 9999 will be adopted. Multiple addresses within the same cluster use <code>,</code> to seperate, such as <code>ip:port,ip:port</code>. Multiple registries within different cluster, please configure different <code>dubbo:registry</code> tag.</td>\n<td>Above 1.0.16</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>&lt;protocol&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Service discovery</td>\n<td>The protocol of the registry center. <code>dubbo</code>, <code>http</code>, <code>local</code> are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>port</td>\n<td>&lt;port&gt;</td>\n<td>int</td>\n<td>False</td>\n<td>9090</td>\n<td>Service discovery</td>\n<td>The default port of the registry. When the <code>address</code> has no port, this default port will be adopted.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>username</td>\n<td>&lt;username&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The usename of the registry. Do not set it if the registry doesn't need validation.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>password</td>\n<td>&lt;password&gt;</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The password of the registry. Do not set it if the registry doesn't need validation.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>transport</td>\n<td>registry.transporter</td>\n<td>string</td>\n<td>False</td>\n<td>netty</td>\n<td>Performance optimize</td>\n<td>mina, netty are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>registry.timeout</td>\n<td>int</td>\n<td>False</td>\n<td>5000</td>\n<td>Performance optimize</td>\n<td>The timeout(ms) of the request to registry.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>session</td>\n<td>registry.session</td>\n<td>int</td>\n<td>False</td>\n<td>60000</td>\n<td>Performance optimize</td>\n<td>The session timeout(ms) of the registry. It's used to check whether the providers are alive. It depends on the implement of the registry. For example, for HeartBeat implement, the timeout is the interval of two heart beats.</td>\n<td>Above 2.1.0</td>\n</tr>\n<tr>\n<td>file</td>\n<td>registry.file</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The local file to cache the address list of registries and providers. When application restarts, it will restore the registries and providers. Please use different file for different registy.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>check</td>\n<td>check</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether throwing exception while the registry isn't existed.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>whether registering to the registry center. If false, just subscribing, not registering.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>subscribe</td>\n<td>subscribe</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>whether subscribing from the registry center. If false, just registering, not subscribing.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dynamic</td>\n<td>dynamic</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether the service is registered dynamically. If false, services will be showed as <code>disable</code>, you need to enable it manually. And you also need to disable it when provider shut down.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td>dubbo</td>\n<td>Service governance</td>\n<td>Service registration grouping, cross-group services will not affect each other, and can not be called each other, suitable for environmental isolation.</td>\n<td>Above 2.0.5</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-registry.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/dubbo-service.json b/en-us/docs/user/references/xml/dubbo-service.json
index 36110b77..1de2f300 100644
--- a/en-us/docs/user/references/xml/dubbo-service.json
+++ b/en-us/docs/user/references/xml/dubbo-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-service.md",
-  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:service</h1>\n<p>The configuration of the service provider. The corresponding class is <code>com.alibaba.dubbo.config.ServiceConfig</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>interface</td>\n<td></td>\n<td>class</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>The service interface name</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>ref</td>\n<td></td>\n<td>object</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>The reference to the service implementation</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>version</td>\n<td>version</td>\n<td>string</td>\n<td>False</td>\n<td>0.0.0</td>\n<td>Service discovery</td>\n<td>Service version. It's recommended to use 2 digitals such as <code>1.0</code>. It's necessary to upgrade version only when the service is not compatible.</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>The group of the service providers. It can distinguish services when it has multiple implements.</td>\n<td>Above 1.0.7</td>\n</tr>\n<tr>\n<td>path</td>\n<td>&lt;path&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>default value is the interface name</td>\n<td>Service discovery</td>\n<td>In 1.0, service path is not supported, it's always equals to the interface name. So it may not compitable when a service reference in 1.0 calls a service provider in 2.0 that specified path.</td>\n<td>Above 1.0.12</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>delay</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The delay time(ms) for registering services.  When set to -1, it indicates that the services will expose to registry after the Spring context is initialized</td>\n<td>Above 1.0.14</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>timeout</td>\n<td>int</td>\n<td>False</td>\n<td>1000</td>\n<td>Performance optimize</td>\n<td>The RPC timeout(ms)</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>retries</td>\n<td>int</td>\n<td>False</td>\n<td>2</td>\n<td>Performance optimize</td>\n<td>The retry count for RPC, not including the first invoke. Please set it to 0 if don't need to retry.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>connections</td>\n<td>int</td>\n<td>False</td>\n<td>100</td>\n<td>Performance optimize</td>\n<td>The maximum connections of every provider. For short connection such as rmi, http and hessian, it's connection limit, but for long connection such as dubbo, it's connection count.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>loadbalance</td>\n<td>string</td>\n<td>False</td>\n<td>random</td>\n<td>Performance optimize</td>\n<td>Strategy of load balance, <code>random</code>, <code>roundrobin</code> and <code>leastactive</code> are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>async</td>\n<td>async</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Performance optimize</td>\n<td>Asynchronous execution, not reliable. It does not block the execution thread just only ignores the return value.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>stub</td>\n<td>stub</td>\n<td>class/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default proxy class name, which is the interface name with <code>Local</code> as the suffix. It's used to execute local logic such as caching. The proxy class must have a constructor with the remote proxy object as a parameter, such as <code>public XxxServiceLocal(XxxService xxxService)</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>mock</td>\n<td>mock</td>\n<td>class/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default mock class name, which is the interface name with <code>Mock</code> suffix. It's called when the RPC is failed, such as timeout or IO exception. The mock class must carry a  none parameter constructor. The difference between mock and local proxy is that local proxy is always invoked before RPC but mock is invoked only when exception after RPC.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>token</td>\n<td>token</td>\n<td>string/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Enable token validation. Disable token if it's null. It will generate token randomly when enable, or will use static token.  The token is designed to prevent consumers from bypassing the registry direct access to provider. If you want peer to peer, token validation must disbable.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>registry</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>register to all registries by default</td>\n<td>Configuration association</td>\n<td>Register services to specified registry while having multiple registries. It is the <code>id</code> value of the &lt;dubbo:registry&gt;. If don't want to register to any registry, set it as <code>N/A</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>provider</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>use the first configured provider</td>\n<td>Configuration association</td>\n<td>The reference to <code>&lt;dubbo:provider&gt;</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>deprecated</td>\n<td>deprecated</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Mark the service is deprecated. If true, there will log an error log on the client side.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dynamic</td>\n<td>dynamic</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether the service is registered dynamically. If false, services will be showed as <code>disable</code>, you need to enable it manually. And you also need to disable it when provider shut down.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accesslog</td>\n<td>accesslog</td>\n<td>string/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> will write access log to logger. Specifying it to a log path, you can write access logs to special log file.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The owner of the service. It's used for service governance.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>document</td>\n<td>document</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Service document URL</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>weight</td>\n<td>weight</td>\n<td>int</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The weight of the service</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>executes</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum parallel execution request count per method per service for the provider.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>string</td>\n<td>False</td>\n<td>javassist</td>\n<td>Performance optimize</td>\n<td>The proxy implement, jdk/javassist are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>cluster</td>\n<td>string</td>\n<td>False</td>\n<td>failover</td>\n<td>Performance optimize</td>\n<td>failover/failfast/failsafe/failback/forking are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>service.filter</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The filter name of the RPC process of the provider, use <code>,</code> to separate multiple filter names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>exporter.listener</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The listener name of the provider, use <code>,</code> to separate multiple listener names.</td>\n<td></td>\n</tr>\n<tr>\n<td>protocol</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Configuration association</td>\n<td>Specify the protocol for service provider. It references the <code>id</code> of <code>&lt;dubbo:protocol&gt;</code> tag. Use <code>,</code> to separate multiple protocols.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The biz layer of the service provider, such as biz, dao, intl:web and china:acton.</td>\n<td>Above 2.0.7</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether registering service providers to registry.</td>\n<td>Above 2.0.8</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<style>\ntable {\n  width: 100%;\n  max-width: 65em;\n  border: 1px solid #dedede;\n  margin: 15px auto;\n  border-collapse: collapse;\n  empty-cells: show;\n}\ntable th,\ntable td {\n  height: 35px;\n  border: 1px solid #dedede;\n  padding: 0 10px;\n}\ntable th {\n  font-weight: bold;\n  text-align: center !important;\n  background: rgba(158,188,226,0.2);\n  white-space: nowrap;\n}\ntable tbody tr:nth-child(2n) {\n  background: rgba(158,188,226,0.12);\n}\ntable td:nth-child(1) {\n  white-space: nowrap;\n}\ntable tr:hover {\n  background: #efefef;\n}\n.table-area {\n  overflow: auto;\n}\n</style>\n<script type=\"text/javascript\">\n[].slice.call(document.querySelectorAll('table')).forEach(function(el){\n    var wrapper = document.createElement('div');\n    wrapper.className = 'table-area';\n    el.parentNode.insertBefore(wrapper, el);\n    el.parentNode.removeChild(el);\n    wrapper.appendChild(el);\n})\n</script>\n<h1>dubbo:service</h1>\n<p>The configuration of the service provider. The corresponding class is <code>com.alibaba.dubbo.config.ServiceConfig</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Attribute</th>\n<th>Corresponding URL parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Default Value</th>\n<th>Function</th>\n<th>Description</th>\n<th>Compatibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>interface</td>\n<td></td>\n<td>class</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>The service interface name</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>ref</td>\n<td></td>\n<td>object</td>\n<td><b>True</b></td>\n<td></td>\n<td>Service discovery</td>\n<td>The reference to the service implementation</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>version</td>\n<td>version</td>\n<td>string</td>\n<td>False</td>\n<td>0.0.0</td>\n<td>Service discovery</td>\n<td>Service version. It's recommended to use 2 digitals such as <code>1.0</code>. It's necessary to upgrade version only when the service is not compatible.</td>\n<td>Above 1.0.0</td>\n</tr>\n<tr>\n<td>group</td>\n<td>group</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service discovery</td>\n<td>The group of the service providers. It can distinguish services when it has multiple implements.</td>\n<td>Above 1.0.7</td>\n</tr>\n<tr>\n<td>path</td>\n<td>&lt;path&gt;</td>\n<td>string</td>\n<td>False</td>\n<td>default value is the interface name</td>\n<td>Service discovery</td>\n<td>In 1.0, service path is not supported, it's always equals to the interface name. So it may not compitable when a service reference in 1.0 calls a service provider in 2.0 that specified path.</td>\n<td>Above 1.0.12</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>delay</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The delay time(ms) for registering services.  When set to -1, it indicates that the services will expose to registry after the Spring context is initialized</td>\n<td>Above 1.0.14</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>timeout</td>\n<td>int</td>\n<td>False</td>\n<td>1000</td>\n<td>Performance optimize</td>\n<td>The RPC timeout(ms)</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>retries</td>\n<td>int</td>\n<td>False</td>\n<td>2</td>\n<td>Performance optimize</td>\n<td>The retry count for RPC, not including the first invoke. Please set it to 0 if don't need to retry.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>connections</td>\n<td>int</td>\n<td>False</td>\n<td>100</td>\n<td>Performance optimize</td>\n<td>The maximum connections of every provider. For short connection such as rmi, http and hessian, it's connection limit, but for long connection such as dubbo, it's connection count.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>loadbalance</td>\n<td>loadbalance</td>\n<td>string</td>\n<td>False</td>\n<td>random</td>\n<td>Performance optimize</td>\n<td>Strategy of load balance, <code>random</code>, <code>roundrobin</code> and <code>leastactive</code> are available.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>async</td>\n<td>async</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Performance optimize</td>\n<td>Asynchronous execution, not reliable. It does not block the execution thread just only ignores the return value.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>stub</td>\n<td>stub</td>\n<td>class/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default proxy class name, which is the interface name with <code>Local</code> as the suffix. It's used to execute local logic such as caching. The proxy class must have a constructor with the remote proxy object as a parameter, such as <code>public XxxServiceLocal(XxxService xxxService)</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>mock</td>\n<td>mock</td>\n<td>class/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> means use the default mock class name, which is the interface name with <code>Mock</code> suffix. It's called when the RPC is failed, such as timeout or IO exception. The mock class must carry a  none parameter constructor. The difference between mock and local proxy is that local proxy is always invoked before RPC but mock is invoked only when exception after RPC.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>token</td>\n<td>token</td>\n<td>string/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Enable token validation. Disable token if it's null. It will generate token randomly when enable, or will use static token.  The token is designed to prevent consumers from bypassing the registry direct access to provider. If you want peer to peer, token validation must disbable.</td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>registry</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>register to all registries by default</td>\n<td>Configuration association</td>\n<td>Register services to specified registry while having multiple registries. It is the <code>id</code> value of the &lt;dubbo:registry&gt;. If don't want to register to any registry, set it as <code>N/A</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>provider</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td>use the first configured provider</td>\n<td>Configuration association</td>\n<td>The reference to <code>&lt;dubbo:provider&gt;</code></td>\n<td>Above 2.0.0</td>\n</tr>\n<tr>\n<td>deprecated</td>\n<td>deprecated</td>\n<td>boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td>Mark the service is deprecated. If true, there will log an error log on the client side.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>dynamic</td>\n<td>dynamic</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether the service is registered dynamically. If false, services will be showed as <code>disable</code>, you need to enable it manually. And you also need to disable it when provider shut down.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>accesslog</td>\n<td>accesslog</td>\n<td>string/boolean</td>\n<td>False</td>\n<td>false</td>\n<td>Service governance</td>\n<td><code>true</code> will write access log to logger. Specifying it to a log path, you can write access logs to special log file.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>owner</td>\n<td>owner</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The owner of the service. It's used for service governance.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>document</td>\n<td>document</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>Service document URL</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>weight</td>\n<td>weight</td>\n<td>int</td>\n<td>False</td>\n<td></td>\n<td>Performance optimize</td>\n<td>The weight of the service</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>executes</td>\n<td>int</td>\n<td>False</td>\n<td>0</td>\n<td>Performance optimize</td>\n<td>The maximum parallel execution request count per method per service for the provider.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>proxy</td>\n<td>proxy</td>\n<td>string</td>\n<td>False</td>\n<td>javassist</td>\n<td>Performance optimize</td>\n<td>The proxy implement, jdk/javassist are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>cluster</td>\n<td>cluster</td>\n<td>string</td>\n<td>False</td>\n<td>failover</td>\n<td>Performance optimize</td>\n<td>failover/failfast/failsafe/failback/forking are available.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>filter</td>\n<td>service.filter</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The filter name of the RPC process of the provider, use <code>,</code> to separate multiple filter names.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>listener</td>\n<td>exporter.listener</td>\n<td>string</td>\n<td>False</td>\n<td>default</td>\n<td>Performance optimize</td>\n<td>The listener name of the provider, use <code>,</code> to separate multiple listener names.</td>\n<td></td>\n</tr>\n<tr>\n<td>protocol</td>\n<td></td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Configuration association</td>\n<td>Specify the protocol for service provider. It references the <code>id</code> of <code>&lt;dubbo:protocol&gt;</code> tag. Use <code>,</code> to separate multiple protocols.</td>\n<td>Above 2.0.5</td>\n</tr>\n<tr>\n<td>layer</td>\n<td>layer</td>\n<td>string</td>\n<td>False</td>\n<td></td>\n<td>Service governance</td>\n<td>The biz layer of the service provider, such as biz, dao, intl:web and china:acton.</td>\n<td>Above 2.0.7</td>\n</tr>\n<tr>\n<td>register</td>\n<td>register</td>\n<td>boolean</td>\n<td>False</td>\n<td>true</td>\n<td>Service governance</td>\n<td>Whether registering service providers to registry.</td>\n<td>Above 2.0.8</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/en-us/docs/user/references/xml/dubbo-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/xml/introduction.json b/en-us/docs/user/references/xml/introduction.json
index 2c11a821..1336f80a 100644
--- a/en-us/docs/user/references/xml/introduction.json
+++ b/en-us/docs/user/references/xml/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>schema configuration reference</h1>\n<p>The following pages show all the configuration properties <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> with XML Config <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> as an example.  For other configurations, please reference: <a href=\"../../configuration/properties.md\">Properties Configuration</a>, <a href=\"../../configuration/annotation.md\">Annotation Configuration</a>, <a href=\"../../configuration/api.md\">API Configuration</a>.</p>\n<p>All configuration properties fall into three categories, see the &quot;Function&quot; in the table below.</p>\n<ul>\n<li>Service discovery: used for service registration and discovery in order to find providers for consumers.</li>\n<li>Service governance: used for service management and governance, such as to provide conveninence for dev or test.</li>\n<li>Performance optinize: used for optimizing performance. Diffenent properties may has different performance impact.</li>\n<li>All properties will transform into URL <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>  which is generated by provider. The url will be subscribed by consumers through registry. Please see the <code>Corresponding URL parameter</code> in the table below for each property.</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Notice: These three properties, group, interface, and version determine a service. All other properties are used for service governance or performance optimize. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>XML Schema: <a href=\"http://dubbo.apache.org/schema/dubbo/dubbo.xsd\">http://dubbo.apache.org/schema/dubbo/dubbo.xsd</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>URL format:<code>protocol://username:password@host:port/path?key=value&amp;key=value</code> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>schema configuration reference</h1>\n<p>The following pages show all the configuration properties <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> with XML Config <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> as an example.  For other configurations, please reference: <a href=\"../../configuration/properties.md\">Properties Configuration</a>, <a href=\"../../configuration/annotation.md\">Annotation Configuration</a>, <a href=\"../../configuration/api.md\">API Configuration</a>.</p>\n<p>All configuration properties fall into three categories, see the &quot;Function&quot; in the table below.</p>\n<ul>\n<li>Service discovery: used for service registration and discovery in order to find providers for consumers.</li>\n<li>Service governance: used for service management and governance, such as to provide conveninence for dev or test.</li>\n<li>Performance optinize: used for optimizing performance. Diffenent properties may has different performance impact.</li>\n<li>All properties will transform into URL <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>  which is generated by provider. The url will be subscribed by consumers through registry. Please see the <code>Corresponding URL parameter</code> in the table below for each property.</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Notice: These three properties, group, interface, and version determine a service. All other properties are used for service governance or performance optimize. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>XML Schema: <a href=\"http://dubbo.apache.org/schema/dubbo/dubbo.xsd\">http://dubbo.apache.org/schema/dubbo/dubbo.xsd</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>URL format:<code>protocol://username:password@host:port/path?key=value&amp;key=value</code> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/en-us/docs/user/references/xml/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/rest.json b/en-us/docs/user/rest.json
index f7da9196..d6d7d338 100644
--- a/en-us/docs/user/rest.json
+++ b/en-us/docs/user/rest.json
@@ -1,4 +1,6 @@
 {
   "filename": "rest.md",
-  "__html": "<h1>Developing RESTful Remoting in Dubbo</h1>\n<p><strong>Original author: Li Shen</strong></p>\n<p><strong>Document copyright: <a href=\"HTTP://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0license Signature - No interpretation</a></strong></p>\n<p>Working in progress ...</p>\n<blockquote>\n<p>This article is lengthy since REST involves many aspects. Besides, it refers to the document style of Spring and so on. Not only limited to usage of the framework but also strives to present the design concept of the framework and the architectural idea of an excellent application.</p>\n</blockquote>\n<blockquote>\n<p>For people who only want to get a glimpse of Dubbo and REST, all they need is to browse through the <code>Overview</code> to <code>Introduction to Standard Java REST API: JAX-RS</code>.</p>\n</blockquote>\n<p>TODO: Generate a clickable directory</p>\n<h2>CONTENT</h2>\n<ul>\n<li>Overview</li>\n<li>Advantages of REST</li>\n<li>Application Scenarios</li>\n<li>Quick Start</li>\n<li>Introduction to Standard Java REST API: JAX-RS</li>\n<li>Details of REST Service Provider\n<ul>\n<li>Implementation of HTTP POST/GET</li>\n<li>Should Annotation be Placed in the Interface or Implementation</li>\n<li>Support for Multiple Data Formats (JSON, XML, etc.)</li>\n<li>Support for Chinese Characters</li>\n<li>Additional Requirements for XML Format</li>\n<li>Custom Serialization</li>\n<li>Configure the Implementation of REST Server</li>\n<li>Access Context Data</li>\n<li>Configure the Port Number and Context Path</li>\n<li>Configure Number of Threads and IO Threads</li>\n<li>Configure Persistent Connection</li>\n<li>Configure Maximum Number of HTTP Connections</li>\n<li>Configure Timeout and HTTP Connections Per Consumer</li>\n<li>Gzip Data Compression</li>\n<li>Replace Part of Spring XML Configuration With Annotation</li>\n<li>Add Custom Filter, Interceptor, etc.</li>\n<li>Add Custom Exception Handler</li>\n<li>Configure HTTP Log Output</li>\n<li>Verification of Input Parameters</li>\n<li>Should REST Services be Published Transparently</li>\n</ul>\n</li>\n<li>Details of REST Service Consumer\n<ul>\n<li>Scenario 1: Non-Dubbo Consumer Calls Dubbo REST Service</li>\n<li>Scenario 2: Dubbo Consumer Calls Dubbo REST Service</li>\n<li>Scenario 3: Dubbo Consumer Calls Non-Dubbo REST Service</li>\n</ul>\n</li>\n<li>JAX-RS Restrictions in Dubbo</li>\n<li>REST FAQ\n<ul>\n<li>Can Dubbo REST Services be Integrated With Dubbo Registration Center and Monitoring Center?</li>\n<li>How to Implement Load Balancing and Failover in Dubbo REST?</li>\n<li>Can Overloaded Methods in JAX-RS Map to Single URL?</li>\n<li>Can a Method in JAX-RS Receive Multiple Parameters Via POST?</li>\n</ul>\n</li>\n<li>Possible shortcomings of Current Dubbo System (Related to REST)\n<ul>\n<li>Invasiveness of Rpc Context</li>\n<li>Limitations of Protocol Configuration</li>\n<li>XML Naming Does Not Conform to the Convention of Spring</li>\n</ul>\n</li>\n<li>REST Best Practices</li>\n<li>Performance Benchmark\n<ul>\n<li>Test Environment</li>\n<li>Test Script</li>\n<li>Test Result</li>\n</ul>\n</li>\n<li>Extended Discussion\n<ul>\n<li>Comparison of REST, Thrift, Protobuf, etc.</li>\n<li>Comparison Between REST and Traditional Web Services</li>\n<li>Comparison Between JAX-RS and Spring MVC</li>\n</ul>\n</li>\n<li>Future</li>\n</ul>\n<h2>Overview</h2>\n<p>Dubbo supports a variety of remote calling methods, such as Dubbo RPC (Binary Serialization + TCP), HTTP Invoker (Binary Serialization + HTTP, at least there is no support for Text Serialization in the open source version), Hessian (Binary Serialization + HTTP), Web Services (Text Serialization + HTTP), etc., but lacks support for trending RESTful Remote Calls (Text Serialization + HTTP).</p>\n<p>Therefore, based on the standard Java REST API: JAX-RS 2.0 (Abbreviation of Java API for RESTful Web Services), we provide a mostly transparent REST Call support for Dubbo. Since it is fully compatible with the Standard Java API, all REST services developed for Dubbo may normally work without Dubbo or any specific underlying REST implementation.</p>\n<p>It is particularly worth noting that we do not need to strictly adhere to the original definition and architectural style of REST. Even the famous Twitter REST API will make modest adjustments according to the situations, rather than mechanically follow the original REST style.</p>\n<blockquote>\n<p>Note: We call this feature RESTful Remoting (abstracted remote process or call) rather than a RESTful RPC (specific remote &quot;procedure&quot; call) because REST and RPC can be thought of two different styles. In Dubbo's REST implementation, there are two aspects, one is to provide or consume regular REST services, the other is to make REST a protocol implementation in the Dubbo RPC system, and RESTful Remoting covers both aspects.</p>\n</blockquote>\n<h2>Advantages of REST</h2>\n<p>The following is quoted from Wikipedia:</p>\n<ul>\n<li>REST can use cache to improve response speed more efficiently.</li>\n<li>The stateless nature of the communication allows a set of servers to handle different requests in series, resulting in the increment of server scalability.</li>\n<li>Browser can be used as a client to simplify software requirements.</li>\n<li>REST software dependency is smaller than other mechanisms superimposed on HTTP.</li>\n<li>REST does not require additional resource discovery mechanism.</li>\n<li>REST's long-term compatibility is better in software technology evolution.</li>\n</ul>\n<p>Here I also want to add a particular advantage of REST: REST bases on simple text format messages and universal HTTP. Therefore, it has a broad applicability and is supported by almost all languages and platforms, together with a lower threshold in using and learning.</p>\n<h2>Application scenarios</h2>\n<p>Because of the advantages of REST in applicability, supporting REST in Dubbo can bring (significant) benefits to most of current mainstream remoting call scenarios:</p>\n<ol>\n<li>\n<p>Significantly simplify (cross-language) calls between heterogeneous systems within the enterprise. This is mainly for the following scene: Dubbo acts as a service provider, and systems that are written by other languages (including some java systems that do not base on Dubbo) works as service consumers. The two systems communicate through HTTP and text messages. REST has its unique advantages even comparing to binary cross-language RPC frameworks such as Thrift and ProtoBuf. (See discussion below)</p>\n</li>\n<li>\n<p>Significantly simplify the development of the external Open API (Open Platform). You can use Dubbo to develop a specific Open API application, or you can directly publish the internal Dubbo service as a &quot;transparent&quot; REST API (Of course, it's better for Dubbo itself to provide more features transparently, for example, permission control, frequency control, billing and so on).</p>\n</li>\n<li>\n<p>Significantly simplify the development of mobile (tablet) apps or desktop clients. Similar to point 2, you can use Dubbo to develop a specialized server for the applications, or transparently expose the internal Dubbo service. Of course in some projects, mobile or desktop applications can directly access the Open API described in point 2.</p>\n</li>\n<li>\n<p>Significantly simplify the development of AJAX applications on the browser. Similar to point 2, you can use Dubbo to develop a specialized server for AJAX, or transparently expose the internal Dubbo service directly to JavaScript in the browser. Of course, many AJAX applications work better with web frameworks, so direct access to the Dubbo service may not be an exquisite architecture in many web projects.</p>\n</li>\n<li>\n<p>Provide a text-based, easy-to-read remote call method for Dubbo systems within the enterprise (that is, both the service provider and the consumer are Dubbo-based systems).</p>\n</li>\n<li>\n<p>Simplify the call from the Dubbo system to other heterogeneous systems. You can use a simple way like Dubbo to &quot;transparently&quot; call REST services provided by Non-Dubbo systems (regardless of whether the service provider is inside or outside the enterprise)</p>\n</li>\n</ol>\n<p>It should be pointed out that I think that 1~3 are the most valuable application scenarios for Dubbo's REST call. And the main purpose why we add REST calls for Dubbo is to provide a service-oriented provider. In other words, to develop REST services for Non-Dubbo (heterogeneous) consumers.</p>\n<p>To sum up, all application scenarios are shown below:\n<img src=\"images/rest.jpg\" alt=\"no image found\"></p>\n<p>Borrowing the most famous slogan of Java in the past, by adding REST calls to Dubbo, you can implement the &quot;Write once, access everywhere&quot; service, which can theoretically be accessed all over the world, thus truly achieving an idealized Service-oriented Architecture (SOA).</p>\n<p>Of course, traditional Web Services (WSDL/SOAP) can meet the requirements (even those that require enterprise-level features) of the above scenarios (except for scenario 4). But due to the complexity and other issues, they are less and less used.</p>\n<h2>Quick Start</h2>\n<p>Developing a RESTful service in Dubbo is relatively straightforward. Let's take a simple user registration service for example.</p>\n<p>The function to be implemented by this service is to provide the following URL (Note: This URL is not entirely RESTful, but more straightforward and more practical):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>Any client can POST a JSON string containing the user's information to the above URL to complete the user registration.</p>\n<p>First, implement the interface of the service:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">UserService</span> </span>{    \n   <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span></span>;\n}\n</code></pre>\n<p>Then, implement the service:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<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>{\n       \n    <span class=\"hljs-meta\">@POST</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"register\"</span>)\n    <span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span> </span>{\n        <span class=\"hljs-comment\">// save the user...</span>\n    }\n}\n</code></pre>\n<p>The above implementation code for the service is very simple, but since the REST service is to be published to a specific HTTP URL so they can be accessed by clients written by any language or even a browser, there are a few additional JAX-RS standard annotations to be added for the relevant configuration:</p>\n<p>@Path(&quot;users&quot;): Specify that the relative path for <code>UserService</code> is <code>/users</code>, standing for <a href=\"http://localhost:8080/users\">http://localhost:8080/users</a></p>\n<p>@Path(&quot;register&quot;): Specify that the relative path for <code>registerUser()</code> is <code>/register</code>. Combining the previous @Path specified for <code>UserService</code>, the URL to call <code>UserService.register()</code> is <a href=\"HTTP://localhost:8080/users/register\">HTTP://localhost:8080/users/register</a></p>\n<p>@POST: Specify that <code>registerUser()</code> should be accessed with HTTP POST method</p>\n<p>@Consumes({MediaType.APPLICATION_JSON}): Specify that <code>registerUser()</code> receives data in JSON format. The REST framework will automatically deserialize JSON data into a User object.</p>\n<p>Finally, add this service to the spring configuration file and finish all service development work:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- Exposure service on port 8080 with rest protocol --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span>/&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- Declare the service interface that needs to be exposed --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"userService\"</span>/&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- Implement the service like the local bean --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"userService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"xxx.UserServiceImpl\"</span> /&gt;</span>\n</code></pre>\n<h2>Introduction to Standard Java REST API: JAX-RS</h2>\n<p>JAX-RS is a standard Java REST API that has been widely supported and applied in the industry. There are many well-known open source implementations, including Oracle's Jersey, RedHat's RestEasy, Apache's CXF and Wink, restlet, etc. In addition, all commercial JavaEE application servers that support the JavaEE 6.0 specifications or above support JAX-RS. Therefore, JAX-RS is a very mature solution, and it does not have any so-called vendor lock-in problems.</p>\n<p>JAX-RS has a wealth of information on the web, such as the following introductory tutorial:</p>\n<ul>\n<li>Oracle official tutorial: <a href=\"http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs.htm\">http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs.htm</a></li>\n<li>Article on IBM developerWorks China: <a href=\"http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/\">http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/</a></li>\n</ul>\n<p>For more information, please feel free to Google or Baidu. As far as learning JAX-RS is concerned, it is generally enough to master the usage of various annotations.</p>\n<blockquote>\n<p>Note: Dubbo is based on the JAX-RS 2.0, and sometimes you need to pay attention to the version of the reference material or REST implementation.</p>\n</blockquote>\n<h2>REST Service Provider Details</h2>\n<p>In this section, we will expand the <code>UserService</code> in the &quot;Quick Start&quot; to further demonstrate the development points of the REST service provider in Dubbo.</p>\n<h3>Implementation of HTTP POST/GET</h3>\n<p>Although it's recommended to use the four standard methods (POST, DELETE, PUT and GET) in the HTTP protocol to implement common CRUD in REST services, but in practice, we generally use POST to implement create and update, and use GET to implement delete and read (DELETE and PUT will even be blocked by some firewalls).</p>\n<p>The implementation of POST has already been briefly demonstrated. Here, we will add a function to get the registered user data to <code>UserService</code>, in order to demonstrate the implementation of GET.</p>\n<p>This function is to enable the client to obtain user data of different IDs by accessing different URLs as follows:</p>\n<pre><code>http://localhost:8080/users/1001\nhttp://localhost:8080/users/1002\nhttp://localhost:8080/users/1003\n</code></pre>\n<p>Of course, you can use other forms of URLs to access user data of different IDs, for example:</p>\n<pre><code>http://localhost:8080/users/load?id=1001\n</code></pre>\n<p>JAX-RS itself can support all of these forms. However, the first form of including query parameters in the URL path (<a href=\"http://localhost:8080/users/1001\">http://localhost:8080/users/1001</a>) is more in line with the general habit of REST, so it is recommended to use. Below we will add a <code>getUser()</code> method to the <code>UserService</code> to implement this form of URL access:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@GET</span>\n<span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n<span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON})\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id) </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>@GET: Specify that the method shoule be accessed with HTTP GET method</p>\n<p>@Path(&quot;{id : \\d+}&quot;): According to the above functional requirements, the URL to access <code>getUser()</code> should be &quot;<a href=\"http://localhost:8080/users/\">http://localhost:8080/users/</a> + any number&quot;, and this number should passed to <code>getUser()</code> method as parameter passed to the getUser() method. In the annotation here, the {id: xxx} in @Path specifies that the relative path contains the id parameter, and its value will be automatically passed to the method parameter <code>id</code> annotated with @PathParam(&quot;id&quot;). <code>\\d+</code> following <code>{id:</code> is a regular expression specifies that the id parameter must be a number.</p>\n<p>@Produces({MediaType.APPLICATION_JSON}): Specify that <code>getUser()</code> outputs data in JSON format. The REST framework automatically serializes the User object into JSON data.</p>\n<h3>Is annotation put in interface class or implementation class?</h3>\n<p>The development of REST services based on Dubbo is mainly configured through JAX-RS annotations. In the above example, we put the annotation in the implementation class of the service. But in fact, we can completely put the annotation in the interface of the service. These two methods are completely equivalent, for example:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">UserService</span> </span>{\n    \n    <span class=\"hljs-meta\">@GET</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n    <span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<p>In a typical application, we recommend put the annotation in the service implementation class. Then, annotations are closer to Java implementation code and easier to develop and maintain. More importantly, we generally tend to avoid contamination of the interface, maintaining the purity and wide applicability of the interface.</p>\n<p>However, as will be described later, if we access this service by using the consumer directly developed by Dubbo, the annotation must be put in the interface.</p>\n<p>If the interface and the implementation class are both added annotation at the same time, the implementation configuration of the implementation class will take effect, and the annotation on the interface will be ignored.</p>\n<h3>Support for JSON, XML and other data formats</h3>\n<p>The dubbo REST services can support the transmission of data in multiple formats to provide maximum flexibility to the client. And we add extra functions to the JSON and XML formats which is most commonly used.</p>\n<p>For example, we want the <code>getUser()</code> method in the above example support returning JSON and XML format data separately, just need to include two formats in the annotation:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<p>Or you can directly represent a MediaType with a string (also supports wildcards):</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({<span class=\"hljs-string\">\"application/json\"</span>, <span class=\"hljs-string\">\"text/xml\"</span>})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<p>If all methods support the same type of input and output data format, then we do not need to make configure on each method, just add annotation to the service class:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})\n<span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})\n<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>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>In the case where a REST service supports multiple data formats, according to the JAX-RS standard, the MIME header (content-type and accept) in HTTP is generally used to specify which format data is currently used.</p>\n<p>But in dubbo, we also automatically support the current common use of the industry, that is, use a URL suffix (.json and .xml) to specify the data format you want to use. For example, after adding the above annotation, directly accessing <code>http://localhost:8888/users/1001.json</code> means using the json format, and directly accessing <code>http://localhost:8888/users/1002.xml</code> means using the xml format. It's simpler and more intuitive than using HTTP Header. This way is used by the REST APIs of Twitter, Weibo, etc.</p>\n<p>If you don't add HTTP header or suffix, the REST of dubbo will give priority to enable the top ranked data format in the above definition of annotation.</p>\n<blockquote>\n<p>Note: To support XML format data, you can use either <code>MediaType.TEXT_XML</code> or <code>MediaType.APPLICATION_XML</code> in annotation, but TEXT_XML is more commonly used, and if you want to use the above URL suffix to specify the data format, you can only configure it as TEXT_XML to take effect.</p>\n</blockquote>\n<h3>Chinese character support</h3>\n<p>In order to output Chinese characters normally in dubbo REST, as with the usual Java web applications, we need to set the contentType of the HTTP response to UTF-8 encoding.</p>\n<p>Based on the standard usage of JAX-RS, we only need to do the following annotation configuration:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({<span class=\"hljs-string\">\"application/json; charset=UTF-8\"</span>, <span class=\"hljs-string\">\"text/xml; charset=UTF-8\"</span>})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<p>For the convenience of users, we add a support class directly in dubbo REST to define the above constants, which can be used directly and reduce the possibility of error.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<h3>Additional requirements for XML data format</h3>\n<p>Because the implementation of JAX-RS generally use standard JAXB (Java API for XML Binding) to serialize and deserialize XML format data, we need to add a class-level JAXB annotation for each object to be transferred in XML. Otherwise serialization will report an error. For example, add follows to the User returned in <code>getUser()</code> :</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@XmlRootElement</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>In addition, if the return value in the service method is Java primitive type (such as int, long, float, double, etc.), it is best to add a wrapper object to them, because JAXB can not directly serialize the primitive type.</p>\n<p>For example, we want the above <code>registerUser()</code> method to return the ID number generated by the server for the user:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">long</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span></span>;\n</code></pre>\n<p>Because the primitive type is not supported by JAXB serialization, add a wrapper object:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@XmlRootElement</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RegistrationResult</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> Long id;\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">RegistrationResult</span><span class=\"hljs-params\">()</span> </span>{\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">RegistrationResult</span><span class=\"hljs-params\">(Long id)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.id = id;\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Long <span class=\"hljs-title\">getId</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> id;\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setId</span><span class=\"hljs-params\">(Long id)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.id = id;\n    }\n}\n</code></pre>\n<p>And modify the service method:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\">RegistrationResult <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span></span>;\n</code></pre>\n<p>This not only solves the problem of XML serialization, but also makes the returned data conform to the specifications of XML and JSON. For example, in JSON, the returned form would be as follows:</p>\n<pre><code class=\"language-javascript\">{<span class=\"hljs-string\">\"id\"</span>: <span class=\"hljs-number\">1001</span>}\n</code></pre>\n<p>If you do not add a wrapper, the JSON return value will be directly</p>\n<pre><code>1001 \t\n</code></pre>\n<p>In XML, the return value after adding wrapper will be:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>1002<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n</code></pre>\n<p>This wrapper object actually uses the so-called Data Transfer Object (DTO) mode, and DTO can also make more useful customizations for transferring data.\nWhile in XML, after adding wrapper, the return value will be</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>1002<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n</code></pre>\n<p>In fact, this wrapper object uses the so-called Data Transfer Object (DTO) mode. DTO can also be used to make more useful customizations to transfer data.</p>\n<h3>Custom Serialization</h3>\n<p>As mentioned above, the underlying implementation of REST will automatically serialize/deserialize between the service object and the JSON/XML data format.</p>\n<p>The REST implementation in Dubbo uses JAXB for XML serialization and Jackson for JSON serialization,so you can customize the mapping by adding JAXB or Jackson's annotation to the object.</p>\n<p>For example, customizing the object properties to map to the names of the XML elements:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@XmlRootElement</span>\n<span class=\"hljs-meta\">@XmlAccessorType</span>(XmlAccessType.FIELD)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-meta\">@XmlElement</span>(name=<span class=\"hljs-string\">\"username\"</span>)\n    <span class=\"hljs-keyword\">private</span> String name;  \n}\n</code></pre>\n<p>Customizing the object properties to map to the names of the JSON field:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-meta\">@JsonProperty</span>(<span class=\"hljs-string\">\"username\"</span>)\n    <span class=\"hljs-keyword\">private</span> String name;\n}\n</code></pre>\n<p>For more information, please refer to the official documentation of JAXB and Jackson, or google yourself.</p>\n<h3>Configuring REST Server implementation</h3>\n<p>Currently in dubbo, we support the implementation of five embedded rest servers. The implementation of the rest server is selected by the following XML attribute of the server:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses the embedded jetty to do the rest server. At the same time, if you do not configure the server attribute, the rest protocol also uses jetty by default. jetty is a very mature java servlet container and has a good integration with dubbob (Among the five embedded servers, Only jetty and later tomcat、tjws, complete seamless integration with Dubbo monitoring system.), so, if your dubbo system is a separate process, you can use jetty by default.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"tomcat\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses the embedded tomcat to do the rest server.On embedded tomcat, REST performance is much better than jetty (See the benchmark below). It is recommended that Tomcat is used in scenarios where high performance is required.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses embedded netty to do the rest server. (TODO more contents to add)</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"tjws\"</span>/&gt;</span> (tjws is now deprecated)\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"sunhttp\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses embedded tjws or Sun HTTP server to do the rest server. These two server implementations are very lightweight, it is very convenient for quick start-up in integration testing, of course, it can also be used in a production environment with low load. Note: tjws is currently deprecated because it does not work well with the servlet 3.1 API.</p>\n<p>If your dubbo system is not a separate process,\ninstead of deploying to a Java application server, we recommend the following configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span>/&gt;</span>\n</code></pre>\n<p>By setting the server as the servlet, dubbo will use the servlet container of the external application server to do the rest server. At the same time, add the following configuration to the web.xml of the dubbo system:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">web-app</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">context-param</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">param-name</span>&gt;</span>contextConfigLocation<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">param-name</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">param-value</span>&gt;</span>/WEB-INF/classes/META-INF/spring/dubbo-demo-provider.xml<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">param-value</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">context-param</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener-class</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener-class</span>&gt;</span>org.springframework.web.context.ContextLoaderListener<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener-class</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dispatcher<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dispatcher<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">web-app</span>&gt;</span>\n</code></pre>\n<p>In other words, you must add dubbo's BootstrapListener and DispatherServlet to web.xml to complete the integration of dubbo's REST functionality with the external servlet container.</p>\n<blockquote>\n<p>Note:If you are using spring's ContextLoaderListener to load spring, you must ensure that the BootstrapListener is configured before the ContextLoaderListener, otherwise the dubbo initialization will fail.</p>\n</blockquote>\n<p>In fact, you can still stick to the embedded server in this scenario, but the servlet container of the external application server is often more powerful than the embedded server(Especially if you are deploying to a more robust and scalable WebLogic, WebSphere, etc.). In addition, it is sometimes convenient to do unified management, monitoring, and so on in the application server.</p>\n<h3>Get Context Information</h3>\n<p>Varieties of context information are valuable when calling procedures remotely. For instance, the IP address from the Client.</p>\n<p>We provide two methods to get the Client's IP in dubbo.</p>\n<p>The first one is using @Context annotation from JAX-RS:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id, @Context HttpServletRequest request) </span>{\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + request.getRemoteAddr());\n} \n</code></pre>\n<p>After decorating a parameter of <code>getUser()</code> with Context, we can inject the current HttpServletRequest and then call the servlet api to get the IP.</p>\n<blockquote>\n<p>Notice: This method can only be used when the server is one of the followings: twjs, tomecat, jetty or servlet. All of them provide servlet container. In addition, standard JAX-RS also allow us to get HttpServletRequest using an instance field in service Class decorated by <code>@Context</code>.</p>\n</blockquote>\n<p>The second method is to use RpcContext, which is commonly seen in dubbo:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id) </span>{\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + RpcContext.getContext().getRemoteAddressString());\n} \n</code></pre>\n<blockquote>\n<p>Notice: Similarly, this method only works in the jetty, tomcat, servlet or tjws server. In dubbo, the usage of RpcContext is rather invasive. We are likely to refactor it in the future.</p>\n</blockquote>\n<p>The first method is suggested when your project may run without dubbo and need the compatibility with JAX-RS. But if you want a more elegant service interface definition, the second method would be the better choice.</p>\n<p>What's more, in the newest version of dubbo REST service, RpcContext could be used to get HttpServletRequest and HttpServletResponse, providing great flexibility for users to implement some complex functions. The following is an example:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getRequest() != <span class=\"hljs-keyword\">null</span> &amp;&amp; RpcContext.getContext().getRequest() <span class=\"hljs-keyword\">instanceof</span> HttpServletRequest) {\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + ((HttpServletRequest) RpcContext.getContext().getRequest()).getRemoteAddr());\n}\n\n<span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getResponse() != <span class=\"hljs-keyword\">null</span> &amp;&amp; RpcContext.getContext().getResponse() <span class=\"hljs-keyword\">instanceof</span> HttpServletResponse) {\n    System.out.println(<span class=\"hljs-string\">\"Response object from RpcContext: \"</span> + RpcContext.getContext().getResponse());\n}\n</code></pre>\n<blockquote>\n<p>Notice:\nIn order to maintain the neutrality of the protocol, <code>RpcContext.getRequest()</code> and <code>RpcContext.getResponse()</code> only return an Object which could be null. Therefore, you have to check the type on your own.</p>\n</blockquote>\n<blockquote>\n<p>Notice: only when you use jetty, tomcat, servlet as the server can you get the HttpServletRequest and HttpServletResponse as expected. Because only these server\nimplemented the servlet container.</p>\n</blockquote>\n<p>To simplify the programme, you can also use generic to get a specific type of request/response:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getRequest(HttpServletRequest.class) != <span class=\"hljs-keyword\">null</span>) {\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());\n}\n\n<span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getResponse(HttpServletResponse.class) != <span class=\"hljs-keyword\">null</span>) {\n    System.out.println(<span class=\"hljs-string\">\"Response object from RpcContext: \"</span> + RpcContext.getContext().getResponse(HttpServletResponse.class));\n}\n</code></pre>\n<p>If request/response does not correspond to the specific type, it would return null.</p>\n<h3>Configure The Port Number and Context Path</h3>\n<p>The REST protocol in dubbo use 80 as the default port. But you are also allowed to modify it:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span>/&gt;</span>\n</code></pre>\n<p>As what have been metioned before, we can use <code>@Path</code> to configure relative URL path in single REST service. In fact, we can also set a basic relative path which is known as context path for all REST service.</p>\n<p>All we need to do is to add the contextpath property:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">contextpath</span>=<span class=\"hljs-string\">\"services\"</span>/&gt;</span>\n</code></pre>\n<p>Let's have a look at the previous code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<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>{\n       \n    <span class=\"hljs-meta\">@POST</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"register\"</span>)\n    <span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span> </span>{\n        <span class=\"hljs-comment\">// save the user...</span>\n    }\t\n}\n</code></pre>\n<p>Now the complete path would be:</p>\n<pre><code>http://localhost:8888/services/users/register\n</code></pre>\n<p>Notice: If you use external server as REST server, you should configure as followings,</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">contextpath</span>=<span class=\"hljs-string\">\"services\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span>/&gt;</span>\n</code></pre>\n<p>meaning that you should keep the config of port and contextpath are the same with the port and DispatcherServlet's context path (webapp path + servlet url pattern) in external server. For example, when we are configuring the application on tomcat Root path, we need to make sure the contextpath here is totally the same with the <code>&lt;url-pattern/&gt;</code> of DispacherServlet in web.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dispatcher<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/services/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<h3>Configure the number of threads and IO threads</h3>\n<p>We can set the number of threads of rest service:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"500\"</span>/&gt;</span>\n</code></pre>\n<blockquote>\n<p>Notice: Currently, the setting only works when the server is netty, jetty or tomcat. If you use servlet as the server, you are using the external server as the REST server which is out of dubboes' control, so the setting would not work expectedly.</p>\n</blockquote>\n<p>You can also set threads number of IO worker of netty server:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">\"5\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span>/&gt;</span>\n</code></pre>\n<h3>Configure long connections</h3>\n<p>The REST service in Dubbo is accessed by default with http long connection, if you want to switch to short connection, you can configure it as below:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">keepalive</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n</code></pre>\n<blockquote>\n<p>Notice: This configuration only works in netty and tomcat.</p>\n</blockquote>\n<h3>Configure the maximum number of HTTP connections</h3>\n<p>Configuring the maximum number of HTTP connections can prevent REST server from\noverload as the basic self-protection mechanism.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"500\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"tomcat/&gt;\n</span></span></code></pre>\n<blockquote>\n<p>Notice: Currently, it only works in tomcat.</p>\n</blockquote>\n<h3>Configuring the timeout and HTTP connections for each consumer</h3>\n<p>If the consumer of the rest service is also a dubbo system, you can configure the maximum timeout for the consumer to call the rest service, and the maximum number of HTTP connections that each consumer can initiate, just like other dubbo RPC mechanisms.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"2000\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span>/&gt;</span>\n</code></pre>\n<p>Of course, since this configuration is valid for the consumer, it can also be configured on the consumer side:</p>\n<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\">\"xxx\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"2000\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span>/&gt;</span>\n</code></pre>\n<p>However, we generally recommend configuring the service provider to provide such a configuration. According to the official dubbo documentation, “Provider should configure the properties of the Consumer side as much as possible.\nLet the Provider implementer think about the service features and service quality of the Provider from the beginning.”</p>\n<blockquote>\n<p>Note: If dubbo REST service is released to non-dubbo clients, the configuration on <code>&lt;dubbo:service/&gt;</code> is completely invalid because the client is not under dubbo control.</p>\n</blockquote>\n<h3>GZIP data compresssion</h3>\n<p>Dubbo RESTful Remoting supports the use of Gzip to compress request and response data to reduce network transmission time and bandwidth consumption, but this will also increase CPU overhead.</p>\n<p>TODO more contents to add.</p>\n<h3>Replacing part of the spring XML configuration with annotation</h3>\n<p>Above discussions are based on the XML configuration of Dubbo in spring.\nHowever, dubbo/spring itself supports the use of annotation for configuration, so we can also follow the steps in the Dubbo document and add the relevant annotation to the REST service implementation, replacing some XML configurations, such as:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>(protocol = <span class=\"hljs-string\">\"rest\"</span>)\n<span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<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>{\n\n    <span class=\"hljs-meta\">@Autowired</span>\n    <span class=\"hljs-keyword\">private</span> UserRepository userRepository;\n       \n    <span class=\"hljs-meta\">@POST</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"register\"</span>)\n    <span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span> </span>{\n        <span class=\"hljs-comment\">// save the user</span>\n        userRepository.save(user);\n    }\t\n}\n</code></pre>\n<p>Annotation-based configuration is more concise and precise, and often easier to maintain (modern IDE can support such things as class name refactoring in XML, and therefore the maintenance of XML is good for specific use cases here). XML is less intrusive to code, especially for dynamically modifying configurations, especially when you want to modify the timeout for connection of a single service configuration, the maximum number of connections per client, cluster policy, weights, and so on. In addition, for complex applications or modules, XML provides a central point to cover all the components and configurations. It is at a glance, and generally more convenient for long term maintenance of the project.</p>\n<p>Of course, there's no right or wrong of different choices of configuration method. Sometimes it's just personal preference.</p>\n<h3>Adding a custom Filter, Interceptor, etc</h3>\n<p>Dubbo RESTful Remoting also supports JAX-RS standard Filter and Interceptor to facilitate customized interception of REST request and response processes.</p>\n<p>Here, Filter is mainly used to access and set parameters, URIs for HTTP request and response, and so on, for example, setting the cache header for HTTP response:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CacheControlFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ContainerResponseFilter</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">filter</span><span class=\"hljs-params\">(ContainerRequestContext req, ContainerResponseContext res)</span> </span>{\n        <span class=\"hljs-keyword\">if</span> (req.getMethod().equals(<span class=\"hljs-string\">\"GET\"</span>)) {\n            res.getHeaders().add(<span class=\"hljs-string\">\"Cache-Control\"</span>, <span class=\"hljs-string\">\"someValue\"</span>);\n        }\n    }\n}\n</code></pre>\n<p>Interceptor is mainly used to access and modify the input and output byte streams, for example, manually adding GZIP compression:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GZIPWriterInterceptor</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">WriterInterceptor</span> </span>{\n \n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">aroundWriteTo</span><span class=\"hljs-params\">(WriterInterceptorContext context)</span>\n                    <span class=\"hljs-keyword\">throws</span> IOException, WebApplicationException </span>{\n        OutputStream outputStream = context.getOutputStream();\n        context.setOutputStream(<span class=\"hljs-keyword\">new</span> GZIPOutputStream(outputStream));\n        context.proceed();\n    }\n}\n</code></pre>\n<p>In standard JAX-RS applications, we generally add @Provider annotations to Filter and Interceptor, and JAX-RS runtime will automatically discover and enable them. In Dubbo, we register Filter and Interceptor by adding an XML configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"xxx.TraceInterceptor, xxx.TraceFilter\"</span>/&gt;</span>\n</code></pre>\n<p>Here, we can add these three types of objects, Filter, Interceptor and DynamicFuture, to the <code>extension</code> attributes, separated by commas. (DynamicFuture is another interface that allows us to enable Filter and Interceptor more dynamically. Please feel free to google.)</p>\n<p>Of course, Dubbo itself also supports Filter, but the Filter and Interceptor we discuss here are more like the bottom of the protocol implementation. Compared to Dubbo's filter, you can do a lower level of customization here.</p>\n<blockquote>\n<p>Note: The XML attribute here is called extension, not interceptor or filter. That is because we will add more extension types in addition to Interceptor and Filter in the future.</p>\n</blockquote>\n<p>If the REST consumer is also a Dubbo system (see discussion below), you can also configure the Interceptor and Filter for the consumer in a similar way.</p>\n<p>However, it should be noted that the consumer-side Filter and the provider-side Filter in JAX-RS are two different interfaces. For example, in the previous example, the server is the ContainerResponseFilter interface, and the consumer side corresponds to the ClientResponseFilter:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">LoggingFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ClientResponseFilter</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">filter</span><span class=\"hljs-params\">(ClientRequestContext reqCtx, ClientResponseContext resCtx)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        System.out.println(<span class=\"hljs-string\">\"status: \"</span> + resCtx.getStatus());\n\t    System.out.println(<span class=\"hljs-string\">\"date: \"</span> + resCtx.getDate());\n\t    System.out.println(<span class=\"hljs-string\">\"last-modified: \"</span> + resCtx.getLastModified());\n\t    System.out.println(<span class=\"hljs-string\">\"location: \"</span> + resCtx.getLocation());\n\t    System.out.println(<span class=\"hljs-string\">\"headers:\"</span>);\n\t    <span class=\"hljs-keyword\">for</span> (Entry&lt;String, List&lt;String&gt;&gt; header : resCtx.getHeaders().entrySet()) {\n     \t    System.out.print(<span class=\"hljs-string\">\"\\t\"</span> + header.getKey() + <span class=\"hljs-string\">\" :\"</span>);\n\t        <span class=\"hljs-keyword\">for</span> (String value : header.getValue()) {\n\t            System.out.print(value + <span class=\"hljs-string\">\", \"</span>);\n\t        }\n\t        System.out.print(<span class=\"hljs-string\">\"\\n\"</span>);\n\t    }\n\t    System.out.println(<span class=\"hljs-string\">\"media-type: \"</span> + resCtx.getMediaType().getType());\n    } \n}\n</code></pre>\n<h3>Adding custom Exception handler</h3>\n<p>Dubbo RESTful Remoting also supports JAX-RS standard ExceptionMapper, which can be used to customize the HTTP response after a particular exception occurs.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CustomExceptionMapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExceptionMapper</span>&lt;<span class=\"hljs-title\">NotFoundException</span>&gt; </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Response <span class=\"hljs-title\">toResponse</span><span class=\"hljs-params\">(NotFoundException e)</span> </span>{     \n        <span class=\"hljs-keyword\">return</span> Response.status(Response.Status.NOT_FOUND).entity(<span class=\"hljs-string\">\"Oops! the requested resource is not found!\"</span>).type(<span class=\"hljs-string\">\"text/plain\"</span>).build();\n    }\n}\n</code></pre>\n<p>Similar to Interceptor and Filter, it can be enabled by adding it to an XML configuration file:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"xxx.CustomExceptiionMapper\"</span>/&gt;</span>\n</code></pre>\n<h3>Configuring HTTP log output</h3>\n<p>Dubbo RESTful Remoting supports outputting the header and body in all HTTP requests/responses.</p>\n<p>Add the following REST filter to the XML configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter\"</span>/&gt;</span>\n</code></pre>\n<p><strong>Then turn on at least INFO level log output for com.alibaba.dubbo.rpc.protocol.rest.support in the logging configuration</strong>,for example,in log4j.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.protocol.rest.support\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">level</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"INFO\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"CONSOLE\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">logger</span>&gt;</span>\n</code></pre>\n<p>Of course, you can also turn on INFO level log output directly in the ROOT logger:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">root</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">level</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"INFO\"</span> /&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"CONSOLE\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">root</span>&gt;</span>\n</code></pre>\n<p>Then there will be something like the following output in the log:</p>\n<pre><code>The HTTP headers are: \naccept: application/json;charset=UTF-8\naccept-encoding: gzip, deflate\nconnection: Keep-Alive\ncontent-length: 22\ncontent-type: application/json\nhost: 192.168.1.100:8888\nuser-agent: Apache-HttpClient/4.2.1 (java 1.5)\n</code></pre>\n<pre><code>The contents of request body is: \n{&quot;id&quot;:1,&quot;name&quot;:&quot;dang&quot;}\n</code></pre>\n<p>After the HTTP log output is turned on, in addition to the performance overhead of the normal log output, additional overhead is generated in, for example, HTTP request parsing, because an additional memory buffer needs to be allocated to prepare the data for the log output.</p>\n<h3>Inputing parameter validation</h3>\n<p>Dubbo RESTful Remoting supports the use of the Java standard bean validation annotation(JSR 303) for input validation <a href=\"http://beanvalidation.org/\">http://beanvalidation.org/</a>.</p>\n<p>In order to be consistent with other Dubbo remote invocation protocols, the annotations that are checked for rest must be placed on the interface of the service, for example:</p>\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\">UserService</span> </span>{\n   \n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@Min(value=<span class=\"hljs-number\">1</span>L, message=<span class=\"hljs-string\">\"User ID must be greater than 1\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<p>Of course, in many other bean validation scenarios, annotations are placed on implementation classes rather than interfaces. At least one advantage of placing an annotation on an interface is that the Dubbo client can share information about the interface. The input validation can be done locally even without RPC.</p>\n<p>Then turn on the validation in the XML configuration in the same way as Dubbo:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">xxx.UserService</span>\" <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"userService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n</code></pre>\n<p>In many other RPC protocols of Dubbo, if the input validation error occurs, the <code>RpcException</code> is directly thrown to the client, but in the rest, since the client is often non-Dubbo or even non-Java system, it is inconvenient to directly throw a Java exception.  Therefore, at present we will return the validation error in XML format:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">violationReport</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">constraintViolations</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">path</span>&gt;</span>getUserArgument0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">path</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">message</span>&gt;</span>User ID must be greater than 1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">message</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">value</span>&gt;</span>0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">value</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">constraintViolations</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">violationReport</span>&gt;</span>\n</code></pre>\n<p>The return values of other data formats will also be supported later. As for how to internationalize the verification error message, refer directly to the relevant documentation of the bean validation.</p>\n<p>If you think that the default validation error return format does not meet your requirements, you can add custom ExceptionMapper to custom error return format freely as described in the previous section. It should be noted that this ExceptionMapper must use the generic declaration to capture the RpcException of Dubbo in order to successfully override the default exception handling strategy of Dubbo rest. In order to simplify the operation, the easiest way to do this is to directly inherit the RpcExceptionMapper of Dubbo rest and override the method that handles the validation exception:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MyValidationExceptionMapper</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">RpcExceptionMapper</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> Response <span class=\"hljs-title\">handleConstraintViolationException</span><span class=\"hljs-params\">(ConstraintViolationException cve)</span> </span>{\n        ViolationReport report = <span class=\"hljs-keyword\">new</span> ViolationReport();\n        <span class=\"hljs-keyword\">for</span> (ConstraintViolation cv : cve.getConstraintViolations()) {\n            report.addConstraintViolation(<span class=\"hljs-keyword\">new</span> RestConstraintViolation(\n                    cv.getPropertyPath().toString(),\n                    cv.getMessage(),\n                    cv.getInvalidValue() == <span class=\"hljs-keyword\">null</span> ? <span class=\"hljs-string\">\"null\"</span> : cv.getInvalidValue().toString()));\n        }\n        <span class=\"hljs-comment\">// Use json output instead of xml output</span>\n        <span class=\"hljs-keyword\">return</span> Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(report).type(ContentType.APPLICATION_JSON_UTF_8).build();\n    }\n}\n</code></pre>\n<p>Then add this ExceptionMapper to the XML configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"xxx.MyValidationExceptionMapper\"</span>/&gt;</span>\n</code></pre>\n<h3>Whether to transparently publish REST service</h3>\n<p>Dubbo RESTful Remoting differs from some other RPCs in Dubbo in that you need to add JAX-RS annotations (and JAXB, Jackson's annotation) to your service code. If you think these annotations &quot;pollute&quot; your service code to a certain extent,you can consider writing additional Facade and DTO classes, adding annotations to that, and Facade forwards the calls to the real service implementation class. Of course, adding annotations directly to the service code basically has no negative effects, and this is itself a standard usage in Java EE. In addition, JAX-RS and JAXB annotations belong to the Java standard. Compared with spring, Dubbo, etc., which we often use, annotations have no problem with vendor lock-in, so there is usually no need to introduce additional objects.</p>\n<p>In addition,when you want to use the @Context annotation mentioned above, injecting HttpServletRequest through method parameters (such as <code>public User getUser(@PathParam(&quot;id&quot;) Long id, @Context HttpServletRequest request)</code>), the method signature of service is changed and HttpServletRequest is a REST-specific parameter, you should introduce additional Facade classes if your service supports multiple RPC mechanisms.</p>\n<p>Of course, your service code may already act as a Facade and DTO before adding RESTful Remoting (as to why some scenarios require these roles, and if you are interested, you can refer to [Micro-SOA: Service Design Principles and Practices] <a href=\"Http://www.infoq.com/cn/articles/micro-soa-1\">Http://www.infoq.com/cn/articles/micro-soa-1</a>). In this case, after adding REST, if you add additional REST-related Facade and DTO, it is equivalent to wrapping the original code again, which forms the following call chain:</p>\n<p><code>RestFacade/RestDTO -&gt; Facade/DTO -&gt; Service</code></p>\n<p>This kind of system is cumbersome, and the workload of data conversion is not small, so it should be avoided if possible.</p>\n<h3>Consumer of RESTful Remoting</h3>\n<p>Here we use three scenarios:</p>\n<ol>\n<li>The non-Dubbo consumer calls Dubbo REST service (non-Dubbo --&gt; Dubbo)</li>\n<li>The Dubbo consumer calls Dubbo REST service (Dubbo --&gt; Dubbo)</li>\n<li>The consumer of Dubbo calls the non-Dubbo REST service (Dubbo --&gt; non-Dubbo)</li>\n</ol>\n<h3>Scenario 1: Non-Dubbo consumer calls Dubbo REST Service</h3>\n<p>The client of this scenario has nothing to do with Dubbo itself, and it can be directly selected in the appropriate language and framework.</p>\n<p>If it is still a Java client (but not using Dubbo), consider using the standard JAX-RS Client API or a specific REST-implemented Client API to invoke the REST service. The following is the registerUser() that uses the JAX-RS Client API to access the above UserService:</p>\n<pre><code class=\"language-java\">User user = <span class=\"hljs-keyword\">new</span> User();\nuser.setName(<span class=\"hljs-string\">\"Larry\"</span>);\n\nClient client = ClientBuilder.newClient();\nWebTarget target = client.target(<span class=\"hljs-string\">\"http://localhost:8080/services/users/register.json\"</span>);\nResponse response = target.request().post(Entity.entity(user, MediaType.APPLICATION_JSON_TYPE));\n\n<span class=\"hljs-keyword\">try</span> {\n    <span class=\"hljs-keyword\">if</span> (response.getStatus() != <span class=\"hljs-number\">200</span>) {\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"Failed with HTTP error code : \"</span> + response.getStatus());\n    }\n    System.out.println(<span class=\"hljs-string\">\"The generated id is \"</span> + response.readEntity(RegistrationResult.class).getId());\n} <span class=\"hljs-keyword\">finally</span> {\n    response.close();\n    client.close(); <span class=\"hljs-comment\">//Do not close the client every time in real development, such as HTTP long connection is held by the client</span>\n}\n</code></pre>\n<p>The User and RegistrationResult classes in the code snippet above are written by the consumer itself, and the JAX-RS Client API automatically serializes/deserializes them.</p>\n<p>Of course, in Java, you can also use the familiar technologies such as HttpClient, FastJson, XStream, etc. to implement the REST client, which will not be detailed here.</p>\n<h3>Scenario 2: Dubbo consumer calls Dubbo RESTful Remoting</h3>\n<p>In this scenario,  same as  other Dubbo remote calling methods, the Java service interface is shared directly between the service provider and the service consumer, and the Spring XML configuration is added (of course, the Spring/Dubbo annotation configuration can also be used),the remote REST service can be called transparently:</p>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span>/&gt;</span>\n</code></pre>\n<p>As mentioned earlier, in this scenario, JAX-RS annotations must be added to the service interface, so that the corresponding REST configuration information can be shared on the consumer side of Dubbo and remotely called accordingly:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">UserService</span> </span>{\n    \n    <span class=\"hljs-meta\">@GET</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n    <span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})\n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<p>If a variety of data formats are configured in the annotation of the service interface, since both ends are Dubbo systems, a lot of details of REST are blocked, so there is no possibility to select a data format using the aforementioned URL suffix. Currently in this case, the top ranked data format will be used directly.</p>\n<p>Therefore, we recommend that you put the most appropriate data format in front of defining an annotation. For example, we put JSON in front of XML because JSON's transmission performance is better than XML.</p>\n<h3>Scenario 3: The consumer of Dubbo calls a non-Dubbo RESTful Remoting</h3>\n<p>In this scenario, the REST service can be called directly using the Java method described in Scenario 1. But in fact, you can also use the way described in Scenario 2, that is, calling the REST service more transparently, even if this service is not provided by Dubbo.</p>\n<p>If the scenario 2 is used, since the REST service is not provided by Dubbo, there is generally no shared Java service interface mentioned above, so we need to write the Java interface and the corresponding parameter class according to the external REST service. Add JAX-RS, JAXB, Jackson and other annotations, Dubbo's REST underlying implementation will automatically generate request messages, automatically parse response messages, etc., so as  to transparently make remote calls. Or this way can also be understood as, we try to use JAX-RS to copy the implementation of the external REST service provider, and then put the written service interface to the client to use directly, Dubbo REST underlying implementation can call other REST services as it calls Dubbo's REST service .</p>\n<p>For example, we want to call the following external service.</p>\n<pre><code>http://api.foo.com/services/users/1001\nhttp://api.foo.com/services/users/1002\n</code></pre>\n<p>Get user data of different IDs, the return format is JSON</p>\n<pre><code class=\"language-java\">{\n    <span class=\"hljs-string\">\"id\"</span>: <span class=\"hljs-number\">1001</span>,\n    <span class=\"hljs-string\">\"name\"</span>: <span class=\"hljs-string\">\"Larry\"</span>\n}\n</code></pre>\n<p>We can write service interfaces and parameter classes based on this information:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">UserService</span> </span>{\n    \n    <span class=\"hljs-meta\">@GET</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n    <span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> Long id;\n\n    <span class=\"hljs-keyword\">private</span> String name;\n\n    <span class=\"hljs-comment\">// …</span>\n}\n</code></pre>\n<p>For the configuration in Spring, because the REST service is not provided by Dubbo, you can not use the Dubbo registry to directly configure the url address of the external REST service (such as multiple addresses separated by commas):</p>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"rest://api.foo.com/services/\"</span>/&gt;</span>\n</code></pre>\n<blockquote>\n<p>Note: The protocol here must use rest:// instead of http://. If the external REST service has a context path, it must also be added to the url (unless you have a context path in the @Path annotation for each service interface), such as /services/ above. At the same time, the services here must be followed by /, in order to make Dubbo work properly.</p>\n<p>In addition, you can still configure the maximum number of connections and timeouts that the client can start:</p>\n</blockquote>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"rest://api.foo.com/services/\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"2000\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span>/&gt;</span>\n</code></pre>\n<h3>JAX-RS restrictions in Dubbo</h3>\n<p>The REST development in Dubbo is fully compatible with standard JAX-RS, but the features it supports are currently a subset of full JAX-RS, in part because it is limited to the specific architecture of Dubbo and Spring. The limitations of JAX-RS used in Dubbo include but are not limited to:</p>\n<ol>\n<li>Service implementation can only be singleton, and it can not support per-request scope and per-lookup scope</li>\n<li>It is not supported to inject into ServletConfig, ServletContext, HttpServletRequest, HttpServletResponse, etc. with the @Context annotation for the instance field of the service, but it can support the injection of service method parameters. However, for certain REST server implementations (see the previous section), injection of service method parameters is not supported.</li>\n</ol>\n<h2>REST FAQ</h2>\n<hr>\n<h3>Can Dubbo REST services be integrated with Dubbo Registry and Monitor?</h3>\n<p>Yes, and it will integrate automatically. That is, all the REST services you develop in Dubbo are automatically registered to the Registry and Monitor, by which you can managed your services.\nHowever, many of the service governance operations in the Registry can only be fully functional when the REST consumer is based on Dubbo. If the consumer side is non-Dubbo, it is naturally not managed by the Registry, so that many of the operations will not work for the consumer.</p>\n<h3>How to implement load balancing and failover in Dubbo REST?</h3>\n<p>If the consumer side of Dubbo REST is based on Dubbo, then Dubbo REST is basically the same as other Dubbo remote call protocols: Dubbo framework transparently performs load balancing, failover, etc. on the consumer side.\nIf the consumer side of Dubbo REST is non-Dubbo or even non-Java, it is better to configure the soft load balancing mechanism on the service provider. Currently, you can consider LVS, HAProxy, Nginx, and so on to achieve load balancing for HTTP requests.</p>\n<h3>Can overloaded method in JAX-RS maps to the same URL address?</h3>\n<p><a href=\"http://stackoverflow.com/questions/17196766/can-resteasy-choose-method-based-on-query-params\">http://stackoverflow.com/questions/17196766/can-resteasy-choose-method-based-on-query-params</a></p>\n<h3>Can a POST method in JAX-RS receive multiple parameters?</h3>\n<p><a href=\"http://stackoverflow.com/questions/5553218/jax-rs-post-multiple-objects\">http://stackoverflow.com/questions/5553218/jax-rs-post-multiple-objects</a></p>\n<h2>The shortcomings of Dubbo's current system (related to REST)</h2>\n<hr>\n<p>I think there are obviously a lot of deficiencies in Dubbo's current system. Here are a few REST-related issues that affect users (not including internal implementation issues) for reference and comments, which can help prepare for the refactoring later.</p>\n<h3>Invasiveness of RpcContext</h3>\n<p>We have already mentioned the intrusiveness of RpcContext(See above). Because it uses a singleton to access context information, which is completely inconsistent with the general style of spring applications as well as not conducive to application extension and unit testing. In the future, we may inject an interface with dependency injection, and then use it to access the context information in ThreadLocal.</p>\n<h3>limitations of Protocol configuration</h3>\n<p>Dubbo supports multiple remote call methods, but all call methods are configured with <a href=\"Dubbo:protocol/\">Dubbo:protocol/</a>,  for example:</p>\n<pre><code class=\"language-xml\"><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\">\"9090\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">\"Dubbo\"</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"hessian2\"</span>\n    <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">\"UTF-8\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">\"0\"</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">\"8192\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">\"8388608\"</span>/&gt;</span>\n</code></pre>\n<p>Dubbo supports multiple remote call methods, but all call methods are configured with <a href=\"Dubbo:protocol/\">Dubbo:protocol/</a>,  for example:\nIn fact, many of the above properties are uniquely held by the Dubbo RPC remote call method and many other remote call methods in Dubbo do not support server, client, codec, iothreads, accepts, payload, etc. (of course, some are not supported because of limited conditions, some have no need to be supported at all). This adds a lot of confusions to users when they use Dubbo, and they actually do not know that some attributes (such as performance tuning) will not work after adding them.</p>\n<p>On the other hand, various remote call methods often have a large number of unique configuration requirements, especially as we gradually add much richer and more advanced functions to each kind of remote call method, which cause the expands in <protocol/> attributes inevitably (for example, we have added keepalive and extension two attributes in REST at the moment) and then lead to bloated <protocol/> and user confusion.</p>\n<p>Of course, there is a way to expand <protocol/> in Dubbo by using <a href=\"Dubbo:parameter/\">Dubbo:parameter/</a>, but this method is obviously very limited, the usage is complicated and the schema verification is lacking.\nSo that the best method is to set your own protocol elements for each remote call, such as <protocol-Dubbo/>, <protocol-rest/>, etc. Each element specifies its own attributes using XML Schema. (Of course, it is best to use common attributes between a variety of remote call methods)\nIn this way, a freer way can be used when doing the extension configuration mentioned above, so that it can be much clearer and more extensible (the following is just an example, of course there may be a better way):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:protocol-rest</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someInterceptor<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someFilter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someDynamicFeature<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someEntityProvider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:protocol-rest</span>&gt;</span>\n</code></pre>\n<h3>XML naming does not conform to the spring specification</h3>\n<p>A lot of naming in XML configuration of Dubbo dose not conform to the spring specification, such as:</p>\n<pre><code class=\"language-xml\"><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\">\"9090\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span>\n\n<span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">\"Dubbo\"</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"hessian2\"</span>\n    <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">\"UTF-8\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">\"0\"</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">\"8192\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">\"8388608\"</span>/&gt;</span>\n</code></pre>\n<p>The above threadpool should be changed to thread-pool, iothreads should be changed to io-threads, and words should be separated by &quot;-&quot;. While this may seem like a minor issue, it also involves readability, especially scalability, because sometimes we will inevitably use more words to describe XML elements and attributes.</p>\n<p>In fact, Dubbo itself also recommended to follow the naming convention of spring to XML.</p>\n<h2>Best practices of REST</h2>\n<hr>\n<p>TODO</p>\n<h2>Performance benchmark</h2>\n<hr>\n<h3>Test Environment</h3>\n<p>Roughly as follows:</p>\n<ul>\n<li>4-core Intel(R) Xeon(R) CPU E5-2603 0 @ 1.80GHz</li>\n<li>8G memory</li>\n<li>The network between servers passes through a 100 Mbps switch</li>\n<li>CentOS 5</li>\n<li>JDK 7</li>\n<li>Tomcat 7</li>\n<li>JVM parameter -server -Xms1g -Xmx1g -XX:PermSize=64M -XX:+UseConcMarkSweepGC</li>\n</ul>\n<h3>Test Script</h3>\n<p>Similar to Dubbo's own benchmarks:\n10 concurrent clients send requests continuously:\n• Pass in nested complex objects (single data is small), do nothing and return\n• Pass in a 50K string, do nothing and return (TODO: the result is not listed yet)\nExcute a five-minute performance test. (Reference to Dubbo's own test considerations: &quot;Mainly consider the serialization and performance of network IO, so that the server side does not have any business logic. Take 10 to run simultaneously because of the consideration that the bottleneck can be hit first when the high CPU usage rate is reached by HTTP protocol under the high concurrency situation.&quot;)</p>\n<h3>Test Result</h3>\n<p>The following results are mainly from the comparison between to the two remote call methods, REST and Dubbo RPC which are configured differently, for example:</p>\n<ul>\n<li>“REST: Jetty + XML + GZIP” means: Test REST, use jetty server and XML data format, and enable GZIP compression.</li>\n<li>“Dubbo: hessian2” means: test Dubbo RPC and use hessian2 serialization.</li>\n</ul>\n<p>The results for complex objects are as follows (the smaller Response Time and the larger TPS, the better results):</p>\n<table>\n<thead>\n<tr>\n<th>Remote Call Mode</th>\n<th>Average Response Time</th>\n<th>Average TPS(Num of transactions per second)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>REST: Jetty + JSON</td>\n<td>7.806</td>\n<td>1280</td>\n</tr>\n<tr>\n<td>REST: Jetty + JSON + GZIP</td>\n<td>TODO</td>\n<td>TODO</td>\n</tr>\n<tr>\n<td>REST: Jetty + XML</td>\n<td>TODO</td>\n<td>TODO</td>\n</tr>\n<tr>\n<td>REST: Jetty + XML + GZIP</td>\n<td>TODO</td>\n<td>TODO</td>\n</tr>\n<tr>\n<td>REST: Tomcat + JSON</td>\n<td>2.082</td>\n<td>4796</td>\n</tr>\n<tr>\n<td>REST: Netty + JSON</td>\n<td>2.182</td>\n<td>4576</td>\n</tr>\n<tr>\n<td>Dubbo: FST</td>\n<td>1.211</td>\n<td>8244</td>\n</tr>\n<tr>\n<td>Dubbo: kyro</td>\n<td>1.182</td>\n<td>8444</td>\n</tr>\n<tr>\n<td>Dubbo: Dubbo serialization</td>\n<td>1.43</td>\n<td>6982</td>\n</tr>\n<tr>\n<td>Dubbo: hessian2</td>\n<td>1.49</td>\n<td>6701</td>\n</tr>\n<tr>\n<td>Dubbo: fastjson</td>\n<td>1.572</td>\n<td>6352</td>\n</tr>\n</tbody>\n</table>\n<p>Just a brief summary of the current results:</p>\n<ul>\n<li>Dubbo RPC (especially when based on efficient java serialization methods such as kryo and fst) has a significant advantage response time and throughput over REST. Dubbo RPC is preferred in the intranet Dubbo systems.</li>\n<li>When choosinf REST implementation, tomcat7 and netty are optimal (of course, the current versions of jetty and netty are lower) currently only considering performance. Tjws and sun http server performed extremely poorly in performance tests, with an average response time of more than 200ms and an average tps of only about 50 (to avoid affecting the picture effect, the results are not listed above).</li>\n<li>Performance of JSON data format is better than XML in REST (data is not listed above).</li>\n<li>Enabling GZIP in REST has little to do with complex objects with small data volume in the intranet, but performance has declined (data is not listed above).</li>\n</ul>\n<h2>Performance Optimization Recommendations</h2>\n<p>If you deploy Dubbo REST to an external Tomcat and configure server=&quot;servlet&quot;, that is, enable external tomcat as the underlying implementation of rest server, it is best to add the following configuration to tomcat:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Connector</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span>\n\n<span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"org.apache.coyote.http11.Http11NioProtocol\"</span>\n               <span class=\"hljs-attr\">connectionTimeout</span>=<span class=\"hljs-string\">\"20000\"</span>\n               <span class=\"hljs-attr\">redirectPort</span>=<span class=\"hljs-string\">\"8443\"</span>\n               <span class=\"hljs-attr\">minSpareThreads</span>=<span class=\"hljs-string\">\"20\"</span>\n               <span class=\"hljs-attr\">enableLookups</span>=<span class=\"hljs-string\">\"false\"</span>\n               <span class=\"hljs-attr\">maxThreads</span>=<span class=\"hljs-string\">\"100\"</span>\n               <span class=\"hljs-attr\">maxKeepAliveRequests</span>=<span class=\"hljs-string\">\"-1\"</span>\n               <span class=\"hljs-attr\">keepAliveTimeout</span>=<span class=\"hljs-string\">\"60000\"</span>/&gt;</span>\n</code></pre>\n<p>Especially the configuration maxKeepAliveRequests=&quot;-1&quot; ,which is mainly to ensure that tomcat always enables http long connection, in order to improve the performance of REST call. Note, however, that if the REST consumer side is not continuously call REST services, it is not always best to enable long connections all time. In addition, the way to always enable long connections is generally not suitable for ordinary webapps, but more suitable for such rpc-like scenarios. So that in order to get high performance, Dubbo REST applications and ordinary web applications are best not to be mixed deployment, but should use a separate instance in tomcat.</p>\n<h2>##Extended discussion</h2>\n<h3>Comparison among Rest, Thrift, Protobuf and so on</h3>\n<p>TODO</p>\n<h3>Comparison between REST and traditional Webservers</h3>\n<p>TODO</p>\n<h3>Comparison of JAX-RS Between Spring MVC</h3>\n<p>A preliminary view from <a href=\"http://www.infoq.com/cn/news/2014/10/Dubbox-open-source?utm_source=infoq&amp;utm_medium=popular_links_homepage#theCommentsSection\">http://www.infoq.com/cn/news/2014/10/Dubbox-open-source?utm_source=infoq&amp;utm_medium=popular_links_homepage#theCommentsSection</a></p>\n<blockquote>\n<p>Thank you, in fact, for jax-rs and Spring MVC, I do not have a deep look at the rest support of Spring MVC. I would like to give you some preliminary ideas. Please correct me:</p>\n</blockquote>\n<blockquote>\n<p>Spring MVC also supports configuration using annotation, which actually looks very similar to jax-rs.</p>\n</blockquote>\n<blockquote>\n<p>Personally, I think Spring MVC is better suited to restful services of web applications, such as being invoked by AJAX, or possibly outputting HTML or something like page jump processes in applications. Spring MVC can handle both normal web page requests and rest requests at the same time. But in general, the restful service is implemented in the presentation layer or the web layer.</p>\n</blockquote>\n<blockquote>\n<p>But Jax-rs is more suitable for pure service-oriented applications, that is, the middle-tier services in traditional Java EE, for example, it can publish traditional EJB as restful services. In a Spring application, the bean that acts as a service in the Spring is directly published as a restful service. In general, the restful service is at the business layer, application layer, or facade layer. And MVC hierarchies and concepts are often of little value in such (back-end) applications.</p>\n</blockquote>\n<blockquote>\n<p>Of course, some implementations of jax-rs, such as jersey, also try to include MVC to better accommodate the web applications described above, but not as well as Spring MVC.</p>\n</blockquote>\n<blockquote>\n<p>In Dubbo applications, I think a lot of people prefer to publish a local Spring service bean (or manager) as a remote service directly and transparently, so that it is more straightforward to use JAX-RS here, and there is no need to introduce the MVC concept. Of course, we do not discuss whether transparent publishing of remote services is a best practice or whether to add facade things here first.</p>\n</blockquote>\n<blockquote>\n<p>Of course, I know that many people use Spring MVC restful to call Dubbo (spring) service to publish restful services under the situation that Dubbo does not support rest now. It’s a good method also in my opinion, but if you do not modify Spring MVC and integrate it deeply with Dubbo, restful services cannot enjoy many advanced services such as registering to the Dubbo Registry, monitoring the number of calls, TPS, response time through the Dubbo Monitor, controlling the size of the thread pool and the maximum number of connections through the unified configuration of Dubbo, and controlling the service flow, authority and frequency through Dubbo unified mode like other remote call protocol such as webservices, Dubbo rpc, hessian and so on in Dubbo system. In addition, Spring MVC only works in server side and Spring restTemplate are usually used on consumer side. If restTemplate is not integrated with Dubbo, the service can be downgraded by Dubbo client automatically or manually. If the server and consumer are all Dubbo system, you cannot use unified routing and other functions in Dubbo if the Spring rest is not deeply integrated into Dubbo through interaction of Spring and rest.</p>\n</blockquote>\n<blockquote>\n<p>Of course, I personally think that these things are not necessarily to be one or the other. I heard that Rod Johnson, the founder of spring usually says ‘the customer is always right,’ In fact, it is better to support both ways at the same time rather than discuss which way is better, so that originally I wrote in the document that we plan to support Spring rest annotation, but the feasibility is unknown.</p>\n</blockquote>\n<h2>##Future</h2>\n<p>Functions may be supported later:</p>\n<ul>\n<li>Rest annotation for Spring MVC</li>\n<li>Safety System</li>\n<li>OAuth</li>\n<li>Asynchronous calls</li>\n<li>Gzip</li>\n<li>Payload maxsize</li>\n</ul>\n"
+  "__html": "<h1>Developing RESTful Remoting in Dubbo</h1>\n<p><strong>Original author: Li Shen</strong></p>\n<p><strong>Document copyright: <a href=\"HTTP://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0license Signature - No interpretation</a></strong></p>\n<p>Working in progress ...</p>\n<blockquote>\n<p>This article is lengthy since REST involves many aspects. Besides, it refers to the document style of Spring and so on. Not only limited to usage of the framework but also strives to present the design concept of the framework and the architectural idea of an excellent application.</p>\n</blockquote>\n<blockquote>\n<p>For people who only want to get a glimpse of Dubbo and REST, all they need is to browse through the <code>Overview</code> to <code>Introduction to Standard Java REST API: JAX-RS</code>.</p>\n</blockquote>\n<p>TODO: Generate a clickable directory</p>\n<h2>CONTENT</h2>\n<ul>\n<li>Overview</li>\n<li>Advantages of REST</li>\n<li>Application Scenarios</li>\n<li>Quick Start</li>\n<li>Introduction to Standard Java REST API: JAX-RS</li>\n<li>Details of REST Service Provider\n<ul>\n<li>Implementation of HTTP POST/GET</li>\n<li>Should Annotation be Placed in the Interface or Implementation</li>\n<li>Support for Multiple Data Formats (JSON, XML, etc.)</li>\n<li>Support for Chinese Characters</li>\n<li>Additional Requirements for XML Format</li>\n<li>Custom Serialization</li>\n<li>Configure the Implementation of REST Server</li>\n<li>Access Context Data</li>\n<li>Configure the Port Number and Context Path</li>\n<li>Configure Number of Threads and IO Threads</li>\n<li>Configure Persistent Connection</li>\n<li>Configure Maximum Number of HTTP Connections</li>\n<li>Configure Timeout and HTTP Connections Per Consumer</li>\n<li>Gzip Data Compression</li>\n<li>Replace Part of Spring XML Configuration With Annotation</li>\n<li>Add Custom Filter, Interceptor, etc.</li>\n<li>Add Custom Exception Handler</li>\n<li>Configure HTTP Log Output</li>\n<li>Verification of Input Parameters</li>\n<li>Should REST Services be Published Transparently</li>\n</ul>\n</li>\n<li>Details of REST Service Consumer\n<ul>\n<li>Scenario 1: Non-Dubbo Consumer Calls Dubbo REST Service</li>\n<li>Scenario 2: Dubbo Consumer Calls Dubbo REST Service</li>\n<li>Scenario 3: Dubbo Consumer Calls Non-Dubbo REST Service</li>\n</ul>\n</li>\n<li>JAX-RS Restrictions in Dubbo</li>\n<li>REST FAQ\n<ul>\n<li>Can Dubbo REST Services be Integrated With Dubbo Registration Center and Monitoring Center?</li>\n<li>How to Implement Load Balancing and Failover in Dubbo REST?</li>\n<li>Can Overloaded Methods in JAX-RS Map to Single URL?</li>\n<li>Can a Method in JAX-RS Receive Multiple Parameters Via POST?</li>\n</ul>\n</li>\n<li>Possible shortcomings of Current Dubbo System (Related to REST)\n<ul>\n<li>Invasiveness of Rpc Context</li>\n<li>Limitations of Protocol Configuration</li>\n<li>XML Naming Does Not Conform to the Convention of Spring</li>\n</ul>\n</li>\n<li>REST Best Practices</li>\n<li>Performance Benchmark\n<ul>\n<li>Test Environment</li>\n<li>Test Script</li>\n<li>Test Result</li>\n</ul>\n</li>\n<li>Extended Discussion\n<ul>\n<li>Comparison of REST, Thrift, Protobuf, etc.</li>\n<li>Comparison Between REST and Traditional Web Services</li>\n<li>Comparison Between JAX-RS and Spring MVC</li>\n</ul>\n</li>\n<li>Future</li>\n</ul>\n<h2>Overview</h2>\n<p>Dubbo supports a variety of remote calling methods, such as Dubbo RPC (Binary Serialization + TCP), HTTP Invoker (Binary Serialization + HTTP, at least there is no support for Text Serialization in the open source version), Hessian (Binary Serialization + HTTP), Web Services (Text Serialization + HTTP), etc., but lacks support for trending RESTful Remote Calls (Text Serialization + HTTP).</p>\n<p>Therefore, based on the standard Java REST API: JAX-RS 2.0 (Abbreviation of Java API for RESTful Web Services), we provide a mostly transparent REST Call support for Dubbo. Since it is fully compatible with the Standard Java API, all REST services developed for Dubbo may normally work without Dubbo or any specific underlying REST implementation.</p>\n<p>It is particularly worth noting that we do not need to strictly adhere to the original definition and architectural style of REST. Even the famous Twitter REST API will make modest adjustments according to the situations, rather than mechanically follow the original REST style.</p>\n<blockquote>\n<p>Note: We call this feature RESTful Remoting (abstracted remote process or call) rather than a RESTful RPC (specific remote &quot;procedure&quot; call) because REST and RPC can be thought of two different styles. In Dubbo's REST implementation, there are two aspects, one is to provide or consume regular REST services, the other is to make REST a protocol implementation in the Dubbo RPC system, and RESTful Remoting covers both aspects.</p>\n</blockquote>\n<h2>Advantages of REST</h2>\n<p>The following is quoted from Wikipedia:</p>\n<ul>\n<li>REST can use cache to improve response speed more efficiently.</li>\n<li>The stateless nature of the communication allows a set of servers to handle different requests in series, resulting in the increment of server scalability.</li>\n<li>Browser can be used as a client to simplify software requirements.</li>\n<li>REST software dependency is smaller than other mechanisms superimposed on HTTP.</li>\n<li>REST does not require additional resource discovery mechanism.</li>\n<li>REST's long-term compatibility is better in software technology evolution.</li>\n</ul>\n<p>Here I also want to add a particular advantage of REST: REST bases on simple text format messages and universal HTTP. Therefore, it has a broad applicability and is supported by almost all languages and platforms, together with a lower threshold in using and learning.</p>\n<h2>Application scenarios</h2>\n<p>Because of the advantages of REST in applicability, supporting REST in Dubbo can bring (significant) benefits to most of current mainstream remoting call scenarios:</p>\n<ol>\n<li>\n<p>Significantly simplify (cross-language) calls between heterogeneous systems within the enterprise. This is mainly for the following scene: Dubbo acts as a service provider, and systems that are written by other languages (including some java systems that do not base on Dubbo) works as service consumers. The two systems communicate through HTTP and text messages. REST has its unique advantages even comparing to binary cross-language RPC frameworks such as Thrift and ProtoBuf. (See discussion below)</p>\n</li>\n<li>\n<p>Significantly simplify the development of the external Open API (Open Platform). You can use Dubbo to develop a specific Open API application, or you can directly publish the internal Dubbo service as a &quot;transparent&quot; REST API (Of course, it's better for Dubbo itself to provide more features transparently, for example, permission control, frequency control, billing and so on).</p>\n</li>\n<li>\n<p>Significantly simplify the development of mobile (tablet) apps or desktop clients. Similar to point 2, you can use Dubbo to develop a specialized server for the applications, or transparently expose the internal Dubbo service. Of course in some projects, mobile or desktop applications can directly access the Open API described in point 2.</p>\n</li>\n<li>\n<p>Significantly simplify the development of AJAX applications on the browser. Similar to point 2, you can use Dubbo to develop a specialized server for AJAX, or transparently expose the internal Dubbo service directly to JavaScript in the browser. Of course, many AJAX applications work better with web frameworks, so direct access to the Dubbo service may not be an exquisite architecture in many web projects.</p>\n</li>\n<li>\n<p>Provide a text-based, easy-to-read remote call method for Dubbo systems within the enterprise (that is, both the service provider and the consumer are Dubbo-based systems).</p>\n</li>\n<li>\n<p>Simplify the call from the Dubbo system to other heterogeneous systems. You can use a simple way like Dubbo to &quot;transparently&quot; call REST services provided by Non-Dubbo systems (regardless of whether the service provider is inside or outside the enterprise)</p>\n</li>\n</ol>\n<p>It should be pointed out that I think that 1~3 are the most valuable application scenarios for Dubbo's REST call. And the main purpose why we add REST calls for Dubbo is to provide a service-oriented provider. In other words, to develop REST services for Non-Dubbo (heterogeneous) consumers.</p>\n<p>To sum up, all application scenarios are shown below:\n<img src=\"images/rest.jpg\" alt=\"no image found\"></p>\n<p>Borrowing the most famous slogan of Java in the past, by adding REST calls to Dubbo, you can implement the &quot;Write once, access everywhere&quot; service, which can theoretically be accessed all over the world, thus truly achieving an idealized Service-oriented Architecture (SOA).</p>\n<p>Of course, traditional Web Services (WSDL/SOAP) can meet the requirements (even those that require enterprise-level features) of the above scenarios (except for scenario 4). But due to the complexity and other issues, they are less and less used.</p>\n<h2>Quick Start</h2>\n<p>Developing a RESTful service in Dubbo is relatively straightforward. Let's take a simple user registration service for example.</p>\n<p>The function to be implemented by this service is to provide the following URL (Note: This URL is not entirely RESTful, but more straightforward and more practical):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>Any client can POST a JSON string containing the user's information to the above URL to complete the user registration.</p>\n<p>First, implement the interface of the service:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">UserService</span> </span>{    \n   <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span></span>;\n}\n</code></pre>\n<p>Then, implement the service:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<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>{\n       \n    <span class=\"hljs-meta\">@POST</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"register\"</span>)\n    <span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span> </span>{\n        <span class=\"hljs-comment\">// save the user...</span>\n    }\n}\n</code></pre>\n<p>The above implementation code for the service is very simple, but since the REST service is to be published to a specific HTTP URL so they can be accessed by clients written by any language or even a browser, there are a few additional JAX-RS standard annotations to be added for the relevant configuration:</p>\n<p>@Path(&quot;users&quot;): Specify that the relative path for <code>UserService</code> is <code>/users</code>, standing for <a href=\"http://localhost:8080/users\">http://localhost:8080/users</a></p>\n<p>@Path(&quot;register&quot;): Specify that the relative path for <code>registerUser()</code> is <code>/register</code>. Combining the previous @Path specified for <code>UserService</code>, the URL to call <code>UserService.register()</code> is <a href=\"HTTP://localhost:8080/users/register\">HTTP://localhost:8080/users/register</a></p>\n<p>@POST: Specify that <code>registerUser()</code> should be accessed with HTTP POST method</p>\n<p>@Consumes({MediaType.APPLICATION_JSON}): Specify that <code>registerUser()</code> receives data in JSON format. The REST framework will automatically deserialize JSON data into a User object.</p>\n<p>Finally, add this service to the spring configuration file and finish all service development work:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- Exposure service on port 8080 with rest protocol --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span>/&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- Declare the service interface that needs to be exposed --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"userService\"</span>/&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!-- Implement the service like the local bean --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"userService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"xxx.UserServiceImpl\"</span> /&gt;</span>\n</code></pre>\n<h2>Introduction to Standard Java REST API: JAX-RS</h2>\n<p>JAX-RS is a standard Java REST API that has been widely supported and applied in the industry. There are many well-known open source implementations, including Oracle's Jersey, RedHat's RestEasy, Apache's CXF and Wink, restlet, etc. In addition, all commercial JavaEE application servers that support the JavaEE 6.0 specifications or above support JAX-RS. Therefore, JAX-RS is a very mature solution, and it does not have any so-called vendor lock-in problems.</p>\n<p>JAX-RS has a wealth of information on the web, such as the following introductory tutorial:</p>\n<ul>\n<li>Oracle official tutorial: <a href=\"http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs.htm\">http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs.htm</a></li>\n<li>Article on IBM developerWorks China: <a href=\"http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/\">http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/</a></li>\n</ul>\n<p>For more information, please feel free to Google or Baidu. As far as learning JAX-RS is concerned, it is generally enough to master the usage of various annotations.</p>\n<blockquote>\n<p>Note: Dubbo is based on the JAX-RS 2.0, and sometimes you need to pay attention to the version of the reference material or REST implementation.</p>\n</blockquote>\n<h2>REST Service Provider Details</h2>\n<p>In this section, we will expand the <code>UserService</code> in the &quot;Quick Start&quot; to further demonstrate the development points of the REST service provider in Dubbo.</p>\n<h3>Implementation of HTTP POST/GET</h3>\n<p>Although it's recommended to use the four standard methods (POST, DELETE, PUT and GET) in the HTTP protocol to implement common CRUD in REST services, but in practice, we generally use POST to implement create and update, and use GET to implement delete and read (DELETE and PUT will even be blocked by some firewalls).</p>\n<p>The implementation of POST has already been briefly demonstrated. Here, we will add a function to get the registered user data to <code>UserService</code>, in order to demonstrate the implementation of GET.</p>\n<p>This function is to enable the client to obtain user data of different IDs by accessing different URLs as follows:</p>\n<pre><code>http://localhost:8080/users/1001\nhttp://localhost:8080/users/1002\nhttp://localhost:8080/users/1003\n</code></pre>\n<p>Of course, you can use other forms of URLs to access user data of different IDs, for example:</p>\n<pre><code>http://localhost:8080/users/load?id=1001\n</code></pre>\n<p>JAX-RS itself can support all of these forms. However, the first form of including query parameters in the URL path (<a href=\"http://localhost:8080/users/1001\">http://localhost:8080/users/1001</a>) is more in line with the general habit of REST, so it is recommended to use. Below we will add a <code>getUser()</code> method to the <code>UserService</code> to implement this form of URL access:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@GET</span>\n<span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n<span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON})\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id) </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>@GET: Specify that the method shoule be accessed with HTTP GET method</p>\n<p>@Path(&quot;{id : \\d+}&quot;): According to the above functional requirements, the URL to access <code>getUser()</code> should be &quot;<a href=\"http://localhost:8080/users/\">http://localhost:8080/users/</a> + any number&quot;, and this number should passed to <code>getUser()</code> method as parameter passed to the getUser() method. In the annotation here, the {id: xxx} in @Path specifies that the relative path contains the id parameter, and its value will be automatically passed to the method parameter <code>id</code> annotated with @PathParam(&quot;id&quot;). <code>\\d+</code> following <code>{id:</code> is a regular expression specifies that the id parameter must be a number.</p>\n<p>@Produces({MediaType.APPLICATION_JSON}): Specify that <code>getUser()</code> outputs data in JSON format. The REST framework automatically serializes the User object into JSON data.</p>\n<h3>Is annotation put in interface class or implementation class?</h3>\n<p>The development of REST services based on Dubbo is mainly configured through JAX-RS annotations. In the above example, we put the annotation in the implementation class of the service. But in fact, we can completely put the annotation in the interface of the service. These two methods are completely equivalent, for example:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">UserService</span> </span>{\n    \n    <span class=\"hljs-meta\">@GET</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n    <span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<p>In a typical application, we recommend put the annotation in the service implementation class. Then, annotations are closer to Java implementation code and easier to develop and maintain. More importantly, we generally tend to avoid contamination of the interface, maintaining the purity and wide applicability of the interface.</p>\n<p>However, as will be described later, if we access this service by using the consumer directly developed by Dubbo, the annotation must be put in the interface.</p>\n<p>If the interface and the implementation class are both added annotation at the same time, the implementation configuration of the implementation class will take effect, and the annotation on the interface will be ignored.</p>\n<h3>Support for JSON, XML and other data formats</h3>\n<p>The dubbo REST services can support the transmission of data in multiple formats to provide maximum flexibility to the client. And we add extra functions to the JSON and XML formats which is most commonly used.</p>\n<p>For example, we want the <code>getUser()</code> method in the above example support returning JSON and XML format data separately, just need to include two formats in the annotation:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<p>Or you can directly represent a MediaType with a string (also supports wildcards):</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({<span class=\"hljs-string\">\"application/json\"</span>, <span class=\"hljs-string\">\"text/xml\"</span>})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<p>If all methods support the same type of input and output data format, then we do not need to make configure on each method, just add annotation to the service class:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})\n<span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})\n<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>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>In the case where a REST service supports multiple data formats, according to the JAX-RS standard, the MIME header (content-type and accept) in HTTP is generally used to specify which format data is currently used.</p>\n<p>But in dubbo, we also automatically support the current common use of the industry, that is, use a URL suffix (.json and .xml) to specify the data format you want to use. For example, after adding the above annotation, directly accessing <code>http://localhost:8888/users/1001.json</code> means using the json format, and directly accessing <code>http://localhost:8888/users/1002.xml</code> means using the xml format. It's simpler and more intuitive than using HTTP Header. This way is used by the REST APIs of Twitter, Weibo, etc.</p>\n<p>If you don't add HTTP header or suffix, the REST of dubbo will give priority to enable the top ranked data format in the above definition of annotation.</p>\n<blockquote>\n<p>Note: To support XML format data, you can use either <code>MediaType.TEXT_XML</code> or <code>MediaType.APPLICATION_XML</code> in annotation, but TEXT_XML is more commonly used, and if you want to use the above URL suffix to specify the data format, you can only configure it as TEXT_XML to take effect.</p>\n</blockquote>\n<h3>Chinese character support</h3>\n<p>In order to output Chinese characters normally in dubbo REST, as with the usual Java web applications, we need to set the contentType of the HTTP response to UTF-8 encoding.</p>\n<p>Based on the standard usage of JAX-RS, we only need to do the following annotation configuration:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({<span class=\"hljs-string\">\"application/json; charset=UTF-8\"</span>, <span class=\"hljs-string\">\"text/xml; charset=UTF-8\"</span>})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<p>For the convenience of users, we add a support class directly in dubbo REST to define the above constants, which can be used directly and reduce the possibility of error.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Produces</span>({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})\n<span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n</code></pre>\n<h3>Additional requirements for XML data format</h3>\n<p>Because the implementation of JAX-RS generally use standard JAXB (Java API for XML Binding) to serialize and deserialize XML format data, we need to add a class-level JAXB annotation for each object to be transferred in XML. Otherwise serialization will report an error. For example, add follows to the User returned in <code>getUser()</code> :</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@XmlRootElement</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>In addition, if the return value in the service method is Java primitive type (such as int, long, float, double, etc.), it is best to add a wrapper object to them, because JAXB can not directly serialize the primitive type.</p>\n<p>For example, we want the above <code>registerUser()</code> method to return the ID number generated by the server for the user:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">long</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span></span>;\n</code></pre>\n<p>Because the primitive type is not supported by JAXB serialization, add a wrapper object:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@XmlRootElement</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RegistrationResult</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> Long id;\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">RegistrationResult</span><span class=\"hljs-params\">()</span> </span>{\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">RegistrationResult</span><span class=\"hljs-params\">(Long id)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.id = id;\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Long <span class=\"hljs-title\">getId</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> id;\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setId</span><span class=\"hljs-params\">(Long id)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.id = id;\n    }\n}\n</code></pre>\n<p>And modify the service method:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\">RegistrationResult <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span></span>;\n</code></pre>\n<p>This not only solves the problem of XML serialization, but also makes the returned data conform to the specifications of XML and JSON. For example, in JSON, the returned form would be as follows:</p>\n<pre><code class=\"language-javascript\">{<span class=\"hljs-string\">\"id\"</span>: <span class=\"hljs-number\">1001</span>}\n</code></pre>\n<p>If you do not add a wrapper, the JSON return value will be directly</p>\n<pre><code>1001 \t\n</code></pre>\n<p>In XML, the return value after adding wrapper will be:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>1002<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n</code></pre>\n<p>This wrapper object actually uses the so-called Data Transfer Object (DTO) mode, and DTO can also make more useful customizations for transferring data.\nWhile in XML, after adding wrapper, the return value will be</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>1002<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">registrationResult</span>&gt;</span>\n</code></pre>\n<p>In fact, this wrapper object uses the so-called Data Transfer Object (DTO) mode. DTO can also be used to make more useful customizations to transfer data.</p>\n<h3>Custom Serialization</h3>\n<p>As mentioned above, the underlying implementation of REST will automatically serialize/deserialize between the service object and the JSON/XML data format.</p>\n<p>The REST implementation in Dubbo uses JAXB for XML serialization and Jackson for JSON serialization,so you can customize the mapping by adding JAXB or Jackson's annotation to the object.</p>\n<p>For example, customizing the object properties to map to the names of the XML elements:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@XmlRootElement</span>\n<span class=\"hljs-meta\">@XmlAccessorType</span>(XmlAccessType.FIELD)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-meta\">@XmlElement</span>(name=<span class=\"hljs-string\">\"username\"</span>)\n    <span class=\"hljs-keyword\">private</span> String name;  \n}\n</code></pre>\n<p>Customizing the object properties to map to the names of the JSON field:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-meta\">@JsonProperty</span>(<span class=\"hljs-string\">\"username\"</span>)\n    <span class=\"hljs-keyword\">private</span> String name;\n}\n</code></pre>\n<p>For more information, please refer to the official documentation of JAXB and Jackson, or google yourself.</p>\n<h3>Configuring REST Server implementation</h3>\n<p>Currently in dubbo, we support the implementation of five embedded rest servers. The implementation of the rest server is selected by the following XML attribute of the server:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses the embedded jetty to do the rest server. At the same time, if you do not configure the server attribute, the rest protocol also uses jetty by default. jetty is a very mature java servlet container and has a good integration with dubbob (Among the five embedded servers, Only jetty and later tomcat、tjws, complete seamless integration with Dubbo monitoring system.), so, if your dubbo system is a separate process, you can use jetty by default.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"tomcat\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses the embedded tomcat to do the rest server.On embedded tomcat, REST performance is much better than jetty (See the benchmark below). It is recommended that Tomcat is used in scenarios where high performance is required.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses embedded netty to do the rest server. (TODO more contents to add)</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"tjws\"</span>/&gt;</span> (tjws is now deprecated)\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"sunhttp\"</span>/&gt;</span>\n</code></pre>\n<p>The above configuration uses embedded tjws or Sun HTTP server to do the rest server. These two server implementations are very lightweight, it is very convenient for quick start-up in integration testing, of course, it can also be used in a production environment with low load. Note: tjws is currently deprecated because it does not work well with the servlet 3.1 API.</p>\n<p>If your dubbo system is not a separate process,\ninstead of deploying to a Java application server, we recommend the following configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span>/&gt;</span>\n</code></pre>\n<p>By setting the server as the servlet, dubbo will use the servlet container of the external application server to do the rest server. At the same time, add the following configuration to the web.xml of the dubbo system:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">web-app</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">context-param</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">param-name</span>&gt;</span>contextConfigLocation<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">param-name</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">param-value</span>&gt;</span>/WEB-INF/classes/META-INF/spring/dubbo-demo-provider.xml<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">param-value</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">context-param</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener-class</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">listener-class</span>&gt;</span>org.springframework.web.context.ContextLoaderListener<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener-class</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">listener</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dispatcher<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dispatcher<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">web-app</span>&gt;</span>\n</code></pre>\n<p>In other words, you must add dubbo's BootstrapListener and DispatherServlet to web.xml to complete the integration of dubbo's REST functionality with the external servlet container.</p>\n<blockquote>\n<p>Note:If you are using spring's ContextLoaderListener to load spring, you must ensure that the BootstrapListener is configured before the ContextLoaderListener, otherwise the dubbo initialization will fail.</p>\n</blockquote>\n<p>In fact, you can still stick to the embedded server in this scenario, but the servlet container of the external application server is often more powerful than the embedded server(Especially if you are deploying to a more robust and scalable WebLogic, WebSphere, etc.). In addition, it is sometimes convenient to do unified management, monitoring, and so on in the application server.</p>\n<h3>Get Context Information</h3>\n<p>Varieties of context information are valuable when calling procedures remotely. For instance, the IP address from the Client.</p>\n<p>We provide two methods to get the Client's IP in dubbo.</p>\n<p>The first one is using @Context annotation from JAX-RS:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id, @Context HttpServletRequest request) </span>{\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + request.getRemoteAddr());\n} \n</code></pre>\n<p>After decorating a parameter of <code>getUser()</code> with Context, we can inject the current HttpServletRequest and then call the servlet api to get the IP.</p>\n<blockquote>\n<p>Notice: This method can only be used when the server is one of the followings: twjs, tomecat, jetty or servlet. All of them provide servlet container. In addition, standard JAX-RS also allow us to get HttpServletRequest using an instance field in service Class decorated by <code>@Context</code>.</p>\n</blockquote>\n<p>The second method is to use RpcContext, which is commonly seen in dubbo:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id) </span>{\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + RpcContext.getContext().getRemoteAddressString());\n} \n</code></pre>\n<blockquote>\n<p>Notice: Similarly, this method only works in the jetty, tomcat, servlet or tjws server. In dubbo, the usage of RpcContext is rather invasive. We are likely to refactor it in the future.</p>\n</blockquote>\n<p>The first method is suggested when your project may run without dubbo and need the compatibility with JAX-RS. But if you want a more elegant service interface definition, the second method would be the better choice.</p>\n<p>What's more, in the newest version of dubbo REST service, RpcContext could be used to get HttpServletRequest and HttpServletResponse, providing great flexibility for users to implement some complex functions. The following is an example:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getRequest() != <span class=\"hljs-keyword\">null</span> &amp;&amp; RpcContext.getContext().getRequest() <span class=\"hljs-keyword\">instanceof</span> HttpServletRequest) {\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + ((HttpServletRequest) RpcContext.getContext().getRequest()).getRemoteAddr());\n}\n\n<span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getResponse() != <span class=\"hljs-keyword\">null</span> &amp;&amp; RpcContext.getContext().getResponse() <span class=\"hljs-keyword\">instanceof</span> HttpServletResponse) {\n    System.out.println(<span class=\"hljs-string\">\"Response object from RpcContext: \"</span> + RpcContext.getContext().getResponse());\n}\n</code></pre>\n<blockquote>\n<p>Notice:\nIn order to maintain the neutrality of the protocol, <code>RpcContext.getRequest()</code> and <code>RpcContext.getResponse()</code> only return an Object which could be null. Therefore, you have to check the type on your own.</p>\n</blockquote>\n<blockquote>\n<p>Notice: only when you use jetty, tomcat, servlet as the server can you get the HttpServletRequest and HttpServletResponse as expected. Because only these server\nimplemented the servlet container.</p>\n</blockquote>\n<p>To simplify the programme, you can also use generic to get a specific type of request/response:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getRequest(HttpServletRequest.class) != <span class=\"hljs-keyword\">null</span>) {\n    System.out.println(<span class=\"hljs-string\">\"Client address is \"</span> + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());\n}\n\n<span class=\"hljs-keyword\">if</span> (RpcContext.getContext().getResponse(HttpServletResponse.class) != <span class=\"hljs-keyword\">null</span>) {\n    System.out.println(<span class=\"hljs-string\">\"Response object from RpcContext: \"</span> + RpcContext.getContext().getResponse(HttpServletResponse.class));\n}\n</code></pre>\n<p>If request/response does not correspond to the specific type, it would return null.</p>\n<h3>Configure The Port Number and Context Path</h3>\n<p>The REST protocol in dubbo use 80 as the default port. But you are also allowed to modify it:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span>/&gt;</span>\n</code></pre>\n<p>As what have been metioned before, we can use <code>@Path</code> to configure relative URL path in single REST service. In fact, we can also set a basic relative path which is known as context path for all REST service.</p>\n<p>All we need to do is to add the contextpath property:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">contextpath</span>=<span class=\"hljs-string\">\"services\"</span>/&gt;</span>\n</code></pre>\n<p>Let's have a look at the previous code:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<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>{\n       \n    <span class=\"hljs-meta\">@POST</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"register\"</span>)\n    <span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span> </span>{\n        <span class=\"hljs-comment\">// save the user...</span>\n    }\t\n}\n</code></pre>\n<p>Now the complete path would be:</p>\n<pre><code>http://localhost:8888/services/users/register\n</code></pre>\n<p>Notice: If you use external server as REST server, you should configure as followings,</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">contextpath</span>=<span class=\"hljs-string\">\"services\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span>/&gt;</span>\n</code></pre>\n<p>meaning that you should keep the config of port and contextpath are the same with the port and DispatcherServlet's context path (webapp path + servlet url pattern) in external server. For example, when we are configuring the application on tomcat Root path, we need to make sure the contextpath here is totally the same with the <code>&lt;url-pattern/&gt;</code> of DispacherServlet in web.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dispatcher<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/services/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<h3>Configure the number of threads and IO threads</h3>\n<p>We can set the number of threads of rest service:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"500\"</span>/&gt;</span>\n</code></pre>\n<blockquote>\n<p>Notice: Currently, the setting only works when the server is netty, jetty or tomcat. If you use servlet as the server, you are using the external server as the REST server which is out of dubboes' control, so the setting would not work expectedly.</p>\n</blockquote>\n<p>You can also set threads number of IO worker of netty server:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">\"5\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span>/&gt;</span>\n</code></pre>\n<h3>Configure long connections</h3>\n<p>The REST service in Dubbo is accessed by default with http long connection, if you want to switch to short connection, you can configure it as below:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">keepalive</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n</code></pre>\n<blockquote>\n<p>Notice: This configuration only works in netty and tomcat.</p>\n</blockquote>\n<h3>Configure the maximum number of HTTP connections</h3>\n<p>Configuring the maximum number of HTTP connections can prevent REST server from\noverload as the basic self-protection mechanism.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"500\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"tomcat/&gt;\n</span></span></code></pre>\n<blockquote>\n<p>Notice: Currently, it only works in tomcat.</p>\n</blockquote>\n<h3>Configuring the timeout and HTTP connections for each consumer</h3>\n<p>If the consumer of the rest service is also a dubbo system, you can configure the maximum timeout for the consumer to call the rest service, and the maximum number of HTTP connections that each consumer can initiate, just like other dubbo RPC mechanisms.</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"2000\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span>/&gt;</span>\n</code></pre>\n<p>Of course, since this configuration is valid for the consumer, it can also be configured on the consumer side:</p>\n<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\">\"xxx\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"2000\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span>/&gt;</span>\n</code></pre>\n<p>However, we generally recommend configuring the service provider to provide such a configuration. According to the official dubbo documentation, “Provider should configure the properties of the Consumer side as much as possible.\nLet the Provider implementer think about the service features and service quality of the Provider from the beginning.”</p>\n<blockquote>\n<p>Note: If dubbo REST service is released to non-dubbo clients, the configuration on <code>&lt;dubbo:service/&gt;</code> is completely invalid because the client is not under dubbo control.</p>\n</blockquote>\n<h3>GZIP data compresssion</h3>\n<p>Dubbo RESTful Remoting supports the use of Gzip to compress request and response data to reduce network transmission time and bandwidth consumption, but this will also increase CPU overhead.</p>\n<p>TODO more contents to add.</p>\n<h3>Replacing part of the spring XML configuration with annotation</h3>\n<p>Above discussions are based on the XML configuration of Dubbo in spring.\nHowever, dubbo/spring itself supports the use of annotation for configuration, so we can also follow the steps in the Dubbo document and add the relevant annotation to the REST service implementation, replacing some XML configurations, such as:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>(protocol = <span class=\"hljs-string\">\"rest\"</span>)\n<span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<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>{\n\n    <span class=\"hljs-meta\">@Autowired</span>\n    <span class=\"hljs-keyword\">private</span> UserRepository userRepository;\n       \n    <span class=\"hljs-meta\">@POST</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"register\"</span>)\n    <span class=\"hljs-meta\">@Consumes</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerUser</span><span class=\"hljs-params\">(User user)</span> </span>{\n        <span class=\"hljs-comment\">// save the user</span>\n        userRepository.save(user);\n    }\t\n}\n</code></pre>\n<p>Annotation-based configuration is more concise and precise, and often easier to maintain (modern IDE can support such things as class name refactoring in XML, and therefore the maintenance of XML is good for specific use cases here). XML is less intrusive to code, especially for dynamically modifying configurations, especially when you want to modify the timeout for connection of a single service configuration, the maximum number of connections per client, cluster policy, weights, and so on. In addition, for complex applications or modules, XML provides a central point to cover all the components and configurations. It is at a glance, and generally more convenient for long term maintenance of the project.</p>\n<p>Of course, there's no right or wrong of different choices of configuration method. Sometimes it's just personal preference.</p>\n<h3>Adding a custom Filter, Interceptor, etc</h3>\n<p>Dubbo RESTful Remoting also supports JAX-RS standard Filter and Interceptor to facilitate customized interception of REST request and response processes.</p>\n<p>Here, Filter is mainly used to access and set parameters, URIs for HTTP request and response, and so on, for example, setting the cache header for HTTP response:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CacheControlFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ContainerResponseFilter</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">filter</span><span class=\"hljs-params\">(ContainerRequestContext req, ContainerResponseContext res)</span> </span>{\n        <span class=\"hljs-keyword\">if</span> (req.getMethod().equals(<span class=\"hljs-string\">\"GET\"</span>)) {\n            res.getHeaders().add(<span class=\"hljs-string\">\"Cache-Control\"</span>, <span class=\"hljs-string\">\"someValue\"</span>);\n        }\n    }\n}\n</code></pre>\n<p>Interceptor is mainly used to access and modify the input and output byte streams, for example, manually adding GZIP compression:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GZIPWriterInterceptor</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">WriterInterceptor</span> </span>{\n \n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">aroundWriteTo</span><span class=\"hljs-params\">(WriterInterceptorContext context)</span>\n                    <span class=\"hljs-keyword\">throws</span> IOException, WebApplicationException </span>{\n        OutputStream outputStream = context.getOutputStream();\n        context.setOutputStream(<span class=\"hljs-keyword\">new</span> GZIPOutputStream(outputStream));\n        context.proceed();\n    }\n}\n</code></pre>\n<p>In standard JAX-RS applications, we generally add @Provider annotations to Filter and Interceptor, and JAX-RS runtime will automatically discover and enable them. In Dubbo, we register Filter and Interceptor by adding an XML configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"xxx.TraceInterceptor, xxx.TraceFilter\"</span>/&gt;</span>\n</code></pre>\n<p>Here, we can add these three types of objects, Filter, Interceptor and DynamicFuture, to the <code>extension</code> attributes, separated by commas. (DynamicFuture is another interface that allows us to enable Filter and Interceptor more dynamically. Please feel free to google.)</p>\n<p>Of course, Dubbo itself also supports Filter, but the Filter and Interceptor we discuss here are more like the bottom of the protocol implementation. Compared to Dubbo's filter, you can do a lower level of customization here.</p>\n<blockquote>\n<p>Note: The XML attribute here is called extension, not interceptor or filter. That is because we will add more extension types in addition to Interceptor and Filter in the future.</p>\n</blockquote>\n<p>If the REST consumer is also a Dubbo system (see discussion below), you can also configure the Interceptor and Filter for the consumer in a similar way.</p>\n<p>However, it should be noted that the consumer-side Filter and the provider-side Filter in JAX-RS are two different interfaces. For example, in the previous example, the server is the ContainerResponseFilter interface, and the consumer side corresponds to the ClientResponseFilter:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">LoggingFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ClientResponseFilter</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">filter</span><span class=\"hljs-params\">(ClientRequestContext reqCtx, ClientResponseContext resCtx)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        System.out.println(<span class=\"hljs-string\">\"status: \"</span> + resCtx.getStatus());\n\t    System.out.println(<span class=\"hljs-string\">\"date: \"</span> + resCtx.getDate());\n\t    System.out.println(<span class=\"hljs-string\">\"last-modified: \"</span> + resCtx.getLastModified());\n\t    System.out.println(<span class=\"hljs-string\">\"location: \"</span> + resCtx.getLocation());\n\t    System.out.println(<span class=\"hljs-string\">\"headers:\"</span>);\n\t    <span class=\"hljs-keyword\">for</span> (Entry&lt;String, List&lt;String&gt;&gt; header : resCtx.getHeaders().entrySet()) {\n     \t    System.out.print(<span class=\"hljs-string\">\"\\t\"</span> + header.getKey() + <span class=\"hljs-string\">\" :\"</span>);\n\t        <span class=\"hljs-keyword\">for</span> (String value : header.getValue()) {\n\t            System.out.print(value + <span class=\"hljs-string\">\", \"</span>);\n\t        }\n\t        System.out.print(<span class=\"hljs-string\">\"\\n\"</span>);\n\t    }\n\t    System.out.println(<span class=\"hljs-string\">\"media-type: \"</span> + resCtx.getMediaType().getType());\n    } \n}\n</code></pre>\n<h3>Adding custom Exception handler</h3>\n<p>Dubbo RESTful Remoting also supports JAX-RS standard ExceptionMapper, which can be used to customize the HTTP response after a particular exception occurs.</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CustomExceptionMapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExceptionMapper</span>&lt;<span class=\"hljs-title\">NotFoundException</span>&gt; </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Response <span class=\"hljs-title\">toResponse</span><span class=\"hljs-params\">(NotFoundException e)</span> </span>{     \n        <span class=\"hljs-keyword\">return</span> Response.status(Response.Status.NOT_FOUND).entity(<span class=\"hljs-string\">\"Oops! the requested resource is not found!\"</span>).type(<span class=\"hljs-string\">\"text/plain\"</span>).build();\n    }\n}\n</code></pre>\n<p>Similar to Interceptor and Filter, it can be enabled by adding it to an XML configuration file:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"xxx.CustomExceptiionMapper\"</span>/&gt;</span>\n</code></pre>\n<h3>Configuring HTTP log output</h3>\n<p>Dubbo RESTful Remoting supports outputting the header and body in all HTTP requests/responses.</p>\n<p>Add the following REST filter to the XML configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.protocol.rest.support.LoggingFilter\"</span>/&gt;</span>\n</code></pre>\n<p><strong>Then turn on at least INFO level log output for com.alibaba.dubbo.rpc.protocol.rest.support in the logging configuration</strong>,for example,in log4j.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.protocol.rest.support\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">level</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"INFO\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"CONSOLE\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">logger</span>&gt;</span>\n</code></pre>\n<p>Of course, you can also turn on INFO level log output directly in the ROOT logger:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">root</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">level</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"INFO\"</span> /&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"CONSOLE\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">root</span>&gt;</span>\n</code></pre>\n<p>Then there will be something like the following output in the log:</p>\n<pre><code>The HTTP headers are: \naccept: application/json;charset=UTF-8\naccept-encoding: gzip, deflate\nconnection: Keep-Alive\ncontent-length: 22\ncontent-type: application/json\nhost: 192.168.1.100:8888\nuser-agent: Apache-HttpClient/4.2.1 (java 1.5)\n</code></pre>\n<pre><code>The contents of request body is: \n{&quot;id&quot;:1,&quot;name&quot;:&quot;dang&quot;}\n</code></pre>\n<p>After the HTTP log output is turned on, in addition to the performance overhead of the normal log output, additional overhead is generated in, for example, HTTP request parsing, because an additional memory buffer needs to be allocated to prepare the data for the log output.</p>\n<h3>Inputing parameter validation</h3>\n<p>Dubbo RESTful Remoting supports the use of the Java standard bean validation annotation(JSR 303) for input validation <a href=\"http://beanvalidation.org/\">http://beanvalidation.org/</a>.</p>\n<p>In order to be consistent with other Dubbo remote invocation protocols, the annotations that are checked for rest must be placed on the interface of the service, for example:</p>\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\">UserService</span> </span>{\n   \n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@Min(value=<span class=\"hljs-number\">1</span>L, message=<span class=\"hljs-string\">\"User ID must be greater than 1\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<p>Of course, in many other bean validation scenarios, annotations are placed on implementation classes rather than interfaces. At least one advantage of placing an annotation on an interface is that the Dubbo client can share information about the interface. The input validation can be done locally even without RPC.</p>\n<p>Then turn on the validation in the XML configuration in the same way as Dubbo:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">xxx.UserService</span>\" <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"userService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n</code></pre>\n<p>In many other RPC protocols of Dubbo, if the input validation error occurs, the <code>RpcException</code> is directly thrown to the client, but in the rest, since the client is often non-Dubbo or even non-Java system, it is inconvenient to directly throw a Java exception.  Therefore, at present we will return the validation error in XML format:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">violationReport</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">constraintViolations</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">path</span>&gt;</span>getUserArgument0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">path</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">message</span>&gt;</span>User ID must be greater than 1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">message</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">value</span>&gt;</span>0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">value</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">constraintViolations</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">violationReport</span>&gt;</span>\n</code></pre>\n<p>The return values of other data formats will also be supported later. As for how to internationalize the verification error message, refer directly to the relevant documentation of the bean validation.</p>\n<p>If you think that the default validation error return format does not meet your requirements, you can add custom ExceptionMapper to custom error return format freely as described in the previous section. It should be noted that this ExceptionMapper must use the generic declaration to capture the RpcException of Dubbo in order to successfully override the default exception handling strategy of Dubbo rest. In order to simplify the operation, the easiest way to do this is to directly inherit the RpcExceptionMapper of Dubbo rest and override the method that handles the validation exception:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MyValidationExceptionMapper</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">RpcExceptionMapper</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> Response <span class=\"hljs-title\">handleConstraintViolationException</span><span class=\"hljs-params\">(ConstraintViolationException cve)</span> </span>{\n        ViolationReport report = <span class=\"hljs-keyword\">new</span> ViolationReport();\n        <span class=\"hljs-keyword\">for</span> (ConstraintViolation cv : cve.getConstraintViolations()) {\n            report.addConstraintViolation(<span class=\"hljs-keyword\">new</span> RestConstraintViolation(\n                    cv.getPropertyPath().toString(),\n                    cv.getMessage(),\n                    cv.getInvalidValue() == <span class=\"hljs-keyword\">null</span> ? <span class=\"hljs-string\">\"null\"</span> : cv.getInvalidValue().toString()));\n        }\n        <span class=\"hljs-comment\">// Use json output instead of xml output</span>\n        <span class=\"hljs-keyword\">return</span> Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(report).type(ContentType.APPLICATION_JSON_UTF_8).build();\n    }\n}\n</code></pre>\n<p>Then add this ExceptionMapper to the XML configuration:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rest\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8888\"</span> <span class=\"hljs-attr\">extension</span>=<span class=\"hljs-string\">\"xxx.MyValidationExceptionMapper\"</span>/&gt;</span>\n</code></pre>\n<h3>Whether to transparently publish REST service</h3>\n<p>Dubbo RESTful Remoting differs from some other RPCs in Dubbo in that you need to add JAX-RS annotations (and JAXB, Jackson's annotation) to your service code. If you think these annotations &quot;pollute&quot; your service code to a certain extent,you can consider writing additional Facade and DTO classes, adding annotations to that, and Facade forwards the calls to the real service implementation class. Of course, adding annotations directly to the service code basically has no negative effects, and this is itself a standard usage in Java EE. In addition, JAX-RS and JAXB annotations belong to the Java standard. Compared with spring, Dubbo, etc., which we often use, annotations have no problem with vendor lock-in, so there is usually no need to introduce additional objects.</p>\n<p>In addition,when you want to use the @Context annotation mentioned above, injecting HttpServletRequest through method parameters (such as <code>public User getUser(@PathParam(&quot;id&quot;) Long id, @Context HttpServletRequest request)</code>), the method signature of service is changed and HttpServletRequest is a REST-specific parameter, you should introduce additional Facade classes if your service supports multiple RPC mechanisms.</p>\n<p>Of course, your service code may already act as a Facade and DTO before adding RESTful Remoting (as to why some scenarios require these roles, and if you are interested, you can refer to [Micro-SOA: Service Design Principles and Practices] <a href=\"Http://www.infoq.com/cn/articles/micro-soa-1\">Http://www.infoq.com/cn/articles/micro-soa-1</a>). In this case, after adding REST, if you add additional REST-related Facade and DTO, it is equivalent to wrapping the original code again, which forms the following call chain:</p>\n<p><code>RestFacade/RestDTO -&gt; Facade/DTO -&gt; Service</code></p>\n<p>This kind of system is cumbersome, and the workload of data conversion is not small, so it should be avoided if possible.</p>\n<h3>Consumer of RESTful Remoting</h3>\n<p>Here we use three scenarios:</p>\n<ol>\n<li>The non-Dubbo consumer calls Dubbo REST service (non-Dubbo --&gt; Dubbo)</li>\n<li>The Dubbo consumer calls Dubbo REST service (Dubbo --&gt; Dubbo)</li>\n<li>The consumer of Dubbo calls the non-Dubbo REST service (Dubbo --&gt; non-Dubbo)</li>\n</ol>\n<h3>Scenario 1: Non-Dubbo consumer calls Dubbo REST Service</h3>\n<p>The client of this scenario has nothing to do with Dubbo itself, and it can be directly selected in the appropriate language and framework.</p>\n<p>If it is still a Java client (but not using Dubbo), consider using the standard JAX-RS Client API or a specific REST-implemented Client API to invoke the REST service. The following is the registerUser() that uses the JAX-RS Client API to access the above UserService:</p>\n<pre><code class=\"language-java\">User user = <span class=\"hljs-keyword\">new</span> User();\nuser.setName(<span class=\"hljs-string\">\"Larry\"</span>);\n\nClient client = ClientBuilder.newClient();\nWebTarget target = client.target(<span class=\"hljs-string\">\"http://localhost:8080/services/users/register.json\"</span>);\nResponse response = target.request().post(Entity.entity(user, MediaType.APPLICATION_JSON_TYPE));\n\n<span class=\"hljs-keyword\">try</span> {\n    <span class=\"hljs-keyword\">if</span> (response.getStatus() != <span class=\"hljs-number\">200</span>) {\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"Failed with HTTP error code : \"</span> + response.getStatus());\n    }\n    System.out.println(<span class=\"hljs-string\">\"The generated id is \"</span> + response.readEntity(RegistrationResult.class).getId());\n} <span class=\"hljs-keyword\">finally</span> {\n    response.close();\n    client.close(); <span class=\"hljs-comment\">//Do not close the client every time in real development, such as HTTP long connection is held by the client</span>\n}\n</code></pre>\n<p>The User and RegistrationResult classes in the code snippet above are written by the consumer itself, and the JAX-RS Client API automatically serializes/deserializes them.</p>\n<p>Of course, in Java, you can also use the familiar technologies such as HttpClient, FastJson, XStream, etc. to implement the REST client, which will not be detailed here.</p>\n<h3>Scenario 2: Dubbo consumer calls Dubbo RESTful Remoting</h3>\n<p>In this scenario,  same as  other Dubbo remote calling methods, the Java service interface is shared directly between the service provider and the service consumer, and the Spring XML configuration is added (of course, the Spring/Dubbo annotation configuration can also be used),the remote REST service can be called transparently:</p>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span>/&gt;</span>\n</code></pre>\n<p>As mentioned earlier, in this scenario, JAX-RS annotations must be added to the service interface, so that the corresponding REST configuration information can be shared on the consumer side of Dubbo and remotely called accordingly:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">UserService</span> </span>{\n    \n    <span class=\"hljs-meta\">@GET</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n    <span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})\n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<p>If a variety of data formats are configured in the annotation of the service interface, since both ends are Dubbo systems, a lot of details of REST are blocked, so there is no possibility to select a data format using the aforementioned URL suffix. Currently in this case, the top ranked data format will be used directly.</p>\n<p>Therefore, we recommend that you put the most appropriate data format in front of defining an annotation. For example, we put JSON in front of XML because JSON's transmission performance is better than XML.</p>\n<h3>Scenario 3: The consumer of Dubbo calls a non-Dubbo RESTful Remoting</h3>\n<p>In this scenario, the REST service can be called directly using the Java method described in Scenario 1. But in fact, you can also use the way described in Scenario 2, that is, calling the REST service more transparently, even if this service is not provided by Dubbo.</p>\n<p>If the scenario 2 is used, since the REST service is not provided by Dubbo, there is generally no shared Java service interface mentioned above, so we need to write the Java interface and the corresponding parameter class according to the external REST service. Add JAX-RS, JAXB, Jackson and other annotations, Dubbo's REST underlying implementation will automatically generate request messages, automatically parse response messages, etc., so as  to transparently make remote calls. Or this way can also be understood as, we try to use JAX-RS to copy the implementation of the external REST service provider, and then put the written service interface to the client to use directly, Dubbo REST underlying implementation can call other REST services as it calls Dubbo's REST service .</p>\n<p>For example, we want to call the following external service.</p>\n<pre><code>http://api.foo.com/services/users/1001\nhttp://api.foo.com/services/users/1002\n</code></pre>\n<p>Get user data of different IDs, the return format is JSON</p>\n<pre><code class=\"language-java\">{\n    <span class=\"hljs-string\">\"id\"</span>: <span class=\"hljs-number\">1001</span>,\n    <span class=\"hljs-string\">\"name\"</span>: <span class=\"hljs-string\">\"Larry\"</span>\n}\n</code></pre>\n<p>We can write service interfaces and parameter classes based on this information:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"users\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">UserService</span> </span>{\n    \n    <span class=\"hljs-meta\">@GET</span>\n    <span class=\"hljs-meta\">@Path</span>(<span class=\"hljs-string\">\"{id : \\\\d+}\"</span>)\n    <span class=\"hljs-meta\">@Produces</span>({MediaType.APPLICATION_JSON})\n    <span class=\"hljs-function\">User <span class=\"hljs-title\">getUser</span><span class=\"hljs-params\">(@PathParam(<span class=\"hljs-string\">\"id\"</span>)</span> Long id)</span>;\n}\n</code></pre>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">User</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> Long id;\n\n    <span class=\"hljs-keyword\">private</span> String name;\n\n    <span class=\"hljs-comment\">// …</span>\n}\n</code></pre>\n<p>For the configuration in Spring, because the REST service is not provided by Dubbo, you can not use the Dubbo registry to directly configure the url address of the external REST service (such as multiple addresses separated by commas):</p>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"rest://api.foo.com/services/\"</span>/&gt;</span>\n</code></pre>\n<blockquote>\n<p>Note: The protocol here must use rest:// instead of http://. If the external REST service has a context path, it must also be added to the url (unless you have a context path in the @Path annotation for each service interface), such as /services/ above. At the same time, the services here must be followed by /, in order to make Dubbo work properly.</p>\n<p>In addition, you can still configure the maximum number of connections and timeouts that the client can start:</p>\n</blockquote>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"xxx.UserService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"rest://api.foo.com/services/\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"2000\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span>/&gt;</span>\n</code></pre>\n<h3>JAX-RS restrictions in Dubbo</h3>\n<p>The REST development in Dubbo is fully compatible with standard JAX-RS, but the features it supports are currently a subset of full JAX-RS, in part because it is limited to the specific architecture of Dubbo and Spring. The limitations of JAX-RS used in Dubbo include but are not limited to:</p>\n<ol>\n<li>Service implementation can only be singleton, and it can not support per-request scope and per-lookup scope</li>\n<li>It is not supported to inject into ServletConfig, ServletContext, HttpServletRequest, HttpServletResponse, etc. with the @Context annotation for the instance field of the service, but it can support the injection of service method parameters. However, for certain REST server implementations (see the previous section), injection of service method parameters is not supported.</li>\n</ol>\n<h2>REST FAQ</h2>\n<hr>\n<h3>Can Dubbo REST services be integrated with Dubbo Registry and Monitor?</h3>\n<p>Yes, and it will integrate automatically. That is, all the REST services you develop in Dubbo are automatically registered to the Registry and Monitor, by which you can managed your services.\nHowever, many of the service governance operations in the Registry can only be fully functional when the REST consumer is based on Dubbo. If the consumer side is non-Dubbo, it is naturally not managed by the Registry, so that many of the operations will not work for the consumer.</p>\n<h3>How to implement load balancing and failover in Dubbo REST?</h3>\n<p>If the consumer side of Dubbo REST is based on Dubbo, then Dubbo REST is basically the same as other Dubbo remote call protocols: Dubbo framework transparently performs load balancing, failover, etc. on the consumer side.\nIf the consumer side of Dubbo REST is non-Dubbo or even non-Java, it is better to configure the soft load balancing mechanism on the service provider. Currently, you can consider LVS, HAProxy, Nginx, and so on to achieve load balancing for HTTP requests.</p>\n<h3>Can overloaded method in JAX-RS maps to the same URL address?</h3>\n<p><a href=\"http://stackoverflow.com/questions/17196766/can-resteasy-choose-method-based-on-query-params\">http://stackoverflow.com/questions/17196766/can-resteasy-choose-method-based-on-query-params</a></p>\n<h3>Can a POST method in JAX-RS receive multiple parameters?</h3>\n<p><a href=\"http://stackoverflow.com/questions/5553218/jax-rs-post-multiple-objects\">http://stackoverflow.com/questions/5553218/jax-rs-post-multiple-objects</a></p>\n<h2>The shortcomings of Dubbo's current system (related to REST)</h2>\n<hr>\n<p>I think there are obviously a lot of deficiencies in Dubbo's current system. Here are a few REST-related issues that affect users (not including internal implementation issues) for reference and comments, which can help prepare for the refactoring later.</p>\n<h3>Invasiveness of RpcContext</h3>\n<p>We have already mentioned the intrusiveness of RpcContext(See above). Because it uses a singleton to access context information, which is completely inconsistent with the general style of spring applications as well as not conducive to application extension and unit testing. In the future, we may inject an interface with dependency injection, and then use it to access the context information in ThreadLocal.</p>\n<h3>limitations of Protocol configuration</h3>\n<p>Dubbo supports multiple remote call methods, but all call methods are configured with <a href=\"Dubbo:protocol/\">Dubbo:protocol/</a>,  for example:</p>\n<pre><code class=\"language-xml\"><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\">\"9090\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">\"Dubbo\"</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"hessian2\"</span>\n    <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">\"UTF-8\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">\"0\"</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">\"8192\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">\"8388608\"</span>/&gt;</span>\n</code></pre>\n<p>Dubbo supports multiple remote call methods, but all call methods are configured with <a href=\"Dubbo:protocol/\">Dubbo:protocol/</a>,  for example:\nIn fact, many of the above properties are uniquely held by the Dubbo RPC remote call method and many other remote call methods in Dubbo do not support server, client, codec, iothreads, accepts, payload, etc. (of course, some are not supported because of limited conditions, some have no need to be supported at all). This adds a lot of confusions to users when they use Dubbo, and they actually do not know that some attributes (such as performance tuning) will not work after adding them.</p>\n<p>On the other hand, various remote call methods often have a large number of unique configuration requirements, especially as we gradually add much richer and more advanced functions to each kind of remote call method, which cause the expands in <protocol/> attributes inevitably (for example, we have added keepalive and extension two attributes in REST at the moment) and then lead to bloated <protocol/> and user confusion.</p>\n<p>Of course, there is a way to expand <protocol/> in Dubbo by using <a href=\"Dubbo:parameter/\">Dubbo:parameter/</a>, but this method is obviously very limited, the usage is complicated and the schema verification is lacking.\nSo that the best method is to set your own protocol elements for each remote call, such as <protocol-Dubbo/>, <protocol-rest/>, etc. Each element specifies its own attributes using XML Schema. (Of course, it is best to use common attributes between a variety of remote call methods)\nIn this way, a freer way can be used when doing the extension configuration mentioned above, so that it can be much clearer and more extensible (the following is just an example, of course there may be a better way):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:protocol-rest</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someInterceptor<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someFilter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someDynamicFeature<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>someEntityProvider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:extension</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">Dubbo:protocol-rest</span>&gt;</span>\n</code></pre>\n<h3>XML naming does not conform to the spring specification</h3>\n<p>A lot of naming in XML configuration of Dubbo dose not conform to the spring specification, such as:</p>\n<pre><code class=\"language-xml\"><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\">\"9090\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span>\n\n<span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">\"Dubbo\"</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"hessian2\"</span>\n    <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">\"UTF-8\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">\"0\"</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">\"8192\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">\"8388608\"</span>/&gt;</span>\n</code></pre>\n<p>The above threadpool should be changed to thread-pool, iothreads should be changed to io-threads, and words should be separated by &quot;-&quot;. While this may seem like a minor issue, it also involves readability, especially scalability, because sometimes we will inevitably use more words to describe XML elements and attributes.</p>\n<p>In fact, Dubbo itself also recommended to follow the naming convention of spring to XML.</p>\n<h2>Best practices of REST</h2>\n<hr>\n<p>TODO</p>\n<h2>Performance benchmark</h2>\n<hr>\n<h3>Test Environment</h3>\n<p>Roughly as follows:</p>\n<ul>\n<li>4-core Intel(R) Xeon(R) CPU E5-2603 0 @ 1.80GHz</li>\n<li>8G memory</li>\n<li>The network between servers passes through a 100 Mbps switch</li>\n<li>CentOS 5</li>\n<li>JDK 7</li>\n<li>Tomcat 7</li>\n<li>JVM parameter -server -Xms1g -Xmx1g -XX:PermSize=64M -XX:+UseConcMarkSweepGC</li>\n</ul>\n<h3>Test Script</h3>\n<p>Similar to Dubbo's own benchmarks:\n10 concurrent clients send requests continuously:\n• Pass in nested complex objects (single data is small), do nothing and return\n• Pass in a 50K string, do nothing and return (TODO: the result is not listed yet)\nExcute a five-minute performance test. (Reference to Dubbo's own test considerations: &quot;Mainly consider the serialization and performance of network IO, so that the server side does not have any business logic. Take 10 to run simultaneously because of the consideration that the bottleneck can be hit first when the high CPU usage rate is reached by HTTP protocol under the high concurrency situation.&quot;)</p>\n<h3>Test Result</h3>\n<p>The following results are mainly from the comparison between to the two remote call methods, REST and Dubbo RPC which are configured differently, for example:</p>\n<ul>\n<li>“REST: Jetty + XML + GZIP” means: Test REST, use jetty server and XML data format, and enable GZIP compression.</li>\n<li>“Dubbo: hessian2” means: test Dubbo RPC and use hessian2 serialization.</li>\n</ul>\n<p>The results for complex objects are as follows (the smaller Response Time and the larger TPS, the better results):</p>\n<table>\n<thead>\n<tr>\n<th>Remote Call Mode</th>\n<th>Average Response Time</th>\n<th>Average TPS(Num of transactions per second)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>REST: Jetty + JSON</td>\n<td>7.806</td>\n<td>1280</td>\n</tr>\n<tr>\n<td>REST: Jetty + JSON + GZIP</td>\n<td>TODO</td>\n<td>TODO</td>\n</tr>\n<tr>\n<td>REST: Jetty + XML</td>\n<td>TODO</td>\n<td>TODO</td>\n</tr>\n<tr>\n<td>REST: Jetty + XML + GZIP</td>\n<td>TODO</td>\n<td>TODO</td>\n</tr>\n<tr>\n<td>REST: Tomcat + JSON</td>\n<td>2.082</td>\n<td>4796</td>\n</tr>\n<tr>\n<td>REST: Netty + JSON</td>\n<td>2.182</td>\n<td>4576</td>\n</tr>\n<tr>\n<td>Dubbo: FST</td>\n<td>1.211</td>\n<td>8244</td>\n</tr>\n<tr>\n<td>Dubbo: kyro</td>\n<td>1.182</td>\n<td>8444</td>\n</tr>\n<tr>\n<td>Dubbo: Dubbo serialization</td>\n<td>1.43</td>\n<td>6982</td>\n</tr>\n<tr>\n<td>Dubbo: hessian2</td>\n<td>1.49</td>\n<td>6701</td>\n</tr>\n<tr>\n<td>Dubbo: fastjson</td>\n<td>1.572</td>\n<td>6352</td>\n</tr>\n</tbody>\n</table>\n<p>Just a brief summary of the current results:</p>\n<ul>\n<li>Dubbo RPC (especially when based on efficient java serialization methods such as kryo and fst) has a significant advantage response time and throughput over REST. Dubbo RPC is preferred in the intranet Dubbo systems.</li>\n<li>When choosinf REST implementation, tomcat7 and netty are optimal (of course, the current versions of jetty and netty are lower) currently only considering performance. Tjws and sun http server performed extremely poorly in performance tests, with an average response time of more than 200ms and an average tps of only about 50 (to avoid affecting the picture effect, the results are not listed above).</li>\n<li>Performance of JSON data format is better than XML in REST (data is not listed above).</li>\n<li>Enabling GZIP in REST has little to do with complex objects with small data volume in the intranet, but performance has declined (data is not listed above).</li>\n</ul>\n<h2>Performance Optimization Recommendations</h2>\n<p>If you deploy Dubbo REST to an external Tomcat and configure server=&quot;servlet&quot;, that is, enable external tomcat as the underlying implementation of rest server, it is best to add the following configuration to tomcat:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Connector</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span>\n\n<span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"org.apache.coyote.http11.Http11NioProtocol\"</span>\n               <span class=\"hljs-attr\">connectionTimeout</span>=<span class=\"hljs-string\">\"20000\"</span>\n               <span class=\"hljs-attr\">redirectPort</span>=<span class=\"hljs-string\">\"8443\"</span>\n               <span class=\"hljs-attr\">minSpareThreads</span>=<span class=\"hljs-string\">\"20\"</span>\n               <span class=\"hljs-attr\">enableLookups</span>=<span class=\"hljs-string\">\"false\"</span>\n               <span class=\"hljs-attr\">maxThreads</span>=<span class=\"hljs-string\">\"100\"</span>\n               <span class=\"hljs-attr\">maxKeepAliveRequests</span>=<span class=\"hljs-string\">\"-1\"</span>\n               <span class=\"hljs-attr\">keepAliveTimeout</span>=<span class=\"hljs-string\">\"60000\"</span>/&gt;</span>\n</code></pre>\n<p>Especially the configuration maxKeepAliveRequests=&quot;-1&quot; ,which is mainly to ensure that tomcat always enables http long connection, in order to improve the performance of REST call. Note, however, that if the REST consumer side is not continuously call REST services, it is not always best to enable long connections all time. In addition, the way to always enable long connections is generally not suitable for ordinary webapps, but more suitable for such rpc-like scenarios. So that in order to get high performance, Dubbo REST applications and ordinary web applications are best not to be mixed deployment, but should use a separate instance in tomcat.</p>\n<h2>##Extended discussion</h2>\n<h3>Comparison among Rest, Thrift, Protobuf and so on</h3>\n<p>TODO</p>\n<h3>Comparison between REST and traditional Webservers</h3>\n<p>TODO</p>\n<h3>Comparison of JAX-RS Between Spring MVC</h3>\n<p>A preliminary view from <a href=\"http://www.infoq.com/cn/news/2014/10/Dubbox-open-source?utm_source=infoq&amp;utm_medium=popular_links_homepage#theCommentsSection\">http://www.infoq.com/cn/news/2014/10/Dubbox-open-source?utm_source=infoq&amp;utm_medium=popular_links_homepage#theCommentsSection</a></p>\n<blockquote>\n<p>Thank you, in fact, for jax-rs and Spring MVC, I do not have a deep look at the rest support of Spring MVC. I would like to give you some preliminary ideas. Please correct me:</p>\n</blockquote>\n<blockquote>\n<p>Spring MVC also supports configuration using annotation, which actually looks very similar to jax-rs.</p>\n</blockquote>\n<blockquote>\n<p>Personally, I think Spring MVC is better suited to restful services of web applications, such as being invoked by AJAX, or possibly outputting HTML or something like page jump processes in applications. Spring MVC can handle both normal web page requests and rest requests at the same time. But in general, the restful service is implemented in the presentation layer or the web layer.</p>\n</blockquote>\n<blockquote>\n<p>But Jax-rs is more suitable for pure service-oriented applications, that is, the middle-tier services in traditional Java EE, for example, it can publish traditional EJB as restful services. In a Spring application, the bean that acts as a service in the Spring is directly published as a restful service. In general, the restful service is at the business layer, application layer, or facade layer. And MVC hierarchies and concepts are often of little value in such (back-end) applications.</p>\n</blockquote>\n<blockquote>\n<p>Of course, some implementations of jax-rs, such as jersey, also try to include MVC to better accommodate the web applications described above, but not as well as Spring MVC.</p>\n</blockquote>\n<blockquote>\n<p>In Dubbo applications, I think a lot of people prefer to publish a local Spring service bean (or manager) as a remote service directly and transparently, so that it is more straightforward to use JAX-RS here, and there is no need to introduce the MVC concept. Of course, we do not discuss whether transparent publishing of remote services is a best practice or whether to add facade things here first.</p>\n</blockquote>\n<blockquote>\n<p>Of course, I know that many people use Spring MVC restful to call Dubbo (spring) service to publish restful services under the situation that Dubbo does not support rest now. It’s a good method also in my opinion, but if you do not modify Spring MVC and integrate it deeply with Dubbo, restful services cannot enjoy many advanced services such as registering to the Dubbo Registry, monitoring the number of calls, TPS, response time through the Dubbo Monitor, controlling the size of the thread pool and the maximum number of connections through the unified configuration of Dubbo, and controlling the service flow, authority and frequency through Dubbo unified mode like other remote call protocol such as webservices, Dubbo rpc, hessian and so on in Dubbo system. In addition, Spring MVC only works in server side and Spring restTemplate are usually used on consumer side. If restTemplate is not integrated with Dubbo, the service can be downgraded by Dubbo client automatically or manually. If the server and consumer are all Dubbo system, you cannot use unified routing and other functions in Dubbo if the Spring rest is not deeply integrated into Dubbo through interaction of Spring and rest.</p>\n</blockquote>\n<blockquote>\n<p>Of course, I personally think that these things are not necessarily to be one or the other. I heard that Rod Johnson, the founder of spring usually says ‘the customer is always right,’ In fact, it is better to support both ways at the same time rather than discuss which way is better, so that originally I wrote in the document that we plan to support Spring rest annotation, but the feasibility is unknown.</p>\n</blockquote>\n<h2>##Future</h2>\n<p>Functions may be supported later:</p>\n<ul>\n<li>Rest annotation for Spring MVC</li>\n<li>Safety System</li>\n<li>OAuth</li>\n<li>Asynchronous calls</li>\n<li>Gzip</li>\n<li>Payload maxsize</li>\n</ul>\n",
+  "link": "/en-us/docs/user/rest.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/simple-monitor.json b/en-us/docs/user/simple-monitor.json
index 1a69e3ed..17278702 100644
--- a/en-us/docs/user/simple-monitor.json
+++ b/en-us/docs/user/simple-monitor.json
@@ -1,4 +1,6 @@
 {
   "filename": "simple-monitor.md",
-  "__html": "<blockquote>\n<p><img src=\"sources/images/check.gif\" alt=\"warning\">Monitor service is a standard Dubbo service,can be exported to the registry,also can be connected straightly。</p>\n</blockquote>\n<blockquote>\n<p><img src=\"sources/images/check.gif\" alt=\"warning\">[Install the simple registry](admin-guide-install-manual#Install the simple registry)</p>\n</blockquote>\n<ol start=\"0\">\n<li>\n<p>export a simple monitor service to the registry: (If you use the installer, you don't need to write this configuration yourself. if you implement the monitor service yourself,need it)</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n<span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n<span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of current application --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"simple-monitor\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- connection address of the registry --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"127.0.0.1:9090\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- protool configuration of exposed services --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"7070\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of certain exposed service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.MonitorService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"monitorService\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"monitorService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.simple.SimpleMonitorService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>Discovery the monitor service int the registry:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"registry\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<blockquote>\n<p>dubbo.properties</p>\n</blockquote>\n<pre><code class=\"language-xml\">dubbo.monitor.protocol=registry\n</code></pre>\n</li>\n<li>\n<p>Export a simple monitor service ,but don't register it to th registry: (If you use the installer, you don't need to write this configuration yourself. if you implement the monitor service yourself,need it)</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n<span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n<span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of current application --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"simple-monitor\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- protool configuration of exposed service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"7070\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of exposed service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.MonitorService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"monitorService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"N/A\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"monitorService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.simple.SimpleMonitorService\"</span> /&gt;</span>   \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>connected to the monitor service straightly</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"dubbo://127.0.0.1:7070/com.alibaba.dubbo.monitor.MonitorService\"</span> /&gt;</span>\n</code></pre>\n<p>or:</p>\n<pre><code class=\"language-sh\">&lt;dubbo:monitor address=<span class=\"hljs-string\">\"127.0.0.1:7070\"</span> /&gt;\n</code></pre>\n<p>or:</p>\n<p><strong>dubbo.properties</strong></p>\n<pre><code class=\"language-sh\">dubbo.monitor.address=127.0.0.1:7070\n</code></pre>\n</li>\n</ol>\n"
+  "__html": "<blockquote>\n<p><img src=\"sources/images/check.gif\" alt=\"warning\">Monitor service is a standard Dubbo service,can be exported to the registry,also can be connected straightly。</p>\n</blockquote>\n<blockquote>\n<p><img src=\"sources/images/check.gif\" alt=\"warning\">[Install the simple registry](admin-guide-install-manual#Install the simple registry)</p>\n</blockquote>\n<ol start=\"0\">\n<li>\n<p>export a simple monitor service to the registry: (If you use the installer, you don't need to write this configuration yourself. if you implement the monitor service yourself,need it)</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n<span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n<span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of current application --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"simple-monitor\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- connection address of the registry --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"127.0.0.1:9090\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- protool configuration of exposed services --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"7070\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of certain exposed service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.MonitorService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"monitorService\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"monitorService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.simple.SimpleMonitorService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>Discovery the monitor service int the registry:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"registry\"</span> /&gt;</span>\n</code></pre>\n<p>or</p>\n<blockquote>\n<p>dubbo.properties</p>\n</blockquote>\n<pre><code class=\"language-xml\">dubbo.monitor.protocol=registry\n</code></pre>\n</li>\n<li>\n<p>Export a simple monitor service ,but don't register it to th registry: (If you use the installer, you don't need to write this configuration yourself. if you implement the monitor service yourself,need it)</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n<span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n<span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of current application --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"simple-monitor\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- protool configuration of exposed service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"7070\"</span> /&gt;</span>\n \n<span class=\"hljs-comment\">&lt;!-- configuration of exposed service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.MonitorService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"monitorService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"N/A\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"monitorService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.monitor.simple.SimpleMonitorService\"</span> /&gt;</span>   \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>connected to the monitor service straightly</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"dubbo://127.0.0.1:7070/com.alibaba.dubbo.monitor.MonitorService\"</span> /&gt;</span>\n</code></pre>\n<p>or:</p>\n<pre><code class=\"language-sh\">&lt;dubbo:monitor address=<span class=\"hljs-string\">\"127.0.0.1:7070\"</span> /&gt;\n</code></pre>\n<p>or:</p>\n<p><strong>dubbo.properties</strong></p>\n<pre><code class=\"language-sh\">dubbo.monitor.address=127.0.0.1:7070\n</code></pre>\n</li>\n</ol>\n",
+  "link": "/en-us/docs/user/simple-monitor.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/site_config/develop.js b/site_config/develop.js
index eb265894..122982e4 100644
--- a/site_config/develop.js
+++ b/site_config/develop.js
@@ -1,36 +1,153 @@
 export default {
-  'en-us': {
-    sidemenu: [
-      {
-        children: [
-          {
-            title: 'How to contribute',
-            link: '/en-us/docs/developers/guide_dev.html', // 开发者文档均以_dev结尾作为文件名,md文件放在docs目录下
-          },
-          {
-              title: 'Developers',
-              link: '/en-us/docs/developers/developers_dev.html',
-          },
+    'en-us': {
+        sidemenu: [
+            {
+                title: 'User Guide',
+                children: [
+                    {
+                        title: 'FAQ',
+                        link: '/en-us/docs/developers/user-guide/faq_dev.html',
+                    }
+                ]
+            },
+            {
+                title: 'Contribute Guide',
+                children: [
+                    {
+                        title: 'New contributor guide',
+                        link: '/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html',
+                    },
+                    {
+                        title: 'Software donation guide',
+                        link: '/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html',
+                    },
+                    {
+                        title: 'Test coverage guide',
+                        link: '/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html',
+                    },
+                    {
+                        title: 'Mailing list subscription guide',
+                        link: '/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html',
+                    }
+                    ,
+                    {
+                        title: 'CLA Signing Guide',
+                        link: '/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html',
+                    }
+                    ,
+                    {
+                        title: 'Extension guide',
+                        link: '/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html',
+                    }
+                ]
+            },
+            {
+                title: 'Committer Guide',
+                children: [
+                    {
+                        title: 'New Committer guide',
+                        link: '/en-us/docs/developers/committer-guide/new-committer-guide_dev.html',
+                    },
+                    {
+                        title: 'Label an Issue',
+                        link: '/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html',
+                    },
+                    {
+                        title: 'Website Guide',
+                        link: '/en-us/docs/developers/committer-guide/website-guide_dev.html',
+                    }
+                ]
+            },
+            {
+                children: [
+                    {
+                        title: 'How to contribute',
+                        link: '/en-us/docs/developers/guide_dev.html', // 开发者文档均以_dev结尾作为文件名,md文件放在docs目录下
+                    },
+                    {
+                        title: 'Developers',
+                        link: '/en-us/docs/developers/developers_dev.html',
+                    },
+                ],
+            }
         ],
-      }
-    ],
-    barText: 'Developers',
-  },
-  'zh-cn': {
-    sidemenu: [
-      {
-        children: [
-          {
-            title: '参与贡献',
-            link: '/zh-cn/docs/developers/guide_dev.html',
-          },
-          {
-              title: '开发人员',
-              link: '/zh-cn/docs/developers/developers_dev.html',
-          }
-        ],
-      }
-    ],
-    barText: '开发者',
-  }
-};
+        barText: 'Developers',
+    },
+    'zh-cn':
+        {
+            sidemenu: [
+                {
+                    title: 'User Guide',
+                    children: [
+                        {
+                            title: 'FAQ',
+                            link: '/zh-cn/docs/developers/user-guide/faq_dev.html',
+                        }
+                    ]
+                },
+                {
+                    title: '贡献者向导',
+                    children: [
+                        {
+                            title: '新贡献者向导',
+                            link: '/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html',
+                        },
+                        {
+                            title: '软件捐献向导',
+                            link: '/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html',
+                        },
+                        {
+                            title: '测试覆盖率向导',
+                            link: '/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html',
+                        },
+                        {
+                            title: '邮件列表订阅向导',
+                            link: '/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html',
+                        }
+                        ,
+                        {
+                            title: 'CLA签署向导',
+                            link: '/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html',
+                        }
+                        ,
+                        {
+                            title: 'Dubbo Extension向导',
+                            link: '/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html',
+                        }
+                    ]
+                },
+                {
+                    title: '提交者向导',
+                    children: [
+                        {
+                            title: 'Apache提交者注册流程',
+                            link: '/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html',
+                        },
+                        {
+                            title: '给问题打标签',
+                            link: '/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html',
+                        },
+                        {
+                            title: '网站向导',
+                            link: '/zh-cn/docs/developers/committer-guide/website-guide_dev.html',
+                        }
+                    ]
+                },
+                {
+                    children: [
+                        {
+                            title: '参与贡献',
+                            link: '/zh-cn/docs/developers/guide_dev.html',
+                        },
+                        {
+                            title: '开发人员',
+                            link: '/zh-cn/docs/developers/developers_dev.html',
+                        }
+                    ],
+                }
+            ],
+            barText:
+                '开发者',
+        }
+}
+;
diff --git a/zh-cn/blog/download.json b/zh-cn/blog/download.json
index a58bc794..c1e97532 100644
--- a/zh-cn/blog/download.json
+++ b/zh-cn/blog/download.json
@@ -1,4 +1,6 @@
 {
   "filename": "download.md",
-  "__html": "<h1>下载中心</h1>\n<h2><a href=\"https://github.com/apache/incubator-dubbo\">Dubbo-RPC</a></h2>\n<blockquote>\n<p>Release Notes: <a href=\"https://github.com/apache/incubator-dubbo/releases\">https://github.com/apache/incubator-dubbo/releases</a></p>\n</blockquote>\n<h3>2.6.4 (最新版本)</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.3</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.2</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project\">Dubbo Spring Boot Starter</a></h2>\n<h3>0.2.0</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-ops\">Dubbo Admin</a></h2>\n<p>全新Dubbo Admin即将发布</p>\n"
+  "__html": "<h1>下载中心</h1>\n<h2><a href=\"https://github.com/apache/incubator-dubbo\">Dubbo-RPC</a></h2>\n<blockquote>\n<p>Release Notes: <a href=\"https://github.com/apache/incubator-dubbo/releases\">https://github.com/apache/incubator-dubbo/releases</a></p>\n</blockquote>\n<h3>2.6.4 (最新版本)</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.3</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h3>2.6.2</h3>\n<ul>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip\">source</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.sha512\">sha512</a></li>\n<li><a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip\">binary</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.asc\">asc</a> | <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.sha512\">sha512</a></li>\n</ul>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project\">Dubbo Spring Boot Starter</a></h2>\n<h3>0.2.0</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2><a href=\"https://github.com/apache/incubator-dubbo-ops\">Dubbo Admin</a></h2>\n<p>全新Dubbo Admin即将发布</p>\n",
+  "link": "/zh-cn/blog/download.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-101.json b/zh-cn/blog/dubbo-101.json
index 1891c698..b678f1c8 100644
--- a/zh-cn/blog/dubbo-101.json
+++ b/zh-cn/blog/dubbo-101.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-101.md",
   "__html": "<h1>第一个 Dubbo 应用</h1>\n<h2>Java RMI 简介</h2>\n<p>Java RMI (Remote Method Invocation)- 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。</p>\n<h3>Java RMI 工作原理</h3>\n<p>一个典型的 RMI 调用如下图所示:</p>\n<ol>\n<li>服务端向 RMI 注册服务绑定自己的地址,</li>\n<li>客户端通过 RMI 注册服务获取目标地址,</li>\n<li>客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致,</li>\n<li>本地存根对象将调用信息打包,通过网络发送到服务端,</li>\n<li>服务端的 Skeleton 对象收到网络请求之后,将调用信息解包,</li>\n<li>然后找到真正的服务对象发起调用,并将返回结果打包通过网络发送回客户端。</li>\n</ol>\n<p><img src=\"../../img/blog/rmi-flow.png\" alt=\"RMI Flow\"></p>\n<p>(来源:<a href=\"https://www.cs.rutgers.edu/~pxk/417/notes/images/rpc-rmi_flow.png\">https://www.cs.rutgers.edu/~pxk/417/notes/images/rpc-rmi_flow.png</a>)</p>\n<h3>Java RMI 基本概念</h3>\n<p>Java RMI 是 Java 领域创建分布式应用的技术基石。后续的 EJB 技术,以及现代的分布式服务框架,其中的基本理念依旧是 Java RMI 的延续。在 RMI 调用中,有以下几个核心的概念:</p>\n<ol>\n<li>\n<p>通过<strong>接口</strong>进行远程调用</p>\n</li>\n<li>\n<p>通过客户端的 <strong>Stub 对象</strong>和服务端的 <strong>Skeleton 对象</strong>的帮助将远程调用伪装成本地调用</p>\n</li>\n<li>\n<p>通过 <strong>RMI 注册服务</strong>完成服务的注册和发现</p>\n</li>\n</ol>\n<p>对于第一点,客户端需要依赖接口,而服务端需要提供该接口的实现。</p>\n<p>对于第二点,在 J2SE 1.5 版本之前需要通过 rmic 预先编译好客户端的 Stub 对象和服务端的 Skeleton 对象。在之后的版本中,不再需要事先生成 Stub 和 Skeleton 对象。</p>\n<p>下面通过示例代码简单的展示 RMI 中的服务注册和发现</p>\n<h4>服务端的服务注册</h4>\n<pre><code class=\"language-java\">Hello obj = <span class=\"hljs-keyword\">new</span> HelloImpl(); <span class=\"hljs-comment\">// #1</span>\nHello stub = (Hello) UnicastRemoteObject.exportObject(obj, <span class=\"hljs-number\">0</span>); <span class=\"hljs-comment\">// #2</span>\nRegistry registry = LocateRegistry.createRegistry(<span class=\"hljs-number\">1099</span>); <span class=\"hljs-comment\">// #3</span>\nregistry.rebind(<span class=\"hljs-string\">\"Hello\"</span>, stub); <span class=\"hljs-comment\">// #4</span>\n</code></pre>\n<p>说明:</p>\n<ol>\n<li>初始化服务对象实例,</li>\n<li>通过 <em>UnicastRemoteObject.exportObject</em> 生成可以与服务端通讯的 Stub 对象,</li>\n<li>创建一个本地的 RMI 注册服务,监听端口为 1099。该注册服务运行在服务端,也可以单独启动一个注册服务的进程,</li>\n<li>将 Stub 对象绑定到注册服务上,这样,客户端可以通过 <em>Hello</em> 这个名字查找到该远程对象。</li>\n</ol>\n<h4>客户端的服务发现</h4>\n<pre><code class=\"language-java\">Registry registry = LocateRegistry.getRegistry(); <span class=\"hljs-comment\">// #1</span>\nHello stub = (Hello) registry.lookup(<span class=\"hljs-string\">\"Hello\"</span>); <span class=\"hljs-comment\">// #2</span>\nString response = stub.sayHello(); <span class=\"hljs-comment\">// #3</span>\n</code></pre>\n<p>说明:</p>\n<ol>\n<li>获取注册服务实例,在本例中,由于没有传入任何参数,假定要获取的注册服务实例部署在本机,并监听在 1099 端口上,</li>\n<li>从注册服务中查找服务名为 <em>Hello</em> 的远程对象,</li>\n<li>通过获取的 Stub 对象发起一次 RMI 调用并获得结果。</li>\n</ol>\n<p>理解 RMI 的工作原理和基本概念,对掌握现代分布式服务框架很有帮助,建议进一步的阅读 RMI 官方教材 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h2>Dubbo 基本概念</h2>\n<p>现代的分布式服务框架的基本概念与 RMI 是类似的,同样是使用 Java 的 Interface 作为服务契约,通过注册中心来完成服务的注册和发现,远程通讯的细节也是通过代理类来屏蔽。具体来说,Dubbo 在工作时有以下四个角色参与:</p>\n<ol>\n<li>服务提供者 - 启动时在指定端口上暴露服务,并将服务地址和端口注册到注册中心上</li>\n<li>服务消费者 - 启动时向注册中心订阅自己感兴趣的服务,以便获得服务提供方的地址列表</li>\n<li>注册中心 - 负责服务的注册和发现,负责保存服务提供方上报的地址信息,并向服务消费方推送</li>\n<li>监控中心 - 负责收集服务提供方和消费方的运行状态,比如服务调用次数、延迟等,用于监控</li>\n<li>运行容器 - 负责服务提供方的初始化、加载以及运行的生命周期管理</li>\n</ol>\n<p><img src=\"../../img/blog/dubbo-architecture.png\" alt=\"dubbo-architecture\"></p>\n<p><strong>部署阶段</strong></p>\n<ul>\n<li>服务提供者在指定端口暴露服务,并向注册中心注册服务信息。</li>\n<li>服务消费者向注册中心发起服务地址列表的订阅。</li>\n</ul>\n<p><strong>运行阶段</strong></p>\n<ul>\n<li>注册中心向服务消费者推送地址列表信息。</li>\n<li>服务消费者收到地址列表后,从其中选取一个向目标服务发起调用。</li>\n<li>调用过程服务消费者和服务提供者的运行状态上报给监控中心。</li>\n</ul>\n<h2>基于 API 的 Dubbo 应用</h2>\n<p>Dubbo 的应用一般都是通过 Spring 来组装的。为了快速获得一个可以工作的 Dubbo 应用,这里的示例摒弃了复杂的配置,而改用面向 Dubbo API 的方式来构建服务提供者和消费者,另外,注册中心和监控中心在本示例中也不需要安装和配置。</p>\n<p>在生产环境,Dubbo 的服务需要一个分布式的服务注册中心与之配合,比如,ZooKeeper。为了方便开发,Dubbo 提供了直连<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>以及组播<sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>两种方式,从而避免额外搭建注册中心的工作。在本例中,将使用组播的方式来完成服务的注册和发现。</p>\n<h3>定义服务契约</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\">GreetingsService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHi</span><span class=\"hljs-params\">(String name)</span></span>; <span class=\"hljs-comment\">// #1</span>\n}\n</code></pre>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>定义了一个简单的服务契约 <em>GreetingsService</em>,其中只有一个方法 <em>sayHi</em> 可供调用,入参是 <em>String</em> 类型,返回值也是 <em>String</em> 类型。</li>\n</ol>\n<h3>提供契约的实现</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingsServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingsService</span> </span>{ <span class=\"hljs-comment\">// #1</span>\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHi</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hi, \"</span> + name; <span class=\"hljs-comment\">// #2</span>\n    }\n}\n</code></pre>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>服务提供者需要实现服务契约 <em>GreetingsService</em> 接口。</li>\n<li>该实现简单的返回一个欢迎信息,如果入参是 <em>dubbo</em>,则返回 <em>hi, dubbo</em>。</li>\n</ol>\n<h3>实现 Dubbo 服务提供方</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        ServiceConfig&lt;GreetingsService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;&gt;(); <span class=\"hljs-comment\">// #1</span>\n        service.setApplication(<span class=\"hljs-keyword\">new</span> ApplicationConfig(<span class=\"hljs-string\">\"first-dubbo-provider\"</span>)); <span class=\"hljs-comment\">// #2</span>\n        service.setRegistry(<span class=\"hljs-keyword\">new</span> RegistryConfig(<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>)); <span class=\"hljs-comment\">// #3</span>\n        service.setInterface(GreetingsService.class); <span class=\"hljs-comment\">// #4</span>\n        service.setRef(<span class=\"hljs-keyword\">new</span> GreetingsServiceImpl()); <span class=\"hljs-comment\">// #5</span>\n        service.export(); <span class=\"hljs-comment\">// #6</span>\n        System.in.read(); <span class=\"hljs-comment\">// #7</span>\n    }\n}\n</code></pre>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>创建一个 <em>ServiceConfig</em> 的实例,泛型参数信息是服务接口类型,即 <em>GreetingsService</em>。</li>\n<li>生成一个 <em>AplicatonConfig</em> 的实例,并将其装配进 <em>ServiceConfig</em>。</li>\n<li>生成一个 <em>RegistryConfig</em> 实例,并将其装配进 <em>ServiceConfig</em>,这里使用的是组播方式,参数是 <code>multicast://224.5.6.7:1234</code>。合法的组播地址范围为:<em>224.0.0.0 - 239.255.255.255</em></li>\n<li>将服务契约 <em>GreetingsService</em> 装配进 <em>ServiceConfig</em>。</li>\n<li>将服务提供者提供的实现 <em>GreetingsServiceImpl</em> 的实例装配进 <em>ServiceConfig</em>。</li>\n<li><em>ServiceConfig</em> 已经具备足够的信息,开始对外暴露服务,默认监听端口是 <em>20880</em>。</li>\n<li>为了防止服务端退出,按任意键或者 <em>ctrl-c</em> 退出。</li>\n</ol>\n<h3>实现 Dubbo 服务调用方</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        ReferenceConfig&lt;GreetingsService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;&gt;(); <span class=\"hljs-comment\">// #1</span>\n        reference.setApplication(<span class=\"hljs-keyword\">new</span> ApplicationConfig(<span class=\"hljs-string\">\"first-dubbo-client\"</span>)); <span class=\"hljs-comment\">// #2</span>\n        reference.setRegistry(<span class=\"hljs-keyword\">new</span> RegistryConfig(<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>)); <span class=\"hljs-comment\">// #3</span>\n        reference.setInterface(GreetingsService.class); <span class=\"hljs-comment\">// #4</span>\n        GreetingsService greetingsService = reference.get(); <span class=\"hljs-comment\">// #5</span>\n        String message = greetingsService.sayHi(<span class=\"hljs-string\">\"dubbo\"</span>); <span class=\"hljs-comment\">// #6</span>\n        System.out.println(message); <span class=\"hljs-comment\">// #7</span>\n    }\n}\n</code></pre>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>创建一个 <em>ReferenceConfig</em> 的实例,同样,泛型参数信息是服务接口类型,即 <em>GreetingService</em>。</li>\n<li>生成一个 <em>AplicatonConfig</em> 的实例,并将其装配进 <em>ReferenceConfig</em>。</li>\n<li>生成一个 <em>RegistryConfig</em> 实例,并将其装配进 <em>ReferenceConfig</em>,注意这里的组播地址信息需要与服务提供方的相同。</li>\n<li>将服务契约 <em>GreetingsService</em> 装配进 <em>ReferenceConfig</em>。</li>\n<li>从 <em>ReferenceConfig</em> 中获取到 <em>GreetingService</em> 的代理。</li>\n<li>通过 <em>GreetingService</em> 的代理发起远程调用,传入的参数为 <em>dubbo</em>。</li>\n<li>打印返回结果 <em>hi, dubbo</em>。</li>\n</ol>\n<h3>运行</h3>\n<p>完整的示例在 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-api\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-api</a> 上提供。在完整的示例中,由于配置了 <em>exec-maven-plugin</em>,可以很方便的在命令行下通过 maven 的方式执行。当然,您也可以在 IDE 里直接执行,但是需要注意的是,由于使用了组播的方式来发现服务,运行时需要指定 <em>-Djava.net.preferIPv4Stack=true</em>。</p>\n<h4>构建示例</h4>\n<p>通过以下的命令来同步示例代码并完成构建:</p>\n<ol>\n<li>同步代码:git clone <a href=\"https://github.com/dubbo/dubbo-samples.git\">https://github.com/dubbo/dubbo-samples.git</a></li>\n<li>构建:mvn clean package</li>\n</ol>\n<pre><code class=\"language-bash\">$ git <span class=\"hljs-built_in\">clone</span> https://github.com/dubbo/dubbo-samples.git\n$ <span class=\"hljs-built_in\">cd</span> dubbo-samples/dubbo-samples-api/\n$ mvn clean package\nINFO] Scanning <span class=\"hljs-keyword\">for</span> projects...\n[INFO]\n[INFO] ------------------------------------------------------------------------\n[INFO] Building dubbo-samples-api 1.0-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO]\n[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ dubbo-samples-api ---\n...\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time: 2.182 s\n[INFO] Finished at: 2018-05-28T14:56:08+08:00\n[INFO] Final Memory: 20M/353M\n[INFO] ------------------------------------------------------------------------\n</code></pre>\n<p>当看到 <em>BUILD SUCCESS</em> 的时候表明构建完成,下面就可以开始进入运行阶段了。</p>\n<h4>运行服务端</h4>\n<p>通过运行以下的 maven 命令来启动服务提供者:</p>\n<pre><code class=\"language-bash\">$ mvn -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> -Dexec.mainClass=com.alibaba.dubbo.samples.server.Application <span class=\"hljs-built_in\">exec</span>:java\n[INFO] Scanning <span class=\"hljs-keyword\">for</span> projects...\n[INFO]                                                                         \n[INFO] ------------------------------------------------------------------------\n[INFO] Building dubbo-samples-api 1.0-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO] \n[INFO] --- <span class=\"hljs-built_in\">exec</span>-maven-plugin:1.6.0:java (default-cli) @ dubbo-samples-api ---\nlog4j:WARN No appenders could be found <span class=\"hljs-keyword\">for</span> logger (com.alibaba.dubbo.common.logger.LoggerFactory).\nlog4j:WARN Please initialize the log4j system properly.\nlog4j:WARN See http://logging.apache.org/log4j/1.2/faq.html<span class=\"hljs-comment\">#noconfig for more info.</span>\nfirst-dubbo-provider is running.\n</code></pre>\n<p>当 <em>first-dubbo-provider is running.</em> 出现时,代表服务提供者已经启动就绪,等待客户端的调用。</p>\n<h4>运行客户端</h4>\n<p>通过运行以下的 maven 命令来调用服务:</p>\n<pre><code class=\"language-bash\">$ mvn -Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> -Dexec.mainClass=com.alibaba.dubbo.samples.client.Application <span class=\"hljs-built_in\">exec</span>:java\n[INFO] Scanning <span class=\"hljs-keyword\">for</span> projects...\n[INFO]                                                                         \n[INFO] ------------------------------------------------------------------------\n[INFO] Building dubbo-samples-api 1.0-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO] \n[INFO] --- <span class=\"hljs-built_in\">exec</span>-maven-plugin:1.6.0:java (default-cli) @ dubbo-samples-api ---\nlog4j:WARN No appenders could be found <span class=\"hljs-keyword\">for</span> logger (com.alibaba.dubbo.common.logger.LoggerFactory).\nlog4j:WARN Please initialize the log4j system properly.\nlog4j:WARN See http://logging.apache.org/log4j/1.2/faq.html<span class=\"hljs-comment\">#noconfig for more info.</span>\nhi, dubbo\n</code></pre>\n<p>可以看到, <em>hi, dubbo</em> 是从服务提供者返回的执行结果。</p>\n<h2>快速生成 Dubbo 应用</h2>\n<p>Dubbo 还提供了一个公共服务快速搭建基于 Spring Boot 的 Dubbo 应用。访问 <a href=\"http://start.dubbo.io\">http://start.dubbo.io</a> 并按照下图所示来生成示例工程:</p>\n<p><img src=\"../../img/blog/dubbo-initializr.png\" alt=\"dubbo initializr\"></p>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>在 <em>Group</em> 中提供 maven groupId,默认值是 <em>com.example</em>。</li>\n<li>在 <em>Artifact</em> 中提供 maven artifactId,默认值是 <em>demo</em>。</li>\n<li>在 <em>DubboServiceName</em> 中提供服务名,默认值是 <em>com.example.HelloService</em>。</li>\n<li>在 <em>DubboServiceVersion</em> 中提供服务的版本,默认值是 <em>1.0.0</em>。</li>\n<li>在 <em>Client/Server</em> 中选取本次构建的工程是服务提供者 (Server) 还是服务消费者 (Client),默认值是 <em>server</em>。</li>\n<li>使用 <em>embeddedZookeeper</em> 作为服务注册发现,默认为勾选。</li>\n<li>是否激活 qos 端口,默认为不勾选,如果勾选可以通过 <em>22222</em> 端口访问。</li>\n<li>点击 <em>Generate Project</em> 即可下载生成好的工程。</li>\n</ol>\n<p>在本例中展示的是服务提供者,同样的,通过在生成界面选取 <em>client</em> 来生成对应的服务消费者。</p>\n<h3>运行</h3>\n<p>用 IDE 打开生成好的工程,可以发现应用是一个典型的 Spring Boot 应用。程序的入口如下所示:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoApplication</span> </span>{\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\t<span class=\"hljs-keyword\">new</span> EmbeddedZooKeeper(<span class=\"hljs-number\">2181</span>, <span class=\"hljs-keyword\">false</span>).start();  <span class=\"hljs-comment\">// #1</span>\n\t\tSpringApplication.run(DemoApplication.class, args); <span class=\"hljs-comment\">// #2</span>\n\t}\n}\n</code></pre>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>在 <em>2181</em> 端口上启动嵌入式 <em>ZooKeeper</em>。</li>\n<li>启动 <em>Spring Boot</em> 上下文。</li>\n</ol>\n<p>可以直接在 IDE 中运行,输出结果如下:</p>\n<pre><code class=\"language-bash\">2018-05-28 16:59:38.072  INFO 59943 --- [           main] a.b.d.c.e.WelcomeLogoApplicationListener : \n\n  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  \n  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███ \n  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███ \n  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███ \n  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███ \n  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███ \n  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███ \n  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  \n                                                             \n\n :: Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project\n :: Dubbo (v2.0.1) : https://github.com/alibaba/dubbo\n :: Google group : http://groups.google.com/group/dubbo\n\n2018-05-28 16:59:38.079  INFO 59943 --- [           main] e.OverrideDubboConfigApplicationListener : Dubbo Config was overridden by externalized configuration {dubbo.application.name=dubbo-demo-server, dubbo.application.qosAcceptForeignIp=<span class=\"hljs-literal\">false</span>, dubbo.application.qosEnable=<span class=\"hljs-literal\">true</span>, dubbo.application.qosPort=22222, dubbo.registry.address=zookeeper://localhost:2181?client=curator, dubbo.registry.id=my-registry, dubbo.scan.basePackages=com.example} <span class=\"hljs-comment\">#1</span>\n\n...\n\n2018-05-28 16:59:39.624  INFO 59943 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication <span class=\"hljs-keyword\">in</span> 1.746 seconds (JVM running <span class=\"hljs-keyword\">for</span> 2.963)\n</code></pre>\n<p><strong>说明</strong>:</p>\n<ol>\n<li>输出中打印的以 <em>dubbo.</em> 开头的配置信息,定义在 <em>main/resources/application.properties</em> 中。</li>\n</ol>\n<h3>通过 Telnet 管理服务</h3>\n<p>生成工程的时候如果选择了激活 <em>qos</em> 的话,就可以通过 <em>telnet</em> 或者 <em>nc</em> 来管理服务、查看服务状态。</p>\n<pre><code class=\"language-bash\">$ telnet localhost 22222\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is <span class=\"hljs-string\">'^]'</span>.\n  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  \n  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███ \n  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███ \n  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███ \n  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███ \n  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███ \n  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███ \n  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  \n                                                             \n\ndubbo&gt;\ndubbo&gt;ls\nAs Provider side:\n+------------------------------+---+\n|     Provider Service Name    |PUB|\n+------------------------------+---+\n|com.example.HelloService:1.0.0| Y |\n+------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>目前 <em>qos</em> 支持以下几个命令,更详细的信息请查阅官方文档<sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>:</p>\n<ul>\n<li><em>ls</em>:列出消费者、提供者信息</li>\n<li><em>online</em>:上线服务</li>\n<li><em>offline</em>:下线服务</li>\n<li><em>help</em>:联机帮助</li>\n</ul>\n<h2>总结</h2>\n<p>在本文中,从 RMI 开始,介绍了 Java 领域分布式调用的基本概念,也就是基于接口编程、通过代理将远程调用伪装成本地、通过注册中心完成服务的注册和发现。</p>\n<p>然后为了简单起见,使用简单的组播注册方式和直接面向 Dubbo API 编程的方式介绍了如何开发一个 Dubbo 的完整应用。深入的了解 <em>ServiceConfig</em> 和 <em>ReferenceConfig</em> 的用法,对于进一步的使用 Spring XML 配置、乃至 Spring Boot 的编程方式有这很大的帮助。</p>\n<p>最后,简单的介绍了如何通过 Dubbo 团队提供的公共服务 <a href=\"http://start.dubbo.io\">start.dubbo.io</a> 快速搭建基于 Spring Boot 的 Dubbo 应用,并通过 <em>qos</em> 来做 Dubbo 服务的简单运维。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><a href=\"https://docs.oracle.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html\">Getting Started Using JavaTM RMI</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/explicit-target.html\">直连提供者</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p><a href=\"http://dubbo.apache.org/books/dubbo-user-book/references/registry/multicast.html\">Multicast 注册中心</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p><a href=\"http://dubbo.apache.org/books/dubbo-user-book/references/qos.html\">在线运维命令</a> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
-  "title": "第一个 Dubbo 应用",
-  "keywords": "Dubbo, RPC, RMI",
-  "description": "现代的分布式服务框架的基本概念与 RMI 是类似的,同样是使用 Java 的 Interface 作为服务契约,通过注册中心来完成服务的注册和发现,远程通讯的细节也是通过代理类来屏蔽。"
+  "link": "/zh-cn/blog/dubbo-101.html",
+  "meta": {
+    "title": "第一个 Dubbo 应用",
+    "keywords": "Dubbo, RPC, RMI",
+    "description": "现代的分布式服务框架的基本概念与 RMI 是类似的,同样是使用 Java 的 Interface 作为服务契约,通过注册中心来完成服务的注册和发现,远程通讯的细节也是通过代理类来屏蔽。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-annotation.json b/zh-cn/blog/dubbo-annotation.json
index 304d19e4..f9a4f155 100644
--- a/zh-cn/blog/dubbo-annotation.json
+++ b/zh-cn/blog/dubbo-annotation.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-annotation.md",
   "__html": "<h1>在 Dubbo 中使用注解</h1>\n<p>随着微服务架构的广泛地推广和实施。在 Java 生态系统中,以 Spring Boot 和 Spring Cloud 为代表的微服务框架,引入了全新的编程模型,包括:</p>\n<ul>\n<li>注解驱动(Annotation-Driven)</li>\n<li>外部化配置(External Configuration)</li>\n<li>以及自动装配(Auto-Configure)</li>\n</ul>\n<p>新的编程模型无需 XML 配置、简化部署、提升开发效率。为了更好地实践微服务架构,Dubbo 从 <code>2.5.8</code> 版本开始, 分别针对了上述的三个场景,提供了更完善的支持。本文不讨论传统的 XML 配置方式,而是侧重介绍注解这种方式。外部配置、自动装配两种自动装配会在另外的文章中专门介绍。</p>\n<h2>注解介绍</h2>\n<h3>@EnableDubbo</h3>\n<p><code>@EnableDubbo</code> 注解是 <code>@EnableDubboConfig</code> 和 <code>@DubboComponentScan</code>两者组合的便捷表达方式。与注解驱动相关的是 <code>@DubboComponentScan</code>。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.config.spring.context.annotation;\n\n<span class=\"hljs-meta\">@EnableDubboConfig</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-meta\">@interface</span> EnableDubbo {\n    <span class=\"hljs-comment\">/**\n     * Base packages to scan for annotated <span class=\"hljs-doctag\">@Service</span> classes.\n     * &lt;p&gt;\n     * Use {<span class=\"hljs-doctag\">@link</span> #scanBasePackageClasses()} for a type-safe alternative to String-based\n     * package names.\n     *\n     * <span class=\"hljs-doctag\">@return</span> the base packages to scan\n     * <span class=\"hljs-doctag\">@see</span> DubboComponentScan#basePackages()\n     */</span>\n    <span class=\"hljs-meta\">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class=\"hljs-string\">\"basePackages\"</span>)\n    String[] scanBasePackages() <span class=\"hljs-keyword\">default</span> {};\n\n    <span class=\"hljs-comment\">/**\n     * Type-safe alternative to {<span class=\"hljs-doctag\">@link</span> #scanBasePackages()} for specifying the packages to\n     * scan for annotated <span class=\"hljs-doctag\">@Service</span> classes. The package of each class specified will be\n     * scanned.\n     *\n     * <span class=\"hljs-doctag\">@return</span> classes from the base packages to scan\n     * <span class=\"hljs-doctag\">@see</span> DubboComponentScan#basePackageClasses\n     */</span>\n    <span class=\"hljs-meta\">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class=\"hljs-string\">\"basePackageClasses\"</span>)\n    Class&lt;?&gt;[] scanBasePackageClasses() <span class=\"hljs-keyword\">default</span> {};    \n}\n</code></pre>\n<p>通过 <code>@EnableDubbo</code> 可以在指定的包名下(通过 <code>scanBasePackages</code>),或者指定的类中(通过 <code>scanBasePackageClasses</code>)扫描 Dubbo 的服务提供者(以 <code>@Service</code> 标注)以及 Dubbo 的服务消费者(以 <code>Reference</code> 标注)。</p>\n<p>扫描到 Dubbo 的服务提供方和消费者之后,对其做相应的组装并初始化,并最终完成服务暴露或者引用的工作。</p>\n<p>当然,如果不使用外部化配置(External Configuration)的话,也可以直接使用 <code>@DubboComponentScan</code>。</p>\n<h3>@Service</h3>\n<p><code>@Service</code> 用来配置 Dubbo 的服务提供方,比如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotatedGreetingService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + name;\n    }\n}\n</code></pre>\n<p>通过 <code>@Service</code> 上提供的属性,可以进一步的定制化 Dubbo 的服务提供方:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.config.annotation;\n\n<span class=\"hljs-meta\">@Documented</span>\n<span class=\"hljs-meta\">@Retention</span>(RetentionPolicy.RUNTIME)\n<span class=\"hljs-meta\">@Target</span>({ElementType.TYPE}) <span class=\"hljs-comment\">// #1</span>\n<span class=\"hljs-meta\">@Inherited</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-meta\">@interface</span> Service {\n    Class&lt;?&gt; interfaceClass() <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">void</span>.class; <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">interfaceName</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">version</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #4</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">group</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #5</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean</span> <span class=\"hljs-title\">export</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">true</span></span>; <span class=\"hljs-comment\">// #6</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">true</span></span>; <span class=\"hljs-comment\">// #7</span>\n    \n    <span class=\"hljs-function\">String <span class=\"hljs-title\">application</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #8</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">module</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #9</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">provider</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #10</span>\n    String[] protocol() <span class=\"hljs-keyword\">default</span> {}; <span class=\"hljs-comment\">// #11</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">monitor</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #12</span>\n    String[] registry() <span class=\"hljs-keyword\">default</span> {}; <span class=\"hljs-comment\">// #13</span>\n}\n</code></pre>\n<p>其中比较重要的有:</p>\n<ol>\n<li>@Service 只能定义在一个类上,表示一个服务的具体实现</li>\n<li>interfaceClass:指定服务提供方实现的 interface 的类</li>\n<li>interfaceName:指定服务提供方实现的 interface 的类名</li>\n<li>version:指定服务的版本号</li>\n<li>group:指定服务的分组</li>\n<li>export:是否暴露服务</li>\n<li>registry:是否向注册中心注册服务</li>\n<li>application:应用配置</li>\n<li>module:模块配置</li>\n<li>provider:服务提供方配置</li>\n<li>protocol:协议配置</li>\n<li>monitor:监控中心配置</li>\n<li>registry:注册中心配置</li>\n</ol>\n<p>另外,需要注意的是,application、module、provider、protocol、monitor、registry(从 8 到 13)需要提供的是对应的 spring bean 的名字,而这些 bean 的组装要么通过传统的 XML 配置方式完成,要么通过现代的 Java Config 来完成。在本文中,将会展示 Java Config 的使用方式。</p>\n<h3>@Reference</h3>\n<p><code>@Reference</code> 用来配置 Dubbo 的服务消费方,比如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Component</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceConsumer</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>\n    <span class=\"hljs-keyword\">private</span> GreetingService greetingService;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">doSayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> greetingService.sayHello(name);\n    }\n}\n</code></pre>\n<p>通过 <code>@Reference</code> 上提供的属性,可以进一步的定制化 Dubbo 的服务消费方:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> org.apache.dubbo.config.annotation;\n\n<span class=\"hljs-meta\">@Documented</span>\n<span class=\"hljs-meta\">@Retention</span>(RetentionPolicy.RUNTIME)\n<span class=\"hljs-meta\">@Target</span>({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) <span class=\"hljs-comment\">// #1</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-meta\">@interface</span> Reference {\n    Class&lt;?&gt; interfaceClass() <span class=\"hljs-keyword\">default</span> <span class=\"hljs-keyword\">void</span>.class; <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">interfaceName</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">version</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #4</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">group</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #5</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">url</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #6</span>\n    \n    <span class=\"hljs-function\">String <span class=\"hljs-title\">application</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #7</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">module</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #8</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">consumer</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #9</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">protocol</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #10</span>\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">monitor</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">default</span> \"\"</span>; <span class=\"hljs-comment\">// #11</span>\n    String[] registry() <span class=\"hljs-keyword\">default</span> {}; <span class=\"hljs-comment\">// #12</span>\n}\n</code></pre>\n<p>其中比较重要的有:</p>\n<ol>\n<li>@Reference 可以定义在类中的一个字段上,也可以定义在一个方法上,甚至可以用来修饰另一个 annotation,表示一个服务的引用。通常 @Reference 定义在一个字段上</li>\n<li>interfaceClass:指定服务的 interface 的类</li>\n<li>interfaceName:指定服务的 interface 的类名</li>\n<li>version:指定服务的版本号</li>\n<li>group:指定服务的分组</li>\n<li>url:通过指定服务提供方的 URL 地址直接绕过注册中心发起调用</li>\n<li>application:应用配置</li>\n<li>module:模块配置</li>\n<li>consumer:服务消费方配置</li>\n<li>protocol:协议配置</li>\n<li>monitor:监控中心配置</li>\n<li>registry:注册中心配置</li>\n</ol>\n<p>另外,需要注意的是,application、module、consumer、protocol、monitor、registry(从 7 到 12)需要提供的是对应的 spring bean 的名字,而这些 bean 的组装要么通过传统的 XML 配置方式完成,要么通过现代的 Java Config 来完成。在本文中,将会展示 Java Config 的使用方式。</p>\n<h2>示例实战</h2>\n<p>了解了 <code>@EnableDubbo</code>, <code>@Service</code>,<code>@Reference</code> 的作用,下面以一个实际的例子来展示如何使用 annotation 来开发 Dubbo 应用。以下的代码可以在 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-annotation\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-annotation</a> 中找到。</p>\n<h3>1. 接口定义</h3>\n<p>定义一个简单的 <code>GreetingService</code> 接口,里面只有一个简单的方法 <code>sayHello</code> 向调用者问好。</p>\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\">GreetingService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h3>2. 服务端:服务实现</h3>\n<p>实现 <code>GreetingService</code> 接口,并通过 <code>@Service</code> 来标注其为 Dubbo 的一个服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotatedGreetingService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + name;\n    }\n}\n</code></pre>\n<h3>3. 服务端:组装服务提供方</h3>\n<p>通过 Spring 中 Java Config 的技术(<code>@Configuration</code>)和 annotation 扫描(<code>@EnableDubbo</code>)来发现、组装、并向外提供 Dubbo 的服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.impl\"</span>)\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderConfiguration</span> </span>{\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #1</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProviderConfig <span class=\"hljs-title\">providerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ProviderConfig providerConfig = <span class=\"hljs-keyword\">new</span> ProviderConfig();\n        providerConfig.setTimeout(<span class=\"hljs-number\">1000</span>);\n        <span class=\"hljs-keyword\">return</span> providerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"dubbo-annotation-provider\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setProtocol(<span class=\"hljs-string\">\"zookeeper\"</span>);\n        registryConfig.setAddress(<span class=\"hljs-string\">\"localhost\"</span>);\n        registryConfig.setPort(<span class=\"hljs-number\">2181</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #4</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProtocolConfig <span class=\"hljs-title\">protocolConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ProtocolConfig protocolConfig = <span class=\"hljs-keyword\">new</span> ProtocolConfig();\n        protocolConfig.setName(<span class=\"hljs-string\">\"dubbo\"</span>);\n        protocolConfig.setPort(<span class=\"hljs-number\">20880</span>);\n        <span class=\"hljs-keyword\">return</span> protocolConfig;\n    }\n}\n</code></pre>\n<p>说明:</p>\n<ul>\n<li>\n<p>通过 <code>@EnableDubbo</code> 指定在 <code>com.alibaba.dubbo.samples.impl</code> 下扫描所有标注有 <code>@Service</code> 的类</p>\n</li>\n<li>\n<p>通过 <code>@Configuration</code> 将 ProviderConfiguration 中所有的 <code>@Bean</code> 通过 Java Config 的方式组装出来并注入给 Dubbo 服务,也就是标注有 <code>@Service</code> 的类。这其中就包括了:</p>\n<ol>\n<li>ProviderConfig:服务提供方配置</li>\n<li>ApplicationConfig:应用配置</li>\n<li>RegistryConfig:注册中心配置</li>\n<li>ProtocolConfig:协议配置</li>\n</ol>\n</li>\n</ul>\n<h3>4. 服务端:启动服务</h3>\n<p>在 <code>main</code> 方法中通过启动一个 Spring Context 来对外提供 Dubbo 服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        <span class=\"hljs-keyword\">new</span> EmbeddedZooKeeper(<span class=\"hljs-number\">2181</span>, <span class=\"hljs-keyword\">false</span>).start(); <span class=\"hljs-comment\">// #1</span>\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class); <span class=\"hljs-comment\">// #2</span>\n        context.start(); <span class=\"hljs-comment\">// #3</span>\n        System.in.read(); <span class=\"hljs-comment\">// #4</span>\n    }\n}\n</code></pre>\n<p>说明:</p>\n<ol>\n<li>启动一个嵌入式的 zookeeper 在 2181 端口上提供注册中心的服务</li>\n<li>初始化一个 <code>AnnotationConfigApplicationContext</code> 的示例,并将 <code>ProviderConfiguration</code> 传入以完成 Dubbo 服务的自动发现和装配</li>\n<li>启动 Spring Context,开始提供对外的 Dubbo 服务</li>\n<li>因为是服务端,需要通过阻塞主线程来防止进程退出</li>\n</ol>\n<p>启动服务端的 <code>main</code> 方法,将会看到下面的输出,代表服务端启动成功,并在注册中心(ZookeeperRegistry)上注册了 <code>GreetingService</code> 这个服务:</p>\n<pre><code class=\"language-sh\">[01/08/18 02:12:51:051 CST] main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer <span class=\"hljs-built_in\">bind</span> /0.0.0.0:20880, <span class=\"hljs-built_in\">export</span> /192.168.99.1:20880, dubbo version: 2.6.2, current host: 192.168.99.1\n\n[01/08/18 02:12:51:051 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=<span class=\"hljs-literal\">true</span>&amp;application=dubbo-annotation-provider&amp;default.timeout=1000&amp;dubbo=2.6.2&amp;generic=<span class=\"hljs-literal\">false</span>&amp;interface=com.alibaba.dubbo.samples.api\n</code></pre>\n<h3>5. 客户端:引用服务</h3>\n<p>通过 <code>@Reference</code> 来标记 <code>GreetingService</code> 接口的成员变量 greetingService 是一个 Dubbo 服务的引用,也就是说,可以简单的通过该接口向远端的服务提供方发起调用,而客户端并没有实现 <code>GreetingService</code> 接口。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Component</span>(<span class=\"hljs-string\">\"annotatedConsumer\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceConsumer</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>\n    <span class=\"hljs-keyword\">private</span> GreetingService greetingService;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">doSayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> greetingService.sayHello(name);\n    }\n}\n</code></pre>\n<h3>6. 客户端:组装服务消费者</h3>\n<p>与 <strong>3. 服务端:组装服务提供方</strong> 类似,通过 Spring 中 Java Config 的技术(<code>@Configuration</code>)和 annotation 扫描(<code>@EnableDubbo</code>)来发现、组装 Dubbo 服务的消费者。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>)\n<span class=\"hljs-meta\">@ComponentScan</span>(value = {<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>})\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerConfiguration</span> </span>{\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #1</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"dubbo-annotation-consumer\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #2</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n        consumerConfig.setTimeout(<span class=\"hljs-number\">3000</span>);\n        <span class=\"hljs-keyword\">return</span> consumerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span> <span class=\"hljs-comment\">// #3</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setProtocol(<span class=\"hljs-string\">\"zookeeper\"</span>);\n        registryConfig.setAddress(<span class=\"hljs-string\">\"localhost\"</span>);\n        registryConfig.setPort(<span class=\"hljs-number\">2181</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<p>说明:</p>\n<ul>\n<li>通过 <code>@EnableDubbo</code> 指定在 <code>com.alibaba.dubbo.samples.impl</code> 下扫描所有标注有 `@Reference 的类</li>\n<li>通过 <code>@Configuration</code> 将 ConsumerConfiguration 中所有的 <code>@Bean</code> 通过 Java Config 的方式组装出来并注入给 Dubbo 服务消费者,也就是标注有 `@Reference 的类。这其中就包括了:\n<ol>\n<li>ApplicationConfig:应用配置</li>\n<li>ConsumerConfig:服务消费者配置</li>\n<li>RegistryConfig:注册中心配置,注意:这里的配置需要与服务提供方启动的 EmbeddedZooKeeper 的配置信息保持一致</li>\n</ol>\n</li>\n</ul>\n<h3>7. 客户端:发起远程调用</h3>\n<p>在 <code>main</code> 方法中通过启动一个 Spring Context,从其中查找到组装好的 Dubbo 的服务消费者,并发起一次远程调用。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class); <span class=\"hljs-comment\">// #1</span>\n        context.start(); <span class=\"hljs-comment\">// #2</span>\n        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class); <span class=\"hljs-comment\">// #3</span>\n        String hello = greetingServiceConsumer.doSayHello(<span class=\"hljs-string\">\"annotation\"</span>); <span class=\"hljs-comment\">// #4</span>\n        System.out.println(<span class=\"hljs-string\">\"result: \"</span> + hello); <span class=\"hljs-comment\">// #5</span>\n    }\n}\n</code></pre>\n<p>说明:</p>\n<ol>\n<li>\n<p>初始化一个 <code>AnnotationConfigApplicationContext</code> 的示例,并将 <code>ConsumerConfiguration</code> 传入以完成 Dubbo 服务消费者的自动发现和装配</p>\n</li>\n<li>\n<p>启动 Spring Context</p>\n</li>\n<li>\n<p>从 Context 中查找出类型为 <code>GreetingServiceConsumer</code> 的 Bean</p>\n</li>\n<li>\n<p>调用 <code>doSayHello</code> 方法,最终通过 Dubbo 的服务引用(由 <code>@Reference</code> 标注)发起一次远程调用</p>\n</li>\n<li>\n<p>打印调用结果</p>\n</li>\n</ol>\n<p>启动客户端的 <code>main</code> 方法,将会看到下面的输出,其中返回结果为 result: hello, annotation:</p>\n<pre><code class=\"language-sh\">[01/08/18 02:38:40:040 CST] main  INFO config.AbstractConfig:  [DUBBO] Refer dubbo service com.alibaba.dubbo.samples.api.GreetingService from url zookeeper://localhost:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=<span class=\"hljs-literal\">true</span>&amp;application=dubbo-annotation-consumer&amp;check=<span class=\"hljs-literal\">false</span>&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;generic=<span class=\"hljs-literal\">false</span>&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=33001&amp;register.ip=192.168.99.1&amp;remote.timestamp=1533105502086&amp;side=consumer&amp;timestamp=1533105519216, dubbo version: 2.6.2, current host: 192.168.99.1\n[01/08/18 02:38:40:040 CST] main  INFO annotation.ReferenceBeanBuilder: &lt;dubbo:reference object=<span class=\"hljs-string\">\"com.alibaba.dubbo.common.bytecode.proxy0@673be18f\"</span> singleton=<span class=\"hljs-string\">\"true\"</span> interface=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> uniqueServiceName=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> generic=<span class=\"hljs-string\">\"false\"</span> id=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> /&gt; has been built.\nresult: hello, annotation\n</code></pre>\n<h2>总结</h2>\n<p>通过本文的学习,读者可以掌握 Dubbo 专属的 annotation <code>@EnableDubbo</code>、<code>@Service</code>、<code>@Reference</code> 的基本概念,并通过一个简单 Dubbo 应用的实战开发掌握其基本的用法。</p>\n<p>Spring 除了传统的 XML 配置之外,还提供了注解驱动、外部化配置、以及自动装配等更现代的配置方式。本文专注在介绍通过注解方式来开发 Dubbo 应用,可以看到,与 XML 配置相比,注解方式编程更加简洁明快。在今后的博文中,会进一步的介绍在 Dubbo 中使用外部化配置、以及自动装配的方法。</p>\n",
-  "title": "在 Dubbo 中使用注解",
-  "keywords": "Dubbo, Annotation, Spring",
-  "description": "介绍了如何使用注解方式而非 XML 方式来开发 Dubbo 应用,可以学习到如何使用 @EnableDubbo、@Service、@Reference 的用法。"
+  "link": "/zh-cn/blog/dubbo-annotation.html",
+  "meta": {
+    "title": "在 Dubbo 中使用注解",
+    "keywords": "Dubbo, Annotation, Spring",
+    "description": "介绍了如何使用注解方式而非 XML 方式来开发 Dubbo 应用,可以学习到如何使用 @EnableDubbo、@Service、@Reference 的用法。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.json b/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.json
index e2b56eff..51b3be74 100644
--- a/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.json
+++ b/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-basic-usage-dubbo-provider-configuration.md",
   "__html": "<h1>Dubbo基本用法之Provider配置</h1>\n<h2>Dubbo基本用法</h2>\n<p>本章节主要讲述如何配置dubbo,按照配置方式上分,可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。\n按照功能角度进行划分,可以分为Dubbo Provider和Dubbo Consumer。接下来章节中,分别对dubbo provider和Dubbo consumer进行讲解。</p>\n<h3>Dubbo Provider配置</h3>\n<h4>Provider 配置详解</h4>\n<p>配置Dubbo Provider有4种方式:XML配置,properties方式配置,API调用方式配置,注解方式配置。</p>\n<h5>XML配置</h5>\n<h6>最简单的配置的样例:</h6>\n<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;\n    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;\n    xmlns:dubbo=&quot;http://dubbo.apache.org/schema/dubbo&quot;\n    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd&quot;&gt;  \n    &lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;  \n    &lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;  \n    &lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;  \n    &lt;dubbo:service interface=&quot;com.alibaba.dubbo.demo.DemoService&quot; ref=&quot;demoServiceLocal&quot; /&gt;  \n    &lt;dubbo:reference id=&quot;demoServiceRemote&quot; interface=&quot;com.alibaba.dubbo.demo.DemoService&quot; /&gt;  \n&lt;/beans&gt;\n</code></pre>\n<p>上面样例中,注意下dubbo schema的写法:</p>\n<pre><code>&lt;beans xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;\n       xmlns:dubbo=&quot;http://code.alibabatech.com/schema/dubbo&quot;\n       xmlns=&quot;http://www.springframework.org/schema/beans&quot;\n       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd\n       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&quot;&gt;\n</code></pre>\n<h6>支持的配置标签</h6>\n<table>\n<thead>\n<tr>\n<th>标签</th>\n<th>用途</th>\n<th style=\"text-align:left\">解释</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>&lt;dubbo:service/&gt;</td>\n<td>服务配置</td>\n<td style=\"text-align:left\">用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心</td>\n</tr>\n<tr>\n<td>&lt;dubbo:reference/&gt;</td>\n<td>引用配置</td>\n<td style=\"text-align:left\">用于创建一个远程服务代理,一个引用可以指向多个注册中心</td>\n</tr>\n<tr>\n<td>&lt;dubbo:protocol/&gt;</td>\n<td>协议配置</td>\n<td style=\"text-align:left\">用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受</td>\n</tr>\n<tr>\n<td>&lt;dubbo:application/&gt;</td>\n<td>应用配置</td>\n<td style=\"text-align:left\">用于配置当前应用信息,不管该应用是提供者还是消费者</td>\n</tr>\n<tr>\n<td>&lt;dubbo:module/&gt;</td>\n<td>模块配置</td>\n<td style=\"text-align:left\">用于配置当前模块信息,可选</td>\n</tr>\n<tr>\n<td>&lt;dubbo:registry/&gt;</td>\n<td>注册中心配置</td>\n<td style=\"text-align:left\">用于配置连接注册中心相关信息</td>\n</tr>\n<tr>\n<td>&lt;dubbo:monitor/&gt;</td>\n<td>监控中心配置</td>\n<td style=\"text-align:left\">用于配置连接监控中心相关信息,可选</td>\n</tr>\n<tr>\n<td>&lt;dubbo:provider/&gt;</td>\n<td>提供方配置</td>\n<td style=\"text-align:left\">当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选</td>\n</tr>\n<tr>\n<td>&lt;dubbo:consumer/&gt;</td>\n<td>消费方配置</td>\n<td style=\"text-align:left\">当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选</td>\n</tr>\n<tr>\n<td>&lt;dubbo:method/&gt;</td>\n<td>方法配置</td>\n<td style=\"text-align:left\">用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息</td>\n</tr>\n<tr>\n<td>&lt;dubbo:argument/&gt;</td>\n<td>参数配置</td>\n<td style=\"text-align:left\">用于指定方法参数配置</td>\n</tr>\n</tbody>\n</table>\n<p><img src=\"https://cdn.yuque.com/lark/0/2018/png/15841/1527849348155-8423d401-9ea4-4dc6-8720-d9e3d90963b6.png\" alt=\"undefined\"></p>\n <center>配置之间关系图</center>\n<h6>配置项详解</h6>\n<ul>\n<li>\n<p>&lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;<br>\n用于指定应用名,这里需要保证应用名唯一,这个应用名在后续的console admin中可以在列表中显示,方便管理。</p>\n</li>\n<li>\n<p>&lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;<br>\n注册中心配置,和服务发现的具体机制有关系。可以是zookeeper地址,也可以eureka地址。上面这个是广播地址,在本地服务调用的测试过程中非常方便。</p>\n</li>\n<li>\n<p>&lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;<br>\n这里是传输的协议和默认端口,一般不需要更改。</p>\n</li>\n</ul>\n<blockquote>\n<p>接下来重点讲解下&lt;dubbo:service/&gt;的配置。</p>\n</blockquote>\n<ul>\n<li>&lt;dubbo:service/&gt;支持的主要属性列表:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>属性名</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>version</td>\n<td>版本号</td>\n</tr>\n<tr>\n<td>scope</td>\n<td>服务可见性, 值为:local 或者 remote,默认为remote</td>\n</tr>\n<tr>\n<td>actives</td>\n<td>最大的激活的请求数</td>\n</tr>\n<tr>\n<td>async</td>\n<td>方法调用是否异步,默认为false</td>\n</tr>\n<tr>\n<td>cache</td>\n<td>服务缓存,可选值:lru/threadlocal/jcache</td>\n</tr>\n<tr>\n<td>callbacks</td>\n<td>callback实例的限制</td>\n</tr>\n<tr>\n<td>generic</td>\n<td>泛化调用,可以绕过</td>\n</tr>\n<tr>\n<td>class</td>\n<td>Service的实现的类名</td>\n</tr>\n<tr>\n<td>connections</td>\n<td>这个服务里的连接数</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>发布服务延迟的毫秒数</td>\n</tr>\n<tr>\n<td>executes</td>\n<td>服务执行的请求上限</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>超时重试次数</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>调用超时时间</td>\n</tr>\n</tbody>\n</table>\n<p>其他配置属性请参考xsd:<a href=\"http://dubbo.apache.org/schema/dubbo/dubbo.xsd\">http://dubbo.apache.org/schema/dubbo/dubbo.xsd</a></p>\n<ul>\n<li>&lt;dubbo:method/&gt;作为&lt;dubbo:service/&gt;的子元素,它可以针对方法进行配置。比较常用的属性有:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>属性名</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>executes</td>\n<td>服务执行的请求上限</td>\n</tr>\n<tr>\n<td>retries</td>\n<td>超时重试次数</td>\n</tr>\n<tr>\n<td>timeout</td>\n<td>调用超时时间</td>\n</tr>\n</tbody>\n</table>\n<p>其他属性,可以参考上面的xsd。</p>\n<h6>配置的覆盖关系</h6>\n<p><img src=\"https://cdn.yuque.com/lark/0/2018/png/15841/1527849374313-94a5ea24-0e72-4d83-871b-e0e95eab646a.png\" alt=\"undefined\"></p>\n<center>配置的覆盖关系图</center>\n<p>这里的覆盖关系包含了Provider和Consumer两端的配置,如果对consumer有疑问,可以参考后一章节的consumer章节之后再来理解。</p>\n<h4>dubbo.properties方式配置</h4>\n<blockquote>\n<p>如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。</p>\n</blockquote>\n<p>Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数 -Ddubbo.properties.file=xxx.properties 改变缺省配置位置。</p>\n<h6>dubbo.properties配置样例</h6>\n<pre><code># 应用名\ndubbo.application.name=dubbodemo-provider\n# 注册中心地址\ndubbo.registry.address=zookeeper://localhost:2181\n# 广播的注册中心样例\n#dubbo.registry.address=multicast://224.5.6.7:1234\n# 调用协议地址\ndubbo.protocol.name=dubbo\ndubbo.protocol.port=28080\n</code></pre>\n<h6>映射规则</h6>\n<p>将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行</p>\n<ul>\n<li>比如:dubbo.application.name=foo等价于&lt;dubbo:application name=&quot;foo&quot; /&gt;</li>\n<li>比如:dubbo.registry.address=10.20.153.10:9090等价于&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; /&gt;</li>\n</ul>\n<p>如果 XML 有多行同名标签配置,可用 id 号区分,如果没有 id 号将对所有同名标签生效</p>\n<ul>\n<li>比如:dubbo.protocol.rmi.port=1234等价于&lt;dubbo:protocol id=&quot;rmi&quot; name=&quot;rmi&quot; port=&quot;1234&quot; /&gt;</li>\n<li>比如:dubbo.registry.china.address=10.20.153.10:9090等价于&lt;dubbo:registry id=&quot;china&quot; address=&quot;10.20.153.10:9090&quot; /&gt;</li>\n</ul>\n<h6>覆盖策略</h6>\n<p><img src=\"https://cdn.yuque.com/lark/0/2018/png/15841/1527849393591-2c3de248-1b3d-47d3-bd10-8b415e9fcd39.png\" alt=\"undefined\"></p>\n<ul>\n<li>JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。</li>\n<li>XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。</li>\n<li>Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。</li>\n</ul>\n<blockquote>\n<p>注意:</p>\n</blockquote>\n<ol>\n<li>如果 classpath 根目录下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,Dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。 ↩</li>\n<li>协议的 id 没配时,缺省使用协议名作为 id</li>\n</ol>\n<h5>注解配置</h5>\n<h6>Service注解暴露服务</h6>\n<pre><code>import com.alibaba.dubbo.config.annotation.Service;\n\n@Service(timeout = 5000)\npublic class AnnotateServiceImpl implements AnnotateService { \n    // ...\n}\n</code></pre>\n<h6>javaconfig形式配置公共模块</h6>\n<pre><code>@Configuration\npublic class DubboConfiguration {\n\n    @Bean\n    public ApplicationConfig applicationConfig() {\n        ApplicationConfig applicationConfig = new ApplicationConfig();\n        applicationConfig.setName(&quot;provider-test&quot;);\n        return applicationConfig;\n    }\n\n    @Bean\n    public RegistryConfig registryConfig() {\n        RegistryConfig registryConfig = new RegistryConfig();\n        registryConfig.setAddress(&quot;zookeeper://127.0.0.1:2181&quot;);\n        registryConfig.setClient(&quot;curator&quot;);\n        return registryConfig;\n    }\n}\n</code></pre>\n<p>这种方式的配置和前面用xml配置的方式是一样的效果。</p>\n<h6>指定dubbo扫描路径</h6>\n<pre><code>@SpringBootApplication\n@DubboComponentScan(basePackages = &quot;com.alibaba.dubbo.test.service.impl&quot;)\npublic class ProviderTestApp {\n    // ...\n}\n</code></pre>\n<p>或者使用spring bean xml配置方式:</p>\n<pre><code>&lt;dubbo:annotation package=&quot;com.chanshuyi.service.impl&quot; /&gt;\n</code></pre>\n<h5>代码配置</h5>\n<pre><code>import com.alibaba.dubbo.rpc.config.ApplicationConfig;\nimport com.alibaba.dubbo.rpc.config.RegistryConfig;\nimport com.alibaba.dubbo.rpc.config.ProviderConfig;\nimport com.alibaba.dubbo.rpc.config.ServiceConfig;\nimport com.xxx.XxxService;\nimport com.xxx.XxxServiceImpl;\n\n// 服务实现\nXxxService xxxService = new XxxServiceImpl();\n\n// 当前应用配置\nApplicationConfig application = new ApplicationConfig();\napplication.setName(&quot;xxx&quot;);\n\n// 连接注册中心配置\nRegistryConfig registry = new RegistryConfig();\nregistry.setAddress(&quot;10.20.130.230:9090&quot;);\nregistry.setUsername(&quot;aaa&quot;);\nregistry.setPassword(&quot;bbb&quot;);\n\n// 服务提供者协议配置\nProtocolConfig protocol = new ProtocolConfig();\nprotocol.setName(&quot;dubbo&quot;);\nprotocol.setPort(12345);\nprotocol.setThreads(200);\n\n// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口\n\n// 服务提供者暴露服务配置\nServiceConfig&lt;XxxService&gt; service = new ServiceConfig&lt;XxxService&gt;(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏\nservice.setApplication(application);\nservice.setRegistry(registry); // 多个注册中心可以用setRegistries()\nservice.setProtocol(protocol); // 多个协议可以用setProtocols()\nservice.setInterface(XxxService.class);\nservice.setRef(xxxService);\nservice.setVersion(&quot;1.0.0&quot;);\n\n// 暴露及注册服务\nservice.export();\n</code></pre>\n<p>一般在spring应用中,不推荐使用这种方式。 具体的含义这里不做解释,可以通过github查看源码。</p>\n<h3>Provider 接口和实现</h3>\n<p>上面章节更多从配置角度出发,接下来通过一个完整的例子,来讲解下dubbo provider的完整使用。</p>\n<p>这个例子中只有一个服务UserReadService,有一个方法 getUserById。 需要将这个服务通过Dubbo暴露给远程的服务。具体的步骤如下:</p>\n<p>1.创建工程\n如果本来已经有工程,可以忽略。创建一个spring boot工程,可以通过 <a href=\"https://start.spring.io/\">https://start.spring.io/</a> 创建。\n2.定义接口\n定义接口:UserReadService</p>\n<pre><code>public interface UserReadService{\npublic User getUserById(Long userId);\n}\n</code></pre>\n<p>这个接口一般来说会放到独立的jar包里,作为client包。 其他应用要消费这个服务的时候,一般来说需要应用引用这个client包。(除了泛化调用)\n3.实现接口\n实现UserReadService, 当前实现部署在Provider的应用中。</p>\n<pre><code>public UserReadServiceImpl implements UserReadService{\n    public User getUserById(Long userId){\n        return xxx;\n    }\n}\n</code></pre>\n<p>4.Dubbo配置</p>\n<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;\n    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;\n    xmlns:dubbo=&quot;http://dubbo.apache.org/schema/dubbo&quot;\n    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd&quot;&gt;  \n    &lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;  \n    &lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;  \n    &lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;  \n    &lt;bean id=&quot;userReadService&quot; class=&quot;com.package.UserReadServiceImpl&quot;/&gt;\n    &lt;dubbo:service interface=&quot;com.package.UserReadService&quot; ref=&quot;userReadService&quot; /&gt;  \n&lt;/beans&gt;\n</code></pre>\n<p>Dubbo配置的其他方式可以参考上一章节的相关配置,或者使用集成dubbo spring boot starter方式。</p>\n",
-  "title": "Dubbo基础用法之Provider配置",
-  "keywords": "Dubbo, Provider, Configuration",
-  "description": "主要讲述如何配置dubbo,按照配置方式上可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。"
+  "link": "/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.html",
+  "meta": {
+    "title": "Dubbo基础用法之Provider配置",
+    "keywords": "Dubbo, Provider, Configuration",
+    "description": "主要讲述如何配置dubbo,按照配置方式上可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-compatible.json b/zh-cn/blog/dubbo-compatible.json
index bb651bd4..ba40f677 100644
--- a/zh-cn/blog/dubbo-compatible.json
+++ b/zh-cn/blog/dubbo-compatible.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-compatible.md",
   "__html": "<h1>Dubbo 2.7.x repackage后的兼容实现方案</h1>\n<p>Dubbo至加入Apache孵化器以来,一个很强的诉求就是需要rename groupId和package name,这两项工作在项目毕业前需要完成。其中rename package相对来说复杂一些,除了要修改所有类的包名为<code>org.apache.dubbo</code>外,更多的是需要考虑如何老版本的兼容性。</p>\n<p>常见的兼容性包括但不限于以下几种情况:</p>\n<ul>\n<li>用户API\n<ul>\n<li>编程API</li>\n<li>Spring注解</li>\n</ul>\n</li>\n<li>扩展SPI\n<ul>\n<li>扩展Filter</li>\n</ul>\n</li>\n</ul>\n<p>2.7.x里就是通过增加了一个新的模块<code>dubbo-compatible</code>来解决以上兼容性问题。</p>\n<h2>编程使用API</h2>\n<p>编程使用API是最直接最原始的使用方式,其他方式诸如Spring schema、注解等方式都是基于原始API的;因此非常有必要对API编程形式进行兼容。</p>\n<p>所有编程相关API的兼容代码均在<code>com.alibaba.dubbo.config</code>包下,下面我们看看几个常见API的兼容实现。</p>\n<h3>ApplicationConfig</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.config;\n\n<span class=\"hljs-meta\">@Deprecated</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ApplicationConfig</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">org</span>.<span class=\"hljs-title\">apache</span>.<span class=\"hljs-title\">dubbo</span>.<span class=\"hljs-title\">config</span>.<span class=\"hljs-title\">ApplicationConfig</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ApplicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">super</span>();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ApplicationConfig</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">super</span>(name);\n    }\n}\n</code></pre>\n<h3>ProtocolConfig</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.config;\n\n<span class=\"hljs-meta\">@Deprecated</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProtocolConfig</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">org</span>.<span class=\"hljs-title\">apache</span>.<span class=\"hljs-title\">dubbo</span>.<span class=\"hljs-title\">config</span>.<span class=\"hljs-title\">ProtocolConfig</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ProtocolConfig</span><span class=\"hljs-params\">()</span> </span>{\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ProtocolConfig</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">super</span>(name);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ProtocolConfig</span><span class=\"hljs-params\">(String name, <span class=\"hljs-keyword\">int</span> port)</span> </span>{\n        <span class=\"hljs-keyword\">super</span>(name, port);\n    }\n}\n</code></pre>\n<p>可以看到:</p>\n<ol>\n<li>兼容类是直接通过继续repacakge后的类,达到最大程度的代码复用;</li>\n<li>构造函数也需要保持兼容;</li>\n</ol>\n<p>整个兼容包中,除了上述API以外,包括一些常用的类比如<code>Constants</code>、<code>URL</code>以及绝大部分的兼容类都是通过简单的继承,让用户基于老的API实现的类能正确运行。</p>\n<h2>Spring注解</h2>\n<p>Spring注解诸如<code>@EnableDubbo</code>、<code>@Service</code>以及<code>@Reference</code>,由于不能使用继承,故这些注解类是通过代码拷贝来实现的;用于处理这些注解的Spring BeanPostProcessor以及Parser等相关的类,也是通过拷贝来实现;</p>\n<p>这类兼容代码分别位于兼容包的以下几个package中:</p>\n<ul>\n<li>com.alibaba.dubbo.config.annotation</li>\n<li>com.alibaba.dubbo.config.spring.context.annotation</li>\n<li>org.apache.dubbo.config.spring</li>\n</ul>\n<p>所以这里要特别强调的是,这类代码在2.7.x里存在2份,因此有修改的同时需要同步修改。</p>\n<h2>扩展SPI</h2>\n<p>Dubbo的SPI扩展机制,可以通过<a href=\"http://dubbo.apache.org/zh-cn/blog/introduction-to-dubbo-spi.html\">Dubbo可扩展机制实战</a>这篇博客详细了解。</p>\n<p>以Filter扩展为例,简单来说就是:</p>\n<ol>\n<li>\n<p>MyFilter需要实现Filter接口</p>\n</li>\n<li>\n<p>在META-INF/dubbo下,增加META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,内容为:</p>\n<pre><code>myFilter=com.test.MyFilter\n</code></pre>\n</li>\n</ol>\n<p>看似简单的两点,对Dubbo框架来说,需要:</p>\n<ol>\n<li>正确加载配置文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter</li>\n<li>正确加载MyFilter类并执行invoke方法</li>\n</ol>\n<p>下面分别介绍Dubbo框架怎么实现以上几点。</p>\n<h3>正确加载META-INF/dubbo/com.alibaba.dubbo.rpc.Filter</h3>\n<p>Dubbo SPI机制在查找配置文件时,是根据扩展点的类名来查找的,以Filter为例,在包名变为org.apache.dubbo后,查询的目录变成:</p>\n<ul>\n<li>META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter</li>\n<li>META-INF/dubbo/org.apache.dubbo.rpc.Filter</li>\n<li>META-INF/services/org.apache.dubbo.rpc.Filter</li>\n</ul>\n<p>但是用户之前按老的包实现的Filter,其配置是放在类似<code>META-INF/dubbo/com.alibaba.dubbo.rpc.Filter</code>的,如果框架不做特殊处理,是不会加载老配置的。</p>\n<p>因此在<code>ExtensionLoader</code>这个类里,做了特殊的处理:</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-comment\">// synchronized in getExtensionClasses</span>\n    <span class=\"hljs-keyword\">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {\n        <span class=\"hljs-keyword\">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);\n        <span class=\"hljs-keyword\">if</span> (defaultAnnotation != <span class=\"hljs-keyword\">null</span>) {\n            String value = defaultAnnotation.value();\n            <span class=\"hljs-keyword\">if</span> ((value = value.trim()).length() &gt; <span class=\"hljs-number\">0</span>) {\n                String[] names = NAME_SEPARATOR.split(value);\n                <span class=\"hljs-keyword\">if</span> (names.length &gt; <span class=\"hljs-number\">1</span>) {\n                    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"more than 1 default extension name on extension \"</span> + type.getName()\n                            + <span class=\"hljs-string\">\": \"</span> + Arrays.toString(names));\n                }\n                <span class=\"hljs-keyword\">if</span> (names.length == <span class=\"hljs-number\">1</span>) cachedDefaultName = names[<span class=\"hljs-number\">0</span>];\n            }\n        }\n\n        Map&lt;String, Class&lt;?&gt;&gt; extensionClasses = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Class&lt;?&gt;&gt;();\n        loadDirectory(extensionClasses, DUBBO_INTERNAL_DIRECTORY, type.getName());\n        loadDirectory(extensionClasses, DUBBO_INTERNAL_DIRECTORY, type.getName().replace(<span class=\"hljs-string\">\"org.apache\"</span>, <span class=\"hljs-string\">\"com.alibaba\"</span>));\n        loadDirectory(extensionClasses, DUBBO_DIRECTORY, type.getName());\n        loadDirectory(extensionClasses, DUBBO_DIRECTORY, type.getName().replace(<span class=\"hljs-string\">\"org.apache\"</span>, <span class=\"hljs-string\">\"com.alibaba\"</span>));\n        loadDirectory(extensionClasses, SERVICES_DIRECTORY, type.getName());\n        loadDirectory(extensionClasses, SERVICES_DIRECTORY, type.getName().replace(<span class=\"hljs-string\">\"org.apache\"</span>, <span class=\"hljs-string\">\"com.alibaba\"</span>));\n        <span class=\"hljs-keyword\">return</span> extensionClasses;\n    }\n</code></pre>\n<p>可以看到,除了加载新配置外,老配置文件也会进行扫描。</p>\n<h3>正确加载MyFilter类</h3>\n<p><code>com.alibaba.dubbo.rpc.Filter</code>接口除了要继承自<code>org.apache.dubbo.rpc.Filter</code>以外,其唯一的方法invoke也需要做特殊处理。我们看看它的方法签名:</p>\n<p><code>Result invoke(Invoker&lt;?&gt; invoker, Invocation invocation) throws RpcException;</code></p>\n<p>这里参数、返回值、异常都会被实现类<code>MyFilter</code>用到,因此这些类也需要有兼容类;而参数、返回值不同,对于接口来说是不同的方法,因此:</p>\n<ul>\n<li>需要在com.alibaba.dubbo.rpc.Filter里,定义老的invoke方法,MyFilter会覆盖这个方法;</li>\n<li>org.apache.dubbo.rpc.Filter里的invoke方法,需要找一个地方来实现桥接,框架调用Filter链执行到新的invoke方法时,新的参数如何转换成老参数,老返回值如何转换成新的返回值;</li>\n</ul>\n<p>这里就用到了JDK8的新特性:接口default方法。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Deprecated</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Filter</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">org</span>.<span class=\"hljs-title\">apache</span>.<span class=\"hljs-title\">dubbo</span>.<span class=\"hljs-title\">rpc</span>.<span class=\"hljs-title\">Filter</span> </span>{\n\n    <span class=\"hljs-function\">Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n\n    <span class=\"hljs-keyword\">default</span> org.apache.dubbo.rpc.<span class=\"hljs-function\">Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(org.apache.dubbo.rpc.Invoker&lt;?&gt; invoker,\n                                               org.apache.dubbo.rpc.Invocation invocation)</span>\n            <span class=\"hljs-keyword\">throws</span> org.apache.dubbo.rpc.RpcException </span>{\n        Result.CompatibleResult result = (Result.CompatibleResult) invoke(<span class=\"hljs-keyword\">new</span> Invoker.CompatibleInvoker&lt;&gt;(invoker),\n                <span class=\"hljs-keyword\">new</span> Invocation.CompatibleInvocation(invocation));\n        <span class=\"hljs-keyword\">return</span> result.getDelegate();\n    }\n}\n</code></pre>\n<p>可以看到,default方法里,对参数进行了包装,然后调用老的invoke方法,并将返回值进行解包后返回给Dubbo框架。这里Result.CompatibleResult、Invocation.CompatibleInvocation以及Invoker.CompatibleInvoker都用到了代理模式。</p>\n<p>感兴趣的同学可以详细看一下以下几个类:</p>\n<ul>\n<li>com.alibaba.dubbo.rpc.Invocation</li>\n<li>com.alibaba.dubbo.rpc.Invoker</li>\n<li>com.alibaba.dubbo.rpc.Result</li>\n</ul>\n<h2>后续todo list</h2>\n<p>目前兼容包仅仅是对常见的API及SPI做了支持,列表如下:</p>\n<ul>\n<li>com.alibaba.dubbo.rpc.Filter / Invocation / Invoker / Result / RpcContext / RpcException</li>\n<li>com.alibaba.dubbo.config.*Config</li>\n<li>com.alibaba.dubbo.config.annotation.Reference / Service</li>\n<li>com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo</li>\n<li>com.alibaba.dubbo.common.Constants / URL</li>\n<li>com.alibaba.dubbo.common.extension.ExtensionFactory</li>\n<li>com.alibaba.dubbo.common.serialize.Serialization / ObjectInput / ObjectOutput</li>\n<li>com.alibaba.dubbo.cache.CacheFactory / Cache</li>\n<li>com.alibaba.dubbo.rpc.service.EchoService / GenericService</li>\n</ul>\n<p>大家如果在试用的过程中发现有任何问题请及时提出;同时如果对其他扩展点有兼容需求,也请大家提出来,也非常欢迎大家自己解决并贡献出来。</p>\n",
-  "title": "Dubbo 2.7.x repackage后的兼容实现方案",
-  "keywords": "Dubbo, repackage, 兼容",
-  "description": "本文简单描述了2.7.x repackage后对老版本的兼容性实现方案。"
+  "link": "/zh-cn/blog/dubbo-compatible.html",
+  "meta": {
+    "title": "Dubbo 2.7.x repackage后的兼容实现方案",
+    "keywords": "Dubbo, repackage, 兼容",
+    "description": "本文简单描述了2.7.x repackage后对老版本的兼容性实现方案。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-contribue-to-opensource.json b/zh-cn/blog/dubbo-contribue-to-opensource.json
index e0d8f693..7b9cb12f 100644
--- a/zh-cn/blog/dubbo-contribue-to-opensource.json
+++ b/zh-cn/blog/dubbo-contribue-to-opensource.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-contribue-to-opensource.md",
   "__html": "<h1>以Dubbo为例,聊聊如何向开源项目做贡献</h1>\n<p>Github 上有众多优秀的开源项目,大多数 IT 从业者将其当做了予取予求的工具库,遇到什么需求,先去 Github 搜一把,但有没有想过有一天自己也可以给开源事业做一些贡献呢?本文将会以 incubator-dubbo 项目为例,向你阐释,给开源项目做贡献并不是一件难事。</p>\n<h2>1 为何要给开源贡献力量</h2>\n<p>为开源项目做贡献得到的收益是多方面的,为了让你有足够的信心加入到开源项目中,我在文章最开始列举出它的诸多好处。</p>\n<h3>1.1 巩固技能</h3>\n<p>无论你是提交代码,撰写文档,提交 Issue,组织活动,当你切身参与到一个开源项目中,相关的技能都会得到历练,并且在开源项目中找到自己的位置。一方面,日常工作中我们中的大多数人接触到的是业务场景,并没有太多机会接触到基础架构组件,开源项目为我们提供了一个平台,在这里,你可以尽情挑选自己熟悉的项目为它添砖加瓦(以 Dubbo 为例,并不是所有 IT 公司都有能力自研服务治理框架);另一方面,你所提交的代码,会有管理员协助审核,他们会给出专业的建议,更好的代码规范以及更优的编程思路最终都会变成你的经验。</p>\n<h3>1.2 结交朋友</h3>\n<p>开源社区为你提供了一个平台,在这里,你可以认识很多纯粹的技术爱好者,开源贡献者是最符合 geek 定义的那群人,你所接触到的往往是某个领域最厉害的那批人。</p>\n<h3>1.3 建立口碑</h3>\n<p>这是一个很好的展示个人实力的地方,俗话说:talk is cheap,show me the code. 作为技术人员,没有什么比一个漂亮的 Github 主页更有说服力的了。如果你能够为开源项目做出可观的贡献,你也将收获到业界的知名度,此时开源项目的成就和你是密不可分的。</p>\n<h3>1.4 传承开源精神</h3>\n<p>只有源源不断的贡献者给开源项目添砖加瓦,才可以为 Github 一类的开源社区形成良好的开源风气。否则,只有输出没有输入,开源会失去活力。</p>\n<h3>1.5 养成习惯</h3>\n<p>相信我,一旦养成了每天提交代码的习惯,就像你不想中断打卡一样,你绝不想中断 commit。不止有英语打卡,健身打卡,还有开源打卡!</p>\n<p><img src=\"http://ov0zuistv.bkt.clouddn.com/image-20180827141007663.png\" alt=\"开源程序员的日常\"></p>\n<h2>2 贡献代码时的一些疑难杂症</h2>\n<p>如果你是一名开源界的新手,可能会对贡献的流程心生畏惧。比如:我该怎么修改代码并提交?我的代码要是存在bug怎么办?我的代码别人会不会很 low?我该如何寻找合适的开源项目?开源社区那么多的工具和词汇都是什么意思?</p>\n<p>文章的第二部分将从一个<strong>小白</strong>的角度,介绍一下开源中的一些常见问题。</p>\n<h3>2.1 git 常规操作</h3>\n<p>一般而言,我们选择使用 git 来作为版本管理的工具,你不一定要非常熟练的使用它,在我看来掌握 clone,add,commit,pull,push 即可,遇到复杂的场景,你还有谷歌。</p>\n<p><strong>fork 与 clone</strong></p>\n<p><img src=\"http://ov0zuistv.bkt.clouddn.com/image-20180827143942178.png\" alt=\"fork 与 clone\"></p>\n<p>如果你只是想下载源码,查看他的源码实现,使用 Clone or download 按钮即可。</p>\n<p>如果你想要给开源项目做改动,并且最终请求合并,让开源项目存在你贡献的代码,就应该使用 fork。</p>\n<p>fork 将会复制一份当前主分支的代码进入到你的仓库中,之后你所有的修改,应当基于自己的仓库进行,在功能开发/bug 修复之后,可以使用你的仓库向源仓库提交 pull request。只有源仓库的管理员才有权利合并你的请求。</p>\n<p>一些可能对你有帮助的高级指令。</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">#</span><span class=\"bash\"> 设置源仓库</span>\ngit remote add upstream https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 拉取源仓库的更新</span>\ngit fetch upstream\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 将自己仓库的主分支合并源仓库的更新</span>\ngit checkout master\ngit merge upstream/master\n</code></pre>\n<p><strong>pull request</strong></p>\n<p><img src=\"http://ov0zuistv.bkt.clouddn.com/image-20180827150703869.png\" alt=\"pull request\"></p>\n<p>pull request 经常被缩写为 PR,指的是一次向源仓库请求合并的行为,如上是我 fork 了 incubator-dubbo 的仓库之后才存在的操作按钮。</p>\n<p><strong>源仓库视角的 pull request</strong></p>\n<p><img src=\"http://ov0zuistv.bkt.clouddn.com/image-20180827155239155.png\" alt=\"pull request management\"></p>\n<p>管理者会对 pull request 涉及的改动进行 review,以确保你的代码是符合规范的,逻辑有没有偏差,以及符合框架的功能需求。</p>\n<h3>2.2 Travis CI</h3>\n<p>一些自动化的 CI 流程被植入在每一次 pull request 的构建之中,用于给开源仓库去校验提交者的代码是否符合既定的规范,如:是否有编译问题,单元测试是否通过,覆盖率是否达标,代码风格是否合规等等。</p>\n<p><img src=\"http://ov0zuistv.bkt.clouddn.com/image-20180827160503114.png\" alt=\"CI报告\"></p>\n<p>一般情况下,必须通过 CI,你的 pull request 才会被管理 review。</p>\n<h3>2.3 Mailing list</h3>\n<p>每个开源项目都会有自己的贡献规范,可以参考首页的 Contributing,来获取具体的信息。incubator-dubbo 作为一个孵化中的 apache 项目,遵守了 apache 的传统,在 <a href=\"https://github.com/apache/incubator-dubbo/blob/master/CONTRIBUTING.md\">Contributing</a> 中描述道:当你有新特性想要贡献给 Dubbo 时,官方推荐使用 Mailing list 的方式描述一遍你想要做的改动。</p>\n<p>Mailing list 简单来说,就是一个邮件通知机制,所有的 Dubbo 开发者都会订阅该邮箱:dev@dubbo.incubator.apache.org。有任何新特性的改动,或者什么建议想要通知其他开发者,都可以通过向该邮箱发送邮件来达到这个目的,相同地,你也会收到其转发的其他开发者的邮件。</p>\n<p>或者你是一个 Dubbo 的使用者,你想要得知开发者的改造方向,也可以订阅,这个<a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide\">指南</a>可以帮助你订阅 Dubbo 的 Mailing list。</p>\n<blockquote>\n<p>作为一个 modern developer,你可能觉得 mailing list 的交流方式存在滞后性,这样的沟通方式不是特别的高效,但它作为 apache 项目的推荐交流方式存在其特殊的原因,在此不多赘述。总之遵循一个原则:bug fix或者讨论,可以在 github issue 中进行,影响较大的特性和讨论则推荐在 mailing list 中展开。</p>\n</blockquote>\n<h2>3 其他贡献形式</h2>\n<p>不仅仅只有贡献代码,修复 bug 等行为才算作为开源做贡献,以下这些行为也属于主要形式:</p>\n<h3>3.1 撰写文档</h3>\n<p><a href=\"http://dubbo.apache.org/zh-cn/\">Dubbo文档</a>是其开源组成成分的重要一环,其内容源文件位于:<a href=\"https://github.com/apache/incubator-dubbo-website%E3%80%82%E5%90%8C%E6%A0%B7%E4%B9%9F%E6%98%AF%E4%B8%80%E4%B8%AA\">https://github.com/apache/incubator-dubbo-website。同样也是一个</a> Git 仓库,任何你想要对 dubbo 知识点的补充,都可以在这儿提交 pull request,只需要一些 markdown 的语法知识,和一些可有可无的 npm 语法即可。如果你觉得贡献代码对于现在的自己仍然有点难度,不妨从贡献文档开始接触开源。</p>\n<h3>3.2 ISSUE</h3>\n<p>无论是 Github 中的 Issue 还是 mailing list 中的讨论,无论是提出问题,汇报 bug,还是回答问题(bugfix 则不仅仅需要 Issue 了),协助管理者 review pull request,都是贡献的一种形式,勿以善小而不为。</p>\n<h3>3.3 其他行为</h3>\n<p>任何你能够想到的,可以帮助开源项目变得更好的的行为,都属于开源贡献。例如,给每个 Issue 打上合适的 tag,关闭重复的 Issue,链接相关联的 Issue,线下组织沙龙,回答 Stack Overflow 上相关的问题,以及文档中一个错别字的修改等等。</p>\n<h2>4 开源最佳实践</h2>\n<h3>4.1 有效沟通</h3>\n<p>无论你处于什么样的目的:仅仅是一次性的贡献,亦或是永久性的加入社区,都的和他人进行沟通和交往,这是你要在开源圈发展必须修炼的技能。</p>\n<p>在你开启一个isse或PR之前,或者是在聊天室问问题之前,请牢记下面所列出的几点建议,会让你的工作更加的高效。</p>\n<p><strong>给出上下文</strong> 以便于让其他人能够快速的理解。比方说你运行程序时遇到一个错误,要解释你是如何做的,并描述如何才能再现错误现象。又比方说你是提交一个新的想法,要解释你为什么这么想,对于项目有用处吗(不仅仅是只有你!)</p>\n<blockquote>\n<p>😇 <em>“当我做 Y 的时候 X 不能工作”</em></p>\n<p>😢 <em>“X 出问题! 请修复它。”</em></p>\n</blockquote>\n<p><strong>在进一步行动前,做好准备工作。</strong> 不知道没关系,但是要展现你尝试过、努力过。在寻求帮助之前,请确认阅读了项目的 README、文档、问题(开放的和关闭的)、邮件列表,并搜索了网络。当你表现出很强烈的求知欲的时候,人们是非常欣赏这点的,会很乐意的帮助你。</p>\n<blockquote>\n<p>😇 <em>“我不确定 X 是如何实现的,我查阅了相关的帮助文档,然而毫无所获。”</em></p>\n<p>😢 <em>“我该怎么做 X ?”</em></p>\n</blockquote>\n<p><strong>保持请求内容短小而直接。</strong> 正如发送一份邮件,每一次的贡献,无论是多么的简单,都是需要他人去查阅的。很多项目都是请求的人多,提供帮助的人少。相信我,保持简洁,你能得到他人帮助的机会会大大的增加。</p>\n<blockquote>\n<p>😇 <em>“我很乐意写 API 教程。”</em></p>\n<p>😢 <em>” 有一天我驾驶汽车行驶在高速公路上,在某个加油站加油的时候,突发奇想,我们应该这么做,不过在我进一步解释之前,我先和大家展示一下。。。”</em></p>\n</blockquote>\n<p><strong>让所有的沟通都是在公开场合下进行。</strong> 哪怕是很不起眼的小事,也不要去给维护者发私信,除非是你要分享一些敏感信息(诸如安全问题或严重的过失)。你若能够保持谈话是公开的,很多人可以你们交换的意见中学习和受益。</p>\n<blockquote>\n<p>😇 <em>(评论) “@维护者 你好!我们该如何处理这个PR?”</em></p>\n<p>😢 <em>(邮件) “你好,非常抱歉给发信,但是我实在很希望你能看一下我提交的PR。”</em></p>\n</blockquote>\n<p><strong>大胆的提问(但是要谨慎!)。</strong> 每个人参与社区,开始的时候都是新手,哪怕是非常有经验的贡献者也一样,在刚进入一个新的项目的时候,也是新手。出于同样的原因,甚至长期维护人员并不总是熟悉一个项目的每一部分。给他们同样的耐心,你也会得到同样的回报。</p>\n<blockquote>\n<p>😇 <em>“感谢查看了这个错误,我按照您的建议做了,这是输出结果。”</em></p>\n<p>😢 <em>“你为什么不修复我的问题?这难道不是你的项目吗?”</em></p>\n</blockquote>\n<p><strong>尊重社区的决定。</strong> 你的想法可能会和社区的优先级、愿景等有差异,他们可能对于你的想法提供了反馈和最后的决定的理由,这时你应该去积极的讨论,并寻求妥协的办法,维护者必须慎重的考虑你的想法。但是如果你实在是不能同意社区的做法,你可以坚持自己!保持自己的分支,或者另起炉灶。</p>\n<blockquote>\n<p>😇 <em>“你不能支持我的用例,我蛮失望,但是你的解释仅仅是对一小部分用户起作用,我理解是为什么。感谢你的耐心倾听。”</em></p>\n<p>😢 <em>“你为什么不支持我的用例?这是不可接受的!”</em></p>\n</blockquote>\n<p><strong>以上几点,要铭记在心。</strong> 开源是由来自世界各地的人们共同协作实现的。面临的问题是跨语言、跨文化、不同的地理为止、不同的时区,另外,撰写文字的沟通更是难上加难,无法传达语气和情绪。请让这些会话都充满善意吧!在以下情形中请保持礼貌:推动一个想法、请求更多的上下文、进一步澄清你的立场。既然你在互联网找到了自己的所需,那么请尝试让它变得更好!</p>\n<h3>4.2 创建 issue</h3>\n<p>你应该在遇到下列情况下,去创建一个 issue:</p>\n<ul>\n<li>报告你自己无法解决的错误</li>\n<li>讨论一个高级主题或想法</li>\n<li>期望实现某新的特性,或者其它项目的想法</li>\n</ul>\n<p>在 issue 的沟通中几点实用的技巧:</p>\n<ul>\n<li><strong>如果你刚好看到一个开放的issue,恰是你打算解决的,</strong> 添加评论,告诉他人你将对此展开工作,并及时响应。这样的话,可以避免他人重复劳动。</li>\n<li><strong>如果说某个issue已经开放很久了,</strong> 这可能是已经有人正在解决中,又或者是早已经解决过了,所以也请添加评论,在打算开始工作之前,最好是确认一下。</li>\n<li><strong>如果你创建了一个issue,但是没多久自己解决了,</strong> 也要添加评论,让其他人知道,然后关闭该issue。记录本身就是对社区的贡献。</li>\n</ul>\n<h3>4.3 创建 pull request</h3>\n<p>在下面的情形时,请你务必使用 PR:</p>\n<ul>\n<li>提交补丁 (例如,纠正拼写错误、损坏的链接、或者是其它较明显的错误)</li>\n<li>开始一项别人请求的任务,或者是过去在issue中早就讨论过的</li>\n</ul>\n<p>一个 PR 并不代表着工作已经完成。它通常是尽早的开启一个PR,是为了其他人可以观看或者给作者反馈意见。只需要在子标题标记为“WIP”(正在进行中)。作者可以在后面添加很多评论。</p>\n<p>如果说项目是托管在 GitHub上的,以下是我们总结出的提交RP的建议:</p>\n<ul>\n<li><strong>Fork 代码仓库</strong> 并克隆到本地,在本地的仓库配置“上游”为远端仓库。这样你可以在提交你的PR时保持和“上游”同步,会减少很多解决冲突的时间。(更多关于同步的说明,请参考<a href=\"https://help.github.com/articles/syncing-a-fork/\">这里</a>.)</li>\n<li><strong>创建一个分支</strong> 用于自己编辑。</li>\n<li><strong>参考任何相关的issue</strong> 或者在你的RP中支持文档(比如. “Closes #37.”)</li>\n<li><strong>包含之前和之后的快照</strong> 如果你的改动是包含了不同的 HTML/CSS。在你的PR中拖拉相应的图片。</li>\n<li><strong>测试你的改动!</strong> 若测试用例存在的话,跑一遍,以覆盖你的更改,若没有的话,则创建相应的用例。无论测试是否存在,一定要确保你的改动不会破坏掉现有的项目。</li>\n<li><strong>和项目现有的风格保持一致</strong> 尽你最大的努力,这也就是意味着在使用缩进、分号、以及注释很可能和你自己的风格大相径庭,但是为了节省维护者的精力,以及未来他人更好的理解和维护,还请你容忍一下。</li>\n</ul>\n<h2>5 成为一个开源贡献者</h2>\n<p>如果你有志于参与开源事业,可以尝试从自己最熟悉的项目开始,开源并不是属于高级开发者的专属词汇,它就是由你我这样的人在需求,修复,构建中演进下去的。Let's try it !</p>\n",
-  "title": "以Dubbo为例,聊聊如何向开源项目做贡献",
-  "keywords": "Dubbo, opensource",
-  "description": "本文将会以 incubator-dubbo 项目为例向你阐释,给开源项目做贡献并不是一件难事"
+  "link": "/zh-cn/blog/dubbo-contribue-to-opensource.html",
+  "meta": {
+    "title": "以Dubbo为例,聊聊如何向开源项目做贡献",
+    "keywords": "Dubbo, opensource",
+    "description": "本文将会以 incubator-dubbo 项目为例向你阐释,给开源项目做贡献并不是一件难事"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-generic-invoke.json b/zh-cn/blog/dubbo-generic-invoke.json
index 0f97f025..2bb28e8f 100644
--- a/zh-cn/blog/dubbo-generic-invoke.json
+++ b/zh-cn/blog/dubbo-generic-invoke.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-generic-invoke.md",
   "__html": "<h1>Dubbo的泛化调用</h1>\n<p>以下几种场景可以考虑使用泛化调用:</p>\n<ul>\n<li>服务测试平台</li>\n<li>API 服务网关</li>\n</ul>\n<p>泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 <code>Map</code> 表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。</p>\n<p>下面来看看消费端如何使用泛化调用进行服务调用。</p>\n<h2>通过 Spring XML 配置进行泛化调用</h2>\n<p>在 Spring 配置申明 <code>generic=&quot;true&quot;</code>,如:</p>\n<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\">\"userService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.IUserService\"</span> <span class=\"hljs-attr\">generic</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n</code></pre>\n<p>需要使用的地方,通过强制类型转化为 GenericService 进行调用:</p>\n<pre><code class=\"language-java\">GenericService userService = (GenericService) context.getBean(<span class=\"hljs-string\">\"userService\"</span>);\n<span class=\"hljs-comment\">// primary param and return value</span>\nString name = (String) userService.$invoke(<span class=\"hljs-string\">\"delete\"</span>, <span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-keyword\">int</span>.class.getName()}, <span class=\"hljs-keyword\">new</span> Object[]{<span class=\"hljs-number\">1</span>});\nSystem.out.println(name);\n</code></pre>\n<p>其中:</p>\n<ol>\n<li>GenericService 这个接口只有一个方法,名为 <code>$invoke</code>,它接受三个参数,分别为方法名、方法参数类型数组和参数值数组;</li>\n<li>对于方法参数类型数组\n<ol>\n<li>如果是基本类型,如 int 或 long,可以使用 <code>int.class.getName()</code>获取其类型;</li>\n<li>如果是基本类型数组,如 int[],则可以使用 <code>int[].class.getName()</code>;</li>\n<li>如果是 POJO,则直接使用全类名,如 <code>com.alibaba.dubbo.samples.generic.api.Params</code>。</li>\n</ol>\n</li>\n</ol>\n<h2>通过 API 编程进行泛化调用</h2>\n<pre><code>ApplicationConfig application = new ApplicationConfig()ApplicationConfig application = new ApplicationConfig();\napplication.setName(&quot;api-generic-consumer&quot;);\n\nRegistryConfig registry = new RegistryConfig();\nregistry.setAddress(&quot;zookeeper://127.0.0.1:2181&quot;);\n\napplication.setRegistry(registry);\n\nReferenceConfig&lt;GenericService&gt; reference = new ReferenceConfig&lt;GenericService&gt;();\n// 弱类型接口名\nreference.setInterface(&quot;com.alibaba.dubbo.samples.generic.api.IUserService&quot;);\n// 声明为泛化接口\nreference.setGeneric(true);\n\nreference.setApplication(application);\n\n// 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用\nGenericService genericService = reference.get();\n\nString name = (String) genericService.$invoke(&quot;delete&quot;, new String[]{int.class.getName()}, new Object[]{1});\nSystem.out.println(name);\n</code></pre>\n<p>通过 API 的方式,不需要像 XML 的方式需要提前将服务配置好,可以动态构建 ReferenceConfig;相对 XML 来说,API 的方式更常见。</p>\n<h2>参数或返回值是 POJO 的场景</h2>\n<p>比如方法签名是 <code>User get(Params params);</code>其中 User 有 id 和 name 两个属性,Params 有 query 一个属性。</p>\n<p>以下是消费端的调用代码:</p>\n<pre><code class=\"language-java\">String[] parameterTypes = <span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.Params\"</span>};\nMap&lt;String, Object&gt; params = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;();\nparam.put(<span class=\"hljs-string\">\"class\"</span>, <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.Params\"</span>);\nparam.put(<span class=\"hljs-string\">\"query\"</span>, <span class=\"hljs-string\">\"a=b\"</span>);\nObject user = userService.$invoke(<span class=\"hljs-string\">\"get\"</span>, parameterTypes, <span class=\"hljs-keyword\">new</span> Object[]{param});\nSystem.out.println(<span class=\"hljs-string\">\"sample one result: \"</span> + user);\n</code></pre>\n<p>上述代码的输出结果为:</p>\n<pre><code class=\"language-shell\">sample one result: {name=charles, id=1, class=com.alibaba.dubbo.samples.generic.api.User}\n</code></pre>\n<p>这里,Dubbo 框架会自动将 POJO 的返回值转换成 Map。可以看到,返回值 <code>user</code> 是一个 HashMap,里面分别存放了 name、id、class 三个 k/v。</p>\n<h4>泛接口实现</h4>\n<p>泛接口实现方式主要用于服务端没有 API 接口的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,如实现一个通用的远程服务 Mock 框架,可通过实现 GenericService 接口处理所有服务请求。</p>\n<h3>服务端实现 GenericService</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GenericServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GenericService</span> </span>{\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-keyword\">public</span> Object $invoke(String method, String[] parameterTypes, Object[] args) <span class=\"hljs-keyword\">throws</span> GenericException {\n        <span class=\"hljs-keyword\">if</span> (method.equals(<span class=\"hljs-string\">\"hi\"</span>)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hi, \"</span> + args[<span class=\"hljs-number\">0</span>];\n        } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (method.equals(<span class=\"hljs-string\">\"hello\"</span>)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + args[<span class=\"hljs-number\">0</span>];\n        }\n\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"welcome\"</span>;\n    }\n}\n</code></pre>\n<h3>服务端暴露服务</h3>\n<pre><code class=\"language-java\">ApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"api-generic-provider\"</span>);\n\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n\napplication.setRegistry(registry);\n\nGenericService genericService = <span class=\"hljs-keyword\">new</span> GenericServiceImpl();\n\nServiceConfig&lt;GenericService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\nservice.setApplication(application);\nservice.setInterface(<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.HelloService\"</span>);\nservice.setRef(genericService);\nservice.export();\n\nServiceConfig&lt;GenericService&gt; service2 = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\nservice2.setApplication(application);\nservice2.setInterface(<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.generic.api.HiService\"</span>);\nservice2.setRef(genericService);\nservice2.export();\n</code></pre>\n<p>同样,也可以使用 XML 配置的方式暴露服务;此时服务端是没有依赖 HiService 和 HelloService 这两个接口的。</p>\n<h3>消费端进行服务调用</h3>\n<pre><code class=\"language-java\">ApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"api-generic-consumer\"</span>);\n\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n\napplication.setRegistry(registry);\n\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// 弱类型接口名</span>\nreference.setInterface(HiService.class);\nreference.setApplication(application);\n\nHiService hiService = (HiService) reference.get();\nSystem.out.println(hiService.hi(<span class=\"hljs-string\">\"dubbo\"</span>));\n\nReferenceConfig&lt;GenericService&gt; reference2 = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// 弱类型接口名</span>\nreference2.setInterface(HelloService.class);\nreference2.setApplication(application);\n\nHelloService helloService = (HelloService) reference2.get();\nSystem.out.println(helloService.hello(<span class=\"hljs-string\">\"community\"</span>));\n</code></pre>\n<p>同样,消费端也可以使用 XML 配置的方式引用服务,然后进行调用。这里可以看到调用方式为普通的服务调用,并非泛化调用。当然使用泛化调用也是可以的。</p>\n<p>到这里为止,一个简易的服务 Mock 平台就成功上线了!</p>\n<h2>其他</h2>\n<ul>\n<li>本文介绍的泛化调用和泛接口实现,都是在原生的 <code>Dubbo</code> 协议之上的。在 2.6.2 版本之前,其他协议如 http/hessian 等是不支持泛化调用的,2.6.3 版本将会对这两个协议的泛化调用做支持。</li>\n<li>本文中提到的相关示例代码可以在 dubbo-samples中找到:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-generic\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-generic</a></li>\n</ul>\n",
-  "title": "Dubbo的泛化调用",
-  "keywords": "Dubbo, Generic invoke",
-  "description": "本文介绍了 Dubbo 泛化调用的使用场景及相关示例"
+  "link": "/zh-cn/blog/dubbo-generic-invoke.html",
+  "meta": {
+    "title": "Dubbo的泛化调用",
+    "keywords": "Dubbo, Generic invoke",
+    "description": "本文介绍了 Dubbo 泛化调用的使用场景及相关示例"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-integrate-with-hystrix.json b/zh-cn/blog/dubbo-integrate-with-hystrix.json
index f4c23896..e26a539e 100644
--- a/zh-cn/blog/dubbo-integrate-with-hystrix.json
+++ b/zh-cn/blog/dubbo-integrate-with-hystrix.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-integrate-with-hystrix.md",
   "__html": "<h1>Spring应用快速集成Dubbo + Hystrix</h1>\n<h2>背景</h2>\n<p>Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。</p>\n<p>Dubbo是Alibaba开源的,目前国内最流行的java rpc框架。</p>\n<p>本文介绍在spring应用里,怎么把Dubbo和Hystrix结合起来使用。</p>\n<ul>\n<li><a href=\"https://github.com/Netflix/Hystrix\">https://github.com/Netflix/Hystrix</a></li>\n<li><a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a></li>\n</ul>\n<h2>Spring Boot应用</h2>\n<p>Demo地址: <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-spring-boot-hystrix\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-spring-boot-hystrix</a></p>\n<h3>生成dubbo集成spring boot的应用</h3>\n<p>对于不熟悉dubbo 集成spring boot应用的同学,可以在这里直接生成dubbo + spring boot的工程: <a href=\"http://start.dubbo.io/\">http://start.dubbo.io/</a></p>\n<h3>配置spring-cloud-starter-netflix-hystrix</h3>\n<p>spring boot官方提供了对hystrix的集成,直接在pom.xml里加入依赖:</p>\n<pre><code>        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-starter-netflix-hystrix&lt;/artifactId&gt;\n            &lt;version&gt;1.4.4.RELEASE&lt;/version&gt;\n        &lt;/dependency&gt;\n</code></pre>\n<p>然后在Application类上增加<code>@EnableHystrix</code>来启用hystrix starter:</p>\n<pre><code>@SpringBootApplication\n@EnableHystrix\npublic class ProviderApplication {\n</code></pre>\n<h3>配置Provider端</h3>\n<p>在Dubbo的Provider上增加<code>@HystrixCommand</code>配置,这样子调用就会经过Hystrix代理。</p>\n<pre><code>@Service(version = &quot;1.0.0&quot;)\npublic class HelloServiceImpl implements HelloService {\n    @HystrixCommand(commandProperties = {\n                    @HystrixProperty(name = &quot;circuitBreaker.requestVolumeThreshold&quot;, value = &quot;10&quot;),\n                    @HystrixProperty(name = &quot;execution.isolation.thread.timeoutInMilliseconds&quot;, value = &quot;2000&quot;) })\n    @Override\n    public String sayHello(String name) {\n        // System.out.println(&quot;async provider received: &quot; + name);\n        // return &quot;annotation: hello, &quot; + name;\n        throw new RuntimeException(&quot;Exception to show hystrix enabled.&quot;);\n    }\n}\n</code></pre>\n<h3>配置Consumer端</h3>\n<p>对于Consumer端,则可以增加一层method调用,并在method上配置<code>@HystrixCommand</code>。当调用出错时,会走到<code>fallbackMethod = &quot;reliable&quot;</code>的调用里。</p>\n<pre><code>    @Reference(version = &quot;1.0.0&quot;)\n    private HelloService demoService;\n\n    @HystrixCommand(fallbackMethod = &quot;reliable&quot;)\n    public String doSayHello(String name) {\n        return demoService.sayHello(name);\n    }\n    public String reliable(String name) {\n        return &quot;hystrix fallback value&quot;;\n    }\n</code></pre>\n<p>通过上面的配置,很简单地就完成了Spring Boot里Dubbo + Hystrix的集成。</p>\n<h2>传统Spring Annotation应用</h2>\n<p>Demo地址: <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-spring-hystrix\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-spring-hystrix</a></p>\n<p>传统spring annotation应用的配置其实也很简单,和spring boot应用不同的是:</p>\n<ol>\n<li>显式配置Spring AOP支持:<code>@EnableAspectJAutoProxy</code></li>\n<li>显式通过<code>@Configuration</code>配置<code>HystrixCommandAspect</code> Bean。</li>\n</ol>\n<pre><code>    @Configuration\n    @EnableDubbo(scanBasePackages = &quot;com.alibaba.dubbo.samples.annotation.action&quot;)\n    @PropertySource(&quot;classpath:/spring/dubbo-consumer.properties&quot;)\n    @ComponentScan(value = {&quot;com.alibaba.dubbo.samples.annotation.action&quot;})\n    @EnableAspectJAutoProxy\n    static public class ConsumerConfiguration {\n\n        @Bean\n        public HystrixCommandAspect hystrixCommandAspect() {\n            return new HystrixCommandAspect();\n        }\n    }\n</code></pre>\n<h2>Hystrix集成Spring AOP原理</h2>\n<p>在上面的例子里可以看到,Hystrix对Spring的集成是通过Spring AOP来实现的。下面简单分析下实现。</p>\n<pre><code>@Aspect\npublic class HystrixCommandAspect {\n    @Pointcut(&quot;@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)&quot;)\n    public void hystrixCommandAnnotationPointcut() {\n    }\n    @Pointcut(&quot;@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser)&quot;)\n    public void hystrixCollapserAnnotationPointcut() {\n    }\n\n    @Around(&quot;hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()&quot;)\n    public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {\n        Method method = getMethodFromTarget(joinPoint);\n        Validate.notNull(method, &quot;failed to get method from joinPoint: %s&quot;, joinPoint);\n        if (method.isAnnotationPresent(HystrixCommand.class) &amp;&amp; method.isAnnotationPresent(HystrixCollapser.class)) {\n            throw new IllegalStateException(&quot;method cannot be annotated with HystrixCommand and HystrixCollapser &quot; +\n                    &quot;annotations at the same time&quot;);\n        }\n        MetaHolderFactory metaHolderFactory = META_HOLDER_FACTORY_MAP.get(HystrixPointcutType.of(method));\n        MetaHolder metaHolder = metaHolderFactory.create(joinPoint);\n        HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);\n        ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ?\n                metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();\n\n        Object result;\n        try {\n            if (!metaHolder.isObservable()) {\n                result = CommandExecutor.execute(invokable, executionType, metaHolder);\n            } else {\n                result = executeObservable(invokable, executionType, metaHolder);\n            }\n        } catch (HystrixBadRequestException e) {\n            throw e.getCause() != null ? e.getCause() : e;\n        } catch (HystrixRuntimeException e) {\n            throw hystrixRuntimeExceptionToThrowable(metaHolder, e);\n        }\n        return result;\n    }\n</code></pre>\n<ol>\n<li><code>HystrixCommandAspect</code>里定义了两个注解的AspectJ Pointcut:<code>@HystrixCommand</code>, <code>@HystrixCollapser</code>。所有带这两个注解的spring bean都会经过AOP处理</li>\n<li>在<code>@Around</code> AOP处理函数里,可以看到Hystrix会创建出<code>HystrixInvokable</code>,再通过<code>CommandExecutor</code>来执行</li>\n</ol>\n<h2>spring-cloud-starter-netflix-hystrix的代码分析</h2>\n<ol>\n<li>\n<p><code>@EnableHystrix</code> 引入了<code>@EnableCircuitBreaker</code>,<code>@EnableCircuitBreaker</code>引入了<code>EnableCircuitBreakerImportSelector</code></p>\n<pre><code>@EnableCircuitBreaker\npublic @interface EnableHystrix {\n}\n\n@Import(EnableCircuitBreakerImportSelector.class)\npublic @interface EnableCircuitBreaker {\n}\n</code></pre>\n</li>\n<li>\n<p><code>EnableCircuitBreakerImportSelector</code>继承了<code>SpringFactoryImportSelector&lt;EnableCircuitBreaker&gt;</code>,使spring加载<code>META-INF/spring.factories</code>里的<code>EnableCircuitBreaker</code>声明的配置</p>\n<p>在<code>META-INF/spring.factories</code>里可以找到下面的配置,也就是引入了<code>HystrixCircuitBreakerConfiguration</code>。</p>\n<pre><code>org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\\\norg.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration\n</code></pre>\n</li>\n<li>\n<p>在<code>HystrixCircuitBreakerConfiguration</code>里可以发现创建了<code>HystrixCommandAspect</code></p>\n<pre><code>@Configuration\npublic class HystrixCircuitBreakerConfiguration {\n\n    @Bean\n    public HystrixCommandAspect hystrixCommandAspect() {\n        return new HystrixCommandAspect();\n    }\n</code></pre>\n</li>\n</ol>\n<p>可见<code>spring-cloud-starter-netflix-hystrix</code>实际上也是创建了<code>HystrixCommandAspect</code>来集成Hystrix。</p>\n<p>另外<code>spring-cloud-starter-netflix-hystrix</code>里还有metrics, health, dashboard等集成。</p>\n<h2>总结</h2>\n<ul>\n<li>对于dubbo provider的<code>@Service</code>是一个spring bean,直接在上面配置<code>@HystrixCommand</code>即可</li>\n<li>对于dubbo consumer的<code>@Reference</code>,可以通过加一层简单的spring method包装,配置<code>@HystrixCommand</code>即可</li>\n<li>Hystrix本身提供<code>HystrixCommandAspect</code>来集成Spring AOP,配置了<code>@HystrixCommand</code>和<code>@HystrixCollapser</code>的spring method都会被Hystrix处理</li>\n</ul>\n<h2>链接</h2>\n<ul>\n<li><a href=\"https://github.com/Netflix/Hystrix\">https://github.com/Netflix/Hystrix</a></li>\n<li><a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a></li>\n<li><a href=\"http://start.dubbo.io/\">http://start.dubbo.io/</a></li>\n<li><a href=\"https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients\">https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients</a></li>\n</ul>\n",
-  "title": "Spring应用快速集成Dubbo + Hystrix",
-  "keywords": "Dubbo, Spring, Hystrix",
-  "description": "本文介绍在spring应用里,怎么把Dubbo和Hystrix结合起来使用。"
+  "link": "/zh-cn/blog/dubbo-integrate-with-hystrix.html",
+  "meta": {
+    "title": "Spring应用快速集成Dubbo + Hystrix",
+    "keywords": "Dubbo, Spring, Hystrix",
+    "description": "本文介绍在spring应用里,怎么把Dubbo和Hystrix结合起来使用。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-invoke.json b/zh-cn/blog/dubbo-invoke.json
index 43e56811..4825f681 100644
--- a/zh-cn/blog/dubbo-invoke.json
+++ b/zh-cn/blog/dubbo-invoke.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-invoke.md",
   "__html": "<h1>Dubbo 关于同步/异步调用的几种方式</h1>\n<p>我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制;基于这种机制,Dubbo 实现了以下几种调用方式:</p>\n<ul>\n<li>同步调用</li>\n<li>异步调用</li>\n<li>参数回调</li>\n<li>事件通知</li>\n</ul>\n<h2>同步调用</h2>\n<p>同步调用是一种阻塞式的调用方式,即 Consumer 端代码一直阻塞等待,直到 Provider 端返回为止;</p>\n<p>通常,一个典型的同步调用过程如下:</p>\n<ol>\n<li>Consumer 业务线程调用远程接口,向 Provider 发送请求,同时当前线程处于<code>阻塞</code>状态;</li>\n<li>Provider 接到 Consumer 的请求后,开始处理请求,将结果返回给 Consumer;</li>\n<li>Consumer 收到结果后,当前线程继续往后执行。</li>\n</ol>\n<p>这里有 2 个问题:</p>\n<ol>\n<li>Consumer 业务线程是怎么进入<code>阻塞</code>状态的?</li>\n<li>Consumer 收到结果后,如何唤醒业务线程往后执行的?</li>\n</ol>\n<p>其实,Dubbo 的底层 IO 操作都是异步的。Consumer 端发起调用后,得到一个 Future 对象。对于同步调用,业务线程通过<code>Future#get(timeout)</code>,阻塞等待 Provider 端将结果返回;<code>timeout</code>则是 Consumer 端定义的超时时间。当结果返回后,会设置到此 Future,并唤醒阻塞的业务线程;当超时时间到结果还未返回时,业务线程将会异常返回。</p>\n<h2>异步调用</h2>\n<p>基于 Dubbo 底层的异步 NIO 实现异步调用,对于 Provider 响应时间较长的场景是必须的,它能有效利用 Consumer 端的资源,相对于 Consumer 端使用多线程来说开销较小。</p>\n<p>异步调用,对于 Provider 端不需要做特别的配置。下面的例子中,Provider 端接口定义如下:</p>\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\">AsyncService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">goodbye</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h3>Consumer 配置</h3>\n<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\">\"asyncService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.async.api.AsyncService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"goodbye\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>需要异步调用的方法,均需要使用 <code>&lt;dubbo:method/&gt;</code>标签进行描述。</p>\n<h3>Consumer 端发起调用</h3>\n<pre><code class=\"language-java\">AsyncService service = ...;\nString result = service.goodbye(<span class=\"hljs-string\">\"samples\"</span>);<span class=\"hljs-comment\">// 这里的返回值为空,请不要使用</span>\nFuture&lt;String&gt; future = RpcContext.getContext().getFuture();\n... <span class=\"hljs-comment\">// 业务线程可以开始做其他事情</span>\nresult = future.get(); <span class=\"hljs-comment\">// 阻塞需要获取异步结果时,也可以使用 get(timeout, unit) 设置超时时间</span>\n</code></pre>\n<p>Dubbo Consumer 端发起调用后,同时通过<code>RpcContext.getContext().getFuture()</code>获取跟返回结果关联的<code>Future</code>对象,然后就可以开始处理其他任务;当需要这次异步调用的结果时,可以在任意时刻通过<code>future.get(timeout)</code>来获取。</p>\n<p>一些特殊场景下,为了尽快调用返回,可以设置是否等待消息发出:</p>\n<ul>\n<li><code>sent=&quot;true&quot;</code> 等待消息发出,消息发送失败将抛出异常;</li>\n<li><code>sent=&quot;false&quot;</code> 不等待消息发出,将消息放入 IO 队列,即刻返回。</li>\n</ul>\n<p>默认为<code>false</code>。配置方式如下:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"goodbye\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">sent</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>如果你只是想异步,完全忽略返回值,可以配置 <code>return=&quot;false&quot;</code>,以减少 Future 对象的创建和管理成本:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"goodbye\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">return</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n</code></pre>\n<p>此时,<code>RpcContext.getContext().getFuture()</code>将返回<code>null</code>。</p>\n<p>整个异步调用的时序图如下:</p>\n<p><img src=\"../../img/blog/dubbo-async.svg\" alt=\"异步调用\"></p>\n<p>此示例代码位于:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async</a></p>\n<h2>参数回调</h2>\n<p>参数回调有点类似于本地 Callback 机制,但 Callback 并不是 Dubbo 内部的类或接口,而是由 Provider 端自定义的;Dubbo 将基于长连接生成反向代理,从而实现从 Provider 端调用 Consumer 端的逻辑。</p>\n<h3>Provider 端定义 Service 和 Callback</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\">CallbackService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span></span>;\n}\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span></span>;\n}\n</code></pre>\n<h4>Provider 端 Service 实现</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CallbackServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Map&lt;String, CallbackListener&gt; listeners = <span class=\"hljs-keyword\">new</span> ConcurrentHashMap&lt;String, CallbackListener&gt;();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">CallbackServiceImpl</span><span class=\"hljs-params\">()</span> </span>{\n        Thread t = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">while</span> (<span class=\"hljs-keyword\">true</span>) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        <span class=\"hljs-keyword\">for</span> (Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()) {\n                            <span class=\"hljs-keyword\">try</span> {\n                                entry.getValue().changed(getChanged(entry.getKey()));\n                            } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                                listeners.remove(entry.getKey());\n                            }\n                        }\n                        Thread.sleep(<span class=\"hljs-number\">5000</span>); <span class=\"hljs-comment\">// timely trigger change event</span>\n                    } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                        t.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.setDaemon(<span class=\"hljs-keyword\">true</span>);\n        t.start();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span> </span>{\n        listeners.put(key, listener);\n        listener.changed(getChanged(key)); <span class=\"hljs-comment\">// send notification for change</span>\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> String <span class=\"hljs-title\">getChanged</span><span class=\"hljs-params\">(String key)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Changed: \"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date());\n    }\n}\n</code></pre>\n<h4>Provider 端暴露服务</h4>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.callback.impl.CallbackServiceImpl\"</span>/&gt;</span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.callback.api.CallbackService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"callbackService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"addListener\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--&lt;dubbo:argument type=\"com.demo.CallbackListener\" callback=\"true\" /&gt;--&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>这里,Provider 需要在方法中声明哪个参数是 Callback 参数。</p>\n<h4>Consumer 端实现 Callback 接口</h4>\n<pre><code class=\"language-java\">CallbackService callbackService = ...;\ncallbackService.addListener(<span class=\"hljs-string\">\"foo.bar\"</span>, <span class=\"hljs-keyword\">new</span> CallbackListener() {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span> </span>{\n            System.out.println(<span class=\"hljs-string\">\"callback1:\"</span> + msg);\n        }\n});\n</code></pre>\n<p>Callback 接口的实现类在 Consumer 端,当方法发生调用时,Consumer 端会自动 export 一个 Callback 服务。而 Provider 端在处理调用时,判断如果参数是 Callback,则生成了一个 proxy,因此服务实现类里在调用 Callback 方法的时候,会被传递到 Consumer 端执行 Callback 实现类的代码。</p>\n<p>上述示例代码位于:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback</a></p>\n<p>这种调用方式有点像消息的发布和订阅,但又有区别。比如当 Consumer 端 完成了Callback 服务的 export 后,如果后续重启了,这时 Provider 端就会调不通;同时 Provider 端如何清理掉这个 proxy 也是一个问题。</p>\n<h2>事件通知</h2>\n<p>事件通知允许 Consumer 端在调用之前、调用之后或出现异常时,触发 <code>oninvoke</code>、<code>onreturn</code>、<code>onthrow</code> 三个事件。</p>\n<p>可以通过在配置 Consumer 时,指定事件需要通知的方法,如:</p>\n<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\">\"demoCallback\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.notify.impl.NotifyImpl\"</span> /&gt;</span>\n\n<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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.notify.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">onreturn</span>=<span class=\"hljs-string\">\"demoCallback.onreturn\"</span> <span class=\"hljs-attr\">onthrow</span>=<span class=\"hljs-string\">\"demoCallback.onthrow\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>其中,NotifyImpl 的代码如下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NotifyImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Notify</span></span>{\n\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, String&gt; ret = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, String&gt;();\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(String name, <span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        ret.put(id, name);\n        System.out.println(<span class=\"hljs-string\">\"onreturn: \"</span> + name);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, String name, <span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"onthrow: \"</span> + name);\n    }\n}\n</code></pre>\n<p>这里要强调一点,自定义 Notify 接口中的三个方法的参数规则如下:</p>\n<ul>\n<li><code>oninvoke</code> 方法参数与调用方法的参数相同;</li>\n<li><code>onreturn</code>方法第一个参数为调用方法的返回值,其余为调用方法的参数;</li>\n<li><code>onthrow</code>方法第一个参数为调用异常,其余为调用方法的参数。</li>\n</ul>\n<p>上述配置中,<code>sayHello</code>方法为同步调用,因此事件通知方法的执行也是同步执行。可以配置 <code>async=true</code>让方法调用为异步,这时事件通知的方法也是异步执行的。特别强调一下,<code>oninvoke</code>方法不管是否异步调用,都是同步执行的。</p>\n<p>事件通知的示例代码请参考:<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify</a></p>\n",
-  "title": "Dubbo 关于同步/异步调用的几种方式",
-  "keywords": "Dubbo, Invoke, Async",
-  "description": "本文介绍了Dubbo基于异步通讯机制实现的几种同步和异步调用方式。"
+  "link": "/zh-cn/blog/dubbo-invoke.html",
+  "meta": {
+    "title": "Dubbo 关于同步/异步调用的几种方式",
+    "keywords": "Dubbo, Invoke, Async",
+    "description": "本文介绍了Dubbo基于异步通讯机制实现的几种同步和异步调用方式。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-k8s.json b/zh-cn/blog/dubbo-k8s.json
index 5a654eda..cf343f9d 100644
--- a/zh-cn/blog/dubbo-k8s.json
+++ b/zh-cn/blog/dubbo-k8s.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-k8s.md",
   "__html": "<h1>Dubbo与Kubernetes集成</h1>\n<h2>大体目标</h2>\n<p>Dubbo的provider不再关心服务注册的事宜,只需要把其Dubbo服务端口打开,由Kubernetes来进行服务的声明和发布;Dubbo的consumer在服务发现时直接发现kubernetes的对应服务endpoints,从而复用Dubbo已有的微服务通道能力。好处是无需依赖三方的软负载注册中心;同时无缝融入Kubernetes的多租户安全体系。Demo的代码参照: <a href=\"https://github.com/dubbo/dubbo-kubernetes\">https://github.com/dubbo/dubbo-kubernetes</a></p>\n<h2>闲谈</h2>\n<p>Kubernates是建立在扩展性的具备二次开发的功能层次丰富的体系化系统</p>\n<ul>\n<li>首先其最核心的功能是管理容器集群,能管理容器化的集群(包括存储,计算),当然这个是建立在对容器运行时(CRI),网络接口(CNI),存储服务接口(CSI/FV)的基础上;</li>\n<li>其次是面向应用(包括无状态/有状态,批处理/服务型应用)的部署和路由能力,特别是基于微服务架构的应用管理,具备了其服务定义和服务发现,以及基于configmap的统一配置能力;</li>\n<li>在基础资源(主要是抽象底层IaaS的资源)和应用层的抽象模型之上是治理层,包含弹性扩容,命名空间/租户,等。当然,基于其原子内核的基础能力,在Kubernetes的核心之上搭建统一的日志中心和全方位监控等服务是水到渠成的,CNCF更是有其认定推荐。</li>\n</ul>\n<p>来张Kubernetes Architecture的一张图解释下上述描述。在2018年Kubernetes往事实的paas底座的标配迈出质的一步,有人说原因在于基于扩展的二次开发能力,有人说在于其声明式编程和背靠Google和Redhat的强大社区运作,我觉得回归本质是在于下图中的<strong>Layered架构和其问题域的领域建模抽象</strong>。</p>\n<p><img src=\"../../img/blog/k8s/1.png\" alt=\"img\"></p>\n<p>以微服务架构视角,Kubernetes在一定意义上是微服务框架(这时较叫微服务平台或toolkit集更合适),支持微服务的服务发现/注册的基本能力。借用如下图做一个简单描述。</p>\n<p><img src=\"../../img/blog/k8s/2.jpeg\" alt=\"img\"></p>\n<p>话题再展开一下,微服务领域涉及众多问题,大概可以用下图说明。</p>\n<p><img src=\"../../img/blog/k8s/3.jpeg\" alt=\"img\"></p>\n<p>Kubernetes解决得只是少部分,而像动态路由,稳定性控制(断路器,隔水舱等),分布式服务追踪等是个空白,这也就是servicemesh要解决的,是在CNCF的Trail Map占有重要一席;当然Dubbo是基本具备完备的微服务,也就是使得其集成到k8s体系下具有相当的意义。Dubbo在serviemesh中基于sidecar的方案是解决跨语言诉求的通用servicemesh方案,需要新开一个话题来展开说;而引用serviemsh的原始定义:</p>\n<blockquote>\n<p>A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application.</p>\n</blockquote>\n<blockquote>\n<p>首先服务网格是一个云原生环境下基础设施层,功能在于处理服务间通信,职责是负责实现请求的可靠传递,被使得被监控跟踪,被治理,最终使得微服务架构被赋予高可控的稳定性和快速的问题定位排查能力。</p>\n</blockquote>\n<p>可以得出现有Dubbo集成云原生基础设施Kubernetes的基础能力而并解决微服务相关核心问题也算是一种狭义上的servicemesh方案,只是是Java领域的罢了;当玩笑理解也行,哈哈。</p>\n<h2>思路/方案</h2>\n<p>Kubernetes是天然可作为微服务的地址注册中心,类似于Zookeeper, 阿里巴巴内部用到的VIPserver,Configserver。 具体来说,Kubernetes中的Pod是对于应用的运行实例,Pod的被调度部署/启停都会调用API-Server的服务来保持其状态到ETCD;Kubernetes中的service是对应微服务的概念,定义如下</p>\n<blockquote>\n<p>A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.</p>\n</blockquote>\n<p>概括来说Kubernetes service具有如下特点</p>\n<ul>\n<li>每个Service都有一个唯一的名字,及对应IP。IP是kubernetes自动分配的,名字是开发者自己定义的。</li>\n<li>Service的IP有几种表现形式,分别是ClusterIP,NodePort,LoadBalance,Ingress。 ClusterIP主要用于集群内通信;NodePort,Ingress,LoadBalance用于暴露服务给集群外的访问入口。</li>\n</ul>\n<p>乍一看,Kubernetes的service都是唯一的IP,在原有的Dubbo/HSF固定思维下:Dubbo/HSF的service是由整个服务集群的IP聚合而成,貌似是有本质区别的,细想下来差别不大,因为Kubernetes下的唯一IP只是一个VIP,背后挂在了多个endpoint,那才是事实上的处理节点。此处只讨论集群内的Dubbo服务在同一个kubernetes集群内访问;至于kubernetes外的consumer访问kubernetes内的provider,涉及到网络地址空间的问题,一般需要GateWay/loadbalance来做映射转换,不展开讨论。针对Kubernetes内有两种方案可选: :</p>\n<ol>\n<li>DNS: 默认Kubernetes的service是靠DNS插件(最新版推荐是coreDNS), Dubbo上有个proposal是关于这个的。我的理解是static resolution的机制是最简单最需要支持的一种service discovery机制,具体也可以参考Envoy在此的观点,由于HSF/Dubbo一直突出其软负载的地址发现能力,反而忽略Static的策略。同时蚂蚁的SOFA一直是支持此种策略,那一个SOFA工程的工程片段做一个解释。这样做有两个好处,1)当软负载中心crash不可用造成无法获取地址列表时,有一定的机制Failover到此策略来处理一定的请求。 2)在LDC/单元化下,蚂蚁的负载中心集群是机房/区域内收敛部署的,首先保证软负载中心的LDC化了进而稳定可控,当单元需要请求中心时,此VIP的地址发现就排上用场了。</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1Kj1ktpkoBKNjSZFEXXbrEVXa-985-213.png\" alt=\"img\"></p>\n<ol start=\"2\">\n<li>API:DNS是依靠DNS插件进行的,相当于额外的运维开销,所以考虑直接通过kubernetes的client来获取endpoint。事实上,通过访问Kubernetes的API server接口是可以直接获取某个servie背后的endpoint列表,同时可以监听其地址列表的变化。从而实现Dubbo/HSF所推荐的软负载发现策略。具体可以参考代码:</li>\n</ol>\n<p>以上两种思路都需要考虑以下两点:</p>\n<ol>\n<li>Kubernetes和Dubbo对于service的名字是映射一致的。Dubbo的服务是由serviename,group,version三个来确定其唯一性,而且servicename一般其服务接口的包名称,比较长。需要映射Kubernetes的servie名与dubbo的服务名。要么是像SOFA那样增加一个属性来进行定义,这是个大的改动,但最合理;要么是通过固定规则来引用部署的环境变量,可用于快速验证。</li>\n<li>端口问题:默认Pod与Pod的网络互通算是解决了,需要验证。</li>\n</ol>\n<h2>Demo验证</h2>\n<p>下面通过阿里云的容器镜像服务和EDAS中的Kubernetes服务来做一次Demo部署。访问阿里云 -&gt; 容器镜像服务。</p>\n<ol>\n<li>创建镜像仓库并绑定github代码库。如下图</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1m.tEtrorBKNjSZFjXXc_SpXa-1892-870.png\" alt=\"img\"></p>\n<ol start=\"2\">\n<li>点击管理 <strong>进行创建好的仓库</strong>,通过镜像服务下的构建功能,把demo构建成image,并发布到指定仓库。如下图。</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1oYqvtcIrBKNjSZK9XXagoVXa-1872-888.png\" alt=\"img\"></p>\n<ol start=\"3\">\n<li>切换到企业级分布式应用服务(EDAS)产品,在资源管理 -&gt; 集群 下创建Kubernetes集群并绑定ECS,如下图.</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1b1p2trZnBKNjSZFKXXcGOVXa-1858-833.png\" alt=\"img\"></p>\n<ol start=\"4\">\n<li>应用管理 -》创建应用,<strong>类型为kubernetes应用</strong> 并且指定在容器镜像服务中的镜像。如下图。</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1b1p2trZnBKNjSZFKXXcGOVXa-1858-833.png\" alt=\"img\"></p>\n<p><img src=\"https://img.alicdn.com/tfs/TB18uzTtdcnBKNjSZR0XXcFqFXa-1820-861.png\" alt=\"\"></p>\n<ol start=\"5\">\n<li>创建完成后,进行应用部署。如下图</li>\n</ol>\n<p><img src=\"https://img.alicdn.com/tfs/TB1fEpEtrorBKNjSZFjXXc_SpXa-1846-783.png\" alt=\"\"></p>\n<ul>\n<li>\n<p>补充应用名不能有大写字母,全部小写,否则有部署失败的问题。</p>\n</li>\n<li>\n<p>在创建应用时,选中镜像后,下一步的按钮无法点击,需要点击选择来继续。</p>\n</li>\n<li>\n<p>EDAS有两套独立的Kubernetes服务,一套是基于阿里云的容器服务,一套是Lark自己搞的。本人体验的是后者。</p>\n</li>\n<li>\n<p>Docker与IDE集成的开发联调,需要考虑集成IDEA的相关插件。</p>\n</li>\n<li>\n<p>部署时总是出错,感觉Kubernetes服务上哪里有问题。需要进一步排查。</p>\n<p>{&quot;kind&quot;:&quot;Pod&quot;,&quot;namespace&quot;:&quot;lzumwsrddf831iwarhehd14zh2-default&quot;,&quot;name&quot;:&quot;dubbo-k8s-demo-610694273-jq238&quot;,&quot;uid&quot;:&quot;12892e67-8bc8-11e8-b96a-00163e02c37b&quot;,&quot;apiVersion&quot;:&quot;v1&quot;,&quot;resourceVersion&quot;:&quot;850282769&quot;},&quot;reason&quot;:&quot;FailedSync&quot;,&quot;message&quot;:&quot;Error syncing pod&quot;,&quot;</p>\n</li>\n</ul>\n",
-  "title": "Dubbo与Kubernetes集成",
-  "keywords": "Dubbo, Kubernetes, K8S",
-  "description": "本文主要尝试将Dubbo服务注册到Kubernetes,同时无缝融入Kubernetes的多租户安全体系。"
+  "link": "/zh-cn/blog/dubbo-k8s.html",
+  "meta": {
+    "title": "Dubbo与Kubernetes集成",
+    "keywords": "Dubbo, Kubernetes, K8S",
+    "description": "本文主要尝试将Dubbo服务注册到Kubernetes,同时无缝融入Kubernetes的多租户安全体系。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-loadbalance.json b/zh-cn/blog/dubbo-loadbalance.json
index 4a8505ca..9f188b13 100644
--- a/zh-cn/blog/dubbo-loadbalance.json
+++ b/zh-cn/blog/dubbo-loadbalance.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-loadbalance.md",
   "__html": "<h1>Dubbo的负载均衡</h1>\n<h2>背景</h2>\n<p>Dubbo是一个分布式服务框架,能避免单点故障和支持服务的横向扩容。一个服务通常会部署多个实例。如何从多个服务 Provider 组成的集群中挑选出一个进行调用,就涉及到一个负载均衡的策略。</p>\n<h2>几个概念</h2>\n<p>在讨论负载均衡之前,我想先解释一下这3个概念。</p>\n<ol>\n<li>负载均衡</li>\n<li>集群容错</li>\n<li>服务路由</li>\n</ol>\n<p>这3个概念容易混淆。他们都描述了怎么从多个 Provider 中选择一个来进行调用。那他们到底有什么区别呢?下面我来举一个简单的例子,把这几个概念阐述清楚吧。</p>\n<p>有一个Dubbo的用户服务,在北京部署了10个,在上海部署了20个。一个杭州的服务消费方发起了一次调用,然后发生了以下的事情:</p>\n<ol>\n<li>根据配置的路由规则,如果杭州发起的调用,会路由到比较近的上海的20个 Provider。</li>\n<li>根据配置的随机负载均衡策略,在20个 Provider 中随机选择了一个来调用,假设随机到了第7个 Provider。</li>\n<li>结果调用第7个 Provider 失败了。</li>\n<li>根据配置的Failover集群容错模式,重试其他服务器。</li>\n<li>重试了第13个 Provider,调用成功。</li>\n</ol>\n<p>上面的第1,2,4步骤就分别对应了路由,负载均衡和集群容错。 Dubbo中,先通过路由,从多个 Provider 中按照路由规则,选出一个子集。再根据负载均衡从子集中选出一个 Provider 进行本次调用。如果调用失败了,根据集群容错策略,进行重试或定时重发或快速失败等。 可以看到Dubbo中的路由,负载均衡和集群容错发生在一次RPC调用的不同阶段。最先是路由,然后是负载均衡,最后是集群容错。 本文档只讨论负载均衡,路由和集群容错在其他的文档中进行说明。</p>\n<h2>Dubbo内置负载均衡策略</h2>\n<p>Dubbo内置了4种负载均衡策略:</p>\n<ol>\n<li>RandomLoadBalance:随机负载均衡。随机的选择一个。是Dubbo的<strong>默认</strong>负载均衡策略。</li>\n<li>RoundRobinLoadBalance:轮询负载均衡。轮询选择一个。</li>\n<li>LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。使慢的 Provider 收到更少请求,因为越慢的 Provider 的调用前后计数差会越大。</li>\n<li>ConsistentHashLoadBalance:一致性哈希负载均衡。相同参数的请求总是落在同一台机器上。</li>\n</ol>\n<h3>1.随机负载均衡</h3>\n<p>顾名思义,随机负载均衡策略就是从多个 Provider 中随机选择一个。但是 Dubbo 中的随机负载均衡有一个权重的概念,即按照权重设置随机概率。比如说,有10个 Provider,并不是说,每个 Provider 的概率都是一样的,而是要结合这10个 Provider 的权重来分配概率。</p>\n<p>Dubbo中,可以对 Provider 设置权重。比如机器性能好的,可以设置大一点的权重,性能差的,可以设置小一点的权重。权重会对负载均衡产生影响。可以在Dubbo Admin中对 Provider 进行权重的设置。</p>\n<p><strong>基于权重的负载均衡算法</strong></p>\n<p>随机策略会先判断所有的 Invoker 的权重是不是一样的,如果都是一样的,那么处理就比较简单了。使用random.nexInt(length)就可以随机生成一个 Invoker 的序号,根据序号选择对应的 Invoker 。如果没有在Dubbo Admin中对服务 Provider 设置权重,那么所有的 Invoker 的权重就是一样的,默认是100。 如果权重不一样,那就需要结合权重来设置随机概率了。算法大概如下: 假如有4个 Invoker。</p>\n<table>\n<thead>\n<tr>\n<th>invoker</th>\n<th>weight</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A</td>\n<td>10</td>\n</tr>\n<tr>\n<td>B</td>\n<td>20</td>\n</tr>\n<tr>\n<td>C</td>\n<td>20</td>\n</tr>\n<tr>\n<td>D</td>\n<td>30</td>\n</tr>\n</tbody>\n</table>\n<p>A,B,C和D总的权重是10 + 20 + 20 + 30 = 80。将80个数分布在如下的图中:</p>\n<pre><code>+-----------------------------------------------------------------------------------+\n|          |                    |                    |                              |\n+-----------------------------------------------------------------------------------+\n1          10                   30                   50                             80\n\n|-----A----|---------B----------|----------C---------|---------------D--------------|\n\n\n---------------------15\n\n-------------------------------------------37\n\n-----------------------------------------------------------54\n</code></pre>\n<p>上面的图中一共有4块区域,长度分别是A,B,C和D的权重。使用random.nextInt(10 + 20 + 20 + 30),从80个数中随机选择一个。然后再判断该数分布在哪个区域。比如,如果随机到37,37是分布在C区域的,那么就选择 Invoker C。15是在B区域,54是在D区域。</p>\n<p><strong>随机负载均衡源码</strong></p>\n<p>下面是随机负载均衡的源码,为了方便阅读和理解,我把无关部分都去掉了。</p>\n<pre><code>public class RandomLoadBalance extends AbstractLoadBalance {\n\n    private final Random random = new Random();\n\n    protected &lt;T&gt; Invoker&lt;T&gt; doSelect(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) {\n        int length = invokers.size();      // Invoker 总数\n        int totalWeight = 0;               // 所有 Invoker 的权重的和\n\n        // 判断是不是所有的 Invoker 的权重都是一样的\n        // 如果权重都一样,就简单了。直接用Random生成索引就可以了。\n        boolean sameWeight = true;\n        for (int i = 0; i &lt; length; i++) {\n            int weight = getWeight(invokers.get(i), invocation);\n            totalWeight += weight; // Sum\n            if (sameWeight &amp;&amp; i &gt; 0 &amp;&amp; weight != getWeight(invokers.get(i - 1), invocation)) {\n                sameWeight = false;\n            }\n        }\n\n        if (totalWeight &gt; 0 &amp;&amp; !sameWeight) {\n            // 如果不是所有的 Invoker 权重都相同,那么基于权重来随机选择。权重越大的,被选中的概率越大\n            int offset = random.nextInt(totalWeight);\n            for (int i = 0; i &lt; length; i++) {\n                offset -= getWeight(invokers.get(i), invocation);\n                if (offset &lt; 0) {\n                    return invokers.get(i);\n                }\n            }\n        }\n        // 如果所有 Invoker 权重相同\n        return invokers.get(random.nextInt(length));\n    }\n}\n</code></pre>\n<h3>2.轮询负载均衡</h3>\n<p>轮询负载均衡,就是依次的调用所有的 Provider。和随机负载均衡策略一样,轮询负载均衡策略也有权重的概念。 轮询负载均衡算法可以让RPC调用严格按照我们设置的比例来分配。不管是少量的调用还是大量的调用。但是轮询负载均衡算法也有不足的地方,存在慢的 Provider 累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上,导致整个系统变慢。</p>\n<h3>3.最少活跃调用数负载均衡</h3>\n<p>官方解释:</p>\n<blockquote>\n<p>最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少。</p>\n</blockquote>\n<p>这个解释好像说的不是太明白。目的是让更慢的机器收到更少的请求,但具体怎么实现的还是不太清楚。举个例子:每个服务维护一个活跃数计数器。当A机器开始处理请求,该计数器加1,此时A还未处理完成。若处理完毕则计数器减1。而B机器接受到请求后很快处理完毕。那么A,B的活跃数分别是1,0。当又产生了一个新的请求,则选择B机器去执行(B活跃数最小),这样使慢的机器A收到少的请求。</p>\n<p>处理一个新的请求时,Consumer 会检查所有 Provider 的活跃数,如果具有最小活跃数的 Invoker 只有一个,直接返回该 Invoker:</p>\n<pre><code>if (leastCount == 1) {\n    // 如果只有一个最小则直接返回\n    return invokers.get(leastIndexs[0]);\n}\n</code></pre>\n<p>如果最小活跃数的 Invoker 有多个,且权重不相等同时总权重大于0,这时随机生成一个权重,范围在 (0,totalWeight) 间内。最后根据随机生成的权重,来选择 Invoker。</p>\n<pre><code>if (! sameWeight &amp;&amp; totalWeight &gt; 0) {\n    // 如果权重不相同且权重大于0则按总权重数随机\n    int offsetWeight = random.nextInt(totalWeight);\n    // 并确定随机值落在哪个片断上\n    for (int i = 0; i &lt; leastCount; i++) {\n        int leastIndex = leastIndexs[i];\n        offsetWeight -= getWeight(invokers.get(leastIndex), invocation);\n        if (offsetWeight &lt;= 0)\n            return invokers.get(leastIndex);\n    }\n}\n</code></pre>\n<h3>4.一致性Hash算法</h3>\n<p>使用一致性 Hash 算法,让相同参数的请求总是发到同一 Provider。 当某一台 Provider 崩溃时,原本发往该 Provider 的请求,基于虚拟节点,平摊到其它 Provider,不会引起剧烈变动。 算法参见:<a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a>。</p>\n<p>缺省只对第一个参数Hash,如果要修改,请配置:</p>\n<pre><code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;\n</code></pre>\n<p>缺省用160份虚拟节点,如果要修改,请配置:</p>\n<pre><code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;\n</code></pre>\n<p>一致性Hash算法可以和缓存机制配合起来使用。比如有一个服务getUserInfo(String userId)。设置了Hash算法后,相同的userId的调用,都会发送到同一个 Provider。这个 Provider 上可以把用户数据在内存中进行缓存,减少访问数据库或分布式缓存的次数。如果业务上允许这部分数据有一段时间的不一致,可以考虑这种做法。减少对数据库,缓存等中间件的依赖和访问次数,同时减少了网络IO操作,提高系统性能。\b</p>\n<h2>负载均衡配置</h2>\n<p>如果不指定负载均衡,默认使用随机负载均衡。我们也可以根据自己的需要,显式指定一个负载均衡。 可以在多个地方类来配置负载均衡,比如 Provider 端,Consumer端,服务级别,方法级别等。</p>\n<h3>服务端服务级别</h3>\n<pre><code>&lt;dubbo:service interface=&quot;...&quot; loadbalance=&quot;roundrobin&quot; /&gt;\n</code></pre>\n<p>该服务的所有方法都使用roundrobin负载均衡。</p>\n<h3>客户端服务级别</h3>\n<pre><code>&lt;dubbo:reference interface=&quot;...&quot; loadbalance=&quot;roundrobin&quot; /&gt;\n</code></pre>\n<p>该服务的所有方法都使用roundrobin负载均衡。</p>\n<h3>服务端方法级别</h3>\n<pre><code>&lt;dubbo:service interface=&quot;...&quot;&gt;\n    &lt;dubbo:method name=&quot;hello&quot; loadbalance=&quot;roundrobin&quot;/&gt;\n&lt;/dubbo:service&gt;\n</code></pre>\n<p>只有该服务的hello方法使用roundrobin负载均衡。</p>\n<h3>客户端方法级别</h3>\n<pre><code>&lt;dubbo:reference interface=&quot;...&quot;&gt;\n    &lt;dubbo:method name=&quot;hello&quot; loadbalance=&quot;roundrobin&quot;/&gt;\n&lt;/dubbo:reference&gt;\n</code></pre>\n<p>只有该服务的hello方法使用roundrobin负载均衡。</p>\n<p>和Dubbo其他的配置类似,多个配置是有覆盖关系的:</p>\n<ol>\n<li>方法级优先,接口级次之,全局配置再次之。</li>\n<li>如果级别一样,则消费方优先,提供方次之。</li>\n</ol>\n<p>所以,上面4种配置的优先级是:</p>\n<ol>\n<li>客户端方法级别配置。</li>\n<li>客户端接口级别配置。</li>\n<li>服务端方法级别配置。</li>\n<li>服务端接口级别配置。</li>\n</ol>\n<h2>扩展负载均衡</h2>\n<p>Dubbo的4种负载均衡的实现,大多数情况下能满足要求。有时候,因为业务的需要,我们可能需要实现自己的负载均衡策略。本章只说明如何配置负载均衡算法。关于Dubbo扩展机制的更多内容,请前往<a href=\"https://lark.alipay.com/aliware_articles/vtpf9h/pe9pyr\">Dubbo可扩展机制实战</a>。</p>\n<ol>\n<li>实现LoadBalance接口, 以下是Dubbo的LoadBalance接口:</li>\n</ol>\n<pre><code>@SPI(RandomLoadBalance.NAME)\npublic interface LoadBalance {\n    @Adaptive(&quot;loadbalance&quot;)\n    &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException;\n}\n</code></pre>\n<p>这是SPI的接口,select方法的参数如下:</p>\n<ul>\n<li>invokers: 所有的服务 Provider 列表。</li>\n<li>url: 一些配置信息,比如接口名,是否check,序列化方式。</li>\n<li>invocation: RPC调用的信息,包括方法名,方法参数类型,方法参数。 下面是我们自己实现的一个LoadBalance,实现很简单,选择第一个 Invoker:</li>\n</ul>\n<pre><code>package com.demo.dubbo;\npublic class DemoLoadBalance implements LoadBalance {\n    @Override\n    public &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException {\n        System.out.println(&quot;[DemoLoadBalance]Select the first invoker...&quot;);\n        return invokers.get(0);\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>添加资源文件 添加文件:<code>src/main/resource/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>。这是一个简单的文本文件。文件内容如下:</li>\n</ol>\n<pre><code>demo=my=com.demo.dubbo.DemoLoadBalance\n</code></pre>\n<ol start=\"3\">\n<li>配置使用自定义LoadBalance</li>\n</ol>\n<pre><code>&lt;dubbo:reference id=&quot;helloService&quot; interface=&quot;com.demo.dubbo.api.IHelloService&quot; loadbalance=&quot;demo&quot; /&gt;\n</code></pre>\n<p>在Consumer端的<code>dubbo:reference</code>中配置<code>&lt;loadbalance=&quot;demo&quot;&gt;</code></p>\n<p>经过上面的3个步骤,我们编写了一个自定义的LoadBalance,并告诉Dubbo使用它了。启动Dubbo,我们就能看到Dubbo已经使用了自定义的DemoLoadBalance。</p>\n",
-  "title": "Dubbo的负载均衡",
-  "keywords": "Dubbo, LoadBalance",
-  "description": "本文介绍了负载均衡的相关概念以及 Dubbo 中的负载均衡策略实现。"
+  "link": "/zh-cn/blog/dubbo-loadbalance.html",
+  "meta": {
+    "title": "Dubbo的负载均衡",
+    "keywords": "Dubbo, LoadBalance",
+    "description": "本文介绍了负载均衡的相关概念以及 Dubbo 中的负载均衡策略实现。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-meetup-chengdu.json b/zh-cn/blog/dubbo-meetup-chengdu.json
index 511efdc9..6e0a1690 100644
--- a/zh-cn/blog/dubbo-meetup-chengdu.json
+++ b/zh-cn/blog/dubbo-meetup-chengdu.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-meetup-chengdu.md",
   "__html": "<h1>第四届Dubbo开发者沙龙于8月26日在成都举行</h1>\n<p><img src=\"../../img/blog/meetup-chengdu/all-hands.webp\" alt=\"img\"></p>\n<h2>用户深度沟通交流</h2>\n<p>8.26上午10:00-12:00,邀请到货车帮,云图金控,前BBD,飞鱼星四家公司开源爱好者及重度用户参与面对面交流;据参与者反馈,解答了对Dubbo的诸多疑惑,特别是如何参与贡献社区,以及捐献代码所带来的价值点。希望后面可以更加深入参与Dubbo社区及活动中。</p>\n<h2>meetup活动信息</h2>\n<p>本次活动依旧爆满,总报名人数976,现场用户350+,直播PV 13207。</p>\n<h2>报名信息</h2>\n<p>Aliware Open Source•成都站-Apache Dubbo开发者沙龙于8月26日(周日)在成都高新区天府五街200号菁蓉国际广场8号楼2楼会议厅举办,技术GG们的思想盛宴,干货与福利一个都不会少。</p>\n<p>报名链接:<a href=\"http://www.huodongxing.com/event/7453091088400\">http://www.huodongxing.com/event/7453091088400</a></p>\n<img src=\"../../img/blog/dubbo-chengdu-meetup-img.jpg\"/>",
-  "title": "第四届Dubbo开发者沙龙于8月26日在成都举行",
-  "keywords": "Dubbo, 成都, meetup",
-  "description": "第四届Dubbo开发者沙龙于8月26日在成都举行。"
+  "link": "/zh-cn/blog/dubbo-meetup-chengdu.html",
+  "meta": {
+    "title": "第四届Dubbo开发者沙龙于8月26日在成都举行",
+    "keywords": "Dubbo, 成都, meetup",
+    "description": "第四届Dubbo开发者沙龙于8月26日在成都举行。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.json b/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
index 4f3569bc..bb0596a6 100644
--- a/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
+++ b/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
   "__html": "<h1>第二届Dubbo开发者沙龙在上海成功举办</h1>\n<p>第二届Dubbo开发者沙龙在上海成功举办,超过700位开发者报名,现场参与人数300+,通过阿里云天池、云栖社区、大咖说引导线上直播观看次数10000+</p>\n<p>分享嘉宾及PPT:</p>\n<ul>\n<li>朱勇: Dubbo开源现状与未来规划 (中文) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-status-and-roadmap.pdf\">slides</a></li>\n<li>小马哥: Dubbo Cloud Native 之路的实践与思考 (中文) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-cloud-native-practices-and-thoughts.pdf\">slides</a></li>\n<li>郭平: Nacos - 贡献Dubbo生态,阿里巴巴注册中心和配置中心开源计划 (中文) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/nacos-open-source-initiative.pdf\">slides</a></li>\n<li>潘志伟: Dubbo在互金行业的应用场景 (中文) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-practices-on-internet-finance-industries.pdf\">slides</a></li>\n</ul>\n",
-  "title": "第二届Dubbo开发者沙龙在上海成功举办",
-  "keywords": "Dubbo, 上海, meetup",
-  "description": "第二届Dubbo开发者沙龙在上海成功举办。"
+  "link": "/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
+  "meta": {
+    "title": "第二届Dubbo开发者沙龙在上海成功举办",
+    "keywords": "Dubbo, 上海, meetup",
+    "description": "第二届Dubbo开发者沙龙在上海成功举办。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-meetup-shenzhen.json b/zh-cn/blog/dubbo-meetup-shenzhen.json
index eb2e8555..d7a62577 100644
--- a/zh-cn/blog/dubbo-meetup-shenzhen.json
+++ b/zh-cn/blog/dubbo-meetup-shenzhen.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-meetup-shenzhen.md",
   "__html": "<h1>第三届Dubbo开发者沙龙在深圳成功举办</h1>\n<p>第三届Dubbo开发者沙龙在深圳成功举办,超过2000位开发者报名,现场参与人数700+,通过阿里云天池、云栖社区、大咖说引导线上直播观看次数17000+</p>\n<p>分享嘉宾</p>\n<ul>\n<li>陈志轩: Dubbo开源现状和2.7规划</li>\n<li>康彬: 乐信集团的微服务化之路</li>\n<li>林佳梁: Sentinel——企业用户的全方位流量哨兵</li>\n</ul>\n",
-  "title": "第三届Dubbo开发者沙龙在深圳成功举办",
-  "keywords": "Dubbo, 深圳, meetup",
-  "description": "第三届Dubbo开发者沙龙在深圳成功举办。"
+  "link": "/zh-cn/blog/dubbo-meetup-shenzhen.html",
+  "meta": {
+    "title": "第三届Dubbo开发者沙龙在深圳成功举办",
+    "keywords": "Dubbo, 深圳, meetup",
+    "description": "第三届Dubbo开发者沙龙在深圳成功举办。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-mesh-in-thinking.json b/zh-cn/blog/dubbo-mesh-in-thinking.json
index 5d06bbed..8489c423 100644
--- a/zh-cn/blog/dubbo-mesh-in-thinking.json
+++ b/zh-cn/blog/dubbo-mesh-in-thinking.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-mesh-in-thinking.md",
   "__html": "<h1>Dubbo在Service Mesh下的思考和方案</h1>\n<h2>开头</h2>\n<p>Service Mesh这个“热”词是2016年9月被“造”出来,而今年2018年更是被称为service Mesh的关键之年,各家大公司都希望能在这个思潮下领先一步。今天我也分享阿里中间件在这方面的观点,思考和实践。考虑到有些人没了解过Dubbo(集团内以HSF为主)和Servicemesh,先简单介绍下这两个词。Dubbo应该是国内最受欢迎的远程服务框架,在Github上有超过2w的star数,也是阿里分布式架构互联互通的核心所在。跟Dubbo一样,servicemesh也是面向服务互联互通这一问题域,是云原生技术栈的核心之一;大家可以简单理解service mesh就是云原生组织定义的微服务架构解决理念。Dubbo是实现框架,融入servcemesh理念就是我们今天分享的。</p>\n<h2>现状和挑战</h2>\n<p><img src=\"../../img/blog/dubbomesh/1.png\" alt=\"1.png | center | 826x206\"></p>\n<p>当前Dubbo支撑的阿里分布式应用内支撑万级别的应用数,运行在20多万的服务器实例上,每天调用量是万亿级别,这应该是国内最大的分布式应用集群。</p>\n<p>挑战主要来自三方面</p>\n<ul>\n<li>首先, 数以万计的应用意味着有以十万级的服务,理顺错综复杂的服务拓扑关系,甚至及时诊断某个异常调用链路,需要考虑海量数据的拉取分析,是非常有挑战的,阿里通过EagleEye鹰眼链路系统提供可观察性和治理能力来解决;</li>\n<li>第二个挑战是机房级别容灾,阿里的机房是分布在天南海北,大家可以想象横跨数千公里的网络延迟会造成服务互通很大的影响,所以在保证一定恢复时间和一定数据容错的情况下做异地多活是有巨大挑战,阿里通过支持异地多活的单元化架构解决。</li>\n<li>第三个挑战是阿里业务众多,尤其像阿里生态中的高德,UC,优酷等所使用的开发语言跟淘系Java是不一样的,比如PHP,C,Nodejs,Dart等,要维护多个版本并保证各版本具有同样的功能是成本比较高的;这个挑战在云原生的新一代理念下更具挑战,毕竟。今天主题跟第三个挑战是息息相关,能解决一定的问题。</li>\n</ul>\n<p>这里讲个大鱼吃小鱼的故事来简单理解下云原生:软件会吃掉这个世界,也就是信息化不可避免,而开源会吃掉软件,最终云原生会吃掉开源。这正代表了云原生理念的颠覆性,从商业软件到开源到云原生,环环相套,以体系化和层次化的方式推荐各个方面的开源方案和标准,这会极大降低企业级架构服务的技术门槛,是企业信息化之路的一大利好,当然也是进化方向。这个故事跟今天的主题--开发者定义软件未来,是非常契合,也就是说这个趋势至少在企业级软件服务领域正在发生。云原生:Cloud Native is Patterns with A complete and trusted tool kit for modern architectures。</p>\n<p><span data-type=\"color\" style=\"color:white\">Service Mesh的典型方案</span></p>\n<h2>Service Mesh的典型方案</h2>\n<p><img src=\"../../img/blog/dubbomesh/2.png\" alt=\"2.png | center | 826x206\"></p>\n<p>讲完故事,回到servicemesh。</p>\n<p>传统形态下SDK代表着一个特定语言的库,由应用和微服务框架共处一进程内,在发布升级中共享生命周期。比较典型的代表是Twitter的finagle,Google的stubby/grpc,阿里巴巴的HSF/Dubbo.</p>\n<p>Serviemesh下推荐是右边Sidecar方案,Sidecar方案没有引入新的功能,只是改变了原有功能的位置,以独立的应用来存在,大家可以暂时以nginx来理解其网络代理能力也可以。</p>\n<p>在这张图中希望大家关注两个信息, 1)所有的sidecar形成逻辑网络被称为数据面,是业务服务的链路中是强依赖节点,承载了业务数据互联互通的基础;传统的ops管控服务被称为控制面,这部分跟传统是大同小异。 2)在sidecar形态下,网络会增加两跳,即应用与sidecar之间,他们之间的数据互通也是基于协议规范。后面会详细讲。</p>\n<h2>Sidecar模式的优劣</h2>\n<p><img src=\"../../img/blog/dubbomesh/3.png\" alt=\"3.png | center | 826x206\"></p>\n<p>接下来从开发和运维两个阶段来分开比较。</p>\n<ul>\n<li>多语言支持方面,既然sidecar是独立应用,用最合适的一种语言开发完成即可,就避免了需要针对不同语言的应用场景做不同的版本开发。当前阿里选择基于C语言的Envoy做二次开发来追求最小的footprint和性能,当然也曾经历一些弯路,比如曾经用Java开发过一个sidecar,但最终由于引入JRE体量大和GC带来的抖动等问题证明不可行。有必要强调的是:这里说的是sidecar自身开发现在避免了多语言多版本的问题,而真要支持任意服务自由采用任意语言实现这一理想,是需要站在从业务到数据面再到业务的整个链路上的数据交互做思考。</li>\n<li>性能方面,sidecar情形下由于会增加两跳,这两跳是业务应用与sidecar的两个进程之间的调用,这是本机,即便是经过优化,也是会增加进程切换以及数据转换的开销。经过我们的优化测试,在正常的业务访问下,相比SDK形态下最多增加1毫秒的开销,这在大多数业务情形下是基本无感知无影响。</li>\n<li>再看运维阶段的比较,一般SDK形态的服务框架都是只关心开发的诉求,对于如何运维都是不关心,而软件生命周期中运维是最长的,如何从中间件角度解决更多的运维问题是非常有意义的。阿里的中间件经常需要升级,以库的形式升级时就需要业务方应用重新打包,这个推动业务方变更的方式是比较被动,而且周期很长。</li>\n<li>当以镜像为基本原子单位进行发布部署时,阿里的中间件SDK体量大概是200兆,需要与业务一起打包,这样在业务应用升级时让分发的包就显得笨重,时效性相比sidecar形态就差一截。</li>\n</ul>\n<p>稍微总结下,sidecar具有两个明显优势,一个是多语言开发维护成本低 ,另一个是独立升级,当然代价是需要增加一点点的网络延迟。至此大家是不是觉得Sidecar基本完美? 别着急,需要大家再思考一个问题:SDK模式下中间件组件会随应用一起发布,拥有完全一致的生命周期;而在sidecar模式下,如何管理sidecar的生命周期?这里可以拿无线耳机来举个例子,无线耳机是独立了,但必须独立电源的驱动,所以充电是要的。是的,在大规模的集群中这个点会带来不小的复杂性。</p>\n<h2>关键点</h2>\n<p><img src=\"../../img/blog/dubbomesh/4.png\" alt=\"4.png | center | 826x206\"></p>\n<p>下面跟大家分享下我们对servicemesh理解的三个关键技术点。分别是sidecar运维,数据面与控制面的集成,协议。</p>\n<ul>\n<li>先说sidecar的运维,这是个难点,也是为什么sidecar方案以前没有被广泛应用的重要原因。前面说sidecar与应用现在成为两个不同的进程,要考虑多个事宜,一是要考虑如何把sidecar与应用部署在一起,二是考虑业务进程或sidecar进程一方需要升级重启时如何协同来保证请求的正常处理或转发,即优雅上下线的问题。这些事宜考虑清楚并解决后,算是具备servicemesh的前提条件。当然,kubernetes解决了这块的事情,提供了initiator类似插件的机制来对原子性的pod进行注入sidecar,并通过健康检查机制来保证两个进程的协同。简单地也可以这么理解:先把kubernetes容器调度平台的实施是servicemesh的前提条件。</li>\n<li>数据面中的sidecar的服务治理能力则是其核心竞争力,包括负载均衡策略,路由,安全,权重等等,这些能力是以规则形式通过控制面来统一下发给数据面。在传统微服务框架下数据面和控制面的集成是紧耦合,也就是数据面和控制面是一体的,举例来说用了Dubbo框架,只能选择Dubbo-Ops。而Envoy作为servicemesh思潮的带领者,提出了一整套的API规范,Istio可以实现其xDS接口,阿里巴巴也可以根据自己的架构设计实现类似的服务平台。</li>\n<li>协议 协议 协议, 重要的事说三遍。。。sidecar和Dubbo的内核是网络协议的处理器,而sidecar又是面向多语言场景的,所以自然协议处理能力是要强调的。先说下阿里Dubbo当下向Mesh方向发展时遇到难点。首先我们的服务接口都是通过Java Interface描述,其次涉及的传输模型DTO也是Java POJO定义,最后协议也是私有的。这会导致跨语言比较难,而sidecar形态需要面向多语言,这些问题更是首当其冲。考虑到这里有点稍微偏细节点,希望大家带着如下问题来先思考下:业务应用到sidecar之间的数据交换要考虑什么? Sidecar自身在处理网络字节流时又要考虑什么?是的,首先业务应用最好都不依赖特定协议库,也不依赖特接口定义库;Sidecar自身处理数据时跟nginx很接近,但最好具备协议转换适配的能力,比如把基于HTTP的请求转换为Dubbo请求,就能轻松集成Dubbo遗留系统。</li>\n</ul>\n<h2>回看协议</h2>\n<p><img src=\"../../img/blog/dubbomesh/5.png\" alt=\"5.png | center | 826x206\"></p>\n<p>既然协议在跨语言场景下如此重要,有必要稍微回归下协议的历史轨迹。看历史一般是轻松有趣的过程,最重要的好处是能使我们头脑清晰而不迷茫。</p>\n<p>我们先从2008年说起,很近也就10年,阿里服务框架诞生这一年。当年各大公司还在炒作SOA思想的时候,阿里在不清楚SOA思想的情况下根据自身业务诉求实践拥抱了SOA的架构。阿里服务框架一直是从三个层面来定义,第一RPC通信 第二是提供丰富强大的治理能力 第三就是基于容器隔离的运维能力,使得中间件可以独立升级。这个理念直到今日都是非常先进,非常的赞。就像前面说的,Dubbo主要是面向Java领域的微服务架构解决方案,在以Java为主导的技术架构下是绝对首选,但因为其协议设计是私有特性,要想成为跨语言的协议标准是有一定难度。</p>\n<p>事实上,之前已经出现了很多通用的跨语言的服务集成规范。最早是91年的考吧,是分布式对象访问协议,2000年的SOAP是当年webservice思想下的协议,无论是考吧还是SOAP都是支持所有平台和语言的一套规范,但是设计地比较复杂笨重,且性能存在一定问题。</p>\n<p>REST是一种架构风格,相比SOAP的设计,有非常优秀的理念和最佳实践指导,并且万维网作为世界上最大型最成功的的分布式应用是REST最好的证明。但跟SOAP一样,REST跑在1上有性能瓶颈,这个也可能是当年阿里服务框架没有选择REST规范的原因。额外提下,REST思想虽然很早就有,但事实上REST的规范在Java领域JAX-RS API 直到最近两年在2.2版本下才算稳定成形,且越来越接近微服务框架。</p>\n<p>1996年的1在连接通道不支持多工复用,根本无法发挥TCP/UDP的网络能力;而到了2015年HTTP2则解决这些,能够最大限度的利用TCP层的网络宽带,且支持了streaming,push等交互模式,这些跟很多的私有或专有应用协议干得是一个事,但是标准化的大家都容易接受的事。这里必须提一下,伴随HTTP2而来的是grpc,原先Google早早推出了Protocolbuffer,但一直没把自家stubby开源,我猜测最大的原因是不想grpc跑在一个私有协议上,而是在等HTTP2.</p>\n<p>总结下来,协议技术一直在向着轻量级和标准规范化的方向发展。像SOAP,考吧这些重量级的不跨平台的协议必然消失在历史车轮里,私有或专有的协议也会向标准协议靠拢。在面向跨语言的场景下,有两种的协议规范是大概率胜出,一种是REST,一种是grpc,两者都是以HTTP为交换通道。</p>\n<h2>面向多语言协议的三层面</h2>\n<p><img src=\"../../img/blog/dubbomesh/6.png\" alt=\"6.png | center | 826x206\"></p>\n<p>展开来讲,在面向多语言的协议需要考虑三个层面。</p>\n<ul>\n<li>先从最右边的会话层,干得事是在tcp字节流的基础上形成交互模式,比如 一对一的标准请求响应模式, 以及onway, 一对多的streaming模式。Dubbo在这一层是有扩展能力的,目前除了支持自定义的Dubbo-Remoting,也支持基于HTTP通道能力,我们觉得未来的趋势是HTTP2,所以也会支持这块.这里在分享一句话跟大家一起思考,HTTP不是RPC,HTTP被翻译成超文本传输协议,但不是传输层。另外提一下,这一层是对于MQ,Streaming Compute,Cache等等都是通用的。</li>\n<li>再说展示层,干得事是在真正的服务调用过程中,业务对象以何种形式被格式化,比如HTTP头中的content-type就用于这个展示协议的描述,最常用的JSON,TXT,XML等。这一层对于sidecar来说,可以做透明处理,也就是说sidecar只需要解析出头部信息,前提是要求业务应用把需要在治理时用到的一些字段信息以字符串形式放到头部中。Dubbo当前是默认HEssion,跨语言能力比较弱,所以未来JSON是我们首选。</li>\n<li>最后,首先一个服务是干什么的,它的名字,方法,参数都是怎样的,等等基本元信息是需要统一描述的,即便像是REST这样基于URI,也是需要一种协议来定义,以前Dubbo是基于java interface来定义,现在我们在多语言的mesh环境下是考虑向OpenAPI specification方向考虑,支持swagger。\n我们相信在这几个层面,尤其是会话层和应用层,用不多几年一定会是标准化的,尤其是在云原生的趋势下。</li>\n</ul>\n<h3>方案之Kubernetes集成<span data-type=\"color\" style=\"color:white\">Du</span></h3>\n<p><img src=\"../../img/blog/dubbomesh/7.png\" alt=\"7.png | center | 826x206\">\n<span data-type=\"color\" style=\"color:white\">bbo Mesh方案之Kubernetes集成</span>\n其实,servicemesh在最近两年流行最大的原因是云原生理念的逐渐深入人心,从广义角度看,能够融入云原生的微服务框架都能称得上servicemesh。谈云原生,肯定绕不开kubernetes,所以我们在Dubbo Mesh的方案的第一个分享是 在kubernetes下的集成,目标是复用Kubernetes的基础服务,从而使得Dubbo能解决kubernetes环境下的微服务集成问题,同时能最大限度的利用dubbo已有的功能。核心思路是两点,</p>\n<ul>\n<li>Dubbo应用在构建阶段自动生成其deployment和service的声明文件。这个主要是解决Dubbo与kubernetes的服务映射。</li>\n<li>Dubbo地址注册针对kubernetes的扩展实现,通过Kubernetes的APIServer来拉取并监听某个服务的podIP。这样,在kubernetes集群内,Dubbo服务就能在其podID的虚拟网络内实现服务发现。</li>\n</ul>\n<h2>方案之跨语言协议支持</h2>\n<p><img src=\"../../img/blog/dubbomesh/8.png\" alt=\"8.png | center | 826x206\"></p>\n<p>前面讲了很多关于协议方面的东西,也为我们在Dubbo Mesh的方案的第二点分享是做了铺垫, 第二点的目标是Dubbo 协议的多语言支持。核心思路是</p>\n<ul>\n<li>积极兼容开源社区Envoy,这个使得Envoy上兼容支持Dubbo的私有协议。</li>\n<li>Dubbo支持HTTP/2作为传输通道,这个是为了Dubbo的协议通道能力向更加开放更加标准规范的方向做努力。</li>\n</ul>\n<h2>ServiceMesh之云原生的指导</h2>\n<p><img src=\"../../img/blog/dubbomesh/9.png\" alt=\"9.png | center | 826x206\"></p>\n<p>孤立地看待servicemesh其实和传统服务框架,价值还不算大,甚至成本相对更高。这时候,当我们把servicemesh设定到云原生的上下文中,就会发现不一样的意义。</p>\n<p>servicemesh是云原生理念的路径地图的第五步,如果没有前面的容器化,CICD等四部,真正拥抱servicemesh也只是空中楼阁。阿里在这方面的实践经验是,servicemesh的实施是需要结合软件开发的整个生命周期进行统筹,从软件在本地开发测试,到通过持续集成服务的自动化构建,再到以镜像方式分发到仓库并依托调度云平台的持续部署,最后持续监控。</p>\n<p>dubbo已经开源好多年,是非常符合云原生这个原则,正向servicemesh方向和云原生理念上努力,为企业信息化做出一点贡献。</p>\n<h2>总结</h2>\n<p>总结一下Dubbo Mesh是Dubbo在cloud native下的一种演进,这个演进是为了更加开放更加靠近标准协议规范的方向做的探索。通过分享希望大家能带走三点思考。</p>\n<ol>\n<li>servicemesh的多语言方案其实是走规范化标准化的协议之路,这样才能覆盖多语言的诉求。</li>\n<li>建议大家根据实际业务场景来慎重权衡sidecar模式下运维复杂性和收益回报。</li>\n<li>一定把servicemesh设定在云原生的上下文中才具意义,离开了Kubernetes谈servicemesh的实践是不建议的大跃进。\n最后希望大家一起共建共享的Dubbo开源社区,谢谢。</li>\n</ol>\n",
-  "title": "Dubbo在Service Mesh下的思考和方案",
-  "keywords": "Dubbo, Service Mesh, Cloud Native",
-  "description": "Dubbo是实现框架,融入servcemesh理念就是我们今天分享的。"
+  "link": "/zh-cn/blog/dubbo-mesh-in-thinking.html",
+  "meta": {
+    "title": "Dubbo在Service Mesh下的思考和方案",
+    "keywords": "Dubbo, Service Mesh, Cloud Native",
+    "description": "Dubbo是实现框架,融入servcemesh理念就是我们今天分享的。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-mesh-service-mesh-exploring.json b/zh-cn/blog/dubbo-mesh-service-mesh-exploring.json
index fa0eb7b1..f213869e 100644
--- a/zh-cn/blog/dubbo-mesh-service-mesh-exploring.json
+++ b/zh-cn/blog/dubbo-mesh-service-mesh-exploring.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-mesh-service-mesh-exploring.md",
   "__html": "<h1>Dubbo Mesh | Service Mesh的实践与探索</h1>\n<p><img src=\"../../img/blog/meetup-chengdu/all-hands.webp\" alt=\"img\"></p>\n<p>近日,在Aliware Open Source•成都站-Apache Dubbo 开发者沙龙上,阿里巴巴中间件高级技术专家李云(至简)向开发者们分享了阿里巴巴中间件团队在Service Mmesh领域的探索和最新实践。本文是根据至简的现场分享所整理,为大家回顾分享中的精彩内容。</p>\n<h2>精彩观点导读</h2>\n<ul>\n<li>\n<p>我们去探索一项技术,并不会仅仅因为其先进性,而是因为我们目前遇到了一些无法解决的问题,而这项技术正好能解决这个问题。</p>\n</li>\n<li>\n<p>所有软件最重要的使命不是满足功能要求,而是演进,从而持续成长。</p>\n</li>\n<li>\n<p>微服务本质是对服务的拆分,微服务架构符合工程领域常用的“分而治之”范式。</p>\n</li>\n</ul>\n<h2>前言</h2>\n<p>我们去探索一项技术,并不会仅仅因为其先进性,而是因为我们目前遇到了一些无法解决的问题,而这项技术正好能解决这个问题。现在,阿里巴巴整个集团业务的体量很大,在技术上会遇到很多的挑战。而正是因为这些挑战,让我们思考通过哪些新技术可以去解决这些痛点,这也是我们在Service Mesh领域进行探索和实践的出发点。首先,我们先来看看自己遇到了哪些挑战。</p>\n<h2>微服务的5大挑战</h2>\n<h4>挑战一:微服务框架自身演进困难。</h4>\n<p>任何软件都会有他的生命进化曲线,从最初的萌芽,进入形成期,往上发展,再进入平台期,最后进入衰亡期。当然我们希望我们的软件可以在进入平台期后,能借助某次演进进入新的发展期。从这个维度看,所有软件最重要的使命不是满足功能要求,而是演进,从而持续成长。相反,当某个软件无法演进的时候,就会意味着死亡。但软件的演进并不是一个简单的事情,以微服务框架为例,为了进一步提升双11期间整个中间件平台的稳定性,我们会修改若干个功能,并以SDK的方式去提供给业务方,但业务代码和微服务框架SDK是强耦合的,这时候需要我们推动各个业务方和我们一同去做升级。虽然我们的初衷是实现平台稳定性的提升,帮助业务更好的发展,但这时由于大家的出发点和诉求有所不同,业务方和我们一起去做升级是比较困难的。所以要发展微服务框架,首先遇到的挑战就是演进困难。\n<img src=\"../../img/blog/meetup-chengdu/challenges.jpg\" alt=\"img\"></p>\n<h4>挑战二:微服务框架SDK多语言并行开发与维护成本高。</h4>\n<p>以前我们都是通过对技术栈的统一来提升成本优势和团队效率,大家可以用一种语言去开发和维护,避免多语言时团队的不聚焦。但在软件和开源生态演进的过程中,多语言已经成为一种流行,因为不同语言都有其自身的优势,今天大家能看到的一个现象是云原生的生态中有多种开发语言,使用频率最高的语言已经不是Java了,而是Go,是因为Go的footprint很小。再以 Dubbo为例,除了Java,我们还提供C++,Node.js的SDK,以便让更多的开发者可以加入Dubbo生态,但所有的这些,如果没有社区力量的参与,是很难维持的。\n<img src=\"../../img/blog/meetup-chengdu/speaker.webp\" alt=\"img\"></p>\n<h4>挑战三:异构服务框架难以共存完成渐进式演进。</h4>\n<p>我们结合场景来看看这个挑战。阿里巴巴收购了一些企业,被收购企业的技术栈可能和阿里巴巴不同,比如有些用的是Go语言,有些用的是PHP,这时候为了统一技术栈,我们需要对这类技术平台推倒重来,但这个过程中,我们会面临一系列问题,首当其冲的就是推倒重来会带来巨大的技术风险,其次是可能会面临技术人员大批量流失的风险,这在社会责任的层面也是很难接受。所以我们在寻求一种可能的方案,去解决这类问题。</p>\n<h4>挑战四:是单一的语言限制了人才的多样性。</h4>\n<p>这里,我们不去争论某个编程语言的好与坏,每个语言都有其适用场景,你不能说我手里有个榔头,你面对的都是钉子。以前我们觉得统一技术栈可以集中开发力量,并且带来较高的运维便利性。但伴随着互联网带来的快节奏,以往的团队能力设置已经很难满足这类变化,对工程师个体提出了更高的要求,我们不仅仅需要是某一方面的专家,而且还需要具备多域的工作技能,DevOps和全栈工程师就是这类快节奏变化下最好的注脚。\n<img src=\"../../img/blog/meetup-chengdu/challenges-continued.jpg\" alt=\"img\"></p>\n<h4>挑战五:是点状的服务治理难以做到及时、有效和经济。</h4>\n<p>微服务和架构的核心是拆分,通过拆分,让每个模块可以独立运行,跟上业务的发展速度,持续推动业务的创新。但拆完后新的问题出来了,缺少横向的内容拉通所有独立的烟囱,从而在服务治理上带来极大的挑战。</p>\n<h2>分布式应用的发展趋势</h2>\n<p>微服务会成为大规模分布式应用的主流架构。任何复杂的工程问题都会归结为devide and conquer(分而治之),意思就是就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。微服务本质是对服务的拆分,与工程领域惯用的“分而治之”的思路是一致的。</p>\n<p>微服务架构下应用的开发是多语言的。没有一个语言是一家独大的,每种语言在特定场景下都有其自身的优势,我们希望这种优势能够将技术到产品的周期(time to market)缩短。技术的核心在于创造价值,无论是交付给客户,还是服务于整个社会。因此,微服务是需要不同语言的开发者发挥自身的优势,去进一步完善我们的微服务架构,释放技术价值。\n<img src=\"../../img/blog/meetup-chengdu/trends.jpg\" alt=\"img\"></p>\n<p>数据安全将成为公有云分布式应用的生命线。云原生时代,业务即便没上云,企业对自身数据的安全都是有诉求的,尤其是在金融行业,如果通过抓包就能获取一些敏感信息,这将会给企业带来巨大的风险。</p>\n<p>Cloud native成为distributionless(无分布式)的主要探索路径。分布式发展的终极形式是无分布式,在未来我们做开发,所有的代码在web上写好后,通过点击一个按钮,所有部署都会自动实现,所有的code review的工作可以在一个统一的工作台上全部实现。\n<img src=\"../../img/blog/meetup-chengdu/audience-shapshot\" alt=\"img\"></p>\n<p>以更快的速度,通过构建软件去探索新业务。工程师服务的是客户,通过技术输出来实现技术价值,以互联网的架构帮助赋能传统企业,帮助企业获得差异化竞争力。</p>\n<h2>什么是Service Mesh</h2>\n<p>Service Mesh是层次化、规范化、体系化、无侵入的分布式服务治理技术平台。</p>\n<h4>层次化</h4>\n<p>分为数据面和控制面两个概念,数据面是指所有数据流动的那个层面,控制面是用来控制这个数据面的,对服务去做处理。对数据面和控制面进行分层,带来的好处是,针对一个复杂的系统进行切分,可以获得更清晰的认识,这和devide and conque是同一个理念。</p>\n<h4>规范化</h4>\n<p>是指通过标准协议完成数据平面和控制平面的连接,同时,sidecar成为所有traffic互联、互通的约束标准。</p>\n<p><img src=\"../../img/blog/meetup-chengdu/what.jpg\" alt=\"img\"></p>\n<h4>体系化</h4>\n<p>包含两个维度,一是指observability全局考虑。目前在整个分布式治理过程中的最大挑战是:logging、metrics、tracing这三个observability领域的核心内容缺少体系性的关注。另一个是集中管理的维度,包括服务管理、限流、熔断、安全、灰度在内的服务模块都可以在获得体系化的呈现,每个服务都可以被看到,而非团队a只看限流,团队b只看logging,需要一种技术能力拉通所有的服务模块,这个体系化这个角度看,Service Mesh是一个理想的技术方案。</p>\n<h4>无侵入</h4>\n<p>是指我们希望通过无侵入,当新增一个业务的时候,不需要考虑一个SDK去初始化,而是可以通过sidecar的进程方式来解耦。</p>\n<h2>Service Mesh的形态</h2>\n<p>我们从三个维度对比的来看 ServiceMesh 的形态。</p>\n<p>图中左边是传统的微服务形态,调用者和被调用者是通过一个SDK的方式来实现共享服务的,以Dubbo为例,我们会在SDK里提供服务路由、服务发现等功能,虽然我们的开发者在做应用开发的时候并不会太关注SDK的构成,但这些功能是面临不断被变更的可能,有着比较重的逻辑。在右边Service Mesh的形态中,我们首先会对厚重的SDK进行分解,将复杂的逻辑下沉到sidecar,借助sidecar来实现服务的调用。</p>\n<p><img src=\"../../img/blog/meetup-chengdu/forms.jpg\" alt=\"img\"></p>\n<p>虽然在Service Mesh的形态,调用路径要长于传统的形态,路径越长消耗越大,对性能影响越大。但在当前的分布式应用的治理过程中,易用性已经成为一个比性能更重要的话题。当我们给客户部署一套微服务,即便性能很强,但没有处理好易用性问题的话,这将会给技术的推广带来巨大的阻碍,不仅是会影响外部的客户,也会影响内部的用户,如何实现喝着咖啡从容应对双11,必须先解决易用性的问题。在解决易用性问题后,沿着技术的发展路径再去解决性能问题。</p>\n<p>Service Mesh的形态中的control plan不会导致重复建设,但在shared service是有可能存在重复建设的。</p>\n<h2>Service Mesh下的应用架构</h2>\n<p>无论是单体应用,还是分布式应用,都可以建立在Service Mesh上,mesh上的sidecar支撑了所有的上层应用,业务开发者无须关心底层构成,可以用Java,也可以用Go等语言完成自己的业务开发。</p>\n<h2>Service Mesh的价值</h2>\n<ul>\n<li>\n<p>为单体应用向微服务架构演进提供了渐进的途径</p>\n</li>\n<li>\n<p>为异构(微)服务框架/平台提供了融合发展的可能</p>\n<ul>\n<li>被收购子公司与母公司的业务可以融合发展</li>\n</ul>\n</li>\n<li>\n<p>加速(微)服务框架/平台自身的演进</p>\n</li>\n<li>\n<p>让业务开发同学聚焦于业务逻辑本身</p>\n</li>\n<li>\n<p>业务开发时无需关心安全、灰度、限流、熔断等通用的技术内容</p>\n</li>\n<li>\n<p>培育了多语言业务开发的土壤</p>\n<ul>\n<li>助力人才发展中编程语言的多样性</li>\n</ul>\n</li>\n<li>\n<p>对(异构)微服务架构应用实现更为有效的全局一体化监管控</p>\n</li>\n</ul>\n<h2>Dubbo Mesh的发展思路</h2>\n<ul>\n<li>\n<p>迎合Kubernetes已成orchestrator王者的大势</p>\n</li>\n<li>\n<p>开源版本与阿里巴巴集团内版本统一</p>\n</li>\n<li>\n<p>与领域主流开源项目形成合力发展,源于开源、反哺开源</p>\n</li>\n</ul>\n<h2>Q&amp;A</h2>\n<h4>阿里巴巴是怎么从微服务过渡到sidecar模式,再过渡到Service Mesh?</h4>\n<p>整个过渡是渐进式的,我们会将控制平面的一些组件先下沉到与sidecar部署在一起,这一下沉能很好复用开源软件已有的能力而减少开发工作量。当这一步骤完成后,被下沉的控制面组件会重新拉回到上面的控制面,那时就会面临一定的服务端改造,一旦改造完成就有了一个全新、完整的Service Mesh。</p>\n<h4>Service Mesh中的服务注册发现,负载均衡,网关,熔断降级,超时,限流,消息总线,分布式配置,这些都是怎么实现的?</h4>\n<p>Dubbo Mesh在控制面会基于Istio去做,而Istio已经具备了Kubernetes下的服务注册与发现能力,我们要做的是扩充Istio的能力,让服务注册与发现能与ZooKeeper、Nacos进行对接去完成。基于开源的Envoy所实现的sidecar已实现了超时处理的功能,相应的内容可以读代码去了解。其他内容我们仍在规划中。</p>\n<h4>Dubbo Mesh目前性能怎么样? 增加一层sidecar导致Dubbo的RT有多少?</h4>\n<p>在使用iptables的情形下,一跳增加1.5毫秒,如果不采用iptables直接proxy方式的情形下应当性能更好(这一点与Lyft也邮件确认过了),我们接下来会做更多的性能测试,目前的焦点更多在于功能层面。</p>\n<h4>Dubbo Mesh是把双刃剑,经过的链路更复杂,运维和开发者问题排查有没有更有效的工具?</h4>\n<p>理论上,增加一跳并没有改变服务调用的拓扑结构,但确实会增加复杂度,这个应当通过设计实现去解决。好在因为是一体化的方案,所以解决这类问题时需要更具全局视野。</p>\n<h4>Service Mesh中控制面板也用C++吗?我看主流很多实现都是Go, 我相信大佬做过技术调研,有哪些优势?</h4>\n<p>控制面是复用Istio的,是Go语言的。我们力争不重复造轮子,而是以开放的心态去共建。</p>\n<h4>Client做解码和反序列化是吧,有计划支持HTTP2协议吗?</h4>\n<p>Envoy默认就支持了,不需我们开发。这也是借力开源的收益。</p>\n<h4>Dubbo Mesh已经支持UNIX Domain Socket了吗?</h4>\n<p>目前不支持,这个还处于意向阶段。</p>\n",
-  "title": "Dubbo Mesh | Service Mesh的实践与探索",
-  "keywords": "Dubbo, Service Mesh",
-  "description": "本文介绍了Dubbo在Service Mesh方向的实践与探索"
+  "link": "/zh-cn/blog/dubbo-mesh-service-mesh-exploring.html",
+  "meta": {
+    "title": "Dubbo Mesh | Service Mesh的实践与探索",
+    "keywords": "Dubbo, Service Mesh",
+    "description": "本文介绍了Dubbo在Service Mesh方向的实践与探索"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-new-async.json b/zh-cn/blog/dubbo-new-async.json
index 3e759244..cc1f55ef 100644
--- a/zh-cn/blog/dubbo-new-async.json
+++ b/zh-cn/blog/dubbo-new-async.json
@@ -1,7 +1,10 @@
 {
   "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/books/dubbo-user-book/demos/async-call.html\">异步调用</a>、<a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/callback-parameter.html\">参数回调</a>、<a href=\"http://dubbo.apache.org/books/dubbo-user-book/demos/events-notify.html\">事件通知</a>等,在上面的文档链接中有关于使用方式的简单介绍和Demo。</p>\n<p>但当前的异步方式存在以下问题:</p>\n<ul>\n<li>Future获取方式不够直接</li>\n<li>Future接口无法实现自动回调,而自定义ResponseFuture虽支持回调但支持的异步场景有限,如不支持Future间的相互协调或组合等</li>\n<li>不支持Provider端异步</li>\n</ul>\n<p>以Consumer端异步使用方式为例:</p>\n<ol>\n<li>定义一个普通的同步接口并声明支持异步调用</li>\n</ol>\n<pre><code>public interface FooService {\n    String findFoo(String name);\n}\n</code></pre>\n<pre><code>&lt;dubbo:reference id=&quot;fooService&quot; interface=&quot;com.alibaba.foo.FooService&quot;&gt;\n      &lt;dubbo:method name=&quot;findFoo&quot; async=&quot;true&quot; /&gt;\n&lt;/dubbo:reference&gt;\n</code></pre>\n<ol start=\"2\">\n<li>通过RpcContext获取Future</li>\n</ol>\n<pre><code>// 此调用会立即返回null\nfooService.findFoo(fooId);\n// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future\nFuture&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture();\nfooFuture.get();\n</code></pre>\n<p>或</p>\n<pre><code>// 此调用会立即返回null\nfooService.findFoo(fooId);\n// 拿到Dubbo内置的ResponseFuture并设置回调\nResponseFuture future = ((FutureAdapter)RpcContext.getContext().getFuture()).getFuture();\nfuture.setCallback(new ResponseCallback() {\n    @Override\n    public void done(Object response) {\n        System.out.print(response);\n    }\n\n    @Override\n    public void caught(Throwable exception) {\n        exception.printStackTrace();\n    }\n});\n</code></pre>\n<p>从这个简单的示例我们可以体会到一些使用中的不便之处:</p>\n<ol>\n<li>findFoo的同步接口,不能直接返回代表异步结果的Future,通过RpcContext进一步获取。</li>\n<li>Future只支持阻塞式的get()接口获取结果。</li>\n<li>通过获取内置的ResponseFuture接口,可以设置回调。但获取ResponseFuture的API使用不便,且仅支持设置回调其他异步场景均不支持,如多个Future协同工作的场景等。</li>\n</ol>\n<h2>2.7.0基于CompletableFuture的增强</h2>\n<p>了解Java中Future演进历史的同学应该知道,Dubbo 2.6.x及之前版本中使用的Future是在java 5中引入的,所以存在以上一些功能设计上的问题,而在java 8中引入的CompletableFuture进一步丰富了Future接口,很好的解决了这些问题。</p>\n<p>Dubbo在2.7.0版本已经升级了对Java 8的支持,同时基于CompletableFuture对当前的异步功能进行了增强。</p>\n<ol>\n<li>\n<p>支持直接定义返回CompletableFuture的服务接口。通过这种类型的接口,我们可以更自然的实现Consumer、Provider端的异步编程。</p>\n<pre><code>public interface AsyncService {\n    CompletableFuture&lt;String&gt; sayHello(String name);\n}\n</code></pre>\n</li>\n<li>\n<p>如果你不想将接口的返回值定义为Future类型,或者存在定义好的同步类型接口,则可以额外定义一个异步接口并提供Future类型的方法。</p>\n<pre><code>public interface GreetingsService {\n    String sayHi(String name);\n}\n</code></pre>\n<pre><code>@AsyncFor(AsyncService.class)\npublic interface GrettingServiceAsync extends GreetingsService {\n    CompletableFuture&lt;String&gt; sayHiAsync(String name);\n}\n</code></pre>\n<p>这样,Provider可以只实现sayHi方法;而Consumer通过直接调用sayHiAsync可以拿到一个Future实例,Dubbo框架在Provider端会自动转换为对sayHi方法的调用。</p>\n<p>为每个同步方法提供一个异步方法定义会比较麻烦,更进一步的,利用Dubbo生态中的<a href=\"https://github.com/dubbo/dubbo-async-processor\">Annotation Processor实现</a>,可以自动帮我们自动生成异步方法定义。</p>\n</li>\n<li>\n<p>同样的,如果你的原始接口定义不是Future类型的返回值,Provider端异步也提供了类似Servlet3.0里的Async Servlet的编程接口: <code>RpcContext.startAsync()</code>。</p>\n<pre><code>public interface AsyncService {\n    String sayHello(String name);\n}\n</code></pre>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public String sayHello(String name) {\n        final AsyncContext asyncContext = RpcContext.startAsync();\n        new Thread(() -&gt; {\n            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);\n        }).start();\n        return null;\n    }\n}\n</code></pre>\n<p>在方法体的开始<code>RpcContext.startAsync()</code>启动异步,并开启新线程异步的执行业务逻辑,在耗时操作完成后通过<code>asyncContext.write</code>将结果写回。</p>\n</li>\n<li>\n<p>RpcContext直接返回CompletableFuture</p>\n<pre><code>CompletableFuture&lt;String&gt; f = RpcContext.getContext().getCompletableFuture();\n</code></pre>\n</li>\n</ol>\n<p>以上所有的增强,是在兼容已有异步编程的基础上进行的,因此基于2.6.x版本编写的异步程序不用做任何改造即可顺利编译通过。</p>\n<p>接下来,我们通过几个示例看一下如何实现一个全异步的Dubbo服务调用链。</p>\n<h2>示例1:CompletableFuture类型接口</h2>\n<p>CompletableFuture类型的接口既可以用作同步调用,也可以实现Consumer或Provider的异步调用。本示例实现了Consumer和Provider端异步调用,代码参见<a href=\"https://github.com/dubbo/dubbo-samples/tree/samples-for-2.7.0-SNAPSHOT/dubbo-samples-async-original-future\">dubbo-samples-async-original-future</a>。</p>\n<ol>\n<li>\n<p>定义接口</p>\n<pre><code>public interface AsyncService {\n    CompletableFuture&lt;String&gt; sayHello(String name);\n}\n</code></pre>\n<p>注意接口的返回类型是<code>CompletableFuture&lt;String&gt;</code>。</p>\n</li>\n<li>\n<p>Provider端</p>\n<ul>\n<li>\n<p>实现</p>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public CompletableFuture&lt;String&gt; sayHello(String name) {\n        return CompletableFuture.supplyAsync(() -&gt; {\n            try {\n                Thread.sleep(5000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            return &quot;async response from provider.&quot;;\n        });\n    }\n}\n</code></pre>\n<p>可以看到这里通过supplyAsync将业务代码切换到了新的线程执行,因此实现了Provider端异步。</p>\n</li>\n<li>\n<p>配置</p>\n<pre><code>&lt;bean id=&quot;asyncService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&quot;/&gt;\n&lt;dubbo:service interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot; ref=&quot;asyncService&quot;/&gt;\n</code></pre>\n<p>配置方式和普通接口是一样。</p>\n</li>\n</ul>\n</li>\n<li>\n<p>Consumer端</p>\n<ul>\n<li>配置</li>\n</ul>\n<pre><code>&lt;dubbo:reference id=&quot;asyncService&quot; timeout=&quot;10000&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot;/&gt;\n</code></pre>\n<p>​\t配置方式和普通接口是一样。</p>\n<ul>\n<li>调用远程服务</li>\n</ul>\n<pre><code>public static void main(String[] args) throws Exception {\n        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});\n        context.start();\n        final AsyncService asyncService = (AsyncService) context.getBean(&quot;asyncService&quot;);\n    \n        CompletableFuture&lt;String&gt; future = asyncService.sayHello(&quot;async call request&quot;);\n        future.whenComplete((v, t) -&gt; {\n            if (t != null) {\n                t.printStackTrace();\n            } else {\n                System.out.println(&quot;Response: &quot; + v);\n            }\n        });\n        System.out.println(&quot;Executed before response return.&quot;);\n        System.in.read();\n    }\n</code></pre>\n<p><code>CompletableFuture&lt;String&gt; future = asyncService.sayHello(&quot;async call request&quot;);</code>很自然的返回了Future示例,这样就实现了Consumer端的异步服务调用。</p>\n</li>\n</ol>\n<h2>示例2:同步接口使用Annotation Processor</h2>\n<p>这个示例演示了如何在只定义同步接口的基础上,使用Annotation Processor实现Consumer端异步方服务调用,具体代码参见地址<a href=\"https://github.com/dubbo/dubbo-samples/tree/samples-for-2.7.0-SNAPSHOT/dubbo-samples-async-generated-future\">dubbo-samples-async-generated-future</a></p>\n<ol>\n<li>\n<p>定义接口</p>\n<pre><code>@DubboAsync\npublic interface GreetingsService {\n    String sayHi(String name);\n}\n</code></pre>\n<p>这是一个普通的Dubbo服务接口定义。注意,使用Annotation Processor要加上@DubboAsync注解。</p>\n<pre><code>&lt;dependency&gt;\n    &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n    &lt;artifactId&gt;dubbo-async-processer&lt;/artifactId&gt;\n    &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;\n&lt;/dependency&gt;\n&lt;plugin&gt;\n    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n    &lt;version&gt;3.7.0&lt;/version&gt;\n    &lt;configuration&gt;\n        &lt;source&gt;1.8&lt;/source&gt;\n        &lt;target&gt;1.8&lt;/target&gt;\n        &lt;annotationProcessorPaths&gt;\n            &lt;path&gt;\n                &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n                &lt;artifactId&gt;dubbo-async-processer&lt;/artifactId&gt;\n                &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;\n            &lt;/path&gt;\n        &lt;/annotationProcessorPaths&gt;\n    &lt;/configuration&gt;\n&lt;/plugin&gt;\n</code></pre>\n<p>以上是引入dubbo-async-processer处理器的Maven依赖,通常定义接口(提供API)的开发者将以上依赖加到工程中,这样在做API打包的时候,API中会自动生成以下接口定义:</p>\n<pre><code>/**\n* Generated by dubbo-async-processer\n*/\npackage com.alibaba.dubbo.samples.api;\nimport java.util.concurrent.CompletableFuture;\n@javax.annotation.Generated(&quot;com.alibaba.dubbo.async.processor.AsyncAnnotationProcessor&quot;)\n@org.apache.dubbo.common.config.AsyncFor(com.alibaba.dubbo.samples.api.GreetingsService.class)\npublic interface GreetingsServiceAsync extends GreetingsService {\nCompletableFuture&lt;java.lang.String&gt; sayHiAsync(java.lang.String name);\n}\n</code></pre>\n</li>\n<li>\n<p>Provider端</p>\n<ul>\n<li>配置</li>\n</ul>\n<pre><code>&lt;bean id=&quot;greetingsService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.GreetingsServiceImpl&quot;/&gt;\n&lt;dubbo:service interface=&quot;com.alibaba.dubbo.samples.api.GreetingsService&quot; ref=&quot;greetingsService&quot;/&gt;\n</code></pre>\n<ul>\n<li>服务实现</li>\n</ul>\n<pre><code>public class GreetingsServiceImpl implements GreetingsService {\n    @Override\n    public String sayHi(String name) {\n        return &quot;hi, &quot; + name;\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>Consumer端</p>\n<ul>\n<li>配置</li>\n</ul>\n<pre><code> &lt;dubbo:reference id=&quot;greetingsService&quot; interface=&quot;com.alibaba.dubbo.samples.api.GreetingsServiceAsync&quot;/&gt;\n</code></pre>\n<p>注意,服务接口用的是<strong>GreetingsServiceAsync</strong></p>\n<ul>\n<li>调用服务</li>\n</ul>\n<pre><code> public static void main(String[] args) throws Exception {\n        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});\n        context.start();\n\n        GreetingsServiceAsync greetingsService = (GreetingsServiceAsync) context.getBean(&quot;greetingsService&quot;);\n        CompletableFuture&lt;String&gt; future = greetingsService.sayHiAsync(&quot;async call reqeust&quot;);\n        System.out.println(&quot;async call ret :&quot; + future.get());\n     \n        System.in.read();\n    }\n</code></pre>\n<p>这样,我们就可以直接使用<code>CompletableFuture&lt;String&gt; future = greetingsService.sayHiAsync(&quot;async call reqeust&quot;);</code>,直接返回CompletableFuture。</p>\n</li>\n</ol>\n<h2>示例3:使用AsyncContext</h2>\n<p>本示例演示了如何在同步接口的基础上,通过AsyncContext实现Provider端异步执行,示例代码参见<a href=\"https://github.com/dubbo/dubbo-samples/tree/samples-for-2.7.0-SNAPSHOT/dubbo-samples-async-provider\">dubbo-samples-async-provider</a>。</p>\n<ol>\n<li>\n<p>定义接口</p>\n<pre><code>public interface AsyncService {\n    String sayHello(String name);\n}\n</code></pre>\n</li>\n<li>\n<p>Provider端</p>\n<ul>\n<li>配置</li>\n</ul>\n<pre><code>&lt;bean id=&quot;asyncService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&quot;/&gt;\n&lt;dubbo:service async=&quot;true&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot; ref=&quot;asyncService&quot;/&gt;\n</code></pre>\n<p>注意,要加上<code>async=&quot;true&quot;</code>表明这是一个开启Provider端异步执行的服务。</p>\n<ul>\n<li>异步执行实现</li>\n</ul>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public String sayHello(String name) {\n        final AsyncContext asyncContext = RpcContext.startAsync();\n        new Thread(() -&gt; {\n            asyncContext.signalContextSwitch();\n            try {\n                Thread.sleep(500);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);\n        }).start();\n        return null;\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>Consumer端</p>\n<ul>\n<li>配置</li>\n</ul>\n<pre><code>&lt;dubbo:reference id=&quot;asyncService&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot;/&gt;\n</code></pre>\n<ul>\n<li>服务调用</li>\n</ul>\n<pre><code> public static void main(String[] args) throws Exception {\n        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});\n        context.start();\n\n        AsyncService asyncService = (AsyncService) context.getBean(&quot;asyncService&quot;);\n        System.out.println(asyncService.sayHello(&quot;async call request&quot;));\n     \n        System.in.read();\n    }\n</code></pre>\n</li>\n</ol>\n<h2>异步引入的新问题</h2>\n<h3>Filter链</h3>\n<p>以下是一次普通Dubbo调用的完整Filter链</p>\n<p>而采用异步调用后,由于异步结果在异步线程中单独执行,所以流经后半段Filter链的Result是空值,当真正的结果返回时已无法被Filter链处理。</p>\n<p>为了解决这个问题,2.7.0中引入了PostProcessFilter和AbstractPostProcessFilter,其中,PostProcessFilter接口继承自Filter接口,AbstractPostProcessFilter是PostProcessFilter的抽象实现。</p>\n<p>以下是一个扩展Filter并支持异步Filter链的例子</p>\n<pre><code>@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})\npublic class AsyncPostprocessFilter extends AbstractPostProcessFilter {\n\n    @Override\n    public Result invoke(Invoker&lt;?&gt; invoker, Invocation invocation) throws RpcException {\n        return postProcessResult(invoker.invoke(invocation), invoker, invocation);\n    }\n\n    @Override\n    protected Result doPostProcess(Result result, Invoker&lt;?&gt; invoker, Invocation invocation) {\n        System.out.println(&quot;Filter get the return value: &quot; + result.getValue());\n        return result;\n    }\n}\n</code></pre>\n<h3>上下文传递</h3>\n<p>当前我们考虑的上下文主要是指保存在RpcContext中的数据,大多数场景是需要用户在切换业务线程前自己完成Context的传递。</p>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    // 保存当前线程的上下文\n    RpcContext context = RpcContext.getContext();\n    public CompletableFuture&lt;String&gt; sayHello(String name) {\n        return CompletableFuture.supplyAsync(() -&gt; {\n            // 设置到新线程中\n            RpcContext.setContext(context);\n            try {\n                Thread.sleep(5000);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            return &quot;async response from provider.&quot;;\n        });\n    }\n}\n</code></pre>\n<p>不过AsyncContext也提供了signalContextSwitch()的方法来实现方便的Context切换。</p>\n<pre><code>public class AsyncServiceImpl implements AsyncService {\n    public String sayHello(String name) {\n        final AsyncContext asyncContext = RpcContext.startAsync();\n        new Thread(() -&gt; {\n            asyncContext.signalContextSwitch();\n            try {\n                Thread.sleep(500);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);\n        }).start();\n        return null;\n    }\n}\n</code></pre>\n",
-  "title": "如何基于Dubbo实现全异步调用链",
-  "keywords": "Dubbo, 异步, async chain",
-  "description": "本文回顾了 2.6.x 版本的异步实现,然后引出了 2.7.0 版本基于 CompletableFuture 的异步编程方式。"
+  "link": "/zh-cn/blog/dubbo-new-async.html",
+  "meta": {
+    "title": "如何基于Dubbo实现全异步调用链",
+    "keywords": "Dubbo, 异步, async chain",
+    "description": "本文回顾了 2.6.x 版本的异步实现,然后引出了 2.7.0 版本基于 CompletableFuture 的异步编程方式。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-zk.json b/zh-cn/blog/dubbo-zk.json
index 5e27a2c3..dc396c3c 100644
--- a/zh-cn/blog/dubbo-zk.json
+++ b/zh-cn/blog/dubbo-zk.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo-zk.md",
   "__html": "<h1>在 Dubbo 应用中使用 Zookeeper</h1>\n<h2>Zookeeper 介绍</h2>\n<h3>基本概念</h3>\n<p>在现代的分布式应用中,往往会出现节点和节点之间的协调问题,其中就包括了:选主、集群管理、分布式锁、分布式配置管理、统一命名服务、状态同步等诉求。<a href=\"https://zookeeper.apache.org\">Apache Zookeeper</a>,正如它的名字所暗示的那样,<em>动物园管理员</em>,就是为了解决这些诉求的一个分布式协调服务框架。</p>\n<p>为了保证高可用,ZooKeeper 本身也可以部署成集群模式,称之为 <em>ZooKeeper ensemble</em>。ZooKeeper 集群中始终确保其中的一台为 leader 的角色,并通过 <em>ZAB (Zookeeper Atomic Broadcast Protocol) <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></em> 协议确保所有节点上的信息的一致。客户端可以访问集群中的任何一台进行读写操作,而不用担心数据出现不一致的现象。</p>\n<p><img src=\"../../img/blog/zk-emsemble.png\" alt=\"Diagram shows client-server architecture of ZooKeeper\">\n<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O'Reilly</em></p>\n<p>Zookeeper 中的数据存储方式与传统的 UNIX 文件系统相似,节点按照树状结构来组织,其中,节点被称之为 <em>znodes (ZooKeeper data nodes)</em></p>\n<p><img src=\"../../img/blog/zk-tree.png\" alt=\"zk-tree\">\n<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O'Reilly</em></p>\n<h3>基本用法</h3>\n<p>可以通过直接下载的方式 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>安装并运行 Zookeeper ,在 Mac 上也可以通过 Homebrew <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>  <code>brew install zookeeper</code>  来安装,考虑到通用性,本文采用 docker 的方式来运行 Zookeeper。如果没有安装 docker,请先准备好 docker 环境 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>。</p>\n<h4>1. 启动 Zookeeper</h4>\n<p>执行命令将 Zookeeper 运行在 docker 容器中</p>\n<pre><code class=\"language-shell\">docker run --rm --name zookeeper -p 2181:2181 zookeeper\n</code></pre>\n<h4>2. 进入 Zookeeper 容器</h4>\n<pre><code class=\"language-shell\">docker exec -it zookeeper bash\n</code></pre>\n<p>在 <code>bin</code> 目录下有启动 Zookeeper 的命令 <code>zkServer</code> 以及管理控制台 <code>zkCli</code></p>\n<pre><code class=\"language-shell\">bash-4.4# ls -l bin\ntotal 36\n-rwxr-xr-x    1 zookeepe zookeepe       232 Mar 27 04:32 README.txt\n-rwxr-xr-x    1 zookeepe zookeepe      1937 Mar 27 04:32 zkCleanup.sh\n-rwxr-xr-x    1 zookeepe zookeepe      1056 Mar 27 04:32 zkCli.cmd\n-rwxr-xr-x    1 zookeepe zookeepe      1534 Mar 27 04:32 zkCli.sh\n-rwxr-xr-x    1 zookeepe zookeepe      1759 Mar 27 04:32 zkEnv.cmd\n-rwxr-xr-x    1 zookeepe zookeepe      2696 Mar 27 04:32 zkEnv.sh\n-rwxr-xr-x    1 zookeepe zookeepe      1089 Mar 27 04:32 zkServer.cmd\n-rwxr-xr-x    1 zookeepe zookeepe      6773 Mar 27 04:32 zkServer.sh\n</code></pre>\n<h4>3. 通过 zkCli 进入 Zookeeper 管理界面</h4>\n<p>由于是通过 Docker 启动,Zookeeper 进程已经启动,并通过 2181 端口对外提供服务。</p>\n<pre><code class=\"language-shell\">bash-4.4# ps\nPID   USER     TIME  COMMAND\n    1 zookeepe  0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root\n   32 root      0:00 bash\n   42 root      0:00 ps\n</code></pre>\n<p>因此可以直接通过 <code>zkCli</code> 来访问 Zookeeper 的控制台来进行管理。</p>\n<pre><code class=\"language-shell\">bash-4.4# bin/zkCli.sh -server 127.0.0.1:2181\nConnecting to 127.0.0.1:2181\n...\nWATCHER::\n\nWatchedEvent state:SyncConnected type:None path:null\n\n[zk: 127.0.0.1:2181(CONNECTED) 0] help\nZooKeeper -server host:port cmd args\n\tstat path [watch]\n\tset path data [version]\n\tls path [watch]\n\tdelquota [-n|-b] path\n\tls2 path [watch]\n\tsetAcl path acl\n\tsetquota -n|-b val path\n\thistory\n\tredo cmdno\n\tprintwatches on|off\n\tdelete path [version]\n\tsync path\n\tlistquota path\n\trmr path\n\tget path [watch]\n\tcreate [-s] [-e] path data acl\n\taddauth scheme auth\n\tquit\n\tgetAcl path\n\tclose\n\tconnect host:port\n</code></pre>\n<h4>4. zkCli 上的一些基本操作</h4>\n<p>创建 <code>/hello-zone</code> 节点:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 19] create /hello-zone 'world'\nCreated /hello-zone\n</code></pre>\n<p>列出 <code>/</code> 下的子节点,确认 <code>hello-zone</code> 被创建:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 20] ls /\n[zookeeper, hello-zone]\n</code></pre>\n<p>列出 <code>/hello-zone</code> 的子节点,确认为空:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 21] ls /hello-zone\n[]\n</code></pre>\n<p>获取存储在 <code>/hello-zone</code> 节点上的数据:</p>\n<pre><code class=\"language-shell\">[zk: 127.0.0.1:2181(CONNECTED) 22] get /hello-zone\nworld\n</code></pre>\n<h2>在 Dubbo 中使用 Zookeeper</h2>\n<p>Dubbo 使用 Zookeeper 用于服务的注册发现和配置管理,在 Zookeeper 中数据的组织由下图所示:</p>\n<p><img src=\"../../img/blog/dubbo-in-zk.jpg\" alt=\"dubbo-in-zk\"></p>\n<p>首先,所有 Dubbo 相关的数据都组织在 <code>/duboo</code> 的根节点下。</p>\n<p>二级目录是服务名,如 <code>com.foo.BarService</code>。</p>\n<p>三级目录有两个子节点,分别是 <code>providers</code> 和 <code>consumers</code>,表示该服务的提供者和消费者。</p>\n<p>四级目录记录了与该服务相关的每一个应用实例的 URL 信息,在 <code>providers</code> 下的表示该服务的所有提供者,而在 <code>consumers</code> 下的表示该服务的所有消费者。举例说明,<code>com.foo.BarService</code> 的服务提供者在启动时将自己的 URL 信息注册到 <code>/dubbo/com.foo.BarService/providers</code> 下;同样的,服务消费者将自己的信息注册到相应的 <code>consumers</code> 下,同时,服务消费者会订阅其所对应的 <code>providers</code> 节点,以便能够感知到服务提供方地址列表的变化。</p>\n<h3>准备示例代码</h3>\n<p>本文的代码可以在 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-zookeeper\">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-zookeeper</a> 中找到。</p>\n<h4>1. 接口定义</h4>\n<p>定义一个简单的 <code>GreetingService</code> 接口,里面只有一个简单的方法 <code>sayHello</code> 向调用者问好。</p>\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\">GreetingService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h4>2. 服务端:服务实现</h4>\n<p>实现 <code>GreetingService</code> 接口,并通过 <code>@Service</code> 来标注其为 Dubbo 的一个服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotatedGreetingService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + name;\n    }\n}\n</code></pre>\n<h4>3. 服务端:组装</h4>\n<p>定义 ProviderConfiguration 来组装 Dubbo 服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.impl\"</span>)\n<span class=\"hljs-meta\">@PropertySource</span>(<span class=\"hljs-string\">\"classpath:/spring/dubbo-provider.properties\"</span>)\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderConfiguration</span> </span>{}\n</code></pre>\n<p>dubbo-provider.properties 是在 Spring 应用中外置配置的方式,内容如下:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">demo-provider</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">zookeeper://$DOCKER_HOST:2181</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">20880</span>\n</code></pre>\n<p>由于 Zookeeper 运行在 Docker 容器中,需要注意的是:</p>\n<ul>\n<li>本文假定 Dubbo 应用运行在宿主机上,也就是 Docker 容器外,需要将 Zookeeper 的地址替换成环境变量 <em>${DOCKER_HOST}</em> 所指定的 IP 地址,相关信息请查阅 Docker 官方文档</li>\n<li>如果 Dubbo 应用也是 Docker 化的应用,只需要用 Zookeeper 的容器名,在本文中容器名是 <strong>zookeeper</strong></li>\n<li>当然,如果不用容器方式启动 Zookeeper,只需要简单的将这里的 <em>$DOCKER_HOST</em> 换成 <strong>localhost</strong> 即可</li>\n</ul>\n<h4>4. 服务端:启动服务</h4>\n<p>在 <code>main</code> 方法中通过启动一个 Spring Context 来对外提供 Dubbo 服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class);\n        context.start();\n        System.in.read();\n    }\n}\n</code></pre>\n<p>启动服务端的 <code>main</code> 方法,将会看到下面的输出,代表服务端启动成功,并在注册中心(ZookeeperRegistry)上注册了 <code>GreetingService</code> 这个服务:</p>\n<pre><code class=\"language-sh\">[03/08/18 10:50:33:033 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=<span class=\"hljs-literal\">true</span>&amp;application=demo-provider&amp;dubbo=2.6.2&amp;generic=<span class=\"hljs-literal\">false</span>&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=12938&amp;side=provider&amp;timestamp=1533264631849, dubbo version: 2.6.2, current host: 192.168.99.1\n</code></pre>\n<p>通过 Zookeeper 管理终端观察服务提供方的注册信息:</p>\n<pre><code class=\"language-sh\">$ docker <span class=\"hljs-built_in\">exec</span> -it zookeeper bash\nbash-4.4<span class=\"hljs-comment\"># bin/zkCli.sh -server localhost:218</span>\nConnecting to localhost:2181\n...\nWelcome to ZooKeeper!\nJLine support is enabled\n...\n[zk: localhost:2181(CONNECTED) 0] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/providers\n[dubbo%3A%2F%2F192.168.99.1%3A20880%2Fcom.alibaba.dubbo.samples.api.GreetingService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.6.2%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D12938%26side%3Dprovider%26timestamp%3D1533264631849]\n</code></pre>\n<p>可以看到刚刚启动的 Dubbo 的服务在 <code>providers</code> 节点下注册了自己的 URL 地址:<em>dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=true&amp;application=demo-provider&amp;dubbo=2.6.2&amp;generic=false&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=12938&amp;side=provider&amp;timestamp=1533264631849</em></p>\n<h4>5. 客户端:引用服务</h4>\n<p>通过 <code>@Reference</code> 来在客户端声明服务的引用,运行时将会通过该引用发起全程调用,而服务的目标地址将会从 Zookeeper 的 <code>provider</code> 节点下查询。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Component</span>(<span class=\"hljs-string\">\"annotatedConsumer\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceConsumer</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>\n    <span class=\"hljs-keyword\">private</span> GreetingService greetingService;\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">doSayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> greetingService.sayHello(name);\n    }\n}\n</code></pre>\n<h4>6. 客户端:组装</h4>\n<p>定义 ConsumerConfiguration 来组装 Dubbo 服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-meta\">@EnableDubbo</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>)\n<span class=\"hljs-meta\">@PropertySource</span>(<span class=\"hljs-string\">\"classpath:/spring/dubbo-consumer.properties\"</span>)\n<span class=\"hljs-meta\">@ComponentScan</span>(value = {<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.action\"</span>})\n<span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerConfiguration</span> </span>{}\n</code></pre>\n<p>dubbo-consumer.properties 是在 Spring 应用中外置配置的方式,内容如下:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">demo-consumer</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">zookeeper://$DOCKER_HOST:2181</span>\n<span class=\"hljs-meta\">dubbo.consumer.timeout</span>=<span class=\"hljs-string\">3000</span>\n</code></pre>\n<p>与 <strong>3. 服务端:组装</strong> 相同,需要根据自己的运行环境来修改 <em>dubbo.registry.address</em> 中定义的 <em>$DOCKER_HOST</em>。请参阅步骤 3 的说明部分。</p>\n<h4>7. 客户端:发起远程调用</h4>\n<p>运行 <code>main</code> 向已经启动的服务提供方发起一次远程调用。Dubbo 会先向 Zookeeper 订阅服务地址,然后从返回的地址列表中选取一个,向对端发起调用:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerBootstrap</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerBootstrap</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        AnnotationConfigApplicationContext context = <span class=\"hljs-keyword\">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);\n        context.start();\n        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class);\n        String hello = greetingServiceConsumer.doSayHello(<span class=\"hljs-string\">\"zookeeper\"</span>);\n        System.out.println(<span class=\"hljs-string\">\"result: \"</span> + hello);\n        System.in.read();\n    }\n}\n</code></pre>\n<p>运行结果如下:</p>\n<pre><code class=\"language-shell\">[03/08/18 01:42:31:031 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Register: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&amp;category=consumers&amp;check=false&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=82406&amp;side=consumer&amp;timestamp=1533274951195, dubbo version: 2.6.2, current host: 192.168.99.1 #1\n[03/08/18 01:42:31:031 CST] main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Subscribe: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&amp;category=providers,configurators,routers&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=82406&amp;side=consumer&amp;timestamp=1533274951195, dubbo version: 2.6.2, current host: 192.168.99.1 #2\n...\nresult: hello, zookeeper\n</code></pre>\n<p>说明:</p>\n<ol>\n<li><strong>Register</strong>: consumer://192.168.99.1/...&amp;<strong>category=consumers</strong>&amp;:消费者向 Zookeeper 注册自己的信息,并放在 <code>consumers</code> 节点下</li>\n<li><strong>Subscribe</strong>: consumer://192.168.99.1/...&amp;<strong>category=providers,configurators,routers</strong>&amp;:消费者同时向 Zookeeper 订阅了 <code>providers</code>、<code>configurators</code>、<code>routers</code> 节点,其中 <code>configurations</code> 与 Dubbo 配置相关,<code>routers</code> 与路由规则相关,值得注意的是 <code>providers</code> 节点的订阅,当有新的服务提供方加入后,由于订阅的关系,新的地址列表会推送给订阅方,服务的消费者也因此动态感知到了地址列表的变化。</li>\n</ol>\n<p>通过 Zookeeper 管理终端观察服务提供方的注册信息:</p>\n<pre><code class=\"language-sh\">$ docker <span class=\"hljs-built_in\">exec</span> -it zookeeper bash\nbash-4.4<span class=\"hljs-comment\"># bin/zkCli.sh -server localhost:218</span>\nConnecting to localhost:2181\n...\nWelcome to ZooKeeper!\nJLine support is enabled\n...\n[zk: localhost:2181(CONNECTED) 4] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/consumers\n[consumer%3A%2F%2F192.168.99.1%2Fcom.alibaba.dubbo.samples.api.GreetingService%3Fapplication%3Ddemo-consumer%26category%3Dconsumers%26check%3Dfalse%26default.timeout%3D3000%26dubbo%3D2.6.2%26interface%3Dcom.alibaba.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D82406%26side%3Dconsumer%26timestamp%3D1533274951195]\n</code></pre>\n<p>可以看到 Dubbo 的服务消费者在 <code>consumers</code> 节点下注册了自己的 URL 地址:<em>consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&amp;category=providers,configurators,routers&amp;default.timeout=3000&amp;dubbo=2.6.2&amp;interface=com.alibaba.dubbo.samples.api.GreetingService&amp;methods=sayHello&amp;pid=82406&amp;side=consumer&amp;timestamp=1533274951195</em></p>\n<h2>总结</h2>\n<p>本文侧重介绍了如何在 Dubbo 应用中使用 Zookeeper 做为注册中心,当然,本文也提到了 Zookeeper 在 Dubbo 的应用场景下还承担了配置中心和服务治理的职责。本文中的 Zookeeper 是单节点、Standalone 的模式,在生产环境中为了高可用的诉求,往往会组件 Zookeeper 集群,也就是 <em>Zookeeper ensemble</em> 模式。</p>\n<p>通过本文的学习,读者可以掌握到:</p>\n<ul>\n<li>Zookeeper 的基本概念和基本用法</li>\n<li>Zookeeper 在 Dubbo 应用中的作用</li>\n<li>通过实战了解 Zookeeper 与 Dubbo 的交互</li>\n<li>Dubbo 在 Zookeeper 中服务注册、消费信息的存储方式</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><a href=\"https://www.ixiacom.com/company/blog/apache-zab%E2%80%94zookeeper-atomic-broadcast-protocol\">https://www.ixiacom.com/company/blog/apache-zab—zookeeper-atomic-broadcast-protocol</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"https://www.apache.org/dyn/closer.cgi/zookeeper/\">https://www.apache.org/dyn/closer.cgi/zookeeper/</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p><a href=\"https://brew.sh\">https://brew.sh</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p><a href=\"https://www.docker.com/community-edition\">https://www.docker.com/community-edition</a> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
-  "title": "在 Dubbo 应用中使用 Zookeeper",
-  "keywords": "Dubbo, 注册中心, Zookeeper, ZK",
-  "description": "本文介绍了 Zookeeper 的基本概念、用法,以及如何在 Dubbo 应用中使用 Zookeeper 作为注册中心。"
+  "link": "/zh-cn/blog/dubbo-zk.html",
+  "meta": {
+    "title": "在 Dubbo 应用中使用 Zookeeper",
+    "keywords": "Dubbo, 注册中心, Zookeeper, ZK",
+    "description": "本文介绍了 Zookeeper 的基本概念、用法,以及如何在 Dubbo 应用中使用 Zookeeper 作为注册中心。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo2-js.json b/zh-cn/blog/dubbo2-js.json
index 402a7e5c..adeb2f3f 100644
--- a/zh-cn/blog/dubbo2-js.json
+++ b/zh-cn/blog/dubbo2-js.json
@@ -1,7 +1,10 @@
 {
   "filename": "dubbo2-js.md",
   "__html": "<h1>从跨语言调用到dubbo2.js</h1>\n<blockquote>\n<p><a href=\"https://github.com/dubbo/dubbo2.js\">dubbo2.js</a> 是 <a href=\"https://www.qianmi.com/\">千米网</a> 贡献给 dubbo 社区的一款 nodejs dubbo 客户端,它提供了 nodejs 对原生 dubbo 协议的支持,使得 nodejs 和 java 这两种异构语言的 rpc 调用变得便捷,高效。</p>\n</blockquote>\n<h2>微服务跨语言调用</h2>\n<p>微服务架构已成为目前互联网架构的趋势,关于微服务的讨论,几乎占据了各种技术大会的绝大多数版面。国内使用最多的服务治理框架非阿里开源的 dubbo 莫属,千米网也选择了 dubbo 作为微服务治理框架。另一方面,和大多数互联网公司一样,千米的开发语言是多样的,大多数后端业务由 java 支撑,而每个业务线有各自开发语言的选择权,便出现了 nodejs,python,go 多语言调用的问题。\n跨语言调用是一个很大的话题,也是一个很有挑战的技术活,目前业界经常被提及的解决方案有如下几种,不妨拿出来老生常谈一番:</p>\n<ul>\n<li>spring cloud。spring cloud 提供了一整套微服务开发组件,它主要面向 java 开发,但由于其使用的协议是基于 restful 风格的 http 协议,这使得其天然具备跨语言能力,异构语言只需要提供 http 客户端,便可以实现跨语言调用。</li>\n<li>service mesh。号称下一代微服务框架的 service mesh,其解决跨语言问题的核心在于 SideCar ,SideCar 在 service mesh 的发展过程中概念不断的迁移,但本质都是完成了一件事:处理服务间通信,负责实现请求的可靠传递。</li>\n<li>motan。<a href=\"https://github.com/weibocom/motan\">motan</a> 是新浪微博开源的一款跨语言服务治理框架,在其早期版本中仅支持 motan-java,随着版本演进,在目前最新版本(1.1.0)中,提供了 motan-go,motan-php,motan-openresty 等跨语言特性。类似于 service mesh 中的 SideCar,motan 借助于 motan-go 作为 agent 完成协议的转发,并且依赖于定制协议:motan2,实现跨语言调用。</li>\n</ul>\n<p>当我们再聊跨语言调用时我们在聊什么?纵观上述几个较为通用,成熟的解决方案,可以得出结论:解决跨语言调用的思路无非是两种:</p>\n<ul>\n<li>寻找一个通用的协议</li>\n<li>使用 agent 完成协议的适配</li>\n</ul>\n<p>如果一个新型的团队面临技术选型,我认为上述的方案都可以纳入参考,可考虑到遗留系统的兼容性问题</p>\n<ul>\n<li>旧系统的迁移成本</li>\n</ul>\n<p>这也关键的选型因素。我们做出的第一个尝试,便是在 RPC 协议上下功夫。</p>\n<h2>通用协议的跨语言支持</h2>\n<h3>springmvc的美好时代</h3>\n<p><img src=\"../../img/blog/springmvc.png\" alt=\"springmvc\"></p>\n<p>在没有实现真正的跨语言调用之前,想要实现“跨语言”大多数方案是使用 http 协议做一层转换,最常见的手段莫过于借助 springmvc 提供的 controller/restController,间接调用 dubbo provider。这种方案的优势和劣势显而易见</p>\n<ul>\n<li>优势是简单,是最通俗的解决方案。</li>\n<li>劣势是使得调用链路变长,tcp 通信之上又多了一层 http 通信;开发体验差,为了将 rpc 接口暴露出去,需要额外编写一份 controller 层的代码。</li>\n</ul>\n<h3>通用协议的支持</h3>\n<p>事实上,大多数服务治理框架都支持多种协议,dubbo 框架除默认的 dubbo 协议之外,还有当当网扩展的 <a href=\"https://dangdangdotcom.github.io/dubbox/rest.html\">rest</a> 协议和千米网扩展的 <a href=\"https://github.com/apache/incubator-dubbo-rpc-jsonrpc\">json-rpc</a> 协议可供选择。这两者都是通用的跨语言协议。</p>\n<p>rest 协议为满足 JAX-RS 2.0 标准规范,在开发过程中引入了 @Path,@POST,@GET 等注解,习惯于编写传统 rpc 接口的人可能不太习惯 rest 风格的 rpc 接口。一方面这样会影响开发体验,另一方面,独树一帜的接口风格使得它与其他协议不太兼容,旧接口的共生和迁移都无法实现。如果没有遗留系统,rest 协议无疑是跨语言方案最简易的实现,绝大多数语言支持 rest 协议。</p>\n<p>和 rest 协议类似,json-rpc 的实现也是文本序列化&amp;http 协议。dubbox 在 restful 接口上已经做出了尝试,但是 rest 架构和 dubbo 原有的 rpc 架构是有区别的,rest 架构需要对资源(Resources)进行定义, 需要用到 http 协议的基本操作 GET、POST、PUT、DELETE。在我们看来,restful 更合适互联网系统之间的调用,而 rpc 更适合一个系统内的调用。使用 json-rpc 协议使得旧接口得以兼顾,开发习惯仍旧保留,同时获得了跨语言的能力。</p>\n<p>千米网在早期实践中采用了 json-rpc 作为 dubbo 的跨语言协议实现,并开源了基于 json-rpc 协议下的 python 客户端 <a href=\"https://github.com/dubbo/dubbo-client-py\">dubbo-client-py</a> 和 node 客户端 <a href=\"https://github.com/QianmiOpen/dubbo-node-client\">dubbo-node-client</a>,使用 python 和 nodejs 的小伙伴可以借助于它们直接调用 dubbo-provider-java 提供的 rpc 服务。系统中大多数 java 服务之间的互相调用还是以 dubbo 协议为主,考虑到新旧协议的适配,在不影响原有服务的基础上,我们配置了双协议。</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jsonrpc\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n</code></pre>\n<p>dubbo 协议主要支持 java 间的相互调用,适配老接口;json-rpc 协议主要支持异构语言的调用。</p>\n<h3>定制协议的跨语言支持</h3>\n<p>微服务框架所谓的协议(protocol)可以简单理解为:报文格式和序列化方案。服务治理框架一般都提供了众多的协议配置项供使用者选择,除去上述两种通用协议,还存在一些定制化的协议,如 dubbo 框架的默认协议:dubbo 协议以及 motan 框架提供的跨语言协议:motan2。</p>\n<h4>motan2协议的跨语言支持</h4>\n<p><img src=\"../../img/blog/motan-protocol.png\" alt=\"motan2\"></p>\n<p>motan2 协议被设计用来满足跨语言的需求主要体现在两个细节中—MetaData 和 motan-go。在最初的 motan 协议中,协议报文仅由 Header+Body 组成,这样导致 path,param,group 等存储在 Body 中的数据需要反序列得到,这对异构语言来说是很不友好的,所以在 motan2 中修改了协议的组成;weibo 开源了 <a href=\"https://github.com/weibocom/motan-go/\">motan-go</a> ,<a href=\"https://github.com/weibocom/motan-php\">motan-php</a>,<a href=\"https://github.com/weibocom/motan-openresty\">motan-openresty</a> ,并借助于 motan-go 充当了 agent 这一翻译官的角色,使用 simple 序列化方案来序列化协议报文的 Body 部分(simple 序列化是一种较弱的序列化方案)。</p>\n<p><img src=\"../../img/blog/motan-agent.png\" alt=\"agent\"></p>\n<p>仔细揣摩下可以发现这么做和双协议的配置区别并不是大,只不过这里的 agent 是隐式存在的,与主服务共生。明显的区别在于 agent 方案中异构语言并不直接交互。</p>\n<h4>dubbo协议的跨语言支持</h4>\n<p>dubbo 协议设计之初只考虑到了常规的 rpc 调用场景,它并不是为跨语言而设计,但跨语言支持从来不是只有支持、不支持两种选择,而是要按难易</p>\n<p>程度来划分。是的,dubbo 协议的跨语言调用可能并不好做,但并非无法实现。千米网便实现了这一点,nodejs 构建的前端业务是异构语言的主战场,最终实现了 dubbo2.js,打通了 nodejs 和原生 dubbo 协议。作为本文第二部分的核心内容,重点介绍下我们使用 dubbo2.js 干了什么事。</p>\n<h5>Dubbo协议报文格式</h5>\n<p><img src=\"../../img/blog/dubbo-protocol.png\" alt=\"dubbo协议\"></p>\n<p>dubbo协议报文消息头详解:</p>\n<ul>\n<li>magic:类似java字节码文件里的魔数,用来判断是不是 dubbo 协议的数据包。魔数是常量 0xdabb</li>\n<li>flag:标志位, 一共8个地址位。低四位用来表示消息体数据用的序列化工具的类型(默认 hessian),高四位中,第一位为 1 表示是 request 请求,第二位为 1 表示双向传输(即有返回 response),第三位为 1 表示是心跳 ping 事件。</li>\n<li>status:状态位, 设置请求响应状态,dubbo 定义了一些响应的类型。具体类型见<code>com.alibaba.dubbo.remoting.exchange.Response</code></li>\n<li>invoke id:消息 id, long 类型。每一个请求的唯一识别 id(由于采用异步通讯的方式,用来把请求 request 和返回的 response 对应上)</li>\n<li>body length:消息体 body 长度, int 类型,即记录 Body Content 有多少个字节</li>\n<li>body content:请求参数,响应参数的抽象序列化之后存储于此。</li>\n</ul>\n<p>协议报文最终都会变成字节,使用 tcp 传输,任何语言只要支持网络模块,有类似 Socket 之类的封装,那么通信就不成问题。那,跨语言难在哪儿?以其他语言调用 java 来说,主要有两个难点:</p>\n<ol>\n<li>异构语言如何表示 java 中的数据类型,特别是动态语言,可能不存在严格的数据类型</li>\n<li>序列化方案如何做到跨语言</li>\n</ol>\n<h2>dubbo2.js解决方案</h2>\n<p>上面我们分析出了两个难点,dubbo2.js 解决这两个问题的关键依赖于两个类库:<a href=\"https://github.com/node-modules/js-to-java\">js-to-java</a>,<a href=\"https://github.com/node-modules/hessian.js\">hessian.js</a> 。js-to-java 使得 nodejs 具备 java 对象的表达能力,而 hessian.js 提供了序列化能力。借助于 nodejs 的 socket ,复制一套 dubbo 协议的报文格式,最终便实现了 nodejs 对 java-dubbo-provider 的调用。</p>\n<h2>dubbo2.js快速入门</h2>\n<p>为了让对 dubbo2.js 感兴趣的读者有一个直观的体验,本节呈现一个快速入门示例,让你体会到使用 dubbo2.js 调用 dubbo 服务是一件多么轻松的事。</p>\n<h3>1. 创建 dubbo-java-provider</h3>\n<p>后端 dubbo 服务使用 java 来提供,这服务大多数的业务场景。首先定义服务接口:</p>\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\">DemoProvider</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">echo</span><span class=\"hljs-params\">()</span> </span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">test</span><span class=\"hljs-params\">()</span></span>;\n    <span class=\"hljs-function\">UserResponse <span class=\"hljs-title\">getUserInfo</span><span class=\"hljs-params\">(UserRequest request)</span></span>;\n}\n</code></pre>\n<p>其次,实现服务:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoProvider</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"[\"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date()) + <span class=\"hljs-string\">\"] Hello \"</span> + name + <span class=\"hljs-string\">\", request from consumer: \"</span> + RpcContext.getContext().getRemoteAddress());\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\", response form provider: \"</span> + RpcContext.getContext().getLocalAddress();\n    }\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">echo</span><span class=\"hljs-params\">()</span>  </span>{\n        System.out.println(<span class=\"hljs-string\">\"receive....\"</span>);\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"pang\"</span>;\n    }\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">test</span><span class=\"hljs-params\">()</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"test\"</span>);\n    }\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> UserResponse <span class=\"hljs-title\">getUserInfo</span><span class=\"hljs-params\">(UserRequest request)</span> </span>{\n        System.out.println(request);\n        UserResponse response = <span class=\"hljs-keyword\">new</span> UserResponse();\n        response.setStatus(<span class=\"hljs-string\">\"ok\"</span>);\n        Map&lt;String, String&gt; map = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, String&gt;();\n        map.put(<span class=\"hljs-string\">\"id\"</span>, <span class=\"hljs-string\">\"1\"</span>);\n        map.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"test\"</span>);\n        response.setInfo(map);\n        <span class=\"hljs-keyword\">return</span> response;\n    }\n}\n</code></pre>\n<p>暴露服务:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://code.alibabatech.com/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\n   http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 提供方应用信息,用于计算依赖关系 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>/&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"localhost:2181\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 用dubbo协议在20880端口暴露服务 --&gt;</span>\n    <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\">\"20880\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 和本地bean一样实现服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoProvider\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.provider.DemoProviderImpl\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 声明需要暴露的服务接口 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoProvider\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoProvider\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span>/&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>我们完成了服务端的所有配置,启动启动类即可在本地注册一个 dubbo 服务。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Provider</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[]{<span class=\"hljs-string\">\"META-INF/spring/dubbo-demo-provider.xml\"</span>});\n        context.start();\n        System.in.read();\n    }\n}\n</code></pre>\n<h3>2. 实现 nodejs 的 dubbo 客户端</h3>\n<p>安装 dubbo2.js:</p>\n<pre><code class=\"language-sh\">npm install dubbo2.js --save\n</code></pre>\n<p>配置 dubboConfig.ts:</p>\n<pre><code class=\"language-typescript\"><span class=\"hljs-keyword\">import</span> { Dubbo, java, TDubboCallResult } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'dubbo2.js'</span>\n\n<span class=\"hljs-keyword\">const</span> dubbo = <span class=\"hljs-keyword\">new</span> Dubbo({\n  application: {name: <span class=\"hljs-string\">'demo-provider'</span>},\n  register: <span class=\"hljs-string\">'localhost:2181'</span>,\n  dubboVersion: <span class=\"hljs-string\">'2.0.0'</span>,\n  interfaces: [\n    <span class=\"hljs-string\">'com.alibaba.dubbo.demo.DemoProvider'</span>,\n  ],\n});\n\n<span class=\"hljs-keyword\">interface</span> IDemoService {\n  sayHello(name: <span class=\"hljs-built_in\">string</span>): TDubboCallResult&lt;<span class=\"hljs-built_in\">string</span>&gt;;\n}\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">const</span> demoService = dubbo.proxyService&lt;IDemoService&gt;({\n  dubboInterface: <span class=\"hljs-string\">'com.alibaba.dubbo.demo.DemoProvider'</span>,\n  version: <span class=\"hljs-string\">'1.0.0'</span>,\n  methods: {\n    sayHello(name: <span class=\"hljs-built_in\">string</span>) {\n      <span class=\"hljs-keyword\">return</span> [java.String(name)];\n    },\n\n    echo() {},\n\n    test() {},\n\n    getUserInfo() {\n      <span class=\"hljs-keyword\">return</span> [\n        java.combine(<span class=\"hljs-string\">'com.alibaba.dubbo.demo.UserRequest'</span>, {\n          id: <span class=\"hljs-number\">1</span>,\n          name: <span class=\"hljs-string\">'nodejs'</span>,\n          email: <span class=\"hljs-string\">'node@qianmi.com'</span>,\n        }),\n      ];\n    },\n  },\n});\n</code></pre>\n<blockquote>\n<p>使用 typescript 可以带来更好的开发体验。</p>\n</blockquote>\n<p>编写调用类 main.ts:</p>\n<pre><code class=\"language-typescript\"><span class=\"hljs-keyword\">import</span> {demoService} <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./dubboConfig'</span>\n\ndemoService.sayHello(<span class=\"hljs-string\">'kirito'</span>).then(<span class=\"hljs-function\">(<span class=\"hljs-params\">{res,err}</span>)=&gt;</span>{\n    <span class=\"hljs-built_in\">console</span>.log(res)\n});\n</code></pre>\n<h3>3. 执行调用</h3>\n<p>Debug 模式启动 nodejs 客户端:</p>\n<pre><code class=\"language-sh\">DEBUG=dubbo* ts-node main.ts\n</code></pre>\n<p>查看运行结果:</p>\n<pre><code class=\"language-sh\">Hello kirito, response form provider: 172.19.6.151:20880\n</code></pre>\n<p>Congratulation!</p>\n<h2>dubbo2.js特性</h2>\n<ul>\n<li>支持 zookeeper 注册中心</li>\n<li>支持原生 dubbo 协议</li>\n<li>支持服务直连</li>\n<li>全链路跟踪</li>\n<li>dubbo 接口自动生成</li>\n</ul>\n<h2>更多细节</h2>\n<p>本文中的示例代码,提供在此处,<a href=\"https://github.com/lexburner/Dubbojs-Learning\">https://github.com/lexburner/Dubbojs-Learning</a> 。如果你对 dubbo 协议不甚了解,想要理解它的工作原理,项目中提供了一个子 moudle — java-socket-consumer,使用面向过程的思路实现了 java-socket-consumer,完成了原生 socket 发送 dubbo 协议报文,完成方法调用,并获取响应的全流程。</p>\n",
-  "title": "从跨语言调用到dubbo2.js",
-  "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
-  "description": "本文介绍了如何使用 dubbo2.js 进行跨语言的 dubbo 调用。"
+  "link": "/zh-cn/blog/dubbo2-js.html",
+  "meta": {
+    "title": "从跨语言调用到dubbo2.js",
+    "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
+    "description": "本文介绍了如何使用 dubbo2.js 进行跨语言的 dubbo 调用。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/how-to-involve-dubbo-community.json b/zh-cn/blog/how-to-involve-dubbo-community.json
index 8a87f59a..0a9d71df 100644
--- a/zh-cn/blog/how-to-involve-dubbo-community.json
+++ b/zh-cn/blog/how-to-involve-dubbo-community.json
@@ -1,7 +1,10 @@
 {
   "filename": "how-to-involve-dubbo-community.md",
   "__html": "<h1>如何参与贡献Dubbo社区</h1>\n<p><img src=\"../../img/blog/involve-dubbo/head.jpg\" alt=\"img\"></p>\n<h2>前言</h2>\n<p>本文首次分享是在Apache Dubbo(incubating)成都meetup上,这个话题是第一次在meetup上讲,不是我们没有更好的话题,相反,我们认为这个话题非常重要,甚至建议这个话题以后每次meetup都要讲。</p>\n<p>Dubbo的发展历史大家应该并不陌生了,这里我还是简单回顾一下。Dubbo于2011年在github开源,后面几年由于一些原因停止了维护,直接去年7月份阿里重启维护,并于2018年2月16日捐献给Apache。</p>\n<p>为什么会选择捐献给Apache,主要是为了打消社区对Dubbo未来发展的顾虑,给Dubbo用户足够的信心;Apache认为<code>社区大于代码</code>,非常注重多样性,强调一个项⽬需要有多个公司和个人贡献者参与,现在Dubbo的发展完全是按<code>The Apache Way</code>社区化的方式来运作的。</p>\n<h2>Apache的诞生</h2>\n<p>说到Apache,大家都非常熟悉了,它是全球目前最大的软件基金;Apache的很多项目我们都用过,比如Maven、Log4j、Tomcat等,但有一个项目要特别强调的,那就是 Apache httpd server,这是Apache的第一个项目。</p>\n<p>Apache软件基金会正式创建于1999年,主要是为公众提供有用的免费软件,并为软件开发者社区提供支持和服务;它的创建者是一个自称为<code>Apache组织</code>的群体;</p>\n<p>早在1995年,这个组织就存在了,他们聚集在一起,在美国伊利诺伊大学超级计算机应用程序国家中心开发的NCSA HTTPd服务器的基础上开发与维护了一个叫Apache的HTTP服务器。</p>\n<p>最早NCSA HTTPd服务器是一个叫Rob McCool的人开发的,但是后来慢慢失去了兴趣,导致这个功能强大又好用的服务器没人维护;于是一些爱好者和用户就自发开始维护起来,并不断改善功能、发布版本;为了更好进行沟通,一哥们就创建了一个邮件组,并把维护工作高效组织起来,且自称是<code>Apache组织</code>,并把这个软件叫<code>Apache 服务器</code>。</p>\n<p>这也是为什么Apache的所有的项目到今天为止依然以邮件列表作为沟通的主要方式。</p>\n<p>关于Apache的命名来源,从北美当地的一支叫<code>Apache</code>的印第安部落名称而来,这支部落以高超的军事素养和超人的忍耐力著称,19世纪后半期对侵占他们领土的入侵者进行了反抗;为了对这支部落表示敬仰,就取了这个名字;但这里还流传着一个小故事,说是在NCSA HTTPd基础上,大家都通过打补丁不断在修改这个软件,被戏称为<code>A Patchy Server</code>,和<code>Apache Server</code>读音很像。</p>\n<p><img src=\"../../img/blog/involve-dubbo/apache-history.png\" alt=\"img\"></p>\n<p>随着后来商业需求扩大,围绕Apache HTTP服务器的项目越来越多,后来越来越多的项目启动,也有很多外部组织捐献项目;为了让这些外部项目能顺利进入到Apache基金会,2002年创建了Incubator(孵化)项目。可以看到,经过10多年的发展,到2010年,75个顶级项目,30个孵化项目,每天2697封讨论邮件;2018年这个数据进一步增长,194个顶级项目,54个孵化项目,3255个committers;其中中国人主导的项目,有RocketMQ,WeeX,ECharts,Skywalking等。</p>\n<p>Dubbo正在成为Apache顶级项目的路上——Apache孵化项目中。</p>\n<p>回顾一下Apache这些历史和数据,我们不难发现几个关键词:兴趣、参与、邮件;这些就是我们后面要重点介绍的<code>The Apache Way</code>。</p>\n<h2>ASF组织架构</h2>\n<p><img src=\"../../img/blog/involve-dubbo/apache-org.png\" alt=\"img\"></p>\n<p>我们知道每个组织都有它自己的架构,ASF同样也不例外;那Apache的组织架构是什么样的呢?它有什么独特的地方吗?这里特别要强调的是Project Management Committees,即 PMC,每个项目从孵化阶段开始就会有PMC,主要负责保证开源项目的社区活动都能运转良好,这里运转的机制就是<code>The Apache Way</code>。</p>\n<p>图中,Board就是负责整个基金会符合章程的运作。Board我们一般很少能接触到,接触更多的是PMC以及下面的这几层。</p>\n<p>参与Apache项目社区活动的人,一般分为以下几类:</p>\n<ul>\n<li>\n<p>直接用户:在座的都是Dubbo的用户,可能部分现在还不是,但将来肯定会是</p>\n</li>\n<li>\n<p>贡献者:部分用户在使用Dubbo过程中,遇到问题,自己通过分析调试找到解决方案,并提交给Dubbo官方,最终被接受,这些用户就是Dubbo的贡献者</p>\n</li>\n<li>\n<p>提交者:贡献多了,经过PMC的提议和投票,就会成为Committer;Committer即意味着正式加入Apache,拥有个人Apache帐号以及相应项目的写权限</p>\n</li>\n<li>\n<p>PMC:Committer再往上走就是PMC,这个必须由现有PMC成员提名</p>\n</li>\n</ul>\n<p>个人在社区的成长,就像我们在公司晋升一样,一步一步往上走。</p>\n<p>本文的目的就是告诉大家,从User到Contributor没有大家想像的那么难,从Contributor到Committer也不是不可能;只要大家拥有一颗开源的心,找到自己感兴趣的项目,并持续投入,付出肯定会有回报。</p>\n<h2>The Apache Way</h2>\n<p>就像你加入一家公司需要了解这家公司的文化一样,参与Apache开源项目之前,同样我们需要需要了解ASF的文化,这个文化就称为<code>The Apache Way</code>。</p>\n<p><img src=\"../../img/blog/involve-dubbo/apache-way.png\" alt=\"img\"></p>\n<p>这里想特别强调以下几点:</p>\n<ul>\n<li>社区胜于代码:把项目构建出来这不是开源,去构建社区才是真正的开源;对社区而言,一切都是围绕代码而生,无代码则社区不复存在;在代码之上,则是如何做事、如何待人、如何决策的理念体现;一个健康的社区远比优秀的代码重要——如果代码奇烂无比,社区可以重写,但社区有了毛病,代码最终也会付之东流;</li>\n<li>公开透明与共识决策:<code>If it doesn't happen on email, it doesn't happen.</code> 所有的决定,不管是技术feature、发展方向,还是版本发布等,都应该被公开讨论,而形式就是邮件列表,这些讨论过程和结论都会被永久存档;而讨论的过程,就是大家自由发表意见的过程,但最终大家要投票,比较民主的做法;</li>\n<li>任人唯贤:<code>Those that have proven they can do, get to do more.</code> 特别强调一点,贡献绝不仅仅是代码,贡献可以是很多方面,接下来我们结合Dubbo来讲,大家如何参与并贡献;</li>\n</ul>\n<h2>参与Dubbo社区</h2>\n<p><img src=\"../../img/blog/involve-dubbo/dubbo-community.png\" alt=\"img\"></p>\n<p>要参与Dubbo社区,就要先大概了解一下目前社区的工作方式。总结一句话就是4个角色、3个途径以及2个代码组;</p>\n<ol>\n<li>4个角色前面也提到过了,分别是User、Contributor、Committer、PPMC;这里特别要强调用的是,角色之间不是孤立的,比如提功能建议的也可以是Committer或Contributor等;PPMC有投票权,但其他人一样也可以投票,这本身就是一种参与、一种贡献;</li>\n<li>3个途径,分别是Dubbo官网、github、dev邮件列表;目前比较活跃的是github issue/PR;我们鼓励按<code>The Apache Way</code>的方式,使用邮件列表交流,让导师看到我们的贡献;</li>\n<li>2个代码组,一个是 <code>github.com/apache/incubator-dubbo*</code> ,这里是dubbo孵化的项目,目前主要包含dubbo-rpc、dubbo-spring-boot-start、dubbo-ops三个部分;另外一个就是 <code>github.com/dubbo</code>,这个是dubbo作为微服务解决方案的所有相关的生态部分,包括dubbo-rpc的扩展、dubbo与其他产品集成、dubbo多语言客户端实现以及一些工具和套件等;</li>\n</ol>\n<p><img src=\"../../img/blog/involve-dubbo/dubbo-project.png\" alt=\"img\"></p>\n<p>所以,对于想参与Dubbo社区、想为Dubbo这个微服务解决方案自己一份力量的人来说,以下就是你们现在就可以开始做的:</p>\n<ol>\n<li>开发邮件组可以订阅起来,可以参考这里:<a href=\"https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide\">https://github.com/apache/incubator-dubbo/wiki/Mailing-list-subscription-guide</a></li>\n<li><a href=\"http://github.com/apache/incubator-dubbo\">github.com/apache/incubator-dubbo</a> star起来,fork起来</li>\n<li>学习中英文文档,进行修正或优化,提PR;有疑问的地方,可以email到邮件组或提issue;官方开发者的回复总比google或stackoverflow里找到的答案要强的多吧?</li>\n<li>如果你正在使用dubbo,可以将经验总结出来,写篇blog,分享给社区;真实的案例总是最具有说服力;</li>\n<li>如果你有时间,可以参与issue和PR的解决,回条用户的问题、PR的review;<code>Good first issue</code>以及<code>Help wanted</code>的issue,总有一个是适合你的;</li>\n<li>如果你想深入学习dubbo-rpc框架,UT是一个非常好的开始,完善和补充现有的UT,一边学习一边贡献,何乐而不为?</li>\n<li>发现了bug,报issue;通过自己的努力最终解决了,提一个issue,<code>first-contributor</code>并不是那么难;哦,对了,拼写错误也算哦;</li>\n<li>如果你发现一个可以帮助用户更方便地使用dubbo,开发、测试、调试、mock、工具等;都可以贡献到Dubbo生态中来;</li>\n<li>最后我们非常欢迎大家通过邮件提想法,也欢迎大家多讨论;你会发现,技术变牛的同时,英文也变的66的了;</li>\n</ol>\n<h2>加入Apache孵化</h2>\n<p>如果大家有好的项目希望捐献给Apache,这个流程可以参考一下;</p>\n<p><img src=\"../../img/blog/involve-dubbo/get-into-apache.png\" alt=\"img\"></p>\n<p>进⼊ Apache 分为三个阶段,准备阶段、孵化阶段和毕业阶段。准备阶段需要做的事情有找到愿意帮助孵化的导师,向Apache 提交进⼊孵化的申请,经过导师们讨论并投票,如果通过的话就可以进⼊入孵化。孵化阶段分为两大环节,第⼀个环节是公司和个人签署协议向Apache 移交代码和知识产权,之后就是在导师的指导下按照Apache的规范做版本迭代、社区运营、发展更多的Committer;如果最终通过了成熟度评估,就可以顺利毕业成为Apache的顶级项目。</p>\n<h2>结语</h2>\n<p>希望越来越多的公司团队和个人能够贡献到国际化的开源社区里去,一起打造我们中国的开源品牌!也希望大家都能愉快去贡献,罗马非一日建成,但付出一定会有回报。</p>\n<p>这里透露一个小福利,所有Apache Committer可以免费使用IntelliJ的全套付费产品,包括全宇宙最好用的IDEA。</p>\n",
-  "title": "如何参与贡献Dubbo社区",
-  "keywords": "Dubbo, Apache Way",
-  "description": "本文介绍了如何以Apache Way的方式参与Dubbo社区并做贡献"
+  "link": "/zh-cn/blog/how-to-involve-dubbo-community.html",
+  "meta": {
+    "title": "如何参与贡献Dubbo社区",
+    "keywords": "Dubbo, Apache Way",
+    "description": "本文介绍了如何以Apache Way的方式参与Dubbo社区并做贡献"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/introduction-to-dubbo-qos.json b/zh-cn/blog/introduction-to-dubbo-qos.json
index 350c0528..412eb48e 100644
--- a/zh-cn/blog/introduction-to-dubbo-qos.json
+++ b/zh-cn/blog/introduction-to-dubbo-qos.json
@@ -1,7 +1,10 @@
 {
   "filename": "introduction-to-dubbo-qos.md",
   "__html": "<h1>通过QoS对服务进行动态控制</h1>\n<p>QoS,全称为<code>Quality of Service</code>, 是常见于网络设备中的一个术语 ,例如在路由器中,可以通过Qos动态的调整和控制某些端口的权重,从而优先的保障运行在这些端口上的服务质量。</p>\n<p>在Dubbo中,QoS这个概念被用于动态的对服务进行查询和控制。例如对获取当前提供和消费的所有服务,以及对服务进行动态的上下线,即从注册中心上进行注册和反注册操作。</p>\n<h2>QoS工作机制</h2>\n<p>从Dubbo 2.5.8开始,默认引入了Qos功能,默认处于启动状态。所有的QoS功能被抽象成一个个的命令,通过执行这些命令,Qos会返回响应的结果。</p>\n<blockquote>\n<p>Qos功能基于Netty4实现,在Dubbo 2.6.x之前的版本中,默认依赖的是Netty3,因此需要显示的添加Netty4的依赖,才能确保Netty4正常工作。如果使用http://start.dubbo.io自动生成的Dubbo应用,则无需添加额外的配置,因为已经默认加上了Netty4的依赖。</p>\n</blockquote>\n<p>Qos的工作机制如下图所示:</p>\n<p><img src=\"../../img/blog/qos-architecture.png\" alt=\"undefined\"></p>\n<ol>\n<li>启动并监听一个端口,默认端口是22222</li>\n<li>识别目标请求的协议是Http或者是Telnet,根据协议不同动态添加对应的处理器</li>\n<li>针对不同的协议进行解码,解析出需要执行的命令</li>\n<li>执行命令并返回结果</li>\n</ol>\n<h2>QoS命令</h2>\n<p>QoS目前支持的命令包括:</p>\n<ul>\n<li>help: 帮助命令,列出</li>\n<li>ls: 列出当前所有的正在提供的服务,以及消费的服务</li>\n<li>online: 动态将某个或全部服务向注册中心进行注册</li>\n<li>offline: 动态将某个或全部服务从注册中心摘除(反注册)</li>\n<li>quit: 退出当前telnet会话</li>\n</ul>\n<p>下面,我们具体来操作一下如何通过用QoS对服务进行动态控制。</p>\n<h3>通过Telnet方式访问QoS</h3>\n<p>假设我们的Dubbo服务端已经启动,我们通过Telnet方式进行连接:</p>\n<pre><code>$ telnet localhost 22222\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is '^]'.\n  ?????????  ???    ??  ???????????  ???????????   ????????\n  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???\n  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???\n  ???    ??? ???    ???  ??????????   ??????????  ???    ???\n  ???    ??? ???    ??? ???????????  ???????????  ???    ???\n  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???\n  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???\n  ?????????  ?????????  ???????????  ???????????   ????????\n\n\ndubbo&gt;\n</code></pre>\n<p>连接成功后,会出现<code>dubbo&gt;</code>提示符,此时输入<code>help</code>命令</p>\n<pre><code>dubbo&gt;help\n+---------+----------------------------------------------------------------------------------+\n|    help | help command                                                                     |\n+---------+----------------------------------------------------------------------------------+\n|      ls | ls service                                                                       |\n+---------+----------------------------------------------------------------------------------+\n| offline | offline dubbo                                                                    |\n+---------+----------------------------------------------------------------------------------+\n|  online | online dubbo                                                                     |\n+---------+----------------------------------------------------------------------------------+\n|    quit | quit telnet console                                                              |\n+---------+----------------------------------------------------------------------------------+\n\ndubbo&gt;\n</code></pre>\n<p>会列出当前所有可用的命令,及相应的说明。</p>\n<p>也可以对单个命令进行help操作,可以看到该命令对应的示例</p>\n<pre><code>dubbo&gt;help online\n+--------------+----------------------------------------------------------------------------------+\n| COMMAND NAME | online                                                                           |\n+--------------+----------------------------------------------------------------------------------+\n|      EXAMPLE | online dubbo                                                                     |\n|              | online xx.xx.xxx.service                                                         |\n+--------------+----------------------------------------------------------------------------------+\n</code></pre>\n<p>通过<code>ls</code> 查看当前的服务状态</p>\n<pre><code>dubbo&gt;ls\nAs Provider side:\n+------------------------------------------+---+\n|           Provider Service Name          |PUB|\n+------------------------------------------+---+\n|org.apache.dubbo.demo.provider.DemoService| Y |\n+------------------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>可以看到,在服务端可以看到一个服务<code>org.apache.dubbo.demo.provider.DemoService</code>,第二列里面的<code>PUB=Y</code>代表改服务已经发布到注册中心,可供消费端进行调用。</p>\n<p>假设我们需要动态的对该服务进行下线操作,可以通过<code>offline</code>命令来完成</p>\n<pre><code>dubbo&gt;offline org.apache.dubbo.demo.provider.DemoService\nOK\n</code></pre>\n<p>可以看到命令返回了OK,我们再通过ls看下当前的状态:</p>\n<pre><code>dubbo&gt;ls\nAs Provider side:\n+------------------------------------------+---+\n|           Provider Service Name          |PUB|\n+------------------------------------------+---+\n|org.apache.dubbo.demo.provider.DemoService| N |\n+------------------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>可以看到<code>org.apache.dubbo.demo.provider.DemoService</code>的<code>PUB</code>已经被设置成了<code>N</code>。</p>\n<p>通过<code>quit</code>命令退出当前的telnet会话:</p>\n<pre><code>dubbo&gt;quit\nBYE!\nConnection closed by foreign host.\n</code></pre>\n<h3>通过HTTP方式访问QOS</h3>\n<p>在上面的例子中,我们已经对<code>org.apache.dubbo.demo.provider.DemoService</code>进行了下线操作,下面,我们通过对Http方式对上面的服务进行注册操作:</p>\n<pre><code>$ curl -i http://localhost:22222/online?service=org.apache.dubbo.demo.provider.DemoService\nHTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 2\n\nOK%\n</code></pre>\n<blockquote>\n<p>注意online操作对应的参数,需要以<code>key=value</code>的形式提供,但实际上key会被忽略</p>\n</blockquote>\n<p>看到操作返回了OK,下面通过ls命令查看下当前的状态</p>\n<pre><code>$ curl -i http://localhost:22222/ls\nHTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 365\n\nAs Provider side:\n+------------------------------------------+---+\n|           Provider Service Name          |PUB|\n+------------------------------------------+---+\n|org.apache.dubbo.demo.provider.DemoService| Y |\n+------------------------------------------+---+\nAs Consumer side:\n+---------------------+---+\n|Consumer Service Name|NUM|\n+---------------------+---+\n</code></pre>\n<p>可以看到服务的<code>PUB</code>状态已经变成了<code>Y</code>。</p>\n<h2>QoS相关参数说明</h2>\n<p>QoS提供了一些启动参数,来对启动进行配置,他们主要包括:</p>\n<table>\n<thead>\n<tr>\n<th>参数</th>\n<th>说明</th>\n<th>默认值</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>qosEnable</td>\n<td>是否启动QoS</td>\n<td>true</td>\n</tr>\n<tr>\n<td>qosPort</td>\n<td>启动QoS绑定的端口</td>\n<td>22222</td>\n</tr>\n<tr>\n<td>qosAcceptForeignIp</td>\n<td>是否允许远程访问</td>\n<td>false</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>注意,从2.6.4/2.7.0开始,qosAcceptForeignIp默认配置改为false,如果qosAcceptForeignIp设置为true,有可能带来安全风险,请仔细评估后再打开。</p>\n</blockquote>\n<p>QoS参数可以通过如下方式进行配置</p>\n<ul>\n<li>系统属性</li>\n<li>dubbo.properties</li>\n<li>XML方式</li>\n<li>Spring-boot自动装配方式</li>\n</ul>\n<p>其中,上述方式的优先顺序为系统属性 &gt; dubbo.properties &gt; XML/Spring-boot自动装配方式。</p>\n<h3>使用系统属性方式进行配置</h3>\n<pre><code>-Ddubbo.application.qos.enable=true\n-Ddubbo.application.qos.port=33333\n-Ddubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h3>使用dubbo.properties文件进行配置</h3>\n<p>在项目的<code>src/main/resources</code>目录下添加dubbo.properties文件,内容如下:</p>\n<pre><code>dubbo.application.qos.enable=true\ndubbo.application.qos.port=33333\ndubbo.application.qos.accept.foreign.ip=false\n</code></pre>\n<h3>使用XML方法进行配置</h3>\n<p>如果要通过XML配置响应的QoS相关的参数,可以进行如下配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"demo-provider\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.enable\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"true\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.accept.foreign.ip\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"false\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"qos.port\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"33333\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span>/&gt;</span>\n  <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\">\"20880\"</span>/&gt;</span>\n  <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.demo.provider.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span>/&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"org.apache.dubbo.demo.provider.DemoServiceImpl\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>使用spring-boot自动装配方式配置</h3>\n<p>如果是spring-boot的应用,可以在<code>application.properties</code>或者<code>application.yml</code>上配置:</p>\n<pre><code>dubbo.application.qosEnable=true\ndubbo.application.qosPort=33333\ndubbo.application.qosAcceptForeignIp=false\n</code></pre>\n",
-  "title": "通过QoS对服务进行动态控制",
-  "keywords": "Dubbo, qos",
-  "description": "本文介绍了如何使用Dubbo的QoS功能对服务进行动态配置,以及相关的参数及配置方式。"
+  "link": "/zh-cn/blog/introduction-to-dubbo-qos.html",
+  "meta": {
+    "title": "通过QoS对服务进行动态控制",
+    "keywords": "Dubbo, qos",
+    "description": "本文介绍了如何使用Dubbo的QoS功能对服务进行动态配置,以及相关的参数及配置方式。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/introduction-to-dubbo-spi-2.json b/zh-cn/blog/introduction-to-dubbo-spi-2.json
index c244c978..f8f5e700 100644
--- a/zh-cn/blog/introduction-to-dubbo-spi-2.json
+++ b/zh-cn/blog/introduction-to-dubbo-spi-2.json
@@ -1,7 +1,10 @@
 {
   "filename": "introduction-to-dubbo-spi-2.md",
   "__html": "<h1>Dubbo可扩展机制源码解析</h1>\n<p>在<a href=\"./introduction-to-dubbo-spi.md\">Dubbo可扩展机制实战</a>中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现,并自己实现了一个LoadBalance。是不是觉得Dubbo的扩展机制很不错呀,接下来,我们就深入Dubbo的源码,一睹庐山真面目。</p>\n<h2>ExtensionLoader</h2>\n<p>ExtentionLoader是最核心的类,负责扩展点的加载和生命周期管理。我们就以这个类开始吧。\nExtension的方法比较多,比较常用的方法有:</p>\n<ul>\n<li><code>public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type)</code></li>\n<li><code>public T getExtension(String name)</code></li>\n<li><code>public T getAdaptiveExtension()</code></li>\n</ul>\n<p>比较常见的用法有:</p>\n<ul>\n<li><code>LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName)</code></li>\n<li><code>RouterFactory routerFactory = ExtensionLoader.getExtensionLoader(RouterFactory.class).getAdaptiveExtension()</code></li>\n</ul>\n<p>说明:在接下来展示的源码中,我会将无关的代码(比如日志,异常捕获等)去掉,方便大家阅读和理解。</p>\n<ol>\n<li>getExtensionLoader方法\n这是一个静态工厂方法,入参是一个可扩展的接口,返回一个该接口的ExtensionLoader实体类。通过这个实体类,可以根据name获得具体的扩展,也可以获得一个自适应扩展。</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> &lt;T&gt; <span class=\"hljs-function\">ExtensionLoader&lt;T&gt; <span class=\"hljs-title\">getExtensionLoader</span><span class=\"hljs-params\">(Class&lt;T&gt; type)</span> </span>{\n        <span class=\"hljs-comment\">// 扩展点必须是接口</span>\n        <span class=\"hljs-keyword\">if</span> (!type.isInterface()) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"Extension type(\"</span> + type + <span class=\"hljs-string\">\") is not interface!\"</span>);\n        }\n        <span class=\"hljs-comment\">// 必须要有@SPI注解</span>\n        <span class=\"hljs-keyword\">if</span> (!withExtensionAnnotation(type)) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"Extension type without @SPI Annotation!\"</span>);\n        }\n        <span class=\"hljs-comment\">// 从缓存中根据接口获取对应的ExtensionLoader</span>\n        <span class=\"hljs-comment\">// 每个扩展只会被加载一次</span>\n        ExtensionLoader&lt;T&gt; loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);\n        <span class=\"hljs-keyword\">if</span> (loader == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-comment\">// 初始化扩展</span>\n            EXTENSION_LOADERS.putIfAbsent(type, <span class=\"hljs-keyword\">new</span> ExtensionLoader&lt;T&gt;(type));\n            loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);\n        }\n        <span class=\"hljs-keyword\">return</span> loader;\n    }\n    \n<span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">ExtensionLoader</span><span class=\"hljs-params\">(Class&lt;?&gt; type)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.type = type;\n        objectFactory = (type == ExtensionFactory.class ? <span class=\"hljs-keyword\">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());\n    }\n</code></pre>\n<ol start=\"2\">\n<li>getExtension方法</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(String name)</span> </span>{\n        Holder&lt;Object&gt; holder = cachedInstances.get(name);\n        <span class=\"hljs-keyword\">if</span> (holder == <span class=\"hljs-keyword\">null</span>) {\n            cachedInstances.putIfAbsent(name, <span class=\"hljs-keyword\">new</span> Holder&lt;Object&gt;());\n            holder = cachedInstances.get(name);\n        }\n        Object instance = holder.get();\n        <span class=\"hljs-comment\">// 从缓存中获取,如果不存在就创建</span>\n        <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">synchronized</span> (holder) {\n                instance = holder.get();\n                <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n                    instance = createExtension(name);\n                    holder.set(instance);\n                }\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> (T) instance;\n    }\n</code></pre>\n<p>getExtention方法中做了一些判断和缓存,主要的逻辑在createExtension方法中。我们继续看createExtention方法。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> T <span class=\"hljs-title\">createExtension</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// 根据扩展点名称得到扩展类,比如对于LoadBalance,根据random得到RandomLoadBalance类</span>\n        Class&lt;?&gt; clazz = getExtensionClasses().get(name);\n        \n        T instance = (T) EXTENSION_INSTANCES.get(clazz);\n        <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n              <span class=\"hljs-comment\">// 使用反射调用nesInstance来创建扩展类的一个示例</span>\n            EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance());\n            instance = (T) EXTENSION_INSTANCES.get(clazz);\n        }\n        <span class=\"hljs-comment\">// 对扩展类示例进行依赖注入</span>\n        injectExtension(instance);\n        <span class=\"hljs-comment\">// 如果有wrapper,添加wrapper</span>\n        Set&lt;Class&lt;?&gt;&gt; wrapperClasses = cachedWrapperClasses;\n        <span class=\"hljs-keyword\">if</span> (wrapperClasses != <span class=\"hljs-keyword\">null</span> &amp;&amp; !wrapperClasses.isEmpty()) {\n            <span class=\"hljs-keyword\">for</span> (Class&lt;?&gt; wrapperClass : wrapperClasses) {\n                instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> instance;\n}\n</code></pre>\n<p>createExtension方法做了以下事情:</p>\n<ol>\n<li>先根据name来得到对应的扩展类。从ClassPath下<code>META-INF</code>文件夹下读取扩展点配置文件。</li>\n<li>使用反射创建一个扩展类的实例</li>\n<li>对扩展类实例的属性进行依赖注入,即IoC。</li>\n<li>如果有wrapper,添加wrapper。即AoP。</li>\n</ol>\n<p>下面我们来重点看下这4个过程</p>\n<ol>\n<li>根据name获取对应的扩展类\n先看代码:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">private</span> Map&lt;String, Class&lt;?&gt;&gt; getExtensionClasses() {\n        Map&lt;String, Class&lt;?&gt;&gt; classes = cachedClasses.get();\n        <span class=\"hljs-keyword\">if</span> (classes == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">synchronized</span> (cachedClasses) {\n                classes = cachedClasses.get();\n                <span class=\"hljs-keyword\">if</span> (classes == <span class=\"hljs-keyword\">null</span>) {\n                    classes = loadExtensionClasses();\n                    cachedClasses.set(classes);\n                }\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> classes;\n    }\n\n    <span class=\"hljs-comment\">// synchronized in getExtensionClasses</span>\n    <span class=\"hljs-keyword\">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {\n        <span class=\"hljs-keyword\">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);\n        <span class=\"hljs-keyword\">if</span> (defaultAnnotation != <span class=\"hljs-keyword\">null</span>) {\n            String value = defaultAnnotation.value();\n            <span class=\"hljs-keyword\">if</span> (value != <span class=\"hljs-keyword\">null</span> &amp;&amp; (value = value.trim()).length() &gt; <span class=\"hljs-number\">0</span>) {\n                String[] names = NAME_SEPARATOR.split(value);\n                <span class=\"hljs-keyword\">if</span> (names.length &gt; <span class=\"hljs-number\">1</span>) {\n                    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"more than 1 default extension name on extension \"</span> + type.getName());\n                }\n                <span class=\"hljs-keyword\">if</span> (names.length == <span class=\"hljs-number\">1</span>) cachedDefaultName = names[<span class=\"hljs-number\">0</span>];\n            }\n        }\n\n        Map&lt;String, Class&lt;?&gt;&gt; extensionClasses = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Class&lt;?&gt;&gt;();\n        loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY);\n        loadFile(extensionClasses, DUBBO_DIRECTORY);\n        loadFile(extensionClasses, SERVICES_DIRECTORY);\n        <span class=\"hljs-keyword\">return</span> extensionClasses;\n    }\n</code></pre>\n<p>过程很简单,先从缓存中获取,如果没有,就从配置文件中加载。配置文件的路径就是之前提到的:</p>\n<ul>\n<li><code>META-INF/dubbo/internal</code></li>\n<li><code>META-INF/dubbo</code></li>\n<li><code>META-INF/services</code></li>\n</ul>\n<ol start=\"2\">\n<li>使用反射创建扩展实例\n这个过程很简单,使用<code>clazz.newInstance())</code>来完成。创建的扩展实例的属性都是空值。</li>\n<li>扩展实例自动装配\n在实际的场景中,类之间都是有依赖的。扩展实例中也会引用一些依赖,比如简单的Java类,另一个Dubbo的扩展或一个Spring Bean等。依赖的情况很复杂,Dubbo的处理也相对复杂些。我们稍后会有专门的章节对其进行说明,现在,我们只需要知道,Dubbo可以正确的注入扩展点中的普通依赖,Dubbo扩展依赖或Spring依赖等。</li>\n<li>扩展实例自动包装\n自动包装就是要实现类似于Spring的AOP功能。Dubbo利用它在内部实现一些通用的功能,比如日志,监控等。关于扩展实例自动包装的内容,也会在后面单独讲解。</li>\n</ol>\n<p>经过上面的4步,Dubbo就创建并初始化了一个扩展实例。这个实例的依赖被注入了,也根据需要被包装了。到此为止,这个扩展实例就可以被使用了。</p>\n<h2>Dubbo SPI高级用法之自动装配</h2>\n<p>自动装配的相关代码在injectExtension方法中:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> T <span class=\"hljs-title\">injectExtension</span><span class=\"hljs-params\">(T instance)</span> </span>{\n    <span class=\"hljs-keyword\">for</span> (Method method : instance.getClass().getMethods()) {\n        <span class=\"hljs-keyword\">if</span> (method.getName().startsWith(<span class=\"hljs-string\">\"set\"</span>)\n                &amp;&amp; method.getParameterTypes().length == <span class=\"hljs-number\">1</span>\n                &amp;&amp; Modifier.isPublic(method.getModifiers())) {\n            Class&lt;?&gt; pt = method.getParameterTypes()[<span class=\"hljs-number\">0</span>];\n          \n            String property = method.getName().length() &gt; <span class=\"hljs-number\">3</span> ? method.getName().substring(<span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>).toLowerCase() + method.getName().substring(<span class=\"hljs-number\">4</span>) : <span class=\"hljs-string\">\"\"</span>;\n            Object object = objectFactory.getExtension(pt, property);\n            <span class=\"hljs-keyword\">if</span> (object != <span class=\"hljs-keyword\">null</span>) {\n                method.invoke(instance, object);\n            }\n        }\n    }\n    <span class=\"hljs-keyword\">return</span> instance;\n}\n</code></pre>\n<p>要实现对扩展实例的依赖的自动装配,首先需要知道有哪些依赖,这些依赖的类型是什么。Dubbo的方案是查找Java标准的setter方法。即方法名以set开始,只有一个参数。如果扩展类中有这样的set方法,Dubbo会对其进行依赖注入,类似于Spring的set方法注入。\n但是Dubbo中的依赖注入比Spring要复杂,因为Spring注入的都是Spring bean,都是由Spring容器来管理的。而Dubbo的依赖注入中,需要注入的可能是另一个Dubbo的扩展,也可能是一个Spring Bean,或是Google guice的组件,或其他任何一个框架中的组件。Dubbo需要能够从任何一个场景中加载扩展。在injectExtension方法中,是用<code>Object object = objectFactory.getExtension(pt, property)</code>来实现的。objectFactory是ExtensionFactory类型的,在创建ExtensionLoader时被初始化:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">ExtensionLoader</span><span class=\"hljs-params\">(Class&lt;?&gt; type)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.type = type;\n        objectFactory = (type == ExtensionFactory.class ? <span class=\"hljs-keyword\">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());\n    }\n</code></pre>\n<p>objectFacory本身也是一个扩展,通过<code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())</code>来获取。</p>\n<p><img src=\"https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo-extensionfactory.png\" alt=\"Dubbo-ExtensionFactory | left\"></p>\n<p>ExtensionLoader有三个实现:</p>\n<ol>\n<li>SpiExtensionLoader:Dubbo自己的Spi去加载Extension</li>\n<li>SpringExtensionLoader:从Spring容器中去加载Extension</li>\n<li>AdaptiveExtensionLoader: 自适应的AdaptiveExtensionLoader</li>\n</ol>\n<p>这里要注意AdaptiveExtensionLoader,源码如下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Adaptive</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AdaptiveExtensionFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExtensionFactory</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> List&lt;ExtensionFactory&gt; factories;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">AdaptiveExtensionFactory</span><span class=\"hljs-params\">()</span> </span>{\n        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);\n        List&lt;ExtensionFactory&gt; list = <span class=\"hljs-keyword\">new</span> ArrayList&lt;ExtensionFactory&gt;();\n        <span class=\"hljs-keyword\">for</span> (String name : loader.getSupportedExtensions()) {\n            list.add(loader.getExtension(name));\n        }\n        factories = Collections.unmodifiableList(list);\n    }\n\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">T <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;T&gt; type, String name)</span> </span>{\n        <span class=\"hljs-keyword\">for</span> (ExtensionFactory factory : factories) {\n            T extension = factory.getExtension(type, name);\n            <span class=\"hljs-keyword\">if</span> (extension != <span class=\"hljs-keyword\">null</span>) {\n                <span class=\"hljs-keyword\">return</span> extension;\n            }\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">null</span>;\n    }\n}\n</code></pre>\n<p>AdaptiveExtensionLoader类有@Adaptive注解。前面提到了,Dubbo会为每一个扩展创建一个自适应实例。如果扩展类上有@Adaptive,会使用该类作为自适应类。如果没有,Dubbo会为我们创建一个。所以<code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())</code>会返回一个AdaptiveExtensionLoader实例,作为自适应扩展实例。\nAdaptiveExtentionLoader会遍历所有的ExtensionFactory实现,尝试着去加载扩展。如果找到了,返回。如果没有,在下一个ExtensionFactory中继续找。Dubbo内置了两个ExtensionFactory,分别从Dubbo自身的扩展机制和Spring容器中去寻找。由于ExtensionFactory本身也是一个扩展点,我们可以实现自己的ExtensionFactory,让Dubbo的自动装配支持我们自定义的组件。比如,我们在项目中使用了Google的guice这个IoC容器。我们可以实现自己的GuiceExtensionFactory,让Dubbo支持从guice容器中加载扩展。</p>\n<h2>Dubbo SPI高级用法之AoP</h2>\n<p>在用Spring的时候,我们经常会用到AOP功能。在目标类的方法前后插入其他逻辑。比如通常使用Spring AOP来实现日志,监控和鉴权等功能。\nDubbo的扩展机制,是否也支持类似的功能呢?答案是yes。在Dubbo中,有一种特殊的类,被称为Wrapper类。通过装饰者模式,使用包装类包装原始的扩展点实例。在原始扩展点实现前后插入其他逻辑,实现AOP功能。</p>\n<h3>什么是Wrapper类</h3>\n<p>那什么样类的才是Dubbo扩展机制中的Wrapper类呢?Wrapper类是一个有复制构造函数的类,也是典型的装饰者模式。下面就是一个Wrapper类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">A</span></span>{\n    <span class=\"hljs-keyword\">private</span> A a;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">A</span><span class=\"hljs-params\">(A a)</span></span>{\n        <span class=\"hljs-keyword\">this</span>.a = a;\n    }\n}\n</code></pre>\n<p>类A有一个构造函数<code>public A(A a)</code>,构造函数的参数是A本身。这样的类就可以成为Dubbo扩展机制中的一个Wrapper类。Dubbo中这样的Wrapper类有ProtocolFilterWrapper, ProtocolListenerWrapper等, 大家可以查看源码加深理解。</p>\n<h3>怎么配置Wrapper类</h3>\n<p>在Dubbo中Wrapper类也是一个扩展点,和其他的扩展点一样,也是在<code>META-INF</code>文件夹中配置的。比如前面举例的ProtocolFilterWrapper和ProtocolListenerWrapper就是在路径<code>dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol</code>中配置的:</p>\n<pre><code class=\"language-text\">filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper\nlistener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper\nmock=com.alibaba.dubbo.rpc.support.MockProtocol\n</code></pre>\n<p>在Dubbo加载扩展配置文件时,有一段如下的代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">try</span> {  \n  clazz.getConstructor(type);    \n  Set&lt;Class&lt;?&gt;&gt; wrappers = cachedWrapperClasses;\n  <span class=\"hljs-keyword\">if</span> (wrappers == <span class=\"hljs-keyword\">null</span>) {\n    cachedWrapperClasses = <span class=\"hljs-keyword\">new</span> ConcurrentHashSet&lt;Class&lt;?&gt;&gt;();\n    wrappers = cachedWrapperClasses;\n  }\n  wrappers.add(clazz);\n} <span class=\"hljs-keyword\">catch</span> (NoSuchMethodException e) {}\n</code></pre>\n<p>这段代码的意思是,如果扩展类有复制构造函数,就把该类存起来,供以后使用。有复制构造函数的类就是Wrapper类。通过<code>clazz.getConstructor(type)</code>来获取参数是扩展点接口的构造函数。注意构造函数的参数类型是扩展点接口,而不是扩展类。\n以Protocol为例。配置文件<code>dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol</code>中定义了<code>filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper</code>。\nProtocolFilterWrapper代码如下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProtocolFilterWrapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Protocol protocol;\n\n    <span class=\"hljs-comment\">// 有一个参数是Protocol的复制构造函数</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">ProtocolFilterWrapper</span><span class=\"hljs-params\">(Protocol protocol)</span> </span>{\n        <span class=\"hljs-keyword\">if</span> (protocol == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"protocol == null\"</span>);\n        }\n        <span class=\"hljs-keyword\">this</span>.protocol = protocol;\n    }\n</code></pre>\n<p>ProtocolFilterWrapper有一个构造函数<code>public ProtocolFilterWrapper(Protocol protocol)</code>,参数是扩展点Protocol,所以它是一个Dubbo扩展机制中的Wrapper类。ExtensionLoader会把它缓存起来,供以后创建Extension实例的时候,使用这些包装类依次包装原始扩展点。</p>\n<h2>扩展点自适应</h2>\n<p>前面讲到过,Dubbo需要在运行时根据方法参数来决定该使用哪个扩展,所以有了扩展点自适应实例。其实是一个扩展点的代理,将扩展的选择从Dubbo启动时,延迟到RPC调用时。Dubbo中每一个扩展点都有一个自适应类,如果没有显式提供,Dubbo会自动为我们创建一个,默认使用Javaassist。\n先来看下创建自适应扩展类的代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">getAdaptiveExtension</span><span class=\"hljs-params\">()</span> </span>{\n    Object instance = cachedAdaptiveInstance.get();\n    <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">synchronized</span> (cachedAdaptiveInstance) {\n                instance = cachedAdaptiveInstance.get();\n                <span class=\"hljs-keyword\">if</span> (instance == <span class=\"hljs-keyword\">null</span>) {\n                      instance = createAdaptiveExtension();\n                      cachedAdaptiveInstance.set(instance); \n                }\n            }        \n    }\n\n    <span class=\"hljs-keyword\">return</span> (T) instance;\n}\n</code></pre>\n<p>继续看createAdaptiveExtension方法</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> T <span class=\"hljs-title\">createAdaptiveExtension</span><span class=\"hljs-params\">()</span> </span>{        \n    <span class=\"hljs-keyword\">return</span> injectExtension((T) getAdaptiveExtensionClass().newInstance());\n}\n</code></pre>\n<p>继续看getAdaptiveExtensionClass方法</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">private</span> Class&lt;?&gt; getAdaptiveExtensionClass() {\n        getExtensionClasses();\n        <span class=\"hljs-keyword\">if</span> (cachedAdaptiveClass != <span class=\"hljs-keyword\">null</span>) {\n            <span class=\"hljs-keyword\">return</span> cachedAdaptiveClass;\n        }\n        <span class=\"hljs-keyword\">return</span> cachedAdaptiveClass = createAdaptiveExtensionClass();\n    }\n</code></pre>\n<p>继续看createAdaptiveExtensionClass方法,绕了一大圈,终于来到了具体的实现了。看这个createAdaptiveExtensionClass方法,它首先会生成自适应类的Java源码,然后再将源码编译成Java的字节码,加载到JVM中。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">private</span> Class&lt;?&gt; createAdaptiveExtensionClass() {\n        String code = createAdaptiveExtensionClassCode();\n        ClassLoader classLoader = findClassLoader();\n        com.alibaba.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();\n        <span class=\"hljs-keyword\">return</span> compiler.compile(code, classLoader);\n    }\n</code></pre>\n<p>Compiler的代码,默认实现是javassist。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SPI</span>(<span class=\"hljs-string\">\"javassist\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Compiler</span> </span>{\n    Class&lt;?&gt; compile(String code, ClassLoader classLoader);\n}\n</code></pre>\n<p>createAdaptiveExtensionClassCode()方法中使用一个StringBuilder来构建自适应类的Java源码。方法实现比较长,这里就不贴代码了。这种生成字节码的方式也挺有意思的,先生成Java源代码,然后编译,加载到jvm中。通过这种方式,可以更好的控制生成的Java类。而且这样也不用care各个字节码生成框架的api等。因为xxx.java文件是Java通用的,也是我们最熟悉的。只是代码的可读性不强,需要一点一点构建xx.java的内容。\n下面是使用createAdaptiveExtensionClassCode方法为Protocol创建的自适应类的Java代码范例:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.rpc;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.ExtensionLoader;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Protocol</span>$<span class=\"hljs-title\">Adpative</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">com</span>.<span class=\"hljs-title\">alibaba</span>.<span class=\"hljs-title\">dubbo</span>.<span class=\"hljs-title\">rpc</span>.<span class=\"hljs-title\">Protocol</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroy</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> UnsupportedOperationException(<span class=\"hljs-string\">\"method public abstract void com.alibaba.dubbo.rpc.Protocol.destroy() of interface com.alibaba.dubbo.rpc.Protocol is not adaptive method!\"</span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getDefaultPort</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> UnsupportedOperationException(<span class=\"hljs-string\">\"method public abstract int com.alibaba.dubbo.rpc.Protocol.getDefaultPort() of interface com.alibaba.dubbo.rpc.Protocol is not adaptive method!\"</span>);\n    }\n\n    <span class=\"hljs-keyword\">public</span> com.alibaba.dubbo.rpc.<span class=\"hljs-function\">Exporter <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(com.alibaba.dubbo.rpc.Invoker arg0)</span> <span class=\"hljs-keyword\">throws</span> com.alibaba.dubbo.rpc.RpcException </span>{\n        <span class=\"hljs-keyword\">if</span> (arg0 == <span class=\"hljs-keyword\">null</span>) <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.Invoker argument == null\"</span>);\n        <span class=\"hljs-keyword\">if</span> (arg0.getUrl() == <span class=\"hljs-keyword\">null</span>)\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"com.alibaba.dubbo.rpc.Invoker argument getUrl() == null\"</span>);\n        com.alibaba.dubbo.common.URL url = arg0.getUrl();\n        String extName = (url.getProtocol() == <span class=\"hljs-keyword\">null</span> ? <span class=\"hljs-string\">\"dubbo\"</span> : url.getProtocol());\n        <span class=\"hljs-keyword\">if</span> (extName == <span class=\"hljs-keyword\">null</span>)\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(\"</span> + url.toString() + <span class=\"hljs-string\">\") use keys([protocol])\"</span>);\n        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);\n        <span class=\"hljs-keyword\">return</span> extension.export(arg0);\n    }\n\n    <span class=\"hljs-keyword\">public</span> com.alibaba.dubbo.rpc.<span class=\"hljs-function\">Invoker <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(java.lang.Class arg0, com.alibaba.dubbo.common.URL arg1)</span> <span class=\"hljs-keyword\">throws</span> com.alibaba.dubbo.rpc.RpcException </span>{\n        <span class=\"hljs-keyword\">if</span> (arg1 == <span class=\"hljs-keyword\">null</span>) <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalArgumentException(<span class=\"hljs-string\">\"url == null\"</span>);\n        com.alibaba.dubbo.common.URL url = arg1;\n        String extName = (url.getProtocol() == <span class=\"hljs-keyword\">null</span> ? <span class=\"hljs-string\">\"dubbo\"</span> : url.getProtocol());\n        <span class=\"hljs-keyword\">if</span> (extName == <span class=\"hljs-keyword\">null</span>)\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> IllegalStateException(<span class=\"hljs-string\">\"Fail to get extension(com.alibaba.dubbo.rpc.Protocol) name from url(\"</span> + url.toString() + <span class=\"hljs-string\">\") use keys([protocol])\"</span>);\n        com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);\n        <span class=\"hljs-keyword\">return</span> extension.refer(arg0, arg1);\n    }\n}\n</code></pre>\n<p>大致的逻辑和开始说的一样,通过url解析出参数,解析的逻辑由@Adaptive的value参数控制,然后再根据得到的扩展点名获取扩展点实现,然后进行调用。如果大家想知道具体的构建.java代码的逻辑,可以看<code>createAdaptiveExtensionClassCode</code>的完整实现。\n在生成的Protocol$Adpative中,发现getDefaultPort和destroy方法都是直接抛出异常的,这是为什么呢?来看看Protocol的源码</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SPI</span>(<span class=\"hljs-string\">\"dubbo\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Protocol</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getDefaultPort</span><span class=\"hljs-params\">()</span></span>;\n\n    <span class=\"hljs-meta\">@Adaptive</span>\n    &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n\n    <span class=\"hljs-meta\">@Adaptive</span>\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroy</span><span class=\"hljs-params\">()</span></span>;\n</code></pre>\n<p>可以看到Protocol接口中有4个方法,但只有export和refer两个方法使用了@Adaptive注解。Dubbo自动生成的自适应实例,只有@Adaptive修饰的方法才有具体的实现。所以,Protocol$Adpative类中,也只有export和refer这两个方法有具体的实现,其余方法都是抛出异常。</p>\n",
-  "title": "Dubbo可扩展机制源码解析",
-  "keywords": "Dubbo, SPI, 源码分析",
-  "description": "本文介绍了SPI扩展机制的实现原理与细节。"
+  "link": "/zh-cn/blog/introduction-to-dubbo-spi-2.html",
+  "meta": {
+    "title": "Dubbo可扩展机制源码解析",
+    "keywords": "Dubbo, SPI, 源码分析",
+    "description": "本文介绍了SPI扩展机制的实现原理与细节。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/introduction-to-dubbo-spi.json b/zh-cn/blog/introduction-to-dubbo-spi.json
index 19d6f5cd..3d0da31c 100644
--- a/zh-cn/blog/introduction-to-dubbo-spi.json
+++ b/zh-cn/blog/introduction-to-dubbo-spi.json
@@ -1,7 +1,10 @@
 {
   "filename": "introduction-to-dubbo-spi.md",
   "__html": "<h1>Dubbo可扩展机制实战</h1>\n<h2>1. Dubbo的扩展机制</h2>\n<p>在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。\n如同罗马不是一天建成的,任何系统都一定是从小系统不断发展成为大系统的,想要从一开始就把系统设计的足够完善是不可能的,相反的,我们应该关注当下的需求,然后再不断地对系统进行迭代。在代码层面,要求我们适当的对关注点进行抽象和隔离,在软件不断添加功能和特性时,依然能保持良好的结构和可维护性,同时允许第三方开发者对其功能进行扩展。在某些时候,软件设计者对扩展性的追求甚至超过了性能。</p>\n<p>在谈到软件设计时,可扩展性一直被谈起,那到底什么才是可扩展性,什么样的框架才算有良好的可扩展性呢?它必须要做到以下两点:</p>\n<ol>\n<li>作为框架的维护者,在添加一个新功能时,只需要添加一些新代码,而不用大量的修改现有的代码,即符合开闭原则。</li>\n<li>作为框架的使用者,在添加一个新功能时,不需要去修改框架的源码,在自己的工程中添加代码即可。</li>\n</ol>\n<p>Dubbo很好的做到了上面两点。这要得益于Dubbo的微内核+插件的机制。接下来的章节中我们会慢慢揭开Dubbo扩展机制的神秘面纱。</p>\n<h2>2. 可扩展的几种解决方案</h2>\n<p>通常可扩展的实现有下面几种:</p>\n<ul>\n<li>Factory模式</li>\n<li>IoC容器</li>\n<li>OSGI容器</li>\n</ul>\n<p>Dubbo作为一个框架,不希望强依赖其他的IoC容器,比如Spring,Guice。OSGI也是一个很重的实现,不适合Dubbo。最终Dubbo的实现参考了Java原生的SPI机制,但对其进行了一些扩展,以满足Dubbo的需求。</p>\n<h2>3. Java SPI机制</h2>\n<p>既然Dubbo的扩展机制是基于Java原生的SPI机制,那么我们就先来了解下Java SPI吧。了解了Java的SPI,也就是对Dubbo的扩展机制有一个基本的了解。如果对Java SPI比较了解的同学,可以跳过。</p>\n<p>Java SPI(Service Provider Interface)是JDK内置的一种动态加载扩展点的实现。在ClassPath的<code>META-INF/services</code>目录下放置一个与接口同名的文本文件,文件的内容为接口的实现类,多个实现类用换行符分隔。JDK中使用<code>java.util.ServiceLoader</code>来加载具体的实现。\n让我们通过一个简单的例子,来看看Java SPI是如何工作的。</p>\n<ol>\n<li>定义一个接口IRepository用于实现数据储存</li>\n</ol>\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\">IRepository</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(String data)</span></span>;\n}\n</code></pre>\n<ol start=\"2\">\n<li>提供IRepository的实现\nIRepository有两个实现。MysqlRepository和MongoRepository。</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MysqlRepository</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IRepository</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(String data)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"Save \"</span> + data + <span class=\"hljs-string\">\" to Mysql\"</span>);\n    }\n}\n</code></pre>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MongoRepository</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IRepository</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(String data)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"Save \"</span> + data + <span class=\"hljs-string\">\" to Mongo\"</span>);\n    }\n}\n</code></pre>\n<ol start=\"3\">\n<li>添加配置文件\n在<code>META-INF/services</code>目录添加一个文件,文件名和接口全名称相同,所以文件是<code>META-INF/services/com.demo.IRepository</code>。文件内容为:</li>\n</ol>\n<pre><code class=\"language-text\">com.demo.MongoRepository\ncom.demo.MysqlRepository\n</code></pre>\n<ol start=\"4\">\n<li>通过ServiceLoader加载IRepository实现</li>\n</ol>\n<pre><code class=\"language-java\">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository.class);\nIterator&lt;IRepository&gt; it = serviceLoader.iterator();\n<span class=\"hljs-keyword\">while</span> (it != <span class=\"hljs-keyword\">null</span> &amp;&amp; it.hasNext()){\n    IRepository demoService = it.next();\n    System.out.println(<span class=\"hljs-string\">\"class:\"</span> + demoService.getClass().getName());\n    demoService.save(<span class=\"hljs-string\">\"tom\"</span>);\n}\n</code></pre>\n<p>在上面的例子中,我们定义了一个扩展点和它的两个实现。在ClassPath中添加了扩展的配置文件,最后使用ServiceLoader来加载所有的扩展点。\n最终的输出结果为:\nclass:testDubbo.MongoRepository\nSave tom to Mongo\nclass:testDubbo.MysqlRepository\nSave tom to Mysql</p>\n<h2>4. Dubbo的SPI机制</h2>\n<p>Java SPI的使用很简单。也做到了基本的加载扩展点的功能。但Java SPI有以下的不足:</p>\n<ul>\n<li>需要遍历所有的实现,并实例化,然后我们在循环中才能找到我们需要的实现。</li>\n<li>配置文件中只是简单的列出了所有的扩展实现,而没有给他们命名。导致在程序中很难去准确的引用它们。</li>\n<li>扩展如果依赖其他的扩展,做不到自动注入和装配</li>\n<li>不提供类似于Spring的IOC和AOP功能</li>\n<li>扩展很难和其他的框架集成,比如扩展里面依赖了一个Spring bean,原生的Java SPI不支持</li>\n</ul>\n<p>所以Java SPI应付一些简单的场景是可以的,但对于Dubbo,它的功能还是比较弱的。Dubbo对原生SPI机制进行了一些扩展。接下来,我们就更深入地了解下Dubbo的SPI机制。</p>\n<h2>5. Dubbo扩展点机制基本概念</h2>\n<p>在深入学习Dubbo的扩展机制之前,我们先明确Dubbo SPI中的一些基本概念。在接下来的内容中,我们会多次用到这些术语。</p>\n<h3>5.1 扩展点(Extension Point)</h3>\n<p>是一个Java的接口。</p>\n<h3>5.2 扩展(Extension)</h3>\n<p>扩展点的实现类。</p>\n<h3>5.3 扩展实例(Extension Instance)</h3>\n<p>扩展点实现类的实例。</p>\n<h3>5.4 扩展自适应实例(Extension Adaptive Instance)</h3>\n<p>第一次接触这个概念时,可能不太好理解(我第一次也是这样的...)。如果称它为扩展代理类,可能更好理解些。扩展的自适应实例其实就是一个Extension的代理,它实现了扩展点接口。在调用扩展点的接口方法时,会根据实际的参数来决定要使用哪个扩展。比如一个IRepository的扩展点,有一个save方法。有两个实现MysqlRepository和MongoRepository。IRepository的自适应实例在调用接口方法的时候,会根据save方法中的参数,来决定要调用哪个IRepository的实现。如果方法参数中有repository=mysql,那么就调用MysqlRepository的save方法。如果repository=mongo,就调用MongoRepository的save方法。和面向对象的延迟绑定很类似。为什么Dubbo会引入扩展自适应实例的概念呢?</p>\n<ul>\n<li>Dubbo中的配置有两种,一种是固定的系统级别的配置,在Dubbo启动之后就不会再改了。还有一种是运行时的配置,可能对于每一次的RPC,这些配置都不同。比如在xml文件中配置了超时时间是10秒钟,这个配置在Dubbo启动之后,就不会改变了。但针对某一次的RPC调用,可以设置它的超时时间是30秒钟,以覆盖系统级别的配置。对于Dubbo而言,每一次的RPC调用的参数都是未知的。只有在运行时,根据这些参数才能做出正确的决定。</li>\n<li>很多时候,我们的类都是一个单例的,比如Spring的bean,在Spring bean都实例化时,如果它依赖某个扩展点,但是在bean实例化时,是不知道究竟该使用哪个具体的扩展实现的。这时候就需要一个代理模式了,它实现了扩展点接口,方法内部可以根据运行时参数,动态的选择合适的扩展实现。而这个代理就是自适应实例。\n自适应扩展实例在Dubbo中的使用非常广泛,Dubbo中,每一个扩展都会有一个自适应类,如果我们没有提供,Dubbo会使用字节码工具为我们自动生成一个。所以我们基本感觉不到自适应类的存在。后面会有例子说明自适应类是怎么工作的。</li>\n</ul>\n<h3>5.5 @SPI</h3>\n<p>@SPI注解作用于扩展点的接口上,表明该接口是一个扩展点。可以被Dubbo的ExtentionLoader加载。如果没有此ExtensionLoader调用会异常。</p>\n<h3>5.6 @Adaptive</h3>\n<p>@Adaptive注解用在扩展接口的方法上。表示该方法是一个自适应方法。Dubbo在为扩展点生成自适应实例时,如果方法有@Adaptive注解,会为该方法生成对应的代码。方法内部会根据方法的参数,来决定使用哪个扩展。\n@Adaptive注解用在类上代表实现一个装饰类,类似于设计模式中的装饰模式,它主要作用是返回指定类,目前在整个系统中AdaptiveCompiler、AdaptiveExtensionFactory这两个类拥有该注解。</p>\n<h3>5.7 ExtentionLoader</h3>\n<p>类似于Java SPI的ServiceLoader,负责扩展的加载和生命周期维护。</p>\n<h3>5.8 扩展别名</h3>\n<p>和Java SPI不同,Dubbo中的扩展都有一个别名,用于在应用中引用它们。比如</p>\n<pre><code class=\"language-bash\">random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance\nroundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance\n</code></pre>\n<p>其中的random,roundrobin就是对应扩展的别名。这样我们在配置文件中使用random或roundrobin就可以了。</p>\n<h3>5.9 一些路径</h3>\n<p>和Java SPI从<code>/META-INF/services</code>目录加载扩展配置类似,Dubbo也会从以下路径去加载扩展配置文件:</p>\n<ul>\n<li><code>META-INF/dubbo/internal</code></li>\n<li><code>META-INF/dubbo</code></li>\n<li><code>META-INF/services</code></li>\n</ul>\n<h2>6. Dubbo的LoadBalance扩展点解读</h2>\n<p>在了解了Dubbo的一些基本概念后,让我们一起来看一个Dubbo中实际的扩展点,对这些概念有一个更直观的认识。</p>\n<p>我们选择的是Dubbo中的LoadBalance扩展点。Dubbo中的一个服务,通常有多个Provider,consumer调用服务时,需要在多个Provider中选择一个。这就是一个LoadBalance。我们一起来看看在Dubbo中,LoadBalance是如何成为一个扩展点的。</p>\n<h3>6.1 LoadBalance接口</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SPI</span>(RandomLoadBalance.NAME)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n\n    <span class=\"hljs-meta\">@Adaptive</span>(<span class=\"hljs-string\">\"loadbalance\"</span>)\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n}\n</code></pre>\n<p>LoadBalance接口只有一个select方法。select方法从多个invoker中选择其中一个。上面代码中和Dubbo SPI相关的元素有:</p>\n<ul>\n<li>@SPI(<a href=\"http://RandomLoadBalance.NAME\">RandomLoadBalance.NAME</a>)\n@SPI作用于LoadBalance接口,表示接口LoadBalance是一个扩展点。如果没有@SPI注解,试图去加载扩展时,会抛出异常。@SPI注解有一个参数,该参数表示该扩展点的默认实现的别名。如果没有显示的指定扩展,就使用默认实现。<code>RandomLoadBalance.NAME</code>是一个常量,值是&quot;random&quot;,是一个随机负载均衡的实现。\nrandom的定义在配置文件<code>META-INF/dubbo/internal/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>中:</li>\n</ul>\n<pre><code class=\"language-bash\">random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance\nroundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance\nleastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance\nconsistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance\n</code></pre>\n<p>可以看到文件中定义了4个LoadBalance的扩展实现。由于负载均衡的实现不是本次的内容,这里就不过多说明。只用知道Dubbo提供了4种负载均衡的实现,我们可以通过xml文件,properties文件,JVM参数显式的指定一个实现。如果没有,默认使用随机。</p>\n<p><img src=\"https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo_loadbalance.png\" alt=\"dubbo-loadbalance | left\"></p>\n<ul>\n<li>@Adaptive(&quot;loadbalance&quot;)\n@Adaptive注解修饰select方法,表明方法select方法是一个可自适应的方法。Dubbo会自动生成该方法对应的代码。当调用select方法时,会根据具体的方法参数来决定调用哪个扩展实现的select方法。@Adaptive注解的参数<code>loadbalance</code>表示方法参数中的loadbalance的值作为实际要调用的扩展实例。\n但奇怪的是,我们发现select的方法中并没有loadbalance参数,那怎么获取loadbalance的值呢?select方法中还有一个URL类型的参数,Dubbo就是从URL中获取loadbalance的值的。这里涉及到Dubbo的URL总线模式,简单说,URL中包含了RPC调用中的所有参数。URL类中有一个<code>Map&lt;String, String&gt; parameters</code>字段,parameters中就包含了loadbalance。</li>\n</ul>\n<h3>6.2 获取LoadBalance扩展</h3>\n<p>Dubbo中获取LoadBalance的代码如下:</p>\n<pre><code class=\"language-java\">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName);\n</code></pre>\n<p>使用ExtensionLoader.getExtensionLoader(LoadBalance.class)方法获取一个ExtensionLoader的实例,然后调用getExtension,传入一个扩展的别名来获取对应的扩展实例。</p>\n<h2>7. 自定义一个LoadBalance扩展</h2>\n<p>本节中,我们通过一个简单的例子,来自己实现一个LoadBalance,并把它集成到Dubbo中。我会列出一些关键的步骤和代码,也可以从这个地址(<a href=\"https://github.com/vangoleo/dubbo-spi-demo\">https://github.com/vangoleo/dubbo-spi-demo</a>)下载完整的demo。</p>\n<h3>7.1 实现LoadBalance接口</h3>\n<p>首先,编写一个自己实现的LoadBalance,因为是为了演示Dubbo的扩展机制,而不是LoadBalance的实现,所以这里LoadBalance的实现非常简单,选择第一个invoker,并在控制台输出一条日志。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.dubbo.spi.demo.consumer;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoLoadBalance</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        System.out.println(<span class=\"hljs-string\">\"DemoLoadBalance: Select the first invoker...\"</span>);\n        <span class=\"hljs-keyword\">return</span> invokers.get(<span class=\"hljs-number\">0</span>);\n    }\n}\n</code></pre>\n<h3>7.2 添加扩展配置文件</h3>\n<p>添加文件:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>。文件内容如下:</p>\n<pre><code class=\"language-bash\">demo=com.dubbo.spi.demo.consumer.DemoLoadBalance\n</code></pre>\n<h3>7.3 配置使用自定义LoadBalance</h3>\n<p>通过上面的两步,已经添加了一个名字为demo的LoadBalance实现,并在配置文件中进行了相应的配置。接下来,需要显式的告诉Dubbo使用demo的负载均衡实现。如果是通过spring的方式使用Dubbo,可以在xml文件中进行设置。</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.dubbo.spi.demo.api.IHelloService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"demo\"</span> /&gt;</span>\n</code></pre>\n<p>在consumer端的<a href=\"dubbo:reference\">dubbo:reference</a>中配置&lt;loadbalance=&quot;demo&quot;&gt;</p>\n<h3>7.4 启动Dubbo</h3>\n<p>启动Dubbo,调用一次IHelloService,可以看到控制台会输出一条<code>DemoLoadBalance: Select the first invoker...</code>日志。说明Dubbo的确是使用了我们自定义的LoadBalance。</p>\n<h2>总结</h2>\n<p>到此,我们从Java SPI开始,了解了Dubbo SPI 的基本概念,并结合了Dubbo中的LoadBalance加深了理解。最后,我们还实践了一下,创建了一个自定义LoadBalance,并集成到Dubbo中。相信通过这里理论和实践的结合,大家对Dubbo的可扩展有更深入的理解。\n总结一下,Dubbo SPI有以下的特点:</p>\n<ul>\n<li>对Dubbo进行扩展,不需要改动Dubbo的源码</li>\n<li>自定义的Dubbo的扩展点实现,是一个普通的Java类,Dubbo没有引入任何Dubbo特有的元素,对代码侵入性几乎为零。</li>\n<li>将扩展注册到Dubbo中,只需要在ClassPath中添加配置文件。使用简单。而且不会对现有代码造成影响。符合开闭原则。</li>\n<li>dubbo的扩展机制设计默认值:@SPI(&quot;dubbo&quot;) 代表默认的spi对象</li>\n<li>Dubbo的扩展机制支持IoC,AoP等高级功能</li>\n<li>Dubbo的扩展机制能很好的支持第三方IoC容器,默认支持Spring Bean,可自己扩展来支持其他容器,比如Google的Guice。</li>\n<li>切换扩展点的实现,只需要在配置文件中修改具体的实现,不需要改代码。使用方便。</li>\n</ul>\n<p>下一篇,我们将会一起深入Dubbo的源码,更深入的了解Dubbo的可扩展机制。</p>\n",
-  "title": "Dubbo可扩展机制实战",
-  "keywords": "Dubbo, SPI",
-  "description": "本文介绍了Dubbo框架的核心,SPI扩展机制。"
+  "link": "/zh-cn/blog/introduction-to-dubbo-spi.html",
+  "meta": {
+    "title": "Dubbo可扩展机制实战",
+    "keywords": "Dubbo, SPI",
+    "description": "本文介绍了Dubbo框架的核心,SPI扩展机制。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/meet-dubbo.json b/zh-cn/blog/meet-dubbo.json
index 853bd5b1..bf904d78 100644
--- a/zh-cn/blog/meet-dubbo.json
+++ b/zh-cn/blog/meet-dubbo.json
@@ -1,7 +1,10 @@
 {
   "filename": "meet-dubbo.md",
   "__html": "<h1>遇见Dubbo</h1>\n<p>我是一个有Dubbo情节的程序员。</p>\n<p>Dubbo以不同方式,陪伴了我时间不长的整个代码生涯。不久前,通过社区投票,我被选举为<code>Committer</code>。当时我在朋友圈发了一句话,也是贯穿我从开始使用Dubbo、研究Dubbo、贡献Dubbo到最后成为<code>Committer</code>的全过程,一直为我提供内心无与伦比愉悦的源泉:成长这种事,能看见脚印特别幸福。</p>\n<p>今天来个回忆杀,把我和Dubbo的那些事拿出来说说。</p>\n<h2>小白</h2>\n<p>我知道Dubbo,是在我大三翘课出去实习的时候,那个时候是无知的,我眼里最牛的人就是能熟练使用各种配置,精通SSH框架的人。就是在那种情况下,我外出实习,遇到了一群影响我至今的人。当时也是机缘巧合,我们进行了两个非常小的模块的服务化改造。那时的团队除了我们老大,全是一群新兵蛋子,老大指哪我们打哪。老大说,就用Dubbo吧,从那时候开始,我才知道,哦!原来还有一种东西叫做RPC,还有个阿里巴巴的RPC框架叫Dubbo。</p>\n<p>苦于当时非常有限的水平和高强度的工作,我和Dubbo的缘分也就停留在一面之缘的程度——要说认识谈不上,说不认识也牵强。</p>\n<h2>Contributor</h2>\n<p>我在二维火任职的一年算是我Dubbo生涯里承上启下的一年。二维火当时自己维护了一个Dubbo的分支,有一群对Dubbo非常了解的人。那时候,工作结束搞Dubbo,周六加班研究Dubbo。看源码,看不懂就debug一下,debug也不明白就问,问人,问google,里外折腾了个遍。</p>\n<p>后来毕业加入网易云音乐。大概是今年五月份的时候,我发现了一个Dubbo的小bug,并且给Dubbo提交了pull request。在第一次被merge之后,非常受鼓舞,这才有了后续的故事。后来,回看这第一次提交,真的算是我和Dubbo的一个拐点,拐弯之后,我才逐渐走上一条成为<code>Committer</code>的路。</p>\n<p>可能很多人看到这里要望而却步了,这也是做开源给很多人留下的固有的印象——是不是没发现BUG就不能提交pull request,不能做贡献?其实完全不是的,这里给大家敲黑板划重点:其实很多贡献者的第一次贡献,贡献的并非代码,而是文档修改或者单元测试。相比于BUG或者新的Feature,单测和文档上的修复门槛就比较低了。</p>\n<p>我自己的方法论就是:<strong>先尝试增加单元测试,写单测的时候顺手debug+看代码。或者多看文档,了解框架的同时,发现错别字、语意不明或者文档上的链接干脆点不开的情况,直接提交PR到对应的仓库</strong>。</p>\n<p>万事开头难。第一次被merge代码,你就可以成为一个<code>Contributor</code>了。<code>Contributor</code>很多,但是<code>Committer</code>很少,下面继续说怎么从一个<code>Contributor</code>成长为独当一面的<code>Committer</code>。</p>\n<h2>Committer</h2>\n<p>做开源和写代码一样,都不是一朝一夕的事情,而是量变促成质变的过程。这是一个没捷径可走的过程,欲带皇冠必承其重。身后的Dubbo功底自不必多说,这个部分主要是想跟大家说一下除了钻研和热爱之外,其他需要注意的地方。</p>\n<p>首先是多提交高质量PR。任何一个PR都会被review,代码中的问题,思路上的偏差,都会被指正。提交PR是一个反复琢磨的过程。PR的质量不能简单的归结于新增了多少行代码,高质量的PR一定是经过缜密思考的,为什么删除代码,新增的代码有什么意义,修改之后有什么效果等等。希望大家更加重视质量而非数量,眼光放长远,相信你的收获一定会非常大!</p>\n<p>第二个就是,我们需要培养一种思维方式——Apache Way。一句话概括就是<strong>社区重于代码</strong>。Apache是一个注重社区的的开源组织,其行为方式相比于目前我们的开发方式,还是有所不同,这里我举一个Apache Way的例子,用以说明传统方式相较于Apache Way的区别在哪里,这里假设我想为Dubbo开发一个功能A。</p>\n<p><strong>Old Way</strong>:</p>\n<ol>\n<li>功能设计:做一个设计文档(根据功能大小而定),大概划定需要修改或新增的类,大体设计接口等。</li>\n<li>开发代码。</li>\n<li>提交PR。</li>\n<li>Review &amp; Merge</li>\n</ol>\n<p>可以看到,我们整个过程中,真正与社区交互的只有最后一步。</p>\n<p><strong>Apache Way</strong>:</p>\n<ol>\n<li>功能设计:发送邮件至mailing list并且提交ISSUE,与社区成员共同探讨,产出一个设计文档(根据功能大小而定),大概划定需要修改或新增的类,大体设计接口等。然后再次发送邮件并且回复ISSUE,通知社区设计文档定稿或者方案确定。</li>\n<li>开发代码:发送邮件至社区,通知社区成员我即将投入开发功能A,如需帮助,可以同时说明需要协助。</li>\n<li>提交PR:发送邮件并且回复ISSUE,提醒社区开发结束,贴上PR地址以通知社区review代码。</li>\n<li>Review + Merge后,发送邮件并且关闭ISSUE,通知社区功能A的开发功能告一段落。</li>\n</ol>\n<p>可以看到,Apache Way就是在整个开发过程中,不断地与社区交互,最大发挥社区的功能,汲取众人之力,这才是所谓<strong>社区</strong>以及所谓<strong>开源</strong>的含义。</p>\n<h2>结尾</h2>\n<p>Dubbo目前还在孵化阶段,整个Dubbo社区还不完善,我们也在跟着Dubbo一起成长,我们非常希望更多的Dubbo爱好者深度参与到Dubbo中,为你的代码生涯树一个里程碑。</p>\n<p>相信过程,收获结果;天道酬勤,功不唐捐!</p>\n",
-  "title": "遇见Dubbo",
-  "keywords": "Dubbo, Committer",
-  "description": "本文记录了一个小白成长为Dubbo committer的过程。"
+  "link": "/zh-cn/blog/meet-dubbo.html",
+  "meta": {
+    "title": "遇见Dubbo",
+    "keywords": "Dubbo, Committer",
+    "description": "本文记录了一个小白成长为Dubbo committer的过程。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/optimization-branch-prediction.json b/zh-cn/blog/optimization-branch-prediction.json
index 05ea9f9e..03b54b2c 100644
--- a/zh-cn/blog/optimization-branch-prediction.json
+++ b/zh-cn/blog/optimization-branch-prediction.json
@@ -1,5 +1,8 @@
 {
   "filename": "optimization-branch-prediction.md",
   "__html": "<h1>优化技巧:提前if判断帮助CPU分支预测</h1>\n<h2>分支预测</h2>\n<p>在stackoverflow上有一个非常有名的问题:<a href=\"https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array\">为什么处理有序数组要比非有序数组快?</a>,可见分支预测对代码运行效率有非常大的影响。</p>\n<p>现代CPU都支持分支预测(branch prediction)和指令流水线(instruction pipeline),这两个结合可以极大提高CPU效率。对于像简单的if跳转,CPU是可以比较好地做分支预测的。但是对于switch跳转,CPU则没有太多的办法。switch本质上是据索引,从地址数组里取地址再跳转。</p>\n<p>要提高代码执行效率,一个重要的原则就是尽量避免CPU把流水线清空,那么提高分支预测的成功率就非常重要。</p>\n<p>那么对于代码里,如果某个switch分支概率很高,是否可以考虑代码层面帮CPU把判断提前,来提高代码执行效率呢?</p>\n<h2>Dubbo里ChannelEventRunnable的switch判断</h2>\n<p>在<code>ChannelEventRunnable</code>里有一个switch来判断channel state,然后做对应的逻辑:<a href=\"https://github.com/hengyunabc/incubator-dubbo/blob/dubbo-2.6.1/dubbo-remoting/dubbo-remoting-api/src/main/java/com/alibaba/dubbo/remoting/transport/dispatcher/ChannelEventRunnable.java#L54\">查看</a></p>\n<p>一个channel建立起来之后,超过99.9%情况它的state都是<code>ChannelState.RECEIVED</code>,那么可以考虑把这个判断提前。</p>\n<h2>benchmark验证</h2>\n<p>下面通过jmh来验证下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">TestBenchMarks</span> </span>{\n\t<span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">enum</span> ChannelState {\n\t\tCONNECTED, DISCONNECTED, SENT, RECEIVED, CAUGHT\n\t}\n\n\t<span class=\"hljs-meta\">@State</span>(Scope.Benchmark)\n\t<span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExecutionPlan</span> </span>{\n\t\t<span class=\"hljs-meta\">@Param</span>({ <span class=\"hljs-string\">\"1000000\"</span> })\n\t\t<span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> size;\n\t\t<span class=\"hljs-keyword\">public</span> ChannelState[] states = <span class=\"hljs-keyword\">null</span>;\n\n\t\t<span class=\"hljs-meta\">@Setup</span>\n\t\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setUp</span><span class=\"hljs-params\">()</span> </span>{\n\t\t\tChannelState[] values = ChannelState.values();\n\t\t\tstates = <span class=\"hljs-keyword\">new</span> ChannelState[size];\n\t\t\tRandom random = <span class=\"hljs-keyword\">new</span> Random(<span class=\"hljs-keyword\">new</span> Date().getTime());\n\t\t\t<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; size; i++) {\n\t\t\t\t<span class=\"hljs-keyword\">int</span> nextInt = random.nextInt(<span class=\"hljs-number\">1000000</span>);\n\t\t\t\t<span class=\"hljs-keyword\">if</span> (nextInt &gt; <span class=\"hljs-number\">100</span>) {\n\t\t\t\t\tstates[i] = ChannelState.RECEIVED;\n\t\t\t\t} <span class=\"hljs-keyword\">else</span> {\n\t\t\t\t\tstates[i] = values[nextInt % values.length];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t<span class=\"hljs-meta\">@Fork</span>(value = <span class=\"hljs-number\">5</span>)\n\t<span class=\"hljs-meta\">@Benchmark</span>\n\t<span class=\"hljs-meta\">@BenchmarkMode</span>(Mode.Throughput)\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">benchSiwtch</span><span class=\"hljs-params\">(ExecutionPlan plan, Blackhole bh)</span> </span>{\n\t\t<span class=\"hljs-keyword\">int</span> result = <span class=\"hljs-number\">0</span>;\n\t\t<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; plan.size; ++i) {\n\t\t\t<span class=\"hljs-keyword\">switch</span> (plan.states[i]) {\n\t\t\t<span class=\"hljs-keyword\">case</span> CONNECTED:\n\t\t\t\tresult += ChannelState.CONNECTED.ordinal();\n\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t<span class=\"hljs-keyword\">case</span> DISCONNECTED:\n\t\t\t\tresult += ChannelState.DISCONNECTED.ordinal();\n\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t<span class=\"hljs-keyword\">case</span> SENT:\n\t\t\t\tresult += ChannelState.SENT.ordinal();\n\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t<span class=\"hljs-keyword\">case</span> RECEIVED:\n\t\t\t\tresult += ChannelState.RECEIVED.ordinal();\n\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t<span class=\"hljs-keyword\">case</span> CAUGHT:\n\t\t\t\tresult += ChannelState.CAUGHT.ordinal();\n\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t}\n\t\t}\n\t\tbh.consume(result);\n\t}\n\n\t<span class=\"hljs-meta\">@Fork</span>(value = <span class=\"hljs-number\">5</span>)\n\t<span class=\"hljs-meta\">@Benchmark</span>\n\t<span class=\"hljs-meta\">@BenchmarkMode</span>(Mode.Throughput)\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">benchIfAndSwitch</span><span class=\"hljs-params\">(ExecutionPlan plan, Blackhole bh)</span> </span>{\n\t\t<span class=\"hljs-keyword\">int</span> result = <span class=\"hljs-number\">0</span>;\n\t\t<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; plan.size; ++i) {\n\t\t\tChannelState state = plan.states[i];\n\t\t\t<span class=\"hljs-keyword\">if</span> (state == ChannelState.RECEIVED) {\n\t\t\t\tresult += ChannelState.RECEIVED.ordinal();\n\t\t\t} <span class=\"hljs-keyword\">else</span> {\n\t\t\t\t<span class=\"hljs-keyword\">switch</span> (state) {\n\t\t\t\t<span class=\"hljs-keyword\">case</span> CONNECTED:\n\t\t\t\t\tresult += ChannelState.CONNECTED.ordinal();\n\t\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t\t<span class=\"hljs-keyword\">case</span> SENT:\n\t\t\t\t\tresult += ChannelState.SENT.ordinal();\n\t\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t\t<span class=\"hljs-keyword\">case</span> DISCONNECTED:\n\t\t\t\t\tresult += ChannelState.DISCONNECTED.ordinal();\n\t\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t\t<span class=\"hljs-keyword\">case</span> CAUGHT:\n\t\t\t\t\tresult += ChannelState.CAUGHT.ordinal();\n\t\t\t\t\t<span class=\"hljs-keyword\">break</span>;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbh.consume(result);\n\t}\n}\n</code></pre>\n<ul>\n<li>benchSiwtch里是纯switch判断</li>\n<li>benchIfAndSwitch 里用一个if提前判断state是否<code>ChannelState.RECEIVED</code></li>\n</ul>\n<p>benchmark结果是:</p>\n<pre><code>Result &quot;io.github.hengyunabc.jmh.TestBenchMarks.benchSiwtch&quot;:\n  576.745 ±(99.9%) 6.806 ops/s [Average]\n  (min, avg, max) = (490.348, 576.745, 618.360), stdev = 20.066\n  CI (99.9%): [569.939, 583.550] (assumes normal distribution)\n\n\n# Run complete. Total time: 00:06:48\n\nBenchmark                         (size)   Mode  Cnt     Score    Error  Units\nTestBenchMarks.benchIfAndSwitch  1000000  thrpt  100  1535.867 ± 61.212  ops/s\nTestBenchMarks.benchSiwtch       1000000  thrpt  100   576.745 ±  6.806  ops/s\n</code></pre>\n<p>可以看到提前if判断的确提高了代码效率,这种技巧可以放在性能要求严格的地方。</p>\n<p>Benchmark代码:<a href=\"https://github.com/hengyunabc/jmh-demo\">https://github.com/hengyunabc/jmh-demo</a></p>\n<h2>总结</h2>\n<ul>\n<li>switch对于CPU来说难以做分支预测</li>\n<li>某些switch条件如果概率比较高,可以考虑单独提前if判断,充分利用CPU的分支预测机制</li>\n</ul>\n",
-  "title": "提前if判断帮助CPU分支预测"
+  "link": "/zh-cn/blog/optimization-branch-prediction.html",
+  "meta": {
+    "title": "提前if判断帮助CPU分支预测"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/pinpoint.json b/zh-cn/blog/pinpoint.json
index f8e4e305..f2726e20 100644
--- a/zh-cn/blog/pinpoint.json
+++ b/zh-cn/blog/pinpoint.json
@@ -1,7 +1,10 @@
 {
   "filename": "pinpoint.md",
   "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。</p>\n<blockquote>\n<p>注:对于各个模块之间的通讯英文原文中用的是transaction一词,但是我觉得如果翻译为&quot;事务&quot;容易引起误解,所以替换为&quot;交互&quot;或者&quot;调用&quot;这种比较直白的字眼。</p>\n</blockquote>\n<p>在使用上力图简单高效:</p>\n<ul>\n<li>安装agent,不需要修改哪怕一行代码</li>\n<li>最小化性能损失</li>\n</ul>\n<h3>服务器地图(ServerMap)</h3>\n<p>通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量。</p>\n<h3>实时活动线程图表(Realtime Active Thread Chart)</h3>\n<p>实时监控应用内部的活动线程。</p>\n<h3>请求/应答分布图表(Request/Response Scatter Chart)</h3>\n<p>长期可视化请求数量和应答模式来定位潜在问题。通过在图表上拉拽可以选择请求查看更多的详细信息。</p>\n<h3>调用栈(CallStack)</h3>\n<p>在分布式环境中为每个调用生成代码级别的可视图,在单个视图中定位瓶颈和失败点。</p>\n<h3>巡查(Inspector)</h3>\n<p>查看应用上的其他详细信息,比如CPU使用率,内存/垃圾回收,TPS,和JVM参数。</p>\n<h3>支持模块</h3>\n<ul>\n<li>JDK 6+</li>\n<li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li>\n<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>\n<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>\n<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>\n<li>ActiveMQ, RabbitMQ</li>\n<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>\n<li>Arcus, Memcached, Redis, CASSANDRA</li>\n<li>iBATIS, MyBatis</li>\n<li>DBCP, DBCP2, HIKARICP</li>\n<li>gson, Jackson, Json Lib</li>\n<li>log4j, Logback</li>\n<li>自定义模块</li>\n</ul>\n<h2>Pinpoint与Dubbo的结合</h2>\n<h3>启动Pinpoint</h3>\n<p>参考Pinpoint的<a href=\"http://naver.github.io/pinpoint/quickstart.html\">Quick start</a>搭建环境(不需要启动TestApp)</p>\n<h3>准备Dubbo示例程序</h3>\n<h4>创建API包</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span>\n         <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n         <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<p>新建API接口:</p>\n<pre><code>package com.example.demoapi;\n\npublic interface HelloService {\n    String sayHello(String name);\n}\n</code></pre>\n<h4>实现 Dubbo 服务提供方</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li>实现 <code>HelloService</code> 接口:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider.provider;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n\n<span class=\"hljs-meta\">@Service</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n        application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n        protocol = <span class=\"hljs-string\">\"${dubbo.protocol.id}\"</span>,\n        registry = <span class=\"hljs-string\">\"${dubbo.registry.id}\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        i++;\n        <span class=\"hljs-keyword\">if</span> (i % <span class=\"hljs-number\">3</span> == <span class=\"hljs-number\">0</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"ex\"</span>);\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\"!\"</span>;\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>编写 Spring Boot 引导程序:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoProviderApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li>配置 <code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">server.port</span> = <span class=\"hljs-string\">9090</span>\n<span class=\"hljs-meta\">management.port</span> = <span class=\"hljs-string\">9091</span>\n<span class=\"hljs-comment\">\n# Service version</span>\n<span class=\"hljs-meta\">demo.service.version</span> = <span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Base packages to scan Dubbo Components (e.g @Service , @Reference)</span>\n<span class=\"hljs-meta\">dubbo.scan.basePackages</span>  = <span class=\"hljs-string\">com.example.demoprovider</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span> = <span class=\"hljs-string\">12345</span>\n<span class=\"hljs-comment\">\n## RegistryConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.registry.id</span> = <span class=\"hljs-string\">my-registry</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span> = <span class=\"hljs-string\">N/A</span>\n</code></pre>\n<h4>实现 Dubbo 服务消费方</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classifier</span>&gt;</span>exec<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">classifier</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li>通过 <code>@Reference</code> 注入 <code>HelloService</code></li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer.controller;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Reference;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestMapping;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RestController;\n\n<span class=\"hljs-meta\">@RestController</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerController</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n            application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n            url = <span class=\"hljs-string\">\"dubbo://&lt;注意,这里填写具体IP&gt;:12345\"</span>)\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-meta\">@RequestMapping</span>(<span class=\"hljs-string\">\"/sayHello\"</span>)\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(@RequestParam String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> helloService.sayHello(name);\n    }\n}\n</code></pre>\n<blockquote>\n<p>直连提供者调用需要填写具体IP地址,如果写localhost也可以,但是会被Pinpoint额外识别为一个未知服务</p>\n</blockquote>\n<ol start=\"2\">\n<li>编写 Spring Boot 引导程序(Web 应用):</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoConsumerApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li>配置 <code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">server.port</span>=<span class=\"hljs-string\">8080</span>\n<span class=\"hljs-meta\">management.port</span>=<span class=\"hljs-string\">8081</span>\n<span class=\"hljs-comment\">\n# Service Version</span>\n<span class=\"hljs-meta\">demo.service.version</span>=<span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">12345</span>\n</code></pre>\n<h3>使用Pinpoint-agent启动服务提供方和服务消费方</h3>\n<h4>启动服务提供方</h4>\n<ol>\n<li>编译打包</li>\n</ol>\n<pre><code>mvn clean package\n</code></pre>\n<ol start=\"2\">\n<li>附加参数启动服务提供方</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar\n</code></pre>\n<ol start=\"3\">\n<li>附加参数启动服务消费方</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-consumer -Dpinpoint.applicationName=DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar\n</code></pre>\n<ol start=\"4\">\n<li>访问消费方地址模拟用户请求</li>\n</ol>\n<p><code>http://localhost:8080/sayHello?name=ABC</code></p>\n<h2>使用Pinpoint快速定位问题</h2>\n<h3>首页</h3>\n<p><img src=\"../../img/blog/pinpoint-home.png\" alt=\"/admin-guide/images/pinpoint-home.png\"></p>\n<blockquote>\n<p>这里的用户请求是请求DubboProvider数量的双倍,原因是记录了favicon.ico图标请求导致的</p>\n</blockquote>\n<h3>调用树</h3>\n<p><img src=\"../../img/blog/pinpoint-calltree.png\" alt=\"/admin-guide/images/pinpoint-calltree.png\"></p>\n<h3>深入跟踪</h3>\n<p><img src=\"../../img/blog/pinpoint-mixedview.png\" alt=\"/admin-guide/images/pinpoint-mixedview.png\"></p>\n<h3>其他</h3>\n<p>示例简单的模拟了Dubbo的提供和调用,并没有进行数据库等其他中间件的应用,详细使用请参照Pinpoint文档。</p>\n",
-  "title": "使用Pinpoint做分布式跟踪",
-  "keywords": "Dubbo, Pinpoint, tracing",
-  "description": "本文介绍了利用Pinpoint对Dubbo分布式应用进行调用链跟踪与性能监控。"
+  "link": "/zh-cn/blog/pinpoint.html",
+  "meta": {
+    "title": "使用Pinpoint做分布式跟踪",
+    "keywords": "Dubbo, Pinpoint, tracing",
+    "description": "本文介绍了利用Pinpoint对Dubbo分布式应用进行调用链跟踪与性能监控。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/prepare-an-apache-release.json b/zh-cn/blog/prepare-an-apache-release.json
index a87a62bc..1dee5891 100644
--- a/zh-cn/blog/prepare-an-apache-release.json
+++ b/zh-cn/blog/prepare-an-apache-release.json
@@ -1,6 +1,9 @@
 {
   "filename": "prepare-an-apache-release.md",
   "__html": "<h1>如何准备Apache Release</h1>\n<h2>理解Apache发布的内容和流程</h2>\n<p>总的来说,Source Release是Apache关注的重点,也是发布的必须内容;而Binary Release是可选项,Dubbo可以选择是否发布二进制包到Apache仓库或者发布到Maven中央仓库。</p>\n<p>请参考以下链接,找到更多关于ASF的发布指南:</p>\n<ul>\n<li><a href=\"http://www.apache.org/dev/release-publishing\">Apache Release Guide</a></li>\n<li><a href=\"http://www.apache.org/dev/release.html\">Apache Release Policy</a></li>\n<li><a href=\"http://www.apache.org/dev/publishing-maven-artifacts.html\">Maven Release Info</a></li>\n</ul>\n<h2>本地构建环境准备</h2>\n<p>主要包括签名工具、Maven仓库认证相关准备</p>\n<ol>\n<li>\n<p>安装GPG,参见 <a href=\"https://www.gnupg.org/download/index.html\">https://www.gnupg.org/download/index.html</a></p>\n<ul>\n<li>如Mac OS</li>\n</ul>\n<pre><code class=\"language-sh\">$ brew install gpg\n$ gpg --version <span class=\"hljs-comment\">#检查版本,应该为2.x</span>\n</code></pre>\n</li>\n<li>\n<p>用gpg生成key</p>\n<ul>\n<li>根据提示,生成key</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> gpg --full-gen-key</span>\ngpg (GnuPG) 2.0.12; Copyright (C) 2009 Free Software Foundation, Inc.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nPlease select what kind of key you want:\n  (1) RSA and RSA (default)\n  (2) DSA and Elgamal\n  (3) DSA (sign only)\n  (4) RSA (sign only)\nYour selection? 1\nRSA keys may be between 1024 and 4096 bits long.\nWhat keysize do you want? (2048) 4096\nRequested keysize is 4096 bits\nPlease specify how long the key should be valid.\n        0 = key does not expire\n     &lt;n&gt;  = key expires in n days\n     &lt;n&gt;w = key expires in n weeks\n     &lt;n&gt;m = key expires in n months\n     &lt;n&gt;y = key expires in n years\nKey is valid for? (0) \nKey does not expire at all\nIs this correct? (y/N) y\n\nGnuPG needs to construct a user ID to identify your key.\n\nReal name: Robert Burrell Donkin\nEmail address: rdonkin@apache.org\nComment: CODE SIGNING KEY\nYou selected this USER-ID:\n   \"Robert Burrell Donkin (CODE SIGNING KEY) &lt;rdonkin@apache.org&gt;\"\n\nChange (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O\nYou need a Passphrase to protect your secret key. # 填入密码,以后打包过程中会经常用到\n</code></pre>\n<ul>\n<li>查看key id</li>\n</ul>\n<pre><code class=\"language-sh\">$ gpg --list-keys\npub   rsa4096/28681CB1 2018-04-26 <span class=\"hljs-comment\"># 28681CB1就是key id</span>\nuid       [ultimate] liujun (apache-dubbo) &lt;liujun@apache.org&gt;\nsub   rsa4096/D3D6984B 2018-04-26\n\n<span class=\"hljs-comment\"># 通过key id发送public key到keyserver</span>\n$ gpg --keyserver pgpkeys.mit.edu --send-key 28681CB1\n<span class=\"hljs-comment\"># 其中,pgpkeys.mit.edu为随意挑选的keyserver,keyserver列表为:https://sks-keyservers.net/status/,因为相互之间是自动同步的,选任意一个都可以。</span>\n</code></pre>\n<ul>\n<li>如果有多个public key,设置默认key</li>\n</ul>\n<p>~/.gnupg/gpg.conf</p>\n<pre><code class=\"language-proper\"># If you have more than 1 secret key in your keyring, you may want to\n# uncomment the following option and set your preferred keyid.\n\ndefault-key 28681CB1\n</code></pre>\n<p>PS: 最新版本经过实测,本地没有gpg.conf这个文件,因此如果在执行过程中遇到签名失败,可以参考这个文章:<a href=\"https://blog.csdn.net/wenbo20182/article/details/72850810\">https://blog.csdn.net/wenbo20182/article/details/72850810</a> 或 <a href=\"https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors\">https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors</a></p>\n</li>\n<li>\n<p>设置Apache中央仓库</p>\n<ul>\n<li>Dubbo项目的父pom为apache pom(2.6.x发布版本不需要此操作)</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>apache<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>19<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n</code></pre>\n<ul>\n<li>\n<p>添加以下内容到.m2/settings.xml</p>\n<p>所有密码请使用<a href=\"http://maven.apache.org/guides/mini/guide-encryption.html\">maven-encryption-plugin</a>加密后再填入</p>\n</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">settings</span>&gt;</span>\n...\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servers</span>&gt;</span>\n   <span class=\"hljs-comment\">&lt;!-- To publish a snapshot of some part of Maven --&gt;</span>\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>apache.snapshots.https<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">username</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP USERNAME --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">username</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">password</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">password</span>&gt;</span>\n   <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">server</span>&gt;</span>\n   <span class=\"hljs-comment\">&lt;!-- To stage a release of some part of Maven --&gt;</span>\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>apache.releases.https<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">username</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP USERNAME --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">username</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">password</span>&gt;</span> <span class=\"hljs-comment\">&lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&gt;</span> <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">password</span>&gt;</span>\n   <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">server</span>&gt;</span>\n  ...\n     <span class=\"hljs-comment\">&lt;!-- gpg passphrase used when generate key --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>gpg.passphrase<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n     <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">passphrase</span>&gt;</span><span class=\"hljs-comment\">&lt;!-- yourKeyPassword --&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">passphrase</span>&gt;</span>\n   <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">server</span>&gt;</span>\n <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servers</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">settings</span>&gt;</span>\n</code></pre>\n<p>​</p>\n</li>\n</ol>\n<h2>打包&amp;上传</h2>\n<ol>\n<li>\n<p>从主干分支拉取新分支作为发布分支,如现在要发布{release_version}版本,则从2.6.x拉出新分支{release_version}-release,此后{release_version} Release Candidates涉及的修改及打标签等都在{release_version}-release分支进行,最终发布完成后合入主干分支。</p>\n</li>\n<li>\n<p>首先,在${release_version}-release分支验证maven组件打包、source源码打包、签名等是否都正常工作(2.6.x记得要使用1.7或以下版本JDK进行编译打包)</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn clean install -Prelease</span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn deploy</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 将snapshot包推送到maven中央仓库,处于staging状态,可选</span>\n</code></pre>\n</li>\n<li>\n<p>用maven-release-plugin发布</p>\n<ul>\n<li>先用dryRun验证是否ok</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn release:prepare -Prelease -Darguments=<span class=\"hljs-string\">\"-DskipTests\"</span> -DautoVersionSubmodules=<span class=\"hljs-literal\">true</span> -Dusername=YOUR GITHUB ID -DdryRun=<span class=\"hljs-literal\">true</span></span>\n</code></pre>\n<ul>\n<li>验证通过后,执行release:prepare</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn release:clean</span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn release:prepare -Prelease -Darguments=<span class=\"hljs-string\">\"-DskipTests\"</span> -DautoVersionSubmodules=<span class=\"hljs-literal\">true</span> -Dusername=YOUR GITHUB ID</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 执行完成后:1.生成source.zip包; 2.打出tag,并推送到github仓库; 3.分支版本自动升级为<span class=\"hljs-variable\">${release_version}</span>-SNAPSHOT,并将修改推送到github仓库</span>\n</code></pre>\n<ul>\n<li>执行release:perform,做正式发布</li>\n</ul>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> mvn -Prelease release:perform -Darguments=<span class=\"hljs-string\">\"-DskipTests\"</span> -DautoVersionSubmodules=<span class=\"hljs-literal\">true</span> -Dusername=YOUR GITHUB ID</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 所有artifacts发布到配置的远程maven中央仓库,处于staging状态,这里一定要去仓库检查一下是否完整发布上去,尤其是dubbo-parent模块</span>\n</code></pre>\n<p>PS: 执行release插件时,需要输入github的密码,这里不是输入web页面的登录密码,而是一个token,详见这里:<a href=\"https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/\">https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/</a></p>\n</li>\n</ol>\n<h2>准备Apache发布</h2>\n<ol>\n<li>\n<p>准备svn本机环境(Apache使用svn托管项目的发布内容)</p>\n</li>\n<li>\n<p>将dubbo checkout到本地目录</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> svn checkout https://dist.apache.org/repos/dist/dev/incubator/dubbo</span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 假定本地目录为 ~/apache/incubator/dubbo</span>\n</code></pre>\n</li>\n<li>\n<p>当前发布版本为${release_version},新建目录</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> <span class=\"hljs-built_in\">cd</span> ~/apache/incubator/dubbo <span class=\"hljs-comment\"># dubbo svn根目录</span></span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> mkdir <span class=\"hljs-variable\">${release_version}</span></span>\n</code></pre>\n</li>\n<li>\n<p>添加public key到<a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS\">KEYS</a>文件并提交到SVN仓库(第一次做发布的人需要做这个操作,具体操作参考KEYS文件里的说明)。KEYS主要是让参与投票的人在本地导入,用来校验sign的正确性</p>\n</li>\n<li>\n<p>拷贝distribution/target下的source相关的包到svn本地仓库dubbo/${release_version}</p>\n</li>\n<li>\n<p>生成sha512签名</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> shasum -a 512 apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-<span class=\"hljs-built_in\">source</span>-release.zip &gt;&gt; apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-<span class=\"hljs-built_in\">source</span>-release.zip.sha512</span>\n</code></pre>\n</li>\n<li>\n<p>如果有binary release要同时发布</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">#</span><span class=\"bash\"> distribution/target目录下,拷贝bin-release.zip以及bin-release.zip.asc到svn本地仓库dubbo/<span class=\"hljs-variable\">${release_version}</span></span>\n<span class=\"hljs-meta\">#</span><span class=\"bash\"> 参考第6步,生成sha512签名</span>\n</code></pre>\n</li>\n<li>\n<p>提交到Apache svn</p>\n<pre><code class=\"language-shell\"><span class=\"hljs-meta\">$</span><span class=\"bash\"> svn status</span>\n<span class=\"hljs-meta\">$</span><span class=\"bash\"> svn commit -m <span class=\"hljs-string\">'prepare for ${release_version} RC1'</span></span>\n</code></pre>\n</li>\n</ol>\n<h2>验证Release Candidates</h2>\n<p>首先,从以下地址下载要发布的Release Candidate到本地环境:\n<a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo/$%7Brelease_version%7D/\">https://dist.apache.org/repos/dist/dev/incubator/dubbo/${release_version}/</a></p>\n<p>然后,开始验证环节,验证包含但不限于以下内容和形式</p>\n<ol>\n<li>Check signatures and hashes are good</li>\n</ol>\n<ul>\n<li>sha512</li>\n</ul>\n<pre><code class=\"language-sh\">$ shasum -c apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-<span class=\"hljs-built_in\">source</span>-release.zip.sha512\n$ shasum -c apache-dubbo-incubating-<span class=\"hljs-variable\">${release_version}</span>-bin-release.zip.sha512\n</code></pre>\n<ul>\n<li>gpg\n<ul>\n<li>If it's your first time verify a release candidte, you should import public keys first.</li>\n</ul>\n<pre><code class=\"language-sh\">$ curl https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS &gt;&gt; KEYS <span class=\"hljs-comment\"># download public keys to local directory</span>\n$ gpg --import KEYS <span class=\"hljs-comment\"># import keys</span>\n$ gpg —edit-key liujun\n  &gt; trust <span class=\"hljs-comment\"># 输入trust子命令</span>\n</code></pre>\n<ul>\n<li>Now, you can verify signature with command</li>\n</ul>\n<pre><code>gpg --verify apache-dubbo-incubating-2.6.3-source-release.zip.asc apache-dubbo-incubating-2.6.3-source-release.zip\n</code></pre>\n</li>\n</ul>\n<ol start=\"2\">\n<li>Unzip apache-dubbo-incubating-${release_version}-source-release.zip to the default directory and check the following:</li>\n</ol>\n<ul>\n<li>\n<p>Directory with 'incubating' in name\n<code>apache-dubbo-incubating-${release_version}-source-release</code></p>\n</li>\n<li>\n<p>DISCLAIMER exists</p>\n</li>\n<li>\n<p>LICENSE and NOTICE exists and contents are good</p>\n</li>\n<li>\n<p>All files and no binary files exist</p>\n</li>\n<li>\n<p>All files has standard ASF License header</p>\n</li>\n<li>\n<p>Can compile from source</p>\n</li>\n<li>\n<p>All unit tests can pass</p>\n<pre><code class=\"language-sh\">mvn clean <span class=\"hljs-built_in\">test</span> <span class=\"hljs-comment\"># This will run all unit tests</span>\n<span class=\"hljs-comment\"># you can also open rat and style plugin to check if every file meets requirements.</span>\nmvn clean <span class=\"hljs-built_in\">test</span> -Drat.skip=<span class=\"hljs-literal\">false</span> -Dcheckstyle.skip=<span class=\"hljs-literal\">false</span>\n</code></pre>\n</li>\n<li>\n<p>Release candidates match with corresponding tags, you can find tag link and hash in vote email.</p>\n<ul>\n<li>check the version number in pom.xml are the same</li>\n<li>check there are no extra files or directories in the source package, for example, no empty directories or useless log files.<br>\n<code>diff -r a rc_dir tag_dir</code></li>\n<li>check the top n tag commits, dive into the related files and check if the source package has the same changes</li>\n</ul>\n</li>\n</ul>\n<ol start=\"3\">\n<li>Unzip apache-dubbo-incubating-${release_version}-bin-release.zip and check:</li>\n</ol>\n<ul>\n<li>Check signatures are good</li>\n<li>'incubating' in name</li>\n<li>LICENSE and NOTICE exists and contents are good</li>\n</ul>\n<h2>进入投票</h2>\n<p>投票分两个阶段:</p>\n<ol>\n<li>Dubbo社区投票,发起投票邮件到dev@dubbo.apache.org。在社区开发者Review,并统计到3个同意发版的binding票后,即可进入下一阶段的投票。</li>\n<li>Apache社区投票,发起投票邮件到general@apache.org。在Apache PMC Review,并统计到3个统一发版的binding票后,即可进行正式发布。</li>\n</ol>\n<p>邮件模板:</p>\n<pre><code class=\"language-tex\">Hello Dubbo Community,\n\nThis is a call for vote to release Apache Dubbo (Incubating) version 2.6.2.\n\nThe release candidates:\nhttps://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/\n\nGit tag for the release:\nhttps://github.com/apache/incubator-dubbo/tree/dubbo-2.6.2\n\nHash for the release tag:\nafab04c53edab38d52275d2a198ea1aff7a4f41e\n\nRelease Notes:\nhttps://github.com/apache/incubator-dubbo/releases/tag/untagged-4775c0a22c60fca55118\n\nThe artifacts have been signed with Key : 28681CB1, which can be found in the keys file:\nhttps://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS\n\nThe vote will be open for at least 72 hours or until necessary number of votes are reached.\n\nPlease vote accordingly:\n\n[ ] +1 approve \n[ ] +0 no opinion \n[ ] -1 disapprove with the reason\n\nThanks,\nThe Apache Dubbo (Incubating) Team\n</code></pre>\n<h2>正式发布</h2>\n<ol>\n<li>提交 <a href=\"https://dist.apache.org/repos/dist/dev/incubator/dubbo\">https://dist.apache.org/repos/dist/dev/incubator/dubbo</a> 目录下的发布包到 <a href=\"https://dist.apache.org/repos/dist/release/incubator/dubbo/\">https://dist.apache.org/repos/dist/release/incubator/dubbo/</a> ,完成正式发布(KEYS有更新的,也需要同步发布)。</li>\n<li>发邮件到 <a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a> 和 <a href=\"mailto:general@apache.org\">general@apache.org</a>,通知社区发布完成。</li>\n<li>合并${release-version}-release分支到对应的主干分支。</li>\n<li>在Github上发布<a href=\"https://github.com/apache/incubator-dubbo/releases\">release notes</a>。</li>\n<li>更新<a href=\"https://github.com/apache/incubator-dubbo#maven-dependency\">Github</a>上的推荐依赖到最新版本。</li>\n<li>在<a href=\"http://dubbo.apache.org/\">官网</a>发布公告,宣布版本发布成功。</li>\n</ol>\n<h2>完成Maven Convenient Binary发布(可选)</h2>\n<p><strong><a href=\"http://apache.repository.org\">apache.repository.org</a> nexus仓库的权限已经申请,参见<a href=\"https://issues.apache.org/jira/browse/INFRA-16451\">jira</a>。</strong></p>\n<p>之前发布到maven仓库的artifacts都处于staging状态,用Apache id登录 <a href=\"http://apache.repository.org\">apache.repository.org</a> ,发布即可。</p>\n",
-  "title": "如何准备Apache Release",
-  "keywords": "Dubbo, Apache, Release"
+  "link": "/zh-cn/blog/prepare-an-apache-release.html",
+  "meta": {
+    "title": "如何准备Apache Release",
+    "keywords": "Dubbo, Apache, Release"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/sentinel-introduction-for-dubbo.json b/zh-cn/blog/sentinel-introduction-for-dubbo.json
index c90532b0..406bbfa5 100644
--- a/zh-cn/blog/sentinel-introduction-for-dubbo.json
+++ b/zh-cn/blog/sentinel-introduction-for-dubbo.json
@@ -1,7 +1,10 @@
 {
   "filename": "sentinel-introduction-for-dubbo.md",
   "__html": "<h1>Sentinel 为 Dubbo 服务保驾护航</h1>\n<p>在复杂的生产环境下可能部署着成千上万的 Dubbo 服务实例,流量持续不断地进入,服务之间进行相互调用。但是分布式系统中可能会因流量激增、系统负载过高、网络延迟等一系列问题,导致某些服务不可用,如果不进行相应的控制可能导致级联故障,影响服务的可用性,因此如何对流量进行合理的控制,成为保障服务稳定性的关键。</p>\n<p><a href=\"https://github.com/alibaba/Sentinel\">Sentinel</a> 是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从<strong>流量控制</strong>、<strong>熔断降级</strong>、<strong>系统负载保护</strong>等多个维度来帮助用户保护服务的稳定性。本文将基于 Dubbo,看看 Sentinel 是如何进行流量控制的,并且提供 Dubbo 整合 Sentinel 的最佳实践。</p>\n<h2>快速接入 Sentinel</h2>\n<p>Sentinel 意为<strong>哨兵</strong>,这个命名形象的诠释了 Sentinel 在分布式系统中的工作角色和重要性。以 Sentinel 在 Dubbo 生态系统中的作用为例,Dubbo 的核心模块包括注册中心、服务提供方、服务消费方(服务调用方)和监控四个模块。Sentinel 通过对服务提供方和服务消费方的限流来进一步提升服务的可用性。接下来我们看看 Sentinel 对服务提供方和服务消费方限流的技术实现方式。</p>\n<p><img src=\"http://dubbo.incubator.apache.org/img/architecture.png\" alt=\"Dubbo Arch\"></p>\n<p>Sentinel 提供了与 Dubbo 适配的模块 – <a href=\"https://github.com/dubbo/dubbo-sentinel-support\">Sentinel Dubbo Adapter</a>,包括针对服务提供方的过滤器和服务消费方的过滤器(Filter)。使用时我们只需引入以下模块(以 Maven 为例):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.csp<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>sentinel-dubbo-adapter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>x.y.z<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<p>引入此依赖后,Dubbo 的服务接口和方法(包括调用端和服务端)就会成为 Sentinel 中的资源,在配置了规则后就可以自动享受到 Sentinel 的防护能力。同时提供了灵活的配置选项,例如若不希望开启 Sentinel Dubbo Adapter 中的某个 Filter,可以手动关闭对应的 Filter。</p>\n<p>接入 Sentinel Dubbo Adapter 后,即使未配置规则,Sentinel 也会对相应的 Dubbo 服务的调用信息进行统计。那么我们怎么知道 Sentinel 接入成功了呢?这时候就要请出一大利器 —— Sentinel 控制台了。</p>\n<h2>限流必备 - 监控管理</h2>\n<p>流量具有很强的实时性,之所以需要限流,是因为我们无法对流量的到来作出精确的预判,不然的话我们完全可以通过弹性的计算资源来处理,所以这时候为了保证限流的准确性,限流框架的监控功能就非常重要了。</p>\n<p>Sentinel 的控制台(Dashboard)是流量控制、熔断降级规则统一配置和管理的入口,同时它为用户提供了多个维度的监控功能。在 Sentinel 控制台上,我们可以配置规则并实时查看流量控制效果。</p>\n<p>接入 Sentinel 控制台的步骤如下(<strong>缺一不可</strong>):</p>\n<ol>\n<li>按照 <a href=\"https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0\">Sentinel 控制台文档</a> 启动控制台</li>\n<li>应用引入 <code>sentinel-transport-simple-http</code> 依赖,以便控制台可以拉取对应应用的相关信息</li>\n<li>给应用添加相关的启动参数,启动应用。需要配置的参数有:\n<ul>\n<li><code>-Dcsp.sentinel.api.port</code>:客户端的 port,用于上报相关信息(默认为 8719)</li>\n<li><code>-Dcsp.sentinel.dashboard.server</code>:控制台的地址</li>\n<li><code>-Dproject.name</code>:应用名称,会在控制台中显示</li>\n</ul>\n</li>\n</ol>\n<p>注意某些环境下本地运行 Dubbo 服务还需要加上 <code>-Djava.net.preferIPv4Stack=true</code> 参数。比如中 Service Provider 的启动参数可以配成:</p>\n<pre><code class=\"language-bash\">-Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span> -Dcsp.sentinel.api.port=8720 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=dubbo-provider-demo\n</code></pre>\n<p>这样在启动应用后就能在控制台找到对应的应用了。以下是常用功能:</p>\n<ul>\n<li><strong>单台设备监控</strong>:当在机器列表中看到您的机器,就代表着已经成功接入控制台,可以查看单台设备的设备名称、IP地址、端口号、健康状态和心跳时间等信息。</li>\n</ul>\n<p><img src=\"https://github.com/alibaba/Sentinel/wiki/image/machinediscover.png\" alt=\"Discovery\"></p>\n<ul>\n<li><strong>链路监控</strong>:簇点链路实时的去拉取指定客户端资源的运行情况,它提供了两种展示模式,一种用书状结构展示资源的调用链路;另外一种则不区分调用链路展示资源的运行情况。通过链路监控,可以查看到每个资源的流控和降级的历史状态。</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center\">树状链路</th>\n<th style=\"text-align:left\">平铺链路</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:center\"><img src=\"https://github.com/alibaba/Sentinel/wiki/image/resourceTree.png\" alt=\"resourceTree\"></td>\n<td style=\"text-align:left\"><img src=\"https://github.com/alibaba/Sentinel/wiki/image/sentine_dashboard.gif\" alt=\"cluster\"></td>\n</tr>\n</tbody>\n</table>\n<ul>\n<li><strong>聚合监控</strong>:同一个服务下的所有机器的簇点信息会被汇总,实现实时监控,精确度达秒级。</li>\n</ul>\n<p><img src=\"../../img/blog/sentinel-dashboard-metrics.png\" alt=\"秒级实时监控\"></p>\n<ul>\n<li><strong>规则配置</strong>:可以查看已有的限流、降级和系统保护规则,并实时地进行配置。</li>\n</ul>\n<p><img src=\"../../img/blog/sentinel-dashboard-view-rules.png\" alt=\"规则配置\"></p>\n<h2>Sentinel 基于 Dubbo 的最佳实践</h2>\n<blockquote>\n<p>具体 Demo 代码请见 <a href=\"https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-dubbo\">sentinel-demo-dubbo</a>。</p>\n</blockquote>\n<h3>Service Provider</h3>\n<blockquote>\n<p>对服务提供方的流量控制可分为<strong>服务提供方的自我保护能力</strong>和<strong>服务提供方对服务消费方的请求分配能力</strong>两个维度。</p>\n</blockquote>\n<p>Service Provider 用于向外界提供服务,处理各个消费者的调用请求。为了保护 Provider 不被激增的流量拖垮影响稳定性,可以给 Provider 配置 <strong>QPS 模式</strong>的限流,这样当每秒的请求量超过设定的阈值时会自动拒绝多的请求。限流粒度可以是 <em>服务接口</em> 和 <em>服务方法</em> 两种粒度。若希望整个服务接口的 QPS 不超过一定数值,则可以为对应服务接口资源(resourceName 为<strong>接口全限定名</strong>)配置 QPS 阈值;若希望服务的某个方法的 QPS 不超过一定数值,则可以为对应服务方法资源(resourceName 为<strong>接口全限定名:方法签名</strong>)配置 QPS 阈值。有关配置详情请参考 <a href=\"https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6\">流量控制 | Sentinel</a>。</p>\n<p>我们看一下这种模式的限流产生的效果。假设我们已经定义了某个服务接口 <code>com.alibaba.csp.sentinel.demo.dubbo.FooService</code>,其中有一个方法 <code>sayHello(java.lang.String)</code>,Provider 端该方法设定 QPS 阈值为 10。在 Consumer 端在 1s 之内连续发起 15 次调用,可以通过日志文件看到 Provider 端被限流。拦截日志统一记录在 <code>~/logs/csp/sentinel-block.log</code> 中:</p>\n<pre><code>2018-07-24 17:13:43|1|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String),FlowException,default,|5,0\n</code></pre>\n<p>在 Provider 对应的 metrics 日志中也有记录:</p>\n<pre><code>1532423623000|2018-07-24 17:13:43|com.alibaba.csp.sentinel.demo.dubbo.FooService|15|0|15|0|3\n1532423623000|2018-07-24 17:13:43|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)|10|5|10|0|0\n</code></pre>\n<p>根据<strong>调用方</strong>的需求来分配服务提供方的处理能力也是常见的限流方式。比如有两个服务 A 和 B 都向 Service Provider 发起调用请求,我们希望只对来自服务 B 的请求进行限流,则可以设置限流规则的 <code>limitApp</code> 为服务 B 的名称。Sentinel Dubbo Adapter 会自动解析 Dubbo 消费者(调用方)的 application name 作为调用方名称(<code>origin</code>),在进行资源保护的时候都会带上调用方名称。若限流规则未配置调用方(<code>default</code>),则该限流规则对所有调用方生效。若限流规则配置了调用方则限流规则将仅对指定调用方生效。</p>\n<blockquote>\n<p>注:Dubbo 默认通信不携带对端 application name 信息,因此需要开发者在调用端手动将 application name 置入 attachment 中,provider 端进行相应的解析。Sentinel Dubbo Adapter 实现了一个 Filter 用于自动从 consumer 端向 provider 端透传 application name。若调用端未引入 Sentinel Dubbo Adapter,又希望根据调用端限流,可以在调用端手动将 application name 置入 attachment 中,key 为 <code>dubboApplication</code>。</p>\n</blockquote>\n<p>在限流日志中会也会记录调用方的名称,如下面的日志中的 <code>demo-consumer</code> 即为调用方名称:</p>\n<pre><code>2018-07-25 16:26:48|1|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String),FlowException,default,demo-consumer|5,0\n</code></pre>\n<h3>Service Consumer</h3>\n<blockquote>\n<p>对服务提供方的流量控制可分为<strong>控制并发线程数</strong>和<strong>服务降级</strong>两个维度。</p>\n</blockquote>\n<h4>并发线程数限流</h4>\n<p>Service Consumer 作为客户端去调用远程服务。每一个服务都可能会依赖几个下游服务,若某个服务 A 依赖的下游服务 B 出现了不稳定的情况,服务 A 请求 服务 B 的响应时间变长,从而服务 A 调用服务 B 的线程就会产生堆积,最终可能耗尽服务 A 的线程数。我们通过用并发线程数来控制对下游服务 B 的访问,来保证下游服务不可靠的时候,不会拖垮服务自身。基于这种场景,推荐给 Consumer 配置<strong>线程数模式</strong>的限流,来保证自身不被不稳定服务所影响。采用基于线程数的限流模式后,我们不需要再显式地去进行线程池隔离,Sentinel 会控制资源的线程数,超出的请求直接拒绝,直到堆积的线程处理完成,可以达到<strong>信号量隔离</strong>的效果。</p>\n<p>我们看一下这种模式的效果。假设当前服务 A 依赖两个远程服务方法 <code>sayHello(java.lang.String)</code> 和 <code>doAnother()</code>。前者远程调用的响应时间 为 1s-1.5s 之间,后者 RT 非常小(30 ms 左右)。服务 A 端设两个远程方法 thread count 为 5。然后每隔 50 ms 左右向线程池投入两个任务,作为消费者分别远程调用对应方法,持续 10 次。可以看到 <code>sayHello</code> 方法被限流 5 次,因为后面调用的时候前面的远程调用还未返回(RT 高);而 <code>doAnother()</code> 调用则不受影响。线程数目超出时快速失败能够有效地防止自己被慢调用所影响。</p>\n<h4>服务降级</h4>\n<p>当服务依赖于多个下游服务,而某个下游服务调用非常慢时,会严重影响当前服务的调用。这里我们可以利用 Sentinel 熔断降级的功能,为调用端配置基于平均 RT 的<a href=\"https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7\">降级规则</a>。这样当调用链路中某个服务调用的平均 RT 升高,在一定的次数内超过配置的 RT 阈值,Sentinel 就会对此调用资源进行降级操作,接下来的调用都会立刻拒绝,直到过了一段设定的时间后才恢复,从而保护服务不被调用端短板所影响。同时可以配合 fallback 功能使用,在被降级的时候提供相应的处理逻辑。</p>\n<h3>Fallback</h3>\n<p>从 0.1.1 版本开始,Sentinel Dubbo Adapter 还支持配置全局的 fallback 函数,可以在 Dubbo 服务被限流/降级/负载保护的时候进行相应的 fallback 处理。用户只需要实现自定义的 <a href=\"https://github.com/alibaba/Sentinel/blob/master/sentinel-adapter/sentinel-dubbo-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/dubbo/fallback/DubboFallback.java\"><code>DubboFallback</code></a> 接口,并通过 <code>DubboFallbackRegistry</code> 注册即可。默认情况会直接将 <code>BlockException</code> 包装后抛出。同时,我们还可以配合 <a href=\"http://dubbo.apache.org/#!/docs/user/demos/local-mock.md?lang=zh-cn\">Dubbo 的 fallback 机制</a> 来为降级的服务提供替代的实现。</p>\n<h2>Sentinel 与 Hystrix 的比较</h2>\n<p>目前业界常用的熔断降级/隔离的库是 Netflix 的 <a href=\"https://github.com/Netflix/Hystrix\">Hystrix</a>,那么 Sentinel 与 Hystrix 有什么异同呢?Hystrix 的关注点在于以 <em>隔离</em> 和 <em>熔断</em> 为主的容错机制,而 Sentinel 的侧重点在于多样化的流量控制、熔断降级、系统负载保护、实时监控和控制台,可以看到解决的问题还是有比较大的不同的。</p>\n<p>Hystrix 采用命令模式封装资源调用逻辑,并且资源的定义与隔离规则是强依赖的,即在创建 HystrixCommand 的时候就要指定隔离规则(因其执行模型依赖于隔离模式)。Sentinel 的设计更为简单,不关注资源是如何执行的,资源的定义与规则的配置相分离。用户可以先定义好资源,然后在需要的时候配置规则即可。Sentinel 的原则非常简单:根据对应资源配置的规则来为资源执行相应的限流/降级/负载保护策略,若规则未配置则仅进行统计。从 0.1.1 版本开始,Sentinel 还引入了<a href=\"https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81\">注解支持</a>,可以更方便地定义资源。</p>\n<p>隔离是 Hystrix 的核心功能。Hystrix 通过线程池或信号量的方式来对依赖(即 Sentinel 中对应的资源)进行隔离,其中最常用的是资源隔离。Hystrix 线程池隔离的好处是比较彻底,但是不足之处在于要开很多线程池,在应用本身线程数目比较多的时候上下文切换的 overhead 会非常大;Hystrix 的信号量隔离模式可以限制调用的并发数而不显式创建线程,这样的方式比较轻量级,但缺点是无法对慢调用自动进行降级,只能等待客户端自己超时,因此仍然可能会出现级联阻塞的情况。Sentinel 可以通过并发线程数模式的流量控制来提供信号量隔离的功能。并且结合基于响应时间的熔断降级模式,可以在不稳定资源的平均响应时间比较高的时候自动降级,防止过多的慢调用占满并发数,影响整个系统。</p>\n<p>Hystrix 熔断降级功能采用熔断器模式,在某个服务失败比率高时自动进行熔断。Sentinel 的熔断降级功能更为通用,支持平均响应时间与失败比率两个指标。Sentinel 还提供各种调用链路关系和流量控制效果支持,同时还可以根据系统负载去实时地调整流量来保护系统,应用场景更为丰富。同时,Sentinel 还提供了实时的监控 API 和控制台,可以方便用户快速了解目前系统的状态,对服务的稳定性了如指掌。</p>\n<p>更详细的对比请参见 <a href=\"https://github.com/alibaba/Sentinel/wiki/Sentinel-%E4%B8%8E-Hystrix-%E7%9A%84%E5%AF%B9%E6%AF%94\">Sentinel 与 Hystrix 的对比</a>。</p>\n<h2>总结</h2>\n<p>以上介绍的只是 Sentinel 的一个最简单的场景 —— 限流。Sentinel 还可以处理更复杂的各种情况,比如超时熔断、冷启动、请求匀速等。可以参考 <a href=\"https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5\">Sentinel 文档</a>,更多的场景等待你去挖掘!</p>\n",
-  "title": "Sentinel 为 Dubbo 服务保驾护航",
-  "keywords": "Dubbo, Sentinel, 限流, 熔断",
-  "description": "本文主要介绍了面向分布式服务架构的轻量级流量控制组件 Sentinel 以及在 Dubbo 中整合使用 Sentinel 的最佳实践。"
+  "link": "/zh-cn/blog/sentinel-introduction-for-dubbo.html",
+  "meta": {
+    "title": "Sentinel 为 Dubbo 服务保驾护航",
+    "keywords": "Dubbo, Sentinel, 限流, 熔断",
+    "description": "本文主要介绍了面向分布式服务架构的轻量级流量控制组件 Sentinel 以及在 Dubbo 中整合使用 Sentinel 的最佳实践。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
index 9ab6871b..91adfd7d 100644
--- a/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
+++ b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
@@ -1,7 +1,10 @@
 {
   "filename": "spring-boot-dubbo-start-stop-analysis.md",
   "__html": "<h1>Spring Boot Dubbo应用启停源码分析</h1>\n<h2>背景介绍</h2>\n<p><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project\">Dubbo Spring Boot</a> 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发。同时也整合了 Spring Boot 特性:</p>\n<ul>\n<li><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">自动装配</a> (比如: 注解驱动, 自动装配等).</li>\n<li><a href=\"https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator\">Production-Ready</a> (比如: 安全, 健康检查, 外部化配置等).</li>\n</ul>\n<h2>DubboConsumer启动分析</h2>\n<p>你有没有想过一个问题?<code>incubator-dubbo-spring-boot-project</code>中的<code>DubboConsumerDemo</code>应用就一行代码,<code>main</code>方法执行完之后,为什么不会直接退出呢?</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>(scanBasePackages = <span class=\"hljs-string\">\"com.alibaba.boot.dubbo.demo.consumer.controller\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConsumerDemo</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        SpringApplication.run(DubboConsumerDemo.class,args);\n    }\n\n}\n</code></pre>\n<p>其实要回答这样一个问题,我们首先需要把这个问题进行一个抽象,即一个JVM进程,在什么情况下会退出?</p>\n<p>以Java 8为例,通过查阅JVM语言规范[1],在12.8章节中有清晰的描述:</p>\n<p>A program terminates all its activity and <em>exits</em> when one of two things happens:</p>\n<ul>\n<li>All the threads that are not daemon threads terminate.</li>\n<li>Some thread invokes the <code>exit</code> method of class <code>Runtime</code> or class <code>System</code>, and the <code>exit</code> operation is not forbidden by the security manager.</li>\n</ul>\n<p>也就是说,导致JVM的退出只有2种情况:</p>\n<ol>\n<li>所有的非daemon进程完全终止</li>\n<li>某个线程调用了<code>System.exit()</code>或<code>Runtime.exit()</code></li>\n</ol>\n<p>因此针对上面的情况,我们判断,一定是有某个非daemon线程没有退出导致。我们知道,通过jstack可以看到所有的线程信息,包括他们是否是daemon线程,可以通过jstack找出那些是非deamon的线程。</p>\n<pre><code class=\"language-sh\">➜  jstack 57785 | grep tid | grep -v <span class=\"hljs-string\">\"daemon\"</span>\n<span class=\"hljs-string\">\"container-0\"</span> <span class=\"hljs-comment\">#37 prio=5 os_prio=31 tid=0x00007fbe312f5800 nid=0x7103 waiting on condition  [0x0000700010144000]</span>\n<span class=\"hljs-string\">\"container-1\"</span> <span class=\"hljs-comment\">#49 prio=5 os_prio=31 tid=0x00007fbe3117f800 nid=0x7b03 waiting on condition  [0x0000700010859000]</span>\n<span class=\"hljs-string\">\"DestroyJavaVM\"</span> <span class=\"hljs-comment\">#83 prio=5 os_prio=31 tid=0x00007fbe30011000 nid=0x2703 waiting on condition  [0x0000000000000000]</span>\n<span class=\"hljs-string\">\"VM Thread\"</span> os_prio=31 tid=0x00007fbe3005e800 nid=0x3703 runnable\n<span class=\"hljs-string\">\"GC Thread#0\"</span> os_prio=31 tid=0x00007fbe30013800 nid=0x5403 runnable\n<span class=\"hljs-string\">\"GC Thread#1\"</span> os_prio=31 tid=0x00007fbe30021000 nid=0x5303 runnable\n<span class=\"hljs-string\">\"GC Thread#2\"</span> os_prio=31 tid=0x00007fbe30021800 nid=0x2d03 runnable\n<span class=\"hljs-string\">\"GC Thread#3\"</span> os_prio=31 tid=0x00007fbe30022000 nid=0x2f03 runnable\n<span class=\"hljs-string\">\"G1 Main Marker\"</span> os_prio=31 tid=0x00007fbe30040800 nid=0x5203 runnable\n<span class=\"hljs-string\">\"G1 Conc#0\"</span> os_prio=31 tid=0x00007fbe30041000 nid=0x4f03 runnable\n<span class=\"hljs-string\">\"G1 Refine#0\"</span> os_prio=31 tid=0x00007fbe31044800 nid=0x4e03 runnable\n<span class=\"hljs-string\">\"G1 Refine#1\"</span> os_prio=31 tid=0x00007fbe31045800 nid=0x4d03 runnable\n<span class=\"hljs-string\">\"G1 Refine#2\"</span> os_prio=31 tid=0x00007fbe31046000 nid=0x4c03 runnable\n<span class=\"hljs-string\">\"G1 Refine#3\"</span> os_prio=31 tid=0x00007fbe31047000 nid=0x4b03 runnable\n<span class=\"hljs-string\">\"G1 Young RemSet Sampling\"</span> os_prio=31 tid=0x00007fbe31047800 nid=0x3603 runnable\n<span class=\"hljs-string\">\"VM Periodic Task Thread\"</span> os_prio=31 tid=0x00007fbe31129000 nid=0x6703 waiting on condition\n\n</code></pre>\n<blockquote>\n<p>此处通过grep tid 找出所有的线程摘要,通过grep -v找出不包含daemon关键字的行</p>\n</blockquote>\n<p>通过上面的结果,我们发现了一些信息:</p>\n<ul>\n<li>有两个线程<code>container-0</code>, <code>container-1</code>非常可疑,他们是非daemon线程,处于wait状态</li>\n<li>有一些GC相关的线程,和VM打头的线程,也是非daemon线程,但他们很有可能是JVM自己的线程,在此暂时忽略。</li>\n</ul>\n<p>综上,我们可以推断,很可能是因为<code>container-0</code>和<code>container-1</code>导致JVM没有退出。现在我们通过源码,搜索一下到底是谁创建的这两个线程。</p>\n<p>通过对spring-boot的源码分析,我们在<code>org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer</code>的<code>startDaemonAwaitThread</code>找到了如下代码</p>\n<pre><code class=\"language-java\">\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">startDaemonAwaitThread</span><span class=\"hljs-params\">()</span> </span>{\n\t\tThread awaitThread = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-string\">\"container-\"</span> + (containerCounter.get())) {\n\n\t\t\t<span class=\"hljs-meta\">@Override</span>\n\t\t\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n\t\t\t\tTomcatEmbeddedServletContainer.<span class=\"hljs-keyword\">this</span>.tomcat.getServer().await();\n\t\t\t}\n\n\t\t};\n\t\tawaitThread.setContextClassLoader(getClass().getClassLoader());\n\t\tawaitThread.setDaemon(<span class=\"hljs-keyword\">false</span>);\n\t\tawaitThread.start();\n\t}\n</code></pre>\n<p>在这个方法加个断点,看下调用堆栈:</p>\n<pre><code>initialize:115, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\n&lt;init&gt;:84, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\ngetTomcatEmbeddedServletContainer:554, TomcatEmbeddedServletContainerFactory (org.springframework.boot.context.embedded.tomcat)\ngetEmbeddedServletContainer:179, TomcatEmbeddedServletContainerFactory (org.springframework.boot.context.embedded.tomcat)\ncreateEmbeddedServletContainer:164, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nonRefresh:134, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nrefresh:537, AbstractApplicationContext (org.springframework.context.support)\nrefresh:122, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nrefresh:693, SpringApplication (org.springframework.boot)\nrefreshContext:360, SpringApplication (org.springframework.boot)\nrun:303, SpringApplication (org.springframework.boot)\nrun:1118, SpringApplication (org.springframework.boot)\nrun:1107, SpringApplication (org.springframework.boot)\nmain:35, DubboConsumerDemo (com.alibaba.boot.dubbo.demo.consumer.bootstrap)\n</code></pre>\n<p>可以看到,spring-boot应用在启动的过程中,由于默认启动了Tomcat暴露HTTP服务,所以执行到了上述方法,而Tomcat启动的所有的线程,默认都是daemon线程,例如监听请求的Acceptor,工作线程池等等,如果这里不加控制的话,启动完成之后JVM也会退出。因此需要显式地启动一个线程,在某个条件下进行持续等待,从而避免线程退出。</p>\n<p>下面我们在深挖一下,在Tomcat的<code>this.tomcat.getServer().await()</code>这个方法中,线程是如何实现不退出的。这里为了阅读方便,去掉了不相关的代码。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">await</span><span class=\"hljs-params\">()</span> </span>{\n    \t<span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">if</span>( port==-<span class=\"hljs-number\">1</span> ) {\n            <span class=\"hljs-keyword\">try</span> {\n                awaitThread = Thread.currentThread();\n                <span class=\"hljs-keyword\">while</span>(!stopAwait) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        Thread.sleep( <span class=\"hljs-number\">10000</span> );\n                    } <span class=\"hljs-keyword\">catch</span>( InterruptedException ex ) {\n                        <span class=\"hljs-comment\">// continue and check the flag</span>\n                    }\n                }\n            } <span class=\"hljs-keyword\">finally</span> {\n                awaitThread = <span class=\"hljs-keyword\">null</span>;\n            }\n            <span class=\"hljs-keyword\">return</span>;\n        }\n\t\t<span class=\"hljs-comment\">// ...</span>\n    }\n</code></pre>\n<p>在await方法中,实际上当前线程在一个while循环中每10秒检查一次 <code>stopAwait</code>这个变量,它是一个<code>volatile</code>类型变量,用于确保被另一个线程修改后,当前线程能够立即看到这个变化。如果没有变化,就会一直处于while循环中。这就是该线程不退出的原因,也就是整个spring-boot应用不退出的原因。</p>\n<p>因为Springboot应用同时启动了8080和8081(management port)两个端口,实际是启动了两个Tomcat,因此会有两个线程<code>container-0</code>和<code>container-1</code>。</p>\n<p>接下来,我们再看看,这个Spring-boot应用又是如何退出的呢?</p>\n<h2>DubboConsumer退出分析</h2>\n<p>在前面的描述中提到,有一个线程持续的在检查<code>stopAwait</code>这个变量,那么我们自然想到,在Stop的时候,应该会有一个线程去修改<code>stopAwait</code>,打破这个while循环,那又是谁在修改这个变量呢?</p>\n<p>通过对源码分析,可以看到只有一个方法修改了<code>stopAwait</code>,即<code>org.apache.catalina.core.StandardServer#stopAwait</code>,我们在此处加个断点,看看是谁在调用。</p>\n<blockquote>\n<p>注意,当我们在Intellij IDEA的Debug模式,加上一个断点后,需要在命令行下使用<code>kill -s INT $PID</code>或者<code>kill -s TERM $PID</code>才能触发断点,点击IDE上的Stop按钮,不会触发断点。这是IDEA的bug</p>\n</blockquote>\n<p>可以看到有一个名为<code>Thread-3</code>的线程调用了该方法:</p>\n<pre><code class=\"language-java\">stopAwait:<span class=\"hljs-number\">390</span>, StandardServer (org.apache.catalina.core)\nstopInternal:<span class=\"hljs-number\">819</span>, StandardServer (org.apache.catalina.core)\nstop:<span class=\"hljs-number\">226</span>, LifecycleBase (org.apache.catalina.util)\nstop:<span class=\"hljs-number\">377</span>, Tomcat (org.apache.catalina.startup)\nstopTomcat:<span class=\"hljs-number\">241</span>, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\nstop:<span class=\"hljs-number\">295</span>, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)\nstopAndReleaseEmbeddedServletContainer:<span class=\"hljs-number\">306</span>, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\nonClose:<span class=\"hljs-number\">155</span>, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)\ndoClose:<span class=\"hljs-number\">1014</span>, AbstractApplicationContext (org.springframework.context.support)\nrun:<span class=\"hljs-number\">929</span>, AbstractApplicationContext$<span class=\"hljs-number\">2</span> (org.springframework.context.support)\n</code></pre>\n<p>通过源码分析,原来是通过Spring注册的<code>ShutdownHook</code>来执行的</p>\n<pre><code class=\"language-java\">\t<span class=\"hljs-meta\">@Override</span>\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">registerShutdownHook</span><span class=\"hljs-params\">()</span> </span>{\n\t\t<span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.shutdownHook == <span class=\"hljs-keyword\">null</span>) {\n\t\t\t<span class=\"hljs-comment\">// No shutdown hook registered yet.</span>\n\t\t\t<span class=\"hljs-keyword\">this</span>.shutdownHook = <span class=\"hljs-keyword\">new</span> Thread() {\n\t\t\t\t<span class=\"hljs-meta\">@Override</span>\n\t\t\t\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n\t\t\t\t\t<span class=\"hljs-keyword\">synchronized</span> (startupShutdownMonitor) {\n\t\t\t\t\t\tdoClose();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tRuntime.getRuntime().addShutdownHook(<span class=\"hljs-keyword\">this</span>.shutdownHook);\n\t\t}\n\t}\n</code></pre>\n<p>通过查阅Java的API文档[2], 我们可以知道ShutdownHook将在下面两种情况下执行</p>\n<blockquote>\n<p>The Java virtual machine <em>shuts down</em> in response to two kinds of events:</p>\n<ul>\n<li>The program <em>exits</em> normally, when the last non-daemon thread exits or when the <code>exit</code> (equivalently, <a href=\"https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#exit-int-\"><code>System.exit</code></a>) method is invoked, or</li>\n<li>The virtual machine is <em>terminated</em> in response to a user interrupt, such as typing <code>^C</code>, or a system-wide event, such as user logoff or system shutdown.</li>\n</ul>\n</blockquote>\n<ol>\n<li>调用了System.exit()方法</li>\n<li>响应外部的信号,例如Ctrl+C(其实发送的是SIGINT信号),或者是<code>SIGTERM</code>信号(默认<code>kill $PID</code>发送的是<code>SIGTERM</code>信号)</li>\n</ol>\n<p>因此,正常的应用在停止过程中(<code>kill -9 $PID</code>除外),都会执行上述ShutdownHook,它的作用不仅仅是关闭tomcat,还有进行其他的清理工作,在此不再赘述。</p>\n<h2>总结</h2>\n<ol>\n<li>在<code>DubboConsumer</code>启动的过程中,通过启动一个独立的非daemon线程循环检查变量的状态,确保进程不退出</li>\n<li>在<code>DubboConsumer</code>停止的过程中,通过执行spring容器的shutdownhook,修改了变量的状态,使得程序正常退出</li>\n</ol>\n<h2>问题</h2>\n<p>在DubboProvider的例子中,我们看到Provider并没有启动Tomcat提供HTTP服务,那又是如何实现不退出的呢?我们将在下一篇文章中回答这个问题。</p>\n<h3>彩蛋</h3>\n<p>在<code>Intellij IDEA</code>中运行了如下的单元测试,创建一个线程执行睡眠1000秒的操作,我们惊奇的发现,代码并没有线程执行完就退出了,这又是为什么呢?(被创建的线程是非daemon线程)</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-meta\">@Test</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">test</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-meta\">@Override</span>\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">try</span> {\n                    Thread.sleep(<span class=\"hljs-number\">1000000</span>);\n                } <span class=\"hljs-keyword\">catch</span> (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n        }).start();\n    }\n</code></pre>\n<p>[1] <a href=\"https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.8\">https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.8</a></p>\n<p>[2] <a href=\"https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook\">https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook</a></p>\n",
-  "title": "Spring Boot Dubbo应用启停源码分析",
-  "keywords": "Dubbo, Spring Boot, 源码分析",
-  "description": "本文分析 `incubator-dubbo-spring-boot-project` 中 Dubbo 启停源码的实现原理。"
+  "link": "/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html",
+  "meta": {
+    "title": "Spring Boot Dubbo应用启停源码分析",
+    "keywords": "Dubbo, Spring Boot, 源码分析",
+    "description": "本文分析 `incubator-dubbo-spring-boot-project` 中 Dubbo 启停源码的实现原理。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/tracing-with-skywalking.json b/zh-cn/blog/tracing-with-skywalking.json
index dc086012..38e000ff 100644
--- a/zh-cn/blog/tracing-with-skywalking.json
+++ b/zh-cn/blog/tracing-with-skywalking.json
@@ -1,7 +1,10 @@
 {
   "filename": "tracing-with-skywalking.md",
   "__html": "<h1>使用Apache Skywalking (Incubator) 做分布式跟踪</h1>\n<h2>Apache Skywalking(Incubator)简介</h2>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a> 专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统。<a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a>通过加载探针的方式收集应用调用链路信息,并对采集的调用链路信息进行分析,生成应用间关系和服务间关系以及服务指标。<a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking (Incubating)</a>目前支持多种语言,其中包括<a href=\"https://github.com/apache/incubator-skywalking\">Java</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-netcore\">.Net Core</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-nodejs\">Node.js</a>和<a href=\"https://github.com/OpenSkywalking/skywalking-go\">Go</a>语言。</p>\n<p>目前Skywalking已经支持从6个可视化维度剖析分布式系统的运行情况。总览视图是应用和组件的全局视图,其中包括组件和应用数量,应用的告警波动,慢服务列表以及应用吞吐量;拓扑图从应用依赖关系出发,展现整个应用的拓扑关系;应用视图则是从单个应用的角度,展现应用的上下游关系,TopN的服务和服务器,JVM的相关信息以及对应的主机信息。服务视图关注单个服务入口的运行情况以及此服务的上下游依赖关系,依赖度,帮助用户针对单个服务的优化和监控;调用链展现了调用的单次请求经过的所有埋点以及每个埋点的执行时长;告警视图根据配置阈值针对应用、服务器、服务进行实时告警。</p>\n<h2>Dubbo与Apache Skywalking(Incubator)</h2>\n<h3>编写Dubbo示例程序</h3>\n<p>Dubbo实例程序已上传到<a href=\"https://github.com/SkywalkingTest/dubbo-trace-example\">Github仓库</a>中。方便大家下载使用。</p>\n<h4>API工程</h4>\n<p>服务接口:</p>\n<pre><code>package org.apache.skywalking.demo.interfaces;\n\npublic interface HelloService {\n\tString sayHello(String name);\n}\n</code></pre>\n<h4>Dubbo服务提供工程</h4>\n<pre><code>package org.apache.skywalking.demo.provider;\n\n@Service(version = &quot;${demo.service.version}&quot;,\n\tapplication = &quot;${dubbo.application.id}&quot;,\n\tprotocol = &quot;${dubbo.protocol.id}&quot;,\n\tregistry = &quot;${dubbo.registry.id}&quot;, timeout = 60000)\npublic class HelloServiceImpl implements HelloService {\n\n\tpublic String sayHello(String name) {\n\t\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));\n\t\treturn &quot;Hello, &quot; + name;\n\t}\n\n}\n</code></pre>\n<h4>Consumer工程</h4>\n<pre><code>package org.apache.skywalking.demo.consumer;\n\n@RestController\npublic class ConsumerController {\n\n\tprivate static int COUNT = 0;\n\n\t@Reference(version = &quot;${demo.service.version}&quot;,\n\t\tapplication = &quot;${dubbo.application.id}&quot;,\n\t\turl = &quot;dubbo://localhost:20880&quot;, timeout = 60000)\n\tprivate HelloService helloService;\n\n\t@GetMapping(&quot;/sayHello/{name}&quot;)\n\tpublic String sayHello(@PathVariable(name = &quot;name&quot;) String name) {\n\t\tif ((COUNT++) % 3 == 0){\n\t\t\tthrow new RuntimeException();\n\t\t}\n\t\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));\n\t\treturn helloService.sayHello(name);\n\t}\n}\n</code></pre>\n<h3>部署Apache Skywalking(Incubator)</h3>\n<p>Apache Skywalking(Incubator)共提供两种部署模式:单节点模式和集群模式,以下为单节点模式部署步骤,集群模式部署详情参考<a href=\"https://github.com/apache/incubator-skywalking/blob/master/docs/cn/Deploy-backend-in-cluster-mode-CN.md\">文档</a>。</p>\n<h4>依赖第三方组件</h4>\n<ol>\n<li>JDK8+</li>\n<li>Elasticsearch 5.x</li>\n</ol>\n<h4>部署步骤</h4>\n<ol>\n<li>下载<a href=\"http://skywalking.apache.org/downloads/\"> Apache Skywalking Collector</a></li>\n<li>部署ElasticSearch\n<ul>\n<li>修改elasticsearch.yml文件,并设置<code>cluster.name</code>设置成<code>CollectorDBCluster</code>。此名称需要和collector配置文件一致。</li>\n<li>修改ES配置<code>network.host</code>值,将<code>network.host</code>的值修改成<code>0.0.0.0</code>。</li>\n<li>启动Elasticsearch</li>\n</ul>\n</li>\n<li>解压并启动Skywalking Collector。运行<code>bin/startup.sh</code>命令即可启动Skywalking Collector</li>\n</ol>\n<h4>启动示例程序</h4>\n<p>在启动示例程序之前,执行编译打包的命令:</p>\n<pre><code>./mvnw clean package\n</code></pre>\n<h4>启动服务提供端</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar\n</code></pre>\n<h4>启动服务消费端</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar \n</code></pre>\n<h4>访问消费端提供的服务</h4>\n<pre><code>curl http://localhost:8080/sayHello/test\n</code></pre>\n<h2>Skywalking监控截图:</h2>\n<h3>首页</h3>\n<p><img src=\"../../img/blog/skywalking-dashboard.png\" alt=\"/admin-guide/images/skywalking-dashboard.png\"></p>\n<h3>拓扑图</h3>\n<p><img src=\"../../img/blog/skywalking-topology.png\" alt=\"/admin-guide/images/skywalking-topology.png\"></p>\n<h3>应用视图</h3>\n<p><img src=\"../../img/blog/skywalking-application.png\" alt=\"/admin-guide/images/skywalking-application.png\"></p>\n<p>JVM信息\n<img src=\"../../img/blog/skywalking-application_instance.png\" alt=\"/admin-guide/images/skywalking-application_instance.png\"></p>\n<h3>服务视图</h3>\n<p>服务消费端:\n<img src=\"../../img/blog/skywalking-service-consumer.png\" alt=\"/admin-guide/images/skywalking-service-consumer.png\"></p>\n<p>服务提供端:\n<img src=\"../../img/blog/skywalking-service-provider.png\" alt=\"/admin-guide/images/skywalking-service-provider.png\"></p>\n<h3>Trace视图</h3>\n<p><img src=\"../../img/blog/skywalking-trace.png\" alt=\"/admin-guide/images/skywalking-trace.png\"></p>\n<p>Span信息:\n<img src=\"../../img/blog/skywalking-span-Info.png\" alt=\"/admin-guide/images/skywalking-span-Info.png\"></p>\n<h3>告警视图</h3>\n<p><img src=\"../../img/blog/skywalking-alarm.png\" alt=\"/admin-guide/images/skywalking-alarm.png\"></p>\n",
-  "title": "使用Apache Skywalking (Incubator) 做分布式跟踪",
-  "keywords": "Dubbo, Skywalking, tracing, 分布式跟踪",
-  "description": "本文介绍如何使用 Apache Skywalking 对 Dubbo 应用做分布式链路追踪。"
+  "link": "/zh-cn/blog/tracing-with-skywalking.html",
+  "meta": {
+    "title": "使用Apache Skywalking (Incubator) 做分布式跟踪",
+    "keywords": "Dubbo, Skywalking, tracing, 分布式跟踪",
+    "description": "本文介绍如何使用 Apache Skywalking 对 Dubbo 应用做分布式链路追踪。"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/blog/use-zipkin-in-dubbo.json b/zh-cn/blog/use-zipkin-in-dubbo.json
index 17f168b9..0a020cae 100644
--- a/zh-cn/blog/use-zipkin-in-dubbo.json
+++ b/zh-cn/blog/use-zipkin-in-dubbo.json
@@ -1,7 +1,10 @@
 {
   "filename": "use-zipkin-in-dubbo.md",
   "__html": "<h1>在 Dubbo 中使用 Zipkin</h1>\n<p>随着业务的发展,应用的规模不断的扩大,传统的应用架构无法满足诉求,服务化架构改造势在必行,以 Dubbo 为代表的分布式服务框架成为了服务化改造架构中的基石。随着微服务理念逐渐被大众接受,应用进一步向更细粒度拆分,并且,不同的应用由不同的开发团队独立负责,整个分布式系统变得十分复杂。没有人能够清晰及时的知道当前系统整体的依赖关系。当出现问题时,也无法及时知道具体是链路上的哪个环节出了问题。</p>\n<p>在这个背景下,Google 发表了 <a href=\"https://ai.google/research/pubs/pub36356\">Dapper</a> 的论文,描述了如何通过一个分布式追踪系统解决上述问题。基于该论文,各大互联网公司实现并部署了自己的分布式追踪系统,其中比较出名的有阿里巴巴的 EagleEye。本文中提到的 Zipkin 是 Twitter 公司开源的分布式追踪系统。下面会详细介绍如何在 Dubbo 中使用 Zipkin 来实现分布式追踪。</p>\n<h2>Zipkin 简介</h2>\n<p>Zipkin 是基于 <a href=\"https://ai.google/research/pubs/pub36356\">Dapper</a> 论文实现,由 Twitter 开源的分布式追踪系统,通过收集分布式服务执行时间的信息来达到追踪服务调用链路、以及分析服务执行延迟等目的。</p>\n<h3>Zipkin 架构</h3>\n<p><img src=\"../../img/blog/zipkin-architecture.png\" alt=\"Zipkin architecture\"></p>\n<p>Collector 收集器、Storage 存储、API、UI 用户界面等几部分构成了 Zipkin Server 部分,对应于 GitHub 上 <a href=\"https://github.com/openzipkin/zipkin\">openzipkin/zipkin</a> 这个项目。而收集应用中调用的耗时信息并将其上报的组件与应用共生,并拥有各个语言的实现版本,其中 Java 的实现是 GitHub 上 <a href=\"https://github.com/openzipkin/brave\">openzipkin/brave</a>。除了 Java 客户端实现之外,openzipkin 还提供了许多其他语言的实现,其中包括了 go、php、JavaScript、.net、ruby 等,具体列表可以参阅 Zipkin 的 <a href=\"https://zipkin.io/pages/existing_instrumentations\">Exiting instrumentations</a>。</p>\n<h3>Zipkin 的工作过程</h3>\n<p>当用户发起一次调用时,Zipkin 的客户端会在入口处为整条调用链路生成一个全局唯一的 trace id,并为这条链路中的每一次分布式调用生成一个 span id。span 与 span 之间可以有父子嵌套关系,代表分布式调用中的上下游关系。span 和 span 之间可以是兄弟关系,代表当前调用下的两次子调用。一个 trace 由一组 span 组成,可以看成是由 trace 为根节点,span 为若干个子节点的一棵树。</p>\n<p><img src=\"../../img/blog/trace-sample.png\" alt=\"Related image\"></p>\n<p>Span 由调用边界来分隔,在 Zipkin 中,调用边界由以下四个 annotation 来表示:</p>\n<ul>\n<li>cs - Clent Sent 客户端发送了请求</li>\n<li>sr - Server Receive 服务端接受到请求</li>\n<li>ss - Server Send 服务端处理完毕,向客户端发送回应</li>\n<li>cr - Client Receive 客户端收到结果</li>\n</ul>\n<p>显然,通过这四个 annotation 上的时间戳,可以轻易的知道一次完整的调用在不同阶段的耗时,比如:</p>\n<ul>\n<li>sr - cs 代表了请求在网络上的耗时</li>\n<li>ss - sr 代表了服务端处理请求的耗时</li>\n<li>cr - ss 代表了回应在网络上的耗时</li>\n<li>cr - cs 代表了一次调用的整体耗时</li>\n</ul>\n<p>Zipkin 会将 trace 相关的信息在调用链路上传递,并在每个调用边界结束时异步的把当前调用的耗时信息上报给 Zipkin Server。Zipkin Server 在收到 trace 信息后,将其存储起来,Zipkin 支持的存储类型有 inMemory、MySql、Cassandra、以及 ElasticsSearch 几种方式。随后 Zipkin 的 Web UI 会通过 API 访问的方式从存储中将 trace 信息提取出来分析并展示,如下图所示:</p>\n<p><img src=\"../../img/blog/zipkin-web-screenshot.png\" alt=\"Web interface screenshot\"></p>\n<h2>在 Dubbo 中使用</h2>\n<p>由于 <a href=\"https://github.com/openzipkin/brave\">Brave</a> 对 Dubbo 已经主动做了支持,在 Dubbo 中集成基于 Zipkin 的链路追踪变的十分简单。下面会按照 Brave 中关于 <a href=\"https://github.com/openzipkin/brave/blob/master/instrumentation/dubbo-rpc/README.md\">Dubbo RPC 支持的指引</a>来说明如何在 Dubbo 中使用 Zipkin。</p>\n<h3>安装 Zipkin Server</h3>\n<p>按照 <a href=\"https://github.com/openzipkin/zipkin/tree/master/zipkin-server#quick-start\">Zipkin 官方文档中的快速开始</a> 来安装 Zipkin,如下所示:</p>\n<pre><code class=\"language-bash\">$ curl -sSL https://zipkin.io/quickstart.sh | bash -s\n$ java -jar zipkin.jar\n</code></pre>\n<p>按照这种方式安装的 Zipkin Server 使用的存储类型是 inMemory 的。当服务器停机之后,所有收集到的 trace 信息会丢失,不适用于生产系统。如果在生产系统中使用,需要配置另外的存储类型。Zipkin 支持 MySql、Cassandra、和 ElasticSearch。推荐使用 Cassandra 和 ElasticSearch,相关的配置请自行查阅<a href=\"https://github.com/openzipkin/zipkin/tree/master/zipkin-server\">官方文档</a>。</p>\n<p>本文为了演示方便,使用的存储是 inMemory 类型。成功启动之后,可以在终端看到如下的提示:</p>\n<pre><code class=\"language-bash\">$ java -jar zipkin.jar\nPicked up JAVA_TOOL_OPTIONS: -Djava.awt.headless=<span class=\"hljs-literal\">true</span>\n                                    ********\n                                  **        **\n                                 *            *\n                                **            **\n                                **            **\n                                 **          **\n                                  **        **\n                                    ********\n                                      ****\n                                      ****\n        ****                          ****\n     ******                           ****                                 ***\n  ****************************************************************************\n    *******                           ****                                 ***\n        ****                          ****\n                                       **\n                                       **\n\n\n             *****      **     *****     ** **       **     **   **\n               **       **     **  *     ***         **     **** **\n              **        **     *****     ****        **     **  ***\n             ******     **     **        **  **      **     **   **\n\n:: Powered by Spring Boot ::         (v2.0.5.RELEASE)\n\n...\n\no.s.b.w.e.u.UndertowServletWebServer     : Undertow started on port(s) 9411 (http) with context path <span class=\"hljs-string\">''</span>\n2018-10-10 18:40:31.605  INFO 21072 --- [           main] z.s.ZipkinServer                         : Started ZipkinServer <span class=\"hljs-keyword\">in</span> 6.835 seconds (JVM running <span class=\"hljs-keyword\">for</span> 8.35)\n</code></pre>\n<p>然后在浏览器中访问 <a href=\"http://localhost:9411\">http://localhost:9411</a> 验证 WEB 界面。</p>\n<h3>配置 Maven 依赖</h3>\n<h4>引入 Brave 依赖</h4>\n<p>新建一个新的 Java 工程,并在 pom.xml 中引入 Brave 相关的依赖如下:</p>\n<pre><code class=\"language-xml\">    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">brave.version</span>&gt;</span>5.4.2<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">brave.version</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">zipkin-reporter.version</span>&gt;</span>2.7.9<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">zipkin-reporter.version</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencyManagement</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n            <span class=\"hljs-comment\">&lt;!-- 引入 zipkin brave 的 BOM 文件 --&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.zipkin.brave<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>brave-bom<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>${brave.version}<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type</span>&gt;</span>pom<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">type</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>import<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t\n            <span class=\"hljs-comment\">&lt;!-- 引入 zipkin repoter 的 BOM 文件 --&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.zipkin.reporter2<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>zipkin-reporter-bom<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>${zipkin-reporter.version}<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type</span>&gt;</span>pom<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">type</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>import<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencyManagement</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n        <span class=\"hljs-comment\">&lt;!-- 1. brave 对 dubbo 的集成 --&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.zipkin.brave<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>brave-instrumentation-dubbo-rpc<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n        <span class=\"hljs-comment\">&lt;!-- 2. brave 的 spring bean 支持 --&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.zipkin.brave<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>brave-spring-beans<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n        <span class=\"hljs-comment\">&lt;!-- 3. 在 SLF4J 的 MDC (Mapped Diagnostic Context) 中支持 traceId 和 spanId --&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.zipkin.brave<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>brave-context-slf4j<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n        <span class=\"hljs-comment\">&lt;!-- 4. 使用 okhttp3 作为 reporter --&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.zipkin.reporter2<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>zipkin-sender-okhttp3<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n</code></pre>\n<p>其中:</p>\n<ol>\n<li>引入 brave-instrumentation-dubbo-rpc,brave 对 dubbo 的支持:<a href=\"https://github.com/openzipkin/brave/blob/master/instrumentation/dubbo-rpc/README.md\">https://github.com/openzipkin/brave/blob/master/instrumentation/dubbo-rpc/README.md</a></li>\n<li>引入 brave-spring-beans,brave 对 spring bean 的支持:<a href=\"https://github.com/openzipkin/brave/blob/master/spring-beans/README.md\">https://github.com/openzipkin/brave/blob/master/spring-beans/README.md</a></li>\n<li>引入 brave-context-slf4j,brave 对 SLF4J 的支持,可以在 MDC 中使用 traceId 和 spanId:<a href=\"https://github.com/openzipkin/brave/blob/master/context/slf4j/README.md\">https://github.com/openzipkin/brave/blob/master/context/slf4j/README.md</a></li>\n<li>引入 zipkin-sender-okhttp3,使用 okhttp3 上报数据:<a href=\"https://github.com/openzipkin/zipkin-reporter-java\">https://github.com/openzipkin/zipkin-reporter-java</a></li>\n</ol>\n<h4>引入 Dubbo 相关依赖</h4>\n<p>Dubbo 相关的依赖是 Dubbo 本身以及 Zookeeper 客户端,在下面的例子中,我们将会使用独立的 Zookeeper Server 作为服务发现。</p>\n<pre><code class=\"language-xml\">    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n        <span class=\"hljs-comment\">&lt;!-- 1. Zookeeper 客户端依赖 --&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.apache.curator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>curator-framework<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.12.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">exclusions</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">exclusion</span>&gt;</span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>io.netty<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>netty<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">exclusion</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">exclusions</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n        <span class=\"hljs-comment\">&lt;!-- 2. Dubbo 依赖 --&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.6.2<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n</code></pre>\n<p>其中:</p>\n<ol>\n<li>Dubbo 这里依赖独立的 Zookeeper Server 做服务发现,这里使用的客户端是 Curator</li>\n<li>引入 Dubbo 框架的依赖,原则上 2.6 的任何版本都是工作的,这里使用的是 2.6.2 版本</li>\n</ol>\n<h3>实现</h3>\n<p>我们这里构造的场景是一个有两个节点的服务依赖链,也就是,当一个 Dubbo 客户端调用服务 A 时,服务 A 将会继续调用服务 B。在这个例子中,服务 A 是 greeting service,它所依赖的下游服务服务 B 是 hello service。</p>\n<h4>定义服务接口</h4>\n<p>为此需要事先定义两个服务接口 GreetingService 以及 HelloService</p>\n<ol>\n<li>\n<p>com.alibaba.dubbo.samples.api.GreetingService</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.api;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">greeting</span><span class=\"hljs-params\">(String message)</span></span>;\n}\n</code></pre>\n</li>\n<li>\n<p>com.alibaba.dubbo.samples.api.HelloService</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.api;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">hello</span><span class=\"hljs-params\">(String message)</span></span>;\n}\n</code></pre>\n</li>\n</ol>\n<h4>实现服务接口</h4>\n<p>为了区分对待,所有和 HelloService 相关的实现代码都放在 hello 子包下,同理 GreetingService 相关的放在 greeting 子包下。</p>\n<ol>\n<li>\n<p>实现 com.alibaba.dubbo.samples.api.HelloService</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.service.hello;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.samples.api.HelloService;\n\n<span class=\"hljs-keyword\">import</span> java.util.Random;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">hello</span><span class=\"hljs-params\">(String message)</span> </span>{\n        <span class=\"hljs-keyword\">try</span> {\n            <span class=\"hljs-comment\">// 通过 sleep 模拟业务逻辑处理时间</span>\n            Thread.sleep(<span class=\"hljs-keyword\">new</span> Random(System.currentTimeMillis()).nextInt(<span class=\"hljs-number\">1000</span>));\n        } <span class=\"hljs-keyword\">catch</span> (InterruptedException e) {\n            <span class=\"hljs-comment\">// no op</span>\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"hello, \"</span> + message;\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>实现 com.alibaba.dubbo.samples.api.GreetingService</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.service.greeting;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.samples.api.GreetingService;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.samples.api.HelloService;\n\n<span class=\"hljs-keyword\">import</span> java.util.Random;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">GreetingServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GreetingService</span> </span>{\n\t<span class=\"hljs-comment\">// 下游依赖服务,运行时靠 spring 容器注入 HelloService 的服务代理</span>\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setHelloService</span><span class=\"hljs-params\">(HelloService helloService)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.helloService = helloService;\n    }\n\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">greeting</span><span class=\"hljs-params\">(String message)</span> </span>{\n        <span class=\"hljs-keyword\">try</span> {\n            <span class=\"hljs-comment\">// 通过 sleep 模拟业务逻辑处理时间</span>\n            Thread.sleep(<span class=\"hljs-keyword\">new</span> Random(System.currentTimeMillis()).nextInt(<span class=\"hljs-number\">1000</span>));\n        } <span class=\"hljs-keyword\">catch</span> (InterruptedException e) {\n            <span class=\"hljs-comment\">// no op</span>\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"greeting, \"</span> + helloService.hello(message);\n    }\n}\n</code></pre>\n<p>这里需要注意的是,GreetingServiceImpl 的实现中声明了一个类型是 HelloService 的成员变量,并在 greeting 方法中,执行完自己逻辑之后又调用了 HelloService 上的 hello 方法。这里的 helloService 的实现将会在运行态由外部注入,注入的不是 HelloServiceImpl 的实现,而是 HelloService 的远程调用代理。通过这样的方式,完成了在一个 Dubbo 服务中继续调用另一个远程 Dubbo 服务的目的。从链路追踪的角度来说,客户端调用 GreetingService 是一个 span,GreetingService 调用 HelloService 是另一个 span,并且两者有父子关系,同属于一个 trace,也就是属于同一条调用链路。</p>\n<p>另外,在 GreetingServiceImpl 和 HelloServiceImpl 的实现中,通过 Thread.sleep 来模拟了处理业务逻辑的耗时,以便在 Zipkin UI 上更好的展示。</p>\n</li>\n</ol>\n<h4>配置</h4>\n<p>为了专注在展示如何使用 Zipkin 这一点上,本文在配置和编程模型上没有采用更多的高级技术,而是使用了最传统的 Spring XML 的配置方式,帮助读者理解。更高级的通过 annotation 甚至 spring boot 的方式,读者可以自行查阅 Dubbo 和 Zipkin 相关的文档。</p>\n<ol>\n<li>\n<p>暴露 HelloService 服务</p>\n<p>在 resouces/spring/hello-service.xml 中增加以下的配置来将 HelloServiceImpl 暴露成一个 Dubbo 服务:</p>\n<ul>\n<li>使用了本地启动的 Zookeeper Server 作为注册中心,地址为默认值 zookeeper://127.0.0.1:2181</li>\n<li>用 Dubbo 原生服务在端口 20880 上暴露服务</li>\n<li>将 HelloServiceImpl 注册成 id 是 <code>helloService</code> 的 Spring Bean,这样就可以在后续的 <code>&lt;dubbo:service&gt;</code> 中引用到这个实现类</li>\n<li>通过 <code>&lt;dubbo:service&gt;</code> 将 HelloServiceImpl 暴露成 Dubbo 服务</li>\n</ul>\n<pre><code class=\"language-xml\">    <span class=\"hljs-comment\">&lt;!-- 定义 HelloService 的应用名 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hello-service-provider\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 指定注册中心地址 --&gt;</span>\n    <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>\n\n    <span class=\"hljs-comment\">&lt;!-- 使用 Dubbo 原生协议在 20880 端口上暴露服务 --&gt;</span>\n    <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\">\"20880\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 将 HelloServiceImpl 的实现声明成一个 spring bean --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.service.hello.HelloServiceImpl\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 将 HelloServiceImpl 声明成一个 Dubbo 服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.HelloService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>/&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>增加 Zipkin 相关的配置</p>\n<p>在 resources/spring/hello-service.xml 中增加 Zipkin 相关的配置:</p>\n<ul>\n<li>修改 dubbo 服务暴露的配置,添加 Zipkin 的 tracing filter 到 Dubbo 的 filter chain 中</li>\n<li>按照 <a href=\"https://github.com/openzipkin/brave/blob/master/spring-beans/README.md\">https://github.com/openzipkin/brave/blob/master/spring-beans/README.md</a> 来配置 Zipkin 的 sender 和 tracing 的 spring bean</li>\n</ul>\n<pre><code class=\"language-xml\">    <span class=\"hljs-comment\">&lt;!-- 1. 修改 dubbo 服务暴露配置,在 filter chain 中增加 zipkin 的 tracing 过滤器 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.HelloService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"tracing\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 2. zipkin 相关的配置 --&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用 OKHttp 来发送 trace 信息到 Zipkin Server。这里的 Zipkin Server 启动在本地 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"sender\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"zipkin2.reporter.beans.OkHttpSenderFactoryBean\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"endpoint\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"http://localhost:9411/api/v2/spans\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"tracing\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.spring.beans.TracingFactoryBean\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"localServiceName\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"hello-service\"</span>/&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"spanReporter\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"zipkin2.reporter.beans.AsyncReporterFactoryBean\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sender\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"sender\"</span>/&gt;</span>\n                <span class=\"hljs-comment\">&lt;!-- wait up to half a second for any in-flight spans on close --&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"closeTimeout\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"500\"</span>/&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"currentTraceContext\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.spring.beans.CurrentTraceContextFactoryBean\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"scopeDecorators\"</span>&gt;</span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.context.slf4j.MDCScopeDecorator\"</span> <span class=\"hljs-attr\">factory-method</span>=<span class=\"hljs-string\">\"create\"</span>/&gt;</span>\n                <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>增加 HelloService 的启动类</p>\n<p>在 com.alibaba.dubbo.samples.service.hello.Application 中通过 ClassPathXmlApplicationContext 读取 刚才配置的 spring/hello-service.xml 来初始化一个 spring context 并启动</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.service.hello;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n\n<span class=\"hljs-keyword\">import</span> java.io.IOException;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"spring/hello-service.xml\"</span>);\n        context.start();\n\n        System.out.println(<span class=\"hljs-string\">\"Hello service started\"</span>);\n        <span class=\"hljs-comment\">// press any key to exit</span>\n        System.in.read();\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>暴露 GreetingService 服务,并使用 Zipkin</p>\n<p>在 resources/spring/greeting-service.xml 中配置 GreetingService。相关步骤与 HelloService 类似,不再赘述,重点关注如何在 GreetingService 中配置下游服务的依赖。完整的 XML 配置如下:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 1. 定义 GreetingService 的应用名 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"greeting-service-provider\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 2. 指定注册中心地址 --&gt;</span>\n    <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>\n\n     <span class=\"hljs-comment\">&lt;!-- 3. 使用 Dubbo 原生协议在 20881 端口上暴露服务 --&gt;</span>\n    <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\">\"20881\"</span>/&gt;</span>\n    \n    <span class=\"hljs-comment\">&lt;!-- 4. 声明 HelloService 的远程代理,并在 Dubbo 的 filter chain 中增加 tracing filter --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.HelloService\"</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"tracing\"</span>/&gt;</span>\n    \n    <span class=\"hljs-comment\">&lt;!-- 5. 将 GreetingServiceImpl 的实现声明成一个 spring bean,并将 HelloService 的远程代理装配进去 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"greetingService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.service.greeting.GreetingServiceImpl\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 6. 将 GreetingServiceImpl 声明成一个 Dubbo 服务,并在 Dubbo 的 filter chain 中增加 tracing filter --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"greetingService\"</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"tracing\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 7. zipkin 相关的配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"sender\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"zipkin2.reporter.beans.OkHttpSenderFactoryBean\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"endpoint\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"http://localhost:9411/api/v2/spans\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"tracing\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.spring.beans.TracingFactoryBean\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"localServiceName\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"greeting-service\"</span>/&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"spanReporter\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"zipkin2.reporter.beans.AsyncReporterFactoryBean\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sender\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"sender\"</span>/&gt;</span>\n                <span class=\"hljs-comment\">&lt;!-- wait up to half a second for any in-flight spans on close --&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"closeTimeout\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"500\"</span>/&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"currentTraceContext\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.spring.beans.CurrentTraceContextFactoryBean\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"scopeDecorators\"</span>&gt;</span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.context.slf4j.MDCScopeDecorator\"</span> <span class=\"hljs-attr\">factory-method</span>=<span class=\"hljs-string\">\"create\"</span>/&gt;</span>\n                <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>这里的配置与上面的 HelloService 类似,需要重点关注的有两点:</p>\n<ul>\n<li>\n<p>第 3 步中注意服务需要暴露在不同的端口上,否则会和 HelloService 冲突,本例中选择的是 20881 这个端口</p>\n</li>\n<li>\n<p>通过第 4 步先声明 HelloService 的远程代理,然后在第 5 步中将其组装给 GreetingService 来完成服务上下游依赖的声明</p>\n</li>\n</ul>\n<p>增加 GreeeingService 的启动类,与 HelloService 类似,通过 spring/greeting-service.xml 的配置来初始化一个新的 spring context 来完成。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.service.greeting;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n\n<span class=\"hljs-keyword\">import</span> java.io.IOException;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"spring/greeting-service.xml\"</span>);\n        context.start();\n\n        System.out.println(<span class=\"hljs-string\">\"Greeting service started\"</span>);\n        <span class=\"hljs-comment\">// press any key to exit</span>\n        System.in.read();\n    }\n}\n</code></pre>\n</li>\n<li>\n<p>实现客户端</p>\n<p>通过 resources/spring/client.xml 初始化一个 spring context,从其中获取 GreetingService 的远程代理,发起远程调用。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.samples.client;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.samples.api.GreetingService;\n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Application</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"spring/client.xml\"</span>);\n        context.start();\n        <span class=\"hljs-comment\">// 获取远程代理并发起调用</span>\n        GreetingService greetingService = (GreetingService) context.getBean(<span class=\"hljs-string\">\"greetingService\"</span>);\n        System.out.println(greetingService.greeting(<span class=\"hljs-string\">\"world\"</span>));\n    }\n}\n</code></pre>\n<p>resource/spring/client.xml 中的配置与 Dubbo 服务的配置类似,主要是配置远程代理,以及配置 Zipkin</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n       <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n       <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n       <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n\n   <span class=\"hljs-comment\">&lt;!-- 1. 定义 dubbo 客户端的应用名 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo-client\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 2. 指定注册中心地址 --&gt;</span>\n    <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>\n\n    <span class=\"hljs-comment\">&lt;!-- 3. 声明 GreetingService 的远程代理,并在 Dubbo 的 filter chain 中增加 tracing filter --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"greetingService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.samples.api.GreetingService\"</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"tracing\"</span>/&gt;</span>\n\n    <span class=\"hljs-comment\">&lt;!-- 4. zipkin 相关的配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"sender\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"zipkin2.reporter.beans.OkHttpSenderFactoryBean\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"endpoint\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"http://localhost:9411/api/v2/spans\"</span>/&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"tracing\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.spring.beans.TracingFactoryBean\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"localServiceName\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"client\"</span>/&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"spanReporter\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"zipkin2.reporter.beans.AsyncReporterFactoryBean\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sender\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"sender\"</span>/&gt;</span>\n                <span class=\"hljs-comment\">&lt;!-- wait up to half a second for any in-flight spans on close --&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"closeTimeout\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"500\"</span>/&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"currentTraceContext\"</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.spring.beans.CurrentTraceContextFactoryBean\"</span>&gt;</span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"scopeDecorators\"</span>&gt;</span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"brave.context.slf4j.MDCScopeDecorator\"</span> <span class=\"hljs-attr\">factory-method</span>=<span class=\"hljs-string\">\"create\"</span>/&gt;</span>\n                <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n            <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">property</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n</li>\n</ol>\n<p>完成之后的工程的目录结构如下:</p>\n<p><img src=\"../../img/blog/zipkin-dubbo-project.png\" alt=\"zipkin dubob project structure\"></p>\n<h3>运行</h3>\n<p>现在让我们把整个链路运行起来,看看 Zipkin 链路追踪的效果。</p>\n<h4>启动 Zookeeper Server</h4>\n<p>执行以下命令在本地启动一个 Zookeeper Server,如果没有安装,请自行从 <a href=\"https://zookeeper.apache.org\">ZooKeeper 官网</a> 下载:</p>\n<pre><code class=\"language-bash\">$ zkServer start\n</code></pre>\n<h4>启动 Zipkin Server</h4>\n<p>执行以下命令在本地启动一个 Zipkin Server:</p>\n<pre><code class=\"language-bash\">$ curl -sSL https://zipkin.io/quickstart.sh | bash -s\n$ java -jar zipkin.jar\n</code></pre>\n<h4>启动 HelloService</h4>\n<p>使用下面的命令启动 HelloService,当然也可以直接在 IDE 中启动:</p>\n<pre><code class=\"language-bash\">$ mvn <span class=\"hljs-built_in\">exec</span>:java -Dexec.mainClass=com.alibaba.dubbo.samples.service.hello.Application\n</code></pre>\n<p>启动成功后应该可以在终端上看到 “Hello service started” 的字样。</p>\n<h4>启动 GreetingService</h4>\n<p>使用下面的命令启动 GreetingService,当然也可以直接在 IDE 中启动:</p>\n<pre><code class=\"language-bash\">$ mvn <span class=\"hljs-built_in\">exec</span>:java -Dexec.mainClass=com.alibaba.dubbo.samples.service.greeting.Application\n</code></pre>\n<p>启动成功后应该可以在终端上看到 “Greeting service started” 的字样。</p>\n<h4>运行 Dubbo 客户端</h4>\n<p>使用下面的命令运行 Dubbo 客户端向 GreetingService 发起远程调用,当然也可以直接在 IDE 中运行:</p>\n<pre><code class=\"language-bash\">$ mvn <span class=\"hljs-built_in\">exec</span>:java -Dexec.mainClass=com.alibaba.dubbo.samples.client.Application\n</code></pre>\n<p>执行成功后,客户端会在终端上输出 “greeting, hello, world”。</p>\n<h4>链路追踪</h4>\n<p>打开浏览器访问 &quot;<a href=\"http://localhost:9411\">http://localhost:9411</a>&quot; 并通过 &quot;Find Traces&quot; 按钮来搜索,可以找到刚刚调用的链路追踪,效果如下图所示:</p>\n<p><img src=\"../../img/blog/zipkin-trace.png\" alt=\"zipkin trace\"></p>\n<p>还可以进一步的选择每一个 span 来查看本次调用边界内的详情,比如,hello-service 这个 span 的详情如下:</p>\n<p><img src=\"../../img/blog/zipkin-span.png\" alt=\"zipkin span\"></p>\n<h2>总结</h2>\n<p>本文介绍了链路追踪的基本概念以及 Zipkin 的基本用法,然后用 Dubbo 构建了一条最简单的调用链路,并引入了 Zipkin 做全链路追踪。由于 Zipkin 对 Dubbo 做了很好的支持,整个集成的过程还是十分简单明了的。</p>\n<p>Zipkin 对 Dubbo 的支持是构建在 Dubbo 的 filter 扩展机制上的,有兴趣的读者可以通过 <a href=\"https://github.com/openzipkin/brave/blob/master/instrumentation/dubbo-rpc/src/main/java/brave/dubbo/rpc/TracingFilter.java\">https://github.com/openzipkin/brave/blob/master/instrumentation/dubbo-rpc/src/main/java/brave/dubbo/rpc/TracingFilter.java</a> 了解其实现细节。</p>\n<p>本文中涉及的例子可以从 <a href=\"https://github.com/dubbo/dubbo-samples\">https://github.com/dubbo/dubbo-samples</a> 中的 &quot;dubbo-samples-zipkin&quot; 子模块中获取。另外,spring-cloud-sleth 2.0 中开始 <a href=\"https://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.0.0.RC2/single/spring-cloud-sleuth.html#_dubbo_rpc_support\">正式支持 Dubbo</a>,相关的文章和例子后续计划提供。</p>\n",
-  "title": "在 Dubbo 中使用 Zipkin",
-  "keywords": "zipkin,dubbo,trace,span,dapper",
-  "description": "如何在 Dubbo 中使用 Zipkin 进行全链路追踪"
+  "link": "/zh-cn/blog/use-zipkin-in-dubbo.html",
+  "meta": {
+    "title": "在 Dubbo 中使用 Zipkin",
+    "keywords": "zipkin,dubbo,trace,span,dapper",
+    "description": "如何在 Dubbo 中使用 Zipkin 进行全链路追踪"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/README.json b/zh-cn/docs/admin/README.json
index 11b0d5e4..2ad9a80d 100644
--- a/zh-cn/docs/admin/README.json
+++ b/zh-cn/docs/admin/README.json
@@ -1,4 +1,6 @@
 {
   "filename": "README.md",
-  "__html": "<p>这篇文档详细讲解了 dubbo 注册中心、管理控制台的安装和使用。</p>\n"
+  "__html": "<p>这篇文档详细讲解了 dubbo 注册中心、管理控制台的安装和使用。</p>\n",
+  "link": "/zh-cn/docs/admin/README.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/SUMMARY.json b/zh-cn/docs/admin/SUMMARY.json
index 54e2d935..30d6d785 100644
--- a/zh-cn/docs/admin/SUMMARY.json
+++ b/zh-cn/docs/admin/SUMMARY.json
@@ -1,4 +1,6 @@
 {
   "filename": "SUMMARY.md",
-  "__html": "<ul>\n<li><a href=\"install/introduction.md\">1 安装手册</a>\n<ul>\n<li><a href=\"install/provider-demo.md\">1.1 示例提供者安装</a></li>\n<li><a href=\"install/consumer-demo.md\">1.2 示例消费者安装</a></li>\n<li><a href=\"install/zookeeper.md\">1.3 Zookeeper 注册中心安装</a></li>\n<li><a href=\"install/redis.md\">1.4 Redis 注册中心安装</a></li>\n<li><a href=\"install/simple-registry-center.md\">1.5 Simple 注册中心安装</a></li>\n<li><a href=\"install/simple-monitor-center.md\">1.6 Simple 监控中心安装</a></li>\n<li><a href=\"install/admin-console.md\">1.7 管理控制台安装</a></li>\n</ul>\n</li>\n<li><a href=\"ops/introduction.md\">2 运维手册</a>\n<ul>\n<li><a href=\"ops/dubbo-ops.md\">2.1 管理控制台运维</a></li>\n</ul>\n</li>\n</ul>\n"
+  "__html": "<ul>\n<li><a href=\"install/introduction.md\">1 安装手册</a>\n<ul>\n<li><a href=\"install/provider-demo.md\">1.1 示例提供者安装</a></li>\n<li><a href=\"install/consumer-demo.md\">1.2 示例消费者安装</a></li>\n<li><a href=\"install/zookeeper.md\">1.3 Zookeeper 注册中心安装</a></li>\n<li><a href=\"install/redis.md\">1.4 Redis 注册中心安装</a></li>\n<li><a href=\"install/simple-registry-center.md\">1.5 Simple 注册中心安装</a></li>\n<li><a href=\"install/simple-monitor-center.md\">1.6 Simple 监控中心安装</a></li>\n<li><a href=\"install/admin-console.md\">1.7 管理控制台安装</a></li>\n</ul>\n</li>\n<li><a href=\"ops/introduction.md\">2 运维手册</a>\n<ul>\n<li><a href=\"ops/dubbo-ops.md\">2.1 管理控制台运维</a></li>\n</ul>\n</li>\n</ul>\n",
+  "link": "/zh-cn/docs/admin/SUMMARY.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/admin-console.json b/zh-cn/docs/admin/install/admin-console.json
index 6e4b79ec..a4246cb7 100644
--- a/zh-cn/docs/admin/install/admin-console.json
+++ b/zh-cn/docs/admin/install/admin-console.json
@@ -1,4 +1,6 @@
 {
   "filename": "admin-console.md",
-  "__html": "<h3>管理控制台安装</h3>\n<p>目前版本的管理控制台正在开发中,已经完成了服务查询和服务治理的功能,采用前后端分离的模式,具体的安装和使用步骤如下:</p>\n<p>安装:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo-ops.git /var/tmp/dubbo-ops\n<span class=\"hljs-built_in\">cd</span> /var/tmp/dubbo-ops\nmvn clean package\n</code></pre>\n<p>配置 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">配置文件为:\ndubbo-admin-backend/src/main/resources/application.properties\n主要的配置有:\ndubbo.registry.address=zookeeper://127.0.0.1:2181\n</code></pre>\n<p>启动:</p>\n<pre><code class=\"language-sh\">mvn --projects dubbo-admin-backend spring-boot:run\n</code></pre>\n<p>其他配置请访问github中的文档:</p>\n<pre><code class=\"language-sh\">https://github.com/apache/incubator-dubbo-ops\n</code></pre>\n<p>访问:</p>\n<pre><code>http://127.0.0.1:8080\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>当前版本中未实现登录功能,会在后续版本加上 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h3>管理控制台安装</h3>\n<p>目前版本的管理控制台正在开发中,已经完成了服务查询和服务治理的功能,采用前后端分离的模式,具体的安装和使用步骤如下:</p>\n<p>安装:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo-ops.git /var/tmp/dubbo-ops\n<span class=\"hljs-built_in\">cd</span> /var/tmp/dubbo-ops\nmvn clean package\n</code></pre>\n<p>配置 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">配置文件为:\ndubbo-admin-backend/src/main/resources/application.properties\n主要的配置有:\ndubbo.registry.address=zookeeper://127.0.0.1:2181\n</code></pre>\n<p>启动:</p>\n<pre><code class=\"language-sh\">mvn --projects dubbo-admin-backend spring-boot:run\n</code></pre>\n<p>其他配置请访问github中的文档:</p>\n<pre><code class=\"language-sh\">https://github.com/apache/incubator-dubbo-ops\n</code></pre>\n<p>访问:</p>\n<pre><code>http://127.0.0.1:8080\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>当前版本中未实现登录功能,会在后续版本加上 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/admin/install/admin-console.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/consumer-demo.json b/zh-cn/docs/admin/install/consumer-demo.json
index e86cad4f..7f5844ff 100644
--- a/zh-cn/docs/admin/install/consumer-demo.json
+++ b/zh-cn/docs/admin/install/consumer-demo.json
@@ -1,4 +1,6 @@
 {
   "filename": "consumer-demo.md",
-  "__html": "<h1>示例消费者安装</h1>\n<p>安装:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\n运行 dubbo-demo-consumer中的com.alibaba.dubbo.demo.consumer.Consumer\n请确保先启动Provider\n如果使用Intellij Idea 请加上-Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span>\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-consumer.xml\n修改其中的dubbo:registery,替换成Provider提供的注册中心地址\n</code></pre>\n"
+  "__html": "<h1>示例消费者安装</h1>\n<p>安装:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\n运行 dubbo-demo-consumer中的com.alibaba.dubbo.demo.consumer.Consumer\n请确保先启动Provider\n如果使用Intellij Idea 请加上-Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span>\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-consumer.xml\n修改其中的dubbo:registery,替换成Provider提供的注册中心地址\n</code></pre>\n",
+  "link": "/zh-cn/docs/admin/install/consumer-demo.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/introduction.json b/zh-cn/docs/admin/install/introduction.json
index afea6c48..8b5b87a9 100644
--- a/zh-cn/docs/admin/install/introduction.json
+++ b/zh-cn/docs/admin/install/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>安装手册</h1>\n<p>你可以只运行 Demo Provider 和 Demo Consumer,它们缺省配置为通过 Multicast  <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 注册中心广播互相发现,建议在不同机器上运行,如果在同一机器上,需设置 <code>unicast=false</code>:即: <code>multicast://224.5.6.7:1234?unicast=false</code>,否则发给消费者的单播消息可能被提供者抢占,两个消费者在同一台机器也一样,只有 multicast 注册中心有此问题。</p>\n<p>你也可以运行多个 Demo Provider 和 Demo Consumer,来验证软负载均衡,Demo Consumer 可以直接启动多个实例,而多个 Demo Provider 因有端口冲突,可在不同机器上运行,或者修改 Demo Provider 安装目录下 <code>conf/dubbo.properties</code> 配置中的 <code>dubbo.protocol.port</code> 的值。</p>\n<p>你也可以增加运行 Simple Monitor 监控中心,它缺省配置为通过 Multicast 注册中心广播发现 Provider 和 Consumer,并展示出它们的依赖关系,以及它们之间调用的次数和时间。</p>\n<p>你也可以将 Multicast 注册中心换成 Zookeeper 注册中心,安装 Zookeeper Registry 后,修改 Demo Proivder,Demo Consumer,Simple Monitor 三者安装目录下的 <code>conf/dubbo.properties</code>,将 <code>dubbo.registry.address</code> 的值改为 <code>zookeeper://127.0.0.1:2181</code>,同理,如果换成 Redis Registry,值改为 <code>redis://127.0.0.1:6379</code>,如果换成 Simple Registry,值改为 <code>dubbo://127.0.0.1:9090</code></p>\n<p>推荐使用 Zookeeper 注册中心</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:multicast 地址不能配成 127.0.0.1,也不能配成机器的 IP 地址,必须是 D 段广播地址,也就是:224.0.0.0 到 239.255.255.255 之间的任意地址 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>安装手册</h1>\n<p>你可以只运行 Demo Provider 和 Demo Consumer,它们缺省配置为通过 Multicast  <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 注册中心广播互相发现,建议在不同机器上运行,如果在同一机器上,需设置 <code>unicast=false</code>:即: <code>multicast://224.5.6.7:1234?unicast=false</code>,否则发给消费者的单播消息可能被提供者抢占,两个消费者在同一台机器也一样,只有 multicast 注册中心有此问题。</p>\n<p>你也可以运行多个 Demo Provider 和 Demo Consumer,来验证软负载均衡,Demo Consumer 可以直接启动多个实例,而多个 Demo Provider 因有端口冲突,可在不同机器上运行,或者修改 Demo Provider 安装目录下 <code>conf/dubbo.properties</code> 配置中的 <code>dubbo.protocol.port</code> 的值。</p>\n<p>你也可以增加运行 Simple Monitor 监控中心,它缺省配置为通过 Multicast 注册中心广播发现 Provider 和 Consumer,并展示出它们的依赖关系,以及它们之间调用的次数和时间。</p>\n<p>你也可以将 Multicast 注册中心换成 Zookeeper 注册中心,安装 Zookeeper Registry 后,修改 Demo Proivder,Demo Consumer,Simple Monitor 三者安装目录下的 <code>conf/dubbo.properties</code>,将 <code>dubbo.registry.address</code> 的值改为 <code>zookeeper://127.0.0.1:2181</code>,同理,如果换成 Redis Registry,值改为 <code>redis://127.0.0.1:6379</code>,如果换成 Simple Registry,值改为 <code>dubbo://127.0.0.1:9090</code></p>\n<p>推荐使用 Zookeeper 注册中心</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:multicast 地址不能配成 127.0.0.1,也不能配成机器的 IP 地址,必须是 D 段广播地址,也就是:224.0.0.0 到 239.255.255.255 之间的任意地址 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/admin/install/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/provider-demo.json b/zh-cn/docs/admin/install/provider-demo.json
index 6db6096b..7dc67d36 100644
--- a/zh-cn/docs/admin/install/provider-demo.json
+++ b/zh-cn/docs/admin/install/provider-demo.json
@@ -1,4 +1,6 @@
 {
   "filename": "provider-demo.md",
-  "__html": "<h1>示例提供者安装</h1>\n<p>安装:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\n运行 dubbo-demo-provider中的com.alibaba.dubbo.demo.provider.Provider\n如果使用Intellij Idea 请加上-Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span>\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-provider.xml\n修改其中的dubbo:registery,替换成真实的注册中心地址,推荐使用zookeeper\n</code></pre>\n"
+  "__html": "<h1>示例提供者安装</h1>\n<p>安装:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git\n<span class=\"hljs-built_in\">cd</span> incubator-dubbo\n运行 dubbo-demo-provider中的com.alibaba.dubbo.demo.provider.Provider\n如果使用Intellij Idea 请加上-Djava.net.preferIPv4Stack=<span class=\"hljs-literal\">true</span>\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">resource/META-INFO.spring/dubbo-demo-provider.xml\n修改其中的dubbo:registery,替换成真实的注册中心地址,推荐使用zookeeper\n</code></pre>\n",
+  "link": "/zh-cn/docs/admin/install/provider-demo.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/redis.json b/zh-cn/docs/admin/install/redis.json
index 123ab27f..a951220e 100644
--- a/zh-cn/docs/admin/install/redis.json
+++ b/zh-cn/docs/admin/install/redis.json
@@ -1,4 +1,6 @@
 {
   "filename": "redis.md",
-  "__html": "<h1>Redis 注册中心安装</h1>\n<p>Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 使用方式参见: <a href=\"http://dubbo.apache.org/books/dubbo-user-book/references/registry/redis.html\">Redis 注册中心参考手册</a>。</p>\n<p>只需搭一个原生的 Redis 服务器,并将<a href=\"http://dubbo.apache.org/books/dubbo-user-book/quick-start.html\">快速启动</a>中 Provider 和 Consumer 里的 <code>conf/dubbo.properties</code> 中的 <code>dubbo.registry.addrss</code> 的值改为 <code>redis://127.0.0.1:6379</code> 即可使用。</p>\n<p>Redis 注册中心集群 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> 采用在客户端同时写入多个服务器,读取单个服务器的策略实现。</p>\n<p>安装:</p>\n<pre><code class=\"language-sh\">wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz\ntar xzf redis-2.4.8.tar.gz\n<span class=\"hljs-built_in\">cd</span> redis-2.4.8\nmake\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">vi redis.conf\n</code></pre>\n<p>启动:</p>\n<pre><code class=\"language-sh\">nohup ./src/redis-server redis.conf &amp;\n</code></pre>\n<p>停止:</p>\n<pre><code class=\"language-sh\">killall redis-server\n</code></pre>\n<ul>\n<li>命令行 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</li>\n</ul>\n<pre><code class=\"language-sh\">./src/redis-cli\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 6379\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Redis 是一个高效的 KV 存储服务器,参见:<a href=\"http://redis.io/topics/quickstart\">http://redis.io/topics/quickstart</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><code>2.1.0</code> 以上版本支持 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>参见: <a href=\"http://redis.io/commands\">http://redis.io/commands</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Redis 注册中心安装</h1>\n<p>Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 使用方式参见: <a href=\"http://dubbo.apache.org/books/dubbo-user-book/references/registry/redis.html\">Redis 注册中心参考手册</a>。</p>\n<p>只需搭一个原生的 Redis 服务器,并将<a href=\"http://dubbo.apache.org/books/dubbo-user-book/quick-start.html\">快速启动</a>中 Provider 和 Consumer 里的 <code>conf/dubbo.properties</code> 中的 <code>dubbo.registry.addrss</code> 的值改为 <code>redis://127.0.0.1:6379</code> 即可使用。</p>\n<p>Redis 注册中心集群 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> 采用在客户端同时写入多个服务器,读取单个服务器的策略实现。</p>\n<p>安装:</p>\n<pre><code class=\"language-sh\">wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz\ntar xzf redis-2.4.8.tar.gz\n<span class=\"hljs-built_in\">cd</span> redis-2.4.8\nmake\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">vi redis.conf\n</code></pre>\n<p>启动:</p>\n<pre><code class=\"language-sh\">nohup ./src/redis-server redis.conf &amp;\n</code></pre>\n<p>停止:</p>\n<pre><code class=\"language-sh\">killall redis-server\n</code></pre>\n<ul>\n<li>命令行 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</li>\n</ul>\n<pre><code class=\"language-sh\">./src/redis-cli\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 6379\nhgetall /dubbo/com.foo.BarService/providers\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Redis 是一个高效的 KV 存储服务器,参见:<a href=\"http://redis.io/topics/quickstart\">http://redis.io/topics/quickstart</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><code>2.1.0</code> 以上版本支持 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>参见: <a href=\"http://redis.io/commands\">http://redis.io/commands</a> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/admin/install/redis.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/simple-monitor-center.json b/zh-cn/docs/admin/install/simple-monitor-center.json
index c22ce0dc..49905cd6 100644
--- a/zh-cn/docs/admin/install/simple-monitor-center.json
+++ b/zh-cn/docs/admin/install/simple-monitor-center.json
@@ -1,4 +1,6 @@
 {
   "filename": "simple-monitor-center.md",
-  "__html": "<h1>Simple 监控中心安装</h1>\n<h4>不再单独提供监控中心,功能会整合到运维控制台,基于Metrics提供更丰富,实时的信息展示,敬请期待</h4>\n"
+  "__html": "<h1>Simple 监控中心安装</h1>\n<h4>不再单独提供监控中心,功能会整合到运维控制台,基于Metrics提供更丰富,实时的信息展示,敬请期待</h4>\n",
+  "link": "/zh-cn/docs/admin/install/simple-monitor-center.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/simple-registry-center.json b/zh-cn/docs/admin/install/simple-registry-center.json
index 025d70ce..4aba1483 100644
--- a/zh-cn/docs/admin/install/simple-registry-center.json
+++ b/zh-cn/docs/admin/install/simple-registry-center.json
@@ -1,4 +1,6 @@
 {
   "filename": "simple-registry-center.md",
-  "__html": "<h1>Simple 注册中心安装</h1>\n"
+  "__html": "<h1>Simple 注册中心安装</h1>\n",
+  "link": "/zh-cn/docs/admin/install/simple-registry-center.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/install/zookeeper.json b/zh-cn/docs/admin/install/zookeeper.json
index 621eb4af..f9a20076 100644
--- a/zh-cn/docs/admin/install/zookeeper.json
+++ b/zh-cn/docs/admin/install/zookeeper.json
@@ -1,4 +1,6 @@
 {
   "filename": "zookeeper.md",
-  "__html": "<h1>Zookeeper 注册中心安装</h1>\n<p>建议使用 <code>dubbo-2.3.3</code> 以上版本的 zookeeper <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 注册中心客户端。</p>\n<p>Dubbo 未对 Zookeeper 服务器端做任何侵入修改,只需安装原生的 Zookeeper 服务器即可,所有注册中心逻辑适配都在调用 Zookeeper 客户端时完成。</p>\n<p>安装:</p>\n<pre><code class=\"language-sh\">wget http://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz\ntar zxvf zookeeper-3.3.3.tar.gz\n<span class=\"hljs-built_in\">cd</span> zookeeper-3.3.3\ncp conf/zoo_sample.cfg conf/zoo.cfg\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">vi conf/zoo.cfg\n</code></pre>\n<p>如果不需要集群,<code>zoo.cfg</code> 的内容如下 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n</code></pre>\n<p>如果需要集群,<code>zoo.cfg</code> 的内容如下 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n<span class=\"hljs-meta\">server.1</span>=<span class=\"hljs-string\">10.20.153.10:2555:3555</span>\n<span class=\"hljs-meta\">server.2</span>=<span class=\"hljs-string\">10.20.153.11:2555:3555</span>\n</code></pre>\n<p>并在 data 目录 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> 下放置 myid 文件:</p>\n<pre><code class=\"language-sh\">mkdir data\nvi myid\n</code></pre>\n<p>myid 指明自己的 id,对应上面 <code>zoo.cfg</code> 中 <code>server.</code> 后的数字,第一台的内容为 1,第二台的内容为 2,内容如下:</p>\n<pre><code>1\n</code></pre>\n<p>启动:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh start\n</code></pre>\n<p>停止:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh stop\n</code></pre>\n<p>命令行 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 2181\ndump\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-shell\">echo dump | nc 127.0.0.1 2181\n</code></pre>\n<p>用法:</p>\n<pre><code class=\"language-xml\">dubbo.registry.address=zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181,10.20.153.11:2181\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Zookeeper是 Apache Hadoop 的子项目,强度相对较好,建议生产环境使用该注册中心 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>其中 data 目录需改成你真实输出目录 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>其中 data 目录和 server 地址需改成你真实部署机器的信息 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>上面 <code>zoo.cfg</code> 中的 <code>dataDir</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><a href=\"http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html\">http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Zookeeper 注册中心安装</h1>\n<p>建议使用 <code>dubbo-2.3.3</code> 以上版本的 zookeeper <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 注册中心客户端。</p>\n<p>Dubbo 未对 Zookeeper 服务器端做任何侵入修改,只需安装原生的 Zookeeper 服务器即可,所有注册中心逻辑适配都在调用 Zookeeper 客户端时完成。</p>\n<p>安装:</p>\n<pre><code class=\"language-sh\">wget http://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz\ntar zxvf zookeeper-3.3.3.tar.gz\n<span class=\"hljs-built_in\">cd</span> zookeeper-3.3.3\ncp conf/zoo_sample.cfg conf/zoo.cfg\n</code></pre>\n<p>配置:</p>\n<pre><code class=\"language-sh\">vi conf/zoo.cfg\n</code></pre>\n<p>如果不需要集群,<code>zoo.cfg</code> 的内容如下 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n</code></pre>\n<p>如果需要集群,<code>zoo.cfg</code> 的内容如下 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">tickTime</span>=<span class=\"hljs-string\">2000</span>\n<span class=\"hljs-attr\">initLimit</span>=<span class=\"hljs-string\">10</span>\n<span class=\"hljs-attr\">syncLimit</span>=<span class=\"hljs-string\">5</span>\n<span class=\"hljs-attr\">dataDir</span>=<span class=\"hljs-string\">/home/dubbo/zookeeper-3.3.3/data</span>\n<span class=\"hljs-attr\">clientPort</span>=<span class=\"hljs-string\">2181</span>\n<span class=\"hljs-meta\">server.1</span>=<span class=\"hljs-string\">10.20.153.10:2555:3555</span>\n<span class=\"hljs-meta\">server.2</span>=<span class=\"hljs-string\">10.20.153.11:2555:3555</span>\n</code></pre>\n<p>并在 data 目录 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> 下放置 myid 文件:</p>\n<pre><code class=\"language-sh\">mkdir data\nvi myid\n</code></pre>\n<p>myid 指明自己的 id,对应上面 <code>zoo.cfg</code> 中 <code>server.</code> 后的数字,第一台的内容为 1,第二台的内容为 2,内容如下:</p>\n<pre><code>1\n</code></pre>\n<p>启动:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh start\n</code></pre>\n<p>停止:</p>\n<pre><code class=\"language-sh\">./bin/zkServer.sh stop\n</code></pre>\n<p>命令行 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>:</p>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 2181\ndump\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-shell\">echo dump | nc 127.0.0.1 2181\n</code></pre>\n<p>用法:</p>\n<pre><code class=\"language-xml\">dubbo.registry.address=zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"zookeeper\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:2181,10.20.153.11:2181\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Zookeeper是 Apache Hadoop 的子项目,强度相对较好,建议生产环境使用该注册中心 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>其中 data 目录需改成你真实输出目录 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>其中 data 目录和 server 地址需改成你真实部署机器的信息 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>上面 <code>zoo.cfg</code> 中的 <code>dataDir</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><a href=\"http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html\">http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/admin/install/zookeeper.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/ops/dubbo-ops.json b/zh-cn/docs/admin/ops/dubbo-ops.json
index de8f5a38..d4d9ba9a 100644
--- a/zh-cn/docs/admin/ops/dubbo-ops.json
+++ b/zh-cn/docs/admin/ops/dubbo-ops.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo-ops.md",
-  "__html": "<h1>管理控制台运维</h1>\n<h2>搜索页面</h2>\n<p>当你需要管理 Dubbo 的服务时,首先要搜索到这个服务,然后打开它的管理页面</p>\n<p><img src=\"../sources/images/dubbo-search.jpg\" alt=\"/admin-guide/images/dubbo-search.png\"></p>\n<h2>服务提供者页面</h2>\n<p><img src=\"../sources/images/dubbo-providers.jpg\" alt=\"/admin-guide/images/dubbo-providers.png\"></p>\n<h2>服务消费者页面</h2>\n<p><img src=\"../sources/images/dubbo-consumers.jpg\" alt=\"/admin-guide/images/dubbo-consumers.png\"></p>\n<h2>添加路由规则页面</h2>\n<p><img src=\"../sources/images/dubbo-add-route.jpg\" alt=\"/admin-guide/images/dubbo-add-route.png\"></p>\n<h2>添加动态配置页面</h2>\n<p><img src=\"../sources/images/dubbo-add-config.jpg\" alt=\"/admin-guide/images/dubbo-add-config.png\"></p>\n<h5></h5>\n"
+  "__html": "<h1>管理控制台运维</h1>\n<h2>搜索页面</h2>\n<p>当你需要管理 Dubbo 的服务时,首先要搜索到这个服务,然后打开它的管理页面</p>\n<p><img src=\"../sources/images/dubbo-search.jpg\" alt=\"/admin-guide/images/dubbo-search.png\"></p>\n<h2>服务提供者页面</h2>\n<p><img src=\"../sources/images/dubbo-providers.jpg\" alt=\"/admin-guide/images/dubbo-providers.png\"></p>\n<h2>服务消费者页面</h2>\n<p><img src=\"../sources/images/dubbo-consumers.jpg\" alt=\"/admin-guide/images/dubbo-consumers.png\"></p>\n<h2>添加路由规则页面</h2>\n<p><img src=\"../sources/images/dubbo-add-route.jpg\" alt=\"/admin-guide/images/dubbo-add-route.png\"></p>\n<h2>添加动态配置页面</h2>\n<p><img src=\"../sources/images/dubbo-add-config.jpg\" alt=\"/admin-guide/images/dubbo-add-config.png\"></p>\n<h5></h5>\n",
+  "link": "/zh-cn/docs/admin/ops/dubbo-ops.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/ops/introduction.json b/zh-cn/docs/admin/ops/introduction.json
index fb7fc28c..0f1c828d 100644
--- a/zh-cn/docs/admin/ops/introduction.json
+++ b/zh-cn/docs/admin/ops/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>运维手册</h1>\n"
+  "__html": "<h1>运维手册</h1>\n",
+  "link": "/zh-cn/docs/admin/ops/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/ops/pinpoint.json b/zh-cn/docs/admin/ops/pinpoint.json
index 37b2006d..aa9cb949 100644
--- a/zh-cn/docs/admin/ops/pinpoint.json
+++ b/zh-cn/docs/admin/ops/pinpoint.json
@@ -1,4 +1,6 @@
 {
   "filename": "pinpoint.md",
-  "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。</p>\n<blockquote>\n<p>注:对于各个模块之间的通讯英文原文中用的是transaction一词,但是我觉得如果翻译为&quot;事务&quot;容易引起误解,所以替换为&quot;交互&quot;或者&quot;调用&quot;这种比较直白的字眼。</p>\n</blockquote>\n<p>在使用上力图简单高效:</p>\n<ul>\n<li>安装agent,不需要修改哪怕一行代码</li>\n<li>最小化性能损失</li>\n</ul>\n<h3>服务器地图(ServerMap)</h3>\n<p>通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量。</p>\n<h3>实时活动线程图表(Realtime Active Thread Chart)</h3>\n<p>实时监控应用内部的活动线程。</p>\n<h3>请求/应答分布图表(Request/Response Scatter Chart)</h3>\n<p>长期可视化请求数量和应答模式来定位潜在问题。通过在图表上拉拽可以选择请求查看更多的详细信息。</p>\n<h3>调用栈(CallStack)</h3>\n<p>在分布式环境中为每个调用生成代码级别的可视图,在单个视图中定位瓶颈和失败点。</p>\n<h3>巡查(Inspector)</h3>\n<p>查看应用上的其他详细信息,比如CPU使用率,内存/垃圾回收,TPS,和JVM参数。</p>\n<h3>支持模块</h3>\n<ul>\n<li>JDK 6+</li>\n<li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li>\n<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>\n<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>\n<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>\n<li>ActiveMQ, RabbitMQ</li>\n<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>\n<li>Arcus, Memcached, Redis, CASSANDRA</li>\n<li>iBATIS, MyBatis</li>\n<li>DBCP, DBCP2, HIKARICP</li>\n<li>gson, Jackson, Json Lib</li>\n<li>log4j, Logback</li>\n<li>自定义模块</li>\n</ul>\n<h2>Pinpoint与Dubbo的结合</h2>\n<h3>启动Pinpoint</h3>\n<p>参考Pinpoint的<a href=\"http://naver.github.io/pinpoint/quickstart.html\">Quick start</a>搭建环境(不需要启动TestApp)</p>\n<h3>准备Dubbo示例程序</h3>\n<h4>创建API包</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span>\n         <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n         <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<p>新建API接口:</p>\n<pre><code>package com.example.demoapi;\n\npublic interface HelloService {\n    String sayHello(String name);\n}\n</code></pre>\n<h4>实现 Dubbo 服务提供方</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li>实现 <code>HelloService</code> 接口:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider.provider;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n\n<span class=\"hljs-meta\">@Service</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n        application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n        protocol = <span class=\"hljs-string\">\"${dubbo.protocol.id}\"</span>,\n        registry = <span class=\"hljs-string\">\"${dubbo.registry.id}\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        i++;\n        <span class=\"hljs-keyword\">if</span> (i % <span class=\"hljs-number\">3</span> == <span class=\"hljs-number\">0</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"ex\"</span>);\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\"!\"</span>;\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>编写 Spring Boot 引导程序:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoProviderApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li>配置 <code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">server.port</span> = <span class=\"hljs-string\">9090</span>\n<span class=\"hljs-meta\">management.port</span> = <span class=\"hljs-string\">9091</span>\n<span class=\"hljs-comment\">\n# Service version</span>\n<span class=\"hljs-meta\">demo.service.version</span> = <span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Base packages to scan Dubbo Components (e.g @Service , @Reference)</span>\n<span class=\"hljs-meta\">dubbo.scan.basePackages</span>  = <span class=\"hljs-string\">com.example.demoprovider</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span> = <span class=\"hljs-string\">12345</span>\n<span class=\"hljs-comment\">\n## RegistryConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.registry.id</span> = <span class=\"hljs-string\">my-registry</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span> = <span class=\"hljs-string\">N/A</span>\n</code></pre>\n<h4>实现 Dubbo 服务消费方</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classifier</span>&gt;</span>exec<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">classifier</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li>通过 <code>@Reference</code> 注入 <code>HelloService</code></li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer.controller;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Reference;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestMapping;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RestController;\n\n<span class=\"hljs-meta\">@RestController</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerController</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n            application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n            url = <span class=\"hljs-string\">\"dubbo://&lt;注意,这里填写具体IP&gt;:12345\"</span>)\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-meta\">@RequestMapping</span>(<span class=\"hljs-string\">\"/sayHello\"</span>)\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(@RequestParam String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> helloService.sayHello(name);\n    }\n}\n</code></pre>\n<blockquote>\n<p>直连提供者调用需要填写具体IP地址,如果写localhost也可以,但是会被Pinpoint额外识别为一个未知服务</p>\n</blockquote>\n<ol start=\"2\">\n<li>编写 Spring Boot 引导程序(Web 应用):</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoConsumerApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li>配置 <code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">server.port</span>=<span class=\"hljs-string\">8080</span>\n<span class=\"hljs-meta\">management.port</span>=<span class=\"hljs-string\">8081</span>\n<span class=\"hljs-comment\">\n# Service Version</span>\n<span class=\"hljs-meta\">demo.service.version</span>=<span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">12345</span>\n</code></pre>\n<h3>使用Pinpoint-agent启动服务提供方和服务消费方</h3>\n<h4>启动服务提供方</h4>\n<ol>\n<li>编译打包</li>\n</ol>\n<pre><code>mvn clean package\n</code></pre>\n<ol start=\"2\">\n<li>附加参数启动服务提供方</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar\n</code></pre>\n<ol start=\"3\">\n<li>附加参数启动服务消费方</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-consumer -Dpinpoint.applicationName=DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar\n</code></pre>\n<ol start=\"4\">\n<li>访问消费方地址模拟用户请求</li>\n</ol>\n<p><code>http://localhost:8080/sayHello?name=ABC</code></p>\n<h2>使用Pinpoint快速定位问题</h2>\n<h3>首页</h3>\n<p><img src=\"../sources/images/pinpoint-home.png\" alt=\"/admin-guide/images/pinpoint-home.png\"></p>\n<blockquote>\n<p>这里的用户请求是请求DubboProvider数量的双倍,原因是记录了favicon.ico图标请求导致的</p>\n</blockquote>\n<h3>调用树</h3>\n<p><img src=\"../sources/images/pinpoint-calltree.png\" alt=\"/admin-guide/images/pinpoint-calltree.png\"></p>\n<h3>深入跟踪</h3>\n<p><img src=\"../sources/images/pinpoint-mixedview.png\" alt=\"/admin-guide/images/pinpoint-mixedview.png\"></p>\n<h3>其他</h3>\n<p>示例简单的模拟了Dubbo的提供和调用,并没有进行数据库等其他中间件的应用,详细使用请参照Pinpoint文档。</p>\n"
+  "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。</p>\n<blockquote>\n<p>注:对于各个模块之间的通讯英文原文中用的是transaction一词,但是我觉得如果翻译为&quot;事务&quot;容易引起误解,所以替换为&quot;交互&quot;或者&quot;调用&quot;这种比较直白的字眼。</p>\n</blockquote>\n<p>在使用上力图简单高效:</p>\n<ul>\n<li>安装agent,不需要修改哪怕一行代码</li>\n<li>最小化性能损失</li>\n</ul>\n<h3>服务器地图(ServerMap)</h3>\n<p>通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量。</p>\n<h3>实时活动线程图表(Realtime Active Thread Chart)</h3>\n<p>实时监控应用内部的活动线程。</p>\n<h3>请求/应答分布图表(Request/Response Scatter Chart)</h3>\n<p>长期可视化请求数量和应答模式来定位潜在问题。通过在图表上拉拽可以选择请求查看更多的详细信息。</p>\n<h3>调用栈(CallStack)</h3>\n<p>在分布式环境中为每个调用生成代码级别的可视图,在单个视图中定位瓶颈和失败点。</p>\n<h3>巡查(Inspector)</h3>\n<p>查看应用上的其他详细信息,比如CPU使用率,内存/垃圾回收,TPS,和JVM参数。</p>\n<h3>支持模块</h3>\n<ul>\n<li>JDK 6+</li>\n<li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li>\n<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>\n<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>\n<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>\n<li>ActiveMQ, RabbitMQ</li>\n<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>\n<li>Arcus, Memcached, Redis, CASSANDRA</li>\n<li>iBATIS, MyBatis</li>\n<li>DBCP, DBCP2, HIKARICP</li>\n<li>gson, Jackson, Json Lib</li>\n<li>log4j, Logback</li>\n<li>自定义模块</li>\n</ul>\n<h2>Pinpoint与Dubbo的结合</h2>\n<h3>启动Pinpoint</h3>\n<p>参考Pinpoint的<a href=\"http://naver.github.io/pinpoint/quickstart.html\">Quick start</a>搭建环境(不需要启动TestApp)</p>\n<h3>准备Dubbo示例程序</h3>\n<h4>创建API包</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span>\n         <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n         <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<p>新建API接口:</p>\n<pre><code>package com.example.demoapi;\n\npublic interface HelloService {\n    String sayHello(String name);\n}\n</code></pre>\n<h4>实现 Dubbo 服务提供方</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-provider<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li>实现 <code>HelloService</code> 接口:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider.provider;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n\n<span class=\"hljs-meta\">@Service</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n        application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n        protocol = <span class=\"hljs-string\">\"${dubbo.protocol.id}\"</span>,\n        registry = <span class=\"hljs-string\">\"${dubbo.registry.id}\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HelloServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">HelloService</span> </span>{\n    <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>;\n    <span class=\"hljs-meta\">@Override</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        i++;\n        <span class=\"hljs-keyword\">if</span> (i % <span class=\"hljs-number\">3</span> == <span class=\"hljs-number\">0</span>) {\n            <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> RuntimeException(<span class=\"hljs-string\">\"ex\"</span>);\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name + <span class=\"hljs-string\">\"!\"</span>;\n    }\n}\n</code></pre>\n<ol start=\"2\">\n<li>编写 Spring Boot 引导程序:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.demoprovider;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoProviderApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoProviderApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li>配置 <code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">server.port</span> = <span class=\"hljs-string\">9090</span>\n<span class=\"hljs-meta\">management.port</span> = <span class=\"hljs-string\">9091</span>\n<span class=\"hljs-comment\">\n# Service version</span>\n<span class=\"hljs-meta\">demo.service.version</span> = <span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Base packages to scan Dubbo Components (e.g @Service , @Reference)</span>\n<span class=\"hljs-meta\">dubbo.scan.basePackages</span>  = <span class=\"hljs-string\">com.example.demoprovider</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span> = <span class=\"hljs-string\">dubbo-provider-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span> = <span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span> = <span class=\"hljs-string\">12345</span>\n<span class=\"hljs-comment\">\n## RegistryConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.registry.id</span> = <span class=\"hljs-string\">my-registry</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span> = <span class=\"hljs-string\">N/A</span>\n</code></pre>\n<h4>实现 Dubbo 服务消费方</h4>\n<p>pom.xml</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0\"</span> <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n\t<span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion</span>&gt;</span>4.0.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">modelVersion</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">packaging</span>&gt;</span>jar<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">packaging</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name</span>&gt;</span>demo-consumer<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">name</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>2.0.3.RELEASE<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath</span>/&gt;</span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">parent</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.build.sourceEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>UTF-8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project.reporting.outputEncoding</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version</span>&gt;</span>1.8<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">java.version</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">properties</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repositories</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repository</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">id</span>&gt;</span>sonatype-nexus-snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">id</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url</span>&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>false<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">releases</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">enabled</span>&gt;</span>true<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">enabled</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">snapshots</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repository</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">repositories</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.alibaba.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>dubbo-spring-boot-starter<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.2.0<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.example<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>demo-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope</span>&gt;</span>test<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">scope</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependencies</span>&gt;</span>\n\n\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.springframework.boot<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t\t\t<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classifier</span>&gt;</span>exec<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">classifier</span>&gt;</span>\n\t\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">configuration</span>&gt;</span>\n\t\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugin</span>&gt;</span>\n\t\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">plugins</span>&gt;</span>\n\t<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">build</span>&gt;</span>\n\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">project</span>&gt;</span>\n</code></pre>\n<ol>\n<li>通过 <code>@Reference</code> 注入 <code>HelloService</code></li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer.controller;\n\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Reference;\n<span class=\"hljs-keyword\">import</span> com.example.demoapi.HelloService;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestMapping;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import</span> org.springframework.web.bind.annotation.RestController;\n\n<span class=\"hljs-meta\">@RestController</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerController</span> </span>{\n    <span class=\"hljs-meta\">@Reference</span>(version = <span class=\"hljs-string\">\"${demo.service.version}\"</span>,\n            application = <span class=\"hljs-string\">\"${dubbo.application.id}\"</span>,\n            url = <span class=\"hljs-string\">\"dubbo://&lt;注意,这里填写具体IP&gt;:12345\"</span>)\n    <span class=\"hljs-keyword\">private</span> HelloService helloService;\n\n    <span class=\"hljs-meta\">@RequestMapping</span>(<span class=\"hljs-string\">\"/sayHello\"</span>)\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(@RequestParam String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> helloService.sayHello(name);\n    }\n}\n</code></pre>\n<blockquote>\n<p>直连提供者调用需要填写具体IP地址,如果写localhost也可以,但是会被Pinpoint额外识别为一个未知服务</p>\n</blockquote>\n<ol start=\"2\">\n<li>编写 Spring Boot 引导程序(Web 应用):</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.example.democonsumer;\n\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.SpringApplication;\n<span class=\"hljs-keyword\">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;\n\n<span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoConsumerApplication</span> </span>{\n\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> </span>{\n\t\tSpringApplication.run(DemoConsumerApplication.class, args);\n\t}\n}\n</code></pre>\n<ol start=\"3\">\n<li>配置 <code>application.properties</code>:</li>\n</ol>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># Spring boot application</span>\n<span class=\"hljs-meta\">spring.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">server.port</span>=<span class=\"hljs-string\">8080</span>\n<span class=\"hljs-meta\">management.port</span>=<span class=\"hljs-string\">8081</span>\n<span class=\"hljs-comment\">\n# Service Version</span>\n<span class=\"hljs-meta\">demo.service.version</span>=<span class=\"hljs-string\">1.0.0</span>\n<span class=\"hljs-comment\">\n# Dubbo Config properties</span>\n<span class=\"hljs-comment\">## ApplicationConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.application.id</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">dubbo-consumer-demo</span>\n<span class=\"hljs-comment\">\n## ProtocolConfig Bean</span>\n<span class=\"hljs-meta\">dubbo.protocol.id</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.name</span>=<span class=\"hljs-string\">dubbo</span>\n<span class=\"hljs-meta\">dubbo.protocol.port</span>=<span class=\"hljs-string\">12345</span>\n</code></pre>\n<h3>使用Pinpoint-agent启动服务提供方和服务消费方</h3>\n<h4>启动服务提供方</h4>\n<ol>\n<li>编译打包</li>\n</ol>\n<pre><code>mvn clean package\n</code></pre>\n<ol start=\"2\">\n<li>附加参数启动服务提供方</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar\n</code></pre>\n<ol start=\"3\">\n<li>附加参数启动服务消费方</li>\n</ol>\n<pre><code>java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-consumer -Dpinpoint.applicationName=DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar\n</code></pre>\n<ol start=\"4\">\n<li>访问消费方地址模拟用户请求</li>\n</ol>\n<p><code>http://localhost:8080/sayHello?name=ABC</code></p>\n<h2>使用Pinpoint快速定位问题</h2>\n<h3>首页</h3>\n<p><img src=\"../sources/images/pinpoint-home.png\" alt=\"/admin-guide/images/pinpoint-home.png\"></p>\n<blockquote>\n<p>这里的用户请求是请求DubboProvider数量的双倍,原因是记录了favicon.ico图标请求导致的</p>\n</blockquote>\n<h3>调用树</h3>\n<p><img src=\"../sources/images/pinpoint-calltree.png\" alt=\"/admin-guide/images/pinpoint-calltree.png\"></p>\n<h3>深入跟踪</h3>\n<p><img src=\"../sources/images/pinpoint-mixedview.png\" alt=\"/admin-guide/images/pinpoint-mixedview.png\"></p>\n<h3>其他</h3>\n<p>示例简单的模拟了Dubbo的提供和调用,并没有进行数据库等其他中间件的应用,详细使用请参照Pinpoint文档。</p>\n",
+  "link": "/zh-cn/docs/admin/ops/pinpoint.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/admin/ops/skywalking.json b/zh-cn/docs/admin/ops/skywalking.json
index cc93108e..7cbba179 100644
--- a/zh-cn/docs/admin/ops/skywalking.json
+++ b/zh-cn/docs/admin/ops/skywalking.json
@@ -1,4 +1,6 @@
 {
   "filename": "skywalking.md",
-  "__html": "<h1>使用Apache Skywalking (Incubator) 做分布式跟踪</h1>\n<h2>Apache Skywalking(Incubator)简介</h2>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a> 专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统。<a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a>通过加载探针的方式收集应用调用链路信息,并对采集的调用链路信息进行分析,生成应用间关系和服务间关系以及服务指标。<a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking (Incubating)</a>目前支持多种语言,其中包括<a href=\"https://github.com/apache/incubator-skywalking\">Java</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-netcore\">.Net Core</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-nodejs\">Node.js</a>和<a href=\"https://github.com/OpenSkywalking/skywalking-go\">Go</a>语言。</p>\n<p>目前Skywalking已经支持从6个可视化维度剖析分布式系统的运行情况。总览视图是应用和组件的全局视图,其中包括组件和应用数量,应用的告警波动,慢服务列表以及应用吞吐量;拓扑图从应用依赖关系出发,展现整个应用的拓扑关系;应用视图则是从单个应用的角度,展现应用的上下游关系,TopN的服务和服务器,JVM的相关信息以及对应的主机信息。服务视图关注单个服务入口的运行情况以及此服务的上下游依赖关系,依赖度,帮助用户针对单个服务的优化和监控;调用链展现了调用的单次请求经过的所有埋点以及每个埋点的执行时长;告警视图根据配置阈值针对应用、服务器、服务进行实时告警。</p>\n<h2>Dubbo与Apache Skywalking(Incubator)</h2>\n<h3>编写Dubbo示例程序</h3>\n<p>Dubbo实例程序已上传到<a href=\"https://github.com/SkywalkingTest/dubbo-trace-example\">Github仓库</a>中。方便大家下载使用。</p>\n<h4>API工程</h4>\n<p>服务接口:</p>\n<pre><code>package org.apache.skywalking.demo.interfaces;\n\npublic interface HelloService {\n\tString sayHello(String name);\n}\n</code></pre>\n<h4>Dubbo服务提供工程</h4>\n<pre><code>package org.apache.skywalking.demo.provider;\n\n@Service(version = &quot;${demo.service.version}&quot;,\n\tapplication = &quot;${dubbo.application.id}&quot;,\n\tprotocol = &quot;${dubbo.protocol.id}&quot;,\n\tregistry = &quot;${dubbo.registry.id}&quot;, timeout = 60000)\npublic class HelloServiceImpl implements HelloService {\n\n\tpublic String sayHello(String name) {\n\t\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));\n\t\treturn &quot;Hello, &quot; + name;\n\t}\n\n}\n</code></pre>\n<h4>Consumer工程</h4>\n<pre><code>package org.apache.skywalking.demo.consumer;\n\n@RestController\npublic class ConsumerController {\n\n\tprivate static int COUNT = 0;\n\n\t@Reference(version = &quot;${demo.service.version}&quot;,\n\t\tapplication = &quot;${dubbo.application.id}&quot;,\n\t\turl = &quot;dubbo://localhost:20880&quot;, timeout = 60000)\n\tprivate HelloService helloService;\n\n\t@GetMapping(&quot;/sayHello/{name}&quot;)\n\tpublic String sayHello(@PathVariable(name = &quot;name&quot;) String name) {\n\t\tif ((COUNT++) % 3 == 0){\n\t\t\tthrow new RuntimeException();\n\t\t}\n\t\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));\n\t\treturn helloService.sayHello(name);\n\t}\n}\n</code></pre>\n<h3>部署Apache Skywalking(Incubator)</h3>\n<p>Apache Skywalking(Incubator)共提供两种部署模式:单节点模式和集群模式,以下为单节点模式部署步骤,集群模式部署详情参考<a href=\"https://github.com/apache/incubator-skywalking/blob/master/docs/cn/Deploy-backend-in-cluster-mode-CN.md\">文档</a>。</p>\n<h4>依赖第三方组件</h4>\n<ol>\n<li>JDK8+</li>\n<li>Elasticsearch 5.x</li>\n</ol>\n<h4>部署步骤</h4>\n<ol>\n<li>下载<a href=\"http://skywalking.apache.org/downloads/\"> Apache Skywalking Collector</a></li>\n<li>部署ElasticSearch\n<ul>\n<li>修改elasticsearch.yml文件,并设置<code>cluster.name</code>设置成<code>CollectorDBCluster</code>。此名称需要和collector配置文件一致。</li>\n<li>修改ES配置<code>network.host</code>值,将<code>network.host</code>的值修改成<code>0.0.0.0</code>。</li>\n<li>启动Elasticsearch</li>\n</ul>\n</li>\n<li>解压并启动Skywalking Collector。运行<code>bin/startup.sh</code>命令即可启动Skywalking Collector</li>\n</ol>\n<h4>启动示例程序</h4>\n<p>在启动示例程序之前,执行编译打包的命令:</p>\n<pre><code>./mvnw clean package\n</code></pre>\n<h4>启动服务提供端</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar\n</code></pre>\n<h4>启动服务消费端</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar \n</code></pre>\n<h4>访问消费端提供的服务</h4>\n<pre><code>curl http://localhost:8080/sayHello/test\n</code></pre>\n<h2>Skywalking监控截图:</h2>\n<h3>首页</h3>\n<p><img src=\"../sources/images/skywalking-dashboard.png\" alt=\"/admin-guide/images/skywalking-dashboard.png\"></p>\n<h3>拓扑图</h3>\n<p><img src=\"../sources/images/skywalking-topology.png\" alt=\"/admin-guide/images/skywalking-topology.png\"></p>\n<h3>应用视图</h3>\n<p><img src=\"../sources/images/skywalking-application.png\" alt=\"/admin-guide/images/skywalking-application.png\"></p>\n<p>JVM信息\n<img src=\"../sources/images/skywalking-application_instance.png\" alt=\"/admin-guide/images/skywalking-application_instance.png\"></p>\n<h3>服务视图</h3>\n<p>服务消费端:\n<img src=\"../sources/images/skywalking-service-consumer.png\" alt=\"/admin-guide/images/skywalking-service-consumer.png\"></p>\n<p>服务提供端:\n<img src=\"../sources/images/skywalking-service-provider.png\" alt=\"/admin-guide/images/skywalking-service-provider.png\"></p>\n<h3>Trace视图</h3>\n<p><img src=\"../sources/images/skywalking-trace.png\" alt=\"/admin-guide/images/skywalking-trace.png\"></p>\n<p>Span信息:\n<img src=\"../sources/images/skywalking-span-Info.png\" alt=\"/admin-guide/images/skywalking-span-Info.png\"></p>\n<h3>告警视图</h3>\n<p><img src=\"../sources/images/skywalking-alarm.png\" alt=\"/admin-guide/images/skywalking-alarm.png\"></p>\n"
+  "__html": "<h1>使用Apache Skywalking (Incubator) 做分布式跟踪</h1>\n<h2>Apache Skywalking(Incubator)简介</h2>\n<p><a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a> 专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统。<a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking(Incubator)</a>通过加载探针的方式收集应用调用链路信息,并对采集的调用链路信息进行分析,生成应用间关系和服务间关系以及服务指标。<a href=\"https://github.com/apache/incubator-skywalking\">Apache Skywalking (Incubating)</a>目前支持多种语言,其中包括<a href=\"https://github.com/apache/incubator-skywalking\">Java</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-netcore\">.Net Core</a>,<a href=\"https://github.com/OpenSkywalking/skywalking-nodejs\">Node.js</a>和<a href=\"https://github.com/OpenSkywalking/skywalking-go\">Go</a>语言。</p>\n<p>目前Skywalking已经支持从6个可视化维度剖析分布式系统的运行情况。总览视图是应用和组件的全局视图,其中包括组件和应用数量,应用的告警波动,慢服务列表以及应用吞吐量;拓扑图从应用依赖关系出发,展现整个应用的拓扑关系;应用视图则是从单个应用的角度,展现应用的上下游关系,TopN的服务和服务器,JVM的相关信息以及对应的主机信息。服务视图关注单个服务入口的运行情况以及此服务的上下游依赖关系,依赖度,帮助用户针对单个服务的优化和监控;调用链展现了调用的单次请求经过的所有埋点以及每个埋点的执行时长;告警视图根据配置阈值针对应用、服务器、服务进行实时告警。</p>\n<h2>Dubbo与Apache Skywalking(Incubator)</h2>\n<h3>编写Dubbo示例程序</h3>\n<p>Dubbo实例程序已上传到<a href=\"https://github.com/SkywalkingTest/dubbo-trace-example\">Github仓库</a>中。方便大家下载使用。</p>\n<h4>API工程</h4>\n<p>服务接口:</p>\n<pre><code>package org.apache.skywalking.demo.interfaces;\n\npublic interface HelloService {\n\tString sayHello(String name);\n}\n</code></pre>\n<h4>Dubbo服务提供工程</h4>\n<pre><code>package org.apache.skywalking.demo.provider;\n\n@Service(version = &quot;${demo.service.version}&quot;,\n\tapplication = &quot;${dubbo.application.id}&quot;,\n\tprotocol = &quot;${dubbo.protocol.id}&quot;,\n\tregistry = &quot;${dubbo.registry.id}&quot;, timeout = 60000)\npublic class HelloServiceImpl implements HelloService {\n\n\tpublic String sayHello(String name) {\n\t\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));\n\t\treturn &quot;Hello, &quot; + name;\n\t}\n\n}\n</code></pre>\n<h4>Consumer工程</h4>\n<pre><code>package org.apache.skywalking.demo.consumer;\n\n@RestController\npublic class ConsumerController {\n\n\tprivate static int COUNT = 0;\n\n\t@Reference(version = &quot;${demo.service.version}&quot;,\n\t\tapplication = &quot;${dubbo.application.id}&quot;,\n\t\turl = &quot;dubbo://localhost:20880&quot;, timeout = 60000)\n\tprivate HelloService helloService;\n\n\t@GetMapping(&quot;/sayHello/{name}&quot;)\n\tpublic String sayHello(@PathVariable(name = &quot;name&quot;) String name) {\n\t\tif ((COUNT++) % 3 == 0){\n\t\t\tthrow new RuntimeException();\n\t\t}\n\t\tLockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));\n\t\treturn helloService.sayHello(name);\n\t}\n}\n</code></pre>\n<h3>部署Apache Skywalking(Incubator)</h3>\n<p>Apache Skywalking(Incubator)共提供两种部署模式:单节点模式和集群模式,以下为单节点模式部署步骤,集群模式部署详情参考<a href=\"https://github.com/apache/incubator-skywalking/blob/master/docs/cn/Deploy-backend-in-cluster-mode-CN.md\">文档</a>。</p>\n<h4>依赖第三方组件</h4>\n<ol>\n<li>JDK8+</li>\n<li>Elasticsearch 5.x</li>\n</ol>\n<h4>部署步骤</h4>\n<ol>\n<li>下载<a href=\"http://skywalking.apache.org/downloads/\"> Apache Skywalking Collector</a></li>\n<li>部署ElasticSearch\n<ul>\n<li>修改elasticsearch.yml文件,并设置<code>cluster.name</code>设置成<code>CollectorDBCluster</code>。此名称需要和collector配置文件一致。</li>\n<li>修改ES配置<code>network.host</code>值,将<code>network.host</code>的值修改成<code>0.0.0.0</code>。</li>\n<li>启动Elasticsearch</li>\n</ul>\n</li>\n<li>解压并启动Skywalking Collector。运行<code>bin/startup.sh</code>命令即可启动Skywalking Collector</li>\n</ol>\n<h4>启动示例程序</h4>\n<p>在启动示例程序之前,执行编译打包的命令:</p>\n<pre><code>./mvnw clean package\n</code></pre>\n<h4>启动服务提供端</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-provider -Dskywalking.collector.servers=localhost:10800 dubbo-provider/target/dubbo-provider.jar\n</code></pre>\n<h4>启动服务消费端</h4>\n<pre><code>java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 dubbo-consumer/target/dubbo-consumer.jar \n</code></pre>\n<h4>访问消费端提供的服务</h4>\n<pre><code>curl http://localhost:8080/sayHello/test\n</code></pre>\n<h2>Skywalking监控截图:</h2>\n<h3>首页</h3>\n<p><img src=\"../sources/images/skywalking-dashboard.png\" alt=\"/admin-guide/images/skywalking-dashboard.png\"></p>\n<h3>拓扑图</h3>\n<p><img src=\"../sources/images/skywalking-topology.png\" alt=\"/admin-guide/images/skywalking-topology.png\"></p>\n<h3>应用视图</h3>\n<p><img src=\"../sources/images/skywalking-application.png\" alt=\"/admin-guide/images/skywalking-application.png\"></p>\n<p>JVM信息\n<img src=\"../sources/images/skywalking-application_instance.png\" alt=\"/admin-guide/images/skywalking-application_instance.png\"></p>\n<h3>服务视图</h3>\n<p>服务消费端:\n<img src=\"../sources/images/skywalking-service-consumer.png\" alt=\"/admin-guide/images/skywalking-service-consumer.png\"></p>\n<p>服务提供端:\n<img src=\"../sources/images/skywalking-service-provider.png\" alt=\"/admin-guide/images/skywalking-service-provider.png\"></p>\n<h3>Trace视图</h3>\n<p><img src=\"../sources/images/skywalking-trace.png\" alt=\"/admin-guide/images/skywalking-trace.png\"></p>\n<p>Span信息:\n<img src=\"../sources/images/skywalking-span-Info.png\" alt=\"/admin-guide/images/skywalking-span-Info.png\"></p>\n<h3>告警视图</h3>\n<p><img src=\"../sources/images/skywalking-alarm.png\" alt=\"/admin-guide/images/skywalking-alarm.png\"></p>\n",
+  "link": "/zh-cn/docs/admin/ops/skywalking.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/README.json b/zh-cn/docs/dev/README.json
index e79463c7..ccb90ba6 100644
--- a/zh-cn/docs/dev/README.json
+++ b/zh-cn/docs/dev/README.json
@@ -1,4 +1,6 @@
 {
   "filename": "README.md",
-  "__html": "<p>这篇文档的目标读者是对 dubbo 源码、设计有兴趣的,或者有意愿加入 dubbo 开发的人群。主要涵盖了 dubbo 的框架设计、扩展机制、编码规范、版本管理、构建等话题。</p>\n"
+  "__html": "<p>这篇文档的目标读者是对 dubbo 源码、设计有兴趣的,或者有意愿加入 dubbo 开发的人群。主要涵盖了 dubbo 的框架设计、扩展机制、编码规范、版本管理、构建等话题。</p>\n",
+  "link": "/zh-cn/docs/dev/README.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/SPI.json b/zh-cn/docs/dev/SPI.json
index 45b9abf2..b514694f 100644
--- a/zh-cn/docs/dev/SPI.json
+++ b/zh-cn/docs/dev/SPI.json
@@ -1,4 +1,6 @@
 {
   "filename": "SPI.md",
-  "__html": "<h1>扩展点加载</h1>\n<h2>扩展点配置</h2>\n<h3>来源:</h3>\n<p>Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。</p>\n<p>Dubbo 改进了 JDK 标准的 SPI 的以下问题:</p>\n<ul>\n<li>JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。</li>\n<li>如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过 <code>getName()</code> 获取脚本类型的名称,但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败原因被吃掉了,和 ruby 对应不起来,当用户执行 ruby  脚本时,会报不支持 ruby,而不是真正失败的原因。</li>\n<li>增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。</li>\n</ul>\n<h3>约定:</h3>\n<p>在扩展类的 jar 包内 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,放置扩展点配置文件 <code>META-INF/dubbo/接口全限定名</code>,内容为:<code>配置名=扩展实现类全限定名</code>,多个实现类用换行符分隔。</p>\n<h3>示例:</h3>\n<p>以扩展 Dubbo 的协议为例,在协议的实现 jar 包内放置文本文件:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol</code>,内容为:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.alibaba.xxx.XxxProtocol</span>\n</code></pre>\n<p>实现类内容 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>配置模块中的配置</h3>\n<p>Dubbo 配置模块中,扩展点均有对应配置属性或标签,通过配置指定使用哪个扩展实现。比如:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>扩展点特性</h2>\n<h3>扩展点自动包装</h3>\n<p>自动包装扩展点的 Wrapper 类。<code>ExtensionLoader</code> 在加载扩展点时,如果加载到的扩展点有拷贝构造函数,则判定为扩展点 Wrapper 类。</p>\n<p>Wrapper类内容:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocolWrapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    Protocol impl;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxProtocolWrapper</span><span class=\"hljs-params\">(Protocol protocol)</span> </span>{ impl = protocol; }\n \n    <span class=\"hljs-comment\">// 接口方法做一个操作后,再调用extension的方法</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">//... 一些操作</span>\n        impl.refer();\n        <span class=\"hljs-comment\">// ... 一些操作</span>\n    }\n \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Wrapper 类同样实现了扩展点接口,但是 Wrapper 不是扩展点的真正实现。它的用途主要是用于从 <code>ExtensionLoader</code> 返回扩展点时,包装在真正的扩展点实现外。即从 <code>ExtensionLoader</code> 中返回的实际上是 Wrapper 类的实例,Wrapper 持有了实际的扩展点实现类。</p>\n<p>扩展点的 Wrapper 类可以有多个,也可以根据需要新增。</p>\n<p>通过 Wrapper 类可以把所有扩展点公共逻辑移至 Wrapper 中。新加的 Wrapper 在所有的扩展点上添加了逻辑,有些类似 AOP,即 Wrapper 代理了扩展点。</p>\n<h3>扩展点自动装配</h3>\n<p>加载扩展点时,自动注入依赖的扩展点。加载扩展点时,扩展点实现类的成员如果为其它扩展点类型,<code>ExtensionLoader</code> 在会自动注入依赖的扩展点。<code>ExtensionLoader</code> 通过扫描扩展点实现类的所有 setter 方法来判定其成员。即 <code>ExtensionLoader</code> 会执行扩展点的拼装操作。</p>\n<p>示例:有两个为扩展点 <code>CarMaker</code>(造车者)、<code>WheelMaker</code> (造轮者)</p>\n<p>接口类如下:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">()</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code> 的一个实现类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel();\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p><code>ExtensionLoader</code> 加载 <code>CarMaker</code> 的扩展点实现 <code>RaceCar</code> 时,<code>setWheelMaker</code> 方法的 <code>WheelMaker</code> 也是扩展点则会注入 <code>WheelMaker</code> 的实现。</p>\n<p>这里带来另一个问题,<code>ExtensionLoader</code> 要注入依赖扩展点时,如何决定要注入依赖扩展点的哪个实现。在这个示例中,即是在多个<code>WheelMaker</code> 的实现中要注入哪个。</p>\n<p>这个问题在下面一点 <a href=\"#%E6%89%A9%E5%B1%95%E7%82%B9%E8%87%AA%E9%80%82%E5%BA%94\">扩展点自适应</a> 中说明。</p>\n<h3>扩展点自适应</h3>\n<p><code>ExtensionLoader</code> 注入的依赖扩展点是一个 <code>Adaptive</code> 实例,直到扩展点方法执行时才决定调用是一个扩展点实现。</p>\n<p>Dubbo 使用 URL 对象(包含了Key-Value)传递配置信息。</p>\n<p>扩展点方法调用会有URL参数(或是参数有URL成员)</p>\n<p>这样依赖的扩展点也可以从URL拿到配置信息,所有的扩展点自己定好配置的Key后,配置信息从URL上从最外层传入。URL在配置传递上即是一条总线。</p>\n<p>示例:有两个为扩展点 <code>CarMaker</code>、<code>WheelMaker</code></p>\n<p>接口类如下:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code> 的一个实现类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel(url);\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p>当上面执行</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// ...</span>\nWheel wheel = wheelMaker.makeWheel(url);\n<span class=\"hljs-comment\">// ...</span>\n</code></pre>\n<p>时,注入的 <code>Adaptive</code> 实例可以提取约定 Key 来决定使用哪个 <code>WheelMaker</code> 实现来调用对应实现的真正的 <code>makeWheel</code> 方法。如提取 <code>wheel.type</code>, key 即 <code>url.get(&quot;wheel.type&quot;)</code> 来决定 <code>WheelMake</code> 实现。<code>Adaptive</code> 实例的逻辑是固定,指定提取的 URL 的 Key,即可以代理真正的实现类上,可以动态生成。</p>\n<p>在 Dubbo 的 <code>ExtensionLoader</code> 的扩展点类对应的 <code>Adaptive</code> 实现是在加载扩展点里动态生成。指定提取的 URL 的 Key 通过 <code>@Adaptive</code> 注解在接口方法上提供。</p>\n<p>下面是 Dubbo 的 Transporter 扩展点的代码:</p>\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\">Transporter</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"server\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n \n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"client\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n}\n</code></pre>\n<p>对于 bind() 方法,Adaptive 实现先查找 <code>server</code> key,如果该 Key 没有值则找 <code>transport</code> key 值,来决定代理到哪个实际扩展点。</p>\n<h3>扩展点自动激活</h3>\n<p>对于集合类扩展点,比如:<code>Filter</code>, <code>InvokerListener</code>, <code>ExportListener</code>, <code>TelnetHandler</code>, <code>StatusChecker</code> 等,可以同时加载多个实现,此时,可以用自动激活来简化配置,如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span> <span class=\"hljs-comment\">// 无条件自动激活</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>或:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(<span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// 当配置了xxx参数,并且参数为有效值时激活,比如配了cache=\"lru\",自动激活CacheFilter。</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>或:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(group = <span class=\"hljs-string\">\"provider\"</span>, value = <span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// 只对提供方激活,group可选\"provider\"或\"consumer\"</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:这里的配置文件是放在你自己的 jar 包内,不是 dubbo 本身的 jar 包内,Dubbo 会全 ClassPath 扫描所有 jar 包内同名的这个文件,然后进行合并 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>注意:扩展点使用单一实例加载(请确保扩展实现的线程安全性),缓存在 <code>ExtensionLoader</code> 中 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>扩展点加载</h1>\n<h2>扩展点配置</h2>\n<h3>来源:</h3>\n<p>Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。</p>\n<p>Dubbo 改进了 JDK 标准的 SPI 的以下问题:</p>\n<ul>\n<li>JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。</li>\n<li>如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过 <code>getName()</code> 获取脚本类型的名称,但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败原因被吃掉了,和 ruby 对应不起来,当用户执行 ruby  脚本时,会报不支持 ruby,而不是真正失败的原因。</li>\n<li>增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。</li>\n</ul>\n<h3>约定:</h3>\n<p>在扩展类的 jar 包内 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,放置扩展点配置文件 <code>META-INF/dubbo/接口全限定名</code>,内容为:<code>配置名=扩展实现类全限定名</code>,多个实现类用换行符分隔。</p>\n<h3>示例:</h3>\n<p>以扩展 Dubbo 的协议为例,在协议的实现 jar 包内放置文本文件:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol</code>,内容为:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.alibaba.xxx.XxxProtocol</span>\n</code></pre>\n<p>实现类内容 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>配置模块中的配置</h3>\n<p>Dubbo 配置模块中,扩展点均有对应配置属性或标签,通过配置指定使用哪个扩展实现。比如:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>扩展点特性</h2>\n<h3>扩展点自动包装</h3>\n<p>自动包装扩展点的 Wrapper 类。<code>ExtensionLoader</code> 在加载扩展点时,如果加载到的扩展点有拷贝构造函数,则判定为扩展点 Wrapper 类。</p>\n<p>Wrapper类内容:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocolWrapper</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    Protocol impl;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxProtocolWrapper</span><span class=\"hljs-params\">(Protocol protocol)</span> </span>{ impl = protocol; }\n \n    <span class=\"hljs-comment\">// 接口方法做一个操作后,再调用extension的方法</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">//... 一些操作</span>\n        impl.refer();\n        <span class=\"hljs-comment\">// ... 一些操作</span>\n    }\n \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>Wrapper 类同样实现了扩展点接口,但是 Wrapper 不是扩展点的真正实现。它的用途主要是用于从 <code>ExtensionLoader</code> 返回扩展点时,包装在真正的扩展点实现外。即从 <code>ExtensionLoader</code> 中返回的实际上是 Wrapper 类的实例,Wrapper 持有了实际的扩展点实现类。</p>\n<p>扩展点的 Wrapper 类可以有多个,也可以根据需要新增。</p>\n<p>通过 Wrapper 类可以把所有扩展点公共逻辑移至 Wrapper 中。新加的 Wrapper 在所有的扩展点上添加了逻辑,有些类似 AOP,即 Wrapper 代理了扩展点。</p>\n<h3>扩展点自动装配</h3>\n<p>加载扩展点时,自动注入依赖的扩展点。加载扩展点时,扩展点实现类的成员如果为其它扩展点类型,<code>ExtensionLoader</code> 在会自动注入依赖的扩展点。<code>ExtensionLoader</code> 通过扫描扩展点实现类的所有 setter 方法来判定其成员。即 <code>ExtensionLoader</code> 会执行扩展点的拼装操作。</p>\n<p>示例:有两个为扩展点 <code>CarMaker</code>(造车者)、<code>WheelMaker</code> (造轮者)</p>\n<p>接口类如下:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">()</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code> 的一个实现类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel();\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p><code>ExtensionLoader</code> 加载 <code>CarMaker</code> 的扩展点实现 <code>RaceCar</code> 时,<code>setWheelMaker</code> 方法的 <code>WheelMaker</code> 也是扩展点则会注入 <code>WheelMaker</code> 的实现。</p>\n<p>这里带来另一个问题,<code>ExtensionLoader</code> 要注入依赖扩展点时,如何决定要注入依赖扩展点的哪个实现。在这个示例中,即是在多个<code>WheelMaker</code> 的实现中要注入哪个。</p>\n<p>这个问题在下面一点 <a href=\"#%E6%89%A9%E5%B1%95%E7%82%B9%E8%87%AA%E9%80%82%E5%BA%94\">扩展点自适应</a> 中说明。</p>\n<h3>扩展点自适应</h3>\n<p><code>ExtensionLoader</code> 注入的依赖扩展点是一个 <code>Adaptive</code> 实例,直到扩展点方法执行时才决定调用是一个扩展点实现。</p>\n<p>Dubbo 使用 URL 对象(包含了Key-Value)传递配置信息。</p>\n<p>扩展点方法调用会有URL参数(或是参数有URL成员)</p>\n<p>这样依赖的扩展点也可以从URL拿到配置信息,所有的扩展点自己定好配置的Key后,配置信息从URL上从最外层传入。URL在配置传递上即是一条总线。</p>\n<p>示例:有两个为扩展点 <code>CarMaker</code>、<code>WheelMaker</code></p>\n<p>接口类如下:</p>\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\">CarMaker</span> </span>{\n    <span class=\"hljs-function\">Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">WheelMaker</span> </span>{\n    <span class=\"hljs-function\">Wheel <span class=\"hljs-title\">makeWheel</span><span class=\"hljs-params\">(URL url)</span></span>;\n}\n</code></pre>\n<p><code>CarMaker</code> 的一个实现类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RaceCarMaker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CarMaker</span> </span>{\n    WheelMaker wheelMaker;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">setWheelMaker</span><span class=\"hljs-params\">(WheelMaker wheelMaker)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.wheelMaker = wheelMaker;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Car <span class=\"hljs-title\">makeCar</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n        Wheel wheel = wheelMaker.makeWheel(url);\n        <span class=\"hljs-comment\">// ...</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> RaceCar(wheel, ...);\n    }\n}\n</code></pre>\n<p>当上面执行</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// ...</span>\nWheel wheel = wheelMaker.makeWheel(url);\n<span class=\"hljs-comment\">// ...</span>\n</code></pre>\n<p>时,注入的 <code>Adaptive</code> 实例可以提取约定 Key 来决定使用哪个 <code>WheelMaker</code> 实现来调用对应实现的真正的 <code>makeWheel</code> 方法。如提取 <code>wheel.type</code>, key 即 <code>url.get(&quot;wheel.type&quot;)</code> 来决定 <code>WheelMake</code> 实现。<code>Adaptive</code> 实例的逻辑是固定,指定提取的 URL 的 Key,即可以代理真正的实现类上,可以动态生成。</p>\n<p>在 Dubbo 的 <code>ExtensionLoader</code> 的扩展点类对应的 <code>Adaptive</code> 实现是在加载扩展点里动态生成。指定提取的 URL 的 Key 通过 <code>@Adaptive</code> 注解在接口方法上提供。</p>\n<p>下面是 Dubbo 的 Transporter 扩展点的代码:</p>\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\">Transporter</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"server\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n \n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"client\"</span>, <span class=\"hljs-string\">\"transport\"</span>})\n    <span class=\"hljs-function\">Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>;\n}\n</code></pre>\n<p>对于 bind() 方法,Adaptive 实现先查找 <code>server</code> key,如果该 Key 没有值则找 <code>transport</code> key 值,来决定代理到哪个实际扩展点。</p>\n<h3>扩展点自动激活</h3>\n<p>对于集合类扩展点,比如:<code>Filter</code>, <code>InvokerListener</code>, <code>ExportListener</code>, <code>TelnetHandler</code>, <code>StatusChecker</code> 等,可以同时加载多个实现,此时,可以用自动激活来简化配置,如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span> <span class=\"hljs-comment\">// 无条件自动激活</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>或:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(<span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// 当配置了xxx参数,并且参数为有效值时激活,比如配了cache=\"lru\",自动激活CacheFilter。</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>或:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.Activate;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n \n<span class=\"hljs-meta\">@Activate</span>(group = <span class=\"hljs-string\">\"provider\"</span>, value = <span class=\"hljs-string\">\"xxx\"</span>) <span class=\"hljs-comment\">// 只对提供方激活,group可选\"provider\"或\"consumer\"</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:这里的配置文件是放在你自己的 jar 包内,不是 dubbo 本身的 jar 包内,Dubbo 会全 ClassPath 扫描所有 jar 包内同名的这个文件,然后进行合并 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>注意:扩展点使用单一实例加载(请确保扩展实现的线程安全性),缓存在 <code>ExtensionLoader</code> 中 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/dev/SPI.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/SUMMARY.json b/zh-cn/docs/dev/SUMMARY.json
index 7605e621..62723dc5 100644
--- a/zh-cn/docs/dev/SUMMARY.json
+++ b/zh-cn/docs/dev/SUMMARY.json
@@ -1,4 +1,6 @@
 {
   "filename": "SUMMARY.md",
-  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./build.md\">1 源码构建</a></li>\n<li><a href=\"./design.md\">2 框架设计</a></li>\n<li><a href=\"./SPI.md\">3 扩展点加载</a></li>\n<li><a href=\"./implementation.md\">4 实现细节</a></li>\n<li><a href=\"./impls/introduction.md\">5 SPI 扩展实现</a>\n<ul>\n<li><a href=\"./impls/protocol.md\">5.1 协议扩展</a></li>\n<li><a href=\"./impls/filter.md\">5.2 调用拦截扩展</a></li>\n<li><a href=\"./impls/invoker-listener.md\">5.3 引用监听扩展</a></li>\n<li><a href=\"./impls/exporter-listener.md\">5.4 暴露监听扩展</a></li>\n<li><a href=\"./impls/cluster.md\">5.5 集群扩展</a></li>\n<li><a href=\"./impls/router.md\">5.6 路由扩展</a></li>\n<li><a href=\"./impls/load-balance.md\">5.7 负载均衡扩展</a></li>\n<li><a href=\"./impls/merger.md\">5.8 合并结果扩展</a></li>\n<li><a href=\"./impls/registry.md\">5.9 注册中心扩展</a></li>\n<li><a href=\"./impls/monitor.md\">5.10 监控中心扩展</a></li>\n<li><a href=\"./impls/extension-factory.md\">5.11 扩展点加载扩展</a></li>\n<li><a href=\"./impls/proxy-factory.md\">5.12 动态代理扩展</a></li>\n<li><a href=\"./impls/compiler.md\">5.13 编译器扩展</a></li>\n<li><a href=\"./impls/dispatcher.md\">5.14 消息派发扩展</a></li>\n<li><a href=\"./impls/threadpool.md\">5.15 线程池扩展</a></li>\n<li><a href=\"./impls/serialize.md\">5.16 序列化扩展</a></li>\n<li><a href=\"./impls/remoting.md\">5.17 网络传输扩展</a></li>\n<li><a href=\"./impls/exchanger.md\">5.18 信息交换扩展</a></li>\n<li><a href=\"./impls/networker.md\">5.19 组网扩展</a></li>\n<li><a href=\"./impls/telnet-handler.md\">5.20 Telnet 命令扩展</a></li>\n<li><a href=\"./impls/status-checker.md\">5.21 状态检查扩展</a></li>\n<li><a href=\"./impls/container.md\">5.22 容器扩展</a></li>\n<li><a href=\"./impls/page.md\">5.23 页面扩展</a></li>\n<li><a href=\"./impls/cache.md\">5.24 缓存扩展</a></li>\n<li><a href=\"./impls/validation.md\">5.25 验证扩展</a></li>\n<li><a href=\"./impls/logger-adapter.md\">5.26 日志适配扩展</a></li>\n</ul>\n</li>\n<li><a href=\"./contract.md\">6 公共契约</a></li>\n<li><a href=\"./coding.md\">7 编码约定</a></li>\n<li><a href=\"./principals/introduction.md\">8 设计原则</a>\n<ul>\n<li><a href=\"./principals/code-detail.md\">8.1 魔鬼在细节</a></li>\n<li><a href=\"./principals/general-knowledge.md\">8.2 一些设计上的基本常识</a></li>\n<li><a href=\"./principals/expansibility.md\">8.3 谈谈扩充式扩展与增量式扩展</a></li>\n<li><a href=\"./principals/configuration.md\">8.4 配置设计</a></li>\n<li><a href=\"./principals/robustness.md\">8.5 设计实现的健壮性</a></li>\n<li><a href=\"./principals/dummy.md\">8.6 防痴呆设计</a></li>\n<li><a href=\"./principals/extension.md\">8.7 扩展点重构</a></li>\n</ul>\n</li>\n<li><a href=\"./release.md\">9 版本管理</a></li>\n<li><a href=\"./contribution.md\">10 贡献</a></li>\n<li><a href=\"./checklist.md\">11 检查列表</a></li>\n<li><a href=\"./code-smell.md\">12 坏味道</a></li>\n<li><a href=\"./TCK.md\">13 技术兼容性测试</a></li>\n</ul>\n"
+  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./build.md\">1 源码构建</a></li>\n<li><a href=\"./design.md\">2 框架设计</a></li>\n<li><a href=\"./SPI.md\">3 扩展点加载</a></li>\n<li><a href=\"./implementation.md\">4 实现细节</a></li>\n<li><a href=\"./impls/introduction.md\">5 SPI 扩展实现</a>\n<ul>\n<li><a href=\"./impls/protocol.md\">5.1 协议扩展</a></li>\n<li><a href=\"./impls/filter.md\">5.2 调用拦截扩展</a></li>\n<li><a href=\"./impls/invoker-listener.md\">5.3 引用监听扩展</a></li>\n<li><a href=\"./impls/exporter-listener.md\">5.4 暴露监听扩展</a></li>\n<li><a href=\"./impls/cluster.md\">5.5 集群扩展</a></li>\n<li><a href=\"./impls/router.md\">5.6 路由扩展</a></li>\n<li><a href=\"./impls/load-balance.md\">5.7 负载均衡扩展</a></li>\n<li><a href=\"./impls/merger.md\">5.8 合并结果扩展</a></li>\n<li><a href=\"./impls/registry.md\">5.9 注册中心扩展</a></li>\n<li><a href=\"./impls/monitor.md\">5.10 监控中心扩展</a></li>\n<li><a href=\"./impls/extension-factory.md\">5.11 扩展点加载扩展</a></li>\n<li><a href=\"./impls/proxy-factory.md\">5.12 动态代理扩展</a></li>\n<li><a href=\"./impls/compiler.md\">5.13 编译器扩展</a></li>\n<li><a href=\"./impls/dispatcher.md\">5.14 消息派发扩展</a></li>\n<li><a href=\"./impls/threadpool.md\">5.15 线程池扩展</a></li>\n<li><a href=\"./impls/serialize.md\">5.16 序列化扩展</a></li>\n<li><a href=\"./impls/remoting.md\">5.17 网络传输扩展</a></li>\n<li><a href=\"./impls/exchanger.md\">5.18 信息交换扩展</a></li>\n<li><a href=\"./impls/networker.md\">5.19 组网扩展</a></li>\n<li><a href=\"./impls/telnet-handler.md\">5.20 Telnet 命令扩展</a></li>\n<li><a href=\"./impls/status-checker.md\">5.21 状态检查扩展</a></li>\n<li><a href=\"./impls/container.md\">5.22 容器扩展</a></li>\n<li><a href=\"./impls/page.md\">5.23 页面扩展</a></li>\n<li><a href=\"./impls/cache.md\">5.24 缓存扩展</a></li>\n<li><a href=\"./impls/validation.md\">5.25 验证扩展</a></li>\n<li><a href=\"./impls/logger-adapter.md\">5.26 日志适配扩展</a></li>\n</ul>\n</li>\n<li><a href=\"./contract.md\">6 公共契约</a></li>\n<li><a href=\"./coding.md\">7 编码约定</a></li>\n<li><a href=\"./principals/introduction.md\">8 设计原则</a>\n<ul>\n<li><a href=\"./principals/code-detail.md\">8.1 魔鬼在细节</a></li>\n<li><a href=\"./principals/general-knowledge.md\">8.2 一些设计上的基本常识</a></li>\n<li><a href=\"./principals/expansibility.md\">8.3 谈谈扩充式扩展与增量式扩展</a></li>\n<li><a href=\"./principals/configuration.md\">8.4 配置设计</a></li>\n<li><a href=\"./principals/robustness.md\">8.5 设计实现的健壮性</a></li>\n<li><a href=\"./principals/dummy.md\">8.6 防痴呆设计</a></li>\n<li><a href=\"./principals/extension.md\">8.7 扩展点重构</a></li>\n</ul>\n</li>\n<li><a href=\"./release.md\">9 版本管理</a></li>\n<li><a href=\"./contribution.md\">10 贡献</a></li>\n<li><a href=\"./checklist.md\">11 检查列表</a></li>\n<li><a href=\"./code-smell.md\">12 坏味道</a></li>\n<li><a href=\"./TCK.md\">13 技术兼容性测试</a></li>\n</ul>\n",
+  "link": "/zh-cn/docs/dev/SUMMARY.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/TCK.json b/zh-cn/docs/dev/TCK.json
index f27b6384..891f1ebb 100644
--- a/zh-cn/docs/dev/TCK.json
+++ b/zh-cn/docs/dev/TCK.json
@@ -1,4 +1,6 @@
 {
   "filename": "TCK.md",
-  "__html": "<h1>技术兼容性测试</h1>\n<p>Dubbo 的协议,通讯,序列化,注册中心,负载均策等扩展点,都有多种可选策略,以应对不同应用场景,而我们的测试用例很分散,当用户自己需要加一种新的实现时,总是不确定能否满足扩展点的完整契约。</p>\n<p>所以,我们需要对核心扩展点写 <a href=\"http://en.wikipedia.org/wiki/Technology_Compatibility_Kit\">TCK</a> (Technology Compatibility Kit),用户增加一种扩展实现,只需通过 TCK,即可确保与框架的其它部分兼容运行,可以有效提高整体健状性,也方便第三方扩展者接入,加速开源社区的成熟。</p>\n<p>开源社区的行知同学已着手研究这一块,他的初步想法是借鉴 JBoss 的 CDI-TCK,做一个 Dubbo 的 TCK 基础框架,在此之上实现 Dubbo 的扩展点 TCK 用例。</p>\n<p>参见:<a href=\"http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html\">http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html</a></p>\n<p>如果大家有兴趣,也可以一起研究,和行知一块讨论。</p>\n<h4>Protocol TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n<h4>Registry TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n"
+  "__html": "<h1>技术兼容性测试</h1>\n<p>Dubbo 的协议,通讯,序列化,注册中心,负载均策等扩展点,都有多种可选策略,以应对不同应用场景,而我们的测试用例很分散,当用户自己需要加一种新的实现时,总是不确定能否满足扩展点的完整契约。</p>\n<p>所以,我们需要对核心扩展点写 <a href=\"http://en.wikipedia.org/wiki/Technology_Compatibility_Kit\">TCK</a> (Technology Compatibility Kit),用户增加一种扩展实现,只需通过 TCK,即可确保与框架的其它部分兼容运行,可以有效提高整体健状性,也方便第三方扩展者接入,加速开源社区的成熟。</p>\n<p>开源社区的行知同学已着手研究这一块,他的初步想法是借鉴 JBoss 的 CDI-TCK,做一个 Dubbo 的 TCK 基础框架,在此之上实现 Dubbo 的扩展点 TCK 用例。</p>\n<p>参见:<a href=\"http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html\">http://docs.jboss.org/cdi/tck/reference/1.0.1-Final/html/introduction.html</a></p>\n<p>如果大家有兴趣,也可以一起研究,和行知一块讨论。</p>\n<h4>Protocol TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n<h4>Registry TCK</h4>\n<blockquote>\n<p>TODO</p>\n</blockquote>\n",
+  "link": "/zh-cn/docs/dev/TCK.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/build.json b/zh-cn/docs/dev/build.json
index 2b0bd63a..680473fe 100644
--- a/zh-cn/docs/dev/build.json
+++ b/zh-cn/docs/dev/build.json
@@ -1,4 +1,6 @@
 {
   "filename": "build.md",
-  "__html": "<h1>源码构建</h1>\n<h2>代码签出</h2>\n<p>通过以下的这个命令签出最新的项目源码 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git dubbo\n</code></pre>\n<h2>分支</h2>\n<p>我们使用 master 作为主干版本的开发,使用分支作为维护版本。可以通过 <a href=\"https://github.com/apache/incubator-dubbo/tags\">https://github.com/apache/incubator-dubbo/tags</a> 来查看所有版本的标签。</p>\n<h2>构建</h2>\n<p>Dubbo 使用 <a href=\"http://maven.apache.org\">maven</a> 作为构建工具。</p>\n<p>要求</p>\n<ul>\n<li>Java 1.5 以上的版本</li>\n<li>Maven 2.2.1 或者以上的版本</li>\n</ul>\n<p>构建之前需要配置以下的 <code>MAVEN_OPTS</code></p>\n<pre><code class=\"language-sh\"><span class=\"hljs-built_in\">export</span> MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=512m\n</code></pre>\n<p>使用以下命令做一次构建</p>\n<pre><code class=\"language-sh\">mvn clean install\n</code></pre>\n<p>可以通过以下的构建命令来跳过单元测试</p>\n<pre><code class=\"language-sh\">mvn install -Dmaven.test.skip\n</code></pre>\n<h2>构建源代码 jar 包</h2>\n<p>通过以下命令以构建 Dubbo 的源代码 jar 包,方便用来调试 Dubbo 源代码</p>\n<pre><code class=\"language-sh\">mvn clean <span class=\"hljs-built_in\">source</span>:jar install -Dmaven.test.skip\n</code></pre>\n<h2>IDE 支持</h2>\n<p>使用以下命令来生成 IDE 的工程</p>\n<h3>Intellij Idea</h3>\n<pre><code class=\"language-sh\">mvn idea:idea\n</code></pre>\n<h3>eclipse</h3>\n<pre><code class=\"language-sh\">mvn eclipse:eclipse\n</code></pre>\n<p>在 eclipse 中导入</p>\n<p>首先,需要在 eclipse 中配置 maven 仓库。通过 Preferences -&gt; Java -&gt; Build Path -&gt; Classpath 定义 <code>M2_REPO</code> 的 classpath 变量指向本地的 maven 仓库。 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<p>也可以通过以下的 maven 命令配置:</p>\n<pre><code class=\"language-sh\">mvn eclipse:configure-workspace -Declipse.workspace=/path/to/the/workspace/\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>也可以直接在 <a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a> 上浏览源代码 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>UNIX 下的路径是 ${HOME}/.m2/repository, Windows 下的路径是 C:\\Documents and Settings&lt;user&gt;.m2\\repository <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>源码构建</h1>\n<h2>代码签出</h2>\n<p>通过以下的这个命令签出最新的项目源码 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo.git dubbo\n</code></pre>\n<h2>分支</h2>\n<p>我们使用 master 作为主干版本的开发,使用分支作为维护版本。可以通过 <a href=\"https://github.com/apache/incubator-dubbo/tags\">https://github.com/apache/incubator-dubbo/tags</a> 来查看所有版本的标签。</p>\n<h2>构建</h2>\n<p>Dubbo 使用 <a href=\"http://maven.apache.org\">maven</a> 作为构建工具。</p>\n<p>要求</p>\n<ul>\n<li>Java 1.5 以上的版本</li>\n<li>Maven 2.2.1 或者以上的版本</li>\n</ul>\n<p>构建之前需要配置以下的 <code>MAVEN_OPTS</code></p>\n<pre><code class=\"language-sh\"><span class=\"hljs-built_in\">export</span> MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=512m\n</code></pre>\n<p>使用以下命令做一次构建</p>\n<pre><code class=\"language-sh\">mvn clean install\n</code></pre>\n<p>可以通过以下的构建命令来跳过单元测试</p>\n<pre><code class=\"language-sh\">mvn install -Dmaven.test.skip\n</code></pre>\n<h2>构建源代码 jar 包</h2>\n<p>通过以下命令以构建 Dubbo 的源代码 jar 包,方便用来调试 Dubbo 源代码</p>\n<pre><code class=\"language-sh\">mvn clean <span class=\"hljs-built_in\">source</span>:jar install -Dmaven.test.skip\n</code></pre>\n<h2>IDE 支持</h2>\n<p>使用以下命令来生成 IDE 的工程</p>\n<h3>Intellij Idea</h3>\n<pre><code class=\"language-sh\">mvn idea:idea\n</code></pre>\n<h3>eclipse</h3>\n<pre><code class=\"language-sh\">mvn eclipse:eclipse\n</code></pre>\n<p>在 eclipse 中导入</p>\n<p>首先,需要在 eclipse 中配置 maven 仓库。通过 Preferences -&gt; Java -&gt; Build Path -&gt; Classpath 定义 <code>M2_REPO</code> 的 classpath 变量指向本地的 maven 仓库。 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<p>也可以通过以下的 maven 命令配置:</p>\n<pre><code class=\"language-sh\">mvn eclipse:configure-workspace -Declipse.workspace=/path/to/the/workspace/\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>也可以直接在 <a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a> 上浏览源代码 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>UNIX 下的路径是 ${HOME}/.m2/repository, Windows 下的路径是 C:\\Documents and Settings&lt;user&gt;.m2\\repository <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/dev/build.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/checklist.json b/zh-cn/docs/dev/checklist.json
index 1d0e539f..8e5c50f9 100644
--- a/zh-cn/docs/dev/checklist.json
+++ b/zh-cn/docs/dev/checklist.json
@@ -1,4 +1,6 @@
 {
   "filename": "checklist.md",
-  "__html": "<h1>检查列表</h1>\n<h2>发布前 checklist</h2>\n<ul>\n<li>jira ticket 过一遍</li>\n<li>svn change list</li>\n<li>ticket 关联 code</li>\n<li>test code</li>\n<li>find bugs</li>\n</ul>\n<h2>修复时 checklist</h2>\n<ul>\n<li>修复代码前先建 ticket</li>\n<li>修复代码前先写测试用例</li>\n<li>需要伙伴检查</li>\n<li>test code(正常流程/异常流程)</li>\n<li>讲一遍逻辑</li>\n<li>契约文档化</li>\n<li>以上内容都写到ticket的评论上</li>\n<li>代码注释写清楚,用中文无妨</li>\n<li>每个版本要有 owner,确保 scope 和 check</li>\n</ul>\n<h2>Partner Check</h2>\n<ul>\n<li>Partner 以用户的方式运行一下功能</li>\n<li>Partner 发现问题、添加测试(集成测试)复现总是;Owner 完成实现。(保证两方的时间投入 PatternerCheck 的给予时间保证)</li>\n<li>Owner 向 Partner 讲述一遍实现。</li>\n</ul>\n"
+  "__html": "<h1>检查列表</h1>\n<h2>发布前 checklist</h2>\n<ul>\n<li>jira ticket 过一遍</li>\n<li>svn change list</li>\n<li>ticket 关联 code</li>\n<li>test code</li>\n<li>find bugs</li>\n</ul>\n<h2>修复时 checklist</h2>\n<ul>\n<li>修复代码前先建 ticket</li>\n<li>修复代码前先写测试用例</li>\n<li>需要伙伴检查</li>\n<li>test code(正常流程/异常流程)</li>\n<li>讲一遍逻辑</li>\n<li>契约文档化</li>\n<li>以上内容都写到ticket的评论上</li>\n<li>代码注释写清楚,用中文无妨</li>\n<li>每个版本要有 owner,确保 scope 和 check</li>\n</ul>\n<h2>Partner Check</h2>\n<ul>\n<li>Partner 以用户的方式运行一下功能</li>\n<li>Partner 发现问题、添加测试(集成测试)复现总是;Owner 完成实现。(保证两方的时间投入 PatternerCheck 的给予时间保证)</li>\n<li>Owner 向 Partner 讲述一遍实现。</li>\n</ul>\n",
+  "link": "/zh-cn/docs/dev/checklist.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/code-smell.json b/zh-cn/docs/dev/code-smell.json
index b4d3fafb..f1654b1d 100644
--- a/zh-cn/docs/dev/code-smell.json
+++ b/zh-cn/docs/dev/code-smell.json
@@ -1,4 +1,6 @@
 {
   "filename": "code-smell.md",
-  "__html": "<h1>坏味道</h1>\n<p>这里记录的是 Dubbo 设计或实现不优雅的地方。</p>\n<h2>URL 转换</h2>\n<h3>1. 点对点暴露和引用服务</h3>\n<p>直接暴露服务:</p>\n<pre><code>EXPORT(dubbo://provider-address/com.xxx.XxxService?version=1.0.0&quot;)\n</code></pre>\n<p>点对点直连服务:</p>\n<pre><code>REFER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>2. 通过注册中心暴露服务</h3>\n<p>向注册中心暴露服务:</p>\n<pre><code>EXPORT(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;export=ENCODE(dubbo://provider-address/com.xxx.XxxService?version=1.0.0))\n</code></pre>\n<p>获取注册中心:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>注册服务地址:</p>\n<pre><code>url.getParameterAndDecoded(&quot;export&quot;))\nREGISTER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>3. 通过注册中心引用服务</h3>\n<p>从注册中心订阅服务:</p>\n<pre><code>REFER(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;refer=ENCODE(version=1.0.0))\n</code></pre>\n<p>获取注册中心:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>订阅服务地址:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nSUBSCRIBE(dubbo://registry-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<p>通知服务地址:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nNOTIFY(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>4. 注册中心推送路由规则</h3>\n<p>注册中心路由规则推送:</p>\n<pre><code>NOTIFY(route://registry-address/com.xxx.XxxService?router=script&amp;type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<p>获取路由器:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;))\nGETROUTE(script://registry-address/com.xxx.XxxService?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h3>5. 从文件加载路由规则</h3>\n<p>从文件加载路由规则:</p>\n<pre><code>GETROUTE(file://path/file.js?router=script)\n</code></pre>\n<p>获取路由器:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;)).addParameter(&quot;type&quot;, SUFFIX(file)).addParameter(&quot;rule&quot;, READ(file))\nGETROUTE(script://path/file.js?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h2>调用参数</h2>\n<ul>\n<li>path 服务路径</li>\n<li>group 服务分组</li>\n<li>version 服务版本</li>\n<li>dubbo 使用的 dubbo 版本</li>\n<li>token 验证令牌</li>\n<li>timeout 调用超时</li>\n</ul>\n<h2>扩展点的加载</h2>\n<h3>1. 自适应扩展点</h3>\n<p>ExtensionLoader 加载扩展点时,会检查扩展点的属性(通过set方法判断),如该属性是扩展点类型,则会注入扩展点对象。因为注入时不能确定使用哪个扩展点(在使用时确定),所以注入的是一个自适应扩展(一个代理)。自适应扩展点调用时,选取一个真正的扩展点,并代理到其上完成调用。Dubbo 是根据调用方法参数(上面有调用哪个扩展点的信息)来选取一个真正的扩展点。</p>\n<p>在 Dubbo 给定所有的扩展点上调用都有 URL 参数(整个扩展点网的上下文信息)。自适应扩展即是从 URL 确定要调用哪个扩展点实现。URL 哪个 Key 的 Value 用来确定使用哪个扩展点,这个信息通过的 <code>@Adaptive</code> 注解在方法上说明。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Extension</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Car</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/car.type\"</span>, <span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/transport.type\"</span>})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">(URL url, Type1 arg1, Type2 arg2)</span></span>;\n}\n</code></pre>\n<p>由于自适应扩展点的上面的约定,ExtensionLoader 会为扩展点自动生成自适应扩展点类(通过字节码),并将其实例注入。</p>\n<p>ExtensionLoader 生成的自适应扩展点类如下:</p>\n<pre><code class=\"language-java\">package &lt;扩展点接口所在包&gt;;\n \npublic class &lt;扩展点接口名&gt;$Adpative implements &lt;扩展点接口&gt; {\n    public &lt;有@Adaptive注解的接口方法&gt;(&lt;方法参数&gt;) {\n        if(是否有URL类型方法参数?) 使用该URL参数\n        else if(是否有方法类型上有URL属性) 使用该URL属性\n        # &lt;else 在加载扩展点生成自适应扩展点类时抛异常,即加载扩展点失败!&gt;\n         \n        if(获取的URL == null) {\n            throw new IllegalArgumentException(\"url == null\");\n        }\n \n        根据@Adaptive注解上声明的Key的顺序,从URL获致Value,作为实际扩展点名。\n        如URL没有Value,则使用缺省扩展点实现。如没有扩展点, throw new IllegalStateException(\"Fail to get extension\");\n \n        在扩展点实现调用该方法,并返回结果。\n    }\n \n    public &lt;有@Adaptive注解的接口方法&gt;(&lt;方法参数&gt;) {\n        throw new UnsupportedOperationException(\"is not adaptive method!\");\n    }\n}\n</code></pre>\n<p><code>@Adaptive</code> 注解使用如下:</p>\n<p>如果 URL 这些 Key 都没有 Value,使用缺省的扩展(在接口的 Default 中设定的值)。比如,String[] {&quot;key1&quot;, &quot;key2&quot;},表示先在 URL 上找 key1 的 Value 作为要 Adapt 成的 Extension 名;key1 没有 Value,则使用 key2 的 Value 作为要 Adapt 成的 Extension 名。 key2 没有 Value,使用缺省的扩展。如果没有设定缺省扩展,则方法调用会抛出 IllegalStateException。如果不设置则缺省使用 Extension 接口类名的点分隔小写字串。即对于 Extension 接口 <code>com.alibaba.dubbo.xxx.YyyInvokerWrapper</code> 的缺省值为 <code>new String[] {&quot;yyy.invoker.wrapper&quot;}</code></p>\n<h2>Callback 功能</h2>\n<h3>1. 参数回调</h3>\n<p>主要原理: 在一个 consumer-&gt;provider 的长连接上,自动在 Consumer 端暴露一个服务(实现方法参数上声明的接口A),provider 端便可反向调用到 consumer 端的接口实例。</p>\n<p>实现细节:</p>\n<ul>\n<li>为了在传输时能够对回调接口实例进行转换,自动暴露与自动引用目前在 DubboCodec 中实现。此处需要考虑将此逻辑与 codec 逻辑分离。</li>\n<li>在根据 invocation 信息获取 exporter 时,需要判断是否是回调,如果是回调,会从 attachments 中取得回调服务实例的 id,在获取 exporter,此处用于 consumer 端可以对同一个 callback 接口做不同的实现。</li>\n</ul>\n<h3>2. 事件通知</h3>\n<p>主要原理:Consumer 在 invoke 方法时,判断如果有配置 onreturn/onerror... 则将 onreturn 对应的参数值(实例方法)加入到异步调用的回调列表中。</p>\n<p>实现细节:参数的传递采用 URL,但 URL 中没有支持 string-object,所以将实例方法存储在 staticMap 中,此处实现需要进行改造。</p>\n<h2>Lazy连接</h2>\n<p>DubboProtocol 特有功能,默认关闭。</p>\n<p>当客户端与服务端创建代理时,暂不建立 tcp 长连接,当有数据请求时在做连接初始化。</p>\n<p>此项功能自动关闭连接重试功能,开启发送重试功能(即发送数据时如果连接已断开,尝试重新建立连接)</p>\n<h2>共享连接</h2>\n<p>DubboProtocol 特有功能,默认开启。</p>\n<p>JVM A 暴露了多个服务,JVM B 引用了 A 中的多个服务,共享连接是说 A 与 B 多个服务调用是通过同一个 TCP 长连接进行数据传输,已达到减少服务端连接数的目的.</p>\n<p>实现细节:对于同一个地址由于使用了共享连接,那 invoker 的 destroy 就需要特别注意,一方面要满足对同一个地址 refer 的 invoker 全部 destroy 后,连接需要关闭,另一方面还需要注意如何避免部分 invoker destroy 时不能关闭连接。在实现中采用了引用计数的方案,但为了防范,在连接关闭时,重新建立了一个 Lazy connection (称为幽灵连接), 用于当出现异常场景时,避免影响业务逻辑的正常调用.</p>\n<h2>sticky 策略</h2>\n<p>有多个服务提供者的情况下,配置了 sticky 后,在提供者可用的情况下,调用会继续发送到上一次的服务提供者。sticky 策略默认开启了连接的 lazy 选项, 用于避免开启无用的连接.</p>\n<h2>服务提供者选择逻辑</h2>\n<ol start=\"0\">\n<li>存在多个服务提供者的情况下,首先根据 Loadbalance 进行选择,如果选择的 provider 处于可用状态,则进行后续调用</li>\n<li>如果第一步选择的服务提供者不可用,则从剩余服务提供者列表中继续选择,如果可用,进行后续调用</li>\n<li>如果所有的服务提供者都不可用,重新遍历整个列表(优先从没有选过的列表中选择),判断是否有可用的服务提供者(选择过程中,不可用的服务提供者可能会恢复到可用状态),如果有,则进行后续调用</li>\n<li>如果第三步没有选择出可用的服务提供者,会选第一步选出的 invoker 中的下一个(如果不是最后一个),避免碰撞。</li>\n</ol>\n"
+  "__html": "<h1>坏味道</h1>\n<p>这里记录的是 Dubbo 设计或实现不优雅的地方。</p>\n<h2>URL 转换</h2>\n<h3>1. 点对点暴露和引用服务</h3>\n<p>直接暴露服务:</p>\n<pre><code>EXPORT(dubbo://provider-address/com.xxx.XxxService?version=1.0.0&quot;)\n</code></pre>\n<p>点对点直连服务:</p>\n<pre><code>REFER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>2. 通过注册中心暴露服务</h3>\n<p>向注册中心暴露服务:</p>\n<pre><code>EXPORT(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;export=ENCODE(dubbo://provider-address/com.xxx.XxxService?version=1.0.0))\n</code></pre>\n<p>获取注册中心:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>注册服务地址:</p>\n<pre><code>url.getParameterAndDecoded(&quot;export&quot;))\nREGISTER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>3. 通过注册中心引用服务</h3>\n<p>从注册中心订阅服务:</p>\n<pre><code>REFER(registry://registry-address/com.alibaba.dubbo.registry.RegistrySerevice?registry=dubbo&amp;refer=ENCODE(version=1.0.0))\n</code></pre>\n<p>获取注册中心:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))\nGETREGISTRY(dubbo://registry-address/com.alibaba.dubbo.registry.RegistrySerevice)\n</code></pre>\n<p>订阅服务地址:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nSUBSCRIBE(dubbo://registry-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<p>通知服务地址:</p>\n<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))\nNOTIFY(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)\n</code></pre>\n<h3>4. 注册中心推送路由规则</h3>\n<p>注册中心路由规则推送:</p>\n<pre><code>NOTIFY(route://registry-address/com.xxx.XxxService?router=script&amp;type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<p>获取路由器:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;))\nGETROUTE(script://registry-address/com.xxx.XxxService?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h3>5. 从文件加载路由规则</h3>\n<p>从文件加载路由规则:</p>\n<pre><code>GETROUTE(file://path/file.js?router=script)\n</code></pre>\n<p>获取路由器:</p>\n<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;)).addParameter(&quot;type&quot;, SUFFIX(file)).addParameter(&quot;rule&quot;, READ(file))\nGETROUTE(script://path/file.js?type=js&amp;rule=ENCODE(function{...}))\n</code></pre>\n<h2>调用参数</h2>\n<ul>\n<li>path 服务路径</li>\n<li>group 服务分组</li>\n<li>version 服务版本</li>\n<li>dubbo 使用的 dubbo 版本</li>\n<li>token 验证令牌</li>\n<li>timeout 调用超时</li>\n</ul>\n<h2>扩展点的加载</h2>\n<h3>1. 自适应扩展点</h3>\n<p>ExtensionLoader 加载扩展点时,会检查扩展点的属性(通过set方法判断),如该属性是扩展点类型,则会注入扩展点对象。因为注入时不能确定使用哪个扩展点(在使用时确定),所以注入的是一个自适应扩展(一个代理)。自适应扩展点调用时,选取一个真正的扩展点,并代理到其上完成调用。Dubbo 是根据调用方法参数(上面有调用哪个扩展点的信息)来选取一个真正的扩展点。</p>\n<p>在 Dubbo 给定所有的扩展点上调用都有 URL 参数(整个扩展点网的上下文信息)。自适应扩展即是从 URL 确定要调用哪个扩展点实现。URL 哪个 Key 的 Value 用来确定使用哪个扩展点,这个信息通过的 <code>@Adaptive</code> 注解在方法上说明。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Extension</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Car</span> </span>{\n    <span class=\"hljs-meta\">@Adaptive</span>({<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/car.type\"</span>, <span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/transport.type\"</span>})\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">(URL url, Type1 arg1, Type2 arg2)</span></span>;\n}\n</code></pre>\n<p>由于自适应扩展点的上面的约定,ExtensionLoader 会为扩展点自动生成自适应扩展点类(通过字节码),并将其实例注入。</p>\n<p>ExtensionLoader 生成的自适应扩展点类如下:</p>\n<pre><code class=\"language-java\">package &lt;扩展点接口所在包&gt;;\n \npublic class &lt;扩展点接口名&gt;$Adpative implements &lt;扩展点接口&gt; {\n    public &lt;有@Adaptive注解的接口方法&gt;(&lt;方法参数&gt;) {\n        if(是否有URL类型方法参数?) 使用该URL参数\n        else if(是否有方法类型上有URL属性) 使用该URL属性\n        # &lt;else 在加载扩展点生成自适应扩展点类时抛异常,即加载扩展点失败!&gt;\n         \n        if(获取的URL == null) {\n            throw new IllegalArgumentException(\"url == null\");\n        }\n \n        根据@Adaptive注解上声明的Key的顺序,从URL获致Value,作为实际扩展点名。\n        如URL没有Value,则使用缺省扩展点实现。如没有扩展点, throw new IllegalStateException(\"Fail to get extension\");\n \n        在扩展点实现调用该方法,并返回结果。\n    }\n \n    public &lt;有@Adaptive注解的接口方法&gt;(&lt;方法参数&gt;) {\n        throw new UnsupportedOperationException(\"is not adaptive method!\");\n    }\n}\n</code></pre>\n<p><code>@Adaptive</code> 注解使用如下:</p>\n<p>如果 URL 这些 Key 都没有 Value,使用缺省的扩展(在接口的 Default 中设定的值)。比如,String[] {&quot;key1&quot;, &quot;key2&quot;},表示先在 URL 上找 key1 的 Value 作为要 Adapt 成的 Extension 名;key1 没有 Value,则使用 key2 的 Value 作为要 Adapt 成的 Extension 名。 key2 没有 Value,使用缺省的扩展。如果没有设定缺省扩展,则方法调用会抛出 IllegalStateException。如果不设置则缺省使用 Extension 接口类名的点分隔小写字串。即对于 Extension 接口 <code>com.alibaba.dubbo.xxx.YyyInvokerWrapper</code> 的缺省值为 <code>new String[] {&quot;yyy.invoker.wrapper&quot;}</code></p>\n<h2>Callback 功能</h2>\n<h3>1. 参数回调</h3>\n<p>主要原理: 在一个 consumer-&gt;provider 的长连接上,自动在 Consumer 端暴露一个服务(实现方法参数上声明的接口A),provider 端便可反向调用到 consumer 端的接口实例。</p>\n<p>实现细节:</p>\n<ul>\n<li>为了在传输时能够对回调接口实例进行转换,自动暴露与自动引用目前在 DubboCodec 中实现。此处需要考虑将此逻辑与 codec 逻辑分离。</li>\n<li>在根据 invocation 信息获取 exporter 时,需要判断是否是回调,如果是回调,会从 attachments 中取得回调服务实例的 id,在获取 exporter,此处用于 consumer 端可以对同一个 callback 接口做不同的实现。</li>\n</ul>\n<h3>2. 事件通知</h3>\n<p>主要原理:Consumer 在 invoke 方法时,判断如果有配置 onreturn/onerror... 则将 onreturn 对应的参数值(实例方法)加入到异步调用的回调列表中。</p>\n<p>实现细节:参数的传递采用 URL,但 URL 中没有支持 string-object,所以将实例方法存储在 staticMap 中,此处实现需要进行改造。</p>\n<h2>Lazy连接</h2>\n<p>DubboProtocol 特有功能,默认关闭。</p>\n<p>当客户端与服务端创建代理时,暂不建立 tcp 长连接,当有数据请求时在做连接初始化。</p>\n<p>此项功能自动关闭连接重试功能,开启发送重试功能(即发送数据时如果连接已断开,尝试重新建立连接)</p>\n<h2>共享连接</h2>\n<p>DubboProtocol 特有功能,默认开启。</p>\n<p>JVM A 暴露了多个服务,JVM B 引用了 A 中的多个服务,共享连接是说 A 与 B 多个服务调用是通过同一个 TCP 长连接进行数据传输,已达到减少服务端连接数的目的.</p>\n<p>实现细节:对于同一个地址由于使用了共享连接,那 invoker 的 destroy 就需要特别注意,一方面要满足对同一个地址 refer 的 invoker 全部 destroy 后,连接需要关闭,另一方面还需要注意如何避免部分 invoker destroy 时不能关闭连接。在实现中采用了引用计数的方案,但为了防范,在连接关闭时,重新建立了一个 Lazy connection (称为幽灵连接), 用于当出现异常场景时,避免影响业务逻辑的正常调用.</p>\n<h2>sticky 策略</h2>\n<p>有多个服务提供者的情况下,配置了 sticky 后,在提供者可用的情况下,调用会继续发送到上一次的服务提供者。sticky 策略默认开启了连接的 lazy 选项, 用于避免开启无用的连接.</p>\n<h2>服务提供者选择逻辑</h2>\n<ol start=\"0\">\n<li>存在多个服务提供者的情况下,首先根据 Loadbalance 进行选择,如果选择的 provider 处于可用状态,则进行后续调用</li>\n<li>如果第一步选择的服务提供者不可用,则从剩余服务提供者列表中继续选择,如果可用,进行后续调用</li>\n<li>如果所有的服务提供者都不可用,重新遍历整个列表(优先从没有选过的列表中选择),判断是否有可用的服务提供者(选择过程中,不可用的服务提供者可能会恢复到可用状态),如果有,则进行后续调用</li>\n<li>如果第三步没有选择出可用的服务提供者,会选第一步选出的 invoker 中的下一个(如果不是最后一个),避免碰撞。</li>\n</ol>\n",
+  "link": "/zh-cn/docs/dev/code-smell.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/coding.json b/zh-cn/docs/dev/coding.json
index 69d63ccb..32ad3f85 100644
--- a/zh-cn/docs/dev/coding.json
+++ b/zh-cn/docs/dev/coding.json
@@ -1,4 +1,6 @@
 {
   "filename": "coding.md",
-  "__html": "<h1>编码约定</h1>\n<h2>代码风格</h2>\n<p>Dubbo 的源代码和 JavaDoc 遵循以下的规范:</p>\n<ul>\n<li><a href=\"http://www.oracle.com/technetwork/java/codeconvtoc-136057.html\">Code Conventions for the Java Programming Language</a></li>\n<li><a href=\"http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html\">How to Write Doc Comments for the Javadoc Tool</a></li>\n</ul>\n<h2>异常和日志</h2>\n<ul>\n<li>尽可能携带完整的上下文信息,比如出错原因,出错的机器地址,调用对方的地址,连的注册中心地址,使用 Dubbo 的版本等。</li>\n<li>尽量将直接原因写在最前面,所有上下文信息,在原因后用键值对显示。</li>\n<li>抛出异常的地方不用打印日志,由最终处理异常者决定打印日志的级别,吃掉异常必需打印日志。</li>\n<li>打印 <code>ERROR</code> 日志表示需要报警,打印 <code>WARN</code> 日志表示可以自动恢复,打印 <code>INFO</code> 表示正常信息或完全不影响运行。</li>\n<li>建议应用方在监控中心配置 <code>ERROR</code> 日志实时报警,<code>WARN</code> 日志每周汇总发送通知。</li>\n<li><code>RpcException</code> 是 Dubbo 对外的唯一异常类型,所有内部异常,如果要抛出给用户,必须转为 <code>RpcException</code>。</li>\n<li><code>RpcException</code> 不能有子类型,所有类型信息用 ErrorCode 标识,以便保持兼容。</li>\n</ul>\n<h2>配置和 URL</h2>\n<ul>\n<li>配置对象属性首字母小写,多个单词用驼峰命名 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</li>\n<li>配置属性全部用小写,多个单词用&quot;-&quot;号分隔 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</li>\n<li>URL参数全部用小写,多个单词用&quot;.&quot;号分隔 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>。</li>\n<li>尽可能用 URL 传参,不要自定义 Map 或其它上下文格式,配置信息也转成 URL 格式使用。</li>\n<li>尽量减少 URL 嵌套,保持 URL 的简洁性。</li>\n</ul>\n<h2>单元和集成测试</h2>\n<ul>\n<li>单元测试统一用 JUnit 和 EasyMock,集成测试用 TestNG,数据库测试用 DBUnit。</li>\n<li>保持单元测试用例的运行速度,不要将性能和大的集成用例放在单元测试中。</li>\n<li>保持单元测试的每个用例都用 <code>try...finally</code> 或 <code>tearDown</code> 释放资源。</li>\n<li>减少 while 循环等待结果的测试用例,对定时器和网络的测试,用以将定时器中的逻辑抽为方法测试。</li>\n<li>对于容错行为的测试,比如 failsafe 的测试,统一用 <code>LogUtil</code> 断言日志输出。</li>\n</ul>\n<h2>扩展点基类与 AOP</h2>\n<ul>\n<li>AOP 类都命名为 <code>XxxWrapper</code>,基类都命名为 <code>AbstractXxx</code>。</li>\n<li>扩展点之间的组合将关系由 AOP 完成,<code>ExtensionLoader</code> 只负载加载扩展点,包括 AOP 扩展。</li>\n<li>尽量采用 IoC 注入扩展点之间的依赖,不要直接依赖 <code>ExtensionLoader</code> 的工厂方法。</li>\n<li>尽量采用 AOP 实现扩展点的通用行为,而不要用基类,比如负载均衡之前的 <code>isAvailable</code> 检查,它是独立于负载均衡之外的,不需要检查的是URL参数关闭。</li>\n<li>对多种相似类型的抽象,用基类实现,比如 RMI, Hessian 等第三方协议都已生成了接口代理,只需将将接口代理转成 <code>Invoker</code> 即可完成桥接,它们可以用公共基类实现此逻辑。</li>\n<li>基类也是 SPI 的一部分,每个扩展点都应该有方便使用的基类支持。</li>\n</ul>\n<h2>模块与分包</h2>\n<ul>\n<li>基于复用度分包,总是一起使用的放在同一包下,将接口和基类分成独立模块,大的实现也使用独立模块。</li>\n<li>所有接口都放在模块的根包下,基类放在 support 子包下,不同实现用放在以扩展点名字命名的子包下。</li>\n<li>尽量保持子包依赖父包,而不要反向。</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Java 约定 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Spring 约定 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Dubbo 约定 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>编码约定</h1>\n<h2>代码风格</h2>\n<p>Dubbo 的源代码和 JavaDoc 遵循以下的规范:</p>\n<ul>\n<li><a href=\"http://www.oracle.com/technetwork/java/codeconvtoc-136057.html\">Code Conventions for the Java Programming Language</a></li>\n<li><a href=\"http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html\">How to Write Doc Comments for the Javadoc Tool</a></li>\n</ul>\n<h2>异常和日志</h2>\n<ul>\n<li>尽可能携带完整的上下文信息,比如出错原因,出错的机器地址,调用对方的地址,连的注册中心地址,使用 Dubbo 的版本等。</li>\n<li>尽量将直接原因写在最前面,所有上下文信息,在原因后用键值对显示。</li>\n<li>抛出异常的地方不用打印日志,由最终处理异常者决定打印日志的级别,吃掉异常必需打印日志。</li>\n<li>打印 <code>ERROR</code> 日志表示需要报警,打印 <code>WARN</code> 日志表示可以自动恢复,打印 <code>INFO</code> 表示正常信息或完全不影响运行。</li>\n<li>建议应用方在监控中心配置 <code>ERROR</code> 日志实时报警,<code>WARN</code> 日志每周汇总发送通知。</li>\n<li><code>RpcException</code> 是 Dubbo 对外的唯一异常类型,所有内部异常,如果要抛出给用户,必须转为 <code>RpcException</code>。</li>\n<li><code>RpcException</code> 不能有子类型,所有类型信息用 ErrorCode 标识,以便保持兼容。</li>\n</ul>\n<h2>配置和 URL</h2>\n<ul>\n<li>配置对象属性首字母小写,多个单词用驼峰命名 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</li>\n<li>配置属性全部用小写,多个单词用&quot;-&quot;号分隔 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</li>\n<li>URL参数全部用小写,多个单词用&quot;.&quot;号分隔 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>。</li>\n<li>尽可能用 URL 传参,不要自定义 Map 或其它上下文格式,配置信息也转成 URL 格式使用。</li>\n<li>尽量减少 URL 嵌套,保持 URL 的简洁性。</li>\n</ul>\n<h2>单元和集成测试</h2>\n<ul>\n<li>单元测试统一用 JUnit 和 EasyMock,集成测试用 TestNG,数据库测试用 DBUnit。</li>\n<li>保持单元测试用例的运行速度,不要将性能和大的集成用例放在单元测试中。</li>\n<li>保持单元测试的每个用例都用 <code>try...finally</code> 或 <code>tearDown</code> 释放资源。</li>\n<li>减少 while 循环等待结果的测试用例,对定时器和网络的测试,用以将定时器中的逻辑抽为方法测试。</li>\n<li>对于容错行为的测试,比如 failsafe 的测试,统一用 <code>LogUtil</code> 断言日志输出。</li>\n</ul>\n<h2>扩展点基类与 AOP</h2>\n<ul>\n<li>AOP 类都命名为 <code>XxxWrapper</code>,基类都命名为 <code>AbstractXxx</code>。</li>\n<li>扩展点之间的组合将关系由 AOP 完成,<code>ExtensionLoader</code> 只负载加载扩展点,包括 AOP 扩展。</li>\n<li>尽量采用 IoC 注入扩展点之间的依赖,不要直接依赖 <code>ExtensionLoader</code> 的工厂方法。</li>\n<li>尽量采用 AOP 实现扩展点的通用行为,而不要用基类,比如负载均衡之前的 <code>isAvailable</code> 检查,它是独立于负载均衡之外的,不需要检查的是URL参数关闭。</li>\n<li>对多种相似类型的抽象,用基类实现,比如 RMI, Hessian 等第三方协议都已生成了接口代理,只需将将接口代理转成 <code>Invoker</code> 即可完成桥接,它们可以用公共基类实现此逻辑。</li>\n<li>基类也是 SPI 的一部分,每个扩展点都应该有方便使用的基类支持。</li>\n</ul>\n<h2>模块与分包</h2>\n<ul>\n<li>基于复用度分包,总是一起使用的放在同一包下,将接口和基类分成独立模块,大的实现也使用独立模块。</li>\n<li>所有接口都放在模块的根包下,基类放在 support 子包下,不同实现用放在以扩展点名字命名的子包下。</li>\n<li>尽量保持子包依赖父包,而不要反向。</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Java 约定 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>Spring 约定 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>Dubbo 约定 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/dev/coding.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/contract.json b/zh-cn/docs/dev/contract.json
index b8ccc475..3ed889e0 100644
--- a/zh-cn/docs/dev/contract.json
+++ b/zh-cn/docs/dev/contract.json
@@ -1,4 +1,6 @@
 {
   "filename": "contract.md",
-  "__html": "<h1>公共契约</h1>\n<p>这里记录的是 Dubbo 公共契约,希望所有扩展点遵守。</p>\n<h2>URL</h2>\n<ul>\n<li>所有扩展点参数都包含 URL 参数,URL 作为上下文信息贯穿整个扩展点设计体系。</li>\n<li>URL 采用标准格式:<code>protocol://username:password@host:port/path?key=value&amp;key=value</code></li>\n</ul>\n<h2>日志</h2>\n<ul>\n<li>如果不可恢复或需要报警,打印 ERROR 日志。</li>\n<li>如果可恢复异常,或瞬时的状态不一致,打印 WARN 日志。</li>\n<li>正常运行时的中间状态提示,打印 INFO 日志。</li>\n</ul>\n"
+  "__html": "<h1>公共契约</h1>\n<p>这里记录的是 Dubbo 公共契约,希望所有扩展点遵守。</p>\n<h2>URL</h2>\n<ul>\n<li>所有扩展点参数都包含 URL 参数,URL 作为上下文信息贯穿整个扩展点设计体系。</li>\n<li>URL 采用标准格式:<code>protocol://username:password@host:port/path?key=value&amp;key=value</code></li>\n</ul>\n<h2>日志</h2>\n<ul>\n<li>如果不可恢复或需要报警,打印 ERROR 日志。</li>\n<li>如果可恢复异常,或瞬时的状态不一致,打印 WARN 日志。</li>\n<li>正常运行时的中间状态提示,打印 INFO 日志。</li>\n</ul>\n",
+  "link": "/zh-cn/docs/dev/contract.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/contribution.json b/zh-cn/docs/dev/contribution.json
index fee6a718..5669bc75 100644
--- a/zh-cn/docs/dev/contribution.json
+++ b/zh-cn/docs/dev/contribution.json
@@ -1,4 +1,6 @@
 {
   "filename": "contribution.md",
-  "__html": "<h1>贡献</h1>\n<h2>流程</h2>\n<ul>\n<li>如果是扩展功能,直接新增工程,黑盒依赖 Dubbo 进行扩展。</li>\n<li>如果是改 BUG,或修改框架本身,可以从 Dubb 的 GitHub 上 Fork 工程。</li>\n<li>修改后通过 Push Request 反馈修改。</li>\n</ul>\n<h2>任务</h2>\n<table>\n<thead>\n<tr>\n<th>功能</th>\n<th>分类</th>\n<th>优先级</th>\n<th>状态</th>\n<th>认领者</th>\n<th>计划完成时间</th>\n<th>进度</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>《用户指南》翻译</td>\n<td>文档</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>《开发指南》翻译</td>\n<td>文档</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>扩展点兼容性测试</td>\n<td>测试</td>\n<td>高</td>\n<td>已认领</td>\n<td>罗立树</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>性能基准测试</td>\n<td>测试</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>功能单元测试</td>\n<td>测试</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JTA/XA分布式事务</td>\n<td>拦截扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Thrift</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>开发完成</td>\n<td>闾刚</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>ICE</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>ACE</td>\n<td>协议扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSON-RPC</td>\n<td>协议扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XML-RPC</td>\n<td>协议扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR181&amp;CXF(WebService)</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>开发完成</td>\n<td>白文志</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>JSR311&amp;JSR339(RestfulWebService)</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMS&amp;ActiveMQ</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Protobuf</td>\n<td>序列化扩展</td>\n<td>高</td>\n<td>调研</td>\n<td>朱启恒</td>\n<td>2012-02-30</td>\n<td>20%</td>\n</tr>\n<tr>\n<td>Avro</td>\n<td>序列化扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XSocket</td>\n<td>传输扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>CGLib</td>\n<td>动态代理扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JNDI</td>\n<td>注册中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>LDAP</td>\n<td>注册中心扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR140&amp;SLP</td>\n<td>注册中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>UDDI</td>\n<td>注册中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMX</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SNMP</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Cacti</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Nagios</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Logstash</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JRobin</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Maven</td>\n<td>服务安装包仓库</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Subversion</td>\n<td>服务安装包仓库</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JCR/JSR283</td>\n<td>服务安装包仓库</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleDeployer</td>\n<td>本地部署代理</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleScheduler</td>\n<td>资源调度器</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<h1>贡献</h1>\n<h2>流程</h2>\n<ul>\n<li>如果是扩展功能,直接新增工程,黑盒依赖 Dubbo 进行扩展。</li>\n<li>如果是改 BUG,或修改框架本身,可以从 Dubb 的 GitHub 上 Fork 工程。</li>\n<li>修改后通过 Push Request 反馈修改。</li>\n</ul>\n<h2>任务</h2>\n<table>\n<thead>\n<tr>\n<th>功能</th>\n<th>分类</th>\n<th>优先级</th>\n<th>状态</th>\n<th>认领者</th>\n<th>计划完成时间</th>\n<th>进度</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>《用户指南》翻译</td>\n<td>文档</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>《开发指南》翻译</td>\n<td>文档</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>扩展点兼容性测试</td>\n<td>测试</td>\n<td>高</td>\n<td>已认领</td>\n<td>罗立树</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>性能基准测试</td>\n<td>测试</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>功能单元测试</td>\n<td>测试</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JTA/XA分布式事务</td>\n<td>拦截扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Thrift</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>开发完成</td>\n<td>闾刚</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>ICE</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>ACE</td>\n<td>协议扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSON-RPC</td>\n<td>协议扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XML-RPC</td>\n<td>协议扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR181&amp;CXF(WebService)</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>开发完成</td>\n<td>白文志</td>\n<td>2012-04-27</td>\n<td>90%</td>\n</tr>\n<tr>\n<td>JSR311&amp;JSR339(RestfulWebService)</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMS&amp;ActiveMQ</td>\n<td>协议扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Protobuf</td>\n<td>序列化扩展</td>\n<td>高</td>\n<td>调研</td>\n<td>朱启恒</td>\n<td>2012-02-30</td>\n<td>20%</td>\n</tr>\n<tr>\n<td>Avro</td>\n<td>序列化扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>XSocket</td>\n<td>传输扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>CGLib</td>\n<td>动态代理扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JNDI</td>\n<td>注册中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>LDAP</td>\n<td>注册中心扩展</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JSR140&amp;SLP</td>\n<td>注册中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>UDDI</td>\n<td>注册中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JMX</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SNMP</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Cacti</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Nagios</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Logstash</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JRobin</td>\n<td>监控中心扩展</td>\n<td>高</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Maven</td>\n<td>服务安装包仓库</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>Subversion</td>\n<td>服务安装包仓库</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>JCR/JSR283</td>\n<td>服务安装包仓库</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleDeployer</td>\n<td>本地部署代理</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n<tr>\n<td>SimpleScheduler</td>\n<td>资源调度器</td>\n<td>低</td>\n<td>未认领</td>\n<td>待定</td>\n<td>待定</td>\n<td>0%</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/zh-cn/docs/dev/contribution.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/design.json b/zh-cn/docs/dev/design.json
index be4371e1..449b34d8 100644
--- a/zh-cn/docs/dev/design.json
+++ b/zh-cn/docs/dev/design.json
@@ -1,4 +1,6 @@
 {
   "filename": "design.md",
-  "__html": "<h1>框架设计</h1>\n<h2>整体设计</h2>\n<p><img src=\"sources/images/dubbo-framework.jpg\" alt=\"/dev-guide/images/dubbo-framework.jpg\"></p>\n<p>图例说明:</p>\n<ul>\n<li>图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。</li>\n<li>图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。</li>\n<li>图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。</li>\n<li>图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。</li>\n</ul>\n<h2>各层说明</h2>\n<ul>\n<li><strong>config 配置层</strong>:对外配置接口,以 <code>ServiceConfig</code>, <code>ReferenceConfig</code> 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类</li>\n<li><strong>proxy 服务代理层</strong>:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 <code>ServiceProxy</code> 为中心,扩展接口为 <code>ProxyFactory</code></li>\n<li><strong>registry 注册中心层</strong>:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 <code>RegistryFactory</code>, <code>Registry</code>, <code>RegistryService</code></li>\n<li><strong>cluster 路由层</strong>:封装多个提供者的路由及负载均衡,并桥接注册中心,以 <code>Invoker</code> 为中心,扩展接口为 <code>Cluster</code>, <code>Directory</code>, <code>Router</code>, <code>LoadBalance</code></li>\n<li><strong>monitor 监控层</strong>:RPC 调用次数和调用时间监控,以 <code>Statistics</code> 为中心,扩展接口为 <code>MonitorFactory</code>, <code>Monitor</code>, <code>MonitorService</code></li>\n<li><strong>protocol 远程调用层</strong>:封装 RPC 调用,以 <code>Invocation</code>, <code>Result</code> 为中心,扩展接口为 <code>Protocol</code>, <code>Invoker</code>, <code>Exporter</code></li>\n<li><strong>exchange 信息交换层</strong>:封装请求响应模式,同步转异步,以 <code>Request</code>, <code>Response</code> 为中心,扩展接口为 <code>Exchanger</code>, <code>ExchangeChannel</code>, <code>ExchangeClient</code>, <code>ExchangeServer</code></li>\n<li><strong>transport 网络传输层</strong>:抽象 mina 和 netty 为统一接口,以 <code>Message</code> 为中心,扩展接口为 <code>Channel</code>, <code>Transporter</code>, <code>Client</code>, <code>Server</code>, <code>Codec</code></li>\n<li><strong>serialize 数据序列化层</strong>:可复用的一些工具,扩展接口为 <code>Serialization</code>, <code>ObjectInput</code>, <code>ObjectOutput</code>, <code>ThreadPool</code></li>\n</ul>\n<h2>关系说明</h2>\n<ul>\n<li>在 RPC 中,Protocol 是核心层,也就是只要有 Protocol + Invoker + Exporter 就可以完成非透明的 RPC 调用,然后在 Invoker 的主过程上 Filter 拦截点。</li>\n<li>图中的 Consumer 和 Provider 是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用 Client 和 Server 的原因是 Dubbo 在很多场景下都使用 Provider, Consumer, Registry, Monitor 划分逻辑拓普节点,保持统一概念。</li>\n<li>而 Cluster 是外围概念,所以 Cluster 的目的是将多个 Invoker 伪装成一个 Invoker,这样其它人只要关注 Protocol 层 Invoker 即可,加上 Cluster 或者去掉 Cluster 对其它层都不会造成影响,因为只有一个提供者时,是不需要 Cluster 的。</li>\n<li>Proxy 层封装了所有接口的透明化代理,而在其它层都以 Invoker 为中心,只有到了暴露给用户使用时,才用 Proxy 将 Invoker 转成接口,或将接口实现转成 Invoker,也就是去掉 Proxy 层 RPC 是可以 Run 的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。</li>\n<li>而 Remoting 实现是 Dubbo 协议的实现,如果你选择 RMI 协议,整个 Remoting 都不会用上,Remoting 内部再划为 Transport 传输层和 Exchange 信息交换层,Transport 层只负责单向消息传输,是对 Mina, Netty, Grizzly 的抽象,它也可以扩展 UDP 传输,而 Exchange 层是在传输层之上封装了 Request-Response 语义。</li>\n<li>Registry 和 Monitor 实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起。</li>\n</ul>\n<h2>模块分包</h2>\n<p><img src=\"sources/images/dubbo-modules.jpg\" alt=\"/dev-guide/images/dubbo-modules.jpg\"></p>\n<p>模块说明:</p>\n<ul>\n<li><strong>dubbo-common 公共逻辑模块</strong>:包括 Util 类和通用模型。</li>\n<li><strong>dubbo-remoting 远程通讯模块</strong>:相当于 Dubbo 协议的实现,如果 RPC 用 RMI协议则不需要使用此包。</li>\n<li><strong>dubbo-rpc 远程调用模块</strong>:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。</li>\n<li><strong>dubbo-cluster 集群模块</strong>:将多个服务提供方伪装为一个提供方,包括:负载均衡, 容错,路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。</li>\n<li><strong>dubbo-registry 注册中心模块</strong>:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。</li>\n<li><strong>dubbo-monitor 监控模块</strong>:统计服务调用次数,调用时间的,调用链跟踪的服务。</li>\n<li><strong>dubbo-config 配置模块</strong>:是 Dubbo 对外的 API,用户通过 Config 使用D ubbo,隐藏 Dubbo 所有细节。</li>\n<li><strong>dubbo-container 容器模块</strong>:是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务。</li>\n</ul>\n<p>整体上按照分层结构进行分包,与分层的不同点在于:</p>\n<ul>\n<li>container 为服务容器,用于部署运行服务,没有在层中画出。</li>\n<li>protocol 层和 proxy 层都放在 rpc 模块中,这两层是 rpc 的核心,在不需要集群也就是只有一个提供者时,可以只使用这两层完成 rpc 调用。</li>\n<li>transport 层和 exchange 层都放在 remoting 模块中,为 rpc 调用的通讯基础。</li>\n<li>serialize 层放在 common 模块中,以便更大程度复用。</li>\n</ul>\n<h2>依赖关系</h2>\n<p><img src=\"sources/images/dubbo-relation.jpg\" alt=\"/dev-guide/images/dubbo-relation.jpg\"></p>\n<p>图例说明:</p>\n<ul>\n<li>图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互。</li>\n<li>图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点。</li>\n<li>图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。</li>\n<li>图中只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中。</li>\n</ul>\n<h2>调用链</h2>\n<p>展开总设计图的红色调用链,如下:</p>\n<p><img src=\"sources/images/dubbo-extension.jpg\" alt=\"/dev-guide/images/dubbo-extension.jpg\"></p>\n<h2>暴露服务时序</h2>\n<p>展开总设计图左边服务提供方暴露服务的蓝色初始化链,时序图如下:</p>\n<p><img src=\"sources/images/dubbo-export.jpg\" alt=\"/dev-guide/images/dubbo-export.jpg\"></p>\n<h2>引用服务时序</h2>\n<p>展开总设计图右边服务消费方引用服务的蓝色初始化链,时序图如下:</p>\n<p><img src=\"sources/images/dubbo-refer.jpg\" alt=\"/dev-guide/images/dubbo-refer.jpg\"></p>\n<h2>领域模型</h2>\n<p>在 Dubbo 的核心领域模型中:</p>\n<ul>\n<li>Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。</li>\n<li>Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。</li>\n<li>Invocation 是会话域,它持有调用过程中的变量,比如方法名,参数等。</li>\n</ul>\n<h2>基本设计原则</h2>\n<ul>\n<li>采用 Microkernel + Plugin 模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的,也就是 Dubbo 的所有功能点都可被用户自定义扩展所替换。</li>\n<li>采用 URL 作为配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息。</li>\n</ul>\n<p>更多设计原则参见:<a href=\"./principals/introduction.md\">框架设计原则</a></p>\n"
+  "__html": "<h1>框架设计</h1>\n<h2>整体设计</h2>\n<p><img src=\"sources/images/dubbo-framework.jpg\" alt=\"/dev-guide/images/dubbo-framework.jpg\"></p>\n<p>图例说明:</p>\n<ul>\n<li>图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。</li>\n<li>图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。</li>\n<li>图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。</li>\n<li>图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。</li>\n</ul>\n<h2>各层说明</h2>\n<ul>\n<li><strong>config 配置层</strong>:对外配置接口,以 <code>ServiceConfig</code>, <code>ReferenceConfig</code> 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类</li>\n<li><strong>proxy 服务代理层</strong>:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 <code>ServiceProxy</code> 为中心,扩展接口为 <code>ProxyFactory</code></li>\n<li><strong>registry 注册中心层</strong>:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 <code>RegistryFactory</code>, <code>Registry</code>, <code>RegistryService</code></li>\n<li><strong>cluster 路由层</strong>:封装多个提供者的路由及负载均衡,并桥接注册中心,以 <code>Invoker</code> 为中心,扩展接口为 <code>Cluster</code>, <code>Directory</code>, <code>Router</code>, <code>LoadBalance</code></li>\n<li><strong>monitor 监控层</strong>:RPC 调用次数和调用时间监控,以 <code>Statistics</code> 为中心,扩展接口为 <code>MonitorFactory</code>, <code>Monitor</code>, <code>MonitorService</code></li>\n<li><strong>protocol 远程调用层</strong>:封装 RPC 调用,以 <code>Invocation</code>, <code>Result</code> 为中心,扩展接口为 <code>Protocol</code>, <code>Invoker</code>, <code>Exporter</code></li>\n<li><strong>exchange 信息交换层</strong>:封装请求响应模式,同步转异步,以 <code>Request</code>, <code>Response</code> 为中心,扩展接口为 <code>Exchanger</code>, <code>ExchangeChannel</code>, <code>ExchangeClient</code>, <code>ExchangeServer</code></li>\n<li><strong>transport 网络传输层</strong>:抽象 mina 和 netty 为统一接口,以 <code>Message</code> 为中心,扩展接口为 <code>Channel</code>, <code>Transporter</code>, <code>Client</code>, <code>Server</code>, <code>Codec</code></li>\n<li><strong>serialize 数据序列化层</strong>:可复用的一些工具,扩展接口为 <code>Serialization</code>, <code>ObjectInput</code>, <code>ObjectOutput</code>, <code>ThreadPool</code></li>\n</ul>\n<h2>关系说明</h2>\n<ul>\n<li>在 RPC 中,Protocol 是核心层,也就是只要有 Protocol + Invoker + Exporter 就可以完成非透明的 RPC 调用,然后在 Invoker 的主过程上 Filter 拦截点。</li>\n<li>图中的 Consumer 和 Provider 是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用 Client 和 Server 的原因是 Dubbo 在很多场景下都使用 Provider, Consumer, Registry, Monitor 划分逻辑拓普节点,保持统一概念。</li>\n<li>而 Cluster 是外围概念,所以 Cluster 的目的是将多个 Invoker 伪装成一个 Invoker,这样其它人只要关注 Protocol 层 Invoker 即可,加上 Cluster 或者去掉 Cluster 对其它层都不会造成影响,因为只有一个提供者时,是不需要 Cluster 的。</li>\n<li>Proxy 层封装了所有接口的透明化代理,而在其它层都以 Invoker 为中心,只有到了暴露给用户使用时,才用 Proxy 将 Invoker 转成接口,或将接口实现转成 Invoker,也就是去掉 Proxy 层 RPC 是可以 Run 的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。</li>\n<li>而 Remoting 实现是 Dubbo 协议的实现,如果你选择 RMI 协议,整个 Remoting 都不会用上,Remoting 内部再划为 Transport 传输层和 Exchange 信息交换层,Transport 层只负责单向消息传输,是对 Mina, Netty, Grizzly 的抽象,它也可以扩展 UDP 传输,而 Exchange 层是在传输层之上封装了 Request-Response 语义。</li>\n<li>Registry 和 Monitor 实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起。</li>\n</ul>\n<h2>模块分包</h2>\n<p><img src=\"sources/images/dubbo-modules.jpg\" alt=\"/dev-guide/images/dubbo-modules.jpg\"></p>\n<p>模块说明:</p>\n<ul>\n<li><strong>dubbo-common 公共逻辑模块</strong>:包括 Util 类和通用模型。</li>\n<li><strong>dubbo-remoting 远程通讯模块</strong>:相当于 Dubbo 协议的实现,如果 RPC 用 RMI协议则不需要使用此包。</li>\n<li><strong>dubbo-rpc 远程调用模块</strong>:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。</li>\n<li><strong>dubbo-cluster 集群模块</strong>:将多个服务提供方伪装为一个提供方,包括:负载均衡, 容错,路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。</li>\n<li><strong>dubbo-registry 注册中心模块</strong>:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。</li>\n<li><strong>dubbo-monitor 监控模块</strong>:统计服务调用次数,调用时间的,调用链跟踪的服务。</li>\n<li><strong>dubbo-config 配置模块</strong>:是 Dubbo 对外的 API,用户通过 Config 使用D ubbo,隐藏 Dubbo 所有细节。</li>\n<li><strong>dubbo-container 容器模块</strong>:是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务。</li>\n</ul>\n<p>整体上按照分层结构进行分包,与分层的不同点在于:</p>\n<ul>\n<li>container 为服务容器,用于部署运行服务,没有在层中画出。</li>\n<li>protocol 层和 proxy 层都放在 rpc 模块中,这两层是 rpc 的核心,在不需要集群也就是只有一个提供者时,可以只使用这两层完成 rpc 调用。</li>\n<li>transport 层和 exchange 层都放在 remoting 模块中,为 rpc 调用的通讯基础。</li>\n<li>serialize 层放在 common 模块中,以便更大程度复用。</li>\n</ul>\n<h2>依赖关系</h2>\n<p><img src=\"sources/images/dubbo-relation.jpg\" alt=\"/dev-guide/images/dubbo-relation.jpg\"></p>\n<p>图例说明:</p>\n<ul>\n<li>图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互。</li>\n<li>图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点。</li>\n<li>图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。</li>\n<li>图中只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中。</li>\n</ul>\n<h2>调用链</h2>\n<p>展开总设计图的红色调用链,如下:</p>\n<p><img src=\"sources/images/dubbo-extension.jpg\" alt=\"/dev-guide/images/dubbo-extension.jpg\"></p>\n<h2>暴露服务时序</h2>\n<p>展开总设计图左边服务提供方暴露服务的蓝色初始化链,时序图如下:</p>\n<p><img src=\"sources/images/dubbo-export.jpg\" alt=\"/dev-guide/images/dubbo-export.jpg\"></p>\n<h2>引用服务时序</h2>\n<p>展开总设计图右边服务消费方引用服务的蓝色初始化链,时序图如下:</p>\n<p><img src=\"sources/images/dubbo-refer.jpg\" alt=\"/dev-guide/images/dubbo-refer.jpg\"></p>\n<h2>领域模型</h2>\n<p>在 Dubbo 的核心领域模型中:</p>\n<ul>\n<li>Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。</li>\n<li>Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。</li>\n<li>Invocation 是会话域,它持有调用过程中的变量,比如方法名,参数等。</li>\n</ul>\n<h2>基本设计原则</h2>\n<ul>\n<li>采用 Microkernel + Plugin 模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的,也就是 Dubbo 的所有功能点都可被用户自定义扩展所替换。</li>\n<li>采用 URL 作为配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息。</li>\n</ul>\n<p>更多设计原则参见:<a href=\"./principals/introduction.md\">框架设计原则</a></p>\n",
+  "link": "/zh-cn/docs/dev/design.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/implementation.json b/zh-cn/docs/dev/implementation.json
index fe37499d..7af53dd2 100644
--- a/zh-cn/docs/dev/implementation.json
+++ b/zh-cn/docs/dev/implementation.json
@@ -1,4 +1,6 @@
 {
   "filename": "implementation.md",
-  "__html": "<h1>实现细节</h1>\n<h2>初始化过程细节</h2>\n<h3>解析服务</h3>\n<p>基于 dubbo.jar 内的 <code>META-INF/spring.handlers</code> 配置,Spring 在遇到 dubbo 名称空间时,会回调 <code>DubboNamespaceHandler</code>。</p>\n<p>所有 dubbo 的标签,都统一用 <code>DubboBeanDefinitionParser</code> 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。</p>\n<p>在 <code>ServiceConfig.export()</code> 或 <code>ReferenceConfig.get()</code> 初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。</p>\n<p>然后将 URL 传给 <a href=\"./impls/protocol.md\">协议扩展点</a>,基于扩展点的 <a href=\"./SPI.md\">扩展点自适应机制</a>,根据 URL 的协议头,进行不同协议的服务暴露或引用。</p>\n<h3>暴露服务</h3>\n<h4>1. 只暴露服务端口:</h4>\n<p>在没有注册中心,直接暴露提供者的情况下 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,<code>ServiceConfig</code> 解析出的 URL 的格式为:\n<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>。</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>dubbo://</code> 协议头识别,直接调用 <code>DubboProtocol</code>的 <code>export()</code> 方法,打开服务端口。</p>\n<h4>2. 向注册中心暴露服务:</h4>\n<p>在有注册中心,需要注册提供者地址的情况下 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>,<code>ServiceConfig</code> 解析出的 URL 的格式为: <code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot;)</code>,</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>registry://</code> 协议头识别,就会调用  <code>RegistryProtocol</code> 的 <code>export()</code> 方法,将 <code>export</code> 参数中的提供者 URL,先注册到注册中心。</p>\n<p>再重新传给 <code>Protocol</code> 扩展点进行暴露: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>,然后基于扩展点自适应机制,通过提供者 URL 的 <code>dubbo://</code> 协议头识别,就会调用 <code>DubboProtocol</code> 的 <code>export()</code> 方法,打开服务端口。</p>\n<h3>引用服务</h3>\n<h4>1. 直连引用服务:</h4>\n<p>在没有注册中心,直连提供者的情况下 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,<code>ReferenceConfig</code> 解析出的 URL 的格式为:<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>。</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>dubbo://</code> 协议头识别,直接调用 <code>DubboProtocol</code> 的 <code>refer()</code> 方法,返回提供者引用。</p>\n<h4>2. 从注册中心发现引用服务:</h4>\n<p>在有注册中心,通过注册中心发现提供者地址的情况下 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>,<code>ReferenceConfig</code> 解析出的 URL 的格式为:\n<code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(&quot;consumer://consumer-host/com.foo.FooService?version=1.0.0&quot;)</code>。</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>registry://</code> 协议头识别,就会调用 <code>RegistryProtocol</code> 的 <code>refer()</code> 方法,基于 <code>refer</code> 参数中的条件,查询提供者 URL,如:\n<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>。</p>\n<p>基于扩展点自适应机制,通过提供者 URL 的 <code>dubbo://</code> 协议头识别,就会调用 <code>DubboProtocol</code> 的 <code>refer()</code> 方法,得到提供者引用。</p>\n<p>然后 <code>RegistryProtocol</code> 将多个提供者引用,通过 <code>Cluster</code> 扩展点,伪装成单个提供者引用返回。</p>\n<h3>拦截服务</h3>\n<p>基于扩展点自适应机制,所有的 <code>Protocol</code> 扩展点都会自动套上 <code>Wrapper</code> 类。</p>\n<p>基于 <code>ProtocolFilterWrapper</code> 类,将所有 <code>Filter</code> 组装成链,在链的最后一节调用真实的引用。</p>\n<p>基于 <code>ProtocolListenerWrapper</code> 类,将所有 <code>InvokerListener</code> 和 <code>ExporterListener</code> 组装集合,在暴露和引用前后,进行回调。</p>\n<p>包括监控在内,所有附加功能,全部通过 <code>Filter</code> 拦截实现。</p>\n<h2>远程调用细节</h2>\n<h3>服务提供者暴露一个服务的详细过程</h3>\n<p><img src=\"sources/images/dubbo_rpc_export.jpg\" alt=\"/dev-guide/images/dubbo_rpc_export.jpg\"></p>\n<p>上图是服务提供者暴露服务的主过程:</p>\n<p>首先 <code>ServiceConfig</code> 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 <code>ProxyFactory</code> 类的 <code>getInvoker</code> 方法使用 ref 生成一个 <code>AbstractProxyInvoker</code> 实例,到这一步就完成具体服务到 <code>Invoker</code> 的转化。接下来就是 <code>Invoker</code> 转换到 <code>Exporter</code> 的过程。</p>\n<p>Dubbo 处理服务暴露的关键就在 <code>Invoker</code> 转换到 <code>Exporter</code> 的过程,上图中的红色部分。下面我们以 Dubbo 和 RMI 这两种典型协议的实现来进行说明:</p>\n<h4>Dubbo 的实现</h4>\n<p>Dubbo 协议的 <code>Invoker</code> 转为 <code>Exporter</code> 发生在 <code>DubboProtocol</code> 类的 <code>export</code> 方法,它主要是打开 socket 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现。</p>\n<h4>RMI 的实现</h4>\n<p>RMI 协议的 <code>Invoker</code> 转为 <code>Exporter</code> 发生在 <code>RmiProtocol</code>类的 <code>export</code> 方法,它通过 Spring 或 Dubbo 或 JDK 来实现 RMI 服务,通讯细节这一块由 JDK 底层来实现,这就省了不少工作量。</p>\n<h3>服务消费者消费一个服务的详细过程</h3>\n<p><img src=\"sources/images/dubbo_rpc_refer.jpg\" alt=\"/dev-guide/images/dubbo_rpc_refer.jpg\"></p>\n<p>上图是服务消费的主过程:</p>\n<p>首先 <code>ReferenceConfig</code> 类的 <code>init</code> 方法调用 <code>Protocol</code> 的 <code>refer</code> 方法生成 <code>Invoker</code> 实例(如上图中的红色部分),这是服务消费的关键。接下来把 <code>Invoker</code> 转换为客户端需要的接口(如:HelloWorld)。</p>\n<p>关于每种协议如 RMI/Dubbo/Web service 等它们在调用 <code>refer</code> 方法生成 <code>Invoker</code> 实例的细节和上一章节所描述的类似。</p>\n<h3>满眼都是 Invoker</h3>\n<p>由于 <code>Invoker</code> 是 Dubbo 领域模型中非常重要的一个概念,很多设计思路都是向它靠拢。这就使得 <code>Invoker</code> 渗透在整个实现代码里,对于刚开始接触 Dubbo 的人,确实容易给搞混了。\n下面我们用一个精简的图来说明最重要的两种 <code>Invoker</code>:服务提供 <code>Invoker</code> 和服务消费 <code>Invoker</code>:</p>\n<p><img src=\"sources/images/dubbo_rpc_invoke.jpg\" alt=\"/dev-guide/images/dubbo_rpc_invoke.jpg\"></p>\n<p>为了更好的解释上面这张图,我们结合服务消费和提供者的代码示例来进行说明:</p>\n<p>服务消费者代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoClientAction</span> </span>{\n \n    <span class=\"hljs-keyword\">private</span> DemoService demoService;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setDemoService</span><span class=\"hljs-params\">(DemoService demoService)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.demoService = demoService;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span> + i);\n    }\n}\n</code></pre>\n<p>上面代码中的 <code>DemoService</code> 就是上图中服务消费端的 proxy,用户代码通过这个 proxy 调用其对应的 <code>Invoker</code> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>,而该 <code>Invoker</code> 实现了真正的远程服务调用。</p>\n<p>服务提供者代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> <span class=\"hljs-keyword\">throws</span> RemoteException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<p>上面这个类会被封装成为一个 <code>AbstractProxyInvoker</code> 实例,并新生成一个 <code>Exporter</code> 实例。这样当网络通讯层收到一个请求后,会找到对应的 <code>Exporter</code> 实例,并调用它所对应的 <code>AbstractProxyInvoker</code> 实例,从而真正调用了服务提供者的代码。Dubbo 里还有一些其他的 <code>Invoker</code> 类,但上面两种是最重要的。</p>\n<h2>远程通讯细节</h2>\n<h3>协议头约定</h3>\n<p><img src=\"sources/images/dubbo_protocol_header.png\" alt=\"/dev-guide/images/dubbo_protocol_header.jpg\"></p>\n<h3>线程派发模型</h3>\n<p><img src=\"sources/images/dubbo-protocol.jpg\" alt=\"/dev-guide/images/dubbo-protocol.jpg\"></p>\n<ul>\n<li>Dispather: <code>all</code>, <code>direct</code>, <code>message</code>, <code>execution</code>, <code>connection</code></li>\n<li>ThreadPool: <code>fixed</code>, <code>cached</code></li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>即:<code>&lt;dubbo:service regisrty=&quot;N/A&quot; /&gt;</code> 或者 <code>&lt;dubbo:registry address=&quot;N/A&quot; /&gt;</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>即: <code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>即:<code>&lt;dubbo:reference url=&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot; /&gt;</code> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>即:<code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><code>DubboInvoker</code>、 <code>HessianRpcInvoker</code>、 <code>InjvmInvoker</code>、 <code>RmiInvoker</code>、 <code>WebServiceInvoker</code> 中的任何一个 <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>实现细节</h1>\n<h2>初始化过程细节</h2>\n<h3>解析服务</h3>\n<p>基于 dubbo.jar 内的 <code>META-INF/spring.handlers</code> 配置,Spring 在遇到 dubbo 名称空间时,会回调 <code>DubboNamespaceHandler</code>。</p>\n<p>所有 dubbo 的标签,都统一用 <code>DubboBeanDefinitionParser</code> 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。</p>\n<p>在 <code>ServiceConfig.export()</code> 或 <code>ReferenceConfig.get()</code> 初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。</p>\n<p>然后将 URL 传给 <a href=\"./impls/protocol.md\">协议扩展点</a>,基于扩展点的 <a href=\"./SPI.md\">扩展点自适应机制</a>,根据 URL 的协议头,进行不同协议的服务暴露或引用。</p>\n<h3>暴露服务</h3>\n<h4>1. 只暴露服务端口:</h4>\n<p>在没有注册中心,直接暴露提供者的情况下 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,<code>ServiceConfig</code> 解析出的 URL 的格式为:\n<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>。</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>dubbo://</code> 协议头识别,直接调用 <code>DubboProtocol</code>的 <code>export()</code> 方法,打开服务端口。</p>\n<h4>2. 向注册中心暴露服务:</h4>\n<p>在有注册中心,需要注册提供者地址的情况下 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>,<code>ServiceConfig</code> 解析出的 URL 的格式为: <code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot;)</code>,</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>registry://</code> 协议头识别,就会调用  <code>RegistryProtocol</code> 的 <code>export()</code> 方法,将 <code>export</code> 参数中的提供者 URL,先注册到注册中心。</p>\n<p>再重新传给 <code>Protocol</code> 扩展点进行暴露: <code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>,然后基于扩展点自适应机制,通过提供者 URL 的 <code>dubbo://</code> 协议头识别,就会调用 <code>DubboProtocol</code> 的 <code>export()</code> 方法,打开服务端口。</p>\n<h3>引用服务</h3>\n<h4>1. 直连引用服务:</h4>\n<p>在没有注册中心,直连提供者的情况下 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,<code>ReferenceConfig</code> 解析出的 URL 的格式为:<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>。</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>dubbo://</code> 协议头识别,直接调用 <code>DubboProtocol</code> 的 <code>refer()</code> 方法,返回提供者引用。</p>\n<h4>2. 从注册中心发现引用服务:</h4>\n<p>在有注册中心,通过注册中心发现提供者地址的情况下 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>,<code>ReferenceConfig</code> 解析出的 URL 的格式为:\n<code>registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(&quot;consumer://consumer-host/com.foo.FooService?version=1.0.0&quot;)</code>。</p>\n<p>基于扩展点自适应机制,通过 URL 的 <code>registry://</code> 协议头识别,就会调用 <code>RegistryProtocol</code> 的 <code>refer()</code> 方法,基于 <code>refer</code> 参数中的条件,查询提供者 URL,如:\n<code>dubbo://service-host/com.foo.FooService?version=1.0.0</code>。</p>\n<p>基于扩展点自适应机制,通过提供者 URL 的 <code>dubbo://</code> 协议头识别,就会调用 <code>DubboProtocol</code> 的 <code>refer()</code> 方法,得到提供者引用。</p>\n<p>然后 <code>RegistryProtocol</code> 将多个提供者引用,通过 <code>Cluster</code> 扩展点,伪装成单个提供者引用返回。</p>\n<h3>拦截服务</h3>\n<p>基于扩展点自适应机制,所有的 <code>Protocol</code> 扩展点都会自动套上 <code>Wrapper</code> 类。</p>\n<p>基于 <code>ProtocolFilterWrapper</code> 类,将所有 <code>Filter</code> 组装成链,在链的最后一节调用真实的引用。</p>\n<p>基于 <code>ProtocolListenerWrapper</code> 类,将所有 <code>InvokerListener</code> 和 <code>ExporterListener</code> 组装集合,在暴露和引用前后,进行回调。</p>\n<p>包括监控在内,所有附加功能,全部通过 <code>Filter</code> 拦截实现。</p>\n<h2>远程调用细节</h2>\n<h3>服务提供者暴露一个服务的详细过程</h3>\n<p><img src=\"sources/images/dubbo_rpc_export.jpg\" alt=\"/dev-guide/images/dubbo_rpc_export.jpg\"></p>\n<p>上图是服务提供者暴露服务的主过程:</p>\n<p>首先 <code>ServiceConfig</code> 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 <code>ProxyFactory</code> 类的 <code>getInvoker</code> 方法使用 ref 生成一个 <code>AbstractProxyInvoker</code> 实例,到这一步就完成具体服务到 <code>Invoker</code> 的转化。接下来就是 <code>Invoker</code> 转换到 <code>Exporter</code> 的过程。</p>\n<p>Dubbo 处理服务暴露的关键就在 <code>Invoker</code> 转换到 <code>Exporter</code> 的过程,上图中的红色部分。下面我们以 Dubbo 和 RMI 这两种典型协议的实现来进行说明:</p>\n<h4>Dubbo 的实现</h4>\n<p>Dubbo 协议的 <code>Invoker</code> 转为 <code>Exporter</code> 发生在 <code>DubboProtocol</code> 类的 <code>export</code> 方法,它主要是打开 socket 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现。</p>\n<h4>RMI 的实现</h4>\n<p>RMI 协议的 <code>Invoker</code> 转为 <code>Exporter</code> 发生在 <code>RmiProtocol</code>类的 <code>export</code> 方法,它通过 Spring 或 Dubbo 或 JDK 来实现 RMI 服务,通讯细节这一块由 JDK 底层来实现,这就省了不少工作量。</p>\n<h3>服务消费者消费一个服务的详细过程</h3>\n<p><img src=\"sources/images/dubbo_rpc_refer.jpg\" alt=\"/dev-guide/images/dubbo_rpc_refer.jpg\"></p>\n<p>上图是服务消费的主过程:</p>\n<p>首先 <code>ReferenceConfig</code> 类的 <code>init</code> 方法调用 <code>Protocol</code> 的 <code>refer</code> 方法生成 <code>Invoker</code> 实例(如上图中的红色部分),这是服务消费的关键。接下来把 <code>Invoker</code> 转换为客户端需要的接口(如:HelloWorld)。</p>\n<p>关于每种协议如 RMI/Dubbo/Web service 等它们在调用 <code>refer</code> 方法生成 <code>Invoker</code> 实例的细节和上一章节所描述的类似。</p>\n<h3>满眼都是 Invoker</h3>\n<p>由于 <code>Invoker</code> 是 Dubbo 领域模型中非常重要的一个概念,很多设计思路都是向它靠拢。这就使得 <code>Invoker</code> 渗透在整个实现代码里,对于刚开始接触 Dubbo 的人,确实容易给搞混了。\n下面我们用一个精简的图来说明最重要的两种 <code>Invoker</code>:服务提供 <code>Invoker</code> 和服务消费 <code>Invoker</code>:</p>\n<p><img src=\"sources/images/dubbo_rpc_invoke.jpg\" alt=\"/dev-guide/images/dubbo_rpc_invoke.jpg\"></p>\n<p>为了更好的解释上面这张图,我们结合服务消费和提供者的代码示例来进行说明:</p>\n<p>服务消费者代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoClientAction</span> </span>{\n \n    <span class=\"hljs-keyword\">private</span> DemoService demoService;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setDemoService</span><span class=\"hljs-params\">(DemoService demoService)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.demoService = demoService;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span> + i);\n    }\n}\n</code></pre>\n<p>上面代码中的 <code>DemoService</code> 就是上图中服务消费端的 proxy,用户代码通过这个 proxy 调用其对应的 <code>Invoker</code> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>,而该 <code>Invoker</code> 实现了真正的远程服务调用。</p>\n<p>服务提供者代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> <span class=\"hljs-keyword\">throws</span> RemoteException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<p>上面这个类会被封装成为一个 <code>AbstractProxyInvoker</code> 实例,并新生成一个 <code>Exporter</code> 实例。这样当网络通讯层收到一个请求后,会找到对应的 <code>Exporter</code> 实例,并调用它所对应的 <code>AbstractProxyInvoker</code> 实例,从而真正调用了服务提供者的代码。Dubbo 里还有一些其他的 <code>Invoker</code> 类,但上面两种是最重要的。</p>\n<h2>远程通讯细节</h2>\n<h3>协议头约定</h3>\n<p><img src=\"sources/images/dubbo_protocol_header.png\" alt=\"/dev-guide/images/dubbo_protocol_header.jpg\"></p>\n<h3>线程派发模型</h3>\n<p><img src=\"sources/images/dubbo-protocol.jpg\" alt=\"/dev-guide/images/dubbo-protocol.jpg\"></p>\n<ul>\n<li>Dispather: <code>all</code>, <code>direct</code>, <code>message</code>, <code>execution</code>, <code>connection</code></li>\n<li>ThreadPool: <code>fixed</code>, <code>cached</code></li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>即:<code>&lt;dubbo:service regisrty=&quot;N/A&quot; /&gt;</code> 或者 <code>&lt;dubbo:registry address=&quot;N/A&quot; /&gt;</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>即: <code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>即:<code>&lt;dubbo:reference url=&quot;dubbo://service-host/com.foo.FooService?version=1.0.0&quot; /&gt;</code> <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>即:<code>&lt;dubbo:registry address=&quot;zookeeper://10.20.153.10:2181&quot; /&gt;</code> <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><code>DubboInvoker</code>、 <code>HessianRpcInvoker</code>、 <code>InjvmInvoker</code>、 <code>RmiInvoker</code>、 <code>WebServiceInvoker</code> 中的任何一个 <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/dev/implementation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/cache.json b/zh-cn/docs/dev/impls/cache.json
index d51f4d48..ae5ce013 100644
--- a/zh-cn/docs/dev/impls/cache.json
+++ b/zh-cn/docs/dev/impls/cache.json
@@ -1,4 +1,6 @@
 {
   "filename": "cache.md",
-  "__html": "<h1>缓存扩展</h1>\n<h2>扩展说明</h2>\n<p>用请求参数作为 key,缓存返回结果。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.cache.CacheFactory</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 方法级缓存 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:service&gt;没有配置cache属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.cache.support.lru.LruCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.threadlocal.ThreadLocalCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.jcache.JCacheFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCacheFactory.java (实现StatusChecker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.cache.CacheFactory (纯文本文件,内容为:xxx=com.xxx.XxxCacheFactory)\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.CacheFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCacheFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CacheFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Cache <span class=\"hljs-title\">getCache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxCache(url, name);\n    }\n}\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.Cache;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCache</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cache</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">Cache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">put</span><span class=\"hljs-params\">(Object key, Object value)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(Object key)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.cache.CacheFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCacheFactory</span>\n</code></pre>\n"
+  "__html": "<h1>缓存扩展</h1>\n<h2>扩展说明</h2>\n<p>用请求参数作为 key,缓存返回结果。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.cache.CacheFactory</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 方法级缓存 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>&gt;</span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span><span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:service&gt;没有配置cache属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.cache.support.lru.LruCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.threadlocal.ThreadLocalCacheFactory</code></li>\n<li><code>com.alibaba.dubbo.cache.support.jcache.JCacheFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCacheFactory.java (实现StatusChecker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.cache.CacheFactory (纯文本文件,内容为:xxx=com.xxx.XxxCacheFactory)\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.CacheFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCacheFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CacheFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Cache <span class=\"hljs-title\">getCache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxCache(url, name);\n    }\n}\n</code></pre>\n<p>XxxCacheFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.cache.Cache;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCache</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cache</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">Cache</span><span class=\"hljs-params\">(URL url, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">put</span><span class=\"hljs-params\">(Object key, Object value)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(Object key)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.cache.CacheFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCacheFactory</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/cache.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/cluster.json b/zh-cn/docs/dev/impls/cluster.json
index d554459f..f17b55f2 100644
--- a/zh-cn/docs/dev/impls/cluster.json
+++ b/zh-cn/docs/dev/impls/cluster.json
@@ -1,4 +1,6 @@
 {
   "filename": "cluster.md",
-  "__html": "<h1>集群扩展</h1>\n<h2>扩展说明</h2>\n<p>当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Cluster</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值配置,如果&lt;dubbo:protocol&gt;没有配置cluster时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailoverCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailfastCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailbackCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.ForkingCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.AvailableCluster</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCluster.java (实现Cluster接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Cluster (纯文本文件,内容为:xxx=com.xxx.XxxCluster)\n</code></pre>\n<p>XxxCluster.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Cluster;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Directory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCluster</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cluster</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(Directory&lt;T&gt; directory)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> AbstractClusterInvoker&lt;T&gt;(directory) {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation, List&lt;Invoker&lt;T&gt;&gt; invokers, LoadBalance loadbalance)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n                <span class=\"hljs-comment\">// ...</span>\n            }\n        };\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Cluster:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCluster</span>\n</code></pre>\n"
+  "__html": "<h1>集群扩展</h1>\n<h2>扩展说明</h2>\n<p>当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Cluster</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值配置,如果&lt;dubbo:protocol&gt;没有配置cluster时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailoverCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailfastCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.FailbackCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.ForkingCluster</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.support.AvailableCluster</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCluster.java (实现Cluster接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Cluster (纯文本文件,内容为:xxx=com.xxx.XxxCluster)\n</code></pre>\n<p>XxxCluster.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Cluster;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Directory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCluster</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Cluster</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(Directory&lt;T&gt; directory)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> AbstractClusterInvoker&lt;T&gt;(directory) {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation, List&lt;Invoker&lt;T&gt;&gt; invokers, LoadBalance loadbalance)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n                <span class=\"hljs-comment\">// ...</span>\n            }\n        };\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Cluster:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCluster</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/cluster.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/compiler.json b/zh-cn/docs/dev/impls/compiler.json
index d6948d4c..58179f31 100644
--- a/zh-cn/docs/dev/impls/compiler.json
+++ b/zh-cn/docs/dev/impls/compiler.json
@@ -1,4 +1,6 @@
 {
   "filename": "compiler.md",
-  "__html": "<h1>编译器扩展</h1>\n<h2>扩展说明</h2>\n<p>Java 代码编译器,用于动态生成字节码,加速调用。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.compiler.Compiler</code></p>\n<h2>扩展配置</h2>\n<p>自动加载</p>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.compiler.support.JdkCompiler</code></li>\n<li><code>com.alibaba.dubbo.common.compiler.support.JavassistCompiler</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCompiler.java (实现Compiler接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.compiler.Compiler (纯文本文件,内容为:xxx=com.xxx.XxxCompiler)\n</code></pre>\n<p>XxxCompiler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.compiler.Compiler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCompiler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Compiler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.compiler.Compiler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCompiler</span>\n</code></pre>\n"
+  "__html": "<h1>编译器扩展</h1>\n<h2>扩展说明</h2>\n<p>Java 代码编译器,用于动态生成字节码,加速调用。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.compiler.Compiler</code></p>\n<h2>扩展配置</h2>\n<p>自动加载</p>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.compiler.support.JdkCompiler</code></li>\n<li><code>com.alibaba.dubbo.common.compiler.support.JavassistCompiler</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxCompiler.java (实现Compiler接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.compiler.Compiler (纯文本文件,内容为:xxx=com.xxx.XxxCompiler)\n</code></pre>\n<p>XxxCompiler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.compiler.Compiler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxCompiler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Compiler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.compiler.Compiler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxCompiler</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/compiler.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/container.json b/zh-cn/docs/dev/impls/container.json
index 69375935..fb2d702a 100644
--- a/zh-cn/docs/dev/impls/container.json
+++ b/zh-cn/docs/dev/impls/container.json
@@ -1,4 +1,6 @@
 {
   "filename": "container.md",
-  "__html": "<h1>容器扩展</h1>\n<h2>扩展说明</h2>\n<p>服务容器扩展,用于自定义加载内容。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.container.Container</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.spring.SpringContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.JettyContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.Log4jContainer</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxContainer.java (实现Container接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.Container (纯文本文件,内容为:xxx=com.xxx.XxxContainer)\n</code></pre>\n<p>XxxContainer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \ncom.alibaba.dubbo.container.Container;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxContainer</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Container</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">stop</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.Container:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxContainer</span>\n</code></pre>\n"
+  "__html": "<h1>容器扩展</h1>\n<h2>扩展说明</h2>\n<p>服务容器扩展,用于自定义加载内容。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.container.Container</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.spring.SpringContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.JettyContainer</code></li>\n<li><code>com.alibaba.dubbo.container.spring.Log4jContainer</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxContainer.java (实现Container接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.Container (纯文本文件,内容为:xxx=com.xxx.XxxContainer)\n</code></pre>\n<p>XxxContainer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \ncom.alibaba.dubbo.container.Container;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxContainer</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Container</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">start</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">stop</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.Container:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxContainer</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/container.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/dispatcher.json b/zh-cn/docs/dev/impls/dispatcher.json
index e085887f..6b0de028 100644
--- a/zh-cn/docs/dev/impls/dispatcher.json
+++ b/zh-cn/docs/dev/impls/dispatcher.json
@@ -1,4 +1,6 @@
 {
   "filename": "dispatcher.md",
-  "__html": "<h1>消息派发扩展</h1>\n<h2>扩展说明</h2>\n<p>通道信息派发器,用于指定线程池模型。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.remoting.Dispatcher</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置dispatcher属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.all.AllDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedDispatcher</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxDispatcher.java (实现Dispatcher接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Dispatcher (纯文本文件,内容为:xxx=com.xxx.XxxDispatcher)\n</code></pre>\n<p>XxxDispatcher.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Dispatcher;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxDispatcher</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Dispatcher</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Dispatcher:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxDispatcher</span>\n</code></pre>\n"
+  "__html": "<h1>消息派发扩展</h1>\n<h2>扩展说明</h2>\n<p>通道信息派发器,用于指定线程池模型。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.remoting.Dispatcher</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置dispatcher属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">dispatcher</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.all.AllDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedDispatcher</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxDispatcher.java (实现Dispatcher接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Dispatcher (纯文本文件,内容为:xxx=com.xxx.XxxDispatcher)\n</code></pre>\n<p>XxxDispatcher.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Dispatcher;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxDispatcher</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Dispatcher</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Dispatcher:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxDispatcher</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/dispatcher.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/exchanger.json b/zh-cn/docs/dev/impls/exchanger.json
index b43402c1..e3691779 100644
--- a/zh-cn/docs/dev/impls/exchanger.json
+++ b/zh-cn/docs/dev/impls/exchanger.json
@@ -1,4 +1,6 @@
 {
   "filename": "exchanger.md",
-  "__html": "<h1>信息交换扩展</h1>\n<h2>扩展说明</h2>\n<p>基于传输层之上,实现 Request-Response 信息交换语义。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.exchange.Exchanger</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeServer</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeClient</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置exchanger属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.remoting.exchange.exchanger.HeaderExchanger</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExchanger.java (实现Exchanger接口)\n                |-XxxExchangeServer.java (实现ExchangeServer接口)\n                |-XxxExchangeClient.java (实现ExchangeClient接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.exchange.Exchanger (纯文本文件,内容为:xxx=com.xxx.XxxExchanger)\n</code></pre>\n<p>XxxExchanger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.Exchanger;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchanger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Exchanger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeServer <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeClient <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxExchangeServer.java:</p>\n<pre><code class=\"language-java\">\n<span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeServer</span> <span class=\"hljs-title\">impelements</span> <span class=\"hljs-title\">ExchangeServer</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>XxxExchangeClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeClient</span> <span class=\"hljs-title\">impelments</span> <span class=\"hljs-title\">ExchangeClient</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.exchange.Exchanger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExchanger</span>\n</code></pre>\n"
+  "__html": "<h1>信息交换扩展</h1>\n<h2>扩展说明</h2>\n<p>基于传输层之上,实现 Request-Response 信息交换语义。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.exchange.Exchanger</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeServer</code></li>\n<li><code>com.alibaba.dubbo.remoting.exchange.ExchangeClient</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置exchanger属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">exchanger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.remoting.exchange.exchanger.HeaderExchanger</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExchanger.java (实现Exchanger接口)\n                |-XxxExchangeServer.java (实现ExchangeServer接口)\n                |-XxxExchangeClient.java (实现ExchangeClient接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.exchange.Exchanger (纯文本文件,内容为:xxx=com.xxx.XxxExchanger)\n</code></pre>\n<p>XxxExchanger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.Exchanger;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchanger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Exchanger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeServer <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ExchangeClient <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ExchangeHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExchangeClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxExchangeServer.java:</p>\n<pre><code class=\"language-java\">\n<span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeServer</span> <span class=\"hljs-title\">impelements</span> <span class=\"hljs-title\">ExchangeServer</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>XxxExchangeClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.exchange.ExchangeClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExchangeClient</span> <span class=\"hljs-title\">impelments</span> <span class=\"hljs-title\">ExchangeClient</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.exchange.Exchanger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExchanger</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/exchanger.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/exporter-listener.json b/zh-cn/docs/dev/impls/exporter-listener.json
index e0f04381..badb301b 100644
--- a/zh-cn/docs/dev/impls/exporter-listener.json
+++ b/zh-cn/docs/dev/impls/exporter-listener.json
@@ -1,4 +1,6 @@
 {
   "filename": "exporter-listener.md",
-  "__html": "<h1>暴露监听扩展</h1>\n<h2>扩展说明</h2>\n<p>当有服务暴露时,触发该事件。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.ExporterListener</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 暴露服务监听 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 暴露服务缺省监听器 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.registry.directory.RegistryExporterListener</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExporterListener.java (实现ExporterListener接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ExporterListener (纯文本文件,内容为:xxx=com.xxx.XxxExporterListener)\n</code></pre>\n<p>XxxExporterListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ExporterListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Exporter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporterListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExporterListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">exported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ExporterListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExporterListener</span>\n</code></pre>\n"
+  "__html": "<h1>暴露监听扩展</h1>\n<h2>扩展说明</h2>\n<p>当有服务暴露时,触发该事件。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.ExporterListener</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 暴露服务监听 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 暴露服务缺省监听器 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.registry.directory.RegistryExporterListener</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExporterListener.java (实现ExporterListener接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ExporterListener (纯文本文件,内容为:xxx=com.xxx.XxxExporterListener)\n</code></pre>\n<p>XxxExporterListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ExporterListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Exporter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporterListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExporterListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">exported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexported</span><span class=\"hljs-params\">(Exporter&lt;?&gt; exporter)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ExporterListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExporterListener</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/exporter-listener.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/extension-factory.json b/zh-cn/docs/dev/impls/extension-factory.json
index b142d305..8aeb6d24 100644
--- a/zh-cn/docs/dev/impls/extension-factory.json
+++ b/zh-cn/docs/dev/impls/extension-factory.json
@@ -1,4 +1,6 @@
 {
   "filename": "extension-factory.md",
-  "__html": "<h1>扩展点加载扩展</h1>\n<h2>扩展说明</h2>\n<p>扩展点本身的加载容器,可从不同容器加载扩展点。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.extension.ExtensionFactory</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">compiler</span>=<span class=\"hljs-string\">\"jdk\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory</code></li>\n<li><code>com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExtensionFactory.java (实现ExtensionFactory接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.extension.ExtensionFactory (纯文本文件,内容为:xxx=com.xxx.XxxExtensionFactory)\n</code></pre>\n<p>XxxExtensionFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.ExtensionFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExtensionFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExtensionFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.extension.ExtensionFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExtensionFactory</span>\n</code></pre>\n"
+  "__html": "<h1>扩展点加载扩展</h1>\n<h2>扩展说明</h2>\n<p>扩展点本身的加载容器,可从不同容器加载扩展点。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.extension.ExtensionFactory</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">compiler</span>=<span class=\"hljs-string\">\"jdk\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory</code></li>\n<li><code>com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxExtensionFactory.java (实现ExtensionFactory接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.extension.ExtensionFactory (纯文本文件,内容为:xxx=com.xxx.XxxExtensionFactory)\n</code></pre>\n<p>XxxExtensionFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.extension.ExtensionFactory;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExtensionFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ExtensionFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getExtension</span><span class=\"hljs-params\">(Class&lt;?&gt; type, String name)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.extension.ExtensionFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxExtensionFactory</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/extension-factory.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/filter.json b/zh-cn/docs/dev/impls/filter.json
index 8104482f..5432f7e8 100644
--- a/zh-cn/docs/dev/impls/filter.json
+++ b/zh-cn/docs/dev/impls/filter.json
@@ -1,4 +1,6 @@
 {
   "filename": "filter.md",
-  "__html": "<h1>调用拦截扩展</h1>\n<h2>扩展说明</h2>\n<p>服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。</p>\n<p>约定:</p>\n<ul>\n<li>用户自定义 filter 默认在内置 filter 之后。</li>\n<li>特殊值 <code>default</code>,表示缺省扩展点插入的位置。比如:<code>filter=&quot;xxx,default,yyy&quot;</code>,表示 <code>xxx</code> 在缺省 filter 之前,<code>yyy</code> 在缺省 filter 之后。</li>\n<li>特殊符号 <code>-</code>,表示剔除。比如:<code>filter=&quot;-foo1&quot;</code>,剔除添加缺省扩展点 <code>foo1</code>。比如:<code>filter=&quot;-default&quot;</code>,剔除添加所有缺省扩展点。</li>\n<li>provider 和 service 同时配置的 filter 时,累加所有 filter,而不是覆盖。比如:<code>&lt;dubbo:provider filter=&quot;xxx,yyy&quot;/&gt;</code> 和 <code>&lt;dubbo:service filter=&quot;aaa,bbb&quot; /&gt;</code>,则 <code>xxx</code>,<code>yyy</code>,<code>aaa</code>,<code>bbb</code> 均会生效。如果要覆盖,需配置:<code>&lt;dubbo:service filter=&quot;-xxx,-yyy,aaa,bbb&quot; /&gt;</code></li>\n</ul>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.Filter</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 消费方调用过程拦截 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 消费方调用过程缺省拦截器,将拦截所有reference --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 提供方调用过程拦截 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 提供方调用过程缺省拦截器,将拦截所有service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.filter.EchoFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericImplFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.TokenFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.AccessLogFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.CountFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ActiveLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ClassLoaderFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ConsumerContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExceptionFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExecuteLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.DeprecatedFilter</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxFilter.java (实现Filter接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)\n</code></pre>\n<p>XxxFilter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// before filter ...</span>\n        Result result = invoker.invoke(invocation);\n        <span class=\"hljs-comment\">// after filter ...</span>\n        <span class=\"hljs-keyword\">return</span> result;\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Filter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxFilter</span>\n</code></pre>\n"
+  "__html": "<h1>调用拦截扩展</h1>\n<h2>扩展说明</h2>\n<p>服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。</p>\n<p>约定:</p>\n<ul>\n<li>用户自定义 filter 默认在内置 filter 之后。</li>\n<li>特殊值 <code>default</code>,表示缺省扩展点插入的位置。比如:<code>filter=&quot;xxx,default,yyy&quot;</code>,表示 <code>xxx</code> 在缺省 filter 之前,<code>yyy</code> 在缺省 filter 之后。</li>\n<li>特殊符号 <code>-</code>,表示剔除。比如:<code>filter=&quot;-foo1&quot;</code>,剔除添加缺省扩展点 <code>foo1</code>。比如:<code>filter=&quot;-default&quot;</code>,剔除添加所有缺省扩展点。</li>\n<li>provider 和 service 同时配置的 filter 时,累加所有 filter,而不是覆盖。比如:<code>&lt;dubbo:provider filter=&quot;xxx,yyy&quot;/&gt;</code> 和 <code>&lt;dubbo:service filter=&quot;aaa,bbb&quot; /&gt;</code>,则 <code>xxx</code>,<code>yyy</code>,<code>aaa</code>,<code>bbb</code> 均会生效。如果要覆盖,需配置:<code>&lt;dubbo:service filter=&quot;-xxx,-yyy,aaa,bbb&quot; /&gt;</code></li>\n</ul>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.Filter</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 消费方调用过程拦截 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 消费方调用过程缺省拦截器,将拦截所有reference --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 提供方调用过程拦截 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 提供方调用过程缺省拦截器,将拦截所有service --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">filter</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span>/&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.filter.EchoFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.GenericImplFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.TokenFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.AccessLogFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.CountFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ActiveLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ClassLoaderFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ConsumerContextFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExceptionFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.ExecuteLimitFilter</code></li>\n<li><code>com.alibaba.dubbo.rpc.filter.DeprecatedFilter</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxFilter.java (实现Filter接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)\n</code></pre>\n<p>XxxFilter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Filter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Result;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxFilter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Filter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// before filter ...</span>\n        Result result = invoker.invoke(invocation);\n        <span class=\"hljs-comment\">// after filter ...</span>\n        <span class=\"hljs-keyword\">return</span> result;\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Filter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxFilter</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/filter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/introduction.json b/zh-cn/docs/dev/impls/introduction.json
index 0322a5ca..760c91fa 100644
--- a/zh-cn/docs/dev/impls/introduction.json
+++ b/zh-cn/docs/dev/impls/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>SPI 扩展实现</h1>\n<p>SPI 扩展接口仅用于系统集成,或 Contributor 扩展功能插件。</p>\n"
+  "__html": "<h1>SPI 扩展实现</h1>\n<p>SPI 扩展接口仅用于系统集成,或 Contributor 扩展功能插件。</p>\n",
+  "link": "/zh-cn/docs/dev/impls/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/invoker-listener.json b/zh-cn/docs/dev/impls/invoker-listener.json
index 225149c9..7db8d2ef 100644
--- a/zh-cn/docs/dev/impls/invoker-listener.json
+++ b/zh-cn/docs/dev/impls/invoker-listener.json
@@ -1,4 +1,6 @@
 {
   "filename": "invoker-listener.md",
-  "__html": "<h1>引用监听扩展</h1>\n<h2>扩展说明</h2>\n<p>当有服务引用时,触发该事件。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.InvokerListener</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 引用服务监听 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 引用服务缺省监听器 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.rpc.listener.DeprecatedInvokerListener</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxInvokerListener.java (实现InvokerListener接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.InvokerListener (纯文本文件,内容为:xxx=com.xxx.XxxInvokerListener)\n</code></pre>\n<p>XxxInvokerListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.InvokerListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvokerListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">InvokerListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">referred</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroyed</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.InvokerListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxInvokerListener</span>\n</code></pre>\n"
+  "__html": "<h1>引用监听扩展</h1>\n<h2>扩展说明</h2>\n<p>当有服务引用时,触发该事件。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.InvokerListener</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 引用服务监听 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 引用服务缺省监听器 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">listener</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span> \n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.rpc.listener.DeprecatedInvokerListener</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxInvokerListener.java (实现InvokerListener接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.InvokerListener (纯文本文件,内容为:xxx=com.xxx.XxxInvokerListener)\n</code></pre>\n<p>XxxInvokerListener.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.InvokerListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvokerListener</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">InvokerListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">referred</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">destroyed</span><span class=\"hljs-params\">(Invoker&lt;?&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.InvokerListener:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxInvokerListener</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/invoker-listener.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/load-balance.json b/zh-cn/docs/dev/impls/load-balance.json
index 1de54101..08e7743a 100644
--- a/zh-cn/docs/dev/impls/load-balance.json
+++ b/zh-cn/docs/dev/impls/load-balance.json
@@ -1,4 +1,6 @@
 {
   "filename": "load-balance.md",
-  "__html": "<h1>负载均衡扩展</h1>\n<h2>扩展说明</h2>\n<p>从多个服务提者方中选择一个进行调用</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.LoadBalance</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置loadbalance时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoadBalance.java (实现LoadBalance接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.LoadBalance (纯文本文件,内容为:xxx=com.xxx.XxxLoadBalance)\n</code></pre>\n<p>XxxLoadBalance.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException; \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoadBalance</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoadBalance</span>\n</code></pre>\n"
+  "__html": "<h1>负载均衡扩展</h1>\n<h2>扩展说明</h2>\n<p>从多个服务提者方中选择一个进行调用</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.LoadBalance</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置loadbalance时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoadBalance.java (实现LoadBalance接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.LoadBalance (纯文本文件,内容为:xxx=com.xxx.XxxLoadBalance)\n</code></pre>\n<p>XxxLoadBalance.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.LoadBalance;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException; \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoadBalance</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoadBalance</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">select</span><span class=\"hljs-params\">(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoadBalance</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/load-balance.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/logger-adapter.json b/zh-cn/docs/dev/impls/logger-adapter.json
index 2a380ba7..0921499a 100644
--- a/zh-cn/docs/dev/impls/logger-adapter.json
+++ b/zh-cn/docs/dev/impls/logger-adapter.json
@@ -1,4 +1,6 @@
 {
   "filename": "logger-adapter.md",
-  "__html": "<h1>日志适配扩展</h1>\n<h2>扩展说明</h2>\n<p>日志输出适配扩展点。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.logger.LoggerAdapter</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-sh\">-Ddubbo:application.logger=xxx\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j2.Log4j2LoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoggerAdapter.java (实现LoggerAdapter接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.logger.LoggerAdapter (纯文本文件,内容为:xxx=com.xxx.XxxLoggerAdapter)\n</code></pre>\n<p>XxxLoggerAdapter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.LoggerAdapter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoggerAdapter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoggerAdapter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Logger <span class=\"hljs-title\">getLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxLogger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.Logger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLogger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Logger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">info</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.logger.LoggerAdapter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoggerAdapter</span>\n</code></pre>\n"
+  "__html": "<h1>日志适配扩展</h1>\n<h2>扩展说明</h2>\n<p>日志输出适配扩展点。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.logger.LoggerAdapter</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<p>或者:</p>\n<pre><code class=\"language-sh\">-Ddubbo:application.logger=xxx\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.log4j2.Log4j2LoggerAdapter</code></li>\n<li><code>com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxLoggerAdapter.java (实现LoggerAdapter接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.logger.LoggerAdapter (纯文本文件,内容为:xxx=com.xxx.XxxLoggerAdapter)\n</code></pre>\n<p>XxxLoggerAdapter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.LoggerAdapter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLoggerAdapter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">LoggerAdapter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Logger <span class=\"hljs-title\">getLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxLogger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.logger.Logger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxLogger</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Logger</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxLogger</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">info</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.logger.LoggerAdapter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxLoggerAdapter</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/logger-adapter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/merger.json b/zh-cn/docs/dev/impls/merger.json
index 6404101f..ee2f2cd4 100644
--- a/zh-cn/docs/dev/impls/merger.json
+++ b/zh-cn/docs/dev/impls/merger.json
@@ -1,4 +1,6 @@
 {
   "filename": "merger.md",
-  "__html": "<h1>合并结果扩展</h1>\n<h2>扩展说明</h2>\n<p>合并返回结果,用于分组聚合。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Merger</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ArrayMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ListMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.SetMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.MapMerger</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMerger.java (实现Merger接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Merger (纯文本文件,内容为:xxx=com.xxx.XxxMerger)\n</code></pre>\n<p>XxxMerger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Merger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMerger</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Merger</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(T... results)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Merger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMerger</span>\n</code></pre>\n"
+  "__html": "<h1>合并结果扩展</h1>\n<h2>扩展说明</h2>\n<p>合并返回结果,用于分组聚合。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.cluster.Merger</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ArrayMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.ListMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.SetMerger</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.merger.MapMerger</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMerger.java (实现Merger接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.Merger (纯文本文件,内容为:xxx=com.xxx.XxxMerger)\n</code></pre>\n<p>XxxMerger.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.Merger;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMerger</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Merger</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> T <span class=\"hljs-title\">merge</span><span class=\"hljs-params\">(T... results)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.Merger:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMerger</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/merger.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/monitor.json b/zh-cn/docs/dev/impls/monitor.json
index cbecf461..e6477dd8 100644
--- a/zh-cn/docs/dev/impls/monitor.json
+++ b/zh-cn/docs/dev/impls/monitor.json
@@ -1,4 +1,6 @@
 {
   "filename": "monitor.md",
-  "__html": "<h1>监控中心扩展</h1>\n<h2>扩展说明</h2>\n<p>负责服务调用次和调用时间的监控。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.monitor.MonitorFactory</code></li>\n<li><code>com.alibaba.dubbo.monitor.Monitor</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 定义监控中心 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p>com.alibaba.dubbo.monitor.support.dubbo.DubboMonitorFactory</p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMonitorFactoryjava (实现MonitorFactory接口)\n                |-XxxMonitor.java (实现Monitor接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.monitor.MonitorFactory (纯文本文件,内容为:xxx=com.xxx.XxxMonitorFactory)\n</code></pre>\n<p>XxxMonitorFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.MonitorFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitorFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">MonitorFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Monitor <span class=\"hljs-title\">getMonitor</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxMonitor(url);\n    }\n}\n</code></pre>\n<p>XxxMonitor.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitor</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Monitor</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">count</span><span class=\"hljs-params\">(URL statistics)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.monitor.MonitorFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMonitorFactory</span>\n</code></pre>\n"
+  "__html": "<h1>监控中心扩展</h1>\n<h2>扩展说明</h2>\n<p>负责服务调用次和调用时间的监控。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.monitor.MonitorFactory</code></li>\n<li><code>com.alibaba.dubbo.monitor.Monitor</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 定义监控中心 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:monitor</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p>com.alibaba.dubbo.monitor.support.dubbo.DubboMonitorFactory</p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxMonitorFactoryjava (实现MonitorFactory接口)\n                |-XxxMonitor.java (实现Monitor接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.monitor.MonitorFactory (纯文本文件,内容为:xxx=com.xxx.XxxMonitorFactory)\n</code></pre>\n<p>XxxMonitorFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.MonitorFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitorFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">MonitorFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Monitor <span class=\"hljs-title\">getMonitor</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxMonitor(url);\n    }\n}\n</code></pre>\n<p>XxxMonitor.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.monitor.Monitor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxMonitor</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Monitor</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">count</span><span class=\"hljs-params\">(URL statistics)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.monitor.MonitorFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxMonitorFactory</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/monitor.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/networker.json b/zh-cn/docs/dev/impls/networker.json
index c3b165d2..287b46d8 100644
--- a/zh-cn/docs/dev/impls/networker.json
+++ b/zh-cn/docs/dev/impls/networker.json
@@ -1,4 +1,6 @@
 {
   "filename": "networker.md",
-  "__html": "<h1>组网扩展</h1>\n<h2>扩展说明</h2>\n<p>对等网络节点组网器。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.remoting.p2p.Networker</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置networker属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.MulticastNetworker</code></li>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.FileNetworker</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxNetworker.java (实现Networker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.p2p.Networker (纯文本文件,内容为:xxx=com.xxx.XxxNetworker)\n</code></pre>\n<p>XxxNetworker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.p2p.Networker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxNetworker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Networker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.p2p.Networker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxNetworker</span>\n</code></pre>\n"
+  "__html": "<h1>组网扩展</h1>\n<h2>扩展说明</h2>\n<p>对等网络节点组网器。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.remoting.p2p.Networker</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置networker属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">networker</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.MulticastNetworker</code></li>\n<li><code>com.alibaba.dubbo.remoting.p2p.support.FileNetworker</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxNetworker.java (实现Networker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.p2p.Networker (纯文本文件,内容为:xxx=com.xxx.XxxNetworker)\n</code></pre>\n<p>XxxNetworker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.p2p.Networker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxNetworker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Networker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.p2p.Networker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxNetworker</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/networker.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/page.json b/zh-cn/docs/dev/impls/page.json
index b6eac646..1d882776 100644
--- a/zh-cn/docs/dev/impls/page.json
+++ b/zh-cn/docs/dev/impls/page.json
@@ -1,4 +1,6 @@
 {
   "filename": "page.md",
-  "__html": "<h1>页面扩展</h1>\n<h2>扩展说明</h2>\n<p>对等网络节点组网器。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.container.page.PageHandler</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置page属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.page.pages.HomePageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.StatusPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.LogPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.SystemPageHandler</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxPageHandler.java (实现PageHandler接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.page.PageHandler (纯文本文件,内容为:xxx=com.xxx.XxxPageHandler)\n</code></pre>\n<p>XxxPageHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.container.page.PageHandler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxPageHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">PageHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.page.PageHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxPageHandler</span>\n</code></pre>\n"
+  "__html": "<h1>页面扩展</h1>\n<h2>扩展说明</h2>\n<p>对等网络节点组网器。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.container.page.PageHandler</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置page属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">page</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.container.page.pages.HomePageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.StatusPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.LogPageHandler</code></li>\n<li><code>com.alibaba.dubbo.container.page.pages.SystemPageHandler</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxPageHandler.java (实现PageHandler接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.container.page.PageHandler (纯文本文件,内容为:xxx=com.xxx.XxxPageHandler)\n</code></pre>\n<p>XxxPageHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.container.page.PageHandler;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxPageHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">PageHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Group <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.container.page.PageHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxPageHandler</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/page.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/protocol.json b/zh-cn/docs/dev/impls/protocol.json
index 57371be7..78eb4630 100644
--- a/zh-cn/docs/dev/impls/protocol.json
+++ b/zh-cn/docs/dev/impls/protocol.json
@@ -1,4 +1,6 @@
 {
   "filename": "protocol.md",
-  "__html": "<h1>协议扩展</h1>\n<h2>扩展说明</h2>\n<p>RPC 协议扩展,封装远程调用细节。</p>\n<p>契约:</p>\n<ul>\n<li>当用户调用 <code>refer()</code> 所返回的 <code>Invoker</code> 对象的 <code>invoke()</code> 方法时,协议需相应执行同 URL 远端 <code>export()</code> 传入的 <code>Invoker</code> 对象的 <code>invoke()</code> 方法。</li>\n<li>其中,<code>refer()</code> 返回的 <code>Invoker</code> 由协议实现,协议通常需要在此 <code>Invoker</code> 中发送远程请求,<code>export()</code> 传入的 <code>Invoker</code> 由框架实现并传入,协议不需要关心。</li>\n</ul>\n<p>注意:</p>\n<ul>\n<li>协议不关心业务接口的透明代理,以 <code>Invoker</code> 为中心,由外层将 <code>Invoker</code> 转换为业务接口。</li>\n<li>协议不一定要是 TCP 网络通讯,比如通过共享文件,IPC 进程间通讯等。</li>\n</ul>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.Protocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.Exporter</code></li>\n<li><code>com.alibaba.dubbo.rpc.Invoker</code></li>\n</ul>\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\">Protocol</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * 暴露远程服务:&lt;br&gt;\n     * 1. 协议在接收请求时,应记录请求来源方地址信息:RpcContext.getContext().setRemoteAddress();&lt;br&gt;\n     * 2. export()必须是幂等的,也就是暴露同一个URL的Invoker两次,和暴露一次没有区别。&lt;br&gt;\n     * 3. export()传入的Invoker由框架实现并传入,协议不需要关心。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; 服务的类型\n     * <span class=\"hljs-doctag\">@param</span> invoker 服务的执行体\n     * <span class=\"hljs-doctag\">@return</span> exporter 暴露服务的引用,用于取消暴露\n     * <span class=\"hljs-doctag\">@throws</span> RpcException 当暴露服务出错时抛出,比如端口已占用\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n    <span class=\"hljs-comment\">/**\n     * 引用远程服务:&lt;br&gt;\n     * 1. 当用户调用refer()所返回的Invoker对象的invoke()方法时,协议需相应执行同URL远端export()传入的Invoker对象的invoke()方法。&lt;br&gt;\n     * 2. refer()返回的Invoker由协议实现,协议通常需要在此Invoker中发送远程请求。&lt;br&gt;\n     * 3. 当url中有设置check=false时,连接失败不能抛出异常,需内部自动恢复。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; 服务的类型\n     * <span class=\"hljs-doctag\">@param</span> type 服务的类型\n     * <span class=\"hljs-doctag\">@param</span> url 远程服务的URL地址\n     * <span class=\"hljs-doctag\">@return</span> invoker 服务的本地代理\n     * <span class=\"hljs-doctag\">@throws</span> RpcException 当连接服务提供方失败时抛出\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n}\n</code></pre>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 声明协议,如果没有配置id,将以name为id --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用协议,如果没有配置protocol属性,将在ApplicationContext中自动扫描protocol配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用协议缺省值,当&lt;dubbo:service&gt;没有配置prototol属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.injvm.InjvmProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.DubboProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.rmi.RmiProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.HttpProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.hessian.HessianProtocol</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven项目结构:</p>\n<pre><code>\nsrc\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProtocol.java (实现Protocol接口)\n                |-XxxExporter.java (实现Exporter接口)\n                |-XxxInvoker.java (实现Invoker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Protocol (纯文本文件,内容为:xxx=com.xxx.XxxProtocol)\n</code></pre>\n<p>XxxProtocol.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExporter(invoker);\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxInvoker(type, url);\n    }\n}\n</code></pre>\n<p>XxxExporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractExporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxExporter</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(invoker);\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexport</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">super</span>.unexport();\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxInvoker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractInvoker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxInvoker</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(type, url);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">abstract</span> Object <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProtocol</span>\n</code></pre>\n"
+  "__html": "<h1>协议扩展</h1>\n<h2>扩展说明</h2>\n<p>RPC 协议扩展,封装远程调用细节。</p>\n<p>契约:</p>\n<ul>\n<li>当用户调用 <code>refer()</code> 所返回的 <code>Invoker</code> 对象的 <code>invoke()</code> 方法时,协议需相应执行同 URL 远端 <code>export()</code> 传入的 <code>Invoker</code> 对象的 <code>invoke()</code> 方法。</li>\n<li>其中,<code>refer()</code> 返回的 <code>Invoker</code> 由协议实现,协议通常需要在此 <code>Invoker</code> 中发送远程请求,<code>export()</code> 传入的 <code>Invoker</code> 由框架实现并传入,协议不需要关心。</li>\n</ul>\n<p>注意:</p>\n<ul>\n<li>协议不关心业务接口的透明代理,以 <code>Invoker</code> 为中心,由外层将 <code>Invoker</code> 转换为业务接口。</li>\n<li>协议不一定要是 TCP 网络通讯,比如通过共享文件,IPC 进程间通讯等。</li>\n</ul>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.Protocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.Exporter</code></li>\n<li><code>com.alibaba.dubbo.rpc.Invoker</code></li>\n</ul>\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\">Protocol</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * 暴露远程服务:&lt;br&gt;\n     * 1. 协议在接收请求时,应记录请求来源方地址信息:RpcContext.getContext().setRemoteAddress();&lt;br&gt;\n     * 2. export()必须是幂等的,也就是暴露同一个URL的Invoker两次,和暴露一次没有区别。&lt;br&gt;\n     * 3. export()传入的Invoker由框架实现并传入,协议不需要关心。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; 服务的类型\n     * <span class=\"hljs-doctag\">@param</span> invoker 服务的执行体\n     * <span class=\"hljs-doctag\">@return</span> exporter 暴露服务的引用,用于取消暴露\n     * <span class=\"hljs-doctag\">@throws</span> RpcException 当暴露服务出错时抛出,比如端口已占用\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n    <span class=\"hljs-comment\">/**\n     * 引用远程服务:&lt;br&gt;\n     * 1. 当用户调用refer()所返回的Invoker对象的invoke()方法时,协议需相应执行同URL远端export()传入的Invoker对象的invoke()方法。&lt;br&gt;\n     * 2. refer()返回的Invoker由协议实现,协议通常需要在此Invoker中发送远程请求。&lt;br&gt;\n     * 3. 当url中有设置check=false时,连接失败不能抛出异常,需内部自动恢复。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> &lt;T&gt; 服务的类型\n     * <span class=\"hljs-doctag\">@param</span> type 服务的类型\n     * <span class=\"hljs-doctag\">@param</span> url 远程服务的URL地址\n     * <span class=\"hljs-doctag\">@return</span> invoker 服务的本地代理\n     * <span class=\"hljs-doctag\">@throws</span> RpcException 当连接服务提供方失败时抛出\n     */</span>\n    &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n \n}\n</code></pre>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 声明协议,如果没有配置id,将以name为id --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用协议,如果没有配置protocol属性,将在ApplicationContext中自动扫描protocol配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用协议缺省值,当&lt;dubbo:service&gt;没有配置prototol属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.injvm.InjvmProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.DubboProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.rmi.RmiProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.HttpProtocol</code></li>\n<li><code>com.alibaba.dubbo.rpc.http.hessian.HessianProtocol</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven项目结构:</p>\n<pre><code>\nsrc\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProtocol.java (实现Protocol接口)\n                |-XxxExporter.java (实现Exporter接口)\n                |-XxxInvoker.java (实现Invoker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.Protocol (纯文本文件,内容为:xxx=com.xxx.XxxProtocol)\n</code></pre>\n<p>XxxProtocol.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Protocol;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProtocol</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Protocol</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Exporter&lt;T&gt; <span class=\"hljs-title\">export</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxExporter(invoker);\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">refer</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxInvoker(type, url);\n    }\n}\n</code></pre>\n<p>XxxExporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractExporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractExporter</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxExporter</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(invoker);\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unexport</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">super</span>.unexport();\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxInvoker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.support.AbstractInvoker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractInvoker</span>&lt;<span class=\"hljs-title\">T</span>&gt; </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxInvoker</span><span class=\"hljs-params\">(Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(type, url);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">abstract</span> Object <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProtocol</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/protocol.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/proxy-factory.json b/zh-cn/docs/dev/impls/proxy-factory.json
index 830d1560..9d3aea6a 100644
--- a/zh-cn/docs/dev/impls/proxy-factory.json
+++ b/zh-cn/docs/dev/impls/proxy-factory.json
@@ -1,4 +1,6 @@
 {
   "filename": "proxy-factory.md",
-  "__html": "<h1>动态代理扩展</h1>\n<h2>扩展说明</h2>\n<p>将 <code>Invoker</code> 接口转换成业务接口。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.ProxyFactory</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值配置,当&lt;dubbo:protocol&gt;没有配置proxy属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.proxy.JdkProxyFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.proxy.JavassistProxyFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProxyFactory.java (实现ProxyFactory接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ProxyFactory (纯文本文件,内容为:xxx=com.xxx.XxxProxyFactory)\n</code></pre>\n<p>XxxProxyFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ProxyFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProxyFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ProxyFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">T <span class=\"hljs-title\">getProxy</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">getInvoker</span><span class=\"hljs-params\">(T proxy, Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ProxyFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProxyFactory</span>\n</code></pre>\n"
+  "__html": "<h1>动态代理扩展</h1>\n<h2>扩展说明</h2>\n<p>将 <code>Invoker</code> 接口转换成业务接口。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.rpc.ProxyFactory</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值配置,当&lt;dubbo:protocol&gt;没有配置proxy属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">proxy</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.proxy.JdkProxyFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.proxy.JavassistProxyFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxProxyFactory.java (实现ProxyFactory接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.ProxyFactory (纯文本文件,内容为:xxx=com.xxx.XxxProxyFactory)\n</code></pre>\n<p>XxxProxyFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.ProxyFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxProxyFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ProxyFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">T <span class=\"hljs-title\">getProxy</span><span class=\"hljs-params\">(Invoker&lt;T&gt; invoker)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-function\">Invoker&lt;T&gt; <span class=\"hljs-title\">getInvoker</span><span class=\"hljs-params\">(T proxy, Class&lt;T&gt; type, URL url)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.ProxyFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxProxyFactory</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/proxy-factory.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/registry.json b/zh-cn/docs/dev/impls/registry.json
index b3c63fad..547e12f7 100644
--- a/zh-cn/docs/dev/impls/registry.json
+++ b/zh-cn/docs/dev/impls/registry.json
@@ -1,4 +1,6 @@
 {
   "filename": "registry.md",
-  "__html": "<h1>注册中心扩展</h1>\n<h2>扩展说明</h2>\n<p>负责服务的注册与发现。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.registry.RegistryFactory</code></li>\n<li><code>com.alibaba.dubbo.registry.Registry</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 定义注册中心 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用注册中心,如果没有配置registry属性,将在ApplicationContext中自动扫描registry配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用注册中心缺省值,当&lt;dubbo:service&gt;没有配置registry属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>扩展契约</h2>\n<p>RegistryFactory.java:</p>\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\">RegistryFactory</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * 连接注册中心.\n     * \n     * 连接注册中心需处理契约:&lt;br&gt;\n     * 1. 当设置check=false时表示不检查连接,否则在连接不上时抛出异常。&lt;br&gt;\n     * 2. 支持URL上的username:password权限认证。&lt;br&gt;\n     * 3. 支持backup=10.20.153.10备选注册中心集群地址。&lt;br&gt;\n     * 4. 支持file=registry.cache本地磁盘文件缓存。&lt;br&gt;\n     * 5. 支持timeout=1000请求超时设置。&lt;br&gt;\n     * 6. 支持session=60000会话超时或过期设置。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 注册中心地址,不允许为空\n     * <span class=\"hljs-doctag\">@return</span> 注册中心引用,总不返回空\n     */</span>\n    <span class=\"hljs-function\">Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span></span>; \n}\n</code></pre>\n<p>RegistryService.java:</p>\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\">RegistryService</span> </span>{ <span class=\"hljs-comment\">// Registry extends RegistryService </span>\n    <span class=\"hljs-comment\">/**\n     * 注册服务.\n     * \n     * 注册需处理契约:&lt;br&gt;\n     * 1. 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。&lt;br&gt;\n     * 2. 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。&lt;br&gt;\n     * 3. 当URL设置了category=overrides时,表示分类存储,缺省类别为providers,可按分类部分通知数据。&lt;br&gt;\n     * 4. 当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。&lt;br&gt;\n     * 5. 允许URI相同但参数不同的URL并存,不能覆盖。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 取消注册服务.\n     * \n     * 取消注册需处理契约:&lt;br&gt;\n     * 1. 如果是dynamic=false的持久存储数据,找不到注册数据,则抛IllegalStateException,否则忽略。&lt;br&gt;\n     * 2. 按全URL匹配取消注册。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 订阅服务.\n     * \n     * 订阅需处理契约:&lt;br&gt;\n     * 1. 当URL设置了check=false时,订阅失败后不报错,在后台定时重试。&lt;br&gt;\n     * 2. 当URL设置了category=overrides,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。&lt;br&gt;\n     * 3. 允许以interface,group,version,classifier作为条件查询,如:interface=com.alibaba.foo.BarService&amp;version=1.0.0&lt;br&gt;\n     * 4. 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本,或:interface=*&amp;group=*&amp;version=*&amp;classifier=*&lt;br&gt;\n     * 5. 当注册中心重启,网络抖动,需自动恢复订阅请求。&lt;br&gt;\n     * 6. 允许URI相同但参数不同的URL并存,不能覆盖。&lt;br&gt;\n     * 7. 必须阻塞订阅过程,等第一次通知完后再返回。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener 变更事件监听器,不允许为空\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 取消订阅服务.\n     * \n     * 取消订阅需处理契约:&lt;br&gt;\n     * 1. 如果没有订阅,直接忽略。&lt;br&gt;\n     * 2. 按全URL匹配取消订阅。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener 变更事件监听器,不允许为空\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。\n     * \n     * <span class=\"hljs-doctag\">@see</span> com.alibaba.dubbo.registry.NotifyListener#notify(List)\n     * <span class=\"hljs-doctag\">@param</span> url 查询条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@return</span> 已注册信息列表,可能为空,含义同{<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.NotifyListener#notify(List&lt;URL&gt;)}的参数。\n     */</span>\n    <span class=\"hljs-function\">List&lt;URL&gt; <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n}\n</code></pre>\n<p>NotifyListener.java:</p>\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\">NotifyListener</span> </span>{ \n    <span class=\"hljs-comment\">/**\n     * 当收到服务变更通知时触发。\n     * \n     * 通知需处理契约:&lt;br&gt;\n     * 1. 总是以服务接口和数据类型为维度全量通知,即不会通知一个服务的同类型的部分数据,用户不需要对比上一次通知结果。&lt;br&gt;\n     * 2. 订阅时的第一次通知,必须是一个服务的所有类型数据的全量通知。&lt;br&gt;\n     * 3. 中途变更时,允许不同类型的数据分开通知,比如:providers, consumers, routes, overrides,允许只通知其中一种类型,但该类型的数据必须是全量的,不是增量的。&lt;br&gt;\n     * 4. 如果一种类型的数据为空,需通知一个empty协议并带category参数的标识性URL数据。&lt;br&gt;\n     * 5. 通知者(即注册中心实现)需保证通知的顺序,比如:单线程推送,队列串行化,带版本对比。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> urls 已注册信息列表,总不为空,含义同{<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.RegistryService#lookup(URL)}的返回值。\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">notify</span><span class=\"hljs-params\">(List&lt;URL&gt; urls)</span></span>;\n \n}\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.registry.support.dubbo.DubboRegistryFactory</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRegistryFactoryjava (实现RegistryFactory接口)\n                |-XxxRegistry.java (实现Registry接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.registry.RegistryFactory (纯文本文件,内容为:xxx=com.xxx.XxxRegistryFactory)\n</code></pre>\n<p>XxxRegistryFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.RegistryFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistryFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RegistryFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxRegistry(url);\n    }\n}\n</code></pre>\n<p>XxxRegistry.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.NotifyListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistry</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Registry</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.registry.RegistryFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRegistryFactory</span>\n</code></pre>\n"
+  "__html": "<h1>注册中心扩展</h1>\n<h2>扩展说明</h2>\n<p>负责服务的注册与发现。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.registry.RegistryFactory</code></li>\n<li><code>com.alibaba.dubbo.registry.Registry</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 定义注册中心 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"xxx1\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"xxx://ip:port\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用注册中心,如果没有配置registry属性,将在ApplicationContext中自动扫描registry配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 引用注册中心缺省值,当&lt;dubbo:service&gt;没有配置registry属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"xxx1\"</span> /&gt;</span>\n</code></pre>\n<h2>扩展契约</h2>\n<p>RegistryFactory.java:</p>\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\">RegistryFactory</span> </span>{\n    <span class=\"hljs-comment\">/**\n     * 连接注册中心.\n     * \n     * 连接注册中心需处理契约:&lt;br&gt;\n     * 1. 当设置check=false时表示不检查连接,否则在连接不上时抛出异常。&lt;br&gt;\n     * 2. 支持URL上的username:password权限认证。&lt;br&gt;\n     * 3. 支持backup=10.20.153.10备选注册中心集群地址。&lt;br&gt;\n     * 4. 支持file=registry.cache本地磁盘文件缓存。&lt;br&gt;\n     * 5. 支持timeout=1000请求超时设置。&lt;br&gt;\n     * 6. 支持session=60000会话超时或过期设置。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 注册中心地址,不允许为空\n     * <span class=\"hljs-doctag\">@return</span> 注册中心引用,总不返回空\n     */</span>\n    <span class=\"hljs-function\">Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span></span>; \n}\n</code></pre>\n<p>RegistryService.java:</p>\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\">RegistryService</span> </span>{ <span class=\"hljs-comment\">// Registry extends RegistryService </span>\n    <span class=\"hljs-comment\">/**\n     * 注册服务.\n     * \n     * 注册需处理契约:&lt;br&gt;\n     * 1. 当URL设置了check=false时,注册失败后不报错,在后台定时重试,否则抛出异常。&lt;br&gt;\n     * 2. 当URL设置了dynamic=false参数,则需持久存储,否则,当注册者出现断电等情况异常退出时,需自动删除。&lt;br&gt;\n     * 3. 当URL设置了category=overrides时,表示分类存储,缺省类别为providers,可按分类部分通知数据。&lt;br&gt;\n     * 4. 当注册中心重启,网络抖动,不能丢失数据,包括断线自动删除数据。&lt;br&gt;\n     * 5. 允许URI相同但参数不同的URL并存,不能覆盖。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 取消注册服务.\n     * \n     * 取消注册需处理契约:&lt;br&gt;\n     * 1. 如果是dynamic=false的持久存储数据,找不到注册数据,则抛IllegalStateException,否则忽略。&lt;br&gt;\n     * 2. 按全URL匹配取消注册。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 注册信息,不允许为空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 订阅服务.\n     * \n     * 订阅需处理契约:&lt;br&gt;\n     * 1. 当URL设置了check=false时,订阅失败后不报错,在后台定时重试。&lt;br&gt;\n     * 2. 当URL设置了category=overrides,只通知指定分类的数据,多个分类用逗号分隔,并允许星号通配,表示订阅所有分类数据。&lt;br&gt;\n     * 3. 允许以interface,group,version,classifier作为条件查询,如:interface=com.alibaba.foo.BarService&amp;version=1.0.0&lt;br&gt;\n     * 4. 并且查询条件允许星号通配,订阅所有接口的所有分组的所有版本,或:interface=*&amp;group=*&amp;version=*&amp;classifier=*&lt;br&gt;\n     * 5. 当注册中心重启,网络抖动,需自动恢复订阅请求。&lt;br&gt;\n     * 6. 允许URI相同但参数不同的URL并存,不能覆盖。&lt;br&gt;\n     * 7. 必须阻塞订阅过程,等第一次通知完后再返回。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener 变更事件监听器,不允许为空\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 取消订阅服务.\n     * \n     * 取消订阅需处理契约:&lt;br&gt;\n     * 1. 如果没有订阅,直接忽略。&lt;br&gt;\n     * 2. 按全URL匹配取消订阅。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> url 订阅条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@param</span> listener 变更事件监听器,不允许为空\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span></span>;\n \n    <span class=\"hljs-comment\">/**\n     * 查询注册列表,与订阅的推模式相对应,这里为拉模式,只返回一次结果。\n     * \n     * <span class=\"hljs-doctag\">@see</span> com.alibaba.dubbo.registry.NotifyListener#notify(List)\n     * <span class=\"hljs-doctag\">@param</span> url 查询条件,不允许为空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&amp;application=kylin\n     * <span class=\"hljs-doctag\">@return</span> 已注册信息列表,可能为空,含义同{<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.NotifyListener#notify(List&lt;URL&gt;)}的参数。\n     */</span>\n    <span class=\"hljs-function\">List&lt;URL&gt; <span class=\"hljs-title\">lookup</span><span class=\"hljs-params\">(URL url)</span></span>;\n \n}\n</code></pre>\n<p>NotifyListener.java:</p>\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\">NotifyListener</span> </span>{ \n    <span class=\"hljs-comment\">/**\n     * 当收到服务变更通知时触发。\n     * \n     * 通知需处理契约:&lt;br&gt;\n     * 1. 总是以服务接口和数据类型为维度全量通知,即不会通知一个服务的同类型的部分数据,用户不需要对比上一次通知结果。&lt;br&gt;\n     * 2. 订阅时的第一次通知,必须是一个服务的所有类型数据的全量通知。&lt;br&gt;\n     * 3. 中途变更时,允许不同类型的数据分开通知,比如:providers, consumers, routes, overrides,允许只通知其中一种类型,但该类型的数据必须是全量的,不是增量的。&lt;br&gt;\n     * 4. 如果一种类型的数据为空,需通知一个empty协议并带category参数的标识性URL数据。&lt;br&gt;\n     * 5. 通知者(即注册中心实现)需保证通知的顺序,比如:单线程推送,队列串行化,带版本对比。&lt;br&gt;\n     * \n     * <span class=\"hljs-doctag\">@param</span> urls 已注册信息列表,总不为空,含义同{<span class=\"hljs-doctag\">@link</span> com.alibaba.dubbo.registry.RegistryService#lookup(URL)}的返回值。\n     */</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">notify</span><span class=\"hljs-params\">(List&lt;URL&gt; urls)</span></span>;\n \n}\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.registry.support.dubbo.DubboRegistryFactory</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRegistryFactoryjava (实现RegistryFactory接口)\n                |-XxxRegistry.java (实现Registry接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.registry.RegistryFactory (纯文本文件,内容为:xxx=com.xxx.XxxRegistryFactory)\n</code></pre>\n<p>XxxRegistryFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.RegistryFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistryFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RegistryFactory</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Registry <span class=\"hljs-title\">getRegistry</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxRegistry(url);\n    }\n}\n</code></pre>\n<p>XxxRegistry.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.Registry;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.registry.NotifyListener;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.URL;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRegistry</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Registry</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">register</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unregister</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">subscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">unsubscribe</span><span class=\"hljs-params\">(URL url, NotifyListener listener)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.registry.RegistryFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRegistryFactory</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/registry.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/remoting.json b/zh-cn/docs/dev/impls/remoting.json
index 090d5b9a..258ace2b 100644
--- a/zh-cn/docs/dev/impls/remoting.json
+++ b/zh-cn/docs/dev/impls/remoting.json
@@ -1,4 +1,6 @@
 {
   "filename": "remoting.md",
-  "__html": "<h1>网络传输扩展</h1>\n<h2>扩展说明</h2>\n<p>远程通讯的服务器及客户端传输实现。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.Transporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.Server</code></li>\n<li><code>com.alibaba.dubbo.remoting.Client</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 服务器和客户端使用相同的传输实现 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 服务器和客户端使用不同的传输实现 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置transporter/server/client属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.netty.NettyTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.mina.MinaTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.grizzly.GrizzlyTransporter</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTransporter.java (实现Transporter接口)\n                |-XxxServer.java (实现Server接口)\n                |-XxxClient.java (实现Client接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Transporter (纯文本文件,内容为:xxx=com.xxx.XxxTransporter)\n</code></pre>\n<p>XxxTransporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Transporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTransporter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Transporter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxServer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServer</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractServer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Collection&lt;Channel&gt; <span class=\"hljs-title\">getChannels</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">(InetSocketAddress remoteAddress)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxClient</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractClient</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doConnect</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Transporter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTransporter</span>\n</code></pre>\n"
+  "__html": "<h1>网络传输扩展</h1>\n<h2>扩展说明</h2>\n<p>远程通讯的服务器及客户端传输实现。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.Transporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.Server</code></li>\n<li><code>com.alibaba.dubbo.remoting.Client</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 服务器和客户端使用相同的传输实现 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 服务器和客户端使用不同的传输实现 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置transporter/server/client属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">transporter</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"xxx\"</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.netty.NettyTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.mina.MinaTransporter</code></li>\n<li><code>com.alibaba.dubbo.remoting.transport.transporter.grizzly.GrizzlyTransporter</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTransporter.java (实现Transporter接口)\n                |-XxxServer.java (实现Server接口)\n                |-XxxClient.java (实现Client接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.Transporter (纯文本文件,内容为:xxx=com.xxx.XxxTransporter)\n</code></pre>\n<p>XxxTransporter.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.Transporter;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTransporter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Transporter</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Server <span class=\"hljs-title\">bind</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxServer(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Client <span class=\"hljs-title\">connect</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxClient(url, handler);\n    }\n}\n</code></pre>\n<p>XxxServer.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractServer;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServer</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractServer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Collection&lt;Channel&gt; <span class=\"hljs-title\">getChannels</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">(InetSocketAddress remoteAddress)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxClient.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.transport.transporter.AbstractClient;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxClient</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">AbstractClient</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxServer</span><span class=\"hljs-params\">(URL url, ChannelHandler handler)</span> <span class=\"hljs-keyword\">throws</span> RemotingException</span>{\n        <span class=\"hljs-keyword\">super</span>(url, handler);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doOpen</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doClose</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">doConnect</span><span class=\"hljs-params\">()</span> <span class=\"hljs-keyword\">throws</span> Throwable </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Channel <span class=\"hljs-title\">getChannel</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.Transporter:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTransporter</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/remoting.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/router.json b/zh-cn/docs/dev/impls/router.json
index 845fafcd..57c8b2b8 100644
--- a/zh-cn/docs/dev/impls/router.json
+++ b/zh-cn/docs/dev/impls/router.json
@@ -1,4 +1,6 @@
 {
   "filename": "router.md",
-  "__html": "<h1>路由扩展</h1>\n<h2>扩展说明</h2>\n<p>从多个服务提者方中选择一个进行调用。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.RouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.Router</code></li>\n</ul>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.ScriptRouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.FileRouterFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRouterFactory.java (实现LoadBalance接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.RouterFactory (纯文本文件,内容为:xxx=com.xxx.XxxRouterFactory)\n\n</code></pre>\n<p>XxxRouterFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.RouterFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRouterFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RouterFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; List&lt;Invoker&lt;T&gt;&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation) <span class=\"hljs-keyword\">throws</span> RpcException {\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.RouterFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRouterFactory</span>\n</code></pre>\n"
+  "__html": "<h1>路由扩展</h1>\n<h2>扩展说明</h2>\n<p>从多个服务提者方中选择一个进行调用。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.RouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.Router</code></li>\n</ul>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.ScriptRouterFactory</code></li>\n<li><code>com.alibaba.dubbo.rpc.cluster.router.FileRouterFactory</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxRouterFactory.java (实现LoadBalance接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.rpc.cluster.RouterFactory (纯文本文件,内容为:xxx=com.xxx.XxxRouterFactory)\n\n</code></pre>\n<p>XxxRouterFactory.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.cluster.RouterFactory;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invoker;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.Invocation;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxRouterFactory</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">RouterFactory</span> </span>{\n    <span class=\"hljs-keyword\">public</span> &lt;T&gt; List&lt;Invoker&lt;T&gt;&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, Invocation invocation) <span class=\"hljs-keyword\">throws</span> RpcException {\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.RouterFactory:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxRouterFactory</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/router.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/serialize.json b/zh-cn/docs/dev/impls/serialize.json
index 8e2d81dc..3eca291a 100644
--- a/zh-cn/docs/dev/impls/serialize.json
+++ b/zh-cn/docs/dev/impls/serialize.json
@@ -1,4 +1,6 @@
 {
   "filename": "serialize.md",
-  "__html": "<h1>序列化扩展</h1>\n<h2>扩展说明</h2>\n<p>将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectInput</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectOutput</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 协议的序列化方式 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置serialization时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.dubbo.DubboSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.hessian.Hessian2Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.JavaSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.CompactedJavaSerialization</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxSerialization.java (实现Serialization接口)\n                |-XxxObjectInput.java (实现ObjectInput接口)\n                |-XxxObjectOutput.java (实现ObjectOutput接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.serialize.Serialization (纯文本文件,内容为:xxx=com.xxx.XxxSerialization)\n</code></pre>\n<p>XxxSerialization.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.Serialization;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectInput;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectOutput;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxSerialization</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serialization</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectOutput <span class=\"hljs-title\">serialize</span><span class=\"hljs-params\">(Parameters parameters, OutputStream output)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectOutput(output);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectInput <span class=\"hljs-title\">deserialize</span><span class=\"hljs-params\">(Parameters parameters, InputStream input)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectInput(input);\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.serialize.Serialization:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxSerialization</span>\n</code></pre>\n"
+  "__html": "<h1>序列化扩展</h1>\n<h2>扩展说明</h2>\n<p>将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。</p>\n<h2>扩展接口</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectInput</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.ObjectOutput</code></li>\n</ul>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 协议的序列化方式 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置serialization时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.serialize.dubbo.DubboSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.hessian.Hessian2Serialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.JavaSerialization</code></li>\n<li><code>com.alibaba.dubbo.common.serialize.java.CompactedJavaSerialization</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxSerialization.java (实现Serialization接口)\n                |-XxxObjectInput.java (实现ObjectInput接口)\n                |-XxxObjectOutput.java (实现ObjectOutput接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.serialize.Serialization (纯文本文件,内容为:xxx=com.xxx.XxxSerialization)\n</code></pre>\n<p>XxxSerialization.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.Serialization;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectInput;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.serialize.ObjectOutput;\n \n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxSerialization</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serialization</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectOutput <span class=\"hljs-title\">serialize</span><span class=\"hljs-params\">(Parameters parameters, OutputStream output)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectOutput(output);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ObjectInput <span class=\"hljs-title\">deserialize</span><span class=\"hljs-params\">(Parameters parameters, InputStream input)</span> <span class=\"hljs-keyword\">throws</span> IOException </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> XxxObjectInput(input);\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.serialize.Serialization:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxSerialization</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/serialize.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/status-checker.json b/zh-cn/docs/dev/impls/status-checker.json
index 51e3cf08..75427b30 100644
--- a/zh-cn/docs/dev/impls/status-checker.json
+++ b/zh-cn/docs/dev/impls/status-checker.json
@@ -1,4 +1,6 @@
 {
   "filename": "status-checker.md",
-  "__html": "<h1>状态检查扩展</h1>\n<h2>扩展说明</h2>\n<p>检查服务依赖各种资源的状态,此状态检查可同时用于 telnet 的 status 命令和 hosting 的 status 页面。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.status.StatusChecker</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置status属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.status.support.MemoryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.common.status.support.LoadStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ServerStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ThreadPoolStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.registry.directory.RegistryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.SpringStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.DataSourceStatusChecker</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxStatusChecker.java (实现StatusChecker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.status.StatusChecker (纯文本文件,内容为:xxx=com.xxx.XxxStatusChecker)\n</code></pre>\n<p>XxxStatusChecker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.status.StatusChecker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxStatusChecker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">StatusChecker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">check</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.status.StatusChecker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxStatusChecker</span>\n</code></pre>\n"
+  "__html": "<h1>状态检查扩展</h1>\n<h2>扩展说明</h2>\n<p>检查服务依赖各种资源的状态,此状态检查可同时用于 telnet 的 status 命令和 hosting 的 status 页面。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.status.StatusChecker</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置status属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">status</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.status.support.MemoryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.common.status.support.LoadStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ServerStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.status.ThreadPoolStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.registry.directory.RegistryStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.SpringStatusChecker</code></li>\n<li><code>com.alibaba.dubbo.rpc.config.spring.status.DataSourceStatusChecker</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxStatusChecker.java (实现StatusChecker接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.status.StatusChecker (纯文本文件,内容为:xxx=com.xxx.XxxStatusChecker)\n</code></pre>\n<p>XxxStatusChecker.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.status.StatusChecker;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxStatusChecker</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">StatusChecker</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Status <span class=\"hljs-title\">check</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.status.StatusChecker:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxStatusChecker</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/status-checker.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/telnet-handler.json b/zh-cn/docs/dev/impls/telnet-handler.json
index 9ba4c7c8..10dc31f7 100644
--- a/zh-cn/docs/dev/impls/telnet-handler.json
+++ b/zh-cn/docs/dev/impls/telnet-handler.json
@@ -1,4 +1,6 @@
 {
   "filename": "telnet-handler.md",
-  "__html": "<h1>Telnet 命令扩展</h1>\n<h2>扩展说明</h2>\n<p>所有服务器均支持 telnet 访问,用于人工干预。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.remoting.telnet.TelnetHandler</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置telnet属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ClearTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ExitTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.HelpTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.StatusTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ListTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ChangeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CurrentTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.InvokeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.TraceTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CountTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.PortTelnetHandler</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTelnetHandler.java (实现TelnetHandler接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.telnet.TelnetHandler (纯文本文件,内容为:xxx=com.xxx.XxxTelnetHandler)\n</code></pre>\n<p>XxxTelnetHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.telnet.TelnetHandler;\n \n<span class=\"hljs-meta\">@Help</span>(parameter=<span class=\"hljs-string\">\"...\"</span>, summary=<span class=\"hljs-string\">\"...\"</span>, detail=<span class=\"hljs-string\">\"...\"</span>)\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTelnetHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">TelnetHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">telnet</span><span class=\"hljs-params\">(Channel channel, String message)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.telnet.TelnetHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTelnetHandler</span>\n</code></pre>\n<h2>用法</h2>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 20880\ndubbo&gt; xxx args\n</code></pre>\n"
+  "__html": "<h1>Telnet 命令扩展</h1>\n<h2>扩展说明</h2>\n<p>所有服务器均支持 telnet 访问,用于人工干预。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.remoting.telnet.TelnetHandler</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置telnet属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">telnet</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ClearTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.ExitTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.HelpTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.remoting.telnet.support.StatusTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ListTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.ChangeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CurrentTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.InvokeTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.TraceTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.CountTelnetHandler</code></li>\n<li><code>com.alibaba.dubbo.rpc.dubbo.telnet.PortTelnetHandler</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxTelnetHandler.java (实现TelnetHandler接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.remoting.telnet.TelnetHandler (纯文本文件,内容为:xxx=com.xxx.XxxTelnetHandler)\n</code></pre>\n<p>XxxTelnetHandler.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.remoting.telnet.TelnetHandler;\n \n<span class=\"hljs-meta\">@Help</span>(parameter=<span class=\"hljs-string\">\"...\"</span>, summary=<span class=\"hljs-string\">\"...\"</span>, detail=<span class=\"hljs-string\">\"...\"</span>)\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxTelnetHandler</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">TelnetHandler</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">telnet</span><span class=\"hljs-params\">(Channel channel, String message)</span> <span class=\"hljs-keyword\">throws</span> RemotingException </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.remoting.telnet.TelnetHandler:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxTelnetHandler</span>\n</code></pre>\n<h2>用法</h2>\n<pre><code class=\"language-sh\">telnet 127.0.0.1 20880\ndubbo&gt; xxx args\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/telnet-handler.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/threadpool.json b/zh-cn/docs/dev/impls/threadpool.json
index 86dad83b..e5a508a4 100644
--- a/zh-cn/docs/dev/impls/threadpool.json
+++ b/zh-cn/docs/dev/impls/threadpool.json
@@ -1,4 +1,6 @@
 {
   "filename": "threadpool.md",
-  "__html": "<h1>线程池扩展</h1>\n<h2>扩展说明</h2>\n<p>服务提供方线程程实现策略,当服务器收到一个请求时,需要在线程池中创建一个线程去执行服务提供方业务逻辑。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.threadpool.ThreadPool</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置threadpool时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.threadpool.FixedThreadPool</code></li>\n<li><code>com.alibaba.dubbo.common.threadpool.CachedThreadPool</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxThreadPool.java (实现ThreadPool接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.threadpool.ThreadPool (纯文本文件,内容为:xxx=com.xxx.XxxThreadPool)\n</code></pre>\n<p>XxxThreadPool.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.threadpool.ThreadPool;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.Executor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxThreadPool</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ThreadPool</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Executor <span class=\"hljs-title\">getExecutor</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.threadpool.ThreadPool:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxThreadPool</span>\n</code></pre>\n"
+  "__html": "<h1>线程池扩展</h1>\n<h2>扩展说明</h2>\n<p>服务提供方线程程实现策略,当服务器收到一个请求时,需要在线程池中创建一个线程去执行服务提供方业务逻辑。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.common.threadpool.ThreadPool</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:protocol&gt;没有配置threadpool时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"xxx\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<ul>\n<li><code>com.alibaba.dubbo.common.threadpool.FixedThreadPool</code></li>\n<li><code>com.alibaba.dubbo.common.threadpool.CachedThreadPool</code></li>\n</ul>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxThreadPool.java (实现ThreadPool接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.common.threadpool.ThreadPool (纯文本文件,内容为:xxx=com.xxx.XxxThreadPool)\n</code></pre>\n<p>XxxThreadPool.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.common.threadpool.ThreadPool;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.Executor;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxThreadPool</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">ThreadPool</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Executor <span class=\"hljs-title\">getExecutor</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.common.threadpool.ThreadPool:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxThreadPool</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/threadpool.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/validation.json b/zh-cn/docs/dev/impls/validation.json
index 126b2d11..52cb8afa 100644
--- a/zh-cn/docs/dev/impls/validation.json
+++ b/zh-cn/docs/dev/impls/validation.json
@@ -1,4 +1,6 @@
 {
   "filename": "validation.md",
-  "__html": "<h1>验证扩展</h1>\n<h2>扩展说明</h2>\n<p>参数验证扩展点。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.validation.Validation</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:service&gt;没有配置validation属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.validation.support.jvalidation.JValidation</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxValidation.java (实现Validation接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.validation.Validation (纯文本文件,内容为:xxx=com.xxx.XxxValidation)\n</code></pre>\n<p>XxxValidation.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validation;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidation</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validation</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxValidator.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validator;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidator</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validator</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">validate</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.validation.Validation:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxValidation</span>\n</code></pre>\n"
+  "__html": "<h1>验证扩展</h1>\n<h2>扩展说明</h2>\n<p>参数验证扩展点。</p>\n<h2>扩展接口</h2>\n<p><code>com.alibaba.dubbo.validation.Validation</code></p>\n<h2>扩展配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 缺省值设置,当&lt;dubbo:service&gt;没有配置validation属性时,使用此配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"xxx,yyy\"</span> /&gt;</span>\n</code></pre>\n<h2>已知扩展</h2>\n<p><code>com.alibaba.dubbo.validation.support.jvalidation.JValidation</code></p>\n<h2>扩展示例</h2>\n<p>Maven 项目结构:</p>\n<pre><code>src\n |-main\n    |-java\n        |-com\n            |-xxx\n                |-XxxValidation.java (实现Validation接口)\n    |-resources\n        |-META-INF\n            |-dubbo\n                |-com.alibaba.dubbo.validation.Validation (纯文本文件,内容为:xxx=com.xxx.XxxValidation)\n</code></pre>\n<p>XxxValidation.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validation;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidation</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validation</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">getValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>XxxValidator.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.validation.Validator;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxValidator</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Validator</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">XxxValidator</span><span class=\"hljs-params\">(URL url)</span> </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">validate</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        <span class=\"hljs-comment\">// ...</span>\n    }\n}\n</code></pre>\n<p>META-INF/dubbo/com.alibaba.dubbo.validation.Validation:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-attr\">xxx</span>=<span class=\"hljs-string\">com.xxx.XxxValidation</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/impls/validation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/introduction.json b/zh-cn/docs/dev/introduction.json
index 46bfd317..1fae9b43 100644
--- a/zh-cn/docs/dev/introduction.json
+++ b/zh-cn/docs/dev/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<p>这里增加《开发指南》的内容</p>\n"
+  "__html": "<p>这里增加《开发指南》的内容</p>\n",
+  "link": "/zh-cn/docs/dev/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/code-detail.json b/zh-cn/docs/dev/principals/code-detail.json
index ccdcf155..00c06cf3 100644
--- a/zh-cn/docs/dev/principals/code-detail.json
+++ b/zh-cn/docs/dev/principals/code-detail.json
@@ -1,4 +1,6 @@
 {
   "filename": "code-detail.md",
-  "__html": "<h1>魔鬼在细节</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/1056664\">http://javatar.iteye.com/blog/1056664</a></p>\n</blockquote>\n<p>最近一直担心 Dubbo 分布式服务框架后续如果维护人员增多或变更,会出现质量的下降, 我在想,有没有什么是需要大家共同遵守的,根据平时写代码时的一习惯,总结了一下在写代码过程中,尤其是框架代码,要时刻牢记的细节。可能下面要讲的这些,大家都会觉得很简单,很基础,但要做到时刻牢记。在每一行代码中都考虑这些因素,是需要很大耐心的, 大家经常说,魔鬼在细节中,确实如此。</p>\n<h2>防止空指针和下标越界</h2>\n<p>这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常。这也是一个健状的程序开发人员,在写每一行代码都应在潜意识中防止的异常。基本上要能确保一次写完的代码,在不测试的情况,都不会出现这两个异常才算合格。</p>\n<h2>保证线程安全性和可见性</h2>\n<p>对于框架的开发人员,对线程安全性和可见性的深入理解是最基本的要求。需要开发人员,在写每一行代码时都应在潜意识中确保其正确性。因为这种代码,在小并发下做功能测试时,会显得很正常。但在高并发下就会出现莫明其妙的问题,而且场景很难重现,极难排查。</p>\n<h2>尽早失败和前置断言</h2>\n<p>尽早失败也应该成为潜意识,在有传入参数和状态变化时,均在入口处全部断言。一个不合法的值和状态,在第一时间就应报错,而不是等到要用时才报错。因为等到要用时,可能前面已经修改其它相关状态,而在程序中很少有人去处理回滚逻辑。这样报错后,其实内部状态可能已经混乱,极易在一个隐蔽分支上引发程序不可恢复。</p>\n<h2>分离可靠操作和不可靠操作</h2>\n<p>这里的可靠是狭义的指是否会抛出异常或引起状态不一致,比如,写入一个线程安全的 Map,可以认为是可靠的,而写入数据库等,可以认为是不可靠的。开发人员必须在写每一行代码时,都注意它的可靠性与否,在代码中尽量划分开,并对失败做异常处理,并为容错,自我保护,自动恢复或切换等补偿逻辑提供清晰的切入点,保证后续增加的代码不至于放错位置,而导致原先的容错处理陷入混乱。</p>\n<h2>异常防御,但不忽略异常</h2>\n<p>这里讲的异常防御,指的是对非必须途径上的代码进行最大限度的容忍,包括程序上的 BUG,比如:获取程序的版本号,会通过扫描 Manifest 和 jar 包名称抓取版本号,这个逻辑是辅助性的,但代码却不少,初步测试也没啥问题,但应该在整个 getVersion() 中加上一个全函数的 try-catch 打印错误日志,并返回基本版本,因为 getVersion() 可能存在未知特定场景异常,或被其他的开发人员误修改逻辑(但一般人员不会去掉 try-catch),而如果它抛出异常会导致主流程异常,这是我们不希望看到的。但这里要控制个度,不要随意 try-catch,更不要无声无息的吃掉异常。</p>\n<h2>缩小可变域和尽量 final</h2>\n<p>如果一个类可以成为不变类(Immutable Class),就优先将它设计成不变类。不变类有天然的并发共享优势,减少同步或复制,而且可以有效帮忙分析线程安全的范围。就算是可变类,对于从构造函数传入的引用,在类中持有时,最好将字段 final,以免被中途误修改引用。不要以为这个字段是私有的,这个类的代码都是我自己写的,不会出现对这个字段的重新赋值。要考虑的一个因素是,这个代码可能被其他人修改,他不知道你的这个弱约定,final 就是一个不变契约。</p>\n<h2>降低修改时的误解性,不埋雷</h2>\n<p>前面不停的提到代码被其他人修改,这也开发人员要随时紧记的。这个其他人包括未来的自己,你要总想着这个代码可能会有人去改它。我应该给修改的人一点什么提示,让他知道我现在的设计意图,而不要在程序里面加潜规则,或埋一些容易忽视的雷,比如:你用 null 表示不可用,size 等于 0 表示黑名单,这就是一个雷,下一个修改者,包括你自己,都不会记得有这样的约定,可能后面为了改某个其它 BUG,不小心改到了这里,直接引爆故障。对于这个例子,一个原则就是永远不要区分 null 引用和 empty 值。</p>\n<h2>提高代码的可测性</h2>\n<p>这里的可测性主要指 Mock 的容易程度,和测试的隔离性。至于测试的自动性,可重复性,非偶然性,无序性,完备性(全覆盖),轻量性(可快速执行),一般开发人员,加上 JUnit 等工具的辅助基本都能做到,也能理解它的好处,只是工作量问题。这里要特别强调的是测试用例的单一性(只测目标类本身)和隔离性(不传染失败)。现在的测试代码,过于强调完备性,大量重复交叉测试,看起来没啥坏处,但测试代码越多,维护代价越高。经常出现的问题是,修改一行代码或加一个判断条件,引起 100 多个测试用例不通过。时间一紧,谁有这个闲功夫去改这么多形态各异的测试用例?久而久之,这个测试代码就已经不能真实反应代码现在的状况,很多时候会被迫绕过。最好的情况是,修改一行代码,有且只有一行测试代码不通过。如果修改了代码而测试用例还能通过,那也不行,表示测试没有覆盖到。另外,可 Mock 性是隔离的基础,把间接依赖的逻辑屏蔽掉。可 Mock 性的一个最大的杀手就是静态方法,尽量少用。</p>\n"
+  "__html": "<h1>魔鬼在细节</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/1056664\">http://javatar.iteye.com/blog/1056664</a></p>\n</blockquote>\n<p>最近一直担心 Dubbo 分布式服务框架后续如果维护人员增多或变更,会出现质量的下降, 我在想,有没有什么是需要大家共同遵守的,根据平时写代码时的一习惯,总结了一下在写代码过程中,尤其是框架代码,要时刻牢记的细节。可能下面要讲的这些,大家都会觉得很简单,很基础,但要做到时刻牢记。在每一行代码中都考虑这些因素,是需要很大耐心的, 大家经常说,魔鬼在细节中,确实如此。</p>\n<h2>防止空指针和下标越界</h2>\n<p>这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常。这也是一个健状的程序开发人员,在写每一行代码都应在潜意识中防止的异常。基本上要能确保一次写完的代码,在不测试的情况,都不会出现这两个异常才算合格。</p>\n<h2>保证线程安全性和可见性</h2>\n<p>对于框架的开发人员,对线程安全性和可见性的深入理解是最基本的要求。需要开发人员,在写每一行代码时都应在潜意识中确保其正确性。因为这种代码,在小并发下做功能测试时,会显得很正常。但在高并发下就会出现莫明其妙的问题,而且场景很难重现,极难排查。</p>\n<h2>尽早失败和前置断言</h2>\n<p>尽早失败也应该成为潜意识,在有传入参数和状态变化时,均在入口处全部断言。一个不合法的值和状态,在第一时间就应报错,而不是等到要用时才报错。因为等到要用时,可能前面已经修改其它相关状态,而在程序中很少有人去处理回滚逻辑。这样报错后,其实内部状态可能已经混乱,极易在一个隐蔽分支上引发程序不可恢复。</p>\n<h2>分离可靠操作和不可靠操作</h2>\n<p>这里的可靠是狭义的指是否会抛出异常或引起状态不一致,比如,写入一个线程安全的 Map,可以认为是可靠的,而写入数据库等,可以认为是不可靠的。开发人员必须在写每一行代码时,都注意它的可靠性与否,在代码中尽量划分开,并对失败做异常处理,并为容错,自我保护,自动恢复或切换等补偿逻辑提供清晰的切入点,保证后续增加的代码不至于放错位置,而导致原先的容错处理陷入混乱。</p>\n<h2>异常防御,但不忽略异常</h2>\n<p>这里讲的异常防御,指的是对非必须途径上的代码进行最大限度的容忍,包括程序上的 BUG,比如:获取程序的版本号,会通过扫描 Manifest 和 jar 包名称抓取版本号,这个逻辑是辅助性的,但代码却不少,初步测试也没啥问题,但应该在整个 getVersion() 中加上一个全函数的 try-catch 打印错误日志,并返回基本版本,因为 getVersion() 可能存在未知特定场景异常,或被其他的开发人员误修改逻辑(但一般人员不会去掉 try-catch),而如果它抛出异常会导致主流程异常,这是我们不希望看到的。但这里要控制个度,不要随意 try-catch,更不要无声无息的吃掉异常。</p>\n<h2>缩小可变域和尽量 final</h2>\n<p>如果一个类可以成为不变类(Immutable Class),就优先将它设计成不变类。不变类有天然的并发共享优势,减少同步或复制,而且可以有效帮忙分析线程安全的范围。就算是可变类,对于从构造函数传入的引用,在类中持有时,最好将字段 final,以免被中途误修改引用。不要以为这个字段是私有的,这个类的代码都是我自己写的,不会出现对这个字段的重新赋值。要考虑的一个因素是,这个代码可能被其他人修改,他不知道你的这个弱约定,final 就是一个不变契约。</p>\n<h2>降低修改时的误解性,不埋雷</h2>\n<p>前面不停的提到代码被其他人修改,这也开发人员要随时紧记的。这个其他人包括未来的自己,你要总想着这个代码可能会有人去改它。我应该给修改的人一点什么提示,让他知道我现在的设计意图,而不要在程序里面加潜规则,或埋一些容易忽视的雷,比如:你用 null 表示不可用,size 等于 0 表示黑名单,这就是一个雷,下一个修改者,包括你自己,都不会记得有这样的约定,可能后面为了改某个其它 BUG,不小心改到了这里,直接引爆故障。对于这个例子,一个原则就是永远不要区分 null 引用和 empty 值。</p>\n<h2>提高代码的可测性</h2>\n<p>这里的可测性主要指 Mock 的容易程度,和测试的隔离性。至于测试的自动性,可重复性,非偶然性,无序性,完备性(全覆盖),轻量性(可快速执行),一般开发人员,加上 JUnit 等工具的辅助基本都能做到,也能理解它的好处,只是工作量问题。这里要特别强调的是测试用例的单一性(只测目标类本身)和隔离性(不传染失败)。现在的测试代码,过于强调完备性,大量重复交叉测试,看起来没啥坏处,但测试代码越多,维护代价越高。经常出现的问题是,修改一行代码或加一个判断条件,引起 100 多个测试用例不通过。时间一紧,谁有这个闲功夫去改这么多形态各异的测试用例?久而久之,这个测试代码就已经不能真实反应代码现在的状况,很多时候会被迫绕过。最好的情况是,修改一行代码,有且只有一行测试代码不通过。如果修改了代码而测试用例还能通过,那也不行,表示测试没有覆盖到。另外,可 Mock 性是隔离的基础,把间接依赖的逻辑屏蔽掉。可 Mock 性的一个最大的杀手就是静态方法,尽量少用。</p>\n",
+  "link": "/zh-cn/docs/dev/principals/code-detail.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/configuration.json b/zh-cn/docs/dev/principals/configuration.json
index 88823b08..64a0a536 100644
--- a/zh-cn/docs/dev/principals/configuration.json
+++ b/zh-cn/docs/dev/principals/configuration.json
@@ -1,4 +1,6 @@
 {
   "filename": "configuration.md",
-  "__html": "<h1>配置设计</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/949527\">http://javatar.iteye.com/blog/949527</a></p>\n</blockquote>\n<p>Dubbo 现在的设计是完全无侵入,也就是使用者只依赖于配置契约。经过多个版本的发展,为了满足各种需求场景,配置越来越多。为了保持兼容,配置只增不减,里面潜伏着各种风格,约定,规则。新版本也将配置做了一次调整,去掉了 dubbo.properties,改为全 spring 配置。将想到的一些记在这,备忘。</p>\n<h2>配置分类</h2>\n<p>首先,配置的用途是有多种的,大致可以分为:</p>\n<ol start=\"0\">\n<li>环境配置,比如:连接数,超时等配置。</li>\n<li>描述配置,比如:服务接口描述,服务版本等。</li>\n<li>扩展配置,比如:协议扩展,策略扩展等。</li>\n</ol>\n<h2>配置格式</h2>\n<p>通常环境配置,用 properties 配置会比较方便,因为都是一些离散的简单值,用 key-value 配置可以减少配置的学习成本。</p>\n<p>而描述配置,通常信息比较多,甚至有层次关系,用 xml 配置会比较方便,因为树结构的配置表现力更强。如果非常复杂,也可以考自定义 DSL 做为配置。有时候这类配置也可以用 Annotation 代替, 因为这些配置和业务逻辑相关,放在代码里也是合理的。</p>\n<p>另外扩展配置,可能不尽相同。如果只是策略接口实现类替换,可以考虑 properties 等结构。如果有复杂的生命周期管理,可能需要 XML 等配置。有时候扩展会通过注册接口的方式提供。</p>\n<h2>配置加载</h2>\n<p>对于环境配置,在 java 世界里,比较常规的做法,是在 classpath 下约定一个以项目为名称的 properties 配置,比如:log4j.properties,velocity.properties等。产品在初始化时,自动从 classpath 下加载该配置。我们平台的很多项目也使用类似策略,如:dubbo.properties,comsat.xml 等。这样有它的优势,就是基于约定,简化了用户对配置加载过程的干预。但同样有它的缺点,当 classpath 存在同样的配置时,可能误加载,以及在 ClassLoader 隔离时,可能找不到配置,并且,当用户希望将配置放到统一的目录时,不太方便。</p>\n<p>Dubbo 新版本去掉了 dubbo.properties,因为该约定经常造成配置冲突。</p>\n<p>而对于描述配置,因为要参与业务逻辑,通常会嵌到应用的生命周期管理中。现在使用 spring 的项目越来越多,直接使用 spring 配置的比较普遍,而且 spring 允许自定义 schema,配置简化后很方便。当然,也有它的缺点,就是强依赖 spring,可以提编程接口做了配套方案。</p>\n<p>在 Dubbo 即存在描述配置,也有环境配置。一部分用 spring 的 schame 配置加载,一部分从 classpath 扫描 properties 配置加载。用户感觉非常不便,所以在新版本中进行了合并,统一放到 spring 的 schame 配置加载,也增加了配置的灵活性。</p>\n<p>扩展配置,通常对配置的聚合要求比较高。因为产品需要发现第三方实现,将其加入产品内部。在 java 世界里,通常是约定在每个 jar 包下放一个指定文件加载,比如:eclipse 的 plugin.xml,struts2 的 struts-plugin.xml 等,这类配置可以考虑 java 标准的服务发现机制,即在 jar 包的 META-INF/services 下放置接口类全名文件,内容为每行一个实现类类名,就像 jdk 中的加密算法扩展,脚本引擎扩展,新的 JDBC 驱动等,都是采用这种方式。参见:<a href=\"http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider\">ServiceProvider 规范</a>。</p>\n<p>Dubbo 旧版本通过约定在每个 jar 包下,放置名为 dubbo-context.xml 的 spring 配置进行扩展与集成,新版本改成用 jdk 自带的 META-INF/services 方式,去掉过多的 spring 依赖。</p>\n<h2>可编程配置</h2>\n<p>配置的可编程性是非常必要的,不管你以何种方式加载配置文件,都应该提供一个编程的配置方式,允许用户不使用配置文件,直接用代码完成配置过程。因为一个产品,尤其是组件类产品,通常需要和其它产品协作使用,当用户集成你的产品时,可能需要适配配置方式。</p>\n<p>Dubbo 新版本提供了与 xml 配置一对一的配置类,如:ServiceConfig 对应 <code>&lt;dubbo:service /&gt;</code>,并且属性也一对一,这样有利于文件配置与编程配置的一致性理解,减少学习成本。</p>\n<h2>配置缺省值</h2>\n<p>配置的缺省值,通常是设置一个常规环境的合理值,这样可以减少用户的配置量。通常建议以线上环境为参考值,开发环境可以通过修改配置适应。缺省值的设置,最好在最外层的配置加载就做处理。程序底层如果发现配置不正确,就应该直接报错,容错在最外层做。如果在程序底层使用时,发现配置值不合理,就填一个缺省值,很容易掩盖表面问题,而引发更深层次的问题。并且配置的中间传递层,很可能并不知道底层使用了一个缺省值,一些中间的检测条件就可能失效。Dubbo 就出现过这样的问题,中间层用“地址”做为缓存 Key, 而底层,给“地址”加了一个缺省端口号,导致不加端口号的“地址”和加了缺省端口的“地址”并没有使用相同的缓存。</p>\n<h2>配置一致性</h2>\n<p>配置总会隐含一些风格或潜规则,应尽可能保持其一致性。比如:很多功能都有开关,然后有一个配置值:</p>\n<ol start=\"0\">\n<li>是否使用注册中心,注册中心地址。</li>\n<li>是否允许重试,重试次数。</li>\n</ol>\n<p>你可以约定:</p>\n<ol start=\"0\">\n<li>每个都是先配置一个 boolean 类型的开关,再配置一个值。</li>\n<li>用一个无效值代表关闭,N/A地址,0重试次数等。</li>\n</ol>\n<p>不管选哪种方式,所有配置项,都应保持同一风格,Dubbo 选的是第二种。相似的还有,超时时间,重试时间,定时器间隔时间。如果一个单位是秒,另一个单位是毫秒(C3P0的配置项就是这样),配置人员会疯掉。</p>\n<h2>配置覆盖</h2>\n<p>提供配置时,要同时考虑开发人员,测试人员,配管人员,系统管理员。测试人员是不能修改代码的,而测试的环境很可能较为复杂,需要为测试人员留一些“后门”,可以在外围修改配置项。就像 spring 的 PropertyPlaceholderConfigurer 配置,支持 <code>SYSTEM_PROPERTIES_MODE_OVERRIDE</code>,可以通过 JVM 的 -D 参数,或者像 hosts 一样约定一个覆盖配置文件,在程序外部,修改部分配置,便于测试。</p>\n<p>Dubbo 支持通过 JVM 参数 <code>-Dcom.xxx.XxxService=dubbo://10.1.1.1:1234</code> 直接使远程服务调用绕过注册中心,进行点对点测试。还有一种情况,开发人员增加配置时,都会按线上的部署情况做配置,如:<code>&lt;dubbo:registry address=&quot;${dubbo.registry.address}&quot; /&gt;</code> 因为线上只有一个注册中心,这样的配置是没有问题的,而测试环境可能有两个注册中心,测试人员不可能去修改配置,改为:\n<code>&lt;dubbo:registry address=&quot;${dubbo.registry.address1}&quot; /&gt;</code>,\n<code>&lt;dubbo:registry address=&quot;${dubbo.registry.address2}&quot; /&gt;</code>,所以这个地方,Dubbo 支持在 ${dubbo.registry.address} 的值中,通过竖号分隔多个注册中心地址,用于表示多注册中心地址。</p>\n<h2>配置继承</h2>\n<p>配置也存在“重复代码”,也存在“泛化与精化”的问题。比如:Dubbo 的超时时间设置,每个服务,每个方法,都应该可以设置超时时间。但很多服务不关心超时,如果要求每个方法都配置,是不现实的。所以 Dubbo 采用了方法超时继承服务超时,服务超时再继承缺省超时,没配置时,一层层向上查找。</p>\n<p>另外,Dubbo 旧版本所有的超时时间,重试次数,负载均衡策略等都只能在服务消费方配置。但实际使用过程中发现,服务提供方比消费方更清楚,但这些配置项是在消费方执行时才用到的。新版本,就加入了在服务提供方也能配这些参数,通过注册中心传递到消费方,\n做为参考值,如果消费方没有配置,就以提供方的配置为准,相当于消费方继承了提供方的建议配置值。而注册中心在传递配置时,也可以在中途修改配置,这样就达到了治理的目的,继承关系相当于:服务消费者 --&gt; 注册中心 --&gt; 服务提供者</p>\n<p><img src=\"../sources/images/configuration-override.png\" alt=\"configuration-override\"></p>\n<h2>配置向后兼容</h2>\n<p>向前兼容很好办,你只要保证配置只增不减,就基本上能保证向前兼容。但向后兼容,也是要注意的,要为后续加入新的配置项做好准备。如果配置出现一个特殊配置,就应该为这个“特殊”情况约定一个兼容规则,因为这个特殊情况,很有可能在以后还会发生。比如:有一个配置文件是保存“服务=地址”映射关系的,其中有一行特殊,保存的是“注册中心=地址”。现在程序加载时,约定“注册中心”这个Key是特殊的,做特别处理,其它的都是“服务”。然而,新版本发现,要加一项“监控中心=地址”,这时,旧版本的程序会把“监控中心”做为“服务”处理,因为旧代码是不能改的,兼容性就很会很麻烦。如果先前约定“特殊标识+XXX”为特殊处理,后续就会方便很多。</p>\n<p>向后兼容性,可以多向HTML5学习,参见:<a href=\"http://javatar.iteye.com/blog/949390\">HTML5设计原理</a></p>\n"
+  "__html": "<h1>配置设计</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/949527\">http://javatar.iteye.com/blog/949527</a></p>\n</blockquote>\n<p>Dubbo 现在的设计是完全无侵入,也就是使用者只依赖于配置契约。经过多个版本的发展,为了满足各种需求场景,配置越来越多。为了保持兼容,配置只增不减,里面潜伏着各种风格,约定,规则。新版本也将配置做了一次调整,去掉了 dubbo.properties,改为全 spring 配置。将想到的一些记在这,备忘。</p>\n<h2>配置分类</h2>\n<p>首先,配置的用途是有多种的,大致可以分为:</p>\n<ol start=\"0\">\n<li>环境配置,比如:连接数,超时等配置。</li>\n<li>描述配置,比如:服务接口描述,服务版本等。</li>\n<li>扩展配置,比如:协议扩展,策略扩展等。</li>\n</ol>\n<h2>配置格式</h2>\n<p>通常环境配置,用 properties 配置会比较方便,因为都是一些离散的简单值,用 key-value 配置可以减少配置的学习成本。</p>\n<p>而描述配置,通常信息比较多,甚至有层次关系,用 xml 配置会比较方便,因为树结构的配置表现力更强。如果非常复杂,也可以考自定义 DSL 做为配置。有时候这类配置也可以用 Annotation 代替, 因为这些配置和业务逻辑相关,放在代码里也是合理的。</p>\n<p>另外扩展配置,可能不尽相同。如果只是策略接口实现类替换,可以考虑 properties 等结构。如果有复杂的生命周期管理,可能需要 XML 等配置。有时候扩展会通过注册接口的方式提供。</p>\n<h2>配置加载</h2>\n<p>对于环境配置,在 java 世界里,比较常规的做法,是在 classpath 下约定一个以项目为名称的 properties 配置,比如:log4j.properties,velocity.properties等。产品在初始化时,自动从 classpath 下加载该配置。我们平台的很多项目也使用类似策略,如:dubbo.properties,comsat.xml 等。这样有它的优势,就是基于约定,简化了用户对配置加载过程的干预。但同样有它的缺点,当 classpath 存在同样的配置时,可能误加载,以及在 ClassLoader 隔离时,可能找不到配置,并且,当用户希望将配置放到统一的目录时,不太方便。</p>\n<p>Dubbo 新版本去掉了 dubbo.properties,因为该约定经常造成配置冲突。</p>\n<p>而对于描述配置,因为要参与业务逻辑,通常会嵌到应用的生命周期管理中。现在使用 spring 的项目越来越多,直接使用 spring 配置的比较普遍,而且 spring 允许自定义 schema,配置简化后很方便。当然,也有它的缺点,就是强依赖 spring,可以提编程接口做了配套方案。</p>\n<p>在 Dubbo 即存在描述配置,也有环境配置。一部分用 spring 的 schame 配置加载,一部分从 classpath 扫描 properties 配置加载。用户感觉非常不便,所以在新版本中进行了合并,统一放到 spring 的 schame 配置加载,也增加了配置的灵活性。</p>\n<p>扩展配置,通常对配置的聚合要求比较高。因为产品需要发现第三方实现,将其加入产品内部。在 java 世界里,通常是约定在每个 jar 包下放一个指定文件加载,比如:eclipse 的 plugin.xml,struts2 的 struts-plugin.xml 等,这类配置可以考虑 java 标准的服务发现机制,即在 jar 包的 META-INF/services 下放置接口类全名文件,内容为每行一个实现类类名,就像 jdk 中的加密算法扩展,脚本引擎扩展,新的 JDBC 驱动等,都是采用这种方式。参见:<a href=\"http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider\">ServiceProvider 规范</a>。</p>\n<p>Dubbo 旧版本通过约定在每个 jar 包下,放置名为 dubbo-context.xml 的 spring 配置进行扩展与集成,新版本改成用 jdk 自带的 META-INF/services 方式,去掉过多的 spring 依赖。</p>\n<h2>可编程配置</h2>\n<p>配置的可编程性是非常必要的,不管你以何种方式加载配置文件,都应该提供一个编程的配置方式,允许用户不使用配置文件,直接用代码完成配置过程。因为一个产品,尤其是组件类产品,通常需要和其它产品协作使用,当用户集成你的产品时,可能需要适配配置方式。</p>\n<p>Dubbo 新版本提供了与 xml 配置一对一的配置类,如:ServiceConfig 对应 <code>&lt;dubbo:service /&gt;</code>,并且属性也一对一,这样有利于文件配置与编程配置的一致性理解,减少学习成本。</p>\n<h2>配置缺省值</h2>\n<p>配置的缺省值,通常是设置一个常规环境的合理值,这样可以减少用户的配置量。通常建议以线上环境为参考值,开发环境可以通过修改配置适应。缺省值的设置,最好在最外层的配置加载就做处理。程序底层如果发现配置不正确,就应该直接报错,容错在最外层做。如果在程序底层使用时,发现配置值不合理,就填一个缺省值,很容易掩盖表面问题,而引发更深层次的问题。并且配置的中间传递层,很可能并不知道底层使用了一个缺省值,一些中间的检测条件就可能失效。Dubbo 就出现过这样的问题,中间层用“地址”做为缓存 Key, 而底层,给“地址”加了一个缺省端口号,导致不加端口号的“地址”和加了缺省端口的“地址”并没有使用相同的缓存。</p>\n<h2>配置一致性</h2>\n<p>配置总会隐含一些风格或潜规则,应尽可能保持其一致性。比如:很多功能都有开关,然后有一个配置值:</p>\n<ol start=\"0\">\n<li>是否使用注册中心,注册中心地址。</li>\n<li>是否允许重试,重试次数。</li>\n</ol>\n<p>你可以约定:</p>\n<ol start=\"0\">\n<li>每个都是先配置一个 boolean 类型的开关,再配置一个值。</li>\n<li>用一个无效值代表关闭,N/A地址,0重试次数等。</li>\n</ol>\n<p>不管选哪种方式,所有配置项,都应保持同一风格,Dubbo 选的是第二种。相似的还有,超时时间,重试时间,定时器间隔时间。如果一个单位是秒,另一个单位是毫秒(C3P0的配置项就是这样),配置人员会疯掉。</p>\n<h2>配置覆盖</h2>\n<p>提供配置时,要同时考虑开发人员,测试人员,配管人员,系统管理员。测试人员是不能修改代码的,而测试的环境很可能较为复杂,需要为测试人员留一些“后门”,可以在外围修改配置项。就像 spring 的 PropertyPlaceholderConfigurer 配置,支持 <code>SYSTEM_PROPERTIES_MODE_OVERRIDE</code>,可以通过 JVM 的 -D 参数,或者像 hosts 一样约定一个覆盖配置文件,在程序外部,修改部分配置,便于测试。</p>\n<p>Dubbo 支持通过 JVM 参数 <code>-Dcom.xxx.XxxService=dubbo://10.1.1.1:1234</code> 直接使远程服务调用绕过注册中心,进行点对点测试。还有一种情况,开发人员增加配置时,都会按线上的部署情况做配置,如:<code>&lt;dubbo:registry address=&quot;${dubbo.registry.address}&quot; /&gt;</code> 因为线上只有一个注册中心,这样的配置是没有问题的,而测试环境可能有两个注册中心,测试人员不可能去修改配置,改为:\n<code>&lt;dubbo:registry address=&quot;${dubbo.registry.address1}&quot; /&gt;</code>,\n<code>&lt;dubbo:registry address=&quot;${dubbo.registry.address2}&quot; /&gt;</code>,所以这个地方,Dubbo 支持在 ${dubbo.registry.address} 的值中,通过竖号分隔多个注册中心地址,用于表示多注册中心地址。</p>\n<h2>配置继承</h2>\n<p>配置也存在“重复代码”,也存在“泛化与精化”的问题。比如:Dubbo 的超时时间设置,每个服务,每个方法,都应该可以设置超时时间。但很多服务不关心超时,如果要求每个方法都配置,是不现实的。所以 Dubbo 采用了方法超时继承服务超时,服务超时再继承缺省超时,没配置时,一层层向上查找。</p>\n<p>另外,Dubbo 旧版本所有的超时时间,重试次数,负载均衡策略等都只能在服务消费方配置。但实际使用过程中发现,服务提供方比消费方更清楚,但这些配置项是在消费方执行时才用到的。新版本,就加入了在服务提供方也能配这些参数,通过注册中心传递到消费方,\n做为参考值,如果消费方没有配置,就以提供方的配置为准,相当于消费方继承了提供方的建议配置值。而注册中心在传递配置时,也可以在中途修改配置,这样就达到了治理的目的,继承关系相当于:服务消费者 --&gt; 注册中心 --&gt; 服务提供者</p>\n<p><img src=\"../sources/images/configuration-override.png\" alt=\"configuration-override\"></p>\n<h2>配置向后兼容</h2>\n<p>向前兼容很好办,你只要保证配置只增不减,就基本上能保证向前兼容。但向后兼容,也是要注意的,要为后续加入新的配置项做好准备。如果配置出现一个特殊配置,就应该为这个“特殊”情况约定一个兼容规则,因为这个特殊情况,很有可能在以后还会发生。比如:有一个配置文件是保存“服务=地址”映射关系的,其中有一行特殊,保存的是“注册中心=地址”。现在程序加载时,约定“注册中心”这个Key是特殊的,做特别处理,其它的都是“服务”。然而,新版本发现,要加一项“监控中心=地址”,这时,旧版本的程序会把“监控中心”做为“服务”处理,因为旧代码是不能改的,兼容性就很会很麻烦。如果先前约定“特殊标识+XXX”为特殊处理,后续就会方便很多。</p>\n<p>向后兼容性,可以多向HTML5学习,参见:<a href=\"http://javatar.iteye.com/blog/949390\">HTML5设计原理</a></p>\n",
+  "link": "/zh-cn/docs/dev/principals/configuration.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/dummy.json b/zh-cn/docs/dev/principals/dummy.json
index a1fda264..e9369824 100644
--- a/zh-cn/docs/dev/principals/dummy.json
+++ b/zh-cn/docs/dev/principals/dummy.json
@@ -1,4 +1,6 @@
 {
   "filename": "dummy.md",
-  "__html": "<h1>防痴呆设计</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/804187\">http://javatar.iteye.com/blog/804187</a></p>\n</blockquote>\n<p>最近有点痴呆,因为解决了太多的痴呆问题。服务框架实施面超来超广,已有 50 多个项目在使用,每天都要去帮应用查问题,来来回回,发现大部分都是配置错误,或者重复的文件或类,或者网络不通等,所以准备在新版本中加入防痴呆设计。估且这么叫吧,可能很简单,但对排错速度还是有点帮助,希望能抛砖引玉,也希望大家多给力,想出更多的防范措施共享出来。</p>\n<h2>检查重复的jar包</h2>\n<p>最痴呆的问题,就是有多个版本的相同jar包,会出现新版本的 A 类,调用了旧版本的 B 类,而且和JVM加载顺序有关,问题带有偶然性,误导性,遇到这种莫名其妙的问题,最头疼,所以,第一条,先把它防住,在每个 jar 包中挑一个一定会加载的类,加上重复类检查,给个示例:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">static</span> {  \n    Duplicate.checkDuplicate(Xxx.class);  \n}  \n</code></pre>\n<p>检查重复工具类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Duplicate</span> </span>{  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">Duplicate</span><span class=\"hljs-params\">()</span> </span>{}  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">checkDuplicate</span><span class=\"hljs-params\">(Class cls)</span> </span>{  \n        checkDuplicate(cls.getName().replace(<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'/'</span>) + <span class=\"hljs-string\">\".class\"</span>);  \n    }  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">checkDuplicate</span><span class=\"hljs-params\">(String path)</span> </span>{  \n        <span class=\"hljs-keyword\">try</span> {  \n            <span class=\"hljs-comment\">// 在ClassPath搜文件  </span>\n            Enumeration urls = Thread.currentThread().getContextClassLoader().getResources(path);  \n            Set files = <span class=\"hljs-keyword\">new</span> HashSet();  \n            <span class=\"hljs-keyword\">while</span> (urls.hasMoreElements()) {  \n                URL url = urls.nextElement();  \n                <span class=\"hljs-keyword\">if</span> (url != <span class=\"hljs-keyword\">null</span>) {  \n                    String file = url.getFile();  \n                    <span class=\"hljs-keyword\">if</span> (file != <span class=\"hljs-keyword\">null</span> &amp;amp;&amp;amp; file.length() &amp;gt; <span class=\"hljs-number\">0</span>) {  \n                        files.add(file);  \n                    }  \n                }  \n            }  \n            <span class=\"hljs-comment\">// 如果有多个,就表示重复  </span>\n            <span class=\"hljs-keyword\">if</span> (files.size() &amp;gt; <span class=\"hljs-number\">1</span>) {  \n                logger.error(<span class=\"hljs-string\">\"Duplicate class \"</span> + path + <span class=\"hljs-string\">\" in \"</span> + files.size() + <span class=\"hljs-string\">\" jar \"</span> + files);  \n            }  \n        } <span class=\"hljs-keyword\">catch</span> (Throwable e) { <span class=\"hljs-comment\">// 防御性容错  </span>\n            logger.error(e.getMessage(), e);  \n        }  \n    }  \n  \n}  \n</code></pre>\n<h2>检查重复的配置文件</h2>\n<p>配置文件加载错,也是经常碰到的问题。用户通常会和你说:“我配置的很正确啊,不信我发给你看下,但就是报错”。然后查一圈下来,原来他发过来的配置根本没加载,平台很多产品都会在 classpath 下放一个约定的配置,如果项目中有多个,通常会取JVM加载的第一个,为了不被这么低级的问题折腾,和上面的重复jar包一样,在配置加载的地方,加上:</p>\n<pre><code class=\"language-java\">Duplicate.checkDuplicate(<span class=\"hljs-string\">\"xxx.properties\"</span>); \n</code></pre>\n<h2>检查所有可选配置</h2>\n<p>必填配置估计大家都会检查,因为没有的话,根本没法运行。但对一些可选参数,也应该做一些检查,比如:服务框架允许通过注册中心关联服务消费者和服务提供者,也允许直接配置服务提供者地址点对点直连,这时候,注册中心地址是可选的,但如果没有配点对点直连配置,注册中心地址就一定要配,这时候也要做相应检查。</p>\n<h2>异常信息给出解决方案</h2>\n<p>在给应用排错时,最怕的就是那种只有简单的一句错误描述,啥信息都没有的异常信息。比如上次碰到一个 Failed to get session 异常,就这几个单词,啥都没有,哪个 session 出错? 什么原因 Failed? 看了都快疯掉,因是线上环境不好调试,而且有些场景不是每次都能重现。异常最基本要带有上下文信息,包括操作者,操作目标,原因等,最好的异常信息,应给出解决方案,比如上面可以给出:&quot;从 10.20.16.3 到 10.20.130.20:20880 之间的网络不通,请在 10.20.16.3 使用 telnet 10.20.130.20 20880 测试一下网络,如果是跨机房调用,可能是防火墙阻挡,请联系 SA 开通访问权限&quot; 等等,上面甚至可以根据 IP 段判断是不是跨机房。另外一个例子,是 spring-web 的 context 加载,如果在 getBean 时 spring 没有被启动,spring 会报一个错,错误信息写着:请在 web.xml 中加入: <code>&lt;listener&gt;...&lt;init-param&gt;...</code>,多好的同学,看到错误的人复制一下就完事了,我们该学学。可以把常见的错误故意犯一遍,看看错误信息能否自我搞定问题,\n或者把平时支持应用时遇到的问题及解决办法都写到异常信息里。</p>\n<h2>日志信息包含环境信息</h2>\n<p>每次应用一出错,应用的开发或测试就会把出错信息发过来,询问原因,这时候我都会问一大堆套话,用的哪个版本呀?是生产环境还是开发测试环境?哪个注册中心呀?哪个项目中的?哪台机器呀?哪个服务? 累啊,最主要的是,有些开发或测试人员根本分不清,没办法,只好提供上门服务,浪费的时间可不是浮云,所以,日志中最好把需要的环境信息一并打进去,最好给日志输出做个包装,统一处理掉,免得忘了。包装Logger接口如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">error</span><span class=\"hljs-params\">(String msg, Throwable e)</span> </span>{  \n    delegate.error(msg + <span class=\"hljs-string\">\" on server \"</span> + InetAddress.getLocalHost() + <span class=\"hljs-string\">\" using version \"</span> + Version.getVersion(), e);  \n}  \n</code></pre>\n<p>获取版本号工具类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Version</span> </span>{  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">Version</span><span class=\"hljs-params\">()</span> </span>{}  \n  \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> Logger logger = LoggerFactory.getLogger(Version.class);  \n  \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> Pattern VERSION_PATTERN = Pattern.compile(<span class=\"hljs-string\">\"([0-9][0-9\\\\.\\\\-]*)\\\\.jar\"</span>);  \n  \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> String VERSION = getVersion(Version.class, <span class=\"hljs-string\">\"2.0.0\"</span>);  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> String <span class=\"hljs-title\">getVersion</span><span class=\"hljs-params\">()</span></span>{  \n        <span class=\"hljs-keyword\">return</span> VERSION;  \n    }  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> String <span class=\"hljs-title\">getVersion</span><span class=\"hljs-params\">(Class cls, String defaultVersion)</span> </span>{  \n        <span class=\"hljs-keyword\">try</span> {  \n            <span class=\"hljs-comment\">// 首先查找MANIFEST.MF规范中的版本号  </span>\n            String version = cls.getPackage().getImplementationVersion();  \n            <span class=\"hljs-keyword\">if</span> (version == <span class=\"hljs-keyword\">null</span> || version.length() == <span class=\"hljs-number\">0</span>) {  \n                version = cls.getPackage().getSpecificationVersion();  \n            }  \n            <span class=\"hljs-keyword\">if</span> (version == <span class=\"hljs-keyword\">null</span> || version.length() == <span class=\"hljs-number\">0</span>) {  \n                <span class=\"hljs-comment\">// 如果MANIFEST.MF规范中没有版本号,基于jar包名获取版本号  </span>\n                String file = cls.getProtectionDomain().getCodeSource().getLocation().getFile();  \n                <span class=\"hljs-keyword\">if</span> (file != <span class=\"hljs-keyword\">null</span> &amp;amp;&amp;amp; file.length() &amp;gt; <span class=\"hljs-number\">0</span> &amp;amp;&amp;amp; file.endsWith(<span class=\"hljs-string\">\".jar\"</span>)) {  \n                    Matcher matcher = VERSION_PATTERN.matcher(file);  \n                    <span class=\"hljs-keyword\">while</span> (matcher.find() &amp;amp;&amp;amp; matcher.groupCount() &amp;gt; <span class=\"hljs-number\">0</span>) {  \n                        version = matcher.group(<span class=\"hljs-number\">1</span>);  \n                    }  \n                }  \n            }  \n            <span class=\"hljs-comment\">// 返回版本号,如果为空返回缺省版本号  </span>\n            <span class=\"hljs-keyword\">return</span> version == <span class=\"hljs-keyword\">null</span> || version.length() == <span class=\"hljs-number\">0</span> ? defaultVersion : version;  \n        } <span class=\"hljs-keyword\">catch</span> (Throwable e) { <span class=\"hljs-comment\">// 防御性容错  </span>\n            <span class=\"hljs-comment\">// 忽略异常,返回缺省版本号  </span>\n            logger.error(e.getMessage(), e);  \n            <span class=\"hljs-keyword\">return</span> defaultVersion;  \n        }  \n    }  \n  \n}\n</code></pre>\n<h2>kill 之前先 dump</h2>\n<p>每次线上环境一出问题,大家就慌了,通常最直接的办法回滚重启,以减少故障时间,这样现场就被破坏了,要想事后查问题就麻烦了,有些问题必须在线上的大压力下才会发生,线下测试环境很难重现,不太可能让开发或 Appops 在重启前,先手工将出错现场所有数据备份一下,所以最好在 kill 脚本之前调用 dump,进行自动备份,这样就不会有人为疏忽。dump脚本示例:</p>\n<pre><code class=\"language-sh\">JAVA_HOME=/usr/java  \nOUTPUT_HOME=~/output  \nDEPLOY_HOME=`dirname <span class=\"hljs-variable\">$0</span>`  \nHOST_NAME=`hostname`  \n  \nDUMP_PIDS=`ps  --no-heading -C java -f --width 1000 | grep <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$DEPLOY_HOME</span>\"</span> |awk <span class=\"hljs-string\">'{print $2}'</span>`  \n<span class=\"hljs-keyword\">if</span> [ -z <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$DUMP_PIDS</span>\"</span> ]; <span class=\"hljs-keyword\">then</span>  \n    <span class=\"hljs-built_in\">echo</span> <span class=\"hljs-string\">\"The server <span class=\"hljs-variable\">$HOST_NAME</span> is not started!\"</span>  \n    <span class=\"hljs-built_in\">exit</span> 1;  \n<span class=\"hljs-keyword\">fi</span>  \n  \nDUMP_ROOT=<span class=\"hljs-variable\">$OUTPUT_HOME</span>/dump  \n<span class=\"hljs-keyword\">if</span> [ ! -d <span class=\"hljs-variable\">$DUMP_ROOT</span> ]; <span class=\"hljs-keyword\">then</span>  \n    mkdir <span class=\"hljs-variable\">$DUMP_ROOT</span>  \n<span class=\"hljs-keyword\">fi</span>  \n  \nDUMP_DATE=`date +%Y%m%d%H%M%S`  \nDUMP_DIR=<span class=\"hljs-variable\">$DUMP_ROOT</span>/dump-<span class=\"hljs-variable\">$DUMP_DATE</span>  \n<span class=\"hljs-keyword\">if</span> [ ! -d <span class=\"hljs-variable\">$DUMP_DIR</span> ]; <span class=\"hljs-keyword\">then</span>  \n    mkdir <span class=\"hljs-variable\">$DUMP_DIR</span>  \n<span class=\"hljs-keyword\">fi</span>  \n  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\"Dumping the server <span class=\"hljs-variable\">$HOST_NAME</span> ...\\c\"</span>  \n<span class=\"hljs-keyword\">for</span> PID <span class=\"hljs-keyword\">in</span> <span class=\"hljs-variable\">$DUMP_PIDS</span> ; <span class=\"hljs-keyword\">do</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jstack <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jstack-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jinfo <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jinfo-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jstat -gcutil <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jstat-gcutil-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jstat -gccapacity <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jstat-gccapacity-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jmap <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jmap-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jmap -heap <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jmap-heap-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jmap -histo <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jmap-histo-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-keyword\">if</span> [ -r /usr/sbin/lsof ]; <span class=\"hljs-keyword\">then</span>  \n    /usr/sbin/lsof -p <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/lsof-<span class=\"hljs-variable\">$PID</span>.dump  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">done</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/sar ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/sar &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/sar.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/uptime ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/uptime &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/uptime.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/free ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/free -t &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/free.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/vmstat ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/vmstat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/vmstat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/mpstat ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/mpstat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/mpstat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/iostat ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/iostat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/iostat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /bin/netstat ]; <span class=\"hljs-keyword\">then</span>  \n/bin/netstat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/netstat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-built_in\">echo</span> <span class=\"hljs-string\">\"OK!\"</span>\n</code></pre>\n"
+  "__html": "<h1>防痴呆设计</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/804187\">http://javatar.iteye.com/blog/804187</a></p>\n</blockquote>\n<p>最近有点痴呆,因为解决了太多的痴呆问题。服务框架实施面超来超广,已有 50 多个项目在使用,每天都要去帮应用查问题,来来回回,发现大部分都是配置错误,或者重复的文件或类,或者网络不通等,所以准备在新版本中加入防痴呆设计。估且这么叫吧,可能很简单,但对排错速度还是有点帮助,希望能抛砖引玉,也希望大家多给力,想出更多的防范措施共享出来。</p>\n<h2>检查重复的jar包</h2>\n<p>最痴呆的问题,就是有多个版本的相同jar包,会出现新版本的 A 类,调用了旧版本的 B 类,而且和JVM加载顺序有关,问题带有偶然性,误导性,遇到这种莫名其妙的问题,最头疼,所以,第一条,先把它防住,在每个 jar 包中挑一个一定会加载的类,加上重复类检查,给个示例:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">static</span> {  \n    Duplicate.checkDuplicate(Xxx.class);  \n}  \n</code></pre>\n<p>检查重复工具类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Duplicate</span> </span>{  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">Duplicate</span><span class=\"hljs-params\">()</span> </span>{}  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">checkDuplicate</span><span class=\"hljs-params\">(Class cls)</span> </span>{  \n        checkDuplicate(cls.getName().replace(<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'/'</span>) + <span class=\"hljs-string\">\".class\"</span>);  \n    }  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">checkDuplicate</span><span class=\"hljs-params\">(String path)</span> </span>{  \n        <span class=\"hljs-keyword\">try</span> {  \n            <span class=\"hljs-comment\">// 在ClassPath搜文件  </span>\n            Enumeration urls = Thread.currentThread().getContextClassLoader().getResources(path);  \n            Set files = <span class=\"hljs-keyword\">new</span> HashSet();  \n            <span class=\"hljs-keyword\">while</span> (urls.hasMoreElements()) {  \n                URL url = urls.nextElement();  \n                <span class=\"hljs-keyword\">if</span> (url != <span class=\"hljs-keyword\">null</span>) {  \n                    String file = url.getFile();  \n                    <span class=\"hljs-keyword\">if</span> (file != <span class=\"hljs-keyword\">null</span> &amp;amp;&amp;amp; file.length() &amp;gt; <span class=\"hljs-number\">0</span>) {  \n                        files.add(file);  \n                    }  \n                }  \n            }  \n            <span class=\"hljs-comment\">// 如果有多个,就表示重复  </span>\n            <span class=\"hljs-keyword\">if</span> (files.size() &amp;gt; <span class=\"hljs-number\">1</span>) {  \n                logger.error(<span class=\"hljs-string\">\"Duplicate class \"</span> + path + <span class=\"hljs-string\">\" in \"</span> + files.size() + <span class=\"hljs-string\">\" jar \"</span> + files);  \n            }  \n        } <span class=\"hljs-keyword\">catch</span> (Throwable e) { <span class=\"hljs-comment\">// 防御性容错  </span>\n            logger.error(e.getMessage(), e);  \n        }  \n    }  \n  \n}  \n</code></pre>\n<h2>检查重复的配置文件</h2>\n<p>配置文件加载错,也是经常碰到的问题。用户通常会和你说:“我配置的很正确啊,不信我发给你看下,但就是报错”。然后查一圈下来,原来他发过来的配置根本没加载,平台很多产品都会在 classpath 下放一个约定的配置,如果项目中有多个,通常会取JVM加载的第一个,为了不被这么低级的问题折腾,和上面的重复jar包一样,在配置加载的地方,加上:</p>\n<pre><code class=\"language-java\">Duplicate.checkDuplicate(<span class=\"hljs-string\">\"xxx.properties\"</span>); \n</code></pre>\n<h2>检查所有可选配置</h2>\n<p>必填配置估计大家都会检查,因为没有的话,根本没法运行。但对一些可选参数,也应该做一些检查,比如:服务框架允许通过注册中心关联服务消费者和服务提供者,也允许直接配置服务提供者地址点对点直连,这时候,注册中心地址是可选的,但如果没有配点对点直连配置,注册中心地址就一定要配,这时候也要做相应检查。</p>\n<h2>异常信息给出解决方案</h2>\n<p>在给应用排错时,最怕的就是那种只有简单的一句错误描述,啥信息都没有的异常信息。比如上次碰到一个 Failed to get session 异常,就这几个单词,啥都没有,哪个 session 出错? 什么原因 Failed? 看了都快疯掉,因是线上环境不好调试,而且有些场景不是每次都能重现。异常最基本要带有上下文信息,包括操作者,操作目标,原因等,最好的异常信息,应给出解决方案,比如上面可以给出:&quot;从 10.20.16.3 到 10.20.130.20:20880 之间的网络不通,请在 10.20.16.3 使用 telnet 10.20.130.20 20880 测试一下网络,如果是跨机房调用,可能是防火墙阻挡,请联系 SA 开通访问权限&quot; 等等,上面甚至可以根据 IP 段判断是不是跨机房。另外一个例子,是 spring-web 的 context 加载,如果在 getBean 时 spring 没有被启动,spring 会报一个错,错误信息写着:请在 web.xml 中加入: <code>&lt;listener&gt;...&lt;init-param&gt;...</code>,多好的同学,看到错误的人复制一下就完事了,我们该学学。可以把常见的错误故意犯一遍,看看错误信息能否自我搞定问题,\n或者把平时支持应用时遇到的问题及解决办法都写到异常信息里。</p>\n<h2>日志信息包含环境信息</h2>\n<p>每次应用一出错,应用的开发或测试就会把出错信息发过来,询问原因,这时候我都会问一大堆套话,用的哪个版本呀?是生产环境还是开发测试环境?哪个注册中心呀?哪个项目中的?哪台机器呀?哪个服务? 累啊,最主要的是,有些开发或测试人员根本分不清,没办法,只好提供上门服务,浪费的时间可不是浮云,所以,日志中最好把需要的环境信息一并打进去,最好给日志输出做个包装,统一处理掉,免得忘了。包装Logger接口如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">error</span><span class=\"hljs-params\">(String msg, Throwable e)</span> </span>{  \n    delegate.error(msg + <span class=\"hljs-string\">\" on server \"</span> + InetAddress.getLocalHost() + <span class=\"hljs-string\">\" using version \"</span> + Version.getVersion(), e);  \n}  \n</code></pre>\n<p>获取版本号工具类:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Version</span> </span>{  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> <span class=\"hljs-title\">Version</span><span class=\"hljs-params\">()</span> </span>{}  \n  \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> Logger logger = LoggerFactory.getLogger(Version.class);  \n  \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> Pattern VERSION_PATTERN = Pattern.compile(<span class=\"hljs-string\">\"([0-9][0-9\\\\.\\\\-]*)\\\\.jar\"</span>);  \n  \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> String VERSION = getVersion(Version.class, <span class=\"hljs-string\">\"2.0.0\"</span>);  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> String <span class=\"hljs-title\">getVersion</span><span class=\"hljs-params\">()</span></span>{  \n        <span class=\"hljs-keyword\">return</span> VERSION;  \n    }  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> String <span class=\"hljs-title\">getVersion</span><span class=\"hljs-params\">(Class cls, String defaultVersion)</span> </span>{  \n        <span class=\"hljs-keyword\">try</span> {  \n            <span class=\"hljs-comment\">// 首先查找MANIFEST.MF规范中的版本号  </span>\n            String version = cls.getPackage().getImplementationVersion();  \n            <span class=\"hljs-keyword\">if</span> (version == <span class=\"hljs-keyword\">null</span> || version.length() == <span class=\"hljs-number\">0</span>) {  \n                version = cls.getPackage().getSpecificationVersion();  \n            }  \n            <span class=\"hljs-keyword\">if</span> (version == <span class=\"hljs-keyword\">null</span> || version.length() == <span class=\"hljs-number\">0</span>) {  \n                <span class=\"hljs-comment\">// 如果MANIFEST.MF规范中没有版本号,基于jar包名获取版本号  </span>\n                String file = cls.getProtectionDomain().getCodeSource().getLocation().getFile();  \n                <span class=\"hljs-keyword\">if</span> (file != <span class=\"hljs-keyword\">null</span> &amp;amp;&amp;amp; file.length() &amp;gt; <span class=\"hljs-number\">0</span> &amp;amp;&amp;amp; file.endsWith(<span class=\"hljs-string\">\".jar\"</span>)) {  \n                    Matcher matcher = VERSION_PATTERN.matcher(file);  \n                    <span class=\"hljs-keyword\">while</span> (matcher.find() &amp;amp;&amp;amp; matcher.groupCount() &amp;gt; <span class=\"hljs-number\">0</span>) {  \n                        version = matcher.group(<span class=\"hljs-number\">1</span>);  \n                    }  \n                }  \n            }  \n            <span class=\"hljs-comment\">// 返回版本号,如果为空返回缺省版本号  </span>\n            <span class=\"hljs-keyword\">return</span> version == <span class=\"hljs-keyword\">null</span> || version.length() == <span class=\"hljs-number\">0</span> ? defaultVersion : version;  \n        } <span class=\"hljs-keyword\">catch</span> (Throwable e) { <span class=\"hljs-comment\">// 防御性容错  </span>\n            <span class=\"hljs-comment\">// 忽略异常,返回缺省版本号  </span>\n            logger.error(e.getMessage(), e);  \n            <span class=\"hljs-keyword\">return</span> defaultVersion;  \n        }  \n    }  \n  \n}\n</code></pre>\n<h2>kill 之前先 dump</h2>\n<p>每次线上环境一出问题,大家就慌了,通常最直接的办法回滚重启,以减少故障时间,这样现场就被破坏了,要想事后查问题就麻烦了,有些问题必须在线上的大压力下才会发生,线下测试环境很难重现,不太可能让开发或 Appops 在重启前,先手工将出错现场所有数据备份一下,所以最好在 kill 脚本之前调用 dump,进行自动备份,这样就不会有人为疏忽。dump脚本示例:</p>\n<pre><code class=\"language-sh\">JAVA_HOME=/usr/java  \nOUTPUT_HOME=~/output  \nDEPLOY_HOME=`dirname <span class=\"hljs-variable\">$0</span>`  \nHOST_NAME=`hostname`  \n  \nDUMP_PIDS=`ps  --no-heading -C java -f --width 1000 | grep <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$DEPLOY_HOME</span>\"</span> |awk <span class=\"hljs-string\">'{print $2}'</span>`  \n<span class=\"hljs-keyword\">if</span> [ -z <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$DUMP_PIDS</span>\"</span> ]; <span class=\"hljs-keyword\">then</span>  \n    <span class=\"hljs-built_in\">echo</span> <span class=\"hljs-string\">\"The server <span class=\"hljs-variable\">$HOST_NAME</span> is not started!\"</span>  \n    <span class=\"hljs-built_in\">exit</span> 1;  \n<span class=\"hljs-keyword\">fi</span>  \n  \nDUMP_ROOT=<span class=\"hljs-variable\">$OUTPUT_HOME</span>/dump  \n<span class=\"hljs-keyword\">if</span> [ ! -d <span class=\"hljs-variable\">$DUMP_ROOT</span> ]; <span class=\"hljs-keyword\">then</span>  \n    mkdir <span class=\"hljs-variable\">$DUMP_ROOT</span>  \n<span class=\"hljs-keyword\">fi</span>  \n  \nDUMP_DATE=`date +%Y%m%d%H%M%S`  \nDUMP_DIR=<span class=\"hljs-variable\">$DUMP_ROOT</span>/dump-<span class=\"hljs-variable\">$DUMP_DATE</span>  \n<span class=\"hljs-keyword\">if</span> [ ! -d <span class=\"hljs-variable\">$DUMP_DIR</span> ]; <span class=\"hljs-keyword\">then</span>  \n    mkdir <span class=\"hljs-variable\">$DUMP_DIR</span>  \n<span class=\"hljs-keyword\">fi</span>  \n  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\"Dumping the server <span class=\"hljs-variable\">$HOST_NAME</span> ...\\c\"</span>  \n<span class=\"hljs-keyword\">for</span> PID <span class=\"hljs-keyword\">in</span> <span class=\"hljs-variable\">$DUMP_PIDS</span> ; <span class=\"hljs-keyword\">do</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jstack <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jstack-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jinfo <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jinfo-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jstat -gcutil <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jstat-gcutil-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jstat -gccapacity <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jstat-gccapacity-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jmap <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jmap-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jmap -heap <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jmap-heap-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-variable\">$JAVA_HOME</span>/bin/jmap -histo <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/jmap-histo-<span class=\"hljs-variable\">$PID</span>.dump 2&gt;&amp;1  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-keyword\">if</span> [ -r /usr/sbin/lsof ]; <span class=\"hljs-keyword\">then</span>  \n    /usr/sbin/lsof -p <span class=\"hljs-variable\">$PID</span> &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/lsof-<span class=\"hljs-variable\">$PID</span>.dump  \n    <span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n    <span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">done</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/sar ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/sar &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/sar.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/uptime ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/uptime &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/uptime.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/free ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/free -t &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/free.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/vmstat ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/vmstat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/vmstat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/mpstat ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/mpstat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/mpstat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /usr/bin/iostat ]; <span class=\"hljs-keyword\">then</span>  \n/usr/bin/iostat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/iostat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-keyword\">if</span> [ -r /bin/netstat ]; <span class=\"hljs-keyword\">then</span>  \n/bin/netstat &gt; <span class=\"hljs-variable\">$DUMP_DIR</span>/netstat.dump  \n<span class=\"hljs-built_in\">echo</span> -e <span class=\"hljs-string\">\".\\c\"</span>  \n<span class=\"hljs-keyword\">fi</span>  \n<span class=\"hljs-built_in\">echo</span> <span class=\"hljs-string\">\"OK!\"</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/dev/principals/dummy.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/expansibility.json b/zh-cn/docs/dev/principals/expansibility.json
index 953c63c1..34151a3c 100644
--- a/zh-cn/docs/dev/principals/expansibility.json
+++ b/zh-cn/docs/dev/principals/expansibility.json
@@ -1,4 +1,6 @@
 {
   "filename": "expansibility.md",
-  "__html": "<h1>谈谈扩充式扩展与增量式扩展</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/690845\">http://javatar.iteye.com/blog/690845</a></p>\n</blockquote>\n<p>我们平台的产品越来越多,产品的功能也越来越多。平台的产品为了适应各 BU 和部门以及产品线的需求,势必会将很多不相干的功能凑在一起,客户可以选择性的使用。为了兼容更多的需求,每个产品,每个框架,都在不停的扩展,而我们经常会选择一些扩展的扩展方式,也就是将新旧功能扩展成一个通用实现。我想讨论是,有些情况下也可以考虑增量式的扩展方式,也就是保留原功能的简单性,新功能独立实现。我最近一直做分布式服务框架的开发,就拿我们项目中的问题开涮吧。</p>\n<p>比如:远程调用框架,肯定少不了序列化功能,功能很简单,就是把流转成对象,对象转成流。但因有些地方可能会使用 osgi,这样序列化时,IO 所在的 ClassLoader 可能和业务方的 ClassLoader 是隔离的。需要将流转换成 byte[] 数组,然后传给业务方的 ClassLoader 进行序列化。为了适应 osgi 需求,把原来非 osgi 与 osgi 的场景扩展了一下,这样,不管是不是 osgi 环境,都先将流转成 byte[] 数组,拷贝一次。然而,大部分场景都用不上 osgi,却为 osgi 付出了代价。而如果采用增量式扩展方式,非 osgi 的代码原封不动,再加一个 osgi 的实现,要用 osgi 的时候,直接依赖 osgi 实现即可。</p>\n<p>再比如:最开始,远程服务都是基于接口方法,进行透明化调用的。这样,扩展接口就是, invoke(Method method, Object[] args),后来,有了无接口调用的需求,就是没有接口方法也能调用,并将 POJO 对象都转换成 Map 表示。因为 Method 对象是不能直接 new 出来的,我们不自觉选了一个扩展式扩展,把扩展接口改成了 invoke(String methodName, String[] parameterTypes, String returnTypes, Object[] args),导致不管是不是无接口调用,都得把 parameterTypes 从 Class[] 转成 String[]。如果选用增量式扩展,应该是保持原有接口不变,增加一个 GeneralService 接口,里面有一个通用的 invoke() 方法,和其它正常业务上的接口一样的调用方式,扩展接口也不用变,只是 GeneralServiceImpl 的 invoke() 实现会将收到的调用转给目标接口,这样就能将新功能增量到旧功能上,并保持原来结构的简单性。</p>\n<p>再再比如:无状态消息发送,很简单,序列化一个对象发过去就行。后来有了同步消息发送需求,需要一个 Request/Response 进行配对,采用扩展式扩展,自然想到,无状态消息其实是一个没有 Response 的 Request,所以在 Request 里加一个 boolean 状态,表示要不要返回 Response。如果再来一个会话消息发送需求,那就再加一个 Session 交互,然后发现,原来同步消息发送是会话消息的一种特殊情况,所有场景都传 Session,不需要 Session 的地方无视即可。</p>\n<p><img src=\"../sources/images/open-expand.jpg\" alt=\"open-expand\"></p>\n<p>如果采用增量式扩展,无状态消息发送原封不动,同步消息发送,在无状态消息基础上加一个 Request/Response 处理,会话消息发送,再加一个 SessionRequest/SessionResponse 处理。</p>\n<p><img src=\"../sources/images/close-expand.jpg\" alt=\"close-expand\"></p>\n"
+  "__html": "<h1>谈谈扩充式扩展与增量式扩展</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/690845\">http://javatar.iteye.com/blog/690845</a></p>\n</blockquote>\n<p>我们平台的产品越来越多,产品的功能也越来越多。平台的产品为了适应各 BU 和部门以及产品线的需求,势必会将很多不相干的功能凑在一起,客户可以选择性的使用。为了兼容更多的需求,每个产品,每个框架,都在不停的扩展,而我们经常会选择一些扩展的扩展方式,也就是将新旧功能扩展成一个通用实现。我想讨论是,有些情况下也可以考虑增量式的扩展方式,也就是保留原功能的简单性,新功能独立实现。我最近一直做分布式服务框架的开发,就拿我们项目中的问题开涮吧。</p>\n<p>比如:远程调用框架,肯定少不了序列化功能,功能很简单,就是把流转成对象,对象转成流。但因有些地方可能会使用 osgi,这样序列化时,IO 所在的 ClassLoader 可能和业务方的 ClassLoader 是隔离的。需要将流转换成 byte[] 数组,然后传给业务方的 ClassLoader 进行序列化。为了适应 osgi 需求,把原来非 osgi 与 osgi 的场景扩展了一下,这样,不管是不是 osgi 环境,都先将流转成 byte[] 数组,拷贝一次。然而,大部分场景都用不上 osgi,却为 osgi 付出了代价。而如果采用增量式扩展方式,非 osgi 的代码原封不动,再加一个 osgi 的实现,要用 osgi 的时候,直接依赖 osgi 实现即可。</p>\n<p>再比如:最开始,远程服务都是基于接口方法,进行透明化调用的。这样,扩展接口就是, invoke(Method method, Object[] args),后来,有了无接口调用的需求,就是没有接口方法也能调用,并将 POJO 对象都转换成 Map 表示。因为 Method 对象是不能直接 new 出来的,我们不自觉选了一个扩展式扩展,把扩展接口改成了 invoke(String methodName, String[] parameterTypes, String returnTypes, Object[] args),导致不管是不是无接口调用,都得把 parameterTypes 从 Class[] 转成 String[]。如果选用增量式扩展,应该是保持原有接口不变,增加一个 GeneralService 接口,里面有一个通用的 invoke() 方法,和其它正常业务上的接口一样的调用方式,扩展接口也不用变,只是 GeneralServiceImpl 的 invoke() 实现会将收到的调用转给目标接口,这样就能将新功能增量到旧功能上,并保持原来结构的简单性。</p>\n<p>再再比如:无状态消息发送,很简单,序列化一个对象发过去就行。后来有了同步消息发送需求,需要一个 Request/Response 进行配对,采用扩展式扩展,自然想到,无状态消息其实是一个没有 Response 的 Request,所以在 Request 里加一个 boolean 状态,表示要不要返回 Response。如果再来一个会话消息发送需求,那就再加一个 Session 交互,然后发现,原来同步消息发送是会话消息的一种特殊情况,所有场景都传 Session,不需要 Session 的地方无视即可。</p>\n<p><img src=\"../sources/images/open-expand.jpg\" alt=\"open-expand\"></p>\n<p>如果采用增量式扩展,无状态消息发送原封不动,同步消息发送,在无状态消息基础上加一个 Request/Response 处理,会话消息发送,再加一个 SessionRequest/SessionResponse 处理。</p>\n<p><img src=\"../sources/images/close-expand.jpg\" alt=\"close-expand\"></p>\n",
+  "link": "/zh-cn/docs/dev/principals/expansibility.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/extension.json b/zh-cn/docs/dev/principals/extension.json
index dfae923e..fad112be 100644
--- a/zh-cn/docs/dev/principals/extension.json
+++ b/zh-cn/docs/dev/principals/extension.json
@@ -1,4 +1,6 @@
 {
   "filename": "extension.md",
-  "__html": "<h1>扩展点重构</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/1041832\">http://javatar.iteye.com/blog/1041832</a></p>\n</blockquote>\n<p>随着服务化的推广,网站对Dubbo服务框架的需求逐渐增多,Dubbo 的现有开发人员能实现的需求有限,很多需求都被 delay,而网站的同学也希望参与进来,加上领域的推动,所以平台计划将部分项目对公司内部开放,让大家一起来实现,Dubbo 为试点项目之一。</p>\n<p>既然要开放,那 Dubbo 就要留一些扩展点,让参与者尽量黑盒扩展,而不是白盒的修改代码,否则分支,质量,合并,冲突都会很难管理。</p>\n<p>先看一下 Dubbo 现有的设计:</p>\n<p><img src=\"../sources/images/design-step1.png\" alt=\"design-step-1\"></p>\n<p>这里面虽然有部分扩展接口,但并不能很好的协作,而且扩展点的加载和配置都没有统一处理,所以下面对它进行重构。</p>\n<h2>第一步,微核心,插件式,平等对待第三方</h2>\n<p>即然要扩展,扩展点的加载方式,首先要统一,微核心+插件式,是比较能达到 OCP 原则的思路。</p>\n<p>由一个插件生命周期管理容器,构成微核心,核心不包括任何功能,这样可以确保所有功能都能被替换,并且,框架作者能做到的功能,扩展者也一定要能做到,以保证平等对待第三方,所以,框架自身的功能也要用插件的方式实现,不能有任何硬编码。</p>\n<p>通常微核心都会采用 Factory、IoC、OSGi 等方式管理插件生命周期。考虑 Dubbo 的适用面,不想强依赖 Spring 等 IoC 容器。自已造一个小的 IoC 容器,也觉得有点过度设计,所以打算采用最简单的 Factory 方式管理插件。</p>\n<p>最终决定采用的是 JDK 标准的 SPI 扩展机制,参见:<code>java.util.ServiceLoader</code>,也就是扩展者在 jar 包的 <code>META-INF/services/</code> 目录下放置与接口同名的文本文件,内容为接口实现类名,多个实现类名用换行符分隔。比如,需要扩展 Dubbo 的协议,只需在 xxx.jar 中放置文件:<code>META-INF/services/com.alibaba.dubbo.rpc.Protocol</code>,内容为 <code>com.alibaba.xxx.XxxProtocol</code>。Dubbo 通过 ServiceLoader 扫描到所有 Protocol 实现。</p>\n<p>并约定所有插件,都必须标注:<code>@Extension(&quot;name&quot;)</code>,作为加载后的标识性名称,用于配置选择。</p>\n<h2>第二步,每个扩展点只封装一个变化因子,最大化复用</h2>\n<p>每个扩展点的实现者,往往都只是关心一件事,现在的扩展点,并没有完全分离。比如:Failover, Route, LoadBalance, Directory 没有完全分开,全由 RoutingInvokerGroup 写死了。</p>\n<p>再比如,协议扩展,扩展者可能只是想替换序列化方式,或者只替换传输方式,并且 Remoting 和 Http 也能复用序列化等实现。这样,需为传输方式,客户端实现,服务器端实现,协议头解析,数据序列化,都留出不同扩展点。</p>\n<p>拆分后,设计如下:</p>\n<p><img src=\"../sources/images/design-step2.png\" alt=\"design-step-2\"></p>\n<h2>第三步,全管道式设计,框架自身逻辑,均使用截面拦截实现</h2>\n<p>现在很多的逻辑,都是放在基类中实现,然后通过模板方法回调子类的实现,包括:local, mock, generic, echo, token, accesslog, monitor, count, limit 等等,可以全部拆分使用 Filter 实现,每个功能都是调用链上的一环。 比如:(基类模板方法)</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">abstract</span> AbstractInvoker implements Invoker {  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invocation inv)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{  \n        <span class=\"hljs-comment\">// 伪代码  </span>\n        active ++;  \n        <span class=\"hljs-keyword\">if</span> (active &gt; max)  \n            wait();  \n          \n        doInvoke(inv);  \n          \n        active --;  \n        notify();  \n    }  \n      \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">abstract</span> Result <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation inv)</span> <span class=\"hljs-keyword\">throws</span> RpcException  \n  \n}  \n</span></code></pre>\n<p>改成:(链式过滤器)</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">abstract</span> LimitFilter implements Filter {  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker chain, Invocation inv)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{  \n         <span class=\"hljs-comment\">// 伪代码  </span>\n        active ++;  \n        <span class=\"hljs-keyword\">if</span> (active &gt; max)  \n            wait();  \n          \n        chain.invoke(inv);  \n          \n        active --;  \n        notify();  \n    }  \n  \n}\n</code></pre>\n<h2>第四步,最少概念,一致性概念模型</h2>\n<p>保持尽可能少的概念,有助于理解,对于开放的系统尤其重要。另外,各接口都使用一致的概念模型,能相互指引,并减少模型转换,</p>\n<p>比如,Invoker 的方法签名为:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\">Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n</code></pre>\n<p>而 Exporter 的方法签名为:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\">Object <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Method method, Object[] args)</span> <span class=\"hljs-keyword\">throws</span> Throwable</span>;  \n</code></pre>\n<p>但它们的作用是一样的,只是一个在客户端,一个在服务器端,却采用了不一样的模型类。</p>\n<p>再比如,URL 以字符串传递,不停的解析和拼装,没有一个 URL 模型类, 而 URL 的参数,却时而 Map, 时而 Parameters 类包装,</p>\n<pre><code class=\"language-java\">export(String url)  \ncreateExporter(String host, <span class=\"hljs-keyword\">int</span> port, Parameters params);  \n</code></pre>\n<p>使用一致模型:</p>\n<pre><code class=\"language-java\">export(URL url)  \ncreateExporter(URL url);  \n</code></pre>\n<p>再比如,现有的:Invoker, Exporter, InvocationHandler, FilterChain\n其实都是 invoke 行为的不同阶段,完全可以抽象掉,统一为 Invoker,减少概念。</p>\n<h2>第五步,分层,组合式扩展,而不是泛化式扩展</h2>\n<p>原因参见:<a href=\"../principals/expansibility.md\">谈谈扩充式扩展与增量式扩展</a>。</p>\n<p>泛化式扩展指:将扩展点逐渐抽象,取所有功能并集,新加功能总是套入并扩充旧功能的概念。</p>\n<p>组合式扩展指:将扩展点正交分解,取所有功能交集,新加功能总是基于旧功能之上实现。</p>\n<p>上面的设计,不自觉的就将 Dubbo 现有功能都当成了核心功能。上面的概念包含了 Dubbo 现有 RPC 的所有功能,包括:Proxy, Router, Failover, LoadBalance, Subscriber, Publisher, Invoker, Exporter, Filter 等,\n但这些都是核心吗?踢掉哪些,RPC 一样可以 Run?而哪些又是不能踢掉的?基于这样考虑,可以将 RPC 分解成两个层次,只是 Protocol 和 Invoker 才是 RPC 的核心。其它,包括 Router, Failover, Loadbalance, Subscriber, Publisher 都不核心,而是 Routing。所以,将 Routing 作为 Rpc 核心的一个扩展,设计如下:</p>\n<p><img src=\"../sources/images/design-step3.png\" alt=\"design-step-3\"></p>\n<h2>第六步,整理,梳理关系</h2>\n<p>整理后,设计如下:</p>\n<p><img src=\"../sources/images/design-step4.png\" alt=\"design-step-4\"></p>\n"
+  "__html": "<h1>扩展点重构</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/1041832\">http://javatar.iteye.com/blog/1041832</a></p>\n</blockquote>\n<p>随着服务化的推广,网站对Dubbo服务框架的需求逐渐增多,Dubbo 的现有开发人员能实现的需求有限,很多需求都被 delay,而网站的同学也希望参与进来,加上领域的推动,所以平台计划将部分项目对公司内部开放,让大家一起来实现,Dubbo 为试点项目之一。</p>\n<p>既然要开放,那 Dubbo 就要留一些扩展点,让参与者尽量黑盒扩展,而不是白盒的修改代码,否则分支,质量,合并,冲突都会很难管理。</p>\n<p>先看一下 Dubbo 现有的设计:</p>\n<p><img src=\"../sources/images/design-step1.png\" alt=\"design-step-1\"></p>\n<p>这里面虽然有部分扩展接口,但并不能很好的协作,而且扩展点的加载和配置都没有统一处理,所以下面对它进行重构。</p>\n<h2>第一步,微核心,插件式,平等对待第三方</h2>\n<p>即然要扩展,扩展点的加载方式,首先要统一,微核心+插件式,是比较能达到 OCP 原则的思路。</p>\n<p>由一个插件生命周期管理容器,构成微核心,核心不包括任何功能,这样可以确保所有功能都能被替换,并且,框架作者能做到的功能,扩展者也一定要能做到,以保证平等对待第三方,所以,框架自身的功能也要用插件的方式实现,不能有任何硬编码。</p>\n<p>通常微核心都会采用 Factory、IoC、OSGi 等方式管理插件生命周期。考虑 Dubbo 的适用面,不想强依赖 Spring 等 IoC 容器。自已造一个小的 IoC 容器,也觉得有点过度设计,所以打算采用最简单的 Factory 方式管理插件。</p>\n<p>最终决定采用的是 JDK 标准的 SPI 扩展机制,参见:<code>java.util.ServiceLoader</code>,也就是扩展者在 jar 包的 <code>META-INF/services/</code> 目录下放置与接口同名的文本文件,内容为接口实现类名,多个实现类名用换行符分隔。比如,需要扩展 Dubbo 的协议,只需在 xxx.jar 中放置文件:<code>META-INF/services/com.alibaba.dubbo.rpc.Protocol</code>,内容为 <code>com.alibaba.xxx.XxxProtocol</code>。Dubbo 通过 ServiceLoader 扫描到所有 Protocol 实现。</p>\n<p>并约定所有插件,都必须标注:<code>@Extension(&quot;name&quot;)</code>,作为加载后的标识性名称,用于配置选择。</p>\n<h2>第二步,每个扩展点只封装一个变化因子,最大化复用</h2>\n<p>每个扩展点的实现者,往往都只是关心一件事,现在的扩展点,并没有完全分离。比如:Failover, Route, LoadBalance, Directory 没有完全分开,全由 RoutingInvokerGroup 写死了。</p>\n<p>再比如,协议扩展,扩展者可能只是想替换序列化方式,或者只替换传输方式,并且 Remoting 和 Http 也能复用序列化等实现。这样,需为传输方式,客户端实现,服务器端实现,协议头解析,数据序列化,都留出不同扩展点。</p>\n<p>拆分后,设计如下:</p>\n<p><img src=\"../sources/images/design-step2.png\" alt=\"design-step-2\"></p>\n<h2>第三步,全管道式设计,框架自身逻辑,均使用截面拦截实现</h2>\n<p>现在很多的逻辑,都是放在基类中实现,然后通过模板方法回调子类的实现,包括:local, mock, generic, echo, token, accesslog, monitor, count, limit 等等,可以全部拆分使用 Filter 实现,每个功能都是调用链上的一环。 比如:(基类模板方法)</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">abstract</span> AbstractInvoker implements Invoker {  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invocation inv)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{  \n        <span class=\"hljs-comment\">// 伪代码  </span>\n        active ++;  \n        <span class=\"hljs-keyword\">if</span> (active &gt; max)  \n            wait();  \n          \n        doInvoke(inv);  \n          \n        active --;  \n        notify();  \n    }  \n      \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected</span> <span class=\"hljs-keyword\">abstract</span> Result <span class=\"hljs-title\">doInvoke</span><span class=\"hljs-params\">(Invocation inv)</span> <span class=\"hljs-keyword\">throws</span> RpcException  \n  \n}  \n</span></code></pre>\n<p>改成:(链式过滤器)</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">abstract</span> LimitFilter implements Filter {  \n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invoker chain, Invocation inv)</span> <span class=\"hljs-keyword\">throws</span> RpcException </span>{  \n         <span class=\"hljs-comment\">// 伪代码  </span>\n        active ++;  \n        <span class=\"hljs-keyword\">if</span> (active &gt; max)  \n            wait();  \n          \n        chain.invoke(inv);  \n          \n        active --;  \n        notify();  \n    }  \n  \n}\n</code></pre>\n<h2>第四步,最少概念,一致性概念模型</h2>\n<p>保持尽可能少的概念,有助于理解,对于开放的系统尤其重要。另外,各接口都使用一致的概念模型,能相互指引,并减少模型转换,</p>\n<p>比如,Invoker 的方法签名为:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\">Result <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Invocation invocation)</span> <span class=\"hljs-keyword\">throws</span> RpcException</span>;\n</code></pre>\n<p>而 Exporter 的方法签名为:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\">Object <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(Method method, Object[] args)</span> <span class=\"hljs-keyword\">throws</span> Throwable</span>;  \n</code></pre>\n<p>但它们的作用是一样的,只是一个在客户端,一个在服务器端,却采用了不一样的模型类。</p>\n<p>再比如,URL 以字符串传递,不停的解析和拼装,没有一个 URL 模型类, 而 URL 的参数,却时而 Map, 时而 Parameters 类包装,</p>\n<pre><code class=\"language-java\">export(String url)  \ncreateExporter(String host, <span class=\"hljs-keyword\">int</span> port, Parameters params);  \n</code></pre>\n<p>使用一致模型:</p>\n<pre><code class=\"language-java\">export(URL url)  \ncreateExporter(URL url);  \n</code></pre>\n<p>再比如,现有的:Invoker, Exporter, InvocationHandler, FilterChain\n其实都是 invoke 行为的不同阶段,完全可以抽象掉,统一为 Invoker,减少概念。</p>\n<h2>第五步,分层,组合式扩展,而不是泛化式扩展</h2>\n<p>原因参见:<a href=\"../principals/expansibility.md\">谈谈扩充式扩展与增量式扩展</a>。</p>\n<p>泛化式扩展指:将扩展点逐渐抽象,取所有功能并集,新加功能总是套入并扩充旧功能的概念。</p>\n<p>组合式扩展指:将扩展点正交分解,取所有功能交集,新加功能总是基于旧功能之上实现。</p>\n<p>上面的设计,不自觉的就将 Dubbo 现有功能都当成了核心功能。上面的概念包含了 Dubbo 现有 RPC 的所有功能,包括:Proxy, Router, Failover, LoadBalance, Subscriber, Publisher, Invoker, Exporter, Filter 等,\n但这些都是核心吗?踢掉哪些,RPC 一样可以 Run?而哪些又是不能踢掉的?基于这样考虑,可以将 RPC 分解成两个层次,只是 Protocol 和 Invoker 才是 RPC 的核心。其它,包括 Router, Failover, Loadbalance, Subscriber, Publisher 都不核心,而是 Routing。所以,将 Routing 作为 Rpc 核心的一个扩展,设计如下:</p>\n<p><img src=\"../sources/images/design-step3.png\" alt=\"design-step-3\"></p>\n<h2>第六步,整理,梳理关系</h2>\n<p>整理后,设计如下:</p>\n<p><img src=\"../sources/images/design-step4.png\" alt=\"design-step-4\"></p>\n",
+  "link": "/zh-cn/docs/dev/principals/extension.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/general-knowledge.json b/zh-cn/docs/dev/principals/general-knowledge.json
index beef01f6..202a779f 100644
--- a/zh-cn/docs/dev/principals/general-knowledge.json
+++ b/zh-cn/docs/dev/principals/general-knowledge.json
@@ -1,4 +1,6 @@
 {
   "filename": "general-knowledge.md",
-  "__html": "<h1>一些设计上的基本常识</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/706098\">http://javatar.iteye.com/blog/706098</a></p>\n</blockquote>\n<p>最近给团队新人讲了一些设计上的常识,可能会对其它的新人也有些帮助,把暂时想到的几条,先记在这里。</p>\n<h2>API 与 SPI 分离</h2>\n<p>框架或组件通常有两类客户,一个是使用者,一个是扩展者。API (Application Programming Interface) 是给使用者用的,而 SPI (Service Provide Interface) 是给扩展者用的。在设计时,尽量把它们隔离开,而不要混在一起。也就是说,使用者是看不到扩展者写的实现的。</p>\n<p>比如:一个 Web 框架,它有一个 API 接口叫 Action,里面有个 execute() 方法,是给使用者用来写业务逻辑的。然后,Web 框架有一个 SPI 接口给扩展者控制输出方式,比如用 velocity 模板输出还是用 json 输出等。如果这个 Web 框架使用一个都继承 Action 的 VelocityAction 和一个 JsonAction 做为扩展方式,要用 velocity 模板输出的就继承 VelocityAction,要用 json 输出的就继承 JsonAction,这就是 API 和 SPI 没有分离的反面例子,SPI 接口混在了 API 接口中。</p>\n<p><img src=\"../sources/images/mix-api-spi.jpg\" alt=\"mix-api-spi\"></p>\n<p>合理的方式是,有一个单独的 Renderer 接口,有 VelocityRenderer 和 JsonRenderer 实现,Web 框架将 Action 的输出转交给 Renderer 接口做渲染输出。</p>\n<p><img src=\"../sources/images/seperate-api-spi.jpg\" alt=\"seperate-api-spi\"></p>\n<h2>服务域/实体域/会话域分离</h2>\n<p>任何框架或组件,总会有核心领域模型,比如:Spring 的 Bean,Struts 的 Action,Dubbo 的 Service,Napoli 的 Queue 等等。这个核心领域模型及其组成部分称为实体域,它代表着我们要操作的目标本身。实体域通常是线程安全的,不管是通过不变类,同步状态,或复制的方式。</p>\n<p>服务域也就是行为域,它是组件的功能集,同时也负责实体域和会话域的生命周期管理,\n比如 Spring 的 ApplicationContext,Dubbo 的 ServiceManager 等。服务域的对象通常会比较重,而且是线程安全的,并以单一实例服务于所有调用。</p>\n<p>什么是会话?就是一次交互过程。会话中重要的概念是上下文,什么是上下文?比如我们说:“老地方见”,这里的“老地方”就是上下文信息。为什么说“老地方”对方会知道,因为我们前面定义了“老地方”的具体内容。所以说,上下文通常持有交互过程中的状态变量等。会话对象通常较轻,每次请求都重新创建实例,请求结束后销毁。简而言之:把元信息交由实体域持有,把一次请求中的临时状态由会话域持有,由服务域贯穿整个过程。</p>\n<p><img src=\"../sources/images/ddd.jpg\" alt=\"ddd\"></p>\n<h2>在重要的过程上设置拦截接口</h2>\n<p>如果你要写个远程调用框架,那远程调用的过程应该有一个统一的拦截接口。如果你要写一个 ORM 框架,那至少 SQL 的执行过程,Mapping 过程要有拦截接口;如果你要写一个 Web 框架,那请求的执行过程应该要有拦截接口,等等。没有哪个公用的框架可以 Cover 住所有需求,允许外置行为,是框架的基本扩展方式。这样,如果有人想在远程调用前,验证下令牌,验证下黑白名单,统计下日志;如果有人想在 SQL 执行前加下分页包装,做下数据权限控制,统计下 SQL 执行时间;如果有人想在请求执行前检查下角色,包装下输入输出流,统计下请求量,等等,就可以自行完成,而不用侵入框架内部。拦截接口,通常是把过程本身用一个对象封装起来,传给拦截器链,比如:远程调用主过程为 invoke(),那拦截器接口通常为 invoke(Invocation),Invocation 对象封装了本来要执行过程的上下文,并且 Invocation 里有一个 invoke() 方法,由拦截器决定什么时候执行,同时,Invocation 也代表拦截器行为本身,这样上一拦截器的 Invocation 其实是包装的下一拦截器的过程,直到最后一个拦截器的 Invocation 是包装的最终的 invoke() 过程;同理,SQL 主过程为 execute(),那拦截器接口通常为 execute(Execution),原理一样。当然,实现方式可以任意,上面只是举例。</p>\n<p><img src=\"../sources/images/filter-chain.jpg\" alt=\"filter-chain\"></p>\n<h2>重要的状态的变更发送事件并留出监听接口</h2>\n<p>这里先要讲一个事件和上面拦截器的区别,拦截器是干预过程的,它是过程的一部分,是基于过程行为的,而事件是基于状态数据的,任何行为改变的相同状态,对事件应该是一致的。事件通常是事后通知,是一个 Callback 接口,方法名通常是过去式的,比如 onChanged()。比如远程调用框架,当网络断开或连上应该发出一个事件,当出现错误也可以考虑发出一个事件,这样外围应用就有可能观察到框架内部的变化,做相应适应。</p>\n<p><img src=\"../sources/images/event-listener.jpg\" alt=\"event-listener\"></p>\n<h2>扩展接口职责尽可能单一,具有可组合性</h2>\n<p>比如,远程调用框架它的协议是可以替换的。如果只提供一个总的扩展接口,当然可以做到切换协议,但协议支持是可以细分为底层通讯,序列化,动态代理方式等等。如果将接口拆细,正交分解,会更便于扩展者复用已有逻辑,而只是替换某部分实现策略。当然这个分解的粒度需要把握好。</p>\n<h2>微核插件式,平等对待第三方</h2>\n<p>大凡发展的比较好的框架,都遵守微核的理念。Eclipse 的微核是 OSGi, Spring 的微核是 BeanFactory,Maven 的微核是 Plexus。通常核心是不应该带有功能性的,而是一个生命周期和集成容器,这样各功能可以通过相同的方式交互及扩展,并且任何功能都可以被替换。如果做不到微核,至少要平等对待第三方,即原作者能实现的功能,扩展者应该可以通过扩展的方式全部做到。原作者要把自己也当作扩展者,这样才能保证框架的可持续性及由内向外的稳定性。</p>\n<h2>不要控制外部对象的生命周期</h2>\n<p>比如上面说的 Action 使用接口和 Renderer 扩展接口。框架如果让使用者或扩展者把 Action 或 Renderer 实现类的类名或类元信息报上来,然后在内部通过反射 newInstance() 创建一个实例,这样框架就控制了 Action 或 Renderer 实现类的生命周期,Action 或 Renderer 的生老病死,框架都自己做了,外部扩展或集成都无能为力。好的办法是让使用者或扩展者把 Action 或 Renderer 实现类的实例报上来,框架只是使用这些实例,这些对象是怎么创建的,怎么销毁的,都和框架无关,框架最多提供工具类辅助管理,而不是绝对控制。</p>\n<h2>可配置一定可编程,并保持友好的 CoC 约定</h2>\n<p>因为使用环境的不确定因素很多,框架总会有一些配置,一般都会到 classpath 直扫某个指定名称的配置,或者启动时允许指定配置路径。做为一个通用框架,应该做到凡是能配置文件做的一定要能通过编程方式进行,否则当使用者需要将你的框架与另一个框架集成时就会带来很多不必要的麻烦。</p>\n<p>另外,尽可能做一个标准约定,如果用户按某种约定做事时,就不需要该配置项。比如:配置模板位置,你可以约定,如果放在 templates 目录下就不用配了,如果你想换个目录,就配置下。</p>\n<h2>区分命令与查询,明确前置条件与后置条件</h2>\n<p>这个是契约式设计的一部分,尽量遵守有返回值的方法是查询方法,void 返回的方法是命令。查询方法通常是幂等性的,无副作用的,也就是不改变任何状态,调 n 次结果都是一样的,比如 get 某个属性值,或查询一条数据库记录。命令是指有副作用的,也就是会修改状态,比如 set 某个值,或 update 某条数据库记录。如果你的方法即做了修改状态的操作,又做了查询返回,如果可能,将其拆成写读分离的两个方法,比如:User deleteUser(id),删除用户并返回被删除的用户,考虑改为 getUser() 和 void 的 deleteUser()。 另外,每个方法都尽量前置断言传入参数的合法性,后置断言返回结果的合法性,并文档化。</p>\n<h2>增量式扩展,而不要扩充原始核心概念</h2>\n<p>参见:<a href=\"./principals/expansibility.md\">谈谈扩充式扩展与增量式扩展</a></p>\n"
+  "__html": "<h1>一些设计上的基本常识</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/706098\">http://javatar.iteye.com/blog/706098</a></p>\n</blockquote>\n<p>最近给团队新人讲了一些设计上的常识,可能会对其它的新人也有些帮助,把暂时想到的几条,先记在这里。</p>\n<h2>API 与 SPI 分离</h2>\n<p>框架或组件通常有两类客户,一个是使用者,一个是扩展者。API (Application Programming Interface) 是给使用者用的,而 SPI (Service Provide Interface) 是给扩展者用的。在设计时,尽量把它们隔离开,而不要混在一起。也就是说,使用者是看不到扩展者写的实现的。</p>\n<p>比如:一个 Web 框架,它有一个 API 接口叫 Action,里面有个 execute() 方法,是给使用者用来写业务逻辑的。然后,Web 框架有一个 SPI 接口给扩展者控制输出方式,比如用 velocity 模板输出还是用 json 输出等。如果这个 Web 框架使用一个都继承 Action 的 VelocityAction 和一个 JsonAction 做为扩展方式,要用 velocity 模板输出的就继承 VelocityAction,要用 json 输出的就继承 JsonAction,这就是 API 和 SPI 没有分离的反面例子,SPI 接口混在了 API 接口中。</p>\n<p><img src=\"../sources/images/mix-api-spi.jpg\" alt=\"mix-api-spi\"></p>\n<p>合理的方式是,有一个单独的 Renderer 接口,有 VelocityRenderer 和 JsonRenderer 实现,Web 框架将 Action 的输出转交给 Renderer 接口做渲染输出。</p>\n<p><img src=\"../sources/images/seperate-api-spi.jpg\" alt=\"seperate-api-spi\"></p>\n<h2>服务域/实体域/会话域分离</h2>\n<p>任何框架或组件,总会有核心领域模型,比如:Spring 的 Bean,Struts 的 Action,Dubbo 的 Service,Napoli 的 Queue 等等。这个核心领域模型及其组成部分称为实体域,它代表着我们要操作的目标本身。实体域通常是线程安全的,不管是通过不变类,同步状态,或复制的方式。</p>\n<p>服务域也就是行为域,它是组件的功能集,同时也负责实体域和会话域的生命周期管理,\n比如 Spring 的 ApplicationContext,Dubbo 的 ServiceManager 等。服务域的对象通常会比较重,而且是线程安全的,并以单一实例服务于所有调用。</p>\n<p>什么是会话?就是一次交互过程。会话中重要的概念是上下文,什么是上下文?比如我们说:“老地方见”,这里的“老地方”就是上下文信息。为什么说“老地方”对方会知道,因为我们前面定义了“老地方”的具体内容。所以说,上下文通常持有交互过程中的状态变量等。会话对象通常较轻,每次请求都重新创建实例,请求结束后销毁。简而言之:把元信息交由实体域持有,把一次请求中的临时状态由会话域持有,由服务域贯穿整个过程。</p>\n<p><img src=\"../sources/images/ddd.jpg\" alt=\"ddd\"></p>\n<h2>在重要的过程上设置拦截接口</h2>\n<p>如果你要写个远程调用框架,那远程调用的过程应该有一个统一的拦截接口。如果你要写一个 ORM 框架,那至少 SQL 的执行过程,Mapping 过程要有拦截接口;如果你要写一个 Web 框架,那请求的执行过程应该要有拦截接口,等等。没有哪个公用的框架可以 Cover 住所有需求,允许外置行为,是框架的基本扩展方式。这样,如果有人想在远程调用前,验证下令牌,验证下黑白名单,统计下日志;如果有人想在 SQL 执行前加下分页包装,做下数据权限控制,统计下 SQL 执行时间;如果有人想在请求执行前检查下角色,包装下输入输出流,统计下请求量,等等,就可以自行完成,而不用侵入框架内部。拦截接口,通常是把过程本身用一个对象封装起来,传给拦截器链,比如:远程调用主过程为 invoke(),那拦截器接口通常为 invoke(Invocation),Invocation 对象封装了本来要执行过程的上下文,并且 Invocation 里有一个 invoke() 方法,由拦截器决定什么时候执行,同时,Invocation 也代表拦截器行为本身,这样上一拦截器的 Invocation 其实是包装的下一拦截器的过程,直到最后一个拦截器的 Invocation 是包装的最终的 invoke() 过程;同理,SQL 主过程为 execute(),那拦截器接口通常为 execute(Execution),原理一样。当然,实现方式可以任意,上面只是举例。</p>\n<p><img src=\"../sources/images/filter-chain.jpg\" alt=\"filter-chain\"></p>\n<h2>重要的状态的变更发送事件并留出监听接口</h2>\n<p>这里先要讲一个事件和上面拦截器的区别,拦截器是干预过程的,它是过程的一部分,是基于过程行为的,而事件是基于状态数据的,任何行为改变的相同状态,对事件应该是一致的。事件通常是事后通知,是一个 Callback 接口,方法名通常是过去式的,比如 onChanged()。比如远程调用框架,当网络断开或连上应该发出一个事件,当出现错误也可以考虑发出一个事件,这样外围应用就有可能观察到框架内部的变化,做相应适应。</p>\n<p><img src=\"../sources/images/event-listener.jpg\" alt=\"event-listener\"></p>\n<h2>扩展接口职责尽可能单一,具有可组合性</h2>\n<p>比如,远程调用框架它的协议是可以替换的。如果只提供一个总的扩展接口,当然可以做到切换协议,但协议支持是可以细分为底层通讯,序列化,动态代理方式等等。如果将接口拆细,正交分解,会更便于扩展者复用已有逻辑,而只是替换某部分实现策略。当然这个分解的粒度需要把握好。</p>\n<h2>微核插件式,平等对待第三方</h2>\n<p>大凡发展的比较好的框架,都遵守微核的理念。Eclipse 的微核是 OSGi, Spring 的微核是 BeanFactory,Maven 的微核是 Plexus。通常核心是不应该带有功能性的,而是一个生命周期和集成容器,这样各功能可以通过相同的方式交互及扩展,并且任何功能都可以被替换。如果做不到微核,至少要平等对待第三方,即原作者能实现的功能,扩展者应该可以通过扩展的方式全部做到。原作者要把自己也当作扩展者,这样才能保证框架的可持续性及由内向外的稳定性。</p>\n<h2>不要控制外部对象的生命周期</h2>\n<p>比如上面说的 Action 使用接口和 Renderer 扩展接口。框架如果让使用者或扩展者把 Action 或 Renderer 实现类的类名或类元信息报上来,然后在内部通过反射 newInstance() 创建一个实例,这样框架就控制了 Action 或 Renderer 实现类的生命周期,Action 或 Renderer 的生老病死,框架都自己做了,外部扩展或集成都无能为力。好的办法是让使用者或扩展者把 Action 或 Renderer 实现类的实例报上来,框架只是使用这些实例,这些对象是怎么创建的,怎么销毁的,都和框架无关,框架最多提供工具类辅助管理,而不是绝对控制。</p>\n<h2>可配置一定可编程,并保持友好的 CoC 约定</h2>\n<p>因为使用环境的不确定因素很多,框架总会有一些配置,一般都会到 classpath 直扫某个指定名称的配置,或者启动时允许指定配置路径。做为一个通用框架,应该做到凡是能配置文件做的一定要能通过编程方式进行,否则当使用者需要将你的框架与另一个框架集成时就会带来很多不必要的麻烦。</p>\n<p>另外,尽可能做一个标准约定,如果用户按某种约定做事时,就不需要该配置项。比如:配置模板位置,你可以约定,如果放在 templates 目录下就不用配了,如果你想换个目录,就配置下。</p>\n<h2>区分命令与查询,明确前置条件与后置条件</h2>\n<p>这个是契约式设计的一部分,尽量遵守有返回值的方法是查询方法,void 返回的方法是命令。查询方法通常是幂等性的,无副作用的,也就是不改变任何状态,调 n 次结果都是一样的,比如 get 某个属性值,或查询一条数据库记录。命令是指有副作用的,也就是会修改状态,比如 set 某个值,或 update 某条数据库记录。如果你的方法即做了修改状态的操作,又做了查询返回,如果可能,将其拆成写读分离的两个方法,比如:User deleteUser(id),删除用户并返回被删除的用户,考虑改为 getUser() 和 void 的 deleteUser()。 另外,每个方法都尽量前置断言传入参数的合法性,后置断言返回结果的合法性,并文档化。</p>\n<h2>增量式扩展,而不要扩充原始核心概念</h2>\n<p>参见:<a href=\"./principals/expansibility.md\">谈谈扩充式扩展与增量式扩展</a></p>\n",
+  "link": "/zh-cn/docs/dev/principals/general-knowledge.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/introduction.json b/zh-cn/docs/dev/principals/introduction.json
index d78c263f..05a6a402 100644
--- a/zh-cn/docs/dev/principals/introduction.json
+++ b/zh-cn/docs/dev/principals/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<h1>设计原则</h1>\n<p>本章节的设计原则摘录自梁飞在 javaeye 上发表的系列文章。</p>\n"
+  "__html": "<h1>设计原则</h1>\n<p>本章节的设计原则摘录自梁飞在 javaeye 上发表的系列文章。</p>\n",
+  "link": "/zh-cn/docs/dev/principals/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/robustness.json b/zh-cn/docs/dev/principals/robustness.json
index 6dd23ce5..a9f88aa5 100644
--- a/zh-cn/docs/dev/principals/robustness.json
+++ b/zh-cn/docs/dev/principals/robustness.json
@@ -1,4 +1,6 @@
 {
   "filename": "robustness.md",
-  "__html": "<h1>设计实现的健壮性</h1>\n<blockquote>\n<p><a href=\"http://oldratlee.com/380/tech/java/robustness-of-implement.html\">http://oldratlee.com/380/tech/java/robustness-of-implement.html</a></p>\n</blockquote>\n<p>Dubbo 作为远程服务暴露、调用和治理的解决方案,是应用运转的经络,其本身实现健壮性的重要程度是不言而喻的。</p>\n<p>这里列出一些 Dubbo 用到的原则和方法。</p>\n<h2>日志</h2>\n<p>日志是发现问题、查看问题一个最常用的手段。日志质量往往被忽视,没有日志使用上的明确约定。重视 Log 的使用,提高 Log 的信息浓度。日志过多、过于混乱,会导致有用的信息被淹没。</p>\n<p>要有效利用这个工具要注意:</p>\n<h3>严格约定WARN、ERROR级别记录的内容</h3>\n<ul>\n<li>WARN 表示可以恢复的问题,无需人工介入。</li>\n<li>ERROR 表示需要人工介入问题。</li>\n</ul>\n<p>有了这样的约定,监管系统发现日志文件的中出现 ERROR 字串就报警,又尽量减少了发生。过多的报警会让人疲倦,使人对报警失去警惕性,使 ERROR 日志失去意义。再辅以人工定期查看 WARN 级别信息,以评估系统的“亚健康”程度。</p>\n<h3>日志中,尽量多的收集关键信息</h3>\n<p>哪些是关键信息呢?</p>\n<ul>\n<li>出问题时的现场信息,即排查问题要用到的信息。如服务调用失败时,要给出使用 Dubbo 的版本、服务提供者的 IP、使用的是哪个注册中心;调用的是哪个服务、哪个方法等等。这些信息如果不给出,那么事后人工收集的,问题过后现场可能已经不能复原,加大排查问题的难度。</li>\n<li>如果可能,给出问题的原因和解决方法。这让维护和问题解决变得简单,而不是寻求精通者(往往是实现者)的帮助。</li>\n</ul>\n<h3>同一个或是一类问题不要重复记录多次</h3>\n<p>同一个或是一类异常日志连续出现几十遍的情况,还是常常能看到的。人眼很容易漏掉淹没在其中不一样的重要日志信息。要尽量避免这种情况。在可以预见会出现的情况,有必要加一些逻辑来避免。</p>\n<p>如为一个问题准备一个标志,出问题后打日志后设置标志,避免重复打日志。问题恢复后清除标志。</p>\n<p>虽然有点麻烦,但是这样做保证日志信息浓度,让监控更有效。</p>\n<h2>界限设置</h2>\n<p>资源是有限的,CPU、内存、IO 等等。不要因为外部的请求、数据不受限的而崩溃。</p>\n<h3>线程池(ExectorService)的大小和饱和策略</h3>\n<p>Server 端用于处理请求的 ExectorService 设置上限。ExecutorService 的任务等待队列使用有限队列,避免资源耗尽。当任务等待队列饱和时,选择一个合适的饱和策略。这样保证平滑劣化。</p>\n<p>在 Dubbo 中,饱和策略是丢弃数据,等待结果也只是请求的超时。</p>\n<p>达到饱和时,说明已经达到服务提供方的负荷上限,要在饱和策略的操作中日志记录这个问题,以发出监控警报。记得注意不要重复多次记录哦。(注意,缺省的饱和策略不会有这些附加的操作。)根据警报的频率,已经决定扩容调整等等,避免系统问题被忽略。</p>\n<h3>集合容量</h3>\n<p>如果确保进入集合的元素是可控的且是足够少,则可以放心使用。这是大部分的情况。如果不能保证,则使用有有界的集合。当到达界限时,选择一个合适的丢弃策略。</p>\n<h2>容错-重试-恢复</h2>\n<p>高可用组件要容忍其依赖组件的失败。</p>\n<h3>Dubbo 的服务注册中心</h3>\n<p>目前服务注册中心使用了数据库来保存服务提供者和消费者的信息。注册中心集群不同注册中心也通过数据库来之间同步数据,以感知其它注册中心上提供者。注册中心会内存中保证一份提供者和消费者数据,数据库不可用时,注册中心独立对外正常运转,只是拿不到其它注册中心的数据。当数据库恢复时,重试逻辑会内存中修改的数据写回数据库,并拿到数据库中新数据。</p>\n<h3>服务的消费者</h3>\n<p>服务消息者从注册中心拿到提供者列表后,会保存提供者列表到内存和磁盘文件中。这样注册中心宕后消费者可以正常运转,甚至可以在注册中心宕机过程中重启消费者。消费者启动时,发现注册中心不可用,会读取保存在磁盘文件中提供者列表。重试逻辑保证注册中心恢复后,更新信息。</p>\n<h2>重试延迟策略</h2>\n<p>上一点的子问题。Dubbo 中碰到有两个相关的场景。</p>\n<h3>数据库上的活锁</h3>\n<p>注册中心会定时更新数据库一条记录的时间戳,这样集群中其它的注册中心感知它是存活。过期注册中心和它的相关数据 会被清除。数据库正常时,这个机制运行良好。但是数据库负荷高时,其上的每个操作都会很慢。这就出现:</p>\n<p>A 注册中心认为 B 过期,删除 B 的数据。 B 发现自己的数据没有了,重新写入自己的数据的反复操作。这些反复的操作又加重了数据库的负荷,恶化问题。</p>\n<p>可以使用下面逻辑:</p>\n<p>当 B 发现自己数据被删除时(写入失败),选择等待这段时间再重试。重试时间可以选择指数级增长,如第一次等 1 分钟,第二次 10 分钟、第三次 100 分钟。</p>\n<p>这样操作减少后,保证数据库可以冷却(Cool Down)下来。</p>\n<h3>Client 重连注册中心</h3>\n<p>当一个注册中心停机时,其它的 Client 会同时接收事件,而去重连另一个注册中心。Client 数量相对比较多,会对注册中心造成冲击。避免方法可以是 Client 重连时随机延时 3 分钟,把重连分散开。</p>\n"
+  "__html": "<h1>设计实现的健壮性</h1>\n<blockquote>\n<p><a href=\"http://oldratlee.com/380/tech/java/robustness-of-implement.html\">http://oldratlee.com/380/tech/java/robustness-of-implement.html</a></p>\n</blockquote>\n<p>Dubbo 作为远程服务暴露、调用和治理的解决方案,是应用运转的经络,其本身实现健壮性的重要程度是不言而喻的。</p>\n<p>这里列出一些 Dubbo 用到的原则和方法。</p>\n<h2>日志</h2>\n<p>日志是发现问题、查看问题一个最常用的手段。日志质量往往被忽视,没有日志使用上的明确约定。重视 Log 的使用,提高 Log 的信息浓度。日志过多、过于混乱,会导致有用的信息被淹没。</p>\n<p>要有效利用这个工具要注意:</p>\n<h3>严格约定WARN、ERROR级别记录的内容</h3>\n<ul>\n<li>WARN 表示可以恢复的问题,无需人工介入。</li>\n<li>ERROR 表示需要人工介入问题。</li>\n</ul>\n<p>有了这样的约定,监管系统发现日志文件的中出现 ERROR 字串就报警,又尽量减少了发生。过多的报警会让人疲倦,使人对报警失去警惕性,使 ERROR 日志失去意义。再辅以人工定期查看 WARN 级别信息,以评估系统的“亚健康”程度。</p>\n<h3>日志中,尽量多的收集关键信息</h3>\n<p>哪些是关键信息呢?</p>\n<ul>\n<li>出问题时的现场信息,即排查问题要用到的信息。如服务调用失败时,要给出使用 Dubbo 的版本、服务提供者的 IP、使用的是哪个注册中心;调用的是哪个服务、哪个方法等等。这些信息如果不给出,那么事后人工收集的,问题过后现场可能已经不能复原,加大排查问题的难度。</li>\n<li>如果可能,给出问题的原因和解决方法。这让维护和问题解决变得简单,而不是寻求精通者(往往是实现者)的帮助。</li>\n</ul>\n<h3>同一个或是一类问题不要重复记录多次</h3>\n<p>同一个或是一类异常日志连续出现几十遍的情况,还是常常能看到的。人眼很容易漏掉淹没在其中不一样的重要日志信息。要尽量避免这种情况。在可以预见会出现的情况,有必要加一些逻辑来避免。</p>\n<p>如为一个问题准备一个标志,出问题后打日志后设置标志,避免重复打日志。问题恢复后清除标志。</p>\n<p>虽然有点麻烦,但是这样做保证日志信息浓度,让监控更有效。</p>\n<h2>界限设置</h2>\n<p>资源是有限的,CPU、内存、IO 等等。不要因为外部的请求、数据不受限的而崩溃。</p>\n<h3>线程池(ExectorService)的大小和饱和策略</h3>\n<p>Server 端用于处理请求的 ExectorService 设置上限。ExecutorService 的任务等待队列使用有限队列,避免资源耗尽。当任务等待队列饱和时,选择一个合适的饱和策略。这样保证平滑劣化。</p>\n<p>在 Dubbo 中,饱和策略是丢弃数据,等待结果也只是请求的超时。</p>\n<p>达到饱和时,说明已经达到服务提供方的负荷上限,要在饱和策略的操作中日志记录这个问题,以发出监控警报。记得注意不要重复多次记录哦。(注意,缺省的饱和策略不会有这些附加的操作。)根据警报的频率,已经决定扩容调整等等,避免系统问题被忽略。</p>\n<h3>集合容量</h3>\n<p>如果确保进入集合的元素是可控的且是足够少,则可以放心使用。这是大部分的情况。如果不能保证,则使用有有界的集合。当到达界限时,选择一个合适的丢弃策略。</p>\n<h2>容错-重试-恢复</h2>\n<p>高可用组件要容忍其依赖组件的失败。</p>\n<h3>Dubbo 的服务注册中心</h3>\n<p>目前服务注册中心使用了数据库来保存服务提供者和消费者的信息。注册中心集群不同注册中心也通过数据库来之间同步数据,以感知其它注册中心上提供者。注册中心会内存中保证一份提供者和消费者数据,数据库不可用时,注册中心独立对外正常运转,只是拿不到其它注册中心的数据。当数据库恢复时,重试逻辑会内存中修改的数据写回数据库,并拿到数据库中新数据。</p>\n<h3>服务的消费者</h3>\n<p>服务消息者从注册中心拿到提供者列表后,会保存提供者列表到内存和磁盘文件中。这样注册中心宕后消费者可以正常运转,甚至可以在注册中心宕机过程中重启消费者。消费者启动时,发现注册中心不可用,会读取保存在磁盘文件中提供者列表。重试逻辑保证注册中心恢复后,更新信息。</p>\n<h2>重试延迟策略</h2>\n<p>上一点的子问题。Dubbo 中碰到有两个相关的场景。</p>\n<h3>数据库上的活锁</h3>\n<p>注册中心会定时更新数据库一条记录的时间戳,这样集群中其它的注册中心感知它是存活。过期注册中心和它的相关数据 会被清除。数据库正常时,这个机制运行良好。但是数据库负荷高时,其上的每个操作都会很慢。这就出现:</p>\n<p>A 注册中心认为 B 过期,删除 B 的数据。 B 发现自己的数据没有了,重新写入自己的数据的反复操作。这些反复的操作又加重了数据库的负荷,恶化问题。</p>\n<p>可以使用下面逻辑:</p>\n<p>当 B 发现自己数据被删除时(写入失败),选择等待这段时间再重试。重试时间可以选择指数级增长,如第一次等 1 分钟,第二次 10 分钟、第三次 100 分钟。</p>\n<p>这样操作减少后,保证数据库可以冷却(Cool Down)下来。</p>\n<h3>Client 重连注册中心</h3>\n<p>当一个注册中心停机时,其它的 Client 会同时接收事件,而去重连另一个注册中心。Client 数量相对比较多,会对注册中心造成冲击。避免方法可以是 Client 重连时随机延时 3 分钟,把重连分散开。</p>\n",
+  "link": "/zh-cn/docs/dev/principals/robustness.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/release.json b/zh-cn/docs/dev/release.json
index 5ea5b9eb..365dbdea 100644
--- a/zh-cn/docs/dev/release.json
+++ b/zh-cn/docs/dev/release.json
@@ -1,4 +1,6 @@
 {
   "filename": "release.md",
-  "__html": "<h1>版本管理</h1>\n<p><strong>新功能的开发</strong> 和 <strong>稳定性的提高</strong> 对产品都很重要。但是添加新功能会影响稳定性,Dubbo 使用如下的版本开发模式来保障两者。</p>\n<h2>2 个版本并行开发</h2>\n<ul>\n<li>BugFix 版本:低版本,比如 <code>2.4.x</code>。是 GA 版本,线上使用的版本,只会 BugFix,升级第三位版本号。</li>\n<li>新功能版本:高版本,比如 <code>2.5.x</code>。加新功能的版本,会给对新功能有需求的应用试用。</li>\n</ul>\n<p><code>2.5.x</code> 的新功能基本稳定后,进入 <code>2.5.x</code> 试用阶段。找足够多的应用试用 <code>2.5.x</code> 版本。</p>\n<p>在 <code>2.5.x</code> 够稳定后:</p>\n<ul>\n<li><code>2.5.x</code> 成为 GA 版本,只 BugFix,推广使用此版本。如何可行,可以推进应用在期望的时间点内升级到 GA 版本。</li>\n<li><code>2.4.x</code> 不再开发,应用碰到 Bug 让直接升级。(这个称为“夕阳条款”)</li>\n<li>从 <code>2.5.x</code> 拉成分支 <code>2.6.0</code>,作为新功能开发版本。</li>\n</ul>\n<h2>优势</h2>\n<ul>\n<li>保持 GA 版本是稳定的!因为:\n<ul>\n<li>只会作 BugFix</li>\n<li>成为 GA 版本前有试用阶段</li>\n</ul>\n</li>\n<li>新功能可以高版本中快速响应,并让应用能试用新功能。</li>\n<li>不会版本过多,导致开发和维护成本剧增</li>\n</ul>\n<h2>用户要配合的职责</h2>\n<p>由于开发只会 BugFix GA 版本,所以用户需要积极跟进升级到 GA 版本,以 Fix 发现的问题。</p>\n<p>定期升级版本用户带来了不安。这是一个假命题,说明如下:</p>\n<ul>\n<li>GA 经过一个试用阶段保持稳定。</li>\n<li>GA 版本有 Bug 会火速 Fix</li>\n<li>相对出问题才升级到 GA 版本(可以跨了多个版本)定期升级平摊风险(类似小步快跑)。经历过周期长的大项目的同学会有这样的经历,三方库版本长时间不升级,结果出了问题不得不升级到新版本(跨了多个版本)风险巨大。</li>\n</ul>\n"
+  "__html": "<h1>版本管理</h1>\n<p><strong>新功能的开发</strong> 和 <strong>稳定性的提高</strong> 对产品都很重要。但是添加新功能会影响稳定性,Dubbo 使用如下的版本开发模式来保障两者。</p>\n<h2>2 个版本并行开发</h2>\n<ul>\n<li>BugFix 版本:低版本,比如 <code>2.4.x</code>。是 GA 版本,线上使用的版本,只会 BugFix,升级第三位版本号。</li>\n<li>新功能版本:高版本,比如 <code>2.5.x</code>。加新功能的版本,会给对新功能有需求的应用试用。</li>\n</ul>\n<p><code>2.5.x</code> 的新功能基本稳定后,进入 <code>2.5.x</code> 试用阶段。找足够多的应用试用 <code>2.5.x</code> 版本。</p>\n<p>在 <code>2.5.x</code> 够稳定后:</p>\n<ul>\n<li><code>2.5.x</code> 成为 GA 版本,只 BugFix,推广使用此版本。如何可行,可以推进应用在期望的时间点内升级到 GA 版本。</li>\n<li><code>2.4.x</code> 不再开发,应用碰到 Bug 让直接升级。(这个称为“夕阳条款”)</li>\n<li>从 <code>2.5.x</code> 拉成分支 <code>2.6.0</code>,作为新功能开发版本。</li>\n</ul>\n<h2>优势</h2>\n<ul>\n<li>保持 GA 版本是稳定的!因为:\n<ul>\n<li>只会作 BugFix</li>\n<li>成为 GA 版本前有试用阶段</li>\n</ul>\n</li>\n<li>新功能可以高版本中快速响应,并让应用能试用新功能。</li>\n<li>不会版本过多,导致开发和维护成本剧增</li>\n</ul>\n<h2>用户要配合的职责</h2>\n<p>由于开发只会 BugFix GA 版本,所以用户需要积极跟进升级到 GA 版本,以 Fix 发现的问题。</p>\n<p>定期升级版本用户带来了不安。这是一个假命题,说明如下:</p>\n<ul>\n<li>GA 经过一个试用阶段保持稳定。</li>\n<li>GA 版本有 Bug 会火速 Fix</li>\n<li>相对出问题才升级到 GA 版本(可以跨了多个版本)定期升级平摊风险(类似小步快跑)。经历过周期长的大项目的同学会有这样的经历,三方库版本长时间不升级,结果出了问题不得不升级到新版本(跨了多个版本)风险巨大。</li>\n</ul>\n",
+  "link": "/zh-cn/docs/dev/release.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html b/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html
new file mode 100644
index 00000000..00bcbc0f
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html
@@ -0,0 +1,33 @@
+<!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="label-an-issue-guide_dev" />
+	<meta name="description" content="label-an-issue-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>给问题打标签</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/label-an-issue-guide_dev.json b/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.json
new file mode 100644
index 00000000..bb757c2d
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue-guide_dev.md",
+  "__html": "<h1>给问题打标签</h1>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/label-an-issue.html b/zh-cn/docs/developers/committer-guide/label-an-issue.html
new file mode 100644
index 00000000..3a80b3fb
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/label-an-issue.html
@@ -0,0 +1,33 @@
+<!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="label-an-issue" />
+	<meta name="description" content="label-an-issue" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>标注问题</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/label-an-issue.json b/zh-cn/docs/developers/committer-guide/label-an-issue.json
new file mode 100644
index 00000000..6137f9e0
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/label-an-issue.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue.md",
+  "__html": "<h1>标注问题</h1>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/label-an-issue.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/label-an-issue_dev.html b/zh-cn/docs/developers/committer-guide/label-an-issue_dev.html
new file mode 100644
index 00000000..05cd7fca
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/label-an-issue_dev.html
@@ -0,0 +1,33 @@
+<!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="label-an-issue_dev" />
+	<meta name="description" content="label-an-issue_dev" />
+	<!-- 网页标签标题 -->
+	<title>label-an-issue_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>给问题打标签</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/label-an-issue_dev.json b/zh-cn/docs/developers/committer-guide/label-an-issue_dev.json
new file mode 100644
index 00000000..57ae4fc0
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/label-an-issue_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "label-an-issue_dev.md",
+  "__html": "<h1>给问题打标签</h1>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/label-an-issue_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/new-committer-guide.html b/zh-cn/docs/developers/committer-guide/new-committer-guide.html
new file mode 100644
index 00000000..c335ce47
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/new-committer-guide.html
@@ -0,0 +1,101 @@
+<!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="new-committer-guide" />
+	<meta name="description" content="new-committer-guide" />
+	<!-- 网页标签标题 -->
+	<title>new-committer-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Apache 提交者注册流程</h1>
+<h2>一、apache提交者的产生</h2>
+<h3>项目孵化初始化提交者</h3>
+<p>项目孵化阶段,在孵化项目提案中,会有初始化提交者列表这一选项。确认你是初始化提交者的一员。项目在apache孵化器社区投票通过后,提交者可以开始准备注册账户了。可以参看<a href="https://wiki.apache.org/incubator/">孵化器wiki</a></p>
+<h3>活跃的贡献者被选举为提交者</h3>
+<p>在后期的开发过程中,活跃的贡献者可以被选举为提交者。见<a href="https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer">如何成为committer</a></p>
+<h2>二、个人开发者提交ICLA</h2>
+<h3>1、选apache id</h3>
+<p>在<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>查看可用的apache id,</p>
+<h3>2、个人提交者授权协议(ICLA):</h3>
+<p>下载<a href="https://www.apache.org/licenses/icla.pdf">ICLA模板</a>,查找可用的id。将icla.pdf个人信息填写正确后打印,签名、扫描、并当做附件发送邮件给秘书 <a href="mailto:secretary@apache.org">secretary@apache.org</a>,秘书会帮忙创建apache 用户id。同时会创建一个your id@apache.org的邮箱,可以在<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>查看查找用户是否已经创建。</p>
+<h3>3、导师帮助提交用户id创建请求</h3>
+<p>导师将帮助提交apache账户创建请求给root邮件组,会有人帮助建立id。一般需要2天时间账户会建立,请等待并在<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>查看查找用户是否已经创建。</p>
+<h2>三、加入apache开发者组</h2>
+<ul>
+<li>1、登入<a href="https://id.apache.org/">Apache账户工具</a>,首次登入可以选忘记密码获得初始化密码,会发送到forward邮箱(在孵化项目提案中提交的开发者邮件)</li>
+<li>2、关于apache邮箱:apache.org邮箱并没有自己的邮件内容存储服务器。他是需要借用其他邮件提供商的邮件内容存储、分发功能。在很多投票环节是建议用apache邮箱的。
+这就就有一个问题,怎么在其他邮箱里面配置好apache.org邮箱转发功能:
+1)收件箱:收取发送到apache.org的邮件。这个在第一步配置好Apache账户工具的forward邮箱就可以用forward邮箱收取邮件了
+2)发件箱:将发出的邮件显示发件邮箱为apache.org邮箱。请参考:<a href="https://reference.apache.org/committer/email">设置apache邮箱指南</a>和<a href="http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html">gmail邮箱设置方式</a>。 其他邮箱服务的设置方式不方便找到,gmail的最方便,建议换成gmail邮箱(不是广告)。</li>
+<li>3、修改编辑页面的homepage url,<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>中你的账户能加主页链接。</li>
+<li>4、修改编辑页面的github账户,<a href="http://xn--github-h18irjwvs5n80dryepv0gwb7ftho8ua.com/apache-commiiters%E7%BB%84%E3%80%82%E8%BF%99%E6%97%B6%E9%97%B4%E8%AF%B7%E7%9C%8B">会发有邮件邀请你加入github.com/apache-commiiters组。这时间请看</a><a href="http://www.apache.org/foundation/how-it-works.html#developers">ASF工作方式</a>对ASF开发做一些基本了解。</li>
+</ul>
+<h2>四、提交者获得对项目的写权限</h2>
+<p><a href="https://gitbox.apache.org/setup/">GitBox账户链接工具</a>的操作</p>
+<h3>1、Apache账户授权</h3>
+<p>按照提示授权对Apache账户的OAuth协议登入</p>
+<h3>2、Github账户授权</h3>
+<p>按照提示授权对Github账户的OAuth协议登入</p>
+<h3>3、在github.com设置github账户两因素授权(2FA)</h3>
+<p>按照<a href="https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/">授权GitHub 2FA wiki</a>操作如下:</p>
+<ul>
+<li>
+<p>1)、在手机安装 “google身份验证器” app</p>
+</li>
+<li>
+<p>2)、按照<a href="https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/">授权GitHub 2FA wiki</a>一步一步操作。</p>
+<p>在<a href="https://github.com/settings/two_factor_authentication/verify">两因素授权验证(2. Scan this barcode with your app.)</a>界面,不建议选择用手机扫描二维码,因为有些手机会扫描不出来。
+请打开手机 “google身份验证器” app,点“+”选择“输入提供的秘钥”: 在“账户名”input框写入github账户。在“您的秘钥”input框写入:打开的网页中&quot;enter this text code&quot; 链接里面的文本。在app中点击&quot;添加&quot; 后,将为此账户生成6位数字动态。将此6位数字写入网页中的文本框,然后点“Enable”。这样2fa就设置成功了。</p>
+</li>
+<li>
+<p>3)、退出并重新登入Github,输入用户名、密码后会多一步。动态密码的填写,用app的动态密码</p>
+</li>
+<li>
+<p>4)、约需要半个小时,会有邮件通知你已经加入了xx project-committers开发者组。你也可以自己去<a href="https://github.com/orgs/apache/teams">apache teams</a> 页面查看。</p>
+</li>
+<li>
+<p>5)、2fa提交后你已经clone的项目会有权限校验问题,解决方法为下面二选一:</p>
+<ul>
+<li>a.申请Access Token
+在github上 生成access token 后,指令行需要密码的地方就粘贴token。
+参考官网<a href="https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled">帮助链接一</a>和<a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/">帮助链接二</a></li>
+<li>b. 改用ssh
+ssh-keygen 然后把pub文件中的内容粘贴到github上</li>
+</ul>
+</li>
+<li>
+<p>注意:一定要保证github的2fa为&quot;enable&quot;状态。当你将2fa设置为&quot;off&quot;时候,将会被对应的apache committer写权限组除名,直到你再次设置成功为止。</p>
+</li>
+</ul>
+<h2>五、其他</h2>
+<h3>The apache way</h3>
+<p>参看<a href="http://apache.org/foundation/governance/">wiki</a></p>
+<p>社区重于代码
+如果没有在社区(邮件列表)讨论过,就当没有发生过</p>
+<h3>小福利</h3>
+<p>Jetbrains给apache提交者一个小福利,就是可以免费使用idea的全产品系列。具体注册地址为:<a href="https://www.jetbrains.com/shop/eform/apache?product=ALL">https://www.jetbrains.com/shop/eform/apache?product=ALL</a></p>
+<h3>相关 wiki</h3>
+<p><a href="https://www.apache.org/dev/new-committers-guide.html">https://www.apache.org/dev/new-committers-guide.html</a></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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/new-committer-guide.json b/zh-cn/docs/developers/committer-guide/new-committer-guide.json
new file mode 100644
index 00000000..738a5e4f
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/new-committer-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-committer-guide.md",
+  "__html": "<h1>Apache 提交者注册流程</h1>\n<h2>一、apache提交者的产生</h2>\n<h3>项目孵化初始化提交者</h3>\n<p>项目孵化阶段,在孵化项目提案中,会有初始化提交者列表这一选项。确认你是初始化提交者的一员。项目在apache孵化器社区投票通过后,提交者可以开始准备注册账户了。可以参看<a href=\"https://wiki.apache.org/incubator/\">孵化器wiki</a></p>\n<h3>活跃的贡献者被选举为提交者</h3>\n<p>在后期的开发过程中,活跃的贡献者可以被选举为提交者。见<a href=\"https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer\">如何成为committer</a></p>\n<h2>二、个人开发者提交ICLA</h2>\n<h3>1、选apache id</h3>\n<p>在<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>查看可用的apache id,</p>\n<h3>2、个人提交者授权协议(ICLA):</h3>\n<p>下载<a href=\"https://www.apache.org/licenses/icla.pdf\">ICLA模板</a>,查找可用的id。将icla.pdf个人信息填写正确后打印,签名、扫描、并当做附件发送邮件给秘书 <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a>,秘书会帮忙创建apache 用户id。同时会创建一个your id@apache.org的邮箱,可以在<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>查看查找用户是否已经创建。</p>\n<h3>3、导师帮助提交用户id创建请求</h3>\n<p>导师将帮助提交apache账户创建请求给root邮件组,会有人帮助建立id。一般需要2天时间账户会建立,请等待并在<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>查看查找用户是否已经创建。</p>\n<h2>三、加入apache开发者组</h2>\n<ul>\n<li>1、登入<a href=\"https://id.apache.org/\">Apache账户工具</a>,首次登入可以选忘记密码获得初始化密码,会发送到forward邮箱(在孵化项目提案中提交的开发者邮件)</li>\n<li>2、关于apache邮箱:apache.org邮箱并没有自己的邮件内容存储服务器。他是需要借用其他邮件提供商的邮件内容存储、分发功能。在很多投票环节是建议用apache邮箱的。\n这就就有一个问题,怎么在其他邮箱里面配置好apache.org邮箱转发功能:\n1)收件箱:收取发送到apache.org的邮件。这个在第一步配置好Apache账户工具的forward邮箱就可以用forward邮箱收取邮件了\n2)发件箱:将发出的邮件显示发件邮箱为apache.org邮箱。请参考:<a href=\"https://reference.apache.org/committer/email\">设置apache邮箱指南</a>和<a href=\"http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html\">gmail邮箱设置方式</a>。 其他邮箱服务的设置方式不方便找到,gmail的最方便,建议换成gmail邮箱(不是广告)。</li>\n<li>3、修改编辑页面的homepage url,<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>中你的账户能加主页链接。</li>\n<li>4、修改编辑页面的github账户,<a href=\"http://xn--github-h18irjwvs5n80dryepv0gwb7ftho8ua.com/apache-commiiters%E7%BB%84%E3%80%82%E8%BF%99%E6%97%B6%E9%97%B4%E8%AF%B7%E7%9C%8B\">会发有邮件邀请你加入github.com/apache-commiiters组。这时间请看</a><a href=\"http://www.apache.org/foundation/how-it-works.html#developers\">ASF工作方式</a>对ASF开发做一些基本了解。</li>\n</ul>\n<h2>四、提交者获得对项目的写权限</h2>\n<p><a href=\"https://gitbox.apache.org/setup/\">GitBox账户链接工具</a>的操作</p>\n<h3>1、Apache账户授权</h3>\n<p>按照提示授权对Apache账户的OAuth协议登入</p>\n<h3>2、Github账户授权</h3>\n<p>按照提示授权对Github账户的OAuth协议登入</p>\n<h3>3、在github.com设置github账户两因素授权(2FA)</h3>\n<p>按照<a href=\"https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/\">授权GitHub 2FA wiki</a>操作如下:</p>\n<ul>\n<li>\n<p>1)、在手机安装 “google身份验证器” app</p>\n</li>\n<li>\n<p>2)、按照<a href=\"https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/\">授权GitHub 2FA wiki</a>一步一步操作。</p>\n<p>在<a href=\"https://github.com/settings/two_factor_authentication/verify\">两因素授权验证(2. Scan this barcode with your app.)</a>界面,不建议选择用手机扫描二维码,因为有些手机会扫描不出来。\n请打开手机 “google身份验证器” app,点“+”选择“输入提供的秘钥”: 在“账户名”input框写入github账户。在“您的秘钥”input框写入:打开的网页中&quot;enter this text code&quot; 链接里面的文本。在app中点击&quot;添加&quot; 后,将为此账户生成6位数字动态。将此6位数字写入网页中的文本框,然后点“Enable”。这样2fa就设置成功了。</p>\n</li>\n<li>\n<p>3)、退出并重新登入Github,输入用户名、密码后会多一步。动态密码的填写,用app的动态密码</p>\n</li>\n<li>\n<p>4)、约需要半个小时,会有邮件通知你已经加入了xx project-committers开发者组。你也可以自己去<a href=\"https://github.com/orgs/apache/teams\">apache teams</a> 页面查看。</p>\n</li>\n<li>\n<p>5)、2fa提交后你已经clone的项目会有权限校验问题,解决方法为下面二选一:</p>\n<ul>\n<li>a.申请Access Token\n在github上 生成access token 后,指令行需要密码的地方就粘贴token。\n参考官网<a href=\"https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled\">帮助链接一</a>和<a href=\"https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/\">帮助链接二</a></li>\n<li>b. 改用ssh\nssh-keygen 然后把pub文件中的内容粘贴到github上</li>\n</ul>\n</li>\n<li>\n<p>注意:一定要保证github的2fa为&quot;enable&quot;状态。当你将2fa设置为&quot;off&quot;时候,将会被对应的apache committer写权限组除名,直到你再次设置成功为止。</p>\n</li>\n</ul>\n<h2>五、其他</h2>\n<h3>The apache way</h3>\n<p>参看<a href=\"http://apache.org/foundation/governance/\">wiki</a></p>\n<p>社区重于代码\n如果没有在社区(邮件列表)讨论过,就当没有发生过</p>\n<h3>小福利</h3>\n<p>Jetbrains给apache提交者一个小福利,就是可以免费使用idea的全产品系列。具体注册地址为:<a href=\"https://www.jetbrains.com/shop/eform/apache?product=ALL\">https://www.jetbrains.com/shop/eform/apache?product=ALL</a></p>\n<h3>相关 wiki</h3>\n<p><a href=\"https://www.apache.org/dev/new-committers-guide.html\">https://www.apache.org/dev/new-committers-guide.html</a></p>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/new-committer-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html b/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html
new file mode 100644
index 00000000..2de1db6e
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html
@@ -0,0 +1,101 @@
+<!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="new-committer-guide_dev" />
+	<meta name="description" content="new-committer-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>new-committer-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Apache提交者注册流程</h1>
+<h2>一、apache提交者的产生</h2>
+<h3>项目孵化初始化提交者</h3>
+<p>项目孵化阶段,在孵化项目提案中,会有初始化提交者列表这一选项。确认你是初始化提交者的一员。项目在apache孵化器社区投票通过后,提交者可以开始准备注册账户了。可以参看<a href="https://wiki.apache.org/incubator/">孵化器wiki</a></p>
+<h3>活跃的贡献者被选举为提交者</h3>
+<p>在后期的开发过程中,活跃的贡献者可以被选举为提交者。见<a href="https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer">如何成为committer</a></p>
+<h2>二、个人开发者提交ICLA</h2>
+<h3>1、选apache id</h3>
+<p>在<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>查看可用的apache id,</p>
+<h3>2、个人提交者授权协议(ICLA):</h3>
+<p>下载<a href="https://www.apache.org/licenses/icla.pdf">ICLA模板</a>,查找可用的id。将icla.pdf个人信息填写正确后打印,签名、扫描、并当做附件发送邮件给秘书 <a href="mailto:secretary@apache.org">secretary@apache.org</a>,秘书会帮忙创建apache 用户id。同时会创建一个your id@apache.org的邮箱,可以在<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>查看查找用户是否已经创建。</p>
+<h3>3、导师帮助提交用户id创建请求</h3>
+<p>导师将帮助提交apache账户创建请求给root邮件组,会有人帮助建立id。一般需要2天时间账户会建立,请等待并在<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>查看查找用户是否已经创建。</p>
+<h2>三、加入apache开发者组</h2>
+<ul>
+<li>1、登入<a href="https://id.apache.org/">Apache账户工具</a>,首次登入可以选忘记密码获得初始化密码,会发送到forward邮箱(在孵化项目提案中提交的开发者邮件)</li>
+<li>2、关于apache邮箱:apache.org邮箱并没有自己的邮件内容存储服务器。他是需要借用其他邮件提供商的邮件内容存储、分发功能。在很多投票环节是建议用apache邮箱的。
+这就就有一个问题,怎么在其他邮箱里面配置好apache.org邮箱转发功能:
+1)收件箱:收取发送到apache.org的邮件。这个在第一步配置好Apache账户工具的forward邮箱就可以用forward邮箱收取邮件了
+2)发件箱:将发出的邮件显示发件邮箱为apache.org邮箱。请参考:<a href="https://reference.apache.org/committer/email">设置apache邮箱指南</a>和<a href="http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html">gmail邮箱设置方式</a>。 其他邮箱服务的设置方式不方便找到,gmail的最方便,建议换成gmail邮箱(不是广告)。</li>
+<li>3、修改编辑页面的homepage url,<a href="http://people.apache.org/committer-index.html">apache提交者列表页</a>中你的账户能加主页链接。</li>
+<li>4、修改编辑页面的github账户,<a href="http://xn--github-h18irjwvs5n80dryepv0gwb7ftho8ua.com/apache-commiiters%E7%BB%84%E3%80%82%E8%BF%99%E6%97%B6%E9%97%B4%E8%AF%B7%E7%9C%8B">会发有邮件邀请你加入github.com/apache-commiiters组。这时间请看</a><a href="http://www.apache.org/foundation/how-it-works.html#developers">ASF工作方式</a>对ASF开发做一些基本了解。</li>
+</ul>
+<h2>四、提交者获得对项目的写权限</h2>
+<p><a href="https://gitbox.apache.org/setup/">GitBox账户链接工具</a>的操作</p>
+<h3>1、Apache账户授权</h3>
+<p>按照提示授权对Apache账户的OAuth协议登入</p>
+<h3>2、Github账户授权</h3>
+<p>按照提示授权对Github账户的OAuth协议登入</p>
+<h3>3、在github.com设置github账户两因素授权(2FA)</h3>
+<p>按照<a href="https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/">授权GitHub 2FA wiki</a>操作如下:</p>
+<ul>
+<li>
+<p>1)、在手机安装 “google身份验证器” app</p>
+</li>
+<li>
+<p>2)、按照<a href="https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/">授权GitHub 2FA wiki</a>一步一步操作。</p>
+<p>在<a href="https://github.com/settings/two_factor_authentication/verify">两因素授权验证(2. Scan this barcode with your app.)</a>界面,不建议选择用手机扫描二维码,因为有些手机会扫描不出来。
+请打开手机 “google身份验证器” app,点“+”选择“输入提供的秘钥”: 在“账户名”input框写入github账户。在“您的秘钥”input框写入:打开的网页中&quot;enter this text code&quot; 链接里面的文本。在app中点击&quot;添加&quot; 后,将为此账户生成6位数字动态。将此6位数字写入网页中的文本框,然后点“Enable”。这样2fa就设置成功了。</p>
+</li>
+<li>
+<p>3)、退出并重新登入Github,输入用户名、密码后会多一步。动态密码的填写,用app的动态密码</p>
+</li>
+<li>
+<p>4)、约需要半个小时,会有邮件通知你已经加入了xx project-committers开发者组。你也可以自己去<a href="https://github.com/orgs/apache/teams">apache teams</a> 页面查看。</p>
+</li>
+<li>
+<p>5)、2fa提交后你已经clone的项目会有权限校验问题,解决方法为下面二选一:</p>
+<ul>
+<li>a.申请Access Token
+在github上 生成access token 后,指令行需要密码的地方就粘贴token。
+参考官网<a href="https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled">帮助链接一</a>和<a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/">帮助链接二</a></li>
+<li>b. 改用ssh
+ssh-keygen 然后把pub文件中的内容粘贴到github上</li>
+</ul>
+</li>
+<li>
+<p>注意:一定要保证github的2fa为&quot;enable&quot;状态。当你将2fa设置为&quot;off&quot;时候,将会被对应的apache committer写权限组除名,直到你再次设置成功为止。</p>
+</li>
+</ul>
+<h2>五、其他</h2>
+<h3>The apache way</h3>
+<p>参看<a href="http://apache.org/foundation/governance/">wiki</a></p>
+<p>社区重于代码
+如果没有在社区(邮件列表)讨论过,就当没有发生过</p>
+<h3>小福利</h3>
+<p>Jetbrains给apache提交者一个小福利,就是可以免费使用idea的全产品系列。具体注册地址为:<a href="https://www.jetbrains.com/shop/eform/apache?product=ALL">https://www.jetbrains.com/shop/eform/apache?product=ALL</a></p>
+<h3>相关 wiki</h3>
+<p><a href="https://www.apache.org/dev/new-committers-guide.html">https://www.apache.org/dev/new-committers-guide.html</a></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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/new-committer-guide_dev.json b/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.json
new file mode 100644
index 00000000..b034cdf3
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-committer-guide_dev.md",
+  "__html": "<h1>Apache提交者注册流程</h1>\n<h2>一、apache提交者的产生</h2>\n<h3>项目孵化初始化提交者</h3>\n<p>项目孵化阶段,在孵化项目提案中,会有初始化提交者列表这一选项。确认你是初始化提交者的一员。项目在apache孵化器社区投票通过后,提交者可以开始准备注册账户了。可以参看<a href=\"https://wiki.apache.org/incubator/\">孵化器wiki</a></p>\n<h3>活跃的贡献者被选举为提交者</h3>\n<p>在后期的开发过程中,活跃的贡献者可以被选举为提交者。见<a href=\"https://www.apache.org/dev/new-committers-guide.html#becoming-a-committer\">如何成为committer</a></p>\n<h2>二、个人开发者提交ICLA</h2>\n<h3>1、选apache id</h3>\n<p>在<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>查看可用的apache id,</p>\n<h3>2、个人提交者授权协议(ICLA):</h3>\n<p>下载<a href=\"https://www.apache.org/licenses/icla.pdf\">ICLA模板</a>,查找可用的id。将icla.pdf个人信息填写正确后打印,签名、扫描、并当做附件发送邮件给秘书 <a href=\"mailto:secretary@apache.org\">secretary@apache.org</a>,秘书会帮忙创建apache 用户id。同时会创建一个your id@apache.org的邮箱,可以在<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>查看查找用户是否已经创建。</p>\n<h3>3、导师帮助提交用户id创建请求</h3>\n<p>导师将帮助提交apache账户创建请求给root邮件组,会有人帮助建立id。一般需要2天时间账户会建立,请等待并在<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>查看查找用户是否已经创建。</p>\n<h2>三、加入apache开发者组</h2>\n<ul>\n<li>1、登入<a href=\"https://id.apache.org/\">Apache账户工具</a>,首次登入可以选忘记密码获得初始化密码,会发送到forward邮箱(在孵化项目提案中提交的开发者邮件)</li>\n<li>2、关于apache邮箱:apache.org邮箱并没有自己的邮件内容存储服务器。他是需要借用其他邮件提供商的邮件内容存储、分发功能。在很多投票环节是建议用apache邮箱的。\n这就就有一个问题,怎么在其他邮箱里面配置好apache.org邮箱转发功能:\n1)收件箱:收取发送到apache.org的邮件。这个在第一步配置好Apache账户工具的forward邮箱就可以用forward邮箱收取邮件了\n2)发件箱:将发出的邮件显示发件邮箱为apache.org邮箱。请参考:<a href=\"https://reference.apache.org/committer/email\">设置apache邮箱指南</a>和<a href=\"http://gmailblog.blogspot.com/2009/07/send-mail-from-another-address-without.html\">gmail邮箱设置方式</a>。 其他邮箱服务的设置方式不方便找到,gmail的最方便,建议换成gmail邮箱(不是广告)。</li>\n<li>3、修改编辑页面的homepage url,<a href=\"http://people.apache.org/committer-index.html\">apache提交者列表页</a>中你的账户能加主页链接。</li>\n<li>4、修改编辑页面的github账户,<a href=\"http://xn--github-h18irjwvs5n80dryepv0gwb7ftho8ua.com/apache-commiiters%E7%BB%84%E3%80%82%E8%BF%99%E6%97%B6%E9%97%B4%E8%AF%B7%E7%9C%8B\">会发有邮件邀请你加入github.com/apache-commiiters组。这时间请看</a><a href=\"http://www.apache.org/foundation/how-it-works.html#developers\">ASF工作方式</a>对ASF开发做一些基本了解。</li>\n</ul>\n<h2>四、提交者获得对项目的写权限</h2>\n<p><a href=\"https://gitbox.apache.org/setup/\">GitBox账户链接工具</a>的操作</p>\n<h3>1、Apache账户授权</h3>\n<p>按照提示授权对Apache账户的OAuth协议登入</p>\n<h3>2、Github账户授权</h3>\n<p>按照提示授权对Github账户的OAuth协议登入</p>\n<h3>3、在github.com设置github账户两因素授权(2FA)</h3>\n<p>按照<a href=\"https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/\">授权GitHub 2FA wiki</a>操作如下:</p>\n<ul>\n<li>\n<p>1)、在手机安装 “google身份验证器” app</p>\n</li>\n<li>\n<p>2)、按照<a href=\"https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/\">授权GitHub 2FA wiki</a>一步一步操作。</p>\n<p>在<a href=\"https://github.com/settings/two_factor_authentication/verify\">两因素授权验证(2. Scan this barcode with your app.)</a>界面,不建议选择用手机扫描二维码,因为有些手机会扫描不出来。\n请打开手机 “google身份验证器” app,点“+”选择“输入提供的秘钥”: 在“账户名”input框写入github账户。在“您的秘钥”input框写入:打开的网页中&quot;enter this text code&quot; 链接里面的文本。在app中点击&quot;添加&quot; 后,将为此账户生成6位数字动态。将此6位数字写入网页中的文本框,然后点“Enable”。这样2fa就设置成功了。</p>\n</li>\n<li>\n<p>3)、退出并重新登入Github,输入用户名、密码后会多一步。动态密码的填写,用app的动态密码</p>\n</li>\n<li>\n<p>4)、约需要半个小时,会有邮件通知你已经加入了xx project-committers开发者组。你也可以自己去<a href=\"https://github.com/orgs/apache/teams\">apache teams</a> 页面查看。</p>\n</li>\n<li>\n<p>5)、2fa提交后你已经clone的项目会有权限校验问题,解决方法为下面二选一:</p>\n<ul>\n<li>a.申请Access Token\n在github上 生成access token 后,指令行需要密码的地方就粘贴token。\n参考官网<a href=\"https://help.github.com/articles/https-cloning-errors/#provide-access-token-if-2fa-enabled\">帮助链接一</a>和<a href=\"https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/\">帮助链接二</a></li>\n<li>b. 改用ssh\nssh-keygen 然后把pub文件中的内容粘贴到github上</li>\n</ul>\n</li>\n<li>\n<p>注意:一定要保证github的2fa为&quot;enable&quot;状态。当你将2fa设置为&quot;off&quot;时候,将会被对应的apache committer写权限组除名,直到你再次设置成功为止。</p>\n</li>\n</ul>\n<h2>五、其他</h2>\n<h3>The apache way</h3>\n<p>参看<a href=\"http://apache.org/foundation/governance/\">wiki</a></p>\n<p>社区重于代码\n如果没有在社区(邮件列表)讨论过,就当没有发生过</p>\n<h3>小福利</h3>\n<p>Jetbrains给apache提交者一个小福利,就是可以免费使用idea的全产品系列。具体注册地址为:<a href=\"https://www.jetbrains.com/shop/eform/apache?product=ALL\">https://www.jetbrains.com/shop/eform/apache?product=ALL</a></p>\n<h3>相关 wiki</h3>\n<p><a href=\"https://www.apache.org/dev/new-committers-guide.html\">https://www.apache.org/dev/new-committers-guide.html</a></p>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/website-guide.html b/zh-cn/docs/developers/committer-guide/website-guide.html
new file mode 100644
index 00000000..8c74286b
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/website-guide.html
@@ -0,0 +1,33 @@
+<!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="website-guide" />
+	<meta name="description" content="website-guide" />
+	<!-- 网页标签标题 -->
+	<title>website-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>网站向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/website-guide.json b/zh-cn/docs/developers/committer-guide/website-guide.json
new file mode 100644
index 00000000..96786a18
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/website-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "website-guide.md",
+  "__html": "<h1>网站向导</h1>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/website-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/website-guide_dev.html b/zh-cn/docs/developers/committer-guide/website-guide_dev.html
new file mode 100644
index 00000000..ebe3057b
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/website-guide_dev.html
@@ -0,0 +1,33 @@
+<!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="website-guide_dev" />
+	<meta name="description" content="website-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>website-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>网站向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/committer-guide/website-guide_dev.json b/zh-cn/docs/developers/committer-guide/website-guide_dev.json
new file mode 100644
index 00000000..e8ee2664
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/website-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "website-guide_dev.md",
+  "__html": "<h1>网站向导</h1>\n",
+  "link": "/zh-cn/docs/developers/committer-guide/website-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/cla-signing-guide.html b/zh-cn/docs/developers/contributor-guide/cla-signing-guide.html
new file mode 100644
index 00000000..b38becbb
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/cla-signing-guide.html
@@ -0,0 +1,33 @@
+<!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="cla-signing-guide" />
+	<meta name="description" content="cla-signing-guide" />
+	<!-- 网页标签标题 -->
+	<title>cla-signing-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>CLA签署向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/cla-signing-guide.json b/zh-cn/docs/developers/contributor-guide/cla-signing-guide.json
new file mode 100644
index 00000000..ae2e181d
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/cla-signing-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "cla-signing-guide.md",
+  "__html": "<h1>CLA签署向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/cla-signing-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html b/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html
new file mode 100644
index 00000000..32c3eab8
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html
@@ -0,0 +1,33 @@
+<!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="cla-signing-guide_dev" />
+	<meta name="description" content="cla-signing-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>cla-signing-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>CLA签署向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/cla-signing-guide_dev.json b/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.json
new file mode 100644
index 00000000..137d490c
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "cla-signing-guide_dev.md",
+  "__html": "<h1>CLA签署向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide.html b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide.html
new file mode 100644
index 00000000..7ca8ed8d
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide.html
@@ -0,0 +1,33 @@
+<!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-extension-guide" />
+	<meta name="description" content="dubbo-extension-guide" />
+	<!-- 网页标签标题 -->
+	<title>dubbo-extension-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Dubbo Extension向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/dubbo-extension-guide.json b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide.json
new file mode 100644
index 00000000..18f3e757
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-extension-guide.md",
+  "__html": "<h1>Dubbo Extension向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html
new file mode 100644
index 00000000..83639a79
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html
@@ -0,0 +1,33 @@
+<!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-extension-guide_dev" />
+	<meta name="description" content="dubbo-extension-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>dubbo-extension-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>Dubbo Extension向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/dubbo-extension-guide_dev.json b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.json
new file mode 100644
index 00000000..ae380a9e
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-extension-guide_dev.md",
+  "__html": "<h1>Dubbo Extension向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide.html b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide.html
new file mode 100644
index 00000000..072378e5
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide.html
@@ -0,0 +1,33 @@
+<!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="mailing-list-subscription-guide" />
+	<meta name="description" content="mailing-list-subscription-guide" />
+	<!-- 网页标签标题 -->
+	<title>mailing-list-subscription-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>邮件列表订阅向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/mailing-list-subscription-guide.json b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide.json
new file mode 100644
index 00000000..baad4303
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "mailing-list-subscription-guide.md",
+  "__html": "<h1>邮件列表订阅向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html
new file mode 100644
index 00000000..421f19b3
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html
@@ -0,0 +1,33 @@
+<!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="mailing-list-subscription-guide_dev" />
+	<meta name="description" content="mailing-list-subscription-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>mailing-list-subscription-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>邮件列表订阅向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json
new file mode 100644
index 00000000..64c3ab62
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "mailing-list-subscription-guide_dev.md",
+  "__html": "<h1>邮件列表订阅向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/new-contributor-guide.html b/zh-cn/docs/developers/contributor-guide/new-contributor-guide.html
new file mode 100644
index 00000000..6a9d7f16
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/new-contributor-guide.html
@@ -0,0 +1,33 @@
+<!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="new-contributor-guide" />
+	<meta name="description" content="new-contributor-guide" />
+	<!-- 网页标签标题 -->
+	<title>new-contributor-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>新提交者向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/new-contributor-guide.json b/zh-cn/docs/developers/contributor-guide/new-contributor-guide.json
new file mode 100644
index 00000000..aa480426
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/new-contributor-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-contributor-guide.md",
+  "__html": "<h1>新提交者向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/new-contributor-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html b/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html
new file mode 100644
index 00000000..268ab0b4
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html
@@ -0,0 +1,33 @@
+<!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="new-contributor-guide_dev" />
+	<meta name="description" content="new-contributor-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>new-contributor-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>新贡献者向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/new-contributor-guide_dev.json b/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.json
new file mode 100644
index 00000000..4a967ccf
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "new-contributor-guide_dev.md",
+  "__html": "<h1>新贡献者向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/software-donation-guide.html b/zh-cn/docs/developers/contributor-guide/software-donation-guide.html
new file mode 100644
index 00000000..d61723f4
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/software-donation-guide.html
@@ -0,0 +1,33 @@
+<!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="software-donation-guide" />
+	<meta name="description" content="software-donation-guide" />
+	<!-- 网页标签标题 -->
+	<title>software-donation-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>软件捐献向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/software-donation-guide.json b/zh-cn/docs/developers/contributor-guide/software-donation-guide.json
new file mode 100644
index 00000000..f125b40d
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/software-donation-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "software-donation-guide.md",
+  "__html": "<h1>软件捐献向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/software-donation-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html b/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html
new file mode 100644
index 00000000..bc40aeba
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html
@@ -0,0 +1,33 @@
+<!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="software-donation-guide_dev" />
+	<meta name="description" content="software-donation-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>software-donation-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>软件捐献向导</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/software-donation-guide_dev.json b/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.json
new file mode 100644
index 00000000..fec366b3
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "software-donation-guide_dev.md",
+  "__html": "<h1>软件捐献向导</h1>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/test-coverage-guide.html b/zh-cn/docs/developers/contributor-guide/test-coverage-guide.html
new file mode 100644
index 00000000..d4d5a9f6
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/test-coverage-guide.html
@@ -0,0 +1,53 @@
+<!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="test-coverage-guide" />
+	<meta name="description" content="test-coverage-guide" />
+	<!-- 网页标签标题 -->
+	<title>test-coverage-guide</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>测试覆盖率向导</h1>
+<h3>1.写单元测试的收益</h3>
+<ul>
+<li>单元测试能帮助每个人深入代码细节,了解代码的功能。</li>
+<li>通过测试用例我们能发现bug,并提交代码的健壮性。</li>
+<li>测试用例同时也是代码的demo用法。</li>
+</ul>
+<h3>2.单元测试用例的一些设计原则</h3>
+<ul>
+<li>应该精心设计好步骤,颗粒度和组合条件。</li>
+<li>注意边界条件。</li>
+<li>单元测试也应该好好设计,不要写无用的代码。</li>
+<li>当你发现一个<code>方法</code>很难写单元测试时,如果可以确认这个<code>方法</code>是<code>臭代码</code>,那么就和开发者一起重构它。</li>
+<li>Dubbo中用的mock框架是: <a href="http://site.mockito.org/">mockito</a>. 下面是一些开发向导:<a href="http://www.baeldung.com/bdd-mockito">mockito tutorial</a>,<a href="https://dzone.com/refcardz/mockito">mockito refcard</a></li>
+<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>
+</ul>
+<h3>3.测试覆盖率设定值</h3>
+<ul>
+<li>在现阶段,Delta更改代码的测试覆盖设定值为:&gt;=60%,越高越好。</li>
+<li>我们可以在这个页面中看到测试报告: <a href="https://codecov.io/gh/apache/incubator-dubbo">https://codecov.io/gh/apache/incubator-dubbo</a></li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/test-coverage-guide.json b/zh-cn/docs/developers/contributor-guide/test-coverage-guide.json
new file mode 100644
index 00000000..c6628c77
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/test-coverage-guide.json
@@ -0,0 +1,6 @@
+{
+  "filename": "test-coverage-guide.md",
+  "__html": "<h1>测试覆盖率向导</h1>\n<h3>1.写单元测试的收益</h3>\n<ul>\n<li>单元测试能帮助每个人深入代码细节,了解代码的功能。</li>\n<li>通过测试用例我们能发现bug,并提交代码的健壮性。</li>\n<li>测试用例同时也是代码的demo用法。</li>\n</ul>\n<h3>2.单元测试用例的一些设计原则</h3>\n<ul>\n<li>应该精心设计好步骤,颗粒度和组合条件。</li>\n<li>注意边界条件。</li>\n<li>单元测试也应该好好设计,不要写无用的代码。</li>\n<li>当你发现一个<code>方法</code>很难写单元测试时,如果可以确认这个<code>方法</code>是<code>臭代码</code>,那么就和开发者一起重构它。</li>\n<li>Dubbo中用的mock框架是: <a href=\"http://site.mockito.org/\">mockito</a>. 下面是一些开发向导:<a href=\"http://www.baeldung.com/bdd-mockito\">mockito tutorial</a>,<a href=\"https://dzone.com/refcardz/mockito\">mockito refcard</a></li>\n<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>\n</ul>\n<h3>3.测试覆盖率设定值</h3>\n<ul>\n<li>在现阶段,Delta更改代码的测试覆盖设定值为:&gt;=60%,越高越好。</li>\n<li>我们可以在这个页面中看到测试报告: <a href=\"https://codecov.io/gh/apache/incubator-dubbo\">https://codecov.io/gh/apache/incubator-dubbo</a></li>\n</ul>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/test-coverage-guide.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html b/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html
new file mode 100644
index 00000000..1ebfc3be
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html
@@ -0,0 +1,53 @@
+<!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="test-coverage-guide_dev" />
+	<meta name="description" content="test-coverage-guide_dev" />
+	<!-- 网页标签标题 -->
+	<title>test-coverage-guide_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>测试覆盖率向导</h1>
+<h3>1.写单元测试的收益</h3>
+<ul>
+<li>单元测试能帮助每个人深入代码细节,了解代码的功能。</li>
+<li>通过测试用例我们能发现bug,并提交代码的健壮性。</li>
+<li>测试用例同时也是代码的demo用法。</li>
+</ul>
+<h3>2.单元测试用例的一些设计原则</h3>
+<ul>
+<li>应该精心设计好步骤,颗粒度和组合条件。</li>
+<li>注意边界条件。</li>
+<li>单元测试也应该好好设计,不要写无用的代码。</li>
+<li>当你发现一个<code>方法</code>很难写单元测试时,如果可以确认这个<code>方法</code>是<code>臭代码</code>,那么就和开发者一起重构它。</li>
+<li>Dubbo中用的mock框架是: <a href="http://site.mockito.org/">mockito</a>. 下面是一些开发向导:<a href="http://www.baeldung.com/bdd-mockito">mockito tutorial</a>,<a href="https://dzone.com/refcardz/mockito">mockito refcard</a></li>
+<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>
+</ul>
+<h3>3.测试覆盖率设定值</h3>
+<ul>
+<li>在现阶段,Delta更改代码的测试覆盖设定值为:&gt;=60%,越高越好。</li>
+<li>我们可以在这个页面中看到测试报告: <a href="https://codecov.io/gh/apache/incubator-dubbo">https://codecov.io/gh/apache/incubator-dubbo</a></li>
+</ul>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/contributor-guide/test-coverage-guide_dev.json b/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.json
new file mode 100644
index 00000000..a1ebe8c8
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "test-coverage-guide_dev.md",
+  "__html": "<h1>测试覆盖率向导</h1>\n<h3>1.写单元测试的收益</h3>\n<ul>\n<li>单元测试能帮助每个人深入代码细节,了解代码的功能。</li>\n<li>通过测试用例我们能发现bug,并提交代码的健壮性。</li>\n<li>测试用例同时也是代码的demo用法。</li>\n</ul>\n<h3>2.单元测试用例的一些设计原则</h3>\n<ul>\n<li>应该精心设计好步骤,颗粒度和组合条件。</li>\n<li>注意边界条件。</li>\n<li>单元测试也应该好好设计,不要写无用的代码。</li>\n<li>当你发现一个<code>方法</code>很难写单元测试时,如果可以确认这个<code>方法</code>是<code>臭代码</code>,那么就和开发者一起重构它。</li>\n<li>Dubbo中用的mock框架是: <a href=\"http://site.mockito.org/\">mockito</a>. 下面是一些开发向导:<a href=\"http://www.baeldung.com/bdd-mockito\">mockito tutorial</a>,<a href=\"https://dzone.com/refcardz/mockito\">mockito refcard</a></li>\n<li>TDD(optional):When you start a new issue, you can try to write test case at first</li>\n</ul>\n<h3>3.测试覆盖率设定值</h3>\n<ul>\n<li>在现阶段,Delta更改代码的测试覆盖设定值为:&gt;=60%,越高越好。</li>\n<li>我们可以在这个页面中看到测试报告: <a href=\"https://codecov.io/gh/apache/incubator-dubbo\">https://codecov.io/gh/apache/incubator-dubbo</a></li>\n</ul>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/developers_dev.json b/zh-cn/docs/developers/developers_dev.json
index db0b1832..8e049dc0 100644
--- a/zh-cn/docs/developers/developers_dev.json
+++ b/zh-cn/docs/developers/developers_dev.json
@@ -1,4 +1,6 @@
 {
   "filename": "developers_dev.md",
-  "__html": "<h2>开发人员</h2>\n<p>本页面展示了Dubbo的开发团队。请通过提交PR的方式把自己的信息添加到列表上。注:排名不分先后</p>\n<h3>提交者</h3>\n<table>\n<thead>\n<tr>\n<th>Apache ID</th>\n<th>姓名</th>\n<th>组织</th>\n<th>角色</th>\n<th>时区</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>jmclean</td>\n<td>Justin Mclean</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+11</td>\n</tr>\n<tr>\n<td>markt</td>\n<td>Mark Thomas</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+0</td>\n</tr>\n<tr>\n<td>wave</td>\n<td>Dave Fisher</td>\n<td></td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>johndament</td>\n<td>John D. Ament</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>jfclere</td>\n<td>Jean-Frederic Clere</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>huxing</td>\n<td>Huxing Zhang</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>vongosling</td>\n<td>Von Gosling</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>leonleeldc</td>\n<td>Dingcheng Li</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>iluo</td>\n<td>Ian Luo</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujun</td>\n<td>Jun Liu</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>zhangliang</td>\n<td>Liang Zhang</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujieqin</td>\n<td>Liujie Qin</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mercyblitz</td>\n<td>Mercy Ma</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>wangxin</td>\n<td>Xin Wang</td>\n<td>Weidian</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yuyijq</td>\n<td>Zhaohui Yu</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yiji</td>\n<td>Shang Zonghai</td>\n<td>Youzan</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>hyunkun</td>\n<td>YunKun Huang</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>jerrick</td>\n<td>Yong Zhu</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>kimmking</td>\n<td>Kimm King</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>carryxyh</td>\n<td>Yuhang Xiu</td>\n<td>Netease</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>min</td>\n<td>Minxuan Zhuang</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mjk</td>\n<td>Jinkai Ma</td>\n<td>Handuyishe</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n<h3>贡献者</h3>\n<table>\n<thead>\n<tr>\n<th>Github ID</th>\n<th>Github URL</th>\n<th>组织</th>\n<th>时区</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>leyou240</td>\n<td><a href=\"https://github.com/leyou240\">https://github.com/leyou240</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>chenzhiguo</td>\n<td><a href=\"https://github.com/chenzhiguo\">https://github.com/chenzhiguo</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>biyuhao</td>\n<td><a href=\"https://github.com/biyuhao\">https://github.com/biyuhao</a></td>\n<td>Asiainfo-sec</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<h2>开发人员</h2>\n<p>本页面展示了Dubbo的开发团队。请通过提交PR的方式把自己的信息添加到列表上。注:排名不分先后</p>\n<h3>提交者</h3>\n<table>\n<thead>\n<tr>\n<th>Apache ID</th>\n<th>姓名</th>\n<th>组织</th>\n<th>角色</th>\n<th>时区</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>jmclean</td>\n<td>Justin Mclean</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+11</td>\n</tr>\n<tr>\n<td>markt</td>\n<td>Mark Thomas</td>\n<td>Apache</td>\n<td>Mentor</td>\n<td>+0</td>\n</tr>\n<tr>\n<td>wave</td>\n<td>Dave Fisher</td>\n<td></td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>johndament</td>\n<td>John D. Ament</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>jfclere</td>\n<td>Jean-Frederic Clere</td>\n<td>retired</td>\n<td>Mentor</td>\n<td></td>\n</tr>\n<tr>\n<td>huxing</td>\n<td>Huxing Zhang</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>vongosling</td>\n<td>Von Gosling</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>leonleeldc</td>\n<td>Dingcheng Li</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>iluo</td>\n<td>Ian Luo</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujun</td>\n<td>Jun Liu</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>zhangliang</td>\n<td>Liang Zhang</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>liujieqin</td>\n<td>Liujie Qin</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mercyblitz</td>\n<td>Mercy Ma</td>\n<td>Alibaba</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>wangxin</td>\n<td>Xin Wang</td>\n<td>Weidian</td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yuyijq</td>\n<td>Zhaohui Yu</td>\n<td></td>\n<td>PPMC</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>yiji</td>\n<td>Shang Zonghai</td>\n<td>Youzan</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>hyunkun</td>\n<td>YunKun Huang</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>jerrick</td>\n<td>Yong Zhu</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>kimmking</td>\n<td>Kimm King</td>\n<td></td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>carryxyh</td>\n<td>Yuhang Xiu</td>\n<td>Netease</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>min</td>\n<td>Minxuan Zhuang</td>\n<td>Alibaba</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n<tr>\n<td>mjk</td>\n<td>Jinkai Ma</td>\n<td>Handuyishe</td>\n<td>Committer</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n<h3>贡献者</h3>\n<table>\n<thead>\n<tr>\n<th>Github ID</th>\n<th>Github URL</th>\n<th>组织</th>\n<th>时区</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>leyou240</td>\n<td><a href=\"https://github.com/leyou240\">https://github.com/leyou240</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>chenzhiguo</td>\n<td><a href=\"https://github.com/chenzhiguo\">https://github.com/chenzhiguo</a></td>\n<td></td>\n<td>+8</td>\n</tr>\n<tr>\n<td>biyuhao</td>\n<td><a href=\"https://github.com/biyuhao\">https://github.com/biyuhao</a></td>\n<td>Asiainfo-sec</td>\n<td>+8</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/zh-cn/docs/developers/developers_dev.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/developers/guide_dev.json b/zh-cn/docs/developers/guide_dev.json
index 89177a08..7139c653 100644
--- a/zh-cn/docs/developers/guide_dev.json
+++ b/zh-cn/docs/developers/guide_dev.json
@@ -1,4 +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-subscription-guide\">指南</a>。</p>\n<ul>\n<li><a href=\"mailto:dev-subscribe@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>: 开发邮件列表,如果您在使用或开发Dubbo时遇到任何问题,您可以在此提出问题。</li>\n<li><a href=\"mailto:commits-subscribe@dubbo.incubator.apache.org\">commits@dubbo.incubator.apache.org</a>: 所有提交将被发送到这个邮件列表。如果您对Dubbo的发展感兴趣,您可以订阅它。</li>\n<li><a href=\"mailto:notification-subscribe@dubbo.incubator.apache.org\">notification@dubbo.incubator.apache.org</a>: 所有Github  <a href=\"https://github.com/apache/incubator-dubbo/issues\">issue</a>和<a href=\"https://github.com/apache/incubator-dubbo/pulls\">pull request</a>的更新都会被发送到这个邮件列表。</li>\n</ul>\n<h3>报告问题</h3>\n<p>在报告任何问题时请遵循<a href=\"https://github.com/apache/incubator-dubbo/issues/new?template=dubbo-issue-report-template.md\">模版</a>。</p>\n<h3>代码约定</h3>\n<p>我们的代码风格几乎和标准Java约定一致(流行IDE的默认设置满足这一点),主要有以下附加限制:</p>\n<ul>\n<li>\n<p>如果当前行中有超过120个字符,则起一个新的行。</p>\n</li>\n<li>\n<p>确保所有新的.java文件都有一个简单的JavaDoc类注释,其中至少有一个标识创建日期的标签,最好至少有一个关于该类的解释说明。</p>\n</li>\n<li>\n<p>将ASF许可注释添加到所有新的.java文件(从项目中的现有文件复制)</p>\n</li>\n<li>\n<p>请确保没有将@author标记添加到您所贡献的文件中,因为Apache不使用@author标记,其他方式(如cvs)将公平地记录所有您的贡献。</p>\n</li>\n<li>\n<p>为代码添加一些JavaDoc,如果您更改命名空间,则需要一些XSD DOC元素。</p>\n</li>\n<li>\n<p>对于新的特征或重要的修复程序,应该添加单元测试。</p>\n</li>\n<li>\n<p>如果没有其他人使用您的分支,请将它与master(或主项目中的其他目标分支)同步。</p>\n</li>\n<li>\n<p>当编写提交消息时,请遵循这些约定,如果您正在修复一个现有问题,请在提交消息的末尾添加Fixes XXX(其中XXX是问题编号)。</p>\n</li>\n</ul>\n<h3>贡献流程</h3>\n<p>这是一个贡献者工作流程的大致说明:</p>\n<ul>\n<li>克隆当前项目</li>\n<li>从希望贡献的分支上创新新的分支,通常是master分支。</li>\n<li>提交您的更改。</li>\n<li>确保提交消息的格式正确。</li>\n<li>将新分支推送到您克隆的代码库中。</li>\n<li>执行检查表 <a href=\"https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md\">pull request模版</a>。</li>\n<li>在提交pull requsest请求前, 请将您克隆的代码和远程代码库同步,这样您的pull request会简单清晰。具体操作如下:</li>\n</ul>\n<pre><code>git remote add upstream git@github.com:apache/incubator-dubbo.git\ngit fetch upstream\ngit rebase upstream/master\ngit checkout -b your_awesome_patch\n... add some work\ngit push origin your_awesome_patch\n</code></pre>\n<ul>\n<li>提交pull request请求到apache/incubator-dubbo并等待回复。</li>\n</ul>\n<p>谢谢您的贡献!</p>\n<h3>代码风格</h3>\n<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>\n<p>如果使用Eclipse,可以通过参考该文件手动配置。</p>\n"
+  "__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-subscription-guide\">指南</a>。</p>\n<ul>\n<li><a href=\"mailto:dev-subscribe@dubbo.incubator.apache.org\">dev@dubbo.incubator.apache.org</a>: 开发邮件列表,如果您在使用或开发Dubbo时遇到任何问题,您可以在此提出问题。</li>\n<li><a href=\"mailto:commits-subscribe@dubbo.incubator.apache.org\">commits@dubbo.incubator.apache.org</a>: 所有提交将被发送到这个邮件列表。如果您对Dubbo的发展感兴趣,您可以订阅它。</li>\n<li><a href=\"mailto:notification-subscribe@dubbo.incubator.apache.org\">notification@dubbo.incubator.apache.org</a>: 所有Github  <a href=\"https://github.com/apache/incubator-dubbo/issues\">issue</a>和<a href=\"https://github.com/apache/incubator-dubbo/pulls\">pull request</a>的更新都会被发送到这个邮件列表。</li>\n</ul>\n<h3>报告问题</h3>\n<p>在报告任何问题时请遵循<a href=\"https://github.com/apache/incubator-dubbo/issues/new?template=dubbo-issue-report-template.md\">模版</a>。</p>\n<h3>代码约定</h3>\n<p>我们的代码风格几乎和标准Java约定一致(流行IDE的默认设置满足这一点),主要有以下附加限制:</p>\n<ul>\n<li>\n<p>如果当前行中有超过120个字符,则起一个新的行。</p>\n</li>\n<li>\n<p>确保所有新的.java文件都有一个简单的JavaDoc类注释,其中至少有一个标识创建日期的标签,最好至少有一个关于该类的解释说明。</p>\n</li>\n<li>\n<p>将ASF许可注释添加到所有新的.java文件(从项目中的现有文件复制)</p>\n</li>\n<li>\n<p>请确保没有将@author标记添加到您所贡献的文件中,因为Apache不使用@author标记,其他方式(如cvs)将公平地记录所有您的贡献。</p>\n</li>\n<li>\n<p>为代码添加一些JavaDoc,如果您更改命名空间,则需要一些XSD DOC元素。</p>\n</li>\n<li>\n<p>对于新的特征或重要的修复程序,应该添加单元测试。</p>\n</li>\n<li>\n<p>如果没有其他人使用您的分支,请将它与master(或主项目中的其他目标分支)同步。</p>\n</li>\n<li>\n<p>当编写提交消息时,请遵循这些约定,如果您正在修复一个现有问题,请在提交消息的末尾添加Fixes XXX(其中XXX是问题编号)。</p>\n</li>\n</ul>\n<h3>贡献流程</h3>\n<p>这是一个贡献者工作流程的大致说明:</p>\n<ul>\n<li>克隆当前项目</li>\n<li>从希望贡献的分支上创新新的分支,通常是master分支。</li>\n<li>提交您的更改。</li>\n<li>确保提交消息的格式正确。</li>\n<li>将新分支推送到您克隆的代码库中。</li>\n<li>执行检查表 <a href=\"https://github.com/apache/incubator-dubbo/blob/master/PULL_REQUEST_TEMPLATE.md\">pull request模版</a>。</li>\n<li>在提交pull requsest请求前, 请将您克隆的代码和远程代码库同步,这样您的pull request会简单清晰。具体操作如下:</li>\n</ul>\n<pre><code>git remote add upstream git@github.com:apache/incubator-dubbo.git\ngit fetch upstream\ngit rebase upstream/master\ngit checkout -b your_awesome_patch\n... add some work\ngit push origin your_awesome_patch\n</code></pre>\n<ul>\n<li>提交pull request请求到apache/incubator-dubbo并等待回复。</li>\n</ul>\n<p>谢谢您的贡献!</p>\n<h3>代码风格</h3>\n<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>\n<p>如果使用Eclipse,可以通过参考该文件手动配置。</p>\n",
+  "link": "/zh-cn/docs/developers/guide_dev.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/developers/user-guide/faq.html b/zh-cn/docs/developers/user-guide/faq.html
new file mode 100644
index 00000000..d636c0e8
--- /dev/null
+++ b/zh-cn/docs/developers/user-guide/faq.html
@@ -0,0 +1,33 @@
+<!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="faq" />
+	<meta name="description" content="faq" />
+	<!-- 网页标签标题 -->
+	<title>faq</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>FAQ</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/user-guide/faq.json b/zh-cn/docs/developers/user-guide/faq.json
new file mode 100644
index 00000000..897c414c
--- /dev/null
+++ b/zh-cn/docs/developers/user-guide/faq.json
@@ -0,0 +1,6 @@
+{
+  "filename": "faq.md",
+  "__html": "<h1>FAQ</h1>\n",
+  "link": "/zh-cn/docs/developers/user-guide/faq.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/user-guide/faq_dev.html b/zh-cn/docs/developers/user-guide/faq_dev.html
new file mode 100644
index 00000000..d8762388
--- /dev/null
+++ b/zh-cn/docs/developers/user-guide/faq_dev.html
@@ -0,0 +1,33 @@
+<!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="faq_dev" />
+	<meta name="description" content="faq_dev" />
+	<!-- 网页标签标题 -->
+	<title>faq_dev</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 href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/docs/user/quick-start.html">文档</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/developers/developers_dev.html">开发者</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/blog/download.html">下载</a></li></ul></div></div></header><div class="bar"><div class="bar-body"><img src="/img/docs.png" class="front-img"/><span>文档</span><img src="/img/docs.png" class="back-img"/></div></div><section class="content-section"><div class="sidemenu"><div class="sidemenu-toggle"><img src="https://img.alicdn.com/tfs/TB1E6apXHGYBuNjy0FoXXciBFXa-200-200.png"/></div><ul><li class="menu-item menu-item-level-1"><span>用户文档</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>入门<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/background.html" target="_self">背景</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/requirements.html" target="_self">需求</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/architecture.html" target="_self">架构</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/preface/usage.html" target="_self">用法</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速启动</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/dependencies.html" target="_self">依赖</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/maturity.html" target="_self">成熟度</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>配置<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/xml.html" target="_self">XML配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/properties.html" target="_self">属性配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/api.html" target="_self">API配置</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/configuration/annotation.html" target="_self">注解配置</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>示例<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/preflight-check.html" target="_self">启动时检查</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/fault-tolerent-strategy.html" target="_self">集群容错</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/loadbalance.html" target="_self">负载均衡</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/thread-model.html" target="_self">线程模型</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/explicit-target.html" target="_self">直连提供者</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/subscribe-only.html" target="_self">只订阅</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/registry-only.html" target="_self">只注册</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/static-service.html" target="_self">静态服务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-protocols.html" target="_self">多协议</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-registry.html" target="_self">多注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-group.html" target="_self">服务分组</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/multi-versions.html" target="_self">多版本</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/group-merger.html" target="_self">分组聚合</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/parameter-validation.html" target="_self">参数验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/result-cache.html" target="_self">结果缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-reference.html" target="_self">泛化引用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/generic-service.html" target="_self">泛化实现</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/echo-service.html" target="_self">回声测试</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/context.html" target="_self">上下文信息</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/attachment.html" target="_self">隐式参数</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/async-call.html" target="_self">异步调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-call.html" target="_self">本地调用</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/callback-parameter.html" target="_self">参数回调</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/events-notify.html" target="_self">事件通知</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-stub.html" target="_self">本地存根</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/local-mock.html" target="_self">本地伪装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/delay-publish.html" target="_self">延迟暴露</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/concurrency-control.html" target="_self">并发控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-connections.html" target="_self">连接控制</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/lazy-connect.html" target="_self">延迟连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/stickiness.html" target="_self">粘滞连接</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/token-authorization.html" target="_self">令牌验证</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/routing-rule.html" target="_self">路由规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/config-rule.html" target="_self">配置规则</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-downgrade.html" target="_self">服务降级</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/graceful-shutdown.html" target="_self">优雅停机</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/hostname-binding.html" target="_self">主机绑定</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/logger-strategy.html" target="_self">日志适配</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/accesslog.html" target="_self">访问日志</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/service-container.html" target="_self">服务容器</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/reference-config-cache.html" target="_self">Reference Config 缓存</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/distributed-transaction.html" target="_self">分布式事务</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/dump.html" target="_self">线程栈自动dump</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/netty4.html" target="_self">Netty4</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/demos/serialization.html" target="_self">Kryo和FST序列化</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/api.html" target="_self">API配置参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>schema配置参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-service.html" target="_self">dubbo:service</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-reference.html" target="_self">dubbo:reference</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-protocol.html" target="_self">dubbo:protocol</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-registry.html" target="_self">dubbo:registry</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-monitor.html" target="_self">dubbo:monitor</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-application.html" target="_self">dubbo:application</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-module.html" target="_self">dubbo:module</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-provider.html" target="_self">dubbo:provider</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-consumer.html" target="_self">dubbo:consumer</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-method.html" target="_self">dubbo:method</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-argument.html" target="_self">dubbo:argument</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/xml/dubbo-parameter.html" target="_self">dubbo:parameter</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>协议参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/dubbo.html" target="_self">dubbo://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rmi.html" target="_self">rmi://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/hessian.html" target="_self">hessian://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/http.html" target="_self">http://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/webservice.html" target="_self">webservice://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/thrift.html" target="_self">thrift://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/memcached.html" target="_self">memcached://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/redis.html" target="_self">redis://</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/protocol/rest.html" target="_self">rest://</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>注册中心参考手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/introduction.html" target="_self">介绍</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/multicast.html" target="_self">Multicast 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/zookeeper.html" target="_self">Zookeeper 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/redis.html" target="_self">Redis 注册中心</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/user/references/registry/simple.html" target="_self">Simple 注册中心</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/telnet.html" target="_self">telnet命令参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/qos.html" target="_self">在线运维命令-QOS</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/references/maven.html" target="_self">maven插件参考手册</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/best-practice.html" target="_self">服务化最佳实践</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/recommend.html" target="_self">推荐用法</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/capacity-plan.html" target="_self">容量规划</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/perf-test.html" target="_self">性能测试报告</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/user/coveragence.html" target="_self">测试覆盖率报告</a></li></ul></li><li class="menu-item menu-item-level-1"><span>开发者指南</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/build.html" target="_self">源码构建</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/design.html" target="_self">框架设计</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/SPI.html" target="_self">扩展点加载</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/implementation.html" target="_self">实现细节</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>SPI 扩展实现<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/protocol.html" target="_self">协议扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/filter.html" target="_self">调用拦截扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/invoker-listener.html" target="_self">引用监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exporter-listener.html" target="_self">暴露监听扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cluster.html" target="_self">集群扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/router.html" target="_self">路由扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/load-balance.html" target="_self">负载均衡扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/merger.html" target="_self">合并结果扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/registry.html" target="_self">注册中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/monitor.html" target="_self">监控中心扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/extension-factory.html" target="_self">扩展点加载扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/proxy-factory.html" target="_self">动态代理扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/compiler.html" target="_self">编译器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/dispatcher.html" target="_self">消息派发扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/threadpool.html" target="_self">线程池扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/serialize.html" target="_self">序列化扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/remoting.html" target="_self">网络传输扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/exchanger.html" target="_self">信息交换扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/networker.html" target="_self">组网扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/telnet-handler.html" target="_self">Telnet 命令扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/status-checker.html" target="_self">状态检查扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/container.html" target="_self">容器扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/page.html" target="_self">页面扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/cache.html" target="_self">缓存扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/validation.html" target="_self">验证扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/impls/logger-adapter.html" target="_self">日志适配扩展</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contract.html" target="_self">公共契约</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/coding.html" target="_self">编码约定</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>设计原则<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/code-detail.html" target="_self">魔鬼在细节</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/general-knowledge.html" target="_self">一些设计上的基本常识</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/expansibility.html" target="_self">谈谈扩充式扩展与增量式扩展</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/configuration.html" target="_self">配置设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/robustness.html" target="_self">设计实现的健壮性</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/dummy.html" target="_self">防痴呆设计</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/dev/principals/extension.html" target="_self">扩展点重构</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/release.html" target="_self">版本管理</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/contribution.html" target="_self">贡献</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/checklist.html" target="_self">检查列表</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/code-smell.html" target="_self">坏味道</a></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><a href="/zh-cn/docs/dev/TCK.html" target="_self">技术兼容性测试</a></li></ul></li><li class="menu-item menu-item-level-1"><span>运维管理</span><ul><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>安装手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/provider-demo.html" target="_self">示例提供者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/consumer-demo.html" target="_self">示例消费者安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/zookeeper.html" target="_self">Zookeeper 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/redis.html" target="_self">Redis 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-registry-center.html" target="_self">Simple 注册中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/simple-monitor-center.html" target="_self">Simple 监控中心安装</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/install/admin-console.html" target="_self">管理控制台安装</a></li></ul></li><li style="height:36px;overflow:hidden" class="menu-item menu-item-level-2"><span>运维手册<img style="transform:rotate(-90deg)" class="menu-toggle" src="/img/arrow_down.png"/></span><ul><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">管理控制台运维</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/pinpoint.html" target="_self">使用Pinpoint做分布式跟踪</a></li><li class="menu-item menu-item-level-3"><a href="/zh-cn/docs/admin/ops/skywalking.html" target="_self">使用Skywalking做分布式跟踪</a></li></ul></li></ul></li></ul></div><div class="doc-content markdown-body"><h1>FAQ</h1>
+</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 process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</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 href="http://www.apache.org/foundation/sponsorship.html" target="_self">赞助</a></dd><dd><a href="http://www.apache.org/foundation/thanks.html" target="_self">致谢</a></dd></dl></div><div class="col col-4"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/user/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/dev/build.html" target="_self">开发者指南</a></dd><dd><a href="/zh-cn/docs/admin/ops/dubbo-ops.html" target="_self">运维管理</a></dd></dl></div><div class="col col-4"><dl><dt>资源</dt><dd><a href="/zh-cn/blog/index.html" target="_self">博客</a></dd><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.apache.org/security" target="_self">安全</a></dd></dl></div></div><div class="copyright"><span>Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div>
+	<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/documentation.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/docs/developers/user-guide/faq_dev.json b/zh-cn/docs/developers/user-guide/faq_dev.json
new file mode 100644
index 00000000..5dbefcf5
--- /dev/null
+++ b/zh-cn/docs/developers/user-guide/faq_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "faq_dev.md",
+  "__html": "<h1>FAQ</h1>\n",
+  "link": "/zh-cn/docs/developers/user-guide/faq_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/README.json b/zh-cn/docs/user/README.json
index 62539edc..6f020dfa 100644
--- a/zh-cn/docs/user/README.json
+++ b/zh-cn/docs/user/README.json
@@ -1,4 +1,6 @@
 {
   "filename": "README.md",
-  "__html": "<p>这篇文档详细讲解了<code>dubbo</code>的使用,基本涵盖<code>dubbo</code>的所有功能特性。</p>\n<p>如果你正依赖<code>dubbo</code>作为你业务工程的RPC通信框架,这里可以作为你的参考手册</p>\n"
+  "__html": "<p>这篇文档详细讲解了<code>dubbo</code>的使用,基本涵盖<code>dubbo</code>的所有功能特性。</p>\n<p>如果你正依赖<code>dubbo</code>作为你业务工程的RPC通信框架,这里可以作为你的参考手册</p>\n",
+  "link": "/zh-cn/docs/user/README.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/SUMMARY.json b/zh-cn/docs/user/SUMMARY.json
index ab5d386a..97fce29b 100644
--- a/zh-cn/docs/user/SUMMARY.json
+++ b/zh-cn/docs/user/SUMMARY.json
@@ -1,4 +1,6 @@
 {
   "filename": "SUMMARY.md",
-  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./preface/index.md\">1 入门</a>\n<ul>\n<li><a href=\"./preface/background.md\">1.1 背景</a></li>\n<li><a href=\"./preface/requirements.md\">1.2 需求</a></li>\n<li><a href=\"./preface/architecture.md\">1.3 架构</a></li>\n<li><a href=\"./preface/usage.md\">1.4 用法</a></li>\n</ul>\n</li>\n<li><a href=\"./quick-start.md\">2 快速启动</a></li>\n<li><a href=\"./dependencies.md\">3 依赖</a></li>\n<li><a href=\"./maturity.md\">4 成熟度</a></li>\n<li><a href=\"./configuration/index.md\">5 配置</a>\n<ul>\n<li><a href=\"./configuration/xml.md\">5.1 XML 配置</a></li>\n<li><a href=\"./configuration/properties.md\">5.2 属性配置</a></li>\n<li><a href=\"./configuration/api.md\">5.3 API 配置</a></li>\n<li><a href=\"./configuration/annotation.md\">5.4 注解配置</a></li>\n</ul>\n</li>\n<li><a href=\"./demos/index.md\">6 示例</a>\n<ul>\n<li><a href=\"./demos/preflight-check.md\">6.1 启动时检查</a></li>\n<li><a href=\"./demos/fault-tolerent-strategy.md\">6.2 集群容错</a></li>\n<li><a href=\"./demos/loadbalance.md\">6.3 负载均衡</a></li>\n<li><a href=\"./demos/thread-model.md\">6.4 线程模型</a></li>\n<li><a href=\"./demos/explicit-target.md\">6.5 直连提供者</a></li>\n<li><a href=\"./demos/subscribe-only.md\">6.6 只订阅</a></li>\n<li><a href=\"./demos/registry-only.md\">6.7 只注册</a></li>\n<li><a href=\"./demos/static-service.md\">6.8 静态服务</a></li>\n<li><a href=\"./demos/multi-protocols.md\">6.9 多协议</a></li>\n<li><a href=\"./demos/multi-registry.md\">6.10 多注册中心</a></li>\n<li><a href=\"./demos/service-group.md\">6.11 服务分组</a></li>\n<li><a href=\"./demos/multi-versions.md\">6.12 多版本</a></li>\n<li><a href=\"./demos/group-merger.md\">6.13 分组聚合</a></li>\n<li><a href=\"./demos/parameter-validation.md\">6.14 参数验证</a></li>\n<li><a href=\"./demos/result-cache.md\">6.15 结果缓存</a></li>\n<li><a href=\"./demos/generic-reference.md\">6.16 泛化引用</a></li>\n<li><a href=\"./demos/generic-service.md\">6.17 泛化实现</a></li>\n<li><a href=\"./demos/echo-service.md\">6.18 回声测试</a></li>\n<li><a href=\"./demos/context.md\">6.19 上下文信息</a></li>\n<li><a href=\"./demos/attachment.md\">6.20 隐式参数</a></li>\n<li><a href=\"./demos/async-call.md\">6.21 异步调用</a></li>\n<li><a href=\"./demos/local-call.md\">6.22 本地调用</a></li>\n<li><a href=\"./demos/callback-parameter.md\">6.23 参数回调</a></li>\n<li><a href=\"./demos/events-notify.md\">6.24 事件通知</a></li>\n<li><a href=\"./demos/local-stub.md\">6.25 本地存根</a></li>\n<li><a href=\"./demos/local-mock.md\">6.26 本地伪装</a></li>\n<li><a href=\"./demos/delay-publish.md\">6.27 延迟暴露</a></li>\n<li><a href=\"./demos/concurrency-control.md\">6.28 并发控制</a></li>\n<li><a href=\"./demos/config-connections.md\">6.29 连接控制</a></li>\n<li><a href=\"./demos/lazy-connect.md\">6.30 延迟连接</a></li>\n<li><a href=\"./demos/stickiness.md\">6.31 粘滞连接</a></li>\n<li><a href=\"./demos/token-authorization.md\">6.32 令牌验证</a></li>\n<li><a href=\"./demos/routing-rule.md\">6.33 路由规则</a></li>\n<li><a href=\"./demos/config-rule.md\">6.34 配置规则</a></li>\n<li><a href=\"./demos/service-downgrade.md\">6.35 服务降级</a></li>\n<li><a href=\"./demos/graceful-shutdown.md\">6.36 优雅停机</a></li>\n<li><a href=\"./demos/hostname-binding.md\">6.37 主机绑定</a></li>\n<li><a href=\"./demos/logger-strategy.md\">6.38 日志适配</a></li>\n<li><a href=\"./demos/accesslog.md\">6.39 访问日志</a></li>\n<li><a href=\"./demos/service-container.md\">6.40 服务容器</a></li>\n<li><a href=\"./demos/reference-config-cache.md\">6.41 Reference Config 缓存</a></li>\n<li><a href=\"./demos/distributed-transaction.md\">6.42 分布式事务</a></li>\n<li><a href=\"./demos/dump.md\">6.43 线程栈自动dump</a></li>\n<li><a href=\"./demos/netty4.md\">6.44 Netty4</a></li>\n<li><a href=\"./demos/serialization.md\">6.45 Kryo和FST序列化</a></li>\n</ul>\n</li>\n<li><a href=\"./references/api.md\">7 API 参考手册</a></li>\n<li><a href=\"./references/xml/introduction.md\">8 schema 配置参考手册</a>\n<ul>\n<li><a href=\"./references/xml/dubbo-service.md\">8.1 dubbo:service</a></li>\n<li><a href=\"./references/xml/dubbo-reference.md\">8.2 dubbo:reference</a></li>\n<li><a href=\"./references/xml/dubbo-protocol.md\">8.3 dubbo:protocol</a></li>\n<li><a href=\"./references/xml/dubbo-registry.md\">8.4 dubbo:registry</a></li>\n<li><a href=\"./references/xml/dubbo-monitor.md\">8.5 dubbo:monitor</a></li>\n<li><a href=\"./references/xml/dubbo-application.md\">8.6 dubbo:application</a></li>\n<li><a href=\"./references/xml/dubbo-module.md\">8.7 dubbo:module</a></li>\n<li><a href=\"./references/xml/dubbo-provider.md\">8.8 dubbo:provider</a></li>\n<li><a href=\"./references/xml/dubbo-consumer.md\">8.9 dubbo:consumer</a></li>\n<li><a href=\"./references/xml/dubbo-method.md\">8.10 dubbo:method</a></li>\n<li><a href=\"./references/xml/dubbo-argument.md\">8.11 dubbo:argument</a></li>\n<li><a href=\"./references/xml/dubbo-parameter.md\">8.12 dubbo:parameter</a></li>\n</ul>\n</li>\n<li><a href=\"./references/protocol/introduction.md\">9 协议参考手册</a>\n<ul>\n<li><a href=\"./references/protocol/dubbo.md\">9.1 dubbo://</a></li>\n<li><a href=\"./references/protocol/rmi.md\">9.2 rmi//</a></li>\n<li><a href=\"./references/protocol/hessian.md\">9.3 hessian://</a></li>\n<li><a href=\"./references/protocol/http.md\">9.4 http://</a></li>\n<li><a href=\"./references/protocol/webservice.md\">9.5 webservice://</a></li>\n<li><a href=\"./references/protocol/thrift.md\">9.6 thrift://</a></li>\n<li><a href=\"./references/protocol/memcached.md\">9.7 memcached://</a></li>\n<li><a href=\"./references/protocol/redis.md\">9.8 redis://</a></li>\n<li><a href=\"./references/protocol/rest.md\">9.9 rest://</a></li>\n</ul>\n</li>\n<li><a href=\"./references/registry/introduction.md\">10 注册中心参考手册</a>\n<ul>\n<li><a href=\"./references/registry/multicast.md\">10.1 Multicast 注册中心</a></li>\n<li><a href=\"./references/registry/zookeeper.md\">10.2 Zookeeper 注册中心</a></li>\n<li><a href=\"./references/registry/redis.md\">10.3 Redis 注册中心</a></li>\n<li><a href=\"./references/registry/simple.md\">10.4 Simple 注册中心</a></li>\n</ul>\n</li>\n<li><a href=\"./references/telnet.md\">11 telnet 命令参考手册</a></li>\n<li><a href=\"./references/qos.md\">12 在线运维命令-QOS</a></li>\n<li><a href=\"./references/maven.md\">13 maven 插件参考手册</a></li>\n<li><a href=\"./best-practice.md\">14 服务化最佳实践</a></li>\n<li><a href=\"./recommend.md\">15 推荐用法</a></li>\n<li><a href=\"./capacity-plan.md\">16 容量规划</a></li>\n<li><a href=\"./perf-test.md\">17 性能测试报告</a></li>\n<li><a href=\"./coveragence.md\">18 测试覆盖率报告</a></li>\n</ul>\n"
+  "__html": "<h1>Summary</h1>\n<ul>\n<li><a href=\"./preface/index.md\">1 入门</a>\n<ul>\n<li><a href=\"./preface/background.md\">1.1 背景</a></li>\n<li><a href=\"./preface/requirements.md\">1.2 需求</a></li>\n<li><a href=\"./preface/architecture.md\">1.3 架构</a></li>\n<li><a href=\"./preface/usage.md\">1.4 用法</a></li>\n</ul>\n</li>\n<li><a href=\"./quick-start.md\">2 快速启动</a></li>\n<li><a href=\"./dependencies.md\">3 依赖</a></li>\n<li><a href=\"./maturity.md\">4 成熟度</a></li>\n<li><a href=\"./configuration/index.md\">5 配置</a>\n<ul>\n<li><a href=\"./configuration/xml.md\">5.1 XML 配置</a></li>\n<li><a href=\"./configuration/properties.md\">5.2 属性配置</a></li>\n<li><a href=\"./configuration/api.md\">5.3 API 配置</a></li>\n<li><a href=\"./configuration/annotation.md\">5.4 注解配置</a></li>\n</ul>\n</li>\n<li><a href=\"./demos/index.md\">6 示例</a>\n<ul>\n<li><a href=\"./demos/preflight-check.md\">6.1 启动时检查</a></li>\n<li><a href=\"./demos/fault-tolerent-strategy.md\">6.2 集群容错</a></li>\n<li><a href=\"./demos/loadbalance.md\">6.3 负载均衡</a></li>\n<li><a href=\"./demos/thread-model.md\">6.4 线程模型</a></li>\n<li><a href=\"./demos/explicit-target.md\">6.5 直连提供者</a></li>\n<li><a href=\"./demos/subscribe-only.md\">6.6 只订阅</a></li>\n<li><a href=\"./demos/registry-only.md\">6.7 只注册</a></li>\n<li><a href=\"./demos/static-service.md\">6.8 静态服务</a></li>\n<li><a href=\"./demos/multi-protocols.md\">6.9 多协议</a></li>\n<li><a href=\"./demos/multi-registry.md\">6.10 多注册中心</a></li>\n<li><a href=\"./demos/service-group.md\">6.11 服务分组</a></li>\n<li><a href=\"./demos/multi-versions.md\">6.12 多版本</a></li>\n<li><a href=\"./demos/group-merger.md\">6.13 分组聚合</a></li>\n<li><a href=\"./demos/parameter-validation.md\">6.14 参数验证</a></li>\n<li><a href=\"./demos/result-cache.md\">6.15 结果缓存</a></li>\n<li><a href=\"./demos/generic-reference.md\">6.16 泛化引用</a></li>\n<li><a href=\"./demos/generic-service.md\">6.17 泛化实现</a></li>\n<li><a href=\"./demos/echo-service.md\">6.18 回声测试</a></li>\n<li><a href=\"./demos/context.md\">6.19 上下文信息</a></li>\n<li><a href=\"./demos/attachment.md\">6.20 隐式参数</a></li>\n<li><a href=\"./demos/async-call.md\">6.21 异步调用</a></li>\n<li><a href=\"./demos/local-call.md\">6.22 本地调用</a></li>\n<li><a href=\"./demos/callback-parameter.md\">6.23 参数回调</a></li>\n<li><a href=\"./demos/events-notify.md\">6.24 事件通知</a></li>\n<li><a href=\"./demos/local-stub.md\">6.25 本地存根</a></li>\n<li><a href=\"./demos/local-mock.md\">6.26 本地伪装</a></li>\n<li><a href=\"./demos/delay-publish.md\">6.27 延迟暴露</a></li>\n<li><a href=\"./demos/concurrency-control.md\">6.28 并发控制</a></li>\n<li><a href=\"./demos/config-connections.md\">6.29 连接控制</a></li>\n<li><a href=\"./demos/lazy-connect.md\">6.30 延迟连接</a></li>\n<li><a href=\"./demos/stickiness.md\">6.31 粘滞连接</a></li>\n<li><a href=\"./demos/token-authorization.md\">6.32 令牌验证</a></li>\n<li><a href=\"./demos/routing-rule.md\">6.33 路由规则</a></li>\n<li><a href=\"./demos/config-rule.md\">6.34 配置规则</a></li>\n<li><a href=\"./demos/service-downgrade.md\">6.35 服务降级</a></li>\n<li><a href=\"./demos/graceful-shutdown.md\">6.36 优雅停机</a></li>\n<li><a href=\"./demos/hostname-binding.md\">6.37 主机绑定</a></li>\n<li><a href=\"./demos/logger-strategy.md\">6.38 日志适配</a></li>\n<li><a href=\"./demos/accesslog.md\">6.39 访问日志</a></li>\n<li><a href=\"./demos/service-container.md\">6.40 服务容器</a></li>\n<li><a href=\"./demos/reference-config-cache.md\">6.41 Reference Config 缓存</a></li>\n<li><a href=\"./demos/distributed-transaction.md\">6.42 分布式事务</a></li>\n<li><a href=\"./demos/dump.md\">6.43 线程栈自动dump</a></li>\n<li><a href=\"./demos/netty4.md\">6.44 Netty4</a></li>\n<li><a href=\"./demos/serialization.md\">6.45 Kryo和FST序列化</a></li>\n</ul>\n</li>\n<li><a href=\"./references/api.md\">7 API 参考手册</a></li>\n<li><a href=\"./references/xml/introduction.md\">8 schema 配置参考手册</a>\n<ul>\n<li><a href=\"./references/xml/dubbo-service.md\">8.1 dubbo:service</a></li>\n<li><a href=\"./references/xml/dubbo-reference.md\">8.2 dubbo:reference</a></li>\n<li><a href=\"./references/xml/dubbo-protocol.md\">8.3 dubbo:protocol</a></li>\n<li><a href=\"./references/xml/dubbo-registry.md\">8.4 dubbo:registry</a></li>\n<li><a href=\"./references/xml/dubbo-monitor.md\">8.5 dubbo:monitor</a></li>\n<li><a href=\"./references/xml/dubbo-application.md\">8.6 dubbo:application</a></li>\n<li><a href=\"./references/xml/dubbo-module.md\">8.7 dubbo:module</a></li>\n<li><a href=\"./references/xml/dubbo-provider.md\">8.8 dubbo:provider</a></li>\n<li><a href=\"./references/xml/dubbo-consumer.md\">8.9 dubbo:consumer</a></li>\n<li><a href=\"./references/xml/dubbo-method.md\">8.10 dubbo:method</a></li>\n<li><a href=\"./references/xml/dubbo-argument.md\">8.11 dubbo:argument</a></li>\n<li><a href=\"./references/xml/dubbo-parameter.md\">8.12 dubbo:parameter</a></li>\n</ul>\n</li>\n<li><a href=\"./references/protocol/introduction.md\">9 协议参考手册</a>\n<ul>\n<li><a href=\"./references/protocol/dubbo.md\">9.1 dubbo://</a></li>\n<li><a href=\"./references/protocol/rmi.md\">9.2 rmi//</a></li>\n<li><a href=\"./references/protocol/hessian.md\">9.3 hessian://</a></li>\n<li><a href=\"./references/protocol/http.md\">9.4 http://</a></li>\n<li><a href=\"./references/protocol/webservice.md\">9.5 webservice://</a></li>\n<li><a href=\"./references/protocol/thrift.md\">9.6 thrift://</a></li>\n<li><a href=\"./references/protocol/memcached.md\">9.7 memcached://</a></li>\n<li><a href=\"./references/protocol/redis.md\">9.8 redis://</a></li>\n<li><a href=\"./references/protocol/rest.md\">9.9 rest://</a></li>\n</ul>\n</li>\n<li><a href=\"./references/registry/introduction.md\">10 注册中心参考手册</a>\n<ul>\n<li><a href=\"./references/registry/multicast.md\">10.1 Multicast 注册中心</a></li>\n<li><a href=\"./references/registry/zookeeper.md\">10.2 Zookeeper 注册中心</a></li>\n<li><a href=\"./references/registry/redis.md\">10.3 Redis 注册中心</a></li>\n<li><a href=\"./references/registry/simple.md\">10.4 Simple 注册中心</a></li>\n</ul>\n</li>\n<li><a href=\"./references/telnet.md\">11 telnet 命令参考手册</a></li>\n<li><a href=\"./references/qos.md\">12 在线运维命令-QOS</a></li>\n<li><a href=\"./references/maven.md\">13 maven 插件参考手册</a></li>\n<li><a href=\"./best-practice.md\">14 服务化最佳实践</a></li>\n<li><a href=\"./recommend.md\">15 推荐用法</a></li>\n<li><a href=\"./capacity-plan.md\">16 容量规划</a></li>\n<li><a href=\"./perf-test.md\">17 性能测试报告</a></li>\n<li><a href=\"./coveragence.md\">18 测试覆盖率报告</a></li>\n</ul>\n",
+  "link": "/zh-cn/docs/user/SUMMARY.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/benchmark-tool.json b/zh-cn/docs/user/benchmark-tool.json
index 311a13b6..29a53bd7 100644
--- a/zh-cn/docs/user/benchmark-tool.json
+++ b/zh-cn/docs/user/benchmark-tool.json
@@ -1,4 +1,6 @@
 {
   "filename": "benchmark-tool.md",
-  "__html": "<h1>基准测试工具包</h1>\n<ul>\n<li>下载源码: git clone <a href=\"https://github.com/apache/incubator-dubbo.git\">https://github.com/apache/incubator-dubbo.git</a></li>\n<li>编译benchmark: cd incubator-dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>解压 benchmark压缩包: incubator-dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>阅读ReadMe.txt(内容如下,请以压缩包内的为准)</p>\n<ul>\n<li>\n<p>新建一个benchmark工程,如demo.benchmark</p>\n</li>\n<li>\n<p>导入自己服务的接口api包和dubbo.benchmark.jar(解压dubbo.benchmark.tar.gz,在lib目录下)</p>\n</li>\n<li>\n<p>新建一个类,实现AbstractClientRunnable</p>\n<ul>\n<li>实现父类的构造函数</li>\n<li>实现invoke方法,通过serviceFactory创建本地接口代理,并实现自己的业务逻辑,如下</li>\n</ul>\n<pre><code class=\"language-java\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(ServiceFactory serviceFactory)</span> </span>{\n        DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);\n        <span class=\"hljs-keyword\">return</span> demoService.sendRequest(<span class=\"hljs-string\">\"hello\"</span>);\n    }\n</code></pre>\n</li>\n<li>\n<p>将自己的benchmark工程打成jar包,如demo.benchmark.jar</p>\n</li>\n<li>\n<p>将demo.benchmark.jar 和服务的api包放到dubbo.benchmark/lib目录下</p>\n</li>\n<li>\n<p>配置duubo.properties</p>\n</li>\n<li>\n<p>运行run.bat(windows)<a href=\"http://xn--run-du5f.sh\">或run.sh</a>(linux)</p>\n</li>\n</ul>\n<p>如想测试dubbo的不同版本,直接替换lib下的dubbo的jar包即可。</p>\n"
+  "__html": "<h1>基准测试工具包</h1>\n<ul>\n<li>下载源码: git clone <a href=\"https://github.com/apache/incubator-dubbo.git\">https://github.com/apache/incubator-dubbo.git</a></li>\n<li>编译benchmark: cd incubator-dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>解压 benchmark压缩包: incubator-dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>阅读ReadMe.txt(内容如下,请以压缩包内的为准)</p>\n<ul>\n<li>\n<p>新建一个benchmark工程,如demo.benchmark</p>\n</li>\n<li>\n<p>导入自己服务的接口api包和dubbo.benchmark.jar(解压dubbo.benchmark.tar.gz,在lib目录下)</p>\n</li>\n<li>\n<p>新建一个类,实现AbstractClientRunnable</p>\n<ul>\n<li>实现父类的构造函数</li>\n<li>实现invoke方法,通过serviceFactory创建本地接口代理,并实现自己的业务逻辑,如下</li>\n</ul>\n<pre><code class=\"language-java\">    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Object <span class=\"hljs-title\">invoke</span><span class=\"hljs-params\">(ServiceFactory serviceFactory)</span> </span>{\n        DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);\n        <span class=\"hljs-keyword\">return</span> demoService.sendRequest(<span class=\"hljs-string\">\"hello\"</span>);\n    }\n</code></pre>\n</li>\n<li>\n<p>将自己的benchmark工程打成jar包,如demo.benchmark.jar</p>\n</li>\n<li>\n<p>将demo.benchmark.jar 和服务的api包放到dubbo.benchmark/lib目录下</p>\n</li>\n<li>\n<p>配置duubo.properties</p>\n</li>\n<li>\n<p>运行run.bat(windows)<a href=\"http://xn--run-du5f.sh\">或run.sh</a>(linux)</p>\n</li>\n</ul>\n<p>如想测试dubbo的不同版本,直接替换lib下的dubbo的jar包即可。</p>\n",
+  "link": "/zh-cn/docs/user/benchmark-tool.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/best-practice.json b/zh-cn/docs/user/best-practice.json
index 6ab8602f..5a22ff7a 100644
--- a/zh-cn/docs/user/best-practice.json
+++ b/zh-cn/docs/user/best-practice.json
@@ -1,7 +1,10 @@
 {
   "filename": "best-practice.md",
   "__html": "<h1>服务化最佳实践</h1>\n<h2>分包</h2>\n<p>建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。</p>\n<p>如果需要,也可以考虑在 API 包中放置一份 Spring 的引用配置,这样使用方只需在 Spring 加载过程中引用此配置即可。配置建议放在模块的包目录下,以免冲突,如:<code>com/alibaba/china/xxx/dubbo-reference.xml</code>。</p>\n<h2>粒度</h2>\n<p>服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。</p>\n<p>服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。</p>\n<p>不建议使用过于抽象的通用接口,如:<code>Map query(Map)</code>,这样的接口没有明确语义,会给后期维护带来不便。</p>\n<h2>版本</h2>\n<p>每个接口都应定义版本号,为后续不兼容升级提供可能,如: <code>&lt;dubbo:service interface=&quot;com.xxx.XxxService&quot; version=&quot;1.0&quot; /&gt;</code>。</p>\n<p>建议使用两位版本号,因为第三位版本号通常表示兼容升级,只有不兼容时才需要变更服务版本。</p>\n<p>当不兼容时,先升级一半提供者为新版本,再将消费者全部升为新版本,然后将剩下的一半提供者升为新版本。</p>\n<h2>兼容性</h2>\n<p>服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。</p>\n<p>各协议的兼容性不同,参见:<a href=\"./references/protocol/introduction.md\">服务协议</a></p>\n<h2>枚举值</h2>\n<p>如果是完备集,可以用 <code>Enum</code>,比如:<code>ENABLE</code>, <code>DISABLE</code>。</p>\n<p>如果是业务种类,以后明显会有类型增加,不建议用 <code>Enum</code>,可以用 <code>String</code> 代替。</p>\n<p>如果是在返回值中用了 <code>Enum</code>,并新增了 <code>Enum</code> 值,建议先升级服务消费方,这样服务提供方不会返回新值。</p>\n<p>如果是在传入参数中用了 <code>Enum</code>,并新增了 <code>Enum</code> 值,建议先升级服务提供方,这样服务消费方不会传入新值。</p>\n<h2>序列化</h2>\n<p>服务参数及返回值建议使用 POJO 对象,即通过 <code>setter</code>, <code>getter</code> 方法表示属性的对象。</p>\n<p>服务参数及返回值不建议使用接口,因为数据模型抽象的意义不大,并且序列化需要接口实现类的元信息,并不能起到隐藏实现的意图。</p>\n<p>服务参数及返回值都必需是<a href=\"https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value\">传值调用</a>,而不能是<a href=\"https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference\">传引用调用</a>,消费方和提供方的参数或返回值引用并不是同一个,只是值相同,Dubbo 不支持引用远程对象。</p>\n<h2>异常</h2>\n<p>建议使用异常汇报错误,而不是返回错误码,异常信息能携带更多信息,并且语义更友好。</p>\n<p>如果担心性能问题,在必要时,可以通过 override 掉异常类的 <code>fillInStackTrace()</code> 方法为空方法,使其不拷贝栈信息。</p>\n<p>查询方法不建议抛出 checked 异常,否则调用方在查询时将过多的 <code>try...catch</code>,并且不能进行有效处理。</p>\n<p>服务提供方不应将 DAO 或 SQL 等异常抛给消费方,应在服务实现中对消费方不关心的异常进行包装,否则可能出现消费方无法反序列化相应异常。</p>\n<h2>调用</h2>\n<p>不要只是因为是 Dubbo 调用,而把调用 <code>try...catch</code> 起来。<code>try...catch</code> 应该加上合适的回滚边界上。</p>\n<p>Provider 端需要对输入参数进行校验。如有性能上的考虑,服务实现者可以考虑在 API 包上加上服务 Stub 类来完成检验。</p>\n",
-  "title": "服务化最佳实践",
-  "keywords": "分包, 粒度, 版本, 兼容性, 枚举, 序列化,异常",
-  "description": "Dubbo 最佳实践"
+  "link": "/zh-cn/docs/user/best-practice.html",
+  "meta": {
+    "title": "服务化最佳实践",
+    "keywords": "分包, 粒度, 版本, 兼容性, 枚举, 序列化,异常",
+    "description": "Dubbo 最佳实践"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/capacity-plan.json b/zh-cn/docs/user/capacity-plan.json
index 9fc8c5ef..be479c7e 100644
--- a/zh-cn/docs/user/capacity-plan.json
+++ b/zh-cn/docs/user/capacity-plan.json
@@ -1,7 +1,10 @@
 {
   "filename": "capacity-plan.md",
   "__html": "<h1>容量规划</h1>\n<p>以下数据供参考:</p>\n<h2>使用 Dubbo 的会员服务项目</h2>\n<ul>\n<li>每天接收 4 亿次远程调用</li>\n<li>使用 12 台网站标配机器提供服务(8 核 CPU,8G 内存)</li>\n<li>平均负载在 1 以下(对于 8 核 CPU 负载很低)</li>\n<li>平均响应时间 2.3 到 2.5 毫秒,网络开销约占 1.5 到 1.6 毫秒(和数据包大小有关)</li>\n</ul>\n<h2>使用 Dubbo 的产品授权服务项目</h2>\n<ul>\n<li>每天接收 3 亿次远程调用</li>\n<li>使用 8 台网站标配机器提供服务(8 核CPU,8G 内存)</li>\n<li>平均负载在 1 以下(对于 8 核 CPU 负载很低)</li>\n<li>平均响应时间 1.4 到 2.8 毫秒,网络开销约占 1.0 到 1.1 毫秒(和数据包大小有关)</li>\n</ul>\n",
-  "title": "容量规划",
-  "keywords": "容量规划",
-  "description": "Dubbo 应用容量规划参考"
+  "link": "/zh-cn/docs/user/capacity-plan.html",
+  "meta": {
+    "title": "容量规划",
+    "keywords": "容量规划",
+    "description": "Dubbo 应用容量规划参考"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/annotation.json b/zh-cn/docs/user/configuration/annotation.json
index 12445b4f..d45bf91e 100644
--- a/zh-cn/docs/user/configuration/annotation.json
+++ b/zh-cn/docs/user/configuration/annotation.json
@@ -1,4 +1,6 @@
 {
   "filename": "annotation.md",
-  "__html": "<h1>注解配置</h1>\n<p>需要 <code>2.5.7</code> 及以上版本支持</p>\n<h2>服务提供方</h2>\n<h3><code>Service</code>注解暴露服务</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n \n<span class=\"hljs-meta\">@Service</span>(timeout = <span class=\"hljs-number\">5000</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotateServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">AnnotateService</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>javaconfig形式配置公共模块</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"provider-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>指定dubbo扫描路径</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service.impl\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>服务消费方</h2>\n<h3><code>Reference</code>注解引用服务</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotationConsumeService</span> </span>{\n\n    <span class=\"hljs-meta\">@com</span>.alibaba.dubbo.config.annotation.Reference\n    <span class=\"hljs-keyword\">public</span> AnnotateService annotateService;\n    \n    <span class=\"hljs-comment\">// ...</span>\n}\n\n</code></pre>\n<h3>javaconfig形式配置公共模块</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"consumer-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n        consumerConfig.setTimeout(<span class=\"hljs-number\">3000</span>);\n        <span class=\"hljs-keyword\">return</span> consumerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>指定dubbo扫描路径</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>注意</h2>\n<p>如果你曾使用旧版annotation配置,请删除所有相关配置,我们将在下个版本删除所有旧版配置项。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:annotation</span> <span class=\"hljs-attr\">package</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span> /&gt;</span> \n</code></pre>\n"
+  "__html": "<h1>注解配置</h1>\n<p>需要 <code>2.5.7</code> 及以上版本支持</p>\n<h2>服务提供方</h2>\n<h3><code>Service</code>注解暴露服务</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.config.annotation.Service;\n \n<span class=\"hljs-meta\">@Service</span>(timeout = <span class=\"hljs-number\">5000</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotateServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">AnnotateService</span> </span>{ \n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h3>javaconfig形式配置公共模块</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"provider-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>指定dubbo扫描路径</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service.impl\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ProviderTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>服务消费方</h2>\n<h3><code>Reference</code>注解引用服务</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotationConsumeService</span> </span>{\n\n    <span class=\"hljs-meta\">@com</span>.alibaba.dubbo.config.annotation.Reference\n    <span class=\"hljs-keyword\">public</span> AnnotateService annotateService;\n    \n    <span class=\"hljs-comment\">// ...</span>\n}\n\n</code></pre>\n<h3>javaconfig形式配置公共模块</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Configuration</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DubboConfiguration</span> </span>{\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n        applicationConfig.setName(<span class=\"hljs-string\">\"consumer-test\"</span>);\n        <span class=\"hljs-keyword\">return</span> applicationConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ConsumerConfig <span class=\"hljs-title\">consumerConfig</span><span class=\"hljs-params\">()</span> </span>{\n        ConsumerConfig consumerConfig = <span class=\"hljs-keyword\">new</span> ConsumerConfig();\n        consumerConfig.setTimeout(<span class=\"hljs-number\">3000</span>);\n        <span class=\"hljs-keyword\">return</span> consumerConfig;\n    }\n\n    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> RegistryConfig <span class=\"hljs-title\">registryConfig</span><span class=\"hljs-params\">()</span> </span>{\n        RegistryConfig registryConfig = <span class=\"hljs-keyword\">new</span> RegistryConfig();\n        registryConfig.setAddress(<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>);\n        registryConfig.setClient(<span class=\"hljs-string\">\"curator\"</span>);\n        <span class=\"hljs-keyword\">return</span> registryConfig;\n    }\n}\n</code></pre>\n<h3>指定dubbo扫描路径</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@SpringBootApplication</span>\n<span class=\"hljs-meta\">@DubboComponentScan</span>(basePackages = <span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span>)\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ConsumerTestApp</span> </span>{\n    <span class=\"hljs-comment\">// ...</span>\n}\n</code></pre>\n<h2>注意</h2>\n<p>如果你曾使用旧版annotation配置,请删除所有相关配置,我们将在下个版本删除所有旧版配置项。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:annotation</span> <span class=\"hljs-attr\">package</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.test.service\"</span> /&gt;</span> \n</code></pre>\n",
+  "link": "/zh-cn/docs/user/configuration/annotation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/api.json b/zh-cn/docs/user/configuration/api.json
index ef5260d3..e24a188c 100644
--- a/zh-cn/docs/user/configuration/api.json
+++ b/zh-cn/docs/user/configuration/api.json
@@ -1,4 +1,6 @@
 {
   "filename": "api.md",
-  "__html": "<h1>API 配置</h1>\n<p>API 属性与配置项一对一,各属性含义,请参见:<a href=\"../references/xml/introduction.md\">配置参考手册</a>,比如:<code>ApplicationConfig.setName(&quot;xxx&quot;)</code> 对应  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>服务提供者</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ProviderConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ServiceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxServiceImpl;\n \n<span class=\"hljs-comment\">// 服务实现</span>\nXxxService xxxService = <span class=\"hljs-keyword\">new</span> XxxServiceImpl();\n \n<span class=\"hljs-comment\">// 当前应用配置</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"xxx\"</span>);\n \n<span class=\"hljs-comment\">// 连接注册中心配置</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// 服务提供者协议配置</span>\nProtocolConfig protocol = <span class=\"hljs-keyword\">new</span> ProtocolConfig();\nprotocol.setName(<span class=\"hljs-string\">\"dubbo\"</span>);\nprotocol.setPort(<span class=\"hljs-number\">12345</span>);\nprotocol.setThreads(<span class=\"hljs-number\">200</span>);\n \n<span class=\"hljs-comment\">// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口</span>\n \n<span class=\"hljs-comment\">// 服务提供者暴露服务配置</span>\nServiceConfig&lt;XxxService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\nservice.setApplication(application);\nservice.setRegistry(registry); <span class=\"hljs-comment\">// 多个注册中心可以用setRegistries()</span>\nservice.setProtocol(protocol); <span class=\"hljs-comment\">// 多个协议可以用setProtocols()</span>\nservice.setInterface(XxxService.class);\nservice.setRef(xxxService);\nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// 暴露及注册服务</span>\nservice.export();\n</code></pre>\n<h2>服务消费者</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ConsumerConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ReferenceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n \n<span class=\"hljs-comment\">// 当前应用配置</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"yyy\"</span>);\n \n<span class=\"hljs-comment\">// 连接注册中心配置</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接</span>\n \n<span class=\"hljs-comment\">// 引用远程服务</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\nreference.setApplication(application);\nreference.setRegistry(registry); <span class=\"hljs-comment\">// 多个注册中心可以用setRegistries()</span>\nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// 和本地bean一样使用xxxService</span>\nXxxService xxxService = reference.get(); <span class=\"hljs-comment\">// 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用</span>\n</code></pre>\n<h2>特殊场景</h2>\n<p>下面只列出不同的地方,其它参见上面的写法</p>\n<h3>方法级设置</h3>\n<pre><code class=\"language-java\">...\n \n<span class=\"hljs-comment\">// 方法级配置</span>\nList&lt;MethodConfig&gt; methods = <span class=\"hljs-keyword\">new</span> ArrayList&lt;MethodConfig&gt;();\nMethodConfig method = <span class=\"hljs-keyword\">new</span> MethodConfig();\nmethod.setName(<span class=\"hljs-string\">\"createXxx\"</span>);\nmethod.setTimeout(<span class=\"hljs-number\">10000</span>);\nmethod.setRetries(<span class=\"hljs-number\">0</span>);\nmethods.add(method);\n \n<span class=\"hljs-comment\">// 引用远程服务</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\n...\nreference.setMethods(methods); <span class=\"hljs-comment\">// 设置方法级配置</span>\n \n...\n</code></pre>\n<h3>点对点直连</h3>\n<pre><code class=\"language-java\">\n...\n \nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\n<span class=\"hljs-comment\">// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,</span>\n<span class=\"hljs-comment\">// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,</span>\n<span class=\"hljs-comment\">// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名</span>\nreference.setUrl(<span class=\"hljs-string\">\"dubbo://10.20.130.230:20880/com.xxx.XxxService\"</span>); \n \n...\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>API使用范围说明:API 仅用于 OpenAPI, ESB, Test, Mock 等系统集成,普通服务提供方或消费方,请采用<a href=\"../configuration/xml.md\">XML 配置</a>方式使用 Dubbo <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>API 配置</h1>\n<p>API 属性与配置项一对一,各属性含义,请参见:<a href=\"../references/xml/introduction.md\">配置参考手册</a>,比如:<code>ApplicationConfig.setName(&quot;xxx&quot;)</code> 对应  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>服务提供者</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ProviderConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ServiceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxServiceImpl;\n \n<span class=\"hljs-comment\">// 服务实现</span>\nXxxService xxxService = <span class=\"hljs-keyword\">new</span> XxxServiceImpl();\n \n<span class=\"hljs-comment\">// 当前应用配置</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"xxx\"</span>);\n \n<span class=\"hljs-comment\">// 连接注册中心配置</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// 服务提供者协议配置</span>\nProtocolConfig protocol = <span class=\"hljs-keyword\">new</span> ProtocolConfig();\nprotocol.setName(<span class=\"hljs-string\">\"dubbo\"</span>);\nprotocol.setPort(<span class=\"hljs-number\">12345</span>);\nprotocol.setThreads(<span class=\"hljs-number\">200</span>);\n \n<span class=\"hljs-comment\">// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口</span>\n \n<span class=\"hljs-comment\">// 服务提供者暴露服务配置</span>\nServiceConfig&lt;XxxService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\nservice.setApplication(application);\nservice.setRegistry(registry); <span class=\"hljs-comment\">// 多个注册中心可以用setRegistries()</span>\nservice.setProtocol(protocol); <span class=\"hljs-comment\">// 多个协议可以用setProtocols()</span>\nservice.setInterface(XxxService.class);\nservice.setRef(xxxService);\nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// 暴露及注册服务</span>\nservice.export();\n</code></pre>\n<h2>服务消费者</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.RegistryConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ConsumerConfig;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.config.ReferenceConfig;\n<span class=\"hljs-keyword\">import</span> com.xxx.XxxService;\n \n<span class=\"hljs-comment\">// 当前应用配置</span>\nApplicationConfig application = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\napplication.setName(<span class=\"hljs-string\">\"yyy\"</span>);\n \n<span class=\"hljs-comment\">// 连接注册中心配置</span>\nRegistryConfig registry = <span class=\"hljs-keyword\">new</span> RegistryConfig();\nregistry.setAddress(<span class=\"hljs-string\">\"10.20.130.230:9090\"</span>);\nregistry.setUsername(<span class=\"hljs-string\">\"aaa\"</span>);\nregistry.setPassword(<span class=\"hljs-string\">\"bbb\"</span>);\n \n<span class=\"hljs-comment\">// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接</span>\n \n<span class=\"hljs-comment\">// 引用远程服务</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\nreference.setApplication(application);\nreference.setRegistry(registry); <span class=\"hljs-comment\">// 多个注册中心可以用setRegistries()</span>\nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n \n<span class=\"hljs-comment\">// 和本地bean一样使用xxxService</span>\nXxxService xxxService = reference.get(); <span class=\"hljs-comment\">// 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用</span>\n</code></pre>\n<h2>特殊场景</h2>\n<p>下面只列出不同的地方,其它参见上面的写法</p>\n<h3>方法级设置</h3>\n<pre><code class=\"language-java\">...\n \n<span class=\"hljs-comment\">// 方法级配置</span>\nList&lt;MethodConfig&gt; methods = <span class=\"hljs-keyword\">new</span> ArrayList&lt;MethodConfig&gt;();\nMethodConfig method = <span class=\"hljs-keyword\">new</span> MethodConfig();\nmethod.setName(<span class=\"hljs-string\">\"createXxx\"</span>);\nmethod.setTimeout(<span class=\"hljs-number\">10000</span>);\nmethod.setRetries(<span class=\"hljs-number\">0</span>);\nmethods.add(method);\n \n<span class=\"hljs-comment\">// 引用远程服务</span>\nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\n...\nreference.setMethods(methods); <span class=\"hljs-comment\">// 设置方法级配置</span>\n \n...\n</code></pre>\n<h3>点对点直连</h3>\n<pre><code class=\"language-java\">\n...\n \nReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class=\"hljs-comment\">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>\n<span class=\"hljs-comment\">// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,</span>\n<span class=\"hljs-comment\">// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,</span>\n<span class=\"hljs-comment\">// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名</span>\nreference.setUrl(<span class=\"hljs-string\">\"dubbo://10.20.130.230:20880/com.xxx.XxxService\"</span>); \n \n...\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>API使用范围说明:API 仅用于 OpenAPI, ESB, Test, Mock 等系统集成,普通服务提供方或消费方,请采用<a href=\"../configuration/xml.md\">XML 配置</a>方式使用 Dubbo <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/configuration/api.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/index.json b/zh-cn/docs/user/configuration/index.json
index 2ec57099..46863a9d 100644
--- a/zh-cn/docs/user/configuration/index.json
+++ b/zh-cn/docs/user/configuration/index.json
@@ -1,4 +1,6 @@
 {
   "filename": "index.md",
-  "__html": "<h1>配置</h1>\n"
+  "__html": "<h1>配置</h1>\n",
+  "link": "/zh-cn/docs/user/configuration/index.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/properties.json b/zh-cn/docs/user/configuration/properties.json
index 2cc3fe08..f5f8729f 100644
--- a/zh-cn/docs/user/configuration/properties.json
+++ b/zh-cn/docs/user/configuration/properties.json
@@ -1,4 +1,6 @@
 {
   "filename": "properties.md",
-  "__html": "<h1>属性配置</h1>\n<p>如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。</p>\n<p>Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数 <code>-Ddubbo.properties.file=xxx.properties</code> 改变缺省配置位置。<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>映射规则</h2>\n<p>将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行</p>\n<ul>\n<li>比如:<code>dubbo.application.name=foo</code>等价于<code>&lt;dubbo:application name=&quot;foo&quot; /&gt;</code></li>\n<li>比如:<code>dubbo.registry.address=10.20.153.10:9090</code>等价于<code>&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>如果 XML 有多行同名标签配置,可用 id 号区分,如果没有 id 号将对所有同名标签生效</p>\n<ul>\n<li>比如:<code>dubbo.protocol.rmi.port=1234</code>等价于<code>&lt;dubbo:protocol id=&quot;rmi&quot; name=&quot;rmi&quot; port=&quot;1099&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></li>\n<li>比如:<code>dubbo.registry.china.address=10.20.153.10:9090</code>等价于<code>&lt;dubbo:registry id=&quot;china&quot; address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>下面是 dubbo.properties 的一个典型配置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">foo</span>\n<span class=\"hljs-meta\">dubbo.application.owner</span>=<span class=\"hljs-string\">bar</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">10.20.153.10:9090</span>\n</code></pre>\n<h2>覆盖策略</h2>\n<p><img src=\"../sources/images/dubbo-properties-override.jpg\" alt=\"properties-override\"></p>\n<p>JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。</p>\n<p>XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。</p>\n<p>Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>如果 classpath 根目录下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,Dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>协议的 id 没配时,缺省使用协议名作为 id <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>属性配置</h1>\n<p>如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。</p>\n<p>Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数 <code>-Ddubbo.properties.file=xxx.properties</code> 改变缺省配置位置。<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>映射规则</h2>\n<p>将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行</p>\n<ul>\n<li>比如:<code>dubbo.application.name=foo</code>等价于<code>&lt;dubbo:application name=&quot;foo&quot; /&gt;</code></li>\n<li>比如:<code>dubbo.registry.address=10.20.153.10:9090</code>等价于<code>&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>如果 XML 有多行同名标签配置,可用 id 号区分,如果没有 id 号将对所有同名标签生效</p>\n<ul>\n<li>比如:<code>dubbo.protocol.rmi.port=1234</code>等价于<code>&lt;dubbo:protocol id=&quot;rmi&quot; name=&quot;rmi&quot; port=&quot;1099&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></li>\n<li>比如:<code>dubbo.registry.china.address=10.20.153.10:9090</code>等价于<code>&lt;dubbo:registry id=&quot;china&quot; address=&quot;10.20.153.10:9090&quot; /&gt;</code></li>\n</ul>\n<p>下面是 dubbo.properties 的一个典型配置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.application.name</span>=<span class=\"hljs-string\">foo</span>\n<span class=\"hljs-meta\">dubbo.application.owner</span>=<span class=\"hljs-string\">bar</span>\n<span class=\"hljs-meta\">dubbo.registry.address</span>=<span class=\"hljs-string\">10.20.153.10:9090</span>\n</code></pre>\n<h2>覆盖策略</h2>\n<p><img src=\"../sources/images/dubbo-properties-override.jpg\" alt=\"properties-override\"></p>\n<p>JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。</p>\n<p>XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。</p>\n<p>Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>如果 classpath 根目录下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,Dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>协议的 id 没配时,缺省使用协议名作为 id <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/configuration/properties.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/xml.json b/zh-cn/docs/user/configuration/xml.json
index 3905b93d..478d1881 100644
--- a/zh-cn/docs/user/configuration/xml.json
+++ b/zh-cn/docs/user/configuration/xml.json
@@ -1,4 +1,6 @@
 {
   "filename": "xml.md",
-  "__html": "<h1>XML 配置</h1>\n<p>有关 XML 的详细配置项,请参见:<a href=\"../references/xml/introduction.md\">配置参考手册</a>。如果不想使用 Spring 配置,而希望通过 API 的方式进行调用,请参见:<a href=\"./api.md\">API配置</a>。想知道如何使用配置,请参见:<a href=\"../quick-start.md\">快速启动</a>。</p>\n<h2>provider.xml 示例</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hello-world-app\"</span>  /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>  \n    <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\">\"20880\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoServiceLocal\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoServiceRemote\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>所有标签都支持自定义参数,用于不同扩展点实现的特殊配置,如:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"queue\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:protocol</span>&gt;</span>\n</code></pre>\n<p>或: <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xmlns:p</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/p\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span> <span class=\"hljs-attr\">p:queue</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>配置之间的关系</h2>\n<p><img src=\"../sources/images/dubbo-config.jpg\" alt=\"dubbo-config\"></p>\n<table>\n<thead>\n<tr>\n<th>标签</th>\n<th>用途</th>\n<th>解释</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>&lt;dubbo:service/&gt;</code></td>\n<td>服务配置</td>\n<td>用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:reference/&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></td>\n<td>引用配置</td>\n<td>用于创建一个远程服务代理,一个引用可以指向多个注册中心</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:protocol/&gt;</code></td>\n<td>协议配置</td>\n<td>用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:application/&gt;</code></td>\n<td>应用配置</td>\n<td>用于配置当前应用信息,不管该应用是提供者还是消费者</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:module/&gt;</code></td>\n<td>模块配置</td>\n<td>用于配置当前模块信息,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:registry/&gt;</code></td>\n<td>注册中心配置</td>\n<td>用于配置连接注册中心相关信息</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:monitor/&gt;</code></td>\n<td>监控中心配置</td>\n<td>用于配置连接监控中心相关信息,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:provider/&gt;</code></td>\n<td>提供方配置</td>\n<td>当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:consumer/&gt;</code></td>\n<td>消费方配置</td>\n<td>当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:method/&gt;</code></td>\n<td>方法配置</td>\n<td>用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:argument/&gt;</code></td>\n<td>参数配置</td>\n<td>用于指定方法参数配置</td>\n</tr>\n</tbody>\n</table>\n<h2>配置覆盖关系</h2>\n<p>以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:</p>\n<ul>\n<li>方法级优先,接口级次之,全局配置再次之。</li>\n<li>如果级别一样,则消费方优先,提供方次之。</li>\n</ul>\n<p>其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。</p>\n<p><img src=\"../sources/images/dubbo-config-override.jpg\" alt=\"dubbo-config-override\"></p>\n<p>建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。</p>\n<p>理论上 ReferenceConfig 的非服务标识配置,在 ConsumerConfig,ServiceConfig, ProviderConfig 均可以缺省配置。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.1.0</code> 开始支持,注意声明:<code>xmlns:p=&quot;http://www.springframework.org/schema/p&quot;</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>引用缺省是延迟初始化的,只有引用被注入到其它 Bean,或被 <code>getBean()</code> 获取,才会初始化。如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:<code>&lt;dubbo:reference ... init=&quot;true&quot; /&gt;</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>XML 配置</h1>\n<p>有关 XML 的详细配置项,请参见:<a href=\"../references/xml/introduction.md\">配置参考手册</a>。如果不想使用 Spring 配置,而希望通过 API 的方式进行调用,请参见:<a href=\"./api.md\">API配置</a>。想知道如何使用配置,请参见:<a href=\"../quick-start.md\">快速启动</a>。</p>\n<h2>provider.xml 示例</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hello-world-app\"</span>  /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>  \n    <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\">\"20880\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoServiceLocal\"</span> /&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoServiceRemote\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>所有标签都支持自定义参数,用于不同扩展点实现的特殊配置,如:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"queue\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:protocol</span>&gt;</span>\n</code></pre>\n<p>或: <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xmlns:p</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/p\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"jms\"</span> <span class=\"hljs-attr\">p:queue</span>=<span class=\"hljs-string\">\"your_queue\"</span> /&gt;</span>  \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>配置之间的关系</h2>\n<p><img src=\"../sources/images/dubbo-config.jpg\" alt=\"dubbo-config\"></p>\n<table>\n<thead>\n<tr>\n<th>标签</th>\n<th>用途</th>\n<th>解释</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>&lt;dubbo:service/&gt;</code></td>\n<td>服务配置</td>\n<td>用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:reference/&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></td>\n<td>引用配置</td>\n<td>用于创建一个远程服务代理,一个引用可以指向多个注册中心</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:protocol/&gt;</code></td>\n<td>协议配置</td>\n<td>用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:application/&gt;</code></td>\n<td>应用配置</td>\n<td>用于配置当前应用信息,不管该应用是提供者还是消费者</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:module/&gt;</code></td>\n<td>模块配置</td>\n<td>用于配置当前模块信息,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:registry/&gt;</code></td>\n<td>注册中心配置</td>\n<td>用于配置连接注册中心相关信息</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:monitor/&gt;</code></td>\n<td>监控中心配置</td>\n<td>用于配置连接监控中心相关信息,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:provider/&gt;</code></td>\n<td>提供方配置</td>\n<td>当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:consumer/&gt;</code></td>\n<td>消费方配置</td>\n<td>当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:method/&gt;</code></td>\n<td>方法配置</td>\n<td>用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息</td>\n</tr>\n<tr>\n<td><code>&lt;dubbo:argument/&gt;</code></td>\n<td>参数配置</td>\n<td>用于指定方法参数配置</td>\n</tr>\n</tbody>\n</table>\n<h2>配置覆盖关系</h2>\n<p>以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:</p>\n<ul>\n<li>方法级优先,接口级次之,全局配置再次之。</li>\n<li>如果级别一样,则消费方优先,提供方次之。</li>\n</ul>\n<p>其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。</p>\n<p><img src=\"../sources/images/dubbo-config-override.jpg\" alt=\"dubbo-config-override\"></p>\n<p>建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。</p>\n<p>理论上 ReferenceConfig 的非服务标识配置,在 ConsumerConfig,ServiceConfig, ProviderConfig 均可以缺省配置。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.1.0</code> 开始支持,注意声明:<code>xmlns:p=&quot;http://www.springframework.org/schema/p&quot;</code> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>引用缺省是延迟初始化的,只有引用被注入到其它 Bean,或被 <code>getBean()</code> 获取,才会初始化。如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:<code>&lt;dubbo:reference ... init=&quot;true&quot; /&gt;</code> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/configuration/xml.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/coveragence.json b/zh-cn/docs/user/coveragence.json
index a0e16efb..6ae880a3 100644
--- a/zh-cn/docs/user/coveragence.json
+++ b/zh-cn/docs/user/coveragence.json
@@ -1,4 +1,6 @@
 {
   "filename": "coveragence.md",
-  "__html": "<h1>测试覆盖率报告</h1>\n<p>基于 <code>2.0.12</code> 版本,统计于 2012-02-03</p>\n<p><img src=\"sources/images/code-quality1.jpg\" alt=\"/sources/images/code-quality1.jpg\"></p>\n<p><img src=\"sources/images/code-quality5.jpg\" alt=\"/sources/images/code-quality5.jpg\"></p>\n<p><img src=\"sources/images/code-coverage.jpg\" alt=\"/sources/images/code-coverage.jpg\"></p>\n<p><img src=\"sources/images/code-tendency.jpg\" alt=\"/sources/images/code-tendency.jpg\"></p>\n<p><img src=\"sources/images/code-dependency.jpg\" alt=\"/sources/images/code-dependency.jpg\"></p>\n"
+  "__html": "<h1>测试覆盖率报告</h1>\n<p>基于 <code>2.0.12</code> 版本,统计于 2012-02-03</p>\n<p><img src=\"sources/images/code-quality1.jpg\" alt=\"/sources/images/code-quality1.jpg\"></p>\n<p><img src=\"sources/images/code-quality5.jpg\" alt=\"/sources/images/code-quality5.jpg\"></p>\n<p><img src=\"sources/images/code-coverage.jpg\" alt=\"/sources/images/code-coverage.jpg\"></p>\n<p><img src=\"sources/images/code-tendency.jpg\" alt=\"/sources/images/code-tendency.jpg\"></p>\n<p><img src=\"sources/images/code-dependency.jpg\" alt=\"/sources/images/code-dependency.jpg\"></p>\n",
+  "link": "/zh-cn/docs/user/coveragence.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/accesslog.json b/zh-cn/docs/user/demos/accesslog.json
index b18a7dd6..39b8279a 100644
--- a/zh-cn/docs/user/demos/accesslog.json
+++ b/zh-cn/docs/user/demos/accesslog.json
@@ -1,4 +1,6 @@
 {
   "filename": "accesslog.md",
-  "__html": "<h1>访问日志</h1>\n<p>如果你想记录每一次请求信息,可开启访问日志,类似于apache的访问日志。<strong>注意</strong>:此日志量比较大,请注意磁盘容量。</p>\n<p>将访问日志输出到当前应用的log4j日志:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>将访问日志输出到指定文件:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/foo/bar.log\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>访问日志</h1>\n<p>如果你想记录每一次请求信息,可开启访问日志,类似于apache的访问日志。<strong>注意</strong>:此日志量比较大,请注意磁盘容量。</p>\n<p>将访问日志输出到当前应用的log4j日志:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>将访问日志输出到指定文件:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">accesslog</span>=<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/foo/bar.log\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/accesslog.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/async-call.json b/zh-cn/docs/user/demos/async-call.json
index 22c43659..cf51360b 100644
--- a/zh-cn/docs/user/demos/async-call.json
+++ b/zh-cn/docs/user/demos/async-call.json
@@ -1,4 +1,6 @@
 {
   "filename": "async-call.md",
-  "__html": "<h1>异步调用</h1>\n<p>基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p><img src=\"../sources/images/future.jpg\" alt=\"/user-guide/images/future.jpg\"></p>\n<p>在 consumer.xml 中配置:</p>\n<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\">\"fooService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.foo.FooService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.bar.BarService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>调用代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// 此调用会立即返回null</span>\nfooService.findFoo(fooId);\n<span class=\"hljs-comment\">// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future</span>\nFuture&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture(); \n \n<span class=\"hljs-comment\">// 此调用会立即返回null</span>\nbarService.findBar(barId);\n<span class=\"hljs-comment\">// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future</span>\nFuture&lt;Bar&gt; barFuture = RpcContext.getContext().getFuture(); \n \n<span class=\"hljs-comment\">// 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成</span>\n \n<span class=\"hljs-comment\">// 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒</span>\nFoo foo = fooFuture.get(); \n<span class=\"hljs-comment\">// 同理等待bar返回</span>\nBar bar = barFuture.get(); \n \n<span class=\"hljs-comment\">// 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。</span>\n</code></pre>\n<p>你也可以设置是否等待消息发出: <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<ul>\n<li><code>sent=&quot;true&quot;</code> 等待消息发出,消息发送失败将抛出异常。</li>\n<li><code>sent=&quot;false&quot;</code> 不等待消息发出,将消息放入 IO 队列,即刻返回。</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">sent</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>如果你只是想异步,完全忽略返回值,可以配置 <code>return=&quot;false&quot;</code>,以减少 Future 对象的创建和管理成本:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">return</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.0.6</code> 及其以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>异步总是不等待返回 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>异步调用</h1>\n<p>基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p><img src=\"../sources/images/future.jpg\" alt=\"/user-guide/images/future.jpg\"></p>\n<p>在 consumer.xml 中配置:</p>\n<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\">\"fooService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.foo.FooService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.bar.BarService\"</span>&gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>调用代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// 此调用会立即返回null</span>\nfooService.findFoo(fooId);\n<span class=\"hljs-comment\">// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future</span>\nFuture&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture(); \n \n<span class=\"hljs-comment\">// 此调用会立即返回null</span>\nbarService.findBar(barId);\n<span class=\"hljs-comment\">// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future</span>\nFuture&lt;Bar&gt; barFuture = RpcContext.getContext().getFuture(); \n \n<span class=\"hljs-comment\">// 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成</span>\n \n<span class=\"hljs-comment\">// 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒</span>\nFoo foo = fooFuture.get(); \n<span class=\"hljs-comment\">// 同理等待bar返回</span>\nBar bar = barFuture.get(); \n \n<span class=\"hljs-comment\">// 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。</span>\n</code></pre>\n<p>你也可以设置是否等待消息发出: <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<ul>\n<li><code>sent=&quot;true&quot;</code> 等待消息发出,消息发送失败将抛出异常。</li>\n<li><code>sent=&quot;false&quot;</code> 不等待消息发出,将消息放入 IO 队列,即刻返回。</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">sent</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>如果你只是想异步,完全忽略返回值,可以配置 <code>return=&quot;false&quot;</code>,以减少 Future 对象的创建和管理成本:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">return</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.0.6</code> 及其以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>异步总是不等待返回 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/async-call.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/attachment.json b/zh-cn/docs/user/demos/attachment.json
index bd457561..55c6553d 100644
--- a/zh-cn/docs/user/demos/attachment.json
+++ b/zh-cn/docs/user/demos/attachment.json
@@ -1,4 +1,6 @@
 {
   "filename": "attachment.md",
-  "__html": "<h1>隐式参数</h1>\n<p>可以通过 <code>RpcContext</code> 上的 <code>setAttachment</code> 和 <code>getAttachment</code> 在服务消费方和提供方之间进行参数的隐式传递。 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p><img src=\"../sources/images/context.png\" alt=\"/user-guide/images/context.png\"></p>\n<h4>在服务消费方端设置隐式参数</h4>\n<p><code>setAttachment</code> 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。</p>\n<pre><code class=\"language-xml\">RpcContext.getContext().setAttachment(\"index\", \"1\"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用\nxxxService.xxx(); // 远程调用\n// ...\n</code></pre>\n<h4>在服务提供方端获取隐式参数</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用</span>\n        String index = RpcContext.getContext().getAttachment(<span class=\"hljs-string\">\"index\"</span>); \n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使用其它值。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>隐式参数</h1>\n<p>可以通过 <code>RpcContext</code> 上的 <code>setAttachment</code> 和 <code>getAttachment</code> 在服务消费方和提供方之间进行参数的隐式传递。 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<p><img src=\"../sources/images/context.png\" alt=\"/user-guide/images/context.png\"></p>\n<h4>在服务消费方端设置隐式参数</h4>\n<p><code>setAttachment</code> 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。</p>\n<pre><code class=\"language-xml\">RpcContext.getContext().setAttachment(\"index\", \"1\"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用\nxxxService.xxx(); // 远程调用\n// ...\n</code></pre>\n<h4>在服务提供方端获取隐式参数</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用</span>\n        String index = RpcContext.getContext().getAttachment(<span class=\"hljs-string\">\"index\"</span>); \n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使用其它值。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/attachment.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/callback-parameter.json b/zh-cn/docs/user/demos/callback-parameter.json
index df2f01bb..b3f15b30 100644
--- a/zh-cn/docs/user/demos/callback-parameter.json
+++ b/zh-cn/docs/user/demos/callback-parameter.json
@@ -1,4 +1,6 @@
 {
   "filename": "callback-parameter.md",
-  "__html": "<h1>参数回调</h1>\n<p>参数回调方式与调用本地 callback 或 listener 相同,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。可以参考 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback\">dubbo 项目中的示例代码</a>。</p>\n<h4>服务接口示例</h4>\n<h6>CallbackService.java</h6>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span></span>;\n}\n</code></pre>\n<h6>CallbackListener.java</h6>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span></span>;\n}\n</code></pre>\n<h4>服务提供者接口实现示例</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback.impl;\n \n<span class=\"hljs-keyword\">import</span> java.text.SimpleDateFormat;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n<span class=\"hljs-keyword\">import</span> java.util.Map;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.ConcurrentHashMap;\n \n<span class=\"hljs-keyword\">import</span> com.callback.CallbackListener;\n<span class=\"hljs-keyword\">import</span> com.callback.CallbackService;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CallbackServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n     \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Map&lt;String, CallbackListener&gt; listeners = <span class=\"hljs-keyword\">new</span> ConcurrentHashMap&lt;String, CallbackListener&gt;();\n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">CallbackServiceImpl</span><span class=\"hljs-params\">()</span> </span>{\n        Thread t = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">while</span>(<span class=\"hljs-keyword\">true</span>) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        <span class=\"hljs-keyword\">for</span>(Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()){\n                           <span class=\"hljs-keyword\">try</span> {\n                               entry.getValue().changed(getChanged(entry.getKey()));\n                           } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                               listeners.remove(entry.getKey());\n                           }\n                        }\n                        Thread.sleep(<span class=\"hljs-number\">5000</span>); <span class=\"hljs-comment\">// 定时触发变更通知</span>\n                    } <span class=\"hljs-keyword\">catch</span> (Throwable t) { <span class=\"hljs-comment\">// 防御容错</span>\n                        t.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.setDaemon(<span class=\"hljs-keyword\">true</span>);\n        t.start();\n    }\n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span> </span>{\n        listeners.put(key, listener);\n        listener.changed(getChanged(key)); <span class=\"hljs-comment\">// 发送变更通知</span>\n    }\n     \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> String <span class=\"hljs-title\">getChanged</span><span class=\"hljs-params\">(String key)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Changed: \"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date());\n    }\n}\n</code></pre>\n<h4>服务提供者配置示例</h4>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.callback.impl.CallbackServiceImpl\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"callbackService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"addListener\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--也可以通过指定类型的方式--&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--&lt;dubbo:argument type=\"com.demo.CallbackListener\" callback=\"true\" /&gt;--&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h4>服务消费者配置示例</h4>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> /&gt;</span>\n</code></pre>\n<h4>服务消费者调用示例</h4>\n<pre><code class=\"language-java\">ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"classpath:consumer.xml\"</span>);\ncontext.start();\n \nCallbackService callbackService = (CallbackService) context.getBean(<span class=\"hljs-string\">\"callbackService\"</span>);\n \ncallbackService.addListener(<span class=\"hljs-string\">\"foo.bar\"</span>, <span class=\"hljs-keyword\">new</span> CallbackListener(){\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"callback1:\"</span> + msg);\n    }\n});\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.0.6</code> 及其以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>参数回调</h1>\n<p>参数回调方式与调用本地 callback 或 listener 相同,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。可以参考 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback\">dubbo 项目中的示例代码</a>。</p>\n<h4>服务接口示例</h4>\n<h6>CallbackService.java</h6>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span></span>;\n}\n</code></pre>\n<h6>CallbackListener.java</h6>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">CallbackListener</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span></span>;\n}\n</code></pre>\n<h4>服务提供者接口实现示例</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.callback.impl;\n \n<span class=\"hljs-keyword\">import</span> java.text.SimpleDateFormat;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n<span class=\"hljs-keyword\">import</span> java.util.Map;\n<span class=\"hljs-keyword\">import</span> java.util.concurrent.ConcurrentHashMap;\n \n<span class=\"hljs-keyword\">import</span> com.callback.CallbackListener;\n<span class=\"hljs-keyword\">import</span> com.callback.CallbackService;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CallbackServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">CallbackService</span> </span>{\n     \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> Map&lt;String, CallbackListener&gt; listeners = <span class=\"hljs-keyword\">new</span> ConcurrentHashMap&lt;String, CallbackListener&gt;();\n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-title\">CallbackServiceImpl</span><span class=\"hljs-params\">()</span> </span>{\n        Thread t = <span class=\"hljs-keyword\">new</span> Thread(<span class=\"hljs-keyword\">new</span> Runnable() {\n            <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">run</span><span class=\"hljs-params\">()</span> </span>{\n                <span class=\"hljs-keyword\">while</span>(<span class=\"hljs-keyword\">true</span>) {\n                    <span class=\"hljs-keyword\">try</span> {\n                        <span class=\"hljs-keyword\">for</span>(Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()){\n                           <span class=\"hljs-keyword\">try</span> {\n                               entry.getValue().changed(getChanged(entry.getKey()));\n                           } <span class=\"hljs-keyword\">catch</span> (Throwable t) {\n                               listeners.remove(entry.getKey());\n                           }\n                        }\n                        Thread.sleep(<span class=\"hljs-number\">5000</span>); <span class=\"hljs-comment\">// 定时触发变更通知</span>\n                    } <span class=\"hljs-keyword\">catch</span> (Throwable t) { <span class=\"hljs-comment\">// 防御容错</span>\n                        t.printStackTrace();\n                    }\n                }\n            }\n        });\n        t.setDaemon(<span class=\"hljs-keyword\">true</span>);\n        t.start();\n    }\n  \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">addListener</span><span class=\"hljs-params\">(String key, CallbackListener listener)</span> </span>{\n        listeners.put(key, listener);\n        listener.changed(getChanged(key)); <span class=\"hljs-comment\">// 发送变更通知</span>\n    }\n     \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private</span> String <span class=\"hljs-title\">getChanged</span><span class=\"hljs-params\">(String key)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Changed: \"</span> + <span class=\"hljs-keyword\">new</span> SimpleDateFormat(<span class=\"hljs-string\">\"yyyy-MM-dd HH:mm:ss\"</span>).format(<span class=\"hljs-keyword\">new</span> Date());\n    }\n}\n</code></pre>\n<h4>服务提供者配置示例</h4>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.callback.impl.CallbackServiceImpl\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"callbackService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callbacks</span>=<span class=\"hljs-string\">\"1000\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"addListener\"</span>&gt;</span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:argument</span> <span class=\"hljs-attr\">index</span>=<span class=\"hljs-string\">\"1\"</span> <span class=\"hljs-attr\">callback</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--也可以通过指定类型的方式--&gt;</span>\n        <span class=\"hljs-comment\">&lt;!--&lt;dubbo:argument type=\"com.demo.CallbackListener\" callback=\"true\" /&gt;--&gt;</span>\n    <span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:method</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h4>服务消费者配置示例</h4>\n<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\">\"callbackService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.callback.CallbackService\"</span> /&gt;</span>\n</code></pre>\n<h4>服务消费者调用示例</h4>\n<pre><code class=\"language-java\">ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-string\">\"classpath:consumer.xml\"</span>);\ncontext.start();\n \nCallbackService callbackService = (CallbackService) context.getBean(<span class=\"hljs-string\">\"callbackService\"</span>);\n \ncallbackService.addListener(<span class=\"hljs-string\">\"foo.bar\"</span>, <span class=\"hljs-keyword\">new</span> CallbackListener(){\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">changed</span><span class=\"hljs-params\">(String msg)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"callback1:\"</span> + msg);\n    }\n});\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.0.6</code> 及其以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/callback-parameter.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/concurrency-control.json b/zh-cn/docs/user/demos/concurrency-control.json
index 74045ed6..e295c096 100644
--- a/zh-cn/docs/user/demos/concurrency-control.json
+++ b/zh-cn/docs/user/demos/concurrency-control.json
@@ -1,4 +1,6 @@
 {
   "filename": "concurrency-control.md",
-  "__html": "<h1>并发控制</h1>\n<h2>配置样例</h2>\n<h3>样例 1</h3>\n<p>限制 <code>com.foo.BarService</code> 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h3>样例 2</h3>\n<p>限制 <code>com.foo.BarService</code> 的 <code>sayHello</code> 方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h3>样例 3</h3>\n<p>限制 <code>com.foo.BarService</code> 的每个方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h3>样例 4</h3>\n<p>限制 <code>com.foo.BarService</code> 的 <code>sayHello</code> 方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>如果 <code>&lt;dubbo:service&gt;</code> 和 <code>&lt;dubbo:reference&gt;</code> 都配了actives,<code>&lt;dubbo:reference&gt;</code> 优先,参见:<a href=\"../configuration/xml.md#%E9%85%8D%E7%BD%AE%E8%A6%86%E7%9B%96%E5%85%B3%E7%B3%BB\">配置的覆盖策略</a>。</p>\n<h2>Load Balance 均衡</h2>\n<p>配置服务的客户端的 <code>loadbalance</code> 属性为 <code>leastactive</code>,此 Loadbalance 会调用并发数最小的 Provider(Consumer端并发数)。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>并发控制</h1>\n<h2>配置样例</h2>\n<h3>样例 1</h3>\n<p>限制 <code>com.foo.BarService</code> 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h3>样例 2</h3>\n<p>限制 <code>com.foo.BarService</code> 的 <code>sayHello</code> 方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h3>样例 3</h3>\n<p>限制 <code>com.foo.BarService</code> 的每个方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h3>样例 4</h3>\n<p>限制 <code>com.foo.BarService</code> 的 <code>sayHello</code> 方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"sayHello\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>如果 <code>&lt;dubbo:service&gt;</code> 和 <code>&lt;dubbo:reference&gt;</code> 都配了actives,<code>&lt;dubbo:reference&gt;</code> 优先,参见:<a href=\"../configuration/xml.md#%E9%85%8D%E7%BD%AE%E8%A6%86%E7%9B%96%E5%85%B3%E7%B3%BB\">配置的覆盖策略</a>。</p>\n<h2>Load Balance 均衡</h2>\n<p>配置服务的客户端的 <code>loadbalance</code> 属性为 <code>leastactive</code>,此 Loadbalance 会调用并发数最小的 Provider(Consumer端并发数)。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/concurrency-control.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/config-connections.json b/zh-cn/docs/user/demos/config-connections.json
index bd79c54b..0ac796b4 100644
--- a/zh-cn/docs/user/demos/config-connections.json
+++ b/zh-cn/docs/user/demos/config-connections.json
@@ -1,4 +1,6 @@
 {
   "filename": "config-connections.md",
-  "__html": "<h1>连接控制</h1>\n<h2>服务端连接控制</h2>\n<p>限制服务器端接受的连接不能超过 10 个 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h2>客户端连接控制</h2>\n<p>限制客户端服务使用连接不能超过 10 个 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>如果 <code>&lt;dubbo:service&gt;</code> 和 <code>&lt;dubbo:reference&gt;</code> 都配了 connections,<code>&lt;dubbo:reference&gt;</code> 优先,参见:<a href=\"../configuration/xml.md\">配置的覆盖策略</a></p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>因为连接在 Server上,所以配置在 Provider 上 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>如果是长连接,比如 Dubbo 协议,connections 表示该服务对每个提供者建立的长连接数 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>连接控制</h1>\n<h2>服务端连接控制</h2>\n<p>限制服务器端接受的连接不能超过 10 个 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h2>客户端连接控制</h2>\n<p>限制客户端服务使用连接不能超过 10 个 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<p>如果 <code>&lt;dubbo:service&gt;</code> 和 <code>&lt;dubbo:reference&gt;</code> 都配了 connections,<code>&lt;dubbo:reference&gt;</code> 优先,参见:<a href=\"../configuration/xml.md\">配置的覆盖策略</a></p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>因为连接在 Server上,所以配置在 Provider 上 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>如果是长连接,比如 Dubbo 协议,connections 表示该服务对每个提供者建立的长连接数 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/config-connections.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/config-rule.json b/zh-cn/docs/user/demos/config-rule.json
index a6e4ce9f..ccadb630 100644
--- a/zh-cn/docs/user/demos/config-rule.json
+++ b/zh-cn/docs/user/demos/config-rule.json
@@ -1,4 +1,6 @@
 {
   "filename": "config-rule.md",
-  "__html": "<h1>配置规则</h1>\n<p>向注册中心写入动态配置覆盖规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。该功能通常由监控中心或治理中心的页面完成。</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000\"</span>));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>override://</code> 表示数据采用覆盖方式,支持 <code>override</code> 和 <code>absent</code>,可扩展,<strong>必填</strong>。</li>\n<li><code>0.0.0.0</code> 表示对所有 IP 地址生效,如果只想覆盖某个 IP 的数据,请填入具体 IP,<strong>必填</strong>。</li>\n<li><code>com.foo.BarService</code> 表示只对指定服务生效,<strong>必填</strong>。</li>\n<li><code>category=configurators</code> 表示该数据为动态配置类型,<strong>必填</strong>。</li>\n<li><code>dynamic=false</code> 表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,<strong>必填</strong>。</li>\n<li><code>enabled=true</code> 覆盖规则是否生效,可不填,缺省生效。</li>\n<li><code>application=foo</code> 表示只对指定应用生效,可不填,表示对所有应用生效。</li>\n<li><code>timeout=1000</code> 表示将满足以上条件的 <code>timeout</code> 参数的值覆盖为 1000。如果想覆盖其它参数,直接加在 <code>override</code> 的 URL 参数上。</li>\n</ul>\n<p>示例:</p>\n<ol>\n<li>\n<p>禁用提供者:(通常用于临时踢除某台提供者机器,相似的,禁止消费者访问请使用路由规则)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;disbaled=true\n</code></pre>\n</li>\n<li>\n<p>调整权重:(通常用于容量评估,缺省权重为 100)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;weight=200\n</code></pre>\n</li>\n<li>\n<p>调整负载均衡策略:(缺省负载均衡策略为 random)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;loadbalance=leastactive\n</code></pre>\n</li>\n<li>\n<p>服务降级:(通常用于临时屏蔽某个出错的非关键服务)</p>\n<pre><code>override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>配置规则</h1>\n<p>向注册中心写入动态配置覆盖规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。该功能通常由监控中心或治理中心的页面完成。</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000\"</span>));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>override://</code> 表示数据采用覆盖方式,支持 <code>override</code> 和 <code>absent</code>,可扩展,<strong>必填</strong>。</li>\n<li><code>0.0.0.0</code> 表示对所有 IP 地址生效,如果只想覆盖某个 IP 的数据,请填入具体 IP,<strong>必填</strong>。</li>\n<li><code>com.foo.BarService</code> 表示只对指定服务生效,<strong>必填</strong>。</li>\n<li><code>category=configurators</code> 表示该数据为动态配置类型,<strong>必填</strong>。</li>\n<li><code>dynamic=false</code> 表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,<strong>必填</strong>。</li>\n<li><code>enabled=true</code> 覆盖规则是否生效,可不填,缺省生效。</li>\n<li><code>application=foo</code> 表示只对指定应用生效,可不填,表示对所有应用生效。</li>\n<li><code>timeout=1000</code> 表示将满足以上条件的 <code>timeout</code> 参数的值覆盖为 1000。如果想覆盖其它参数,直接加在 <code>override</code> 的 URL 参数上。</li>\n</ul>\n<p>示例:</p>\n<ol>\n<li>\n<p>禁用提供者:(通常用于临时踢除某台提供者机器,相似的,禁止消费者访问请使用路由规则)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;disbaled=true\n</code></pre>\n</li>\n<li>\n<p>调整权重:(通常用于容量评估,缺省权重为 100)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;weight=200\n</code></pre>\n</li>\n<li>\n<p>调整负载均衡策略:(缺省负载均衡策略为 random)</p>\n<pre><code>override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;loadbalance=leastactive\n</code></pre>\n</li>\n<li>\n<p>服务降级:(通常用于临时屏蔽某个出错的非关键服务)</p>\n<pre><code>override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/config-rule.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/context.json b/zh-cn/docs/user/demos/context.json
index ff004687..c81e0d6a 100644
--- a/zh-cn/docs/user/demos/context.json
+++ b/zh-cn/docs/user/demos/context.json
@@ -1,4 +1,6 @@
 {
   "filename": "context.md",
-  "__html": "<h1>上下文信息</h1>\n<p>上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为 URL 的参数,参见 <a href=\"../references/xml/introduction.md\">schema 配置参考手册</a> 中的<strong>对应URL参数</strong>一列。</p>\n<p>RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。比如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 的信息,在 B 调 C 之后,RpcContext 记录的是 B 调 C 的信息。</p>\n<h2>服务消费方</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// 远程调用</span>\nxxxService.xxx();\n<span class=\"hljs-comment\">// 本端是否为消费端,这里会返回true</span>\n<span class=\"hljs-keyword\">boolean</span> isConsumerSide = RpcContext.getContext().isConsumerSide();\n<span class=\"hljs-comment\">// 获取最后一次调用的提供方IP地址</span>\nString serverIP = RpcContext.getContext().getRemoteHost();\n<span class=\"hljs-comment\">// 获取当前服务配置信息,所有配置信息都将转换为URL的参数</span>\nString application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n<span class=\"hljs-comment\">// 注意:每发起RPC调用,上下文状态会变化</span>\nyyyService.yyy();\n</code></pre>\n<h2>服务提供方</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// 本端是否为提供端,这里会返回true</span>\n        <span class=\"hljs-keyword\">boolean</span> isProviderSide = RpcContext.getContext().isProviderSide();\n        <span class=\"hljs-comment\">// 获取调用方IP地址</span>\n        String clientIP = RpcContext.getContext().getRemoteHost();\n        <span class=\"hljs-comment\">// 获取当前服务配置信息,所有配置信息都将转换为URL的参数</span>\n        String application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n        <span class=\"hljs-comment\">// 注意:每发起RPC调用,上下文状态会变化</span>\n        yyyService.yyy();\n        <span class=\"hljs-comment\">// 此时本端变成消费端,这里会返回false</span>\n        <span class=\"hljs-keyword\">boolean</span> isProviderSide = RpcContext.getContext().isProviderSide();\n    } \n}\n</code></pre>\n"
+  "__html": "<h1>上下文信息</h1>\n<p>上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为 URL 的参数,参见 <a href=\"../references/xml/introduction.md\">schema 配置参考手册</a> 中的<strong>对应URL参数</strong>一列。</p>\n<p>RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。比如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 的信息,在 B 调 C 之后,RpcContext 记录的是 B 调 C 的信息。</p>\n<h2>服务消费方</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// 远程调用</span>\nxxxService.xxx();\n<span class=\"hljs-comment\">// 本端是否为消费端,这里会返回true</span>\n<span class=\"hljs-keyword\">boolean</span> isConsumerSide = RpcContext.getContext().isConsumerSide();\n<span class=\"hljs-comment\">// 获取最后一次调用的提供方IP地址</span>\nString serverIP = RpcContext.getContext().getRemoteHost();\n<span class=\"hljs-comment\">// 获取当前服务配置信息,所有配置信息都将转换为URL的参数</span>\nString application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n<span class=\"hljs-comment\">// 注意:每发起RPC调用,上下文状态会变化</span>\nyyyService.yyy();\n</code></pre>\n<h2>服务提供方</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">XxxServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">XxxService</span> </span>{\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">xxx</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-comment\">// 本端是否为提供端,这里会返回true</span>\n        <span class=\"hljs-keyword\">boolean</span> isProviderSide = RpcContext.getContext().isProviderSide();\n        <span class=\"hljs-comment\">// 获取调用方IP地址</span>\n        String clientIP = RpcContext.getContext().getRemoteHost();\n        <span class=\"hljs-comment\">// 获取当前服务配置信息,所有配置信息都将转换为URL的参数</span>\n        String application = RpcContext.getContext().getUrl().getParameter(<span class=\"hljs-string\">\"application\"</span>);\n        <span class=\"hljs-comment\">// 注意:每发起RPC调用,上下文状态会变化</span>\n        yyyService.yyy();\n        <span class=\"hljs-comment\">// 此时本端变成消费端,这里会返回false</span>\n        <span class=\"hljs-keyword\">boolean</span> isProviderSide = RpcContext.getContext().isProviderSide();\n    } \n}\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/context.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/delay-publish.json b/zh-cn/docs/user/demos/delay-publish.json
index ad88181c..47a0e649 100644
--- a/zh-cn/docs/user/demos/delay-publish.json
+++ b/zh-cn/docs/user/demos/delay-publish.json
@@ -1,4 +1,6 @@
 {
   "filename": "delay-publish.md",
-  "__html": "<h1>延迟暴露</h1>\n<p>如果你的服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露。我们在 Dubbo 2.6.5 版本中对服务延迟暴露逻辑进行了细微的调整,将需要延迟暴露(delay &gt; 0)服务的倒计时动作推迟到了 Spring 初始化完成后进行。你在使用 Dubbo 的过程中,并不会感知到此变化,因此请放心使用。</p>\n<h2>Dubbo-2.6.5 之前版本</h2>\n<h3>延迟到 Spring 初始化完成后,再暴露服务<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"-1\"</span> /&gt;</span>\n</code></pre>\n<h3>延迟 5 秒暴露服务</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h2>Dubbo-2.6.5 及以后版本</h2>\n<p>所有服务都将在 Spring 初始化完成后进行暴露,如果你不需要延迟暴露服务,无需配置 delay。</p>\n<h4>延迟 5 秒暴露服务</h4>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h2>Spring 2.x 初始化死锁问题</h2>\n<h3>触发条件</h3>\n<p>在 Spring 解析到 <code>&lt;dubbo:service /&gt;</code> 时,就已经向外暴露了服务,而 Spring 还在接着初始化其它 Bean。如果这时有请求进来,并且服务的实现类里有调用 <code>applicationContext.getBean()</code> 的用法。</p>\n<ol>\n<li>\n<p>请求线程的 applicationContext.getBean() 调用,先同步 singletonObjects 判断 Bean 是否存在,不存在就同步 beanDefinitionMap 进行初始化,并再次同步 singletonObjects 写入 Bean 实例缓存。</p>\n<p><img src=\"../sources/images/lock-get-bean.jpg\" alt=\"deadlock\"></p>\n</li>\n<li>\n<p>而 Spring 初始化线程,因不需要判断 Bean 的存在,直接同步 beanDefinitionMap 进行初始化,并同步 singletonObjects 写入 Bean 实例缓存。</p>\n<p><img src=\"../sources/images/lock-init-context.jpg\" alt=\"/user-guide/images/lock-init-context.jpg\"></p>\n<p>这样就导致 getBean 线程,先锁 singletonObjects,再锁 beanDefinitionMap,再次锁 singletonObjects。<br>\n而 Spring 初始化线程,先锁 beanDefinitionMap,再锁 singletonObjects。反向锁导致线程死锁,不能提供服务,启动不了。</p>\n</li>\n</ol>\n<h3>规避办法</h3>\n<ol>\n<li>强烈建议不要在服务的实现类中有 applicationContext.getBean() 的调用,全部采用 IoC 注入的方式使用 Spring的Bean。</li>\n<li>如果实在要调 getBean(),可以将 Dubbo 的配置放在 Spring 的最后加载。</li>\n<li>如果不想依赖配置顺序,可以使用 <code>&lt;dubbo:provider delay=”-1” /&gt;</code>,使 Dubbo 在 Spring 容器初始化完后,再暴露服务。</li>\n<li>如果大量使用 getBean(),相当于已经把 Spring 退化为工厂模式在用,可以将 Dubbo 的服务隔离单独的 Spring 容器。</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>基于 Spring 的 ContextRefreshedEvent 事件触发暴露 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>延迟暴露</h1>\n<p>如果你的服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露。我们在 Dubbo 2.6.5 版本中对服务延迟暴露逻辑进行了细微的调整,将需要延迟暴露(delay &gt; 0)服务的倒计时动作推迟到了 Spring 初始化完成后进行。你在使用 Dubbo 的过程中,并不会感知到此变化,因此请放心使用。</p>\n<h2>Dubbo-2.6.5 之前版本</h2>\n<h3>延迟到 Spring 初始化完成后,再暴露服务<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"-1\"</span> /&gt;</span>\n</code></pre>\n<h3>延迟 5 秒暴露服务</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h2>Dubbo-2.6.5 及以后版本</h2>\n<p>所有服务都将在 Spring 初始化完成后进行暴露,如果你不需要延迟暴露服务,无需配置 delay。</p>\n<h4>延迟 5 秒暴露服务</h4>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">delay</span>=<span class=\"hljs-string\">\"5000\"</span> /&gt;</span>\n</code></pre>\n<h2>Spring 2.x 初始化死锁问题</h2>\n<h3>触发条件</h3>\n<p>在 Spring 解析到 <code>&lt;dubbo:service /&gt;</code> 时,就已经向外暴露了服务,而 Spring 还在接着初始化其它 Bean。如果这时有请求进来,并且服务的实现类里有调用 <code>applicationContext.getBean()</code> 的用法。</p>\n<ol>\n<li>\n<p>请求线程的 applicationContext.getBean() 调用,先同步 singletonObjects 判断 Bean 是否存在,不存在就同步 beanDefinitionMap 进行初始化,并再次同步 singletonObjects 写入 Bean 实例缓存。</p>\n<p><img src=\"../sources/images/lock-get-bean.jpg\" alt=\"deadlock\"></p>\n</li>\n<li>\n<p>而 Spring 初始化线程,因不需要判断 Bean 的存在,直接同步 beanDefinitionMap 进行初始化,并同步 singletonObjects 写入 Bean 实例缓存。</p>\n<p><img src=\"../sources/images/lock-init-context.jpg\" alt=\"/user-guide/images/lock-init-context.jpg\"></p>\n<p>这样就导致 getBean 线程,先锁 singletonObjects,再锁 beanDefinitionMap,再次锁 singletonObjects。<br>\n而 Spring 初始化线程,先锁 beanDefinitionMap,再锁 singletonObjects。反向锁导致线程死锁,不能提供服务,启动不了。</p>\n</li>\n</ol>\n<h3>规避办法</h3>\n<ol>\n<li>强烈建议不要在服务的实现类中有 applicationContext.getBean() 的调用,全部采用 IoC 注入的方式使用 Spring的Bean。</li>\n<li>如果实在要调 getBean(),可以将 Dubbo 的配置放在 Spring 的最后加载。</li>\n<li>如果不想依赖配置顺序,可以使用 <code>&lt;dubbo:provider delay=”-1” /&gt;</code>,使 Dubbo 在 Spring 容器初始化完后,再暴露服务。</li>\n<li>如果大量使用 getBean(),相当于已经把 Spring 退化为工厂模式在用,可以将 Dubbo 的服务隔离单独的 Spring 容器。</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>基于 Spring 的 ContextRefreshedEvent 事件触发暴露 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/delay-publish.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/distributed-transaction.json b/zh-cn/docs/user/demos/distributed-transaction.json
index 50d4ec37..a18e4ef2 100644
--- a/zh-cn/docs/user/demos/distributed-transaction.json
+++ b/zh-cn/docs/user/demos/distributed-transaction.json
@@ -1,4 +1,6 @@
 {
   "filename": "distributed-transaction.md",
-  "__html": "<h1>分布式事务</h1>\n<p>分布式事务基于 JTA/XA 规范实现 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<p>两阶段提交:</p>\n<p><img src=\"../sources/images/jta-xa.jpg\" alt=\"/user-guide/images/jta-xa.jpg\"></p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>本功能暂未实现 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>分布式事务</h1>\n<p>分布式事务基于 JTA/XA 规范实现 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<p>两阶段提交:</p>\n<p><img src=\"../sources/images/jta-xa.jpg\" alt=\"/user-guide/images/jta-xa.jpg\"></p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>本功能暂未实现 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/distributed-transaction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/dump.json b/zh-cn/docs/user/demos/dump.json
index 8ac31d8c..54fb99bd 100644
--- a/zh-cn/docs/user/demos/dump.json
+++ b/zh-cn/docs/user/demos/dump.json
@@ -1,4 +1,6 @@
 {
   "filename": "dump.md",
-  "__html": "<p>当业务线程池满时,我们需要知道线程都在等待哪些资源、条件,以找到系统的瓶颈点或异常点。dubbo通过Jstack自动导出线程堆栈来保留现场,方便排查问题</p>\n<p>默认策略:</p>\n<ul>\n<li>导出路径,user.home标识的用户主目录</li>\n<li>导出间隔,最短间隔允许每隔10分钟导出一次</li>\n</ul>\n<p>指定导出路径:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.application.dump.directory</span>=<span class=\"hljs-string\">/tmp</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">...</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"dump.directory\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"/tmp\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<p>当业务线程池满时,我们需要知道线程都在等待哪些资源、条件,以找到系统的瓶颈点或异常点。dubbo通过Jstack自动导出线程堆栈来保留现场,方便排查问题</p>\n<p>默认策略:</p>\n<ul>\n<li>导出路径,user.home标识的用户主目录</li>\n<li>导出间隔,最短间隔允许每隔10分钟导出一次</li>\n</ul>\n<p>指定导出路径:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.application.dump.directory</span>=<span class=\"hljs-string\">/tmp</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">...</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"dump.directory\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"/tmp\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:application</span>&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/dump.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/echo-service.json b/zh-cn/docs/user/demos/echo-service.json
index 0723f996..fcff3127 100644
--- a/zh-cn/docs/user/demos/echo-service.json
+++ b/zh-cn/docs/user/demos/echo-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "echo-service.md",
-  "__html": "<h1>回声测试</h1>\n<p>回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。</p>\n<p>所有服务自动实现 <code>EchoService</code> 接口,只需将任意服务引用强制转型为 <code>EchoService</code>,即可使用。</p>\n<p>Spring 配置:</p>\n<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\">\"memberService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MemberService\"</span> /&gt;</span>\n</code></pre>\n<p>代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// 远程服务引用</span>\nMemberService memberService = ctx.getBean(<span class=\"hljs-string\">\"memberService\"</span>); \n \nEchoService echoService = (EchoService) memberService; <span class=\"hljs-comment\">// 强制转型为EchoService</span>\n\n<span class=\"hljs-comment\">// 回声测试可用性</span>\nString status = echoService.$echo(<span class=\"hljs-string\">\"OK\"</span>); \n \n<span class=\"hljs-keyword\">assert</span>(status.equals(<span class=\"hljs-string\">\"OK\"</span>));\n</code></pre>\n"
+  "__html": "<h1>回声测试</h1>\n<p>回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。</p>\n<p>所有服务自动实现 <code>EchoService</code> 接口,只需将任意服务引用强制转型为 <code>EchoService</code>,即可使用。</p>\n<p>Spring 配置:</p>\n<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\">\"memberService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MemberService\"</span> /&gt;</span>\n</code></pre>\n<p>代码:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">// 远程服务引用</span>\nMemberService memberService = ctx.getBean(<span class=\"hljs-string\">\"memberService\"</span>); \n \nEchoService echoService = (EchoService) memberService; <span class=\"hljs-comment\">// 强制转型为EchoService</span>\n\n<span class=\"hljs-comment\">// 回声测试可用性</span>\nString status = echoService.$echo(<span class=\"hljs-string\">\"OK\"</span>); \n \n<span class=\"hljs-keyword\">assert</span>(status.equals(<span class=\"hljs-string\">\"OK\"</span>));\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/echo-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/events-notify.json b/zh-cn/docs/user/demos/events-notify.json
index 3f8b896d..74e13f63 100644
--- a/zh-cn/docs/user/demos/events-notify.json
+++ b/zh-cn/docs/user/demos/events-notify.json
@@ -1,4 +1,6 @@
 {
   "filename": "events-notify.md",
-  "__html": "<h1>事件通知</h1>\n<p>在调用之前、调用之后、出现异常时,会触发 <code>oninvoke</code>、<code>onreturn</code>、<code>onthrow</code> 三个事件,可以配置当事件发生时,通知哪个类的哪个方法 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h4>服务提供者与消费者共享服务接口</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span></span>;\n}\n</code></pre>\n<h4>服务提供者实现</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NormalDemoService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Person(id, <span class=\"hljs-string\">\"charles`son\"</span>, <span class=\"hljs-number\">4</span>);\n    }\n}\n</code></pre>\n<h4>服务提供者配置</h4>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rpc-callback-demo\"</span> /&gt;</span>\n<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>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NormalDemoService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span>/&gt;</span>\n</code></pre>\n<h4>服务消费者 Callback 接口</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span></span>;\n}\n</code></pre>\n<h4>服务消费者 Callback 实现</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NotifyImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Person&gt;    ret    = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Person&gt;();\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Throwable&gt; errors = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Throwable&gt;();\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"onreturn:\"</span> + msg);\n        ret.put(id, msg);\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span> </span>{\n        errors.put(id, ex);\n    }\n}\n</code></pre>\n<h4>服务消费者 Callback 配置</h4>\n<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\">\"demoCallback\"</span> <span class=\"hljs-attr\">class</span> = <span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NofifyImpl\"</span> /&gt;</span>\n<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\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span> &gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"get\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">onreturn</span> = <span class=\"hljs-string\">\"demoCallback.onreturn\"</span> <span class=\"hljs-attr\">onthrow</span>=<span class=\"hljs-string\">\"demoCallback.onthrow\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p><code>callback</code> 与 <code>async</code> 功能正交分解,<code>async=true</code> 表示结果是否马上返回,<code>onreturn</code> 表示是否需要回调。</p>\n<p>两者叠加存在以下几种组合情况 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<ul>\n<li>异步回调模式:<code>async=true onreturn=&quot;xxx&quot;</code></li>\n<li>同步回调模式:<code>async=false onreturn=&quot;xxx&quot;</code></li>\n<li>异步无回调 :<code>async=true</code></li>\n<li>同步无回调 :<code>async=false</code></li>\n</ul>\n<h4>测试代码</h4>\n<pre><code class=\"language-java\">IDemoService demoService = (IDemoService) context.getBean(<span class=\"hljs-string\">\"demoService\"</span>);\nNofifyImpl notify = (NofifyImpl) context.getBean(<span class=\"hljs-string\">\"demoCallback\"</span>);\n<span class=\"hljs-keyword\">int</span> requestId = <span class=\"hljs-number\">2</span>;\nPerson ret = demoService.get(requestId);\nAssert.assertEquals(<span class=\"hljs-keyword\">null</span>, ret);\n<span class=\"hljs-comment\">//for Test:只是用来说明callback正常被调用,业务具体实现自行决定.</span>\n<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-number\">10</span>; i++) {\n    <span class=\"hljs-keyword\">if</span> (!notify.ret.containsKey(requestId)) {\n        Thread.sleep(<span class=\"hljs-number\">200</span>);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-keyword\">break</span>;\n    }\n}\nAssert.assertEquals(requestId, notify.ret.get(requestId).getId());\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>支持版本:<code>2.0.7</code> 之后 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><code>async=false</code> 默认 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>事件通知</h1>\n<p>在调用之前、调用之后、出现异常时,会触发 <code>oninvoke</code>、<code>onreturn</code>、<code>onthrow</code> 三个事件,可以配置当事件发生时,通知哪个类的哪个方法 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h4>服务提供者与消费者共享服务接口</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span></span>;\n}\n</code></pre>\n<h4>服务提供者实现</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NormalDemoService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">IDemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Person <span class=\"hljs-title\">get</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> id)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Person(id, <span class=\"hljs-string\">\"charles`son\"</span>, <span class=\"hljs-number\">4</span>);\n    }\n}\n</code></pre>\n<h4>服务提供者配置</h4>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rpc-callback-demo\"</span> /&gt;</span>\n<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>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NormalDemoService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span>/&gt;</span>\n</code></pre>\n<h4>服务消费者 Callback 接口</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span></span>;\n}\n</code></pre>\n<h4>服务消费者 Callback 实现</h4>\n<pre><code class=\"language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NotifyImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Notify</span> </span>{\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Person&gt;    ret    = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Person&gt;();\n    <span class=\"hljs-keyword\">public</span> Map&lt;Integer, Throwable&gt; errors = <span class=\"hljs-keyword\">new</span> HashMap&lt;Integer, Throwable&gt;();\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onreturn</span><span class=\"hljs-params\">(Person msg, Integer id)</span> </span>{\n        System.out.println(<span class=\"hljs-string\">\"onreturn:\"</span> + msg);\n        ret.put(id, msg);\n    }\n    \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">onthrow</span><span class=\"hljs-params\">(Throwable ex, Integer id)</span> </span>{\n        errors.put(id, ex);\n    }\n}\n</code></pre>\n<h4>服务消费者 Callback 配置</h4>\n<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\">\"demoCallback\"</span> <span class=\"hljs-attr\">class</span> = <span class=\"hljs-string\">\"com.alibaba.dubbo.callback.implicit.NofifyImpl\"</span> /&gt;</span>\n<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\">\"com.alibaba.dubbo.callback.implicit.IDemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"cn\"</span> &gt;</span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"get\"</span> <span class=\"hljs-attr\">async</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">onreturn</span> = <span class=\"hljs-string\">\"demoCallback.onreturn\"</span> <span class=\"hljs-attr\">onthrow</span>=<span class=\"hljs-string\">\"demoCallback.onthrow\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p><code>callback</code> 与 <code>async</code> 功能正交分解,<code>async=true</code> 表示结果是否马上返回,<code>onreturn</code> 表示是否需要回调。</p>\n<p>两者叠加存在以下几种组合情况 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<ul>\n<li>异步回调模式:<code>async=true onreturn=&quot;xxx&quot;</code></li>\n<li>同步回调模式:<code>async=false onreturn=&quot;xxx&quot;</code></li>\n<li>异步无回调 :<code>async=true</code></li>\n<li>同步无回调 :<code>async=false</code></li>\n</ul>\n<h4>测试代码</h4>\n<pre><code class=\"language-java\">IDemoService demoService = (IDemoService) context.getBean(<span class=\"hljs-string\">\"demoService\"</span>);\nNofifyImpl notify = (NofifyImpl) context.getBean(<span class=\"hljs-string\">\"demoCallback\"</span>);\n<span class=\"hljs-keyword\">int</span> requestId = <span class=\"hljs-number\">2</span>;\nPerson ret = demoService.get(requestId);\nAssert.assertEquals(<span class=\"hljs-keyword\">null</span>, ret);\n<span class=\"hljs-comment\">//for Test:只是用来说明callback正常被调用,业务具体实现自行决定.</span>\n<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">int</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-number\">10</span>; i++) {\n    <span class=\"hljs-keyword\">if</span> (!notify.ret.containsKey(requestId)) {\n        Thread.sleep(<span class=\"hljs-number\">200</span>);\n    } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-keyword\">break</span>;\n    }\n}\nAssert.assertEquals(requestId, notify.ret.get(requestId).getId());\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>支持版本:<code>2.0.7</code> 之后 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><code>async=false</code> 默认 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/events-notify.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/explicit-target.json b/zh-cn/docs/user/demos/explicit-target.json
index 6570d271..410b9401 100644
--- a/zh-cn/docs/user/demos/explicit-target.json
+++ b/zh-cn/docs/user/demos/explicit-target.json
@@ -1,4 +1,6 @@
 {
   "filename": "explicit-target.md",
-  "__html": "<h1>直连提供者</h1>\n<p>在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。</p>\n<p><img src=\"../sources/images/dubbo-directly.jpg\" alt=\"/user-guide/images/dubbo-directly.jpg\"></p>\n<h2>通过 XML 配置</h2>\n<p>如果是线上需求需要点对点,可在 <code>&lt;dubbo:reference&gt;</code> 中配置 url 指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下  <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"xxxService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"dubbo://localhost:20890\"</span> /&gt;</span>\n</code></pre>\n<h2>通过 -D 参数指定</h2>\n<p>在 JVM 启动参数中加入-D参数映射服务地址 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>,如:</p>\n<pre><code class=\"language-sh\">java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890\n</code></pre>\n<h2>通过文件映射</h2>\n<p>如果服务比较多,也可以用文件映射,用 <code>-Ddubbo.resolve.file</code> 指定映射文件路径,此配置优先级高于 <code>&lt;dubbo:reference&gt;</code> 中的配置 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,如:</p>\n<pre><code class=\"language-sh\">java -Ddubbo.resolve.file=xxx.properties\n</code></pre>\n<p>然后在映射文件 <code>xxx.properties</code> 中加入配置,其中 key 为服务名,value 为服务提供者 URL:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">com.alibaba.xxx.XxxService</span>=<span class=\"hljs-string\">dubbo://localhost:20890</span>\n</code></pre>\n<p><strong>注意</strong>  为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>1.0.6</code> 及以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>key 为服务名,value 为服务提供者 url,此配置优先级最高,<code>1.0.15</code> 及以上版本支持 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p><code>1.0.15</code> 及以上版本支持,<code>2.0</code> 以上版本自动加载 ${user.home}/dubbo-resolve.properties文件,不需要配置 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>直连提供者</h1>\n<p>在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。</p>\n<p><img src=\"../sources/images/dubbo-directly.jpg\" alt=\"/user-guide/images/dubbo-directly.jpg\"></p>\n<h2>通过 XML 配置</h2>\n<p>如果是线上需求需要点对点,可在 <code>&lt;dubbo:reference&gt;</code> 中配置 url 指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下  <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"xxxService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"dubbo://localhost:20890\"</span> /&gt;</span>\n</code></pre>\n<h2>通过 -D 参数指定</h2>\n<p>在 JVM 启动参数中加入-D参数映射服务地址 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>,如:</p>\n<pre><code class=\"language-sh\">java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890\n</code></pre>\n<h2>通过文件映射</h2>\n<p>如果服务比较多,也可以用文件映射,用 <code>-Ddubbo.resolve.file</code> 指定映射文件路径,此配置优先级高于 <code>&lt;dubbo:reference&gt;</code> 中的配置 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,如:</p>\n<pre><code class=\"language-sh\">java -Ddubbo.resolve.file=xxx.properties\n</code></pre>\n<p>然后在映射文件 <code>xxx.properties</code> 中加入配置,其中 key 为服务名,value 为服务提供者 URL:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">com.alibaba.xxx.XxxService</span>=<span class=\"hljs-string\">dubbo://localhost:20890</span>\n</code></pre>\n<p><strong>注意</strong>  为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>1.0.6</code> 及以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>key 为服务名,value 为服务提供者 url,此配置优先级最高,<code>1.0.15</code> 及以上版本支持 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p><code>1.0.15</code> 及以上版本支持,<code>2.0</code> 以上版本自动加载 ${user.home}/dubbo-resolve.properties文件,不需要配置 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/explicit-target.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/fault-tolerent-strategy.json b/zh-cn/docs/user/demos/fault-tolerent-strategy.json
index 312faaf0..cc3fed55 100644
--- a/zh-cn/docs/user/demos/fault-tolerent-strategy.json
+++ b/zh-cn/docs/user/demos/fault-tolerent-strategy.json
@@ -1,4 +1,6 @@
 {
   "filename": "fault-tolerent-strategy.md",
-  "__html": "<h1>集群容错</h1>\n<p>在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。</p>\n<p><img src=\"../sources/images/cluster.jpg\" alt=\"cluster\"></p>\n<p>各节点关系:</p>\n<ul>\n<li>这里的 <code>Invoker</code> 是 <code>Provider</code> 的一个可调用 <code>Service</code> 的抽象,<code>Invoker</code> 封装了 <code>Provider</code> 地址及 <code>Service</code> 接口信息</li>\n<li><code>Directory</code> 代表多个 <code>Invoker</code>,可以把它看成 <code>List&lt;Invoker&gt;</code> ,但与 <code>List</code> 不同的是,它的值可能是动态变化的,比如注册中心推送变更</li>\n<li><code>Cluster</code> 将 <code>Directory</code> 中的多个 <code>Invoker</code> 伪装成一个 <code>Invoker</code>,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个</li>\n<li><code>Router</code> 负责从多个 <code>Invoker</code> 中按路由规则选出子集,比如读写分离,应用隔离等</li>\n<li><code>LoadBalance</code> 负责从多个 <code>Invoker</code> 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选</li>\n</ul>\n<h2>集群容错模式</h2>\n<p>可以自行扩展集群容错策略,参见:<a href=\"../../dev/impls/cluster.md\">集群扩展</a></p>\n<h3>Failover Cluster</h3>\n<p>失败自动切换,当出现失败,重试其它服务器 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。通常用于读操作,但重试会带来更长延迟。可通过 <code>retries=&quot;2&quot;</code> 来设置重试次数(不含第一次)。</p>\n<p>重试次数配置如下:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<h3>Failfast Cluster</h3>\n<p>快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。</p>\n<h3>Failsafe Cluster</h3>\n<p>失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。</p>\n<h3>Failback Cluster</h3>\n<p>失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。</p>\n<h3>Forking Cluster</h3>\n<p>并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 <code>forks=&quot;2&quot;</code> 来设置最大并行数。</p>\n<h3>Broadcast Cluster</h3>\n<p>广播调用所有提供者,逐个调用,任意一台报错则报错 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。通常用于通知所有提供者更新缓存或日志等本地资源信息。</p>\n<h2>集群模式配置</h2>\n<p>按照以下示例在服务提供方和消费方配置集群模式</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>该配置为缺省配置 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><code>2.1.0</code> 开始支持 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>集群容错</h1>\n<p>在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。</p>\n<p><img src=\"../sources/images/cluster.jpg\" alt=\"cluster\"></p>\n<p>各节点关系:</p>\n<ul>\n<li>这里的 <code>Invoker</code> 是 <code>Provider</code> 的一个可调用 <code>Service</code> 的抽象,<code>Invoker</code> 封装了 <code>Provider</code> 地址及 <code>Service</code> 接口信息</li>\n<li><code>Directory</code> 代表多个 <code>Invoker</code>,可以把它看成 <code>List&lt;Invoker&gt;</code> ,但与 <code>List</code> 不同的是,它的值可能是动态变化的,比如注册中心推送变更</li>\n<li><code>Cluster</code> 将 <code>Directory</code> 中的多个 <code>Invoker</code> 伪装成一个 <code>Invoker</code>,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个</li>\n<li><code>Router</code> 负责从多个 <code>Invoker</code> 中按路由规则选出子集,比如读写分离,应用隔离等</li>\n<li><code>LoadBalance</code> 负责从多个 <code>Invoker</code> 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选</li>\n</ul>\n<h2>集群容错模式</h2>\n<p>可以自行扩展集群容错策略,参见:<a href=\"../../dev/impls/cluster.md\">集群扩展</a></p>\n<h3>Failover Cluster</h3>\n<p>失败自动切换,当出现失败,重试其它服务器 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。通常用于读操作,但重试会带来更长延迟。可通过 <code>retries=&quot;2&quot;</code> 来设置重试次数(不含第一次)。</p>\n<p>重试次数配置如下:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findFoo\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"2\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<h3>Failfast Cluster</h3>\n<p>快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。</p>\n<h3>Failsafe Cluster</h3>\n<p>失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。</p>\n<h3>Failback Cluster</h3>\n<p>失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。</p>\n<h3>Forking Cluster</h3>\n<p>并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 <code>forks=&quot;2&quot;</code> 来设置最大并行数。</p>\n<h3>Broadcast Cluster</h3>\n<p>广播调用所有提供者,逐个调用,任意一台报错则报错 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。通常用于通知所有提供者更新缓存或日志等本地资源信息。</p>\n<h2>集群模式配置</h2>\n<p>按照以下示例在服务提供方和消费方配置集群模式</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">cluster</span>=<span class=\"hljs-string\">\"failsafe\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>该配置为缺省配置 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><code>2.1.0</code> 开始支持 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/fault-tolerent-strategy.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/generic-reference.json b/zh-cn/docs/user/demos/generic-reference.json
index e42084db..71cd6b5a 100644
--- a/zh-cn/docs/user/demos/generic-reference.json
+++ b/zh-cn/docs/user/demos/generic-reference.json
@@ -1,4 +1,6 @@
 {
   "filename": "generic-reference.md",
-  "__html": "<h1>使用泛化调用</h1>\n<p>泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 <code>Map</code> 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 <code>GenericService</code> 调用所有服务实现。</p>\n<h2>通过 Spring 使用泛化调用</h2>\n<p>在 Spring 配置申明 <code>generic=&quot;true&quot;</code>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">generic</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>在 Java 代码获取 barService 并开始泛化调用:</p>\n<pre><code class=\"language-java\">GenericService barService = (GenericService) applicationContext.getBean(<span class=\"hljs-string\">\"barService\"</span>);\nObject result = barService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] { <span class=\"hljs-string\">\"java.lang.String\"</span> }, <span class=\"hljs-keyword\">new</span> Object[] { <span class=\"hljs-string\">\"World\"</span> });\n</code></pre>\n<h2>通过 API 方式使用泛化调用</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.service.GenericService; \n... \n \n<span class=\"hljs-comment\">// 引用远程服务 </span>\n<span class=\"hljs-comment\">// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存</span>\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;(); \n<span class=\"hljs-comment\">// 弱类型接口名</span>\nreference.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n<span class=\"hljs-comment\">// 声明为泛化接口 </span>\nreference.setGeneric(<span class=\"hljs-keyword\">true</span>);  \n\n<span class=\"hljs-comment\">// 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用  </span>\nGenericService genericService = reference.get(); \n \n<span class=\"hljs-comment\">// 基本类型以及Date,List,Map等不需要转换,直接调用 </span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"java.lang.String\"</span>}, <span class=\"hljs-keyword\">new</span> Object[] {<span class=\"hljs-string\">\"world\"</span>}); \n \n<span class=\"hljs-comment\">// 用Map表示POJO参数,如果返回值为POJO也将自动转成Map </span>\nMap&lt;String, Object&gt; person = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;(); \nperson.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>); \nperson.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>); \n<span class=\"hljs-comment\">// 如果返回POJO将自动转成Map </span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"findPerson\"</span>, <span class=\"hljs-keyword\">new</span> String[]\n{<span class=\"hljs-string\">\"com.xxx.Person\"</span>}, <span class=\"hljs-keyword\">new</span> Object[]{person}); \n \n...\n</code></pre>\n<h2>有关泛化类型的进一步解释</h2>\n<p>假设存在 POJO 如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PersonImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Person</span> </span>{\n    <span class=\"hljs-keyword\">private</span> String name;\n    <span class=\"hljs-keyword\">private</span> String password;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getPassword</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> password;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setPassword</span><span class=\"hljs-params\">(String password)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.password = password;\n    }\n}\n</code></pre>\n<p>则 POJO 数据:</p>\n<pre><code class=\"language-java\">Person person = <span class=\"hljs-keyword\">new</span> PersonImpl(); \nperson.setName(<span class=\"hljs-string\">\"xxx\"</span>); \nperson.setPassword(<span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n<p>可用下面 Map 表示:</p>\n<pre><code class=\"language-java\">Map&lt;String, Object&gt; map = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;(); \n<span class=\"hljs-comment\">// 注意:如果参数类型是接口,或者List等丢失泛型,可通过class属性指定类型。</span>\nmap.put(<span class=\"hljs-string\">\"class\"</span>, <span class=\"hljs-string\">\"com.xxx.PersonImpl\"</span>); \nmap.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>); \nmap.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n"
+  "__html": "<h1>使用泛化调用</h1>\n<p>泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 <code>Map</code> 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 <code>GenericService</code> 调用所有服务实现。</p>\n<h2>通过 Spring 使用泛化调用</h2>\n<p>在 Spring 配置申明 <code>generic=&quot;true&quot;</code>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">generic</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>在 Java 代码获取 barService 并开始泛化调用:</p>\n<pre><code class=\"language-java\">GenericService barService = (GenericService) applicationContext.getBean(<span class=\"hljs-string\">\"barService\"</span>);\nObject result = barService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] { <span class=\"hljs-string\">\"java.lang.String\"</span> }, <span class=\"hljs-keyword\">new</span> Object[] { <span class=\"hljs-string\">\"World\"</span> });\n</code></pre>\n<h2>通过 API 方式使用泛化调用</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.service.GenericService; \n... \n \n<span class=\"hljs-comment\">// 引用远程服务 </span>\n<span class=\"hljs-comment\">// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存</span>\nReferenceConfig&lt;GenericService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;GenericService&gt;(); \n<span class=\"hljs-comment\">// 弱类型接口名</span>\nreference.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n<span class=\"hljs-comment\">// 声明为泛化接口 </span>\nreference.setGeneric(<span class=\"hljs-keyword\">true</span>);  \n\n<span class=\"hljs-comment\">// 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用  </span>\nGenericService genericService = reference.get(); \n \n<span class=\"hljs-comment\">// 基本类型以及Date,List,Map等不需要转换,直接调用 </span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"sayHello\"</span>, <span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"java.lang.String\"</span>}, <span class=\"hljs-keyword\">new</span> Object[] {<span class=\"hljs-string\">\"world\"</span>}); \n \n<span class=\"hljs-comment\">// 用Map表示POJO参数,如果返回值为POJO也将自动转成Map </span>\nMap&lt;String, Object&gt; person = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;(); \nperson.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>); \nperson.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>); \n<span class=\"hljs-comment\">// 如果返回POJO将自动转成Map </span>\nObject result = genericService.$invoke(<span class=\"hljs-string\">\"findPerson\"</span>, <span class=\"hljs-keyword\">new</span> String[]\n{<span class=\"hljs-string\">\"com.xxx.Person\"</span>}, <span class=\"hljs-keyword\">new</span> Object[]{person}); \n \n...\n</code></pre>\n<h2>有关泛化类型的进一步解释</h2>\n<p>假设存在 POJO 如:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.xxx;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PersonImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Person</span> </span>{\n    <span class=\"hljs-keyword\">private</span> String name;\n    <span class=\"hljs-keyword\">private</span> String password;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getPassword</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> password;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setPassword</span><span class=\"hljs-params\">(String password)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.password = password;\n    }\n}\n</code></pre>\n<p>则 POJO 数据:</p>\n<pre><code class=\"language-java\">Person person = <span class=\"hljs-keyword\">new</span> PersonImpl(); \nperson.setName(<span class=\"hljs-string\">\"xxx\"</span>); \nperson.setPassword(<span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n<p>可用下面 Map 表示:</p>\n<pre><code class=\"language-java\">Map&lt;String, Object&gt; map = <span class=\"hljs-keyword\">new</span> HashMap&lt;String, Object&gt;(); \n<span class=\"hljs-comment\">// 注意:如果参数类型是接口,或者List等丢失泛型,可通过class属性指定类型。</span>\nmap.put(<span class=\"hljs-string\">\"class\"</span>, <span class=\"hljs-string\">\"com.xxx.PersonImpl\"</span>); \nmap.put(<span class=\"hljs-string\">\"name\"</span>, <span class=\"hljs-string\">\"xxx\"</span>); \nmap.put(<span class=\"hljs-string\">\"password\"</span>, <span class=\"hljs-string\">\"yyy\"</span>);\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/generic-reference.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/generic-service.json b/zh-cn/docs/user/demos/generic-service.json
index 91277edd..3215934a 100644
--- a/zh-cn/docs/user/demos/generic-service.json
+++ b/zh-cn/docs/user/demos/generic-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "generic-service.md",
-  "__html": "<h1>实现泛化调用</h1>\n<p>泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服务Mock框架,可通过实现GenericService接口处理所有服务请求。</p>\n<p>在 Java 代码中实现 <code>GenericService</code> 接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MyGenericService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GenericService</span> </span>{\n \n    <span class=\"hljs-keyword\">public</span> Object $invoke(String methodName, String[] parameterTypes, Object[] args) <span class=\"hljs-keyword\">throws</span> GenericException {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"sayHello\"</span>.equals(methodName)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Welcome \"</span> + args[<span class=\"hljs-number\">0</span>];\n        }\n    }\n}\n</code></pre>\n<h2>通过 Spring 暴露泛化实现</h2>\n<p>在 Spring 配置申明服务的实现:</p>\n<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\">\"genericService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.foo.MyGenericService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"genericService\"</span> /&gt;</span>\n</code></pre>\n<h2>通过 API 方式暴露泛化实现</h2>\n<pre><code class=\"language-java\">... \n<span class=\"hljs-comment\">// 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口实现 </span>\nGenericService xxxService = <span class=\"hljs-keyword\">new</span> XxxGenericService(); \n\n<span class=\"hljs-comment\">// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 </span>\nServiceConfig&lt;GenericService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// 弱类型接口名 </span>\nservice.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>); \n<span class=\"hljs-comment\">// 指向一个通用服务实现 </span>\nservice.setRef(xxxService); \n \n<span class=\"hljs-comment\">// 暴露及注册服务 </span>\nservice.export();\n</code></pre>\n"
+  "__html": "<h1>实现泛化调用</h1>\n<p>泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服务Mock框架,可通过实现GenericService接口处理所有服务请求。</p>\n<p>在 Java 代码中实现 <code>GenericService</code> 接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MyGenericService</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">GenericService</span> </span>{\n \n    <span class=\"hljs-keyword\">public</span> Object $invoke(String methodName, String[] parameterTypes, Object[] args) <span class=\"hljs-keyword\">throws</span> GenericException {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"sayHello\"</span>.equals(methodName)) {\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Welcome \"</span> + args[<span class=\"hljs-number\">0</span>];\n        }\n    }\n}\n</code></pre>\n<h2>通过 Spring 暴露泛化实现</h2>\n<p>在 Spring 配置申明服务的实现:</p>\n<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\">\"genericService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.foo.MyGenericService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"genericService\"</span> /&gt;</span>\n</code></pre>\n<h2>通过 API 方式暴露泛化实现</h2>\n<pre><code class=\"language-java\">... \n<span class=\"hljs-comment\">// 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口实现 </span>\nGenericService xxxService = <span class=\"hljs-keyword\">new</span> XxxGenericService(); \n\n<span class=\"hljs-comment\">// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 </span>\nServiceConfig&lt;GenericService&gt; service = <span class=\"hljs-keyword\">new</span> ServiceConfig&lt;GenericService&gt;();\n<span class=\"hljs-comment\">// 弱类型接口名 </span>\nservice.setInterface(<span class=\"hljs-string\">\"com.xxx.XxxService\"</span>);  \nservice.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>); \n<span class=\"hljs-comment\">// 指向一个通用服务实现 </span>\nservice.setRef(xxxService); \n \n<span class=\"hljs-comment\">// 暴露及注册服务 </span>\nservice.export();\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/generic-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/graceful-shutdown.json b/zh-cn/docs/user/demos/graceful-shutdown.json
index 3a2f0e10..3bc81d26 100644
--- a/zh-cn/docs/user/demos/graceful-shutdown.json
+++ b/zh-cn/docs/user/demos/graceful-shutdown.json
@@ -1,4 +1,6 @@
 {
   "filename": "graceful-shutdown.md",
-  "__html": "<h1>优雅停机</h1>\n<p>Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用 <code>kill -9 PID</code> 等强制关闭指令,是不会执行优雅停机的,只有通过 <code>kill PID</code> 时,才会执行。</p>\n<h2>原理</h2>\n<h3>服务提供方</h3>\n<ul>\n<li>停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。</li>\n<li>然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。</li>\n</ul>\n<h3>服务消费方</h3>\n<ul>\n<li>停止时,不再发起新的调用请求,所有新的调用在客户端即报错。</li>\n<li>然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。</li>\n</ul>\n<h2>设置方式</h2>\n<p>设置优雅停机超时时间,缺省超时时间是 10 秒,如果超时则强制关闭。</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.service.shutdown.wait</span>=<span class=\"hljs-string\">15000</span>\n</code></pre>\n<p>如果 ShutdownHook 不能生效,可以自行调用,<strong>使用tomcat等容器部署的場景,建议通过扩展ContextListener等自行调用以下代码实现优雅停机</strong>:</p>\n<pre><code class=\"language-java\">ProtocolConfig.destroyAll();\n</code></pre>\n"
+  "__html": "<h1>优雅停机</h1>\n<p>Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果用户使用 <code>kill -9 PID</code> 等强制关闭指令,是不会执行优雅停机的,只有通过 <code>kill PID</code> 时,才会执行。</p>\n<h2>原理</h2>\n<h3>服务提供方</h3>\n<ul>\n<li>停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。</li>\n<li>然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。</li>\n</ul>\n<h3>服务消费方</h3>\n<ul>\n<li>停止时,不再发起新的调用请求,所有新的调用在客户端即报错。</li>\n<li>然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。</li>\n</ul>\n<h2>设置方式</h2>\n<p>设置优雅停机超时时间,缺省超时时间是 10 秒,如果超时则强制关闭。</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-comment\"># dubbo.properties</span>\n<span class=\"hljs-meta\">dubbo.service.shutdown.wait</span>=<span class=\"hljs-string\">15000</span>\n</code></pre>\n<p>如果 ShutdownHook 不能生效,可以自行调用,<strong>使用tomcat等容器部署的場景,建议通过扩展ContextListener等自行调用以下代码实现优雅停机</strong>:</p>\n<pre><code class=\"language-java\">ProtocolConfig.destroyAll();\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/graceful-shutdown.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/group-merger.json b/zh-cn/docs/user/demos/group-merger.json
index ed0e4fb8..49ee4e15 100644
--- a/zh-cn/docs/user/demos/group-merger.json
+++ b/zh-cn/docs/user/demos/group-merger.json
@@ -1,4 +1,6 @@
 {
   "filename": "group-merger.md",
-  "__html": "<h1>分组聚合</h1>\n<p>按组合并返回结果 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。</p>\n<p>相关代码可以参考 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-merge\">dubbo 项目中的示例</a></p>\n<h2>配置</h2>\n<p>搜索所有分组</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>合并指定分组</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"aaa,bbb\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>指定方法合并结果,其它未指定的方法,将只调用一个 Group</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>某个方法不合并结果,其它都合并结果</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>指定合并策略,缺省根据返回值类型自动匹配,如果同一类型有两个合并器时,需指定合并器的名称 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"mymerge\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>指定合并方法,将调用返回结果的指定方法进行合并,合并方法的参数类型必须是返回结果类型本身</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\".addAll\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>从 <code>2.1.0</code> 版本开始支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>参见:<a href=\"http://dubbo.apache.org/zh-cn/docs/dev/impls/merger.html\">合并结果扩展</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>分组聚合</h1>\n<p>按组合并返回结果 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。</p>\n<p>相关代码可以参考 <a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-merge\">dubbo 项目中的示例</a></p>\n<h2>配置</h2>\n<p>搜索所有分组</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>合并指定分组</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"aaa,bbb\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>指定方法合并结果,其它未指定的方法,将只调用一个 Group</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>某个方法不合并结果,其它都合并结果</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"true\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>指定合并策略,缺省根据返回值类型自动匹配,如果同一类型有两个合并器时,需指定合并器的名称 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\"mymerge\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<p>指定合并方法,将调用返回结果的指定方法进行合并,合并方法的参数类型必须是返回结果类型本身</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.MenuService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"getMenuItems\"</span> <span class=\"hljs-attr\">merger</span>=<span class=\"hljs-string\">\".addAll\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>从 <code>2.1.0</code> 版本开始支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>参见:<a href=\"http://dubbo.apache.org/zh-cn/docs/dev/impls/merger.html\">合并结果扩展</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/group-merger.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/hostname-binding.json b/zh-cn/docs/user/demos/hostname-binding.json
index b588aeb3..e9348649 100644
--- a/zh-cn/docs/user/demos/hostname-binding.json
+++ b/zh-cn/docs/user/demos/hostname-binding.json
@@ -1,4 +1,6 @@
 {
   "filename": "hostname-binding.md",
-  "__html": "<h1>主机绑定</h1>\n<h2>查找顺序</h2>\n<p>缺省主机 IP 查找顺序:</p>\n<ul>\n<li>通过 <code>LocalHost.getLocalHost()</code> 获取本机地址。</li>\n<li>如果是 <code>127.*</code> 等 loopback 地址,则扫描各网卡,获取网卡 IP。</li>\n</ul>\n<h2>主机配置</h2>\n<p>注册的地址如果获取不正确,比如需要注册公网地址,可以:</p>\n<ol>\n<li>\n<p>可以在 <code>/etc/hosts</code> 中加入:机器名 公网 IP,比如:</p>\n<pre><code>test1 205.182.23.201\n</code></pre>\n</li>\n<li>\n<p>在 <code>dubbo.xml</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">host</span>=<span class=\"hljs-string\">\"205.182.23.201\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>或在 <code>dubbo.properties</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.host</span>=<span class=\"hljs-string\">205.182.23.201</span>\n</code></pre>\n</li>\n</ol>\n<h2>端口配置</h2>\n<p>缺省主机端口与协议相关:</p>\n<table>\n<thead>\n<tr>\n<th>协议</th>\n<th>端口</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo</td>\n<td>20880</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1099</td>\n</tr>\n<tr>\n<td>http</td>\n<td>80</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>80</td>\n</tr>\n<tr>\n<td>webservice</td>\n<td>80</td>\n</tr>\n<tr>\n<td>memcached</td>\n<td>11211</td>\n</tr>\n<tr>\n<td>redis</td>\n<td>6379</td>\n</tr>\n</tbody>\n</table>\n<p>可以按照下面的方式配置端口:</p>\n<ol>\n<li>\n<p>在 <code>dubbo.xml</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>或在 <code>dubbo.properties</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.dubbo.port</span>=<span class=\"hljs-string\">20880</span>\n</code></pre>\n</li>\n</ol>\n"
+  "__html": "<h1>主机绑定</h1>\n<h2>查找顺序</h2>\n<p>缺省主机 IP 查找顺序:</p>\n<ul>\n<li>通过 <code>LocalHost.getLocalHost()</code> 获取本机地址。</li>\n<li>如果是 <code>127.*</code> 等 loopback 地址,则扫描各网卡,获取网卡 IP。</li>\n</ul>\n<h2>主机配置</h2>\n<p>注册的地址如果获取不正确,比如需要注册公网地址,可以:</p>\n<ol>\n<li>\n<p>可以在 <code>/etc/hosts</code> 中加入:机器名 公网 IP,比如:</p>\n<pre><code>test1 205.182.23.201\n</code></pre>\n</li>\n<li>\n<p>在 <code>dubbo.xml</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">host</span>=<span class=\"hljs-string\">\"205.182.23.201\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>或在 <code>dubbo.properties</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.host</span>=<span class=\"hljs-string\">205.182.23.201</span>\n</code></pre>\n</li>\n</ol>\n<h2>端口配置</h2>\n<p>缺省主机端口与协议相关:</p>\n<table>\n<thead>\n<tr>\n<th>协议</th>\n<th>端口</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo</td>\n<td>20880</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1099</td>\n</tr>\n<tr>\n<td>http</td>\n<td>80</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>80</td>\n</tr>\n<tr>\n<td>webservice</td>\n<td>80</td>\n</tr>\n<tr>\n<td>memcached</td>\n<td>11211</td>\n</tr>\n<tr>\n<td>redis</td>\n<td>6379</td>\n</tr>\n</tbody>\n</table>\n<p>可以按照下面的方式配置端口:</p>\n<ol>\n<li>\n<p>在 <code>dubbo.xml</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span>&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>或在 <code>dubbo.properties</code> 中加入主机地址的配置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.protocol.dubbo.port</span>=<span class=\"hljs-string\">20880</span>\n</code></pre>\n</li>\n</ol>\n",
+  "link": "/zh-cn/docs/user/demos/hostname-binding.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/index.json b/zh-cn/docs/user/demos/index.json
index 1242bd7b..32e3d9f3 100644
--- a/zh-cn/docs/user/demos/index.json
+++ b/zh-cn/docs/user/demos/index.json
@@ -1,4 +1,6 @@
 {
   "filename": "index.md",
-  "__html": "<h1>示例</h1>\n"
+  "__html": "<h1>示例</h1>\n",
+  "link": "/zh-cn/docs/user/demos/index.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/introduction.json b/zh-cn/docs/user/demos/introduction.json
index efeecc55..f133888d 100644
--- a/zh-cn/docs/user/demos/introduction.json
+++ b/zh-cn/docs/user/demos/introduction.json
@@ -1,4 +1,6 @@
 {
   "filename": "introduction.md",
-  "__html": "<blockquote>\n<p><img src=\"../sources/images/check.gif\" alt=\"warning\">想完整的运行起来,请参见:<a href=\"quickstart.md\">快速启动</a>,这里只列出各种场景的配置方式。\n<img src=\"../sources/images/check.gif\" alt=\"warning\">以下示例全部使用基于Spring的<a href=\"../configuration/xml.md\">Xml配置</a>作为参考,如果不想使用Spring,而希望通过API的方式进行调用,请参见:<a href=\"../configuration/api.md\">API配置</a></p>\n</blockquote>\n"
+  "__html": "<blockquote>\n<p><img src=\"../sources/images/check.gif\" alt=\"warning\">想完整的运行起来,请参见:<a href=\"quickstart.md\">快速启动</a>,这里只列出各种场景的配置方式。\n<img src=\"../sources/images/check.gif\" alt=\"warning\">以下示例全部使用基于Spring的<a href=\"../configuration/xml.md\">Xml配置</a>作为参考,如果不想使用Spring,而希望通过API的方式进行调用,请参见:<a href=\"../configuration/api.md\">API配置</a></p>\n</blockquote>\n",
+  "link": "/zh-cn/docs/user/demos/introduction.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/lazy-connect.json b/zh-cn/docs/user/demos/lazy-connect.json
index 74a855b0..91d24b20 100644
--- a/zh-cn/docs/user/demos/lazy-connect.json
+++ b/zh-cn/docs/user/demos/lazy-connect.json
@@ -1,4 +1,6 @@
 {
   "filename": "lazy-connect.md",
-  "__html": "<h1>延迟连接</h1>\n<p>延迟连接用于减少长连接数。当有调用发起时,再创建长连接。<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<pre><code class=\"language-xml\"><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\">lazy</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:该配置只对使用长连接的 dubbo 协议生效。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>延迟连接</h1>\n<p>延迟连接用于减少长连接数。当有调用发起时,再创建长连接。<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<pre><code class=\"language-xml\"><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\">lazy</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:该配置只对使用长连接的 dubbo 协议生效。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/lazy-connect.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/loadbalance.json b/zh-cn/docs/user/demos/loadbalance.json
index c53cb678..020fb67e 100644
--- a/zh-cn/docs/user/demos/loadbalance.json
+++ b/zh-cn/docs/user/demos/loadbalance.json
@@ -1,4 +1,6 @@
 {
   "filename": "loadbalance.md",
-  "__html": "<h1>负载均衡</h1>\n<p>在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 <code>random</code> 随机调用。</p>\n<p>可以自行扩展负载均衡策略,参见:<a href=\"../../dev/impls/load-balance.md\">负载均衡扩展</a></p>\n<h2>负载均衡策略</h2>\n<h3>Random LoadBalance</h3>\n<ul>\n<li><strong>随机</strong>,按权重设置随机概率。</li>\n<li>在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。</li>\n</ul>\n<h3>RoundRobin LoadBalance</h3>\n<ul>\n<li><strong>轮询</strong>,按公约后的权重设置轮询比率。</li>\n<li>存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。</li>\n</ul>\n<h3>LeastActive LoadBalance</h3>\n<ul>\n<li><strong>最少活跃调用数</strong>,相同活跃数的随机,活跃数指调用前后计数差。</li>\n<li>使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。</li>\n</ul>\n<h3>ConsistentHash LoadBalance</h3>\n<ul>\n<li><strong>一致性 Hash</strong>,相同参数的请求总是发到同一提供者。</li>\n<li>当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。</li>\n<li>算法参见:<a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></li>\n<li>缺省只对第一个参数 Hash,如果要修改,请配置 <code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;</code></li>\n<li>缺省用 160 份虚拟节点,如果要修改,请配置 <code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;</code></li>\n</ul>\n<h2>配置</h2>\n<h3>服务端服务级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>客户端服务级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>服务端方法级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h3>客户端方法级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>负载均衡</h1>\n<p>在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 <code>random</code> 随机调用。</p>\n<p>可以自行扩展负载均衡策略,参见:<a href=\"../../dev/impls/load-balance.md\">负载均衡扩展</a></p>\n<h2>负载均衡策略</h2>\n<h3>Random LoadBalance</h3>\n<ul>\n<li><strong>随机</strong>,按权重设置随机概率。</li>\n<li>在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。</li>\n</ul>\n<h3>RoundRobin LoadBalance</h3>\n<ul>\n<li><strong>轮询</strong>,按公约后的权重设置轮询比率。</li>\n<li>存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。</li>\n</ul>\n<h3>LeastActive LoadBalance</h3>\n<ul>\n<li><strong>最少活跃调用数</strong>,相同活跃数的随机,活跃数指调用前后计数差。</li>\n<li>使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。</li>\n</ul>\n<h3>ConsistentHash LoadBalance</h3>\n<ul>\n<li><strong>一致性 Hash</strong>,相同参数的请求总是发到同一提供者。</li>\n<li>当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。</li>\n<li>算法参见:<a href=\"http://en.wikipedia.org/wiki/Consistent_hashing\">http://en.wikipedia.org/wiki/Consistent_hashing</a></li>\n<li>缺省只对第一个参数 Hash,如果要修改,请配置 <code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;</code></li>\n<li>缺省用 160 份虚拟节点,如果要修改,请配置 <code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;</code></li>\n</ul>\n<h2>配置</h2>\n<h3>服务端服务级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>客户端服务级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span> /&gt;</span>\n</code></pre>\n<h3>服务端方法级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<h3>客户端方法级别</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"...\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"...\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"roundrobin\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/loadbalance.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/local-call.json b/zh-cn/docs/user/demos/local-call.json
index b94892a8..4b74436f 100644
--- a/zh-cn/docs/user/demos/local-call.json
+++ b/zh-cn/docs/user/demos/local-call.json
@@ -1,4 +1,6 @@
 {
   "filename": "local-call.md",
-  "__html": "<h1>本地调用</h1>\n<p>本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。</p>\n<h2>配置</h2>\n<p>定义 injvm 协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>设置默认协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>设置服务协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>优先使用 injvm</p>\n<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\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<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>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>注意:服务暴露与服务引用都需要声明 <code>injvm=&quot;true&quot;</code></p>\n<h2>自动暴露、引用本地服务</h2>\n<p>从 <code>2.2.0</code> 开始,每个服务默认都会在本地暴露。在引用服务的时候,默认优先引用本地服务。如果希望引用远程服务可以使用一下配置强制引用远程服务。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">scope</span>=<span class=\"hljs-string\">\"remote\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>本地调用</h1>\n<p>本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。</p>\n<h2>配置</h2>\n<p>定义 injvm 协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>设置默认协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>设置服务协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"injvm\"</span> /&gt;</span>\n</code></pre>\n<p>优先使用 injvm</p>\n<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\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<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>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">injvm</span>=<span class=\"hljs-string\">\"true\"</span> <span class=\"hljs-attr\">...</span>/&gt;</span>\n</code></pre>\n<p>注意:服务暴露与服务引用都需要声明 <code>injvm=&quot;true&quot;</code></p>\n<h2>自动暴露、引用本地服务</h2>\n<p>从 <code>2.2.0</code> 开始,每个服务默认都会在本地暴露。在引用服务的时候,默认优先引用本地服务。如果希望引用远程服务可以使用一下配置强制引用远程服务。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">scope</span>=<span class=\"hljs-string\">\"remote\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/local-call.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/local-mock.json b/zh-cn/docs/user/demos/local-mock.json
index 55672e7f..6248cc7b 100644
--- a/zh-cn/docs/user/demos/local-mock.json
+++ b/zh-cn/docs/user/demos/local-mock.json
@@ -1,4 +1,6 @@
 {
   "filename": "local-mock.md",
-  "__html": "<h1>本地伪装</h1>\n<p>本地伪装 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。</p>\n<p>在 spring 配置文件中按以下方式配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"com.foo.BarServiceMock\"</span> /&gt;</span>\n</code></pre>\n<p>在工程中提供 Mock 实现 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceMock</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// 你可以伪造容错数据,此方法只在出现RpcException时被执行</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"容错数据\"</span>;\n    }\n}\n</code></pre>\n<p>如果服务的消费方经常需要 try-catch 捕获异常,如:</p>\n<pre><code class=\"language-java\">Offer offer = <span class=\"hljs-keyword\">null</span>;\n<span class=\"hljs-keyword\">try</span> {\n    offer = offerService.findOffer(offerId);\n} <span class=\"hljs-keyword\">catch</span> (RpcException e) {\n   logger.error(e);\n}\n</code></pre>\n<p>请考虑改为 Mock 实现,并在 Mock 实现中 return null。如果只是想简单的忽略异常,在 <code>2.0.11</code> 以上版本可用:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"return null\"</span> /&gt;</span>\n</code></pre>\n<h2>进阶用法</h2>\n<h3>return</h3>\n<p>使用 <code>return</code> 来返回一个字符串表示的对象,作为 Mock 的返回值。合法的字符串可以是:</p>\n<ul>\n<li><em>empty</em>: 代表空,基本类型的默认值,或者集合类的空值</li>\n<li><em>null</em>: <code>null</code></li>\n<li><em>true</em>: <code>true</code></li>\n<li><em>false</em>: <code>false</code></li>\n<li><em>JSON 格式</em>: 反序列化 JSON 所得到的对象</li>\n</ul>\n<h3>throw</h3>\n<p>使用 <code>throw</code> 来返回一个 Exception 对象,作为 Mock 的返回值。</p>\n<p>当调用出错时,抛出一个默认的 RPCException:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw\"</span> /&gt;</span>\n</code></pre>\n<p>当调用出错时,抛出指定的 Exception:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>force 和 fail</h3>\n<p>在 <code>2.6.6</code> 以上的版本,可以开始在 Spring XML 配置文件中使用 <code>fail:</code> 和 <code>force:</code>。<code>force:</code> 代表强制使用 Mock 行为,在这种情况下不会走远程调用。<code>fail:</code> 与默认行为一致,只有当远程调用发生错误时才使用 Mock 行为。<code>force:</code> 和 <code>fail:</code> 都支持与 <code>throw</code> 或者 <code>return</code> 组合使用。</p>\n<p>强制返回指定值:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:return fake\"</span> /&gt;</span>\n</code></pre>\n<p>强制抛出指定异常:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>在方法级别配置 Mock</h3>\n<p>Mock 可以在方法级别上指定,假定 <code>com.foo.BarService</code> 上有好几个方法,我们可以单独为 <code>sayHello()</code> 方法指定 Mock 行为。具体配置如下所示,在本例中,只要 <code>sayHello()</code> 被调用到时,强制返回 &quot;fake&quot;:</p>\n<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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"sayHello.mock\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"force:return fake\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Mock 是 Stub 的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要在出现 RpcException (比如网络失败,超时等)时进行容错,而在出现业务异常(比如登录用户名密码错误)时不需要容错,如果用 Stub,可能就需要捕获并依赖 RpcException 类,而用 Mock 就可以不依赖 RpcException,因为它的约定就是只有出现 RpcException 时才执行。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>在 interface 旁放一个 Mock 实现,它实现 BarService 接口,并有一个无参构造函数 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>本地伪装</h1>\n<p>本地伪装 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。</p>\n<p>在 spring 配置文件中按以下方式配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"com.foo.BarServiceMock\"</span> /&gt;</span>\n</code></pre>\n<p>在工程中提供 Mock 实现 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceMock</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// 你可以伪造容错数据,此方法只在出现RpcException时被执行</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"容错数据\"</span>;\n    }\n}\n</code></pre>\n<p>如果服务的消费方经常需要 try-catch 捕获异常,如:</p>\n<pre><code class=\"language-java\">Offer offer = <span class=\"hljs-keyword\">null</span>;\n<span class=\"hljs-keyword\">try</span> {\n    offer = offerService.findOffer(offerId);\n} <span class=\"hljs-keyword\">catch</span> (RpcException e) {\n   logger.error(e);\n}\n</code></pre>\n<p>请考虑改为 Mock 实现,并在 Mock 实现中 return null。如果只是想简单的忽略异常,在 <code>2.0.11</code> 以上版本可用:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"return null\"</span> /&gt;</span>\n</code></pre>\n<h2>进阶用法</h2>\n<h3>return</h3>\n<p>使用 <code>return</code> 来返回一个字符串表示的对象,作为 Mock 的返回值。合法的字符串可以是:</p>\n<ul>\n<li><em>empty</em>: 代表空,基本类型的默认值,或者集合类的空值</li>\n<li><em>null</em>: <code>null</code></li>\n<li><em>true</em>: <code>true</code></li>\n<li><em>false</em>: <code>false</code></li>\n<li><em>JSON 格式</em>: 反序列化 JSON 所得到的对象</li>\n</ul>\n<h3>throw</h3>\n<p>使用 <code>throw</code> 来返回一个 Exception 对象,作为 Mock 的返回值。</p>\n<p>当调用出错时,抛出一个默认的 RPCException:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw\"</span> /&gt;</span>\n</code></pre>\n<p>当调用出错时,抛出指定的 Exception:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>force 和 fail</h3>\n<p>在 <code>2.6.6</code> 以上的版本,可以开始在 Spring XML 配置文件中使用 <code>fail:</code> 和 <code>force:</code>。<code>force:</code> 代表强制使用 Mock 行为,在这种情况下不会走远程调用。<code>fail:</code> 与默认行为一致,只有当远程调用发生错误时才使用 Mock 行为。<code>force:</code> 和 <code>fail:</code> 都支持与 <code>throw</code> 或者 <code>return</code> 组合使用。</p>\n<p>强制返回指定值:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:return fake\"</span> /&gt;</span>\n</code></pre>\n<p>强制抛出指定异常:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">mock</span>=<span class=\"hljs-string\">\"force:throw com.foo.MockException\"</span> /&gt;</span>\n</code></pre>\n<h3>在方法级别配置 Mock</h3>\n<p>Mock 可以在方法级别上指定,假定 <code>com.foo.BarService</code> 上有好几个方法,我们可以单独为 <code>sayHello()</code> 方法指定 Mock 行为。具体配置如下所示,在本例中,只要 <code>sayHello()</code> 被调用到时,强制返回 &quot;fake&quot;:</p>\n<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\">check</span>=<span class=\"hljs-string\">\"false\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:parameter</span> <span class=\"hljs-attr\">key</span>=<span class=\"hljs-string\">\"sayHello.mock\"</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">\"force:return fake\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Mock 是 Stub 的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要在出现 RpcException (比如网络失败,超时等)时进行容错,而在出现业务异常(比如登录用户名密码错误)时不需要容错,如果用 Stub,可能就需要捕获并依赖 RpcException 类,而用 Mock 就可以不依赖 RpcException,因为它的约定就是只有出现 RpcException 时才执行。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>在 interface 旁放一个 Mock 实现,它实现 BarService 接口,并有一个无参构造函数 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/local-mock.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/local-stub.json b/zh-cn/docs/user/demos/local-stub.json
index 6016cd9b..523b9f18 100644
--- a/zh-cn/docs/user/demos/local-stub.json
+++ b/zh-cn/docs/user/demos/local-stub.json
@@ -1,4 +1,6 @@
 {
   "filename": "local-stub.md",
-  "__html": "<h1>本地存根</h1>\n<p>远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。</p>\n<p><img src=\"../sources/images/stub.jpg\" alt=\"/user-guide/images/stub.jpg\"></p>\n<p>在 spring 配置文件中按以下方式配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"com.foo.BarServiceStub\"</span> /&gt;</span>\n</code></pre>\n<p>提供 Stub 的实现 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceStub</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{ \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> BarService barService;\n    \n    <span class=\"hljs-comment\">// 构造函数传入真正的远程代理对象</span>\n    <span class=\"hljs-keyword\">public</span> (BarService barService) {\n        <span class=\"hljs-keyword\">this</span>.barService = barService;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等</span>\n        <span class=\"hljs-keyword\">try</span> {\n            <span class=\"hljs-keyword\">return</span> barService.sayHello(name);\n        } <span class=\"hljs-keyword\">catch</span> (Exception e) {\n            <span class=\"hljs-comment\">// 你可以容错,可以做任何AOP拦截事项</span>\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"容错数据\"</span>;\n        }\n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Stub 必须有可传入 Proxy 的构造函数。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>在 interface 旁边放一个 Stub 实现,它实现 BarService 接口,并有一个传入远程 BarService 实例的构造函数 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>本地存根</h1>\n<p>远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。</p>\n<p><img src=\"../sources/images/stub.jpg\" alt=\"/user-guide/images/stub.jpg\"></p>\n<p>在 spring 配置文件中按以下方式配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">stub</span>=<span class=\"hljs-string\">\"com.foo.BarServiceStub\"</span> /&gt;</span>\n</code></pre>\n<p>提供 Stub 的实现 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.foo;\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BarServiceStub</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">BarService</span> </span>{ \n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">final</span> BarService barService;\n    \n    <span class=\"hljs-comment\">// 构造函数传入真正的远程代理对象</span>\n    <span class=\"hljs-keyword\">public</span> (BarService barService) {\n        <span class=\"hljs-keyword\">this</span>.barService = barService;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-comment\">// 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等</span>\n        <span class=\"hljs-keyword\">try</span> {\n            <span class=\"hljs-keyword\">return</span> barService.sayHello(name);\n        } <span class=\"hljs-keyword\">catch</span> (Exception e) {\n            <span class=\"hljs-comment\">// 你可以容错,可以做任何AOP拦截事项</span>\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"容错数据\"</span>;\n        }\n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Stub 必须有可传入 Proxy 的构造函数。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>在 interface 旁边放一个 Stub 实现,它实现 BarService 接口,并有一个传入远程 BarService 实例的构造函数 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/local-stub.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/logger-strategy.json b/zh-cn/docs/user/demos/logger-strategy.json
index ca50bfe6..ba8a2bae 100644
--- a/zh-cn/docs/user/demos/logger-strategy.json
+++ b/zh-cn/docs/user/demos/logger-strategy.json
@@ -1,4 +1,6 @@
 {
   "filename": "logger-strategy.md",
-  "__html": "<h1>日志适配</h1>\n<p>自 <code>2.2.1</code> 开始,dubbo 开始内置 log4j、slf4j、jcl、jdk 这些日志框架的适配[1],也可以通过以下方式显示配置日志输出策略:</p>\n<ol start=\"0\">\n<li>\n<p>命令行</p>\n<pre><code class=\"language-sh\">  java -Ddubbo.application.logger=log4j\n</code></pre>\n</li>\n<li>\n<p>在 <code>dubbo.properties</code> 中指定</p>\n<pre><code>  dubbo.application.logger=log4j\n</code></pre>\n</li>\n<li>\n<p>在 <code>dubbo.xml</code> 中配置</p>\n<pre><code class=\"language-xml\">  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"log4j\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<p>[1]: 自定义扩展可以参考 <a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/logger-adapter.html\">日志适配扩展</a></p>\n"
+  "__html": "<h1>日志适配</h1>\n<p>自 <code>2.2.1</code> 开始,dubbo 开始内置 log4j、slf4j、jcl、jdk 这些日志框架的适配[1],也可以通过以下方式显示配置日志输出策略:</p>\n<ol start=\"0\">\n<li>\n<p>命令行</p>\n<pre><code class=\"language-sh\">  java -Ddubbo.application.logger=log4j\n</code></pre>\n</li>\n<li>\n<p>在 <code>dubbo.properties</code> 中指定</p>\n<pre><code>  dubbo.application.logger=log4j\n</code></pre>\n</li>\n<li>\n<p>在 <code>dubbo.xml</code> 中配置</p>\n<pre><code class=\"language-xml\">  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">logger</span>=<span class=\"hljs-string\">\"log4j\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<p>[1]: 自定义扩展可以参考 <a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/logger-adapter.html\">日志适配扩展</a></p>\n",
+  "link": "/zh-cn/docs/user/demos/logger-strategy.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/multi-protocols.json b/zh-cn/docs/user/demos/multi-protocols.json
index 338f7690..081bf779 100644
--- a/zh-cn/docs/user/demos/multi-protocols.json
+++ b/zh-cn/docs/user/demos/multi-protocols.json
@@ -1,4 +1,6 @@
 {
   "filename": "multi-protocols.md",
-  "__html": "<h1>多协议</h1>\n<p>Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。</p>\n<h2>不同服务不同协议</h2>\n<p>不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span> \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多协议配置 --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用dubbo协议暴露服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用rmi协议暴露服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span> \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>多协议暴露服务</h2>\n<p>需要与 http 客户端互操作</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多协议配置 --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用多个协议暴露服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo,hessian\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>多协议</h1>\n<p>Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。</p>\n<h2>不同服务不同协议</h2>\n<p>不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span> \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多协议配置 --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"rmi\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"1099\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用dubbo协议暴露服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用rmi协议暴露服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"rmi\"</span> /&gt;</span> \n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>多协议暴露服务</h2>\n<p>需要与 http 客户端互操作</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"registry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">username</span>=<span class=\"hljs-string\">\"admin\"</span> <span class=\"hljs-attr\">password</span>=<span class=\"hljs-string\">\"hello1234\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多协议配置 --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 使用多个协议暴露服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo,hessian\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/multi-protocols.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/multi-registry.json b/zh-cn/docs/user/demos/multi-registry.json
index be41adcf..eb022828 100644
--- a/zh-cn/docs/user/demos/multi-registry.json
+++ b/zh-cn/docs/user/demos/multi-registry.json
@@ -1,4 +1,6 @@
 {
   "filename": "multi-registry.md",
-  "__html": "<h1>多注册中心</h1>\n<p>Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h2>多注册中心注册</h2>\n<p>比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hangzhouRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qingdaoRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.151:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 向多个注册中心注册 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"hangzhouRegistry,qingdaoRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>不同服务使用不同注册中心</h2>\n<p>比如:CRM 有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 向中文站注册中心注册 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 向国际站注册中心注册 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>多注册中心引用</h2>\n<p>比如:CRM 需同时调用中文站和国际站的 PC2 服务,PC2 在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 引用中文站服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 引用国际站站服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>如果只是测试环境临时需要连接两个不同注册中心,使用竖号分隔多个不同注册中心地址:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090|10.20.154.177:9010\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 引用服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>可以自行扩展注册中心,参见:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/registry.html\">注册中心扩展</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>多注册中心</h1>\n<p>Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<h2>多注册中心注册</h2>\n<p>比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hangzhouRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qingdaoRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.151:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 向多个注册中心注册 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"hangzhouRegistry,qingdaoRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>不同服务使用不同注册中心</h2>\n<p>比如:CRM 有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 向中文站注册中心注册 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 向国际站注册中心注册 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.DemoService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h2>多注册中心引用</h2>\n<p>比如:CRM 需同时调用中文站和国际站的 PC2 服务,PC2 在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> /&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.154.177:9010\"</span> <span class=\"hljs-attr\">default</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 引用中文站服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"chinaHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"chinaRegistry\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 引用国际站站服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"intlHelloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">registry</span>=<span class=\"hljs-string\">\"intlRegistry\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<p>如果只是测试环境临时需要连接两个不同注册中心,使用竖号分隔多个不同注册中心地址:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"world\"</span>  /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090|10.20.154.177:9010\"</span> /&gt;</span>\n    <span class=\"hljs-comment\">&lt;!-- 引用服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>可以自行扩展注册中心,参见:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/registry.html\">注册中心扩展</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/multi-registry.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/multi-versions.json b/zh-cn/docs/user/demos/multi-versions.json
index 8caef154..a7b96d62 100644
--- a/zh-cn/docs/user/demos/multi-versions.json
+++ b/zh-cn/docs/user/demos/multi-versions.json
@@ -1,4 +1,6 @@
 {
   "filename": "multi-versions.md",
-  "__html": "<h1>多版本</h1>\n<p>当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。</p>\n<p>可以按照以下的步骤进行版本迁移:</p>\n<ol start=\"0\">\n<li>在低压力时间段,先升级一半提供者为新版本</li>\n<li>再将所有消费者升级为新版本</li>\n<li>然后将剩下的一半提供者升级为新版本</li>\n</ol>\n<p>老版本服务提供者配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>新版本服务提供者配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>老版本服务消费者配置:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>新版本服务消费者配置:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>如果不需要区分版本,可以按照以下的方式配置 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>多版本</h1>\n<p>当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。</p>\n<p>可以按照以下的步骤进行版本迁移:</p>\n<ol start=\"0\">\n<li>在低压力时间段,先升级一半提供者为新版本</li>\n<li>再将所有消费者升级为新版本</li>\n<li>然后将剩下的一半提供者升级为新版本</li>\n</ol>\n<p>老版本服务提供者配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>新版本服务提供者配置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>老版本服务消费者配置:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>新版本服务消费者配置:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"2.0.0\"</span> /&gt;</span>\n</code></pre>\n<p>如果不需要区分版本,可以按照以下的方式配置 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/multi-versions.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/netty4.json b/zh-cn/docs/user/demos/netty4.json
index 351c5651..413fd047 100644
--- a/zh-cn/docs/user/demos/netty4.json
+++ b/zh-cn/docs/user/demos/netty4.json
@@ -1,4 +1,6 @@
 {
   "filename": "netty4.md",
-  "__html": "<p>dubbo 2.5.6版本新增了对netty4通信模块的支持,启用方式如下</p>\n<p>provider端:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>consumer端:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n\n</code></pre>\n<blockquote>\n<p><strong>注意</strong></p>\n<ol>\n<li>provider端如需不同的协议使用不同的通信层框架,请配置多个protocol分别设置</li>\n<li>consumer端请使用如下形式:</li>\n</ol>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n</blockquote>\n<blockquote>\n<p>接下来我们会继续完善:</p>\n<ol>\n<li>性能测试指标及与netty3版本的性能测试对比,我们会提供一份参考数据</li>\n</ol>\n</blockquote>\n"
+  "__html": "<p>dubbo 2.5.6版本新增了对netty4通信模块的支持,启用方式如下</p>\n<p>provider端:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n</code></pre>\n<p>consumer端:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span> /&gt;</span>\n\n</code></pre>\n<blockquote>\n<p><strong>注意</strong></p>\n<ol>\n<li>provider端如需不同的协议使用不同的通信层框架,请配置多个protocol分别设置</li>\n<li>consumer端请使用如下形式:</li>\n</ol>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">\"netty4\"</span>&gt;</span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:consumer</span>&gt;</span>\n</code></pre>\n</blockquote>\n<blockquote>\n<p>接下来我们会继续完善:</p>\n<ol>\n<li>性能测试指标及与netty3版本的性能测试对比,我们会提供一份参考数据</li>\n</ol>\n</blockquote>\n",
+  "link": "/zh-cn/docs/user/demos/netty4.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/parameter-validation.json b/zh-cn/docs/user/demos/parameter-validation.json
index d7d2b23a..3efee477 100644
--- a/zh-cn/docs/user/demos/parameter-validation.json
+++ b/zh-cn/docs/user/demos/parameter-validation.json
@@ -1,4 +1,6 @@
 {
   "filename": "parameter-validation.md",
-  "__html": "<h1>参数验证</h1>\n<p>参数验证功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 是基于 <a href=\"https://jcp.org/en/jsr/detail?id=303\">JSR303</a> 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>Maven 依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>javax.validation<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>validation-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>1.0.0.GA<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.hibernate<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hibernate-validator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.2.0.Final<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>示例</h2>\n<h3>参数标注示例</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> java.io.Serializable;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n \n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Future;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Max;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Past;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Pattern;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Size;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationParameter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-keyword\">long</span> serialVersionUID = <span class=\"hljs-number\">7158911668568000392L</span>;\n \n    <span class=\"hljs-meta\">@NotNull</span> <span class=\"hljs-comment\">// 不允许为空</span>\n    <span class=\"hljs-meta\">@Size</span>(min = <span class=\"hljs-number\">1</span>, max = <span class=\"hljs-number\">20</span>) <span class=\"hljs-comment\">// 长度或大小范围</span>\n    <span class=\"hljs-keyword\">private</span> String name;\n \n    <span class=\"hljs-meta\">@NotNull</span>(groups = ValidationService.Save.class) <span class=\"hljs-comment\">// 保存时不允许为空,更新时允许为空 ,表示不更新该字段</span>\n    <span class=\"hljs-meta\">@Pattern</span>(regexp = <span class=\"hljs-string\">\"^\\\\s*\\\\w+(?:\\\\.{0,1}[\\\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\\\.[a-zA-Z]+\\\\s*$\"</span>)\n    <span class=\"hljs-keyword\">private</span> String email;\n \n    <span class=\"hljs-meta\">@Min</span>(<span class=\"hljs-number\">18</span>) <span class=\"hljs-comment\">// 最小值</span>\n    <span class=\"hljs-meta\">@Max</span>(<span class=\"hljs-number\">100</span>) <span class=\"hljs-comment\">// 最大值</span>\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">int</span> age;\n \n    <span class=\"hljs-meta\">@Past</span> <span class=\"hljs-comment\">// 必须为一个过去的时间</span>\n    <span class=\"hljs-keyword\">private</span> Date loginDate;\n \n    <span class=\"hljs-meta\">@Future</span> <span class=\"hljs-comment\">// 必须为一个未来的时间</span>\n    <span class=\"hljs-keyword\">private</span> Date expiryDate;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getEmail</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setEmail</span><span class=\"hljs-params\">(String email)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.email = email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getAge</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setAge</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> age)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.age = age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getLoginDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setLoginDate</span><span class=\"hljs-params\">(Date loginDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.loginDate = loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getExpiryDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> expiryDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setExpiryDate</span><span class=\"hljs-params\">(Date expiryDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.expiryDate = expiryDate;\n    }\n}\n</code></pre>\n<h3>分组验证示例</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\">ValidationService</span> </span>{ <span class=\"hljs-comment\">// 缺省可按服务接口区分验证场景,如:@NotNull(groups = ValidationService.class)   </span>\n    <span class=\"hljs-meta\">@interface</span> Save{} <span class=\"hljs-comment\">// 与方法同名接口,首字母大写,用于区分验证场景,如:@NotNull(groups = ValidationService.Save.class),可选</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>关联验证示例</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.GroupSequence;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{   \n    <span class=\"hljs-meta\">@GroupSequence</span>(Update.class) <span class=\"hljs-comment\">// 同时验证Update组规则</span>\n    <span class=\"hljs-meta\">@interface</span> Save{}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n \n    <span class=\"hljs-meta\">@interface</span> Update{} \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>参数验证示例</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(@NotNull ValidationParameter parameter)</span></span>; <span class=\"hljs-comment\">// 验证参数不为空</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">delete</span><span class=\"hljs-params\">(@Min(<span class=\"hljs-number\">1</span>)</span> <span class=\"hljs-keyword\">int</span> id)</span>; <span class=\"hljs-comment\">// 直接对基本类型参数验证</span>\n}\n</code></pre>\n<h2>配置</h2>\n<h3>在客户端验证参数</h3>\n<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\">\"validationService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h3>在服务器端验证参数</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"validationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h2>验证异常信息</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n<span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n \n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationParameter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationService;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationConsumer</span> </span>{   \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        String config = ValidationConsumer.class.getPackage().getName().replace(<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'/'</span>) + <span class=\"hljs-string\">\"/validation-consumer.xml\"</span>;\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(config);\n        context.start();\n        ValidationService validationService = (ValidationService)context.getBean(<span class=\"hljs-string\">\"validationService\"</span>);\n        <span class=\"hljs-comment\">// Error</span>\n        <span class=\"hljs-keyword\">try</span> {\n            parameter = <span class=\"hljs-keyword\">new</span> ValidationParameter();\n            validationService.save(parameter);\n            System.out.println(<span class=\"hljs-string\">\"Validation ERROR\"</span>);\n        } <span class=\"hljs-keyword\">catch</span> (RpcException e) { <span class=\"hljs-comment\">// 抛出的是RpcException</span>\n            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); <span class=\"hljs-comment\">// 里面嵌了一个ConstraintViolationException</span>\n            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); <span class=\"hljs-comment\">// 可以拿到一个验证错误详细信息的集合</span>\n            System.out.println(violations);\n        }\n    } \n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>自 <code>2.1.0</code> 版本开始支持, 如何使用可以参考 <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation\">dubbo 项目中的示例代码</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>验证方式可扩展,扩展方式参见开发者手册中的<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/validation.html\">验证扩展</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>参数验证</h1>\n<p>参数验证功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 是基于 <a href=\"https://jcp.org/en/jsr/detail?id=303\">JSR303</a> 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>Maven 依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>javax.validation<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>validation-api<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>1.0.0.GA<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>org.hibernate<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hibernate-validator<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.2.0.Final<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>示例</h2>\n<h3>参数标注示例</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> java.io.Serializable;\n<span class=\"hljs-keyword\">import</span> java.util.Date;\n \n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Future;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Max;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Past;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Pattern;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.Size;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationParameter</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">Serializable</span> </span>{\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">final</span> <span class=\"hljs-keyword\">long</span> serialVersionUID = <span class=\"hljs-number\">7158911668568000392L</span>;\n \n    <span class=\"hljs-meta\">@NotNull</span> <span class=\"hljs-comment\">// 不允许为空</span>\n    <span class=\"hljs-meta\">@Size</span>(min = <span class=\"hljs-number\">1</span>, max = <span class=\"hljs-number\">20</span>) <span class=\"hljs-comment\">// 长度或大小范围</span>\n    <span class=\"hljs-keyword\">private</span> String name;\n \n    <span class=\"hljs-meta\">@NotNull</span>(groups = ValidationService.Save.class) <span class=\"hljs-comment\">// 保存时不允许为空,更新时允许为空 ,表示不更新该字段</span>\n    <span class=\"hljs-meta\">@Pattern</span>(regexp = <span class=\"hljs-string\">\"^\\\\s*\\\\w+(?:\\\\.{0,1}[\\\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\\\.[a-zA-Z]+\\\\s*$\"</span>)\n    <span class=\"hljs-keyword\">private</span> String email;\n \n    <span class=\"hljs-meta\">@Min</span>(<span class=\"hljs-number\">18</span>) <span class=\"hljs-comment\">// 最小值</span>\n    <span class=\"hljs-meta\">@Max</span>(<span class=\"hljs-number\">100</span>) <span class=\"hljs-comment\">// 最大值</span>\n    <span class=\"hljs-keyword\">private</span> <span class=\"hljs-keyword\">int</span> age;\n \n    <span class=\"hljs-meta\">@Past</span> <span class=\"hljs-comment\">// 必须为一个过去的时间</span>\n    <span class=\"hljs-keyword\">private</span> Date loginDate;\n \n    <span class=\"hljs-meta\">@Future</span> <span class=\"hljs-comment\">// 必须为一个未来的时间</span>\n    <span class=\"hljs-keyword\">private</span> Date expiryDate;\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getName</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setName</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.name = name;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">getEmail</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setEmail</span><span class=\"hljs-params\">(String email)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.email = email;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">int</span> <span class=\"hljs-title\">getAge</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setAge</span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int</span> age)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.age = age;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getLoginDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setLoginDate</span><span class=\"hljs-params\">(Date loginDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.loginDate = loginDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Date <span class=\"hljs-title\">getExpiryDate</span><span class=\"hljs-params\">()</span> </span>{\n        <span class=\"hljs-keyword\">return</span> expiryDate;\n    }\n \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">setExpiryDate</span><span class=\"hljs-params\">(Date expiryDate)</span> </span>{\n        <span class=\"hljs-keyword\">this</span>.expiryDate = expiryDate;\n    }\n}\n</code></pre>\n<h3>分组验证示例</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\">ValidationService</span> </span>{ <span class=\"hljs-comment\">// 缺省可按服务接口区分验证场景,如:@NotNull(groups = ValidationService.class)   </span>\n    <span class=\"hljs-meta\">@interface</span> Save{} <span class=\"hljs-comment\">// 与方法同名接口,首字母大写,用于区分验证场景,如:@NotNull(groups = ValidationService.Save.class),可选</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>关联验证示例</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.GroupSequence;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{   \n    <span class=\"hljs-meta\">@GroupSequence</span>(Update.class) <span class=\"hljs-comment\">// 同时验证Update组规则</span>\n    <span class=\"hljs-meta\">@interface</span> Save{}\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n \n    <span class=\"hljs-meta\">@interface</span> Update{} \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">update</span><span class=\"hljs-params\">(ValidationParameter parameter)</span></span>;\n}\n</code></pre>\n<h3>参数验证示例</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.constraints.Min;\n<span class=\"hljs-keyword\">import</span> javax.validation.constraints.NotNull;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">ValidationService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">save</span><span class=\"hljs-params\">(@NotNull ValidationParameter parameter)</span></span>; <span class=\"hljs-comment\">// 验证参数不为空</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">delete</span><span class=\"hljs-params\">(@Min(<span class=\"hljs-number\">1</span>)</span> <span class=\"hljs-keyword\">int</span> id)</span>; <span class=\"hljs-comment\">// 直接对基本类型参数验证</span>\n}\n</code></pre>\n<h2>配置</h2>\n<h3>在客户端验证参数</h3>\n<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\">\"validationService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h3>在服务器端验证参数</h3>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.examples.validation.api.ValidationService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"validationService\"</span> <span class=\"hljs-attr\">validation</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<h2>验证异常信息</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n<span class=\"hljs-keyword\">import</span> javax.validation.ConstraintViolationException;\n \n<span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationParameter;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.examples.validation.api.ValidationService;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.rpc.RpcException;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ValidationConsumer</span> </span>{   \n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        String config = ValidationConsumer.class.getPackage().getName().replace(<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'/'</span>) + <span class=\"hljs-string\">\"/validation-consumer.xml\"</span>;\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(config);\n        context.start();\n        ValidationService validationService = (ValidationService)context.getBean(<span class=\"hljs-string\">\"validationService\"</span>);\n        <span class=\"hljs-comment\">// Error</span>\n        <span class=\"hljs-keyword\">try</span> {\n            parameter = <span class=\"hljs-keyword\">new</span> ValidationParameter();\n            validationService.save(parameter);\n            System.out.println(<span class=\"hljs-string\">\"Validation ERROR\"</span>);\n        } <span class=\"hljs-keyword\">catch</span> (RpcException e) { <span class=\"hljs-comment\">// 抛出的是RpcException</span>\n            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); <span class=\"hljs-comment\">// 里面嵌了一个ConstraintViolationException</span>\n            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); <span class=\"hljs-comment\">// 可以拿到一个验证错误详细信息的集合</span>\n            System.out.println(violations);\n        }\n    } \n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>自 <code>2.1.0</code> 版本开始支持, 如何使用可以参考 <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation\">dubbo 项目中的示例代码</a> <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>验证方式可扩展,扩展方式参见开发者手册中的<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/validation.html\">验证扩展</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/parameter-validation.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/preflight-check.json b/zh-cn/docs/user/demos/preflight-check.json
index fb36b813..df8e8743 100644
--- a/zh-cn/docs/user/demos/preflight-check.json
+++ b/zh-cn/docs/user/demos/preflight-check.json
@@ -1,4 +1,6 @@
 {
   "filename": "preflight-check.md",
-  "__html": "<h1>启动时检查</h1>\n<p>Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认  <code>check=&quot;true&quot;</code>。</p>\n<p>可以通过 <code>check=&quot;false&quot;</code> 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。</p>\n<p>另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 <code>check=&quot;false&quot;</code>,总是会返回引用,当服务恢复时,能自动连上。</p>\n<h2>示例</h2>\n<h3>通过 spring 配置文件</h3>\n<p>关闭某个服务的启动时检查 (没有提供者时报错):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>关闭所有服务的启动时检查 (没有提供者时报错):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>关闭注册中心启动时检查 (注册订阅失败时报错):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<h3>通过 dubbo.properties</h3>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.reference.com.foo.BarService.check</span>=<span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.reference.check</span>=<span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.consumer.check</span>=<span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.registry.check</span>=<span class=\"hljs-string\">false</span>\n</code></pre>\n<h3>通过 -D 参数</h3>\n<pre><code class=\"language-sh\">java -Ddubbo.reference.com.foo.BarService.check=<span class=\"hljs-literal\">false</span>\njava -Ddubbo.reference.check=<span class=\"hljs-literal\">false</span>\njava -Ddubbo.consumer.check=<span class=\"hljs-literal\">false</span> \njava -Ddubbo.registry.check=<span class=\"hljs-literal\">false</span>\n</code></pre>\n<h2>配置的含义</h2>\n<p><code>dubbo.reference.check=false</code>,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。</p>\n<p><code>dubbo.consumer.check=false</code>,是设置 check 的缺省值,如果配置中有显式的声明,如:<code>&lt;dubbo:reference check=&quot;true&quot;/&gt;</code>,不会受影响。</p>\n<p><code>dubbo.registry.check=false</code>,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。</p>\n"
+  "__html": "<h1>启动时检查</h1>\n<p>Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认  <code>check=&quot;true&quot;</code>。</p>\n<p>可以通过 <code>check=&quot;false&quot;</code> 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。</p>\n<p>另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 <code>check=&quot;false&quot;</code>,总是会返回引用,当服务恢复时,能自动连上。</p>\n<h2>示例</h2>\n<h3>通过 spring 配置文件</h3>\n<p>关闭某个服务的启动时检查 (没有提供者时报错):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>关闭所有服务的启动时检查 (没有提供者时报错):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:consumer</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>关闭注册中心启动时检查 (注册订阅失败时报错):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<h3>通过 dubbo.properties</h3>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.reference.com.foo.BarService.check</span>=<span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.reference.check</span>=<span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.consumer.check</span>=<span class=\"hljs-string\">false</span>\n<span class=\"hljs-meta\">dubbo.registry.check</span>=<span class=\"hljs-string\">false</span>\n</code></pre>\n<h3>通过 -D 参数</h3>\n<pre><code class=\"language-sh\">java -Ddubbo.reference.com.foo.BarService.check=<span class=\"hljs-literal\">false</span>\njava -Ddubbo.reference.check=<span class=\"hljs-literal\">false</span>\njava -Ddubbo.consumer.check=<span class=\"hljs-literal\">false</span> \njava -Ddubbo.registry.check=<span class=\"hljs-literal\">false</span>\n</code></pre>\n<h2>配置的含义</h2>\n<p><code>dubbo.reference.check=false</code>,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。</p>\n<p><code>dubbo.consumer.check=false</code>,是设置 check 的缺省值,如果配置中有显式的声明,如:<code>&lt;dubbo:reference check=&quot;true&quot;/&gt;</code>,不会受影响。</p>\n<p><code>dubbo.registry.check=false</code>,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。</p>\n",
+  "link": "/zh-cn/docs/user/demos/preflight-check.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/reference-config-cache.json b/zh-cn/docs/user/demos/reference-config-cache.json
index 1bacf5fd..ca7bd9c9 100644
--- a/zh-cn/docs/user/demos/reference-config-cache.json
+++ b/zh-cn/docs/user/demos/reference-config-cache.json
@@ -1,4 +1,6 @@
 {
   "filename": "reference-config-cache.md",
-  "__html": "<h1>ReferenceConfig 缓存</h1>\n<p><code>ReferenceConfig</code> 实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存。否则重复生成 <code>ReferenceConfig</code> 可能造成性能问题并且会有内存和连接泄漏。在 API 方式编程时,容易忽略此问题。</p>\n<p>因此,自 <code>2.4.0</code> 版本开始, dubbo 提供了简单的工具类 <code>ReferenceConfigCache</code>用于缓存 <code>ReferenceConfig</code> 实例。</p>\n<p>使用方式如下:</p>\n<pre><code class=\"language-java\">ReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n......\nReferenceConfigCache cache = ReferenceConfigCache.getCache();\n<span class=\"hljs-comment\">// cache.get方法中会缓存 Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig</span>\nXxxService xxxService = cache.get(reference);\n<span class=\"hljs-comment\">// 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效!</span>\n<span class=\"hljs-comment\">// 使用xxxService对象</span>\nxxxService.sayHello();\n</code></pre>\n<p>消除 Cache 中的 <code>ReferenceConfig</code>,将销毁 <code>ReferenceConfig</code> 并释放对应的资源。</p>\n<pre><code class=\"language-java\">ReferenceConfigCache cache = ReferenceConfigCache.getCache();\ncache.destroy(reference);\n</code></pre>\n<p>缺省 <code>ReferenceConfigCache</code> 把相同服务 Group、接口、版本的 <code>ReferenceConfig</code> 认为是相同,缓存一份。即以服务 Group、接口、版本为缓存的 Key。</p>\n<p>可以修改这个策略,在 <code>ReferenceConfigCache.getCache</code> 时,传一个 <code>KeyGenerator</code>。详见 <code>ReferenceConfigCache</code> 类的方法。</p>\n<pre><code class=\"language-java\">KeyGenerator keyGenerator = <span class=\"hljs-keyword\">new</span> ...\nReferenceConfigCache cache = ReferenceConfigCache.getCache(keyGenerator );\n</code></pre>\n"
+  "__html": "<h1>ReferenceConfig 缓存</h1>\n<p><code>ReferenceConfig</code> 实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存。否则重复生成 <code>ReferenceConfig</code> 可能造成性能问题并且会有内存和连接泄漏。在 API 方式编程时,容易忽略此问题。</p>\n<p>因此,自 <code>2.4.0</code> 版本开始, dubbo 提供了简单的工具类 <code>ReferenceConfigCache</code>用于缓存 <code>ReferenceConfig</code> 实例。</p>\n<p>使用方式如下:</p>\n<pre><code class=\"language-java\">ReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\nreference.setInterface(XxxService.class);\nreference.setVersion(<span class=\"hljs-string\">\"1.0.0\"</span>);\n......\nReferenceConfigCache cache = ReferenceConfigCache.getCache();\n<span class=\"hljs-comment\">// cache.get方法中会缓存 Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig</span>\nXxxService xxxService = cache.get(reference);\n<span class=\"hljs-comment\">// 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效!</span>\n<span class=\"hljs-comment\">// 使用xxxService对象</span>\nxxxService.sayHello();\n</code></pre>\n<p>消除 Cache 中的 <code>ReferenceConfig</code>,将销毁 <code>ReferenceConfig</code> 并释放对应的资源。</p>\n<pre><code class=\"language-java\">ReferenceConfigCache cache = ReferenceConfigCache.getCache();\ncache.destroy(reference);\n</code></pre>\n<p>缺省 <code>ReferenceConfigCache</code> 把相同服务 Group、接口、版本的 <code>ReferenceConfig</code> 认为是相同,缓存一份。即以服务 Group、接口、版本为缓存的 Key。</p>\n<p>可以修改这个策略,在 <code>ReferenceConfigCache.getCache</code> 时,传一个 <code>KeyGenerator</code>。详见 <code>ReferenceConfigCache</code> 类的方法。</p>\n<pre><code class=\"language-java\">KeyGenerator keyGenerator = <span class=\"hljs-keyword\">new</span> ...\nReferenceConfigCache cache = ReferenceConfigCache.getCache(keyGenerator );\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/reference-config-cache.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/registry-only.json b/zh-cn/docs/user/demos/registry-only.json
index 50aca83a..d3ae971b 100644
--- a/zh-cn/docs/user/demos/registry-only.json
+++ b/zh-cn/docs/user/demos/registry-only.json
@@ -1,4 +1,6 @@
 {
   "filename": "registry-only.md",
-  "__html": "<h1>只注册</h1>\n<p>如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。</p>\n<p>禁用订阅配置</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">subscribe</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090?subscribe=false\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>只注册</h1>\n<p>如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。</p>\n<p>禁用订阅配置</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">subscribe</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hzRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.153.10:9090\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"qdRegistry\"</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090?subscribe=false\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/registry-only.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/result-cache.json b/zh-cn/docs/user/demos/result-cache.json
index bda5a911..8babb19f 100644
--- a/zh-cn/docs/user/demos/result-cache.json
+++ b/zh-cn/docs/user/demos/result-cache.json
@@ -1,4 +1,6 @@
 {
   "filename": "result-cache.md",
-  "__html": "<h1>结果缓存</h1>\n<p>结果缓存 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,用于加速热门数据的访问速度,Dubbo 提供声明式缓存,以减少用户加缓存的工作量 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>缓存类型</h2>\n<ul>\n<li><code>lru</code> 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。</li>\n<li><code>threadlocal</code> 当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。</li>\n<li><code>jcache</code> 与 <a href=\"http://jcp.org/en/jsr/detail?id=107%27\">JSR107</a> 集成,可以桥接各种缓存实现。</li>\n</ul>\n<p>缓存类型可扩展,参见:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/cache.html\">缓存扩展</a></p>\n<h2>配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n</code></pre>\n<p>或:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.1.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache\">示例代码</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>结果缓存</h1>\n<p>结果缓存 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>,用于加速热门数据的访问速度,Dubbo 提供声明式缓存,以减少用户加缓存的工作量 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>缓存类型</h2>\n<ul>\n<li><code>lru</code> 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。</li>\n<li><code>threadlocal</code> 当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。</li>\n<li><code>jcache</code> 与 <a href=\"http://jcp.org/en/jsr/detail?id=107%27\">JSR107</a> 集成,可以桥接各种缓存实现。</li>\n</ul>\n<p>缓存类型可扩展,参见:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/cache.html\">缓存扩展</a></p>\n<h2>配置</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n</code></pre>\n<p>或:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findBar\"</span> <span class=\"hljs-attr\">cache</span>=<span class=\"hljs-string\">\"lru\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:reference</span>&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.1.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p><a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache\">示例代码</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/result-cache.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/routing-rule.json b/zh-cn/docs/user/demos/routing-rule.json
index f5cd1c5d..e48ac783 100644
--- a/zh-cn/docs/user/demos/routing-rule.json
+++ b/zh-cn/docs/user/demos/routing-rule.json
@@ -1,4 +1,6 @@
 {
   "filename": "routing-rule.md",
-  "__html": "<h1>路由规则</h1>\n<p>路由规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路由规则,并且支持可扩展 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>写入路由规则</h2>\n<p>向注册中心写入路由规则的操作通常由监控中心或治理中心的页面完成</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"condition://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=\"</span> + URL.encode(<span class=\"hljs-string\">\"host = 10.20.153.10 =&gt; host = 10.20.153.11\"</span>)));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>condition://</code> 表示路由规则的类型,支持条件路由规则和脚本路由规则,可扩展,<strong>必填</strong>。</li>\n<li><code>0.0.0.0</code> 表示对所有 IP 地址生效,如果只想对某个 IP 的生效,请填入具体 IP,<strong>必填</strong>。</li>\n<li><code>com.foo.BarService</code> 表示只对指定服务生效,<strong>必填</strong>。</li>\n<li><code>group=foo</code> 对指定服务的指定group生效,不填表示对未配置group的指定服务生效</li>\n<li><code>version=1.0</code>对指定服务的指定version生效,不填表示对未配置version的指定服务生效</li>\n<li><code>category=routers</code> 表示该数据为动态配置类型,<strong>必填</strong>。</li>\n<li><code>dynamic=false</code> 表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,<strong>必填</strong>。</li>\n<li><code>enabled=true</code> 覆盖规则是否生效,可不填,缺省生效。</li>\n<li><code>force=false</code> 当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失效,可不填,缺省为 <code>false</code>。</li>\n<li><code>runtime=false</code> 是否在每次调用时执行路由规则,否则只在提供者地址列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为 <code>true</code>,需要注意设置会影响调用的性能,可不填,缺省为 <code>false</code>。</li>\n<li><code>priority=1</code> 路由规则的优先级,用于排序,优先级越大越靠前执行,可不填,缺省为 <code>0</code>。</li>\n<li><code>rule=URL.encode(&quot;host = 10.20.153.10 =&gt; host = 10.20.153.11&quot;)</code> 表示路由规则的内容,<strong>必填</strong>。</li>\n</ul>\n<h2>条件路由规则</h2>\n<p>基于条件表达式的路由规则,如:<code>host = 10.20.153.10 =&gt; host = 10.20.153.11</code></p>\n<h3>规则:</h3>\n<ul>\n<li><code>=&gt;</code> 之前的为消费者匹配条件,所有参数和消费者的 URL 进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。</li>\n<li><code>=&gt;</code> 之后为提供者地址列表的过滤条件,所有参数和提供者的 URL 进行对比,消费者最终只拿到过滤后的地址列表。</li>\n<li>如果匹配条件为空,表示对所有消费方应用,如:<code>=&gt; host != 10.20.153.11</code></li>\n<li>如果过滤条件为空,表示禁止访问,如:<code>host = 10.20.153.10 =&gt;</code></li>\n</ul>\n<h3>表达式:</h3>\n<p>参数支持:</p>\n<ul>\n<li>服务调用信息,如:method, argument 等,暂不支持参数路由</li>\n<li>URL 本身的字段,如:protocol, host, port 等</li>\n<li>以及 URL 上的所有参数,如:application, organization 等</li>\n</ul>\n<p>条件支持:</p>\n<ul>\n<li>等号 <code>=</code> 表示&quot;匹配&quot;,如:<code>host = 10.20.153.10</code></li>\n<li>不等号 <code>!=</code> 表示&quot;不匹配&quot;,如:<code>host != 10.20.153.10</code></li>\n</ul>\n<p>值支持:</p>\n<ul>\n<li>以逗号 <code>,</code> 分隔多个值,如:<code>host != 10.20.153.10,10.20.153.11</code></li>\n<li>以星号 <code>*</code> 结尾,表示通配,如:<code>host != 10.20.*</code></li>\n<li>以美元符 <code>$</code> 开头,表示引用消费者参数,如:<code>host = $host</code></li>\n</ul>\n<h3>示例:</h3>\n<ol start=\"0\">\n<li>\n<p>排除预发布机:</p>\n<pre><code>=&gt; host != 172.22.3.91\n</code></pre>\n</li>\n<li>\n<p>白名单 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code>host != 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>黑名单:</p>\n<pre><code>host = 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>服务寄宿在应用上,只暴露一部分的机器,防止整个集群挂掉:</p>\n<pre><code>=&gt; host = 172.22.3.1*,172.22.3.2*\n</code></pre>\n</li>\n<li>\n<p>为重要应用提供额外的机器:</p>\n<pre><code>application != kylin =&gt; host != 172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>读写分离:</p>\n<pre><code>method = find*,list*,get*,is* =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\nmethod != find*,list*,get*,is* =&gt; host = 172.22.3.97,172.22.3.98\n</code></pre>\n</li>\n<li>\n<p>前后台分离:</p>\n<pre><code>application = bops =&gt; host = 172.22.3.91,172.22.3.92,172.22.3.93\napplication != bops =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>隔离不同机房网段:</p>\n<pre><code>host != 172.22.3.* =&gt; host != 172.22.3.*\n</code></pre>\n</li>\n<li>\n<p>提供者与消费者部署在同集群内,本机只访问本机的服务:</p>\n<pre><code>=&gt; host = $host\n</code></pre>\n</li>\n</ol>\n<h2>脚本路由规则</h2>\n<p>脚本路由规则 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> 支持 JDK 脚本引擎的所有脚本,比如:javascript, jruby, groovy 等,通过 <code>type=javascript</code> 参数设置脚本类型,缺省为 javascript。</p>\n<pre><code>&quot;script://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=&quot; + URL.encode(&quot;(function route(invokers) { ... } (invokers))&quot;)\n</code></pre>\n<p>基于脚本引擎的路由规则,如:</p>\n<pre><code class=\"language-javascript\">(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">route</span>(<span class=\"hljs-params\">invokers</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> result = <span class=\"hljs-keyword\">new</span> java.util.ArrayList(invokers.size());\n    <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i &lt; invokers.size(); i ++) {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"10.20.153.10\"</span>.equals(invokers.get(i).getUrl().getHost())) {\n            result.add(invokers.get(i));\n        }\n    }\n    <span class=\"hljs-keyword\">return</span> result;\n} (invokers)); <span class=\"hljs-comment\">// 表示立即执行方法</span>\n</code></pre>\n<h2>标签路由规则</h2>\n<p>标签路由规则 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup> ,当应用选择装配标签路由(TagRouter)之后,一次 dubbo 调用能够根据请求携带的 tag 标签智能地选择对应 tag 的服务提供者进行调用。</p>\n<h3>服务提供者</h3>\n<ol>\n<li>给应用装配标签路由器:</li>\n</ol>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n    ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n    applicationConfig.setName(<span class=\"hljs-string\">\"provider-book\"</span>);\n    applicationConfig.setQosEnable(<span class=\"hljs-keyword\">false</span>);\n    <span class=\"hljs-comment\">// instruct tag router</span>\n    Map&lt;String,String&gt; parameters = <span class=\"hljs-keyword\">new</span> HashMap&lt;&gt;();\n    parameters.put(Constants.ROUTER_KEY, <span class=\"hljs-string\">\"tag\"</span>);\n    applicationConfig.setParameters(parameters);\n    <span class=\"hljs-keyword\">return</span> applicationConfig;\n}\n</code></pre>\n<ol start=\"2\">\n<li>给应用设置具体的标签:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProviderConfig <span class=\"hljs-title\">providerConfig</span><span class=\"hljs-params\">()</span></span>{\n\tProviderConfig providerConfig = <span class=\"hljs-keyword\">new</span> ProviderConfig();\n\tproviderConfig.setTag(<span class=\"hljs-string\">\"red\"</span>);\n\t<span class=\"hljs-keyword\">return</span> providerConfig;\n}\n</code></pre>\n<p>应用未装配 tag 属性或服务提供者未设置 tag 属性,都将被认为是默认的应用,这些默认应用将会在调用无法匹配 provider 时当作降级方案。</p>\n<h3>服务消费者</h3>\n<pre><code class=\"language-Java\">RpcContext.getContext().setAttachment(Constants.REQUEST_TAG_KEY,<span class=\"hljs-string\">\"red\"</span>);\n</code></pre>\n<p>请求标签的作用域为每一次 invocation,使用 attachment 来传递请求标签,注意保存在 attachment 中的值将会在一次完整的远程调用中持续传递,得益于这样的特性,我们只需要在起始调用时,通过一行代码的设置,达到标签的持续传递。</p>\n<blockquote>\n<p>目前仅仅支持 hardcoding 的方式设置 requestTag。注意到 RpcContext 是线程绑定的,优雅的使用 TagRouter 特性,建议通过 servlet 过滤器(在 web 环境下),或者定制的 SPI 过滤器设置 requestTag。</p>\n</blockquote>\n<h3>规则描述</h3>\n<ol>\n<li>\n<p>request.tag=red 时优先选择 tag=red 的 provider。若集群中不存在与请求标记对应的服务,可以降级请求 tag=null 的 provider,即默认 provider。</p>\n</li>\n<li>\n<p>request.tag=null 时,只会匹配 tag=null 的 provider。即使集群中存在可用的服务,若 tag 不匹配就无法调用,这与规则1不同,携带标签的请求可以降级访问到无标签的服务,但不携带标签/携带其他种类标签的请求永远无法访问到其他标签的服务。</p>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>路由规则扩展点:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/router.html\">路由扩展</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>注意:一个服务只能有一条白名单规则,否则两条规则交叉,就都被筛选掉了 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>注意:脚本没有沙箱约束,可执行任意代码,存在后门风险 <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>该特性在 <code>2.7.0</code> 以上版本支持 <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>路由规则</h1>\n<p>路由规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路由规则,并且支持可扩展 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>写入路由规则</h2>\n<p>向注册中心写入路由规则的操作通常由监控中心或治理中心的页面完成</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"condition://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=\"</span> + URL.encode(<span class=\"hljs-string\">\"host = 10.20.153.10 =&gt; host = 10.20.153.11\"</span>)));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>condition://</code> 表示路由规则的类型,支持条件路由规则和脚本路由规则,可扩展,<strong>必填</strong>。</li>\n<li><code>0.0.0.0</code> 表示对所有 IP 地址生效,如果只想对某个 IP 的生效,请填入具体 IP,<strong>必填</strong>。</li>\n<li><code>com.foo.BarService</code> 表示只对指定服务生效,<strong>必填</strong>。</li>\n<li><code>group=foo</code> 对指定服务的指定group生效,不填表示对未配置group的指定服务生效</li>\n<li><code>version=1.0</code>对指定服务的指定version生效,不填表示对未配置version的指定服务生效</li>\n<li><code>category=routers</code> 表示该数据为动态配置类型,<strong>必填</strong>。</li>\n<li><code>dynamic=false</code> 表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,<strong>必填</strong>。</li>\n<li><code>enabled=true</code> 覆盖规则是否生效,可不填,缺省生效。</li>\n<li><code>force=false</code> 当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失效,可不填,缺省为 <code>false</code>。</li>\n<li><code>runtime=false</code> 是否在每次调用时执行路由规则,否则只在提供者地址列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为 <code>true</code>,需要注意设置会影响调用的性能,可不填,缺省为 <code>false</code>。</li>\n<li><code>priority=1</code> 路由规则的优先级,用于排序,优先级越大越靠前执行,可不填,缺省为 <code>0</code>。</li>\n<li><code>rule=URL.encode(&quot;host = 10.20.153.10 =&gt; host = 10.20.153.11&quot;)</code> 表示路由规则的内容,<strong>必填</strong>。</li>\n</ul>\n<h2>条件路由规则</h2>\n<p>基于条件表达式的路由规则,如:<code>host = 10.20.153.10 =&gt; host = 10.20.153.11</code></p>\n<h3>规则:</h3>\n<ul>\n<li><code>=&gt;</code> 之前的为消费者匹配条件,所有参数和消费者的 URL 进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。</li>\n<li><code>=&gt;</code> 之后为提供者地址列表的过滤条件,所有参数和提供者的 URL 进行对比,消费者最终只拿到过滤后的地址列表。</li>\n<li>如果匹配条件为空,表示对所有消费方应用,如:<code>=&gt; host != 10.20.153.11</code></li>\n<li>如果过滤条件为空,表示禁止访问,如:<code>host = 10.20.153.10 =&gt;</code></li>\n</ul>\n<h3>表达式:</h3>\n<p>参数支持:</p>\n<ul>\n<li>服务调用信息,如:method, argument 等,暂不支持参数路由</li>\n<li>URL 本身的字段,如:protocol, host, port 等</li>\n<li>以及 URL 上的所有参数,如:application, organization 等</li>\n</ul>\n<p>条件支持:</p>\n<ul>\n<li>等号 <code>=</code> 表示&quot;匹配&quot;,如:<code>host = 10.20.153.10</code></li>\n<li>不等号 <code>!=</code> 表示&quot;不匹配&quot;,如:<code>host != 10.20.153.10</code></li>\n</ul>\n<p>值支持:</p>\n<ul>\n<li>以逗号 <code>,</code> 分隔多个值,如:<code>host != 10.20.153.10,10.20.153.11</code></li>\n<li>以星号 <code>*</code> 结尾,表示通配,如:<code>host != 10.20.*</code></li>\n<li>以美元符 <code>$</code> 开头,表示引用消费者参数,如:<code>host = $host</code></li>\n</ul>\n<h3>示例:</h3>\n<ol start=\"0\">\n<li>\n<p>排除预发布机:</p>\n<pre><code>=&gt; host != 172.22.3.91\n</code></pre>\n</li>\n<li>\n<p>白名单 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code>host != 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>黑名单:</p>\n<pre><code>host = 10.20.153.10,10.20.153.11 =&gt;\n</code></pre>\n</li>\n<li>\n<p>服务寄宿在应用上,只暴露一部分的机器,防止整个集群挂掉:</p>\n<pre><code>=&gt; host = 172.22.3.1*,172.22.3.2*\n</code></pre>\n</li>\n<li>\n<p>为重要应用提供额外的机器:</p>\n<pre><code>application != kylin =&gt; host != 172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>读写分离:</p>\n<pre><code>method = find*,list*,get*,is* =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\nmethod != find*,list*,get*,is* =&gt; host = 172.22.3.97,172.22.3.98\n</code></pre>\n</li>\n<li>\n<p>前后台分离:</p>\n<pre><code>application = bops =&gt; host = 172.22.3.91,172.22.3.92,172.22.3.93\napplication != bops =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96\n</code></pre>\n</li>\n<li>\n<p>隔离不同机房网段:</p>\n<pre><code>host != 172.22.3.* =&gt; host != 172.22.3.*\n</code></pre>\n</li>\n<li>\n<p>提供者与消费者部署在同集群内,本机只访问本机的服务:</p>\n<pre><code>=&gt; host = $host\n</code></pre>\n</li>\n</ol>\n<h2>脚本路由规则</h2>\n<p>脚本路由规则 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> 支持 JDK 脚本引擎的所有脚本,比如:javascript, jruby, groovy 等,通过 <code>type=javascript</code> 参数设置脚本类型,缺省为 javascript。</p>\n<pre><code>&quot;script://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=&quot; + URL.encode(&quot;(function route(invokers) { ... } (invokers))&quot;)\n</code></pre>\n<p>基于脚本引擎的路由规则,如:</p>\n<pre><code class=\"language-javascript\">(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">route</span>(<span class=\"hljs-params\">invokers</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> result = <span class=\"hljs-keyword\">new</span> java.util.ArrayList(invokers.size());\n    <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i &lt; invokers.size(); i ++) {\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"10.20.153.10\"</span>.equals(invokers.get(i).getUrl().getHost())) {\n            result.add(invokers.get(i));\n        }\n    }\n    <span class=\"hljs-keyword\">return</span> result;\n} (invokers)); <span class=\"hljs-comment\">// 表示立即执行方法</span>\n</code></pre>\n<h2>标签路由规则</h2>\n<p>标签路由规则 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup> ,当应用选择装配标签路由(TagRouter)之后,一次 dubbo 调用能够根据请求携带的 tag 标签智能地选择对应 tag 的服务提供者进行调用。</p>\n<h3>服务提供者</h3>\n<ol>\n<li>给应用装配标签路由器:</li>\n</ol>\n<pre><code class=\"language-Java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n    ApplicationConfig applicationConfig = <span class=\"hljs-keyword\">new</span> ApplicationConfig();\n    applicationConfig.setName(<span class=\"hljs-string\">\"provider-book\"</span>);\n    applicationConfig.setQosEnable(<span class=\"hljs-keyword\">false</span>);\n    <span class=\"hljs-comment\">// instruct tag router</span>\n    Map&lt;String,String&gt; parameters = <span class=\"hljs-keyword\">new</span> HashMap&lt;&gt;();\n    parameters.put(Constants.ROUTER_KEY, <span class=\"hljs-string\">\"tag\"</span>);\n    applicationConfig.setParameters(parameters);\n    <span class=\"hljs-keyword\">return</span> applicationConfig;\n}\n</code></pre>\n<ol start=\"2\">\n<li>给应用设置具体的标签:</li>\n</ol>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Bean</span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ProviderConfig <span class=\"hljs-title\">providerConfig</span><span class=\"hljs-params\">()</span></span>{\n\tProviderConfig providerConfig = <span class=\"hljs-keyword\">new</span> ProviderConfig();\n\tproviderConfig.setTag(<span class=\"hljs-string\">\"red\"</span>);\n\t<span class=\"hljs-keyword\">return</span> providerConfig;\n}\n</code></pre>\n<p>应用未装配 tag 属性或服务提供者未设置 tag 属性,都将被认为是默认的应用,这些默认应用将会在调用无法匹配 provider 时当作降级方案。</p>\n<h3>服务消费者</h3>\n<pre><code class=\"language-Java\">RpcContext.getContext().setAttachment(Constants.REQUEST_TAG_KEY,<span class=\"hljs-string\">\"red\"</span>);\n</code></pre>\n<p>请求标签的作用域为每一次 invocation,使用 attachment 来传递请求标签,注意保存在 attachment 中的值将会在一次完整的远程调用中持续传递,得益于这样的特性,我们只需要在起始调用时,通过一行代码的设置,达到标签的持续传递。</p>\n<blockquote>\n<p>目前仅仅支持 hardcoding 的方式设置 requestTag。注意到 RpcContext 是线程绑定的,优雅的使用 TagRouter 特性,建议通过 servlet 过滤器(在 web 环境下),或者定制的 SPI 过滤器设置 requestTag。</p>\n</blockquote>\n<h3>规则描述</h3>\n<ol>\n<li>\n<p>request.tag=red 时优先选择 tag=red 的 provider。若集群中不存在与请求标记对应的服务,可以降级请求 tag=null 的 provider,即默认 provider。</p>\n</li>\n<li>\n<p>request.tag=null 时,只会匹配 tag=null 的 provider。即使集群中存在可用的服务,若 tag 不匹配就无法调用,这与规则1不同,携带标签的请求可以降级访问到无标签的服务,但不携带标签/携带其他种类标签的请求永远无法访问到其他标签的服务。</p>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>路由规则扩展点:<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/router.html\">路由扩展</a> <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>注意:一个服务只能有一条白名单规则,否则两条规则交叉,就都被筛选掉了 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>注意:脚本没有沙箱约束,可执行任意代码,存在后门风险 <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>该特性在 <code>2.7.0</code> 以上版本支持 <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/routing-rule.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/serialization.json b/zh-cn/docs/user/demos/serialization.json
index d0716e2b..106b5fc3 100644
--- a/zh-cn/docs/user/demos/serialization.json
+++ b/zh-cn/docs/user/demos/serialization.json
@@ -1,4 +1,6 @@
 {
   "filename": "serialization.md",
-  "__html": "<h1>在Dubbo中使用高效的Java序列化(Kryo和FST)</h1>\n<h2>启用Kryo和FST</h2>\n<p>使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:</p>\n<pre><code class=\"language-xml\"><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\">serialization</span>=<span class=\"hljs-string\">\"kryo\"</span>/&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><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\">serialization</span>=<span class=\"hljs-string\">\"fst\"</span>/&gt;</span>\n</code></pre>\n<h2>注册被序列化类</h2>\n<p>要让Kryo和FST完全发挥出高性能,最好将那些需要被序列化的类注册到dubbo系统中,例如,我们可以实现如下回调接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SerializationOptimizerImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">SerializationOptimizer</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Collection&lt;Class&gt; <span class=\"hljs-title\">getSerializableClasses</span><span class=\"hljs-params\">()</span> </span>{\n        List&lt;Class&gt; classes = <span class=\"hljs-keyword\">new</span> LinkedList&lt;Class&gt;();\n        classes.add(BidRequest.class);\n        classes.add(BidResponse.class);\n        classes.add(Device.class);\n        classes.add(Geo.class);\n        classes.add(Impression.class);\n        classes.add(SeatBid.class);\n        <span class=\"hljs-keyword\">return</span> classes;\n    }\n}\n</code></pre>\n<p>然后在XML配置中添加:</p>\n<pre><code class=\"language-xml\"><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\">serialization</span>=<span class=\"hljs-string\">\"kryo\"</span> <span class=\"hljs-attr\">optimizer</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.SerializationOptimizerImpl\"</span>/&gt;</span>\n</code></pre>\n<p>在注册这些类后,序列化的性能可能被大大提升,特别针对小数量的嵌套对象的时候。</p>\n<p>当然,在对一个类做序列化的时候,可能还级联引用到很多类,比如Java集合类。针对这种情况,我们已经自动将JDK中的常用类进行了注册,所以你不需要重复注册它们(当然你重复注册了也没有任何影响),包括:</p>\n<pre><code>GregorianCalendar\nInvocationHandler\nBigDecimal\nBigInteger\nPattern\nBitSet\nURI\nUUID\nHashMap\nArrayList\nLinkedList\nHashSet\nTreeSet\nHashtable\nDate\nCalendar\nConcurrentHashMap\nSimpleDateFormat\nVector\nBitSet\nStringBuffer\nStringBuilder\nObject\nObject[]\nString[]\nbyte[]\nchar[]\nint[]\nfloat[]\ndouble[]\n</code></pre>\n<p>由于注册被序列化的类仅仅是出于性能优化的目的,所以即使你忘记注册某些类也没有关系。事实上,即使不注册任何类,Kryo和FST的性能依然普遍优于hessian和dubbo序列化。</p>\n"
+  "__html": "<h1>在Dubbo中使用高效的Java序列化(Kryo和FST)</h1>\n<h2>启用Kryo和FST</h2>\n<p>使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:</p>\n<pre><code class=\"language-xml\"><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\">serialization</span>=<span class=\"hljs-string\">\"kryo\"</span>/&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><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\">serialization</span>=<span class=\"hljs-string\">\"fst\"</span>/&gt;</span>\n</code></pre>\n<h2>注册被序列化类</h2>\n<p>要让Kryo和FST完全发挥出高性能,最好将那些需要被序列化的类注册到dubbo系统中,例如,我们可以实现如下回调接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SerializationOptimizerImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">SerializationOptimizer</span> </span>{\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> Collection&lt;Class&gt; <span class=\"hljs-title\">getSerializableClasses</span><span class=\"hljs-params\">()</span> </span>{\n        List&lt;Class&gt; classes = <span class=\"hljs-keyword\">new</span> LinkedList&lt;Class&gt;();\n        classes.add(BidRequest.class);\n        classes.add(BidResponse.class);\n        classes.add(Device.class);\n        classes.add(Geo.class);\n        classes.add(Impression.class);\n        classes.add(SeatBid.class);\n        <span class=\"hljs-keyword\">return</span> classes;\n    }\n}\n</code></pre>\n<p>然后在XML配置中添加:</p>\n<pre><code class=\"language-xml\"><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\">serialization</span>=<span class=\"hljs-string\">\"kryo\"</span> <span class=\"hljs-attr\">optimizer</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.SerializationOptimizerImpl\"</span>/&gt;</span>\n</code></pre>\n<p>在注册这些类后,序列化的性能可能被大大提升,特别针对小数量的嵌套对象的时候。</p>\n<p>当然,在对一个类做序列化的时候,可能还级联引用到很多类,比如Java集合类。针对这种情况,我们已经自动将JDK中的常用类进行了注册,所以你不需要重复注册它们(当然你重复注册了也没有任何影响),包括:</p>\n<pre><code>GregorianCalendar\nInvocationHandler\nBigDecimal\nBigInteger\nPattern\nBitSet\nURI\nUUID\nHashMap\nArrayList\nLinkedList\nHashSet\nTreeSet\nHashtable\nDate\nCalendar\nConcurrentHashMap\nSimpleDateFormat\nVector\nBitSet\nStringBuffer\nStringBuilder\nObject\nObject[]\nString[]\nbyte[]\nchar[]\nint[]\nfloat[]\ndouble[]\n</code></pre>\n<p>由于注册被序列化的类仅仅是出于性能优化的目的,所以即使你忘记注册某些类也没有关系。事实上,即使不注册任何类,Kryo和FST的性能依然普遍优于hessian和dubbo序列化。</p>\n",
+  "link": "/zh-cn/docs/user/demos/serialization.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/service-container.json b/zh-cn/docs/user/demos/service-container.json
index 26b64804..c0c980b8 100644
--- a/zh-cn/docs/user/demos/service-container.json
+++ b/zh-cn/docs/user/demos/service-container.json
@@ -1,4 +1,6 @@
 {
   "filename": "service-container.md",
-  "__html": "<h1>服务容器</h1>\n<p>服务容器是一个 standalone 的启动程序,因为后台服务不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去加载服务提供方,增加复杂性,也浪费资源。</p>\n<p>服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。</p>\n<p>服务容器的加载内容可以扩展,内置了 spring, jetty, log4j 等加载,可通过<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/container.html\">容器扩展点</a>进行扩展。配置配在 java 命令的 -D 参数或者 <code>dubbo.properties</code> 中。</p>\n<h2>容器类型</h2>\n<h3>Spring Container</h3>\n<ul>\n<li>\n<p>自动加载 <code>META-INF/spring</code> 目录下的所有 Spring 配置。</p>\n</li>\n<li>\n<p>配置 spring 配置加载位置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.spring.config</span>=<span class=\"hljs-string\">classpath*:META-INF/spring/*.xml</span>\n</code></pre>\n</li>\n</ul>\n<h3>Jetty Container</h3>\n<ul>\n<li>启动一个内嵌 Jetty,用于汇报状态。</li>\n<li>配置:\n<ul>\n<li><code>dubbo.jetty.port=8080</code>:配置 jetty 启动端口</li>\n<li><code>dubbo.jetty.directory=/foo/bar</code>:配置可通过 jetty 直接访问的目录,用于存放静态文件</li>\n<li><code>dubbo.jetty.page=log,status,system</code>:配置显示的页面,缺省加载所有页面</li>\n</ul>\n</li>\n</ul>\n<h3>Log4j Container</h3>\n<ul>\n<li>自动配置 log4j 的配置,在多进程启动时,自动给日志文件按进程分目录。</li>\n<li>配置:\n<ul>\n<li><code>dubbo.log4j.file=/foo/bar.log</code>:配置日志文件路径</li>\n<li><code>dubbo.log4j.level=WARN</code>:配置日志级别</li>\n<li><code>dubbo.log4j.subdirectory=20880</code>:配置日志子目录,用于多进程启动,避免冲突</li>\n</ul>\n</li>\n</ul>\n<h2>容器启动</h2>\n<p>缺省只加载 spring</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main\n</code></pre>\n<p>通过 main 函数参数传入要加载的容器</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<p>通过 JVM 启动参数传入要加载的容器</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j\n</code></pre>\n<p>通过 classpath 下的 <code>dubbo.properties</code> 配置传入要加载的容器</p>\n<pre><code>dubbo.container=spring,jetty,log4j\n</code></pre>\n"
+  "__html": "<h1>服务容器</h1>\n<p>服务容器是一个 standalone 的启动程序,因为后台服务不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去加载服务提供方,增加复杂性,也浪费资源。</p>\n<p>服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。</p>\n<p>服务容器的加载内容可以扩展,内置了 spring, jetty, log4j 等加载,可通过<a href=\"http://dubbo.apache.org/books/dubbo-dev-book/impls/container.html\">容器扩展点</a>进行扩展。配置配在 java 命令的 -D 参数或者 <code>dubbo.properties</code> 中。</p>\n<h2>容器类型</h2>\n<h3>Spring Container</h3>\n<ul>\n<li>\n<p>自动加载 <code>META-INF/spring</code> 目录下的所有 Spring 配置。</p>\n</li>\n<li>\n<p>配置 spring 配置加载位置:</p>\n<pre><code class=\"language-properties\"><span class=\"hljs-meta\">dubbo.spring.config</span>=<span class=\"hljs-string\">classpath*:META-INF/spring/*.xml</span>\n</code></pre>\n</li>\n</ul>\n<h3>Jetty Container</h3>\n<ul>\n<li>启动一个内嵌 Jetty,用于汇报状态。</li>\n<li>配置:\n<ul>\n<li><code>dubbo.jetty.port=8080</code>:配置 jetty 启动端口</li>\n<li><code>dubbo.jetty.directory=/foo/bar</code>:配置可通过 jetty 直接访问的目录,用于存放静态文件</li>\n<li><code>dubbo.jetty.page=log,status,system</code>:配置显示的页面,缺省加载所有页面</li>\n</ul>\n</li>\n</ul>\n<h3>Log4j Container</h3>\n<ul>\n<li>自动配置 log4j 的配置,在多进程启动时,自动给日志文件按进程分目录。</li>\n<li>配置:\n<ul>\n<li><code>dubbo.log4j.file=/foo/bar.log</code>:配置日志文件路径</li>\n<li><code>dubbo.log4j.level=WARN</code>:配置日志级别</li>\n<li><code>dubbo.log4j.subdirectory=20880</code>:配置日志子目录,用于多进程启动,避免冲突</li>\n</ul>\n</li>\n</ul>\n<h2>容器启动</h2>\n<p>缺省只加载 spring</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main\n</code></pre>\n<p>通过 main 函数参数传入要加载的容器</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main spring jetty log4j\n</code></pre>\n<p>通过 JVM 启动参数传入要加载的容器</p>\n<pre><code class=\"language-sh\">java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j\n</code></pre>\n<p>通过 classpath 下的 <code>dubbo.properties</code> 配置传入要加载的容器</p>\n<pre><code>dubbo.container=spring,jetty,log4j\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/service-container.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/service-downgrade.json b/zh-cn/docs/user/demos/service-downgrade.json
index 7c27d87d..f6c398b3 100644
--- a/zh-cn/docs/user/demos/service-downgrade.json
+++ b/zh-cn/docs/user/demos/service-downgrade.json
@@ -1,4 +1,6 @@
 {
   "filename": "service-downgrade.md",
-  "__html": "<h1>服务降级</h1>\n<p>可以通过服务降级功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。</p>\n<p>向注册中心写入动态配置覆盖规则:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\"</span>));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>mock=force:return+null</code> 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。</li>\n<li>还可以改为 <code>mock=fail:return+null</code> 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>服务降级</h1>\n<p>可以通过服务降级功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。</p>\n<p>向注册中心写入动态配置覆盖规则:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null\"</span>));\n</code></pre>\n<p>其中:</p>\n<ul>\n<li><code>mock=force:return+null</code> 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。</li>\n<li>还可以改为 <code>mock=fail:return+null</code> 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/service-downgrade.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/service-group.json b/zh-cn/docs/user/demos/service-group.json
index f6277326..eaf9aac1 100644
--- a/zh-cn/docs/user/demos/service-group.json
+++ b/zh-cn/docs/user/demos/service-group.json
@@ -1,4 +1,6 @@
 {
   "filename": "service-group.md",
-  "__html": "<h1>服务分组</h1>\n<p>当一个接口有多种实现时,可以用 group 区分。</p>\n<h2>服务</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n</code></pre>\n<h2>引用</h2>\n<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\">\"feedbackIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"memberIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n</code></pre>\n<p>任意组 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持,总是只调一个可用组的实现 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>服务分组</h1>\n<p>当一个接口有多种实现时,可以用 group 区分。</p>\n<h2>服务</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n</code></pre>\n<h2>引用</h2>\n<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\">\"feedbackIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"feedback\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"memberIndexService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"member\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.xxx.IndexService\"</span> /&gt;</span>\n</code></pre>\n<p>任意组 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<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\">\"barService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">group</span>=<span class=\"hljs-string\">\"*\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.2.0</code> 以上版本支持,总是只调一个可用组的实现 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/service-group.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/set-host.json b/zh-cn/docs/user/demos/set-host.json
index f57a9877..5be2752b 100644
--- a/zh-cn/docs/user/demos/set-host.json
+++ b/zh-cn/docs/user/demos/set-host.json
@@ -1,4 +1,6 @@
 {
   "filename": "set-host.md",
-  "__html": "<h2>背景</h2>\n<p>在<code>dubbo</code>中,<code>provider</code>启动时主要做两个事情,一是启动server,二是向注册中心注册服务.启动server时需要绑定socket,向注册中心注册服务时也需要发送socket唯一标识服务地址.</p>\n<ol>\n<li><code>dubbo</code>中不设置<code>host</code>时默认<code>host</code>是什么?</li>\n<li>那在<code>dubbo</code>中如何指定服务的<code>host</code>,我们是否可以用hostname或domain代替IP地址作为<code>host</code>?</li>\n<li>在使用docker时,有时需要设置端口映射,此时,启动server时绑定的socket和向注册中心注册的socket使用不同的端口号,此时又该如何设置?</li>\n</ol>\n<h2><code>dubbo</code>中不设置<code>host</code>时默认<code>host</code>是什么</h2>\n<p>一般的<code>dubbo</code>协议配置如下:</p>\n<pre><code class=\"language-xml\">    ...\n    <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\">\"20890\"</span> /&gt;</span>\n    ...\n</code></pre>\n<p>可以看到,只配置了端口号,没有配置<code>host</code>,此时设置的<code>host</code>又是什么呢?\n查看代码发现,在<code>com.alibaba.dubbo.config.ServiceConfig#findConfigedHosts()</code>中,通过<code>InetAddress.getLocalHost().getHostAddress()</code>获取默认<code>host</code>.其返回值如下:</p>\n<ol>\n<li>未联网时,返回127.0.0.1</li>\n<li>在阿里云服务器中,返回私有地址,如:172.18.46.234</li>\n<li>在本机测试时,返回公有地址,如:30.5.10.11</li>\n</ol>\n<h2>那在<code>dubbo</code>中如何指定服务的socket?</h2>\n<p>除此之外,可以通过<code>dubbo.protocol</code>或<code>dubbo.provider</code>的<code>host</code>属性对<code>host</code>进行配置,支持IP地址和域名,如下:</p>\n<pre><code class=\"language-xml\">    ...\n    <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\">\"20890\"</span> <span class=\"hljs-attr\">host</span>=<span class=\"hljs-string\">\"www.example.com\"</span>/&gt;</span>\n    ...\n</code></pre>\n<h2>在使用docker时,有时需要设置端口映射,此时,启动server时绑定的socket和向注册中心注册的socket使用不同的端口号,此时又该如何设置?</h2>\n<p>见<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">dubbo通过环境变量设置host</a></p>\n<blockquote>\n<p>有些部署场景需要动态指定服务注册的地址,如docker bridge网络模式下要指定注册宿主机ip以实现外网通信。dubbo提供了两对启动阶段的系统属性,用于设置对外通信的ip、port地址\nDUBBO_IP_TO_REGISTRY --- 注册到注册中心的ip地址\nDUBBO_PORT_TO_REGISTRY --- 注册到注册中心的port端口\nDUBBO_IP_TO_BIND --- 监听ip地址\nDUBBO_PORT_TO_BIND --- 监听port端口</p>\n</blockquote>\n<blockquote>\n<p>以上四个配置项均为可选项,如不配置dubbo会自动获取ip与端口,请根据具体的部署场景灵活选择配置。\ndubbo支持多协议,如果一个应用同时暴露多个不同协议服务,且需要为每个服务单独指定ip或port,请分别在以上属性前加协议前缀。 如:\nHESSIAN_DUBBO_PORT_TO_BIND hessian协议绑定的port\nDUBBO_DUBBO_PORT_TO_BIND   dubbo协议绑定的port\nHESSIAN_DUBBO_IP_TO_REGISTRY hessian协议注册的ip\nDUBBO_DUBBO_PORT_TO_BIND     dubbo协议注册的ip\nPORT_TO_REGISTRY或IP_TO_REGISTRY不会用作默认PORT_TO_BIND或IP_TO_BIND,但是反过来是成立的\n如设置PORT_TO_REGISTRY=20881 IP_TO_REGISTRY=30.5.97.6,则PORT_TO_BIND IP_TO_BIND不受影响\n如果设置PORT_TO_BIND=20881 IP_TO_BIND=30.5.97.6,则默认PORT_TO_REGISTRY=20881 IP_TO_REGISTRY=30.5.97.6</p>\n</blockquote>\n<h2>总结</h2>\n<ol>\n<li>可以通过<code>dubbo.protocol</code>或<code>dubbo.provider</code>的<code>host</code>属性对<code>host</code>进行配置,支持IP地址和域名.但此时注册到注册中心的IP地址和监听IP地址是同一个值</li>\n<li>为了解决在虚拟环境或局域网内consumer无法与provider通信的问题,可以通过环境变量分别设置注册到注册中心的IP地址和监听IP地址,其优先级高于<code>dubbo.protocol</code>或<code>dubbo.provider</code>的<code>host</code>配置</li>\n</ol>\n<h2>参考</h2>\n<ol>\n<li><a href=\"https://github.com/apache/incubator-dubbo/issues/2043\">[Proposal]support hostname or domain in service discovery.</a></li>\n<li><a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">dubbo通过环境变量设置host</a></li>\n</ol>\n"
+  "__html": "<h2>背景</h2>\n<p>在<code>dubbo</code>中,<code>provider</code>启动时主要做两个事情,一是启动server,二是向注册中心注册服务.启动server时需要绑定socket,向注册中心注册服务时也需要发送socket唯一标识服务地址.</p>\n<ol>\n<li><code>dubbo</code>中不设置<code>host</code>时默认<code>host</code>是什么?</li>\n<li>那在<code>dubbo</code>中如何指定服务的<code>host</code>,我们是否可以用hostname或domain代替IP地址作为<code>host</code>?</li>\n<li>在使用docker时,有时需要设置端口映射,此时,启动server时绑定的socket和向注册中心注册的socket使用不同的端口号,此时又该如何设置?</li>\n</ol>\n<h2><code>dubbo</code>中不设置<code>host</code>时默认<code>host</code>是什么</h2>\n<p>一般的<code>dubbo</code>协议配置如下:</p>\n<pre><code class=\"language-xml\">    ...\n    <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\">\"20890\"</span> /&gt;</span>\n    ...\n</code></pre>\n<p>可以看到,只配置了端口号,没有配置<code>host</code>,此时设置的<code>host</code>又是什么呢?\n查看代码发现,在<code>com.alibaba.dubbo.config.ServiceConfig#findConfigedHosts()</code>中,通过<code>InetAddress.getLocalHost().getHostAddress()</code>获取默认<code>host</code>.其返回值如下:</p>\n<ol>\n<li>未联网时,返回127.0.0.1</li>\n<li>在阿里云服务器中,返回私有地址,如:172.18.46.234</li>\n<li>在本机测试时,返回公有地址,如:30.5.10.11</li>\n</ol>\n<h2>那在<code>dubbo</code>中如何指定服务的socket?</h2>\n<p>除此之外,可以通过<code>dubbo.protocol</code>或<code>dubbo.provider</code>的<code>host</code>属性对<code>host</code>进行配置,支持IP地址和域名,如下:</p>\n<pre><code class=\"language-xml\">    ...\n    <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\">\"20890\"</span> <span class=\"hljs-attr\">host</span>=<span class=\"hljs-string\">\"www.example.com\"</span>/&gt;</span>\n    ...\n</code></pre>\n<h2>在使用docker时,有时需要设置端口映射,此时,启动server时绑定的socket和向注册中心注册的socket使用不同的端口号,此时又该如何设置?</h2>\n<p>见<a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">dubbo通过环境变量设置host</a></p>\n<blockquote>\n<p>有些部署场景需要动态指定服务注册的地址,如docker bridge网络模式下要指定注册宿主机ip以实现外网通信。dubbo提供了两对启动阶段的系统属性,用于设置对外通信的ip、port地址\nDUBBO_IP_TO_REGISTRY --- 注册到注册中心的ip地址\nDUBBO_PORT_TO_REGISTRY --- 注册到注册中心的port端口\nDUBBO_IP_TO_BIND --- 监听ip地址\nDUBBO_PORT_TO_BIND --- 监听port端口</p>\n</blockquote>\n<blockquote>\n<p>以上四个配置项均为可选项,如不配置dubbo会自动获取ip与端口,请根据具体的部署场景灵活选择配置。\ndubbo支持多协议,如果一个应用同时暴露多个不同协议服务,且需要为每个服务单独指定ip或port,请分别在以上属性前加协议前缀。 如:\nHESSIAN_DUBBO_PORT_TO_BIND hessian协议绑定的port\nDUBBO_DUBBO_PORT_TO_BIND   dubbo协议绑定的port\nHESSIAN_DUBBO_IP_TO_REGISTRY hessian协议注册的ip\nDUBBO_DUBBO_PORT_TO_BIND     dubbo协议注册的ip\nPORT_TO_REGISTRY或IP_TO_REGISTRY不会用作默认PORT_TO_BIND或IP_TO_BIND,但是反过来是成立的\n如设置PORT_TO_REGISTRY=20881 IP_TO_REGISTRY=30.5.97.6,则PORT_TO_BIND IP_TO_BIND不受影响\n如果设置PORT_TO_BIND=20881 IP_TO_BIND=30.5.97.6,则默认PORT_TO_REGISTRY=20881 IP_TO_REGISTRY=30.5.97.6</p>\n</blockquote>\n<h2>总结</h2>\n<ol>\n<li>可以通过<code>dubbo.protocol</code>或<code>dubbo.provider</code>的<code>host</code>属性对<code>host</code>进行配置,支持IP地址和域名.但此时注册到注册中心的IP地址和监听IP地址是同一个值</li>\n<li>为了解决在虚拟环境或局域网内consumer无法与provider通信的问题,可以通过环境变量分别设置注册到注册中心的IP地址和监听IP地址,其优先级高于<code>dubbo.protocol</code>或<code>dubbo.provider</code>的<code>host</code>配置</li>\n</ol>\n<h2>参考</h2>\n<ol>\n<li><a href=\"https://github.com/apache/incubator-dubbo/issues/2043\">[Proposal]support hostname or domain in service discovery.</a></li>\n<li><a href=\"https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-docker\">dubbo通过环境变量设置host</a></li>\n</ol>\n",
+  "link": "/zh-cn/docs/user/demos/set-host.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/static-service.json b/zh-cn/docs/user/demos/static-service.json
index 11a5192f..55194850 100644
--- a/zh-cn/docs/user/demos/static-service.json
+++ b/zh-cn/docs/user/demos/static-service.json
@@ -1,4 +1,6 @@
 {
   "filename": "static-service.md",
-  "__html": "<h1>静态服务</h1>\n<p>有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。</p>\n<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\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<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\">\"10.20.141.150:9090?dynamic=false\"</span> /&gt;</span>\n</code></pre>\n<p>服务提供者初次注册时为禁用状态,需人工启用。断线时,将不会被自动删除,需人工禁用。</p>\n<p>如果是一个第三方服务提供者,比如 memcached,可以直接向注册中心写入提供者地址信息,消费者正常使用 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo\"</span>));\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>通常由脚本监控中心页面等调用 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>静态服务</h1>\n<p>有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。</p>\n<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\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<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\">\"10.20.141.150:9090?dynamic=false\"</span> /&gt;</span>\n</code></pre>\n<p>服务提供者初次注册时为禁用状态,需人工启用。断线时,将不会被自动删除,需人工禁用。</p>\n<p>如果是一个第三方服务提供者,比如 memcached,可以直接向注册中心写入提供者地址信息,消费者正常使用 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo\"</span>));\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>通常由脚本监控中心页面等调用 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/demos/static-service.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/stickiness.json b/zh-cn/docs/user/demos/stickiness.json
index c73c54a8..1e6e3ae1 100644
--- a/zh-cn/docs/user/demos/stickiness.json
+++ b/zh-cn/docs/user/demos/stickiness.json
@@ -1,4 +1,6 @@
 {
   "filename": "stickiness.md",
-  "__html": "<h1>粘滞连接</h1>\n<p>粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。</p>\n<p>粘滞连接将自动开启<a href=\"./lazy-connect.md\">延迟连接</a>,以减少长连接数。</p>\n<pre><code class=\"language-xml\"><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\">sticky</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>粘滞连接</h1>\n<p>粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。</p>\n<p>粘滞连接将自动开启<a href=\"./lazy-connect.md\">延迟连接</a>,以减少长连接数。</p>\n<pre><code class=\"language-xml\"><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\">sticky</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/stickiness.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/subscribe-only.json b/zh-cn/docs/user/demos/subscribe-only.json
index 8a63b0b0..14d5eb73 100644
--- a/zh-cn/docs/user/demos/subscribe-only.json
+++ b/zh-cn/docs/user/demos/subscribe-only.json
@@ -1,4 +1,6 @@
 {
   "filename": "subscribe-only.md",
-  "__html": "<h1>只订阅</h1>\n<p>为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。</p>\n<p>可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。</p>\n<p><img src=\"../sources/images/subscribe-only.jpg\" alt=\"/user-guide/images/subscribe-only.jpg\"></p>\n<p>禁用注册配置</p>\n<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\">\"10.20.153.10:9090\"</span> <span class=\"hljs-attr\">register</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<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\">\"10.20.153.10:9090?register=false\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>只订阅</h1>\n<p>为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。</p>\n<p>可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。</p>\n<p><img src=\"../sources/images/subscribe-only.jpg\" alt=\"/user-guide/images/subscribe-only.jpg\"></p>\n<p>禁用注册配置</p>\n<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\">\"10.20.153.10:9090\"</span> <span class=\"hljs-attr\">register</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<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\">\"10.20.153.10:9090?register=false\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/subscribe-only.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/thread-model.json b/zh-cn/docs/user/demos/thread-model.json
index 7a251fec..c1e28055 100644
--- a/zh-cn/docs/user/demos/thread-model.json
+++ b/zh-cn/docs/user/demos/thread-model.json
@@ -1,4 +1,6 @@
 {
   "filename": "thread-model.md",
-  "__html": "<h1>线程模型</h1>\n<p>如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。</p>\n<p>但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。</p>\n<p>如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。</p>\n<p><img src=\"../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol\"></p>\n<p>因此,需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景:</p>\n<pre><code class=\"language-xml\"><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\">dispatcher</span>=<span class=\"hljs-string\">\"all\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n<p>Dispatcher</p>\n<ul>\n<li><code>all</code> 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。</li>\n<li><code>direct</code> 所有消息都不派发到线程池,全部在 IO 线程上直接执行。</li>\n<li><code>message</code> 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行。</li>\n<li><code>execution</code> 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行。</li>\n<li><code>connection</code> 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。</li>\n</ul>\n<p>ThreadPool</p>\n<ul>\n<li><code>fixed</code> 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)</li>\n<li><code>cached</code> 缓存线程池,空闲一分钟自动删除,需要时重建。</li>\n<li><code>limited</code> 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。</li>\n<li><code>eager</code> 优先创建<code>Worker</code>线程池。在任务数量大于<code>corePoolSize</code>但是小于<code>maximumPoolSize</code>时,优先创建<code>Worker</code>来处理任务。当任务数量大于<code>maximumPoolSize</code>时,将任务放入阻塞队列中。阻塞队列充满时抛出<code>RejectedExecutionException</code>。(相比于<code>cached</code>:<code>cached</code>在任务数量超过<code>maximumPoolSize</code>时直接抛出异常而不是将任务放入阻塞队列)</li>\n</ul>\n"
+  "__html": "<h1>线程模型</h1>\n<p>如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。</p>\n<p>但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。</p>\n<p>如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。</p>\n<p><img src=\"../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol\"></p>\n<p>因此,需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景:</p>\n<pre><code class=\"language-xml\"><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\">dispatcher</span>=<span class=\"hljs-string\">\"all\"</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">\"fixed\"</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n<p>Dispatcher</p>\n<ul>\n<li><code>all</code> 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。</li>\n<li><code>direct</code> 所有消息都不派发到线程池,全部在 IO 线程上直接执行。</li>\n<li><code>message</code> 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行。</li>\n<li><code>execution</code> 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行。</li>\n<li><code>connection</code> 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。</li>\n</ul>\n<p>ThreadPool</p>\n<ul>\n<li><code>fixed</code> 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)</li>\n<li><code>cached</code> 缓存线程池,空闲一分钟自动删除,需要时重建。</li>\n<li><code>limited</code> 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。</li>\n<li><code>eager</code> 优先创建<code>Worker</code>线程池。在任务数量大于<code>corePoolSize</code>但是小于<code>maximumPoolSize</code>时,优先创建<code>Worker</code>来处理任务。当任务数量大于<code>maximumPoolSize</code>时,将任务放入阻塞队列中。阻塞队列充满时抛出<code>RejectedExecutionException</code>。(相比于<code>cached</code>:<code>cached</code>在任务数量超过<code>maximumPoolSize</code>时直接抛出异常而不是将任务放入阻塞队列)</li>\n</ul>\n",
+  "link": "/zh-cn/docs/user/demos/thread-model.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/token-authorization.json b/zh-cn/docs/user/demos/token-authorization.json
index db348038..63f649f4 100644
--- a/zh-cn/docs/user/demos/token-authorization.json
+++ b/zh-cn/docs/user/demos/token-authorization.json
@@ -1,4 +1,6 @@
 {
   "filename": "token-authorization.md",
-  "__html": "<h1>令牌验证</h1>\n<p>通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者</p>\n<p><img src=\"../sources/images/dubbo-token.jpg\" alt=\"/user-guide/images/dubbo-token.jpg\"></p>\n<p>可以全局设置开启令牌验证:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--随机token令牌,使用UUID生成--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--固定token令牌,相当于密码--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>也可在服务级别设置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--随机token令牌,使用UUID生成--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--固定token令牌,相当于密码--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>还可在协议级别设置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--随机token令牌,使用UUID生成--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--固定token令牌,相当于密码--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>令牌验证</h1>\n<p>通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者</p>\n<p><img src=\"../sources/images/dubbo-token.jpg\" alt=\"/user-guide/images/dubbo-token.jpg\"></p>\n<p>可以全局设置开启令牌验证:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--随机token令牌,使用UUID生成--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--固定token令牌,相当于密码--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>也可在服务级别设置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--随机token令牌,使用UUID生成--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--固定token令牌,相当于密码--&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n<p>还可在协议级别设置:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--随机token令牌,使用UUID生成--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"true\"</span> /&gt;</span>\n</code></pre>\n<p>或</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!--固定token令牌,相当于密码--&gt;</span>\n<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\">token</span>=<span class=\"hljs-string\">\"123456\"</span> /&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/demos/token-authorization.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/dependencies.json b/zh-cn/docs/user/dependencies.json
index f15345cc..8841e049 100644
--- a/zh-cn/docs/user/dependencies.json
+++ b/zh-cn/docs/user/dependencies.json
@@ -1,7 +1,10 @@
 {
   "filename": "dependencies.md",
   "__html": "<h1>依赖</h1>\n<h2>必须依赖</h2>\n<p>JDK 1.6+ <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>缺省依赖</h2>\n<p>通过 <code>mvn dependency:tree &gt; dep.log</code> 命令分析,Dubbo 缺省依赖以下三方库:</p>\n<pre><code>[INFO] +- com.alibaba:dubbo:jar:2.5.9-SNAPSHOT:compile\n[INFO] |  +- org.springframework:spring-context:jar:4.3.10.RELEASE:compile\n[INFO] |  +- org.javassist:javassist:jar:3.21.0-GA:compile\n[INFO] |  \\- org.jboss.netty:netty:jar:3.2.5.Final:compile\n</code></pre>\n<p>这里所有依赖都是换照 Dubbo 缺省配置选的,这些缺省值是基于稳定性和性能考虑的。</p>\n<ul>\n<li>javassist.jar <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>: 如果 <code>&lt;dubbo:provider proxy=&quot;jdk&quot; /&gt;</code> 或 <code>&lt;dubbo:consumer proxy=&quot;jdk&quot; /&gt;</code>,以及 <code>&lt;dubbo:application compiler=&quot;jdk&quot; /&gt;</code>,则不需要。</li>\n<li>spring-context.jar <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>: 如果用 <code>ServiceConfig</code> 和 <code>ReferenceConfig</code> 的 API 调用,则不需要。</li>\n<li>netty.jar <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup>: 如果 <code>&lt;dubbo:protocol server=&quot;mina&quot;/&gt;</code> 或 <code>&lt;dubbo:protocol server=&quot;grizzly&quot;/&gt;</code>,则换成 mina.jar 或 grizzly.jar。如果 <code>&lt;protocol name=&quot;rmi&quot;/&gt;</code>,则不需要。</li>\n</ul>\n<h2>可选依赖</h2>\n<p>以下依赖,在主动配置使用相应实现策略时用到,需自行加入依赖。</p>\n<ul>\n<li>netty-all 4.0.35.Final</li>\n<li>mina: 1.1.7</li>\n<li>grizzly: 2.1.4</li>\n<li>httpclient: 4.5.3</li>\n<li>hessian_lite: 3.2.1-fixed</li>\n<li>fastjson: 1.2.31</li>\n<li>zookeeper: 3.4.9</li>\n<li>jedis: 2.9.0</li>\n<li>xmemcached: 1.3.6</li>\n<li>hessian: 4.0.38</li>\n<li>jetty: 6.1.26</li>\n<li>hibernate-validator: 5.4.1.Final</li>\n<li>zkclient: 0.2</li>\n<li>curator: 2.12.0</li>\n<li>cxf: 3.0.14</li>\n<li>thrift: 0.8.0</li>\n<li>servlet: 3.0 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup></li>\n<li>validation-api: <a href=\"http://1.1.0.GA\">1.1.0.GA</a> <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:1\">[5:1]</a></sup></li>\n<li>jcache: 1.0.0 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:2\">[5:2]</a></sup></li>\n<li>javax.el: 3.0.1-b08 <sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5:3\">[5:3]</a></sup></li>\n<li>kryo: 4.0.1</li>\n<li>kryo-serializers: 0.42</li>\n<li>fst: 2.48-jdk-6</li>\n<li>resteasy: 3.0.19.Final</li>\n<li>tomcat-embed-core: 8.0.11</li>\n<li>slf4j: 1.7.25</li>\n<li>log4j: 1.2.16</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>理论上 Dubbo 可以只依赖 JDK,不依赖于任何三方库运行,只需配置使用 JDK 相关实现策略 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>字节码生成 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>配置解析 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>网络传输 <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p>JEE <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:1\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:2\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref5:3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
-  "title": "依赖",
-  "keywords": "必须依赖, 缺省依赖, 可选依赖",
-  "description": "Dubbo 依赖基本介绍"
+  "link": "/zh-cn/docs/user/dependencies.html",
+  "meta": {
+    "title": "依赖",
+    "keywords": "必须依赖, 缺省依赖, 可选依赖",
+    "description": "Dubbo 依赖基本介绍"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/maturity.json b/zh-cn/docs/user/maturity.json
index 10b4ab58..e4188193 100644
--- a/zh-cn/docs/user/maturity.json
+++ b/zh-cn/docs/user/maturity.json
@@ -1,7 +1,10 @@
 {
   "filename": "maturity.md",
   "__html": "<h1>成熟度</h1>\n<h2>功能成熟度</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Maturity</th>\n<th>Strength</th>\n<th>Problem</th>\n<th>Advise</th>\n<th>User</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>并发控制</td>\n<td>Tested</td>\n<td>并发控制</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>连接控制</td>\n<td>Tested</td>\n<td>连接数控制</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>直连提供者</td>\n<td>Tested</td>\n<td>点对点直连服务提供方,用于测试</td>\n<td></td>\n<td>测试环境使用</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>分组聚合</td>\n<td>Tested</td>\n<td>分组聚合返回值,用于菜单聚合等服务</td>\n<td>特殊场景使用</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>参数验证</td>\n<td>Tested</td>\n<td>参数验证,JSR303验证框架集成</td>\n<td>对性能有影响</td>\n<td>试用</td>\n<td>LaiWang</td>\n</tr>\n<tr>\n<td>结果缓存</td>\n<td>Tested</td>\n<td>结果缓存,用于加速请求</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>泛化引用</td>\n<td>Stable</td>\n<td>泛化调用,无需业务接口类进行远程调用,用于测试平台,开放网关桥接等</td>\n<td></td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>泛化实现</td>\n<td>Stable</td>\n<td>泛化实现,无需业务接口类实现任意接口,用于Mock平台</td>\n<td></td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>回声测试</td>\n<td>Tested</td>\n<td>回声测试</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>隐式传参</td>\n<td>Stable</td>\n<td>附加参数</td>\n<td></td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>异步调用</td>\n<td>Tested</td>\n<td>不可靠异步调用</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>本地调用</td>\n<td>Tested</td>\n<td>本地调用</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>参数回调</td>\n<td>Tested</td>\n<td>参数回调</td>\n<td>特殊场景使用</td>\n<td>试用</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>事件通知</td>\n<td>Tested</td>\n<td>事件通知,在远程调用执行前后触发</td>\n<td></td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>本地存根</td>\n<td>Stable</td>\n<td>在客户端执行部分逻辑</td>\n<td></td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>本地伪装</td>\n<td>Stable</td>\n<td>伪造返回结果,可在失败时执行,或直接执行,用于服务降级</td>\n<td>需注册中心支持</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>延迟暴露</td>\n<td>Stable</td>\n<td>延迟暴露服务,用于等待应用加载warmup数据,或等待spring加载完成</td>\n<td></td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>延迟连接</td>\n<td>Tested</td>\n<td>延迟建立连接,调用时建立</td>\n<td></td>\n<td>试用</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>粘滞连接</td>\n<td>Tested</td>\n<td>粘滞连接,总是向同一个提供方发起请求,除非此提供方挂掉,再切换到另一台</td>\n<td></td>\n<td>试用</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>令牌验证</td>\n<td>Tested</td>\n<td>令牌验证,用于服务授权</td>\n<td>需注册中心支持</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>路由规则</td>\n<td>Tested</td>\n<td>动态决定调用关系</td>\n<td>需注册中心支持</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>配置规则</td>\n<td>Tested</td>\n<td>动态下发配置,实现功能的开关</td>\n<td>需注册中心支持</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>访问日志</td>\n<td>Tested</td>\n<td>访问日志,用于记录调用信息</td>\n<td>本地存储,影响性能,受磁盘大小限制</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>分布式事务</td>\n<td>Research</td>\n<td>JTA/XA三阶段提交事务</td>\n<td>不稳定</td>\n<td>不可用</td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<h2>策略成熟度</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Maturity</th>\n<th>Strength</th>\n<th>Problem</th>\n<th>Advise</th>\n<th>User</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Zookeeper注册中心</td>\n<td>Stable</td>\n<td>支持基于网络的集群方式,有广泛周边开源产品,建议使用dubbo-2.3.3以上版本(推荐使用)</td>\n<td>依赖于Zookeeper的稳定性</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Redis注册中心</td>\n<td>Stable</td>\n<td>支持基于客户端双写的集群方式,性能高</td>\n<td>要求服务器时间同步,用于检查心跳过期脏数据</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Multicast注册中心</td>\n<td>Tested</td>\n<td>去中心化,不需要安装注册中心</td>\n<td>依赖于网络拓扑和路由,跨机房有风险</td>\n<td>小规模应用或开发测试环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Simple注册中心</td>\n<td>Tested</td>\n<td>Dogfooding,注册中心本身也是一个标准的RPC服务</td>\n<td>没有集群支持,可能单点故障</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Simple监控中心</td>\n<td>Stable</td>\n<td>支持JFreeChart统计报表</td>\n<td>没有集群支持,可能单点故障,但故障后不影响RPC运行</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Dubbo协议</td>\n<td>Stable</td>\n<td>采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)</td>\n<td>在大文件传输时,单一连接会成为瓶颈</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Rmi协议</td>\n<td>Stable</td>\n<td>可与原生RMI互操作,基于TCP协议</td>\n<td>偶尔会连接失败,需重建Stub</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Hessian协议</td>\n<td>Stable</td>\n<td>可与原生Hessian互操作,基于HTTP协议</td>\n<td>需hessian.jar支持,http短连接的开销大</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Netty Transporter</td>\n<td>Stable</td>\n<td>JBoss的NIO框架,性能较好(推荐使用)</td>\n<td>一次请求派发两种事件,需屏蔽无用事件</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Mina Transporter</td>\n<td>Stable</td>\n<td>老牌NIO框架,稳定</td>\n<td>待发送消息队列派发不及时,大压力下,会出现FullGC</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Grizzly Transporter</td>\n<td>Tested</td>\n<td>Sun的NIO框架,应用于GlassFish服务器中</td>\n<td>线程池不可扩展,Filter不能拦截下一Filter</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Hessian Serialization</td>\n<td>Stable</td>\n<td>性能较好,多语言支持(推荐使用)</td>\n<td>Hessian的各版本兼容性不好,可能和应用使用的Hessian冲突,Dubbo内嵌了hessian3.2.1的源码</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Dubbo Serialization</td>\n<td>Tested</td>\n<td>通过不传送POJO的类元信息,在大量POJO传输时,性能较好</td>\n<td>当参数对象增加字段时,需外部文件声明</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>Json Serialization</td>\n<td>Tested</td>\n<td>纯文本,可跨语言解析,缺省采用FastJson解析</td>\n<td>性能较差</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>Java Serialization</td>\n<td>Stable</td>\n<td>Java原生支持</td>\n<td>性能较差</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Javassist ProxyFactory</td>\n<td>Stable</td>\n<td>通过字节码生成代替反射,性能比较好(推荐使用)</td>\n<td>依赖于javassist.jar包,占用JVM的Perm内存,Perm可能要设大一些:java -XX:PermSize=128m</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Jdk ProxyFactory</td>\n<td>Stable</td>\n<td>JDK原生支持</td>\n<td>性能较差</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Failover Cluster</td>\n<td>Stable</td>\n<td>失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用)</td>\n<td>重试会带来更长延迟</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Failfast Cluster</td>\n<td>Stable</td>\n<td>快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作</td>\n<td>如果有机器正在重启,可能会出现调用失败</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Failsafe Cluster</td>\n<td>Stable</td>\n<td>失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作</td>\n<td>调用信息丢失</td>\n<td>可用于生产环境</td>\n<td>Monitor</td>\n</tr>\n<tr>\n<td>Failback Cluster</td>\n<td>Tested</td>\n<td>失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作</td>\n<td>不可靠,重启丢失</td>\n<td>可用于生产环境</td>\n<td>Registry</td>\n</tr>\n<tr>\n<td>Forking Cluster</td>\n<td>Tested</td>\n<td>并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读操作</td>\n<td>需要浪费更多服务资源</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Broadcast Cluster</td>\n<td>Tested</td>\n<td>广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供方本地状态</td>\n<td>速度慢,任意一台报错则报错</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Random LoadBalance</td>\n<td>Stable</td>\n<td>随机,按权重设置随机概率(推荐使用)</td>\n<td>在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>RoundRobin LoadBalance</td>\n<td>Stable</td>\n<td>轮询,按公约后的权重设置轮询比率</td>\n<td>存在慢的机器累积请求问题,极端情况可能产生雪崩</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>LeastActive LoadBalance</td>\n<td>Stable</td>\n<td>最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求</td>\n<td>不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>ConsistentHash LoadBalance</td>\n<td>Stable</td>\n<td>一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动</td>\n<td>压力分摊不均</td>\n<td>可用于生产环境</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>条件路由规则</td>\n<td>Stable</td>\n<td>基于条件表达式的路由规则,功能简单易用</td>\n<td>有些复杂多分支条件情况,规则很难描述</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>脚本路由规则</td>\n<td>Tested</td>\n<td>基于脚本引擎的路由规则,功能强大</td>\n<td>没有运行沙箱,脚本能力过于强大,可能成为后门</td>\n<td>试用</td>\n<td></td>\n</tr>\n<tr>\n<td>Feature</td>\n<td>Maturity</td>\n<td>Strength</td>\n<td>Problem</td>\n<td>Advise</td>\n<td>User</td>\n</tr>\n<tr>\n<td>Spring Container</td>\n<td>Stable</td>\n<td>自动加载META-INF/spring目录下的所有Spring配置</td>\n<td></td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Jetty Container</td>\n<td>Stable</td>\n<td>启动一个内嵌Jetty,用于汇报状态</td>\n<td>大量访问页面时,会影响服务器的线程和内存</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n<tr>\n<td>Log4j Container</td>\n<td>Stable</td>\n<td>自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录</td>\n<td>用户不能控制log4j的配置,不灵活</td>\n<td>可用于生产环境</td>\n<td>Alibaba</td>\n</tr>\n</tbody>\n</table>\n",
-  "title": "成熟度",
-  "keywords": "功能成熟度, 策略成熟度",
-  "description": "介绍 Dubbo 各个功能、策略的成熟度"
+  "link": "/zh-cn/docs/user/maturity.html",
+  "meta": {
+    "title": "成熟度",
+    "keywords": "功能成熟度, 策略成熟度",
+    "description": "介绍 Dubbo 各个功能、策略的成熟度"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/perf-test.json b/zh-cn/docs/user/perf-test.json
index 82c55e1e..6a18aeda 100644
--- a/zh-cn/docs/user/perf-test.json
+++ b/zh-cn/docs/user/perf-test.json
@@ -1,7 +1,10 @@
 {
   "filename": "perf-test.md",
   "__html": "<h1>性能测试报告</h1>\n<h2>测试说明</h2>\n<ol>\n<li>本次性能测试,测试了 dubbo 2.0 所有支持的协议在不同大小和数据类型下的表现,并与 dubbo 1.0 进行了对比。</li>\n<li>整体性能相比 1.0 有了提升,平均提升 10%,使用 dubbo 2.0 新增的 dubbo 序列化还能获得 10%~50% 的性能提升,详见下面的性能数据。</li>\n<li>稳定性测试中由于将底层通信框架从 mina 换成 netty,old 区对象的增长大大减少,50 小时运行,增长不到 200m,无 fullgc。</li>\n<li>存在的问题:在 50k 数据的时候 2.0 性能不如 1.0,怀疑可能是缓冲区设置的问题,下版本会进一步确认。</li>\n</ol>\n<h2>测试环境</h2>\n<h3>硬件部署与参数调整</h3>\n<table>\n<thead>\n<tr>\n<th>机型</th>\n<th>CPU</th>\n<th>内存</th>\n<th>网络</th>\n<th>磁盘</th>\n<th>内核</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Tecal BH620</td>\n<td>model name : Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz cache size : 8192 KB processor_count : 16</td>\n<td>Total System Memory: 6G Hardware Memory Info:  Size: 4096MB</td>\n<td>eth0: Link is up at 1000 Mbps, full duplex. peth0: Link is up at 1000 Mbps, full duplex.</td>\n<td>/dev/sda: 597.9 GB</td>\n<td>2.6.18-128.el5xen x86_64</td>\n</tr>\n</tbody>\n</table>\n<h3>软件架构</h3>\n<table>\n<thead>\n<tr>\n<th>软件名称及版本</th>\n<th>关键参数</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>java version &quot;1.6.0_18&quot; Java(TM) SE Runtime Environment (build 1.6.0_18-b07) Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)</td>\n<td>-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70</td>\n</tr>\n<tr>\n<td><a href=\"http://jboss-4.0.5.GA\">jboss-4.0.5.GA</a></td>\n<td></td>\n</tr>\n<tr>\n<td>httpd-2.0.61</td>\n<td>KeepAlive On MaxKeepAliveRequests 100000 KeepAliveTimeout 180 MaxRequestsPerChild 1000000 <IfModule worker.c>         StartServers 5         MaxClients 1024         MinSpareThreads 25         MaxSpareThreads 75         ThreadsPerChild 64         ThreadLimit 128         ServerLimit 16 </IfModule></td>\n</tr>\n</tbody>\n</table>\n<h2>测试目的</h2>\n<h3>期望性能指标(量化)</h3>\n<table>\n<thead>\n<tr>\n<th>场景名称</th>\n<th>对应指标名称</th>\n<th>期望值范围</th>\n<th>实际值</th>\n<th>是否满足期望(是/否)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1k数据</td>\n<td>响应时间</td>\n<td>0.9ms</td>\n<td>0.79ms</td>\n<td>是</td>\n</tr>\n<tr>\n<td>1k数据</td>\n<td>TPS</td>\n<td>10000</td>\n<td>11994</td>\n<td>是</td>\n</tr>\n</tbody>\n</table>\n<h3>期望运行状况(非量化,可选)</h3>\n<ul>\n<li>2.0 性能不低于 1.0, 2.0 和 1.0 互调用的性能无明显下降。 除了 50k string 其余皆通过</li>\n<li>JVM 内存运行稳定,无 OOM,堆内存中无不合理的大对象的占用。通过</li>\n<li>CPU、内存、网络、磁盘、文件句柄占用平稳。通过</li>\n<li>无频繁线程锁,线程数平稳。通过</li>\n<li>业务线程负载均衡。通过</li>\n</ul>\n<h2>测试脚本</h2>\n<ol start=\"0\">\n<li>\n<p>性能测试场景(10 并发)</p>\n<ul>\n<li>传入 1k String,不做任何处理,原样返回</li>\n<li>传入 50k String,不做任何处理,原样返回</li>\n<li>传入 200k String,不做任何处理,原样返回</li>\n<li>传入 1k POJO(嵌套的复杂 person 对象),不做任何处理,原样返回</li>\n</ul>\n<p>上述场景在 dubbo 1.0, dubbo 2.0(hessian2序列化), dubbo 2.0(dubbo序列化), rmi, hessian 3.2.0, http(json序列化) 进行 10 分钟的性能测试。主要考察序列化和网络 IO 的性能,因此服务端无任何业务逻辑。取 10 并发是考虑到 http 协议在高并发下对 CPU 的使用率较高可能会先打到瓶颈。</p>\n</li>\n<li>\n<p>并发场景(20 并发)\n传入 1k String,在服务器段循环 1w 次,每次重新生成一个随机数然后进行拼装。考察业务线程是否能够分配到每个 CPU 上。</p>\n</li>\n<li>\n<p>稳定性场景(20 并发)\n同时调用 1 个参数为 String(5k)方法,1 个参数为 person 对象的方法,1 个参数为 map(值为 3 个 person)的方法,持续运行 50 小时。</p>\n</li>\n<li>\n<p>高压力场景(20 并发)\n在稳定性场景的基础上,将提供者和消费者布置成均为 2 台(一台机器 2 个实例),且 String 的参数从 20byte 到 200k,每隔 10 分钟随机变换。</p>\n</li>\n</ol>\n<h2>测试结果</h2>\n<h3>场景名称:POJO 场景</h3>\n<table>\n<thead>\n<tr>\n<th>TPS成功平均值</th>\n<th>响应时间成功平均值(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1 (hessian2序列化+mina)</td>\n<td>10813.5</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2序列化+netty)</td>\n<td>11994</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo序列化+netty)</td>\n<td>13620</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>2461.79</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>2417.7</td>\n</tr>\n<tr>\n<td>http(json序列化)</td>\n<td>8179.08</td>\n</tr>\n<tr>\n<td>2.0和1.0默认对比百分比</td>\n<td>10.92</td>\n</tr>\n<tr>\n<td>dubbo序列化相比hessian2序列化百分比</td>\n<td>13.56</td>\n</tr>\n</tbody>\n</table>\n<p>POJO TPS</p>\n<p><img src=\"./sources/images/pojotps.png\" alt=\"pojotps.png\"></p>\n<p>POJO Response</p>\n<p><img src=\"./sources/images/pojores.png\" alt=\"pojores.png\"></p>\n<h3>场景名称:1k string 场景</h3>\n<table>\n<thead>\n<tr>\n<th>TPS成功平均值</th>\n<th>响应时间成功平均值(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2序列化+mina)</td>\n<td>11940</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2序列化+netty)</td>\n<td>14402</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo序列化+netty)</td>\n<td>15096</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>11136.02</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>11426.83</td>\n</tr>\n<tr>\n<td>http(json序列化)</td>\n<td>8919.27</td>\n</tr>\n<tr>\n<td>2.0和1.0默认对比百分比</td>\n<td>20.62</td>\n</tr>\n<tr>\n<td>dubbo序列化相比hessian2序列化百分比</td>\n<td>4.82</td>\n</tr>\n</tbody>\n</table>\n<p>1k TPS</p>\n<p><img src=\"./sources/images/1ktps.png\" alt=\"1ktps.png\"></p>\n<p>1k Response</p>\n<p><img src=\"./sources/images/1kres.png\" alt=\"1kres.png\"></p>\n<h3>场景名称:50k string 场景</h3>\n<table>\n<thead>\n<tr>\n<th>TPS成功平均值</th>\n<th>响应时间成功平均值(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2序列化+mina</td>\n<td>1962.7</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2序列化+netty)</td>\n<td>1293</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo序列化+netty)</td>\n<td>1966</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>3349.88</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>1925.33</td>\n</tr>\n<tr>\n<td>http(json序列化)</td>\n<td>3247.1</td>\n</tr>\n<tr>\n<td>2.0和1.0默认对比百分比</td>\n<td>-34.12</td>\n</tr>\n<tr>\n<td>dubbo序列化相比hessian2序列化百分比</td>\n<td>52.05</td>\n</tr>\n</tbody>\n</table>\n<p>50K TPS</p>\n<p><img src=\"./sources/images/50ktps.png\" alt=\"50ktps.png\"></p>\n<p>50K Response</p>\n<p><img src=\"./sources/images/50kres.png\" alt=\"50kres.png\"></p>\n<h3>场景名称:200k string 场景</h3>\n<table>\n<thead>\n<tr>\n<th>TPS成功平均值</th>\n<th>响应时间成功平均值(ms)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>dubbo1(hessian2序列化+mina)</td>\n<td>324.2</td>\n</tr>\n<tr>\n<td>dubbo2 (hessian2序列化+netty)</td>\n<td>362.92</td>\n</tr>\n<tr>\n<td>dubbo2 (dubbo序列化+netty)</td>\n<td>569.5</td>\n</tr>\n<tr>\n<td>rmi</td>\n<td>1031.28</td>\n</tr>\n<tr>\n<td>hessian</td>\n<td>628.06</td>\n</tr>\n<tr>\n<td>http(json序列化)</td>\n<td>1011.97</td>\n</tr>\n<tr>\n<td>2.0和1.0默认对比百分比</td>\n<td>11.94</td>\n</tr>\n<tr>\n<td>dubbo序列化相比hessian2序列化百分比</td>\n<td>56.92</td>\n</tr>\n</tbody>\n</table>\n<p>200K TPS</p>\n<p><img src=\"./sources/images/200ktps.png\" alt=\"200ktps.png\"></p>\n<p><strong>200K Response</strong></p>\n<p><img src=\"./sources/images/200kres.png\" alt=\"200kres.png\"></p>\n<h2>测试分析</h2>\n<h3>性能分析评估</h3>\n<p>Dubbo 2.0 的性能测试结论为通过,从性能、内存占用和稳定性上都有了提高和改进。由其是内存管理由于将 mina 换成netty,大大减少了 1.0 版本在高并发大数据下的内存大锯齿。</p>\n<h3>性能对比分析(新旧环境、不同数据量级等)</h3>\n<p>Dubbo 2.0 相比较Dubbo 1.0(默认使用的都是 hessian2 序列化)性能均有提升(除了50k String),详见第五章的性能数据。</p>\n<p>出于兼容性考虑默认的序列化方式和 1.0 保持一致使用 hessian2,如对性能有更高要求可以使用 dubbo 序列化,由其是在处理复杂对象时,在大数据量下能获得 50% 的提升(但此时已不建议使用 Dubbo 协议)。</p>\n<p>Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。</p>\n<h3>测试局限性分析(可选)</h3>\n<p>本次性能测试考察的是 dubbo 本身的性能,实际使用过程中的性能有待应用来验证。</p>\n<p>由于 dubbo 本身的性能占用都在毫秒级,占的基数很小,性能提升可能对应用整体的性能变化不大。</p>\n<p>由于邮件篇幅所限没有列出所有的监控图,如需获得可在大力神平台上查询。</p>\n",
-  "title": "性能测试报告",
-  "keywords": "性能测试",
-  "description": "Dubbo 2.0 性能测试报告"
+  "link": "/zh-cn/docs/user/perf-test.html",
+  "meta": {
+    "title": "性能测试报告",
+    "keywords": "性能测试",
+    "description": "Dubbo 2.0 性能测试报告"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/preface/architecture.json b/zh-cn/docs/user/preface/architecture.json
index 2625dc7c..4bed880b 100644
--- a/zh-cn/docs/user/preface/architecture.json
+++ b/zh-cn/docs/user/preface/architecture.json
@@ -1,4 +1,6 @@
 {
   "filename": "architecture.md",
-  "__html": "<h1>架构</h1>\n<p><img src=\"../sources/images/dubbo-architecture.jpg\" alt=\"dubbo-architucture\"></p>\n<h5>节点角色说明</h5>\n<table>\n<thead>\n<tr>\n<th>节点</th>\n<th>角色说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Provider</code></td>\n<td>暴露服务的服务提供方</td>\n</tr>\n<tr>\n<td><code>Consumer</code></td>\n<td>调用远程服务的服务消费方</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>服务注册与发现的注册中心</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>统计服务的调用次数和调用时间的监控中心</td>\n</tr>\n<tr>\n<td><code>Container</code></td>\n<td>服务运行容器</td>\n</tr>\n</tbody>\n</table>\n<h5>调用关系说明</h5>\n<ol start=\"0\">\n<li>服务容器负责启动,加载,运行服务提供者。</li>\n<li>服务提供者在启动时,向注册中心注册自己提供的服务。</li>\n<li>服务消费者在启动时,向注册中心订阅自己所需的服务。</li>\n<li>注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。</li>\n<li>服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。</li>\n<li>服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。</li>\n</ol>\n<p>Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。</p>\n<h2>连通性</h2>\n<ul>\n<li>注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小</li>\n<li>监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示</li>\n<li>服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销</li>\n<li>服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销</li>\n<li>注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外</li>\n<li>注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者</li>\n<li>注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表</li>\n<li>注册中心和监控中心都是可选的,服务消费者可以直连服务提供者</li>\n</ul>\n<h2>健壮性</h2>\n<ul>\n<li>监控中心宕掉不影响使用,只是丢失部分采样数据</li>\n<li>数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务</li>\n<li>注册中心对等集群,任意一台宕掉后,将自动切换到另一台</li>\n<li>注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯</li>\n<li>服务提供者无状态,任意一台宕掉后,不影响使用</li>\n<li>服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复</li>\n</ul>\n<h2>伸缩性</h2>\n<ul>\n<li>注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心</li>\n<li>服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者</li>\n</ul>\n<h2>升级性</h2>\n<p>当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:</p>\n<p><img src=\"../sources/images/dubbo-architecture-future.jpg\" alt=\"dubbo-architucture-futures\"></p>\n<h5>节点角色说明</h5>\n<table>\n<thead>\n<tr>\n<th>节点</th>\n<th>角色说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Deployer</code></td>\n<td>自动部署服务的本地代理</td>\n</tr>\n<tr>\n<td><code>Repository</code></td>\n<td>仓库用于存储服务应用发布包</td>\n</tr>\n<tr>\n<td><code>Scheduler</code></td>\n<td>调度中心基于访问压力自动增减服务提供者</td>\n</tr>\n<tr>\n<td><code>Admin</code></td>\n<td>统一管理控制台</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>服务注册与发现的注册中心</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>统计服务的调用次数和调用时间的监控中心</td>\n</tr>\n</tbody>\n</table>\n"
+  "__html": "<h1>架构</h1>\n<p><img src=\"../sources/images/dubbo-architecture.jpg\" alt=\"dubbo-architucture\"></p>\n<h5>节点角色说明</h5>\n<table>\n<thead>\n<tr>\n<th>节点</th>\n<th>角色说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Provider</code></td>\n<td>暴露服务的服务提供方</td>\n</tr>\n<tr>\n<td><code>Consumer</code></td>\n<td>调用远程服务的服务消费方</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>服务注册与发现的注册中心</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>统计服务的调用次数和调用时间的监控中心</td>\n</tr>\n<tr>\n<td><code>Container</code></td>\n<td>服务运行容器</td>\n</tr>\n</tbody>\n</table>\n<h5>调用关系说明</h5>\n<ol start=\"0\">\n<li>服务容器负责启动,加载,运行服务提供者。</li>\n<li>服务提供者在启动时,向注册中心注册自己提供的服务。</li>\n<li>服务消费者在启动时,向注册中心订阅自己所需的服务。</li>\n<li>注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。</li>\n<li>服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。</li>\n<li>服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。</li>\n</ol>\n<p>Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。</p>\n<h2>连通性</h2>\n<ul>\n<li>注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小</li>\n<li>监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示</li>\n<li>服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销</li>\n<li>服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销</li>\n<li>注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外</li>\n<li>注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者</li>\n<li>注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表</li>\n<li>注册中心和监控中心都是可选的,服务消费者可以直连服务提供者</li>\n</ul>\n<h2>健壮性</h2>\n<ul>\n<li>监控中心宕掉不影响使用,只是丢失部分采样数据</li>\n<li>数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务</li>\n<li>注册中心对等集群,任意一台宕掉后,将自动切换到另一台</li>\n<li>注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯</li>\n<li>服务提供者无状态,任意一台宕掉后,不影响使用</li>\n<li>服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复</li>\n</ul>\n<h2>伸缩性</h2>\n<ul>\n<li>注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心</li>\n<li>服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者</li>\n</ul>\n<h2>升级性</h2>\n<p>当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:</p>\n<p><img src=\"../sources/images/dubbo-architecture-future.jpg\" alt=\"dubbo-architucture-futures\"></p>\n<h5>节点角色说明</h5>\n<table>\n<thead>\n<tr>\n<th>节点</th>\n<th>角色说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Deployer</code></td>\n<td>自动部署服务的本地代理</td>\n</tr>\n<tr>\n<td><code>Repository</code></td>\n<td>仓库用于存储服务应用发布包</td>\n</tr>\n<tr>\n<td><code>Scheduler</code></td>\n<td>调度中心基于访问压力自动增减服务提供者</td>\n</tr>\n<tr>\n<td><code>Admin</code></td>\n<td>统一管理控制台</td>\n</tr>\n<tr>\n<td><code>Registry</code></td>\n<td>服务注册与发现的注册中心</td>\n</tr>\n<tr>\n<td><code>Monitor</code></td>\n<td>统计服务的调用次数和调用时间的监控中心</td>\n</tr>\n</tbody>\n</table>\n",
+  "link": "/zh-cn/docs/user/preface/architecture.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/preface/background.json b/zh-cn/docs/user/preface/background.json
index b44bafb5..d4af0a88 100644
--- a/zh-cn/docs/user/preface/background.json
+++ b/zh-cn/docs/user/preface/background.json
@@ -1,4 +1,6 @@
 {
   "filename": "background.md",
-  "__html": "<h1>背景</h1>\n<p>随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。</p>\n<p><img src=\"../sources/images/dubbo-architecture-roadmap.jpg\" alt=\"image\"></p>\n<h4>单一应用架构</h4>\n<p>当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。</p>\n<h4>垂直应用架构</h4>\n<p>当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。</p>\n<h4>分布式服务架构</h4>\n<p>当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。</p>\n<h4>流动计算架构</h4>\n<p>当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。</p>\n"
+  "__html": "<h1>背景</h1>\n<p>随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。</p>\n<p><img src=\"../sources/images/dubbo-architecture-roadmap.jpg\" alt=\"image\"></p>\n<h4>单一应用架构</h4>\n<p>当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。</p>\n<h4>垂直应用架构</h4>\n<p>当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。</p>\n<h4>分布式服务架构</h4>\n<p>当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。</p>\n<h4>流动计算架构</h4>\n<p>当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。</p>\n",
+  "link": "/zh-cn/docs/user/preface/background.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/preface/index.json b/zh-cn/docs/user/preface/index.json
index d7de1863..08f47bb6 100644
--- a/zh-cn/docs/user/preface/index.json
+++ b/zh-cn/docs/user/preface/index.json
@@ -1,4 +1,6 @@
 {
   "filename": "index.md",
-  "__html": "<h1>入门</h1>\n"
+  "__html": "<h1>入门</h1>\n",
+  "link": "/zh-cn/docs/user/preface/index.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/preface/requirements.json b/zh-cn/docs/user/preface/requirements.json
index ffd43fee..7941a54b 100644
--- a/zh-cn/docs/user/preface/requirements.json
+++ b/zh-cn/docs/user/preface/requirements.json
@@ -1,4 +1,6 @@
 {
   "filename": "requirements.md",
-  "__html": "<h1>需求</h1>\n<p><img src=\"../sources/images/dubbo-service-governance.jpg\" alt=\"image\"></p>\n<p>在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。</p>\n<p><strong>当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。</strong> 此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。</p>\n<p><strong>当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。</strong>  这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。</p>\n<p><strong>接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?</strong>  为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量。</p>\n<p>以上是 Dubbo 最基本的几个需求。</p>\n"
+  "__html": "<h1>需求</h1>\n<p><img src=\"../sources/images/dubbo-service-governance.jpg\" alt=\"image\"></p>\n<p>在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。</p>\n<p><strong>当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。</strong> 此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。</p>\n<p><strong>当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。</strong>  这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。</p>\n<p><strong>接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?</strong>  为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阈值,记录此时的访问量,再以此访问量乘以机器数反推总容量。</p>\n<p>以上是 Dubbo 最基本的几个需求。</p>\n",
+  "link": "/zh-cn/docs/user/preface/requirements.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/preface/usage.json b/zh-cn/docs/user/preface/usage.json
index dde848dc..e5a63a10 100644
--- a/zh-cn/docs/user/preface/usage.json
+++ b/zh-cn/docs/user/preface/usage.json
@@ -1,4 +1,6 @@
 {
   "filename": "usage.md",
-  "__html": "<h1>用法</h1>\n<h2>本地服务 Spring 配置</h2>\n<p>local.xml:</p>\n<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\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n<h2>远程服务 Spring 配置</h2>\n<p>在本地服务的基础上,只需做简单配置,即可完成远程化:</p>\n<ul>\n<li>将上面的 <code>local.xml</code> 配置拆分成两份,将服务定义部分放在服务提供方 <code>remote-provider.xml</code>,将服务引用部分放在服务消费方 <code>remote-consumer.xml</code>。</li>\n<li>并在提供方增加暴露服务配置 <code>&lt;dubbo:service&gt;</code>,在消费方增加引用服务配置 <code>&lt;dubbo:reference&gt;</code>。</li>\n</ul>\n<p>remote-provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 和本地服务一样实现远程服务 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 增加暴露远程服务配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span> \n</code></pre>\n<p>remote-consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 增加引用远程服务配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 和本地服务一样使用远程服务 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span> \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n"
+  "__html": "<h1>用法</h1>\n<h2>本地服务 Spring 配置</h2>\n<p>local.xml:</p>\n<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\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n<h2>远程服务 Spring 配置</h2>\n<p>在本地服务的基础上,只需做简单配置,即可完成远程化:</p>\n<ul>\n<li>将上面的 <code>local.xml</code> 配置拆分成两份,将服务定义部分放在服务提供方 <code>remote-provider.xml</code>,将服务引用部分放在服务消费方 <code>remote-consumer.xml</code>。</li>\n<li>并在提供方增加暴露服务配置 <code>&lt;dubbo:service&gt;</code>,在消费方增加引用服务配置 <code>&lt;dubbo:reference&gt;</code>。</li>\n</ul>\n<p>remote-provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 和本地服务一样实现远程服务 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxServiceImpl”</span> /&gt;</span> \n<span class=\"hljs-comment\">&lt;!-- 增加暴露远程服务配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span> \n</code></pre>\n<p>remote-consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-comment\">&lt;!-- 增加引用远程服务配置 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">“com.xxx.XxxService”</span> /&gt;</span>\n<span class=\"hljs-comment\">&lt;!-- 和本地服务一样使用远程服务 --&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">“xxxAction”</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">“com.xxx.XxxAction”</span>&gt;</span> \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">“xxxService”</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">“xxxService”</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">bean</span>&gt;</span>\n</code></pre>\n",
+  "link": "/zh-cn/docs/user/preface/usage.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/quick-start.json b/zh-cn/docs/user/quick-start.json
index d00c809a..5d41d8b8 100644
--- a/zh-cn/docs/user/quick-start.json
+++ b/zh-cn/docs/user/quick-start.json
@@ -1,7 +1,10 @@
 {
   "filename": "quick-start.md",
   "__html": "<h1>快速启动</h1>\n<p>Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 <a href=\"https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/xsd-configuration.html\">Spring 的 Schema 扩展</a> 进行加载。</p>\n<p>如果不想使用 Spring 配置,可以通过 <a href=\"./configuration/api.md\">API 的方式</a> 进行调用。</p>\n<h2>服务提供者</h2>\n<p>完整安装步骤,请参见:<a href=\"../admin/install/provider-demo.md\">示例提供者安装</a></p>\n<h3>定义服务接口</h3>\n<p>DemoService.java <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.demo;\n\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">DemoService</span> </span>{\n    <span class=\"hljs-function\">String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span></span>;\n}\n</code></pre>\n<h3>在服务提供方实现接口</h3>\n<p>DemoServiceImpl.java <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</p>\n<pre><code class=\"language-java\">\n<span class=\"hljs-keyword\">package</span> com.alibaba.dubbo.demo.provider;\n \n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.demo.DemoService;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DemoServiceImpl</span> <span class=\"hljs-keyword\">implements</span> <span class=\"hljs-title\">DemoService</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> String <span class=\"hljs-title\">sayHello</span><span class=\"hljs-params\">(String name)</span> </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">\"Hello \"</span> + name;\n    }\n}\n</code></pre>\n<h3>用 Spring 配置声明暴露服务</h3>\n<p>provider.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 提供方应用信息,用于计算依赖关系 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hello-world-app\"</span>  /&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 使用multicast广播注册中心暴露服务地址 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 用dubbo协议在20880端口暴露服务 --&gt;</span>\n    <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\">\"20880\"</span> /&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 声明需要暴露的服务接口 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.DemoService\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"demoService\"</span> /&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 和本地bean一样实现服务 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bean</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"demoService\"</span> <span class=\"hljs-attr\">class</span>=<span class=\"hljs-string\">\"com.alibaba.dubbo.demo.provider.DemoServiceImpl\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>加载 Spring 配置</h3>\n<p>Provider.java:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Provider</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/provider.xml\"</span>});\n        context.start();\n        System.in.read(); <span class=\"hljs-comment\">// 按任意键退出</span>\n    }\n}\n</code></pre>\n<h2>服务消费者</h2>\n<p>完整安装步骤,请参见:<a href=\"../admin/install/consumer-demo.md\">示例消费者安装</a></p>\n<h3>通过 Spring 配置引用远程服务</h3>\n<p>consumer.xml:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-meta\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hljs-attr\">xmlns</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans\"</span>\n    <span class=\"hljs-attr\">xmlns:xsi</span>=<span class=\"hljs-string\">\"http://www.w3.org/2001/XMLSchema-instance\"</span>\n    <span class=\"hljs-attr\">xmlns:dubbo</span>=<span class=\"hljs-string\">\"http://dubbo.apache.org/schema/dubbo\"</span>\n    <span class=\"hljs-attr\">xsi:schemaLocation</span>=<span class=\"hljs-string\">\"http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd\"</span>&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"consumer-of-helloworld-app\"</span>  /&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 使用multicast广播注册中心暴露发现服务地址 --&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"multicast://224.5.6.7:1234\"</span> /&gt;</span>\n \n    <span class=\"hljs-comment\">&lt;!-- 生成远程服务代理,可以和本地bean一样使用demoService --&gt;</span>\n    <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\">\"com.alibaba.dubbo.demo.DemoService\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">beans</span>&gt;</span>\n</code></pre>\n<h3>加载Spring配置,并调用远程服务</h3>\n<p>Consumer.java <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;\n<span class=\"hljs-keyword\">import</span> com.alibaba.dubbo.demo.DemoService;\n \n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Consumer</span> </span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">void</span> <span class=\"hljs-title\">main</span><span class=\"hljs-params\">(String[] args)</span> <span class=\"hljs-keyword\">throws</span> Exception </span>{\n        ClassPathXmlApplicationContext context = <span class=\"hljs-keyword\">new</span> ClassPathXmlApplicationContext(<span class=\"hljs-keyword\">new</span> String[] {<span class=\"hljs-string\">\"http://10.20.160.198/wiki/display/dubbo/consumer.xml\"</span>});\n        context.start();\n        DemoService demoService = (DemoService)context.getBean(<span class=\"hljs-string\">\"demoService\"</span>); <span class=\"hljs-comment\">// 获取远程服务代理</span>\n        String hello = demoService.sayHello(<span class=\"hljs-string\">\"world\"</span>); <span class=\"hljs-comment\">// 执行远程方法</span>\n        System.out.println( hello ); <span class=\"hljs-comment\">// 显示调用结果</span>\n    }\n}\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>该接口需单独打包,在服务提供方和消费方共享 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>对服务消费方隐藏实现 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>也可以使用 IoC 注入 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
-  "title": "快速启动",
-  "keywords": "XML configuration, Consumer, Provider",
-  "description": "使用 XML 配置方式快速上手 Dubbo"
+  "link": "/zh-cn/docs/user/quick-start.html",
+  "meta": {
+    "title": "快速启动",
+    "keywords": "XML configuration, Consumer, Provider",
+    "description": "使用 XML 配置方式快速上手 Dubbo"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/recommend.json b/zh-cn/docs/user/recommend.json
index 34836a40..7fe950ef 100644
--- a/zh-cn/docs/user/recommend.json
+++ b/zh-cn/docs/user/recommend.json
@@ -1,7 +1,10 @@
 {
   "filename": "recommend.md",
   "__html": "<h1>推荐用法</h1>\n<h2>在 Provider 上尽量多配置 Consumer 端属性</h2>\n<p>原因如下:</p>\n<ul>\n<li>作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间、合理的重试次数等</li>\n<li>在 Provider 配置后,Consumer 不配置则会使用 Provider 的配置值,即 Provider 配置可以作为 Consumer 的缺省值 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。否则,Consumer 会使用 Consumer 端的全局设置,这对于 Provider 是不可控的,并且往往是不合理的</li>\n</ul>\n<p>Provider 上尽量多配置 Consumer 端的属性,让 Provider 实现者一开始就思考 Provider 服务特点、服务质量等问题。</p>\n<p>示例:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"300\"</span> <span class=\"hljs-attr\">retry</span>=<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"random\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"0\"</span> /&gt;</span>\n \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.WorldService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"300\"</span> <span class=\"hljs-attr\">retry</span>=<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"random\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"0\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findAllPerson\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"10000\"</span> <span class=\"hljs-attr\">retries</span>=<span class=\"hljs-string\">\"9\"</span> <span class=\"hljs-attr\">loadbalance</span>=<span class=\"hljs-string\">\"leastactive\"</span> <span class=\"hljs-attr\">actives</span>=<span class=\"hljs-string\">\"5\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span>/&gt;</span>\n</code></pre>\n<p>在 Provider 上可以配置的 Consumer 端属性有:</p>\n<ol>\n<li><code>timeout</code> 方法调用超时</li>\n<li><code>retries</code> 失败重试次数,缺省是 2 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup></li>\n<li><code>loadbalance</code> 负载均衡算法 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,缺省是随机 <code>random</code>。还可以有轮询 <code>roundrobin</code>、最不活跃优先 <sup class=\"footnote-ref\"><a href=\"#fn4\" id=\"fnref4\">[4]</a></sup> <code>leastactive</code> 等</li>\n<li><code>actives</code> 消费者端,最大并发调用限制,即当 Consumer 对一个服务的并发调用到上限后,新调用会阻塞直到超时,在方法上配置 <code>dubbo:method</code> 则并发限制针对方法,在接口上配置 <code>dubbo:service</code>,则并发限制针对服务</li>\n</ol>\n<p>详细配置说明参见:<a href=\"./references/xml/introduction.md\">Dubbo配置参考手册</a></p>\n<h2>Provider 上配置合理的 Provider 端属性</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"200\"</span> /&gt;</span> \n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.hello.api.HelloService\"</span> <span class=\"hljs-attr\">version</span>=<span class=\"hljs-string\">\"1.0.0\"</span> <span class=\"hljs-attr\">ref</span>=<span class=\"hljs-string\">\"helloService\"</span>\n    <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"200\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findAllPerson\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"50\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>Provider 上可以配置的 Provider 端属性有:</p>\n<ol>\n<li><code>threads</code> 服务线程池大小</li>\n<li><code>executes</code> 一个服务提供者并行执行请求上限,即当 Provider 对一个服务的并发调用达到上限后,新调用会阻塞,此时 Consumer 可能会超时。在方法上配置 <code>dubbo:method</code> 则并发限制针对方法,在接口上配置 <code>dubbo:service</code>,则并发限制针对服务</li>\n</ol>\n<h2>配置管理信息</h2>\n<p>目前有负责人信息和组织信息用于区分站点。有问题时便于的找到服务的负责人,至少写两个人以便备份。负责人和组织的信息可以在注册中心的上看到。</p>\n<p>应用配置负责人、组织:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> <span class=\"hljs-attr\">organization</span>=<span class=\"hljs-string\">”intl”</span> /&gt;</span>\n</code></pre>\n<p>service 配置负责人:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> /&gt;</span>\n</code></pre>\n<p>reference 配置负责人:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">owner</span>=<span class=\"hljs-string\">”ding.lid,william.liangf”</span> /&gt;</span>\n</code></pre>\n<p>若没有配置 service 和 reference 的负责人,则默认使用 <code>dubbo:application</code> 设置的负责人。</p>\n<h2>配置 Dubbo 缓存文件</h2>\n<p>提供者列表缓存文件:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">file</span>=<span class=\"hljs-string\">”${user.home}/output/dubbo.cache”</span> /&gt;</span>\n</code></pre>\n<p>注意:</p>\n<ol>\n<li>应用可以根据需要调整缓存文件的路径,保证这个文件不会在发布过程中被清除;</li>\n<li>如果有多个应用进程,注意不要使用同一个文件,避免内容被覆盖;</li>\n</ol>\n<p>该文件会缓存注册中心列表和服务提供者列表。配置缓存文件后,应用重启过程中,若注册中心不可用,应用会从该缓存文件读取服务提供者列表,进一步保证应用可靠性。</p>\n<h2>监控配置</h2>\n<ol>\n<li>\n<p>使用固定端口暴露服务,而不要使用随机端口</p>\n<p>这样在注册中心推送有延迟的情况下,消费者通过缓存列表也能调用到原地址,保证调用成功。</p>\n</li>\n<li>\n<p>使用 Dubbo Ops 监控注册中心上的服务提供方</p>\n<p>使用 <a href=\"https://github.com/apache/incubator-dubbo-ops\">Dubbo Ops</a> 监控服务在注册中心上的状态,确保注册中心上有该服务的存在。</p>\n</li>\n<li>\n<p>服务提供方,使用 Dubbo Qos 的 telnet 或 shell 监控项</p>\n<p>监控服务提供者端口状态:<code>echo status | nc -i 1 20880 | grep OK | wc -l</code>,其中的 20880 为服务端口</p>\n</li>\n<li>\n<p>服务消费方,通过将服务强制转型为 EchoService,并调用 <code>$echo()</code> 测试该服务的提供者是可用</p>\n<p>如 <code>assertEqauls(“OK”, ((EchoService)memberService).$echo(“OK”));</code></p>\n</li>\n</ol>\n<h2>不要使用 dubbo.properties 文件配置,推荐使用对应 XML 配置</h2>\n<p>Dubbo 中所有的配置项都可以配置在 Spring 配置文件中,并且可以针对单个服务配置。</p>\n<p>如完全不配置则使用 Dubbo 缺省值,参见 <a href=\"./references/xml/introduction.md\">Dubbo配置参考手册</a> 中的说明。</p>\n<h3>dubbo.properties 中属性名与 XML 的对应关系</h3>\n<ol>\n<li>\n<p>应用名 <code>dubbo.application.name</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:application</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"myalibaba\"</span> &gt;</span>\n</code></pre>\n</li>\n<li>\n<p>注册中心地址 <code>dubbo.registry.address</code></p>\n<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\">\"11.22.33.44:9090\"</span> &gt;</span>\n</code></pre>\n</li>\n<li>\n<p>调用超时 <code>dubbo.service.*.timeout</code></p>\n<p>可以在多个配置项设置超时 <code>timeout</code>,由上至下覆盖(即上面的优先)<sup class=\"footnote-ref\"><a href=\"#fn5\" id=\"fnref5\">[5]</a></sup>,其它的参数(<code>retries</code>、<code>loadbalance</code>、<code>actives</code>等)的覆盖策略与 <code>timeout</code> 相同。示例如下:</p>\n<p>提供者端特定方法的配置</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> &gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:method</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"findPerson\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dubbo:service</span>&gt;</span>\n</code></pre>\n<p>提供者端特定接口的配置</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">timeout</span>=<span class=\"hljs-string\">\"200\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>服务提供者协议 <code>dubbo.service.protocol</code>、服务的监听端口 <code>dubbo.service.server.port</code></p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>服务线程池大小 <code>dubbo.service.max.thread.threads.size</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">\"100\"</span> /&gt;</span>\n</code></pre>\n</li>\n<li>\n<p>消费者启动时,没有提供者是否抛异常 <code>alibaba.intl.commons.dubbo.service.allow.no.provider</code></p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.alibaba.xxx.XxxService\"</span> <span class=\"hljs-attr\">check</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n</li>\n</ol>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>配置的覆盖规则:1) 方法级别配置优于接口级别,即小 Scope 优先 2) Consumer 端配置优于 Provider 配置,优于全局配置,最后是Dubbo 硬编码的配置值(<a href=\"./configuration/properties.md#%E8%A6%86%E7%9B%96%E7%AD%96%E7%95%A5\">Dubbo 配置参考手册</a>) <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>表示加上第一次调用,会调用 3 次 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>有多个 Provider 时,如何挑选 Provider 调用 <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn4\" class=\"footnote-item\"><p>指从 Consume r端并发调用最好的 Provider,可以减少的反应慢的 Provider 的调用,因为反应更容易累积并发的调用 <a href=\"#fnref4\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn5\" class=\"footnote-item\"><p><code>timeout</code> 可以在多处设置,配置项及覆盖规则详见: <a href=\"./references/xml/introduction.md\">Dubbo 配置参考手册</a> <a href=\"#fnref5\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
-  "title": "推荐用法",
-  "keywords": "Provider 配置, 管理信息, 缓存, 监控",
-  "description": "Dubbo 推荐用法举例"
+  "link": "/zh-cn/docs/user/recommend.html",
+  "meta": {
+    "title": "推荐用法",
+    "keywords": "Provider 配置, 管理信息, 缓存, 监控",
+    "description": "Dubbo 推荐用法举例"
+  }
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/api.json b/zh-cn/docs/user/references/api.json
index 0c62e6a8..4f713fbe 100644
--- a/zh-cn/docs/user/references/api.json
+++ b/zh-cn/docs/user/references/api.json
@@ -1,4 +1,6 @@
 {
   "filename": "api.md",
-  "__html": "<h1>API 参考手册</h1>\n<p>Dubbo 的常规功能,都保持零侵入,但有些功能不得不用 API 侵入才能实现 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<p>API 汇总如下:</p>\n<h2>配置 API</h2>\n<pre><code>com.alibaba.dubbo.config.ServiceConfig\ncom.alibaba.dubbo.config.ReferenceConfig\ncom.alibaba.dubbo.config.ProtocolConfig\ncom.alibaba.dubbo.config.RegistryConfig\ncom.alibaba.dubbo.config.MonitorConfig\ncom.alibaba.dubbo.config.ApplicationConfig\ncom.alibaba.dubbo.config.ModuleConfig\ncom.alibaba.dubbo.config.ProviderConfig\ncom.alibaba.dubbo.config.ConsumerConfig\ncom.alibaba.dubbo.config.MethodConfig\ncom.alibaba.dubbo.config.ArgumentConfig\n</code></pre>\n<p>详细参见:<a href=\"../configuration/api.md\">API配置</a></p>\n<h2>注解 API</h2>\n<pre><code>com.alibaba.dubbo.config.annotation.Service\ncom.alibaba.dubbo.config.annotation.Reference\n</code></pre>\n<p>详细参见:<a href=\"../configuration/annotation.md\">注解配置</a></p>\n<h2>模型 API</h2>\n<pre><code>com.alibaba.dubbo.common.URL\ncom.alibaba.dubbo.rpc.RpcException\n</code></pre>\n<h2>上下文 API</h2>\n<pre><code>com.alibaba.dubbo.rpc.RpcContext\n</code></pre>\n<p>详细参见:<a href=\"../demos/context.md\">上下文信息</a> &amp; <a href=\"../demos/attachment.md\">隐式传参</a> &amp; <a href=\"../demos/async-call.md\">异步调用</a></p>\n<h2>服务API</h2>\n<pre><code>com.alibaba.dubbo.rpc.service.GenericService\ncom.alibaba.dubbo.rpc.service.GenericException\n</code></pre>\n<p>详细参见:<a href=\"../demos/generic-reference.md\">泛化引用</a> &amp; <a href=\"../demos/generic-service.md\">泛化实现</a></p>\n<pre><code>com.alibaba.dubbo.rpc.service.EchoService\n</code></pre>\n<p>详细参见:<a href=\"../demos/echo-service.md\">回声测试</a></p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:Dubbo 中除这里声明以外的接口或类,都是内部接口或扩展接口,普通用户请不要直接依赖,否则升级版本可能出现不兼容。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>API 参考手册</h1>\n<p>Dubbo 的常规功能,都保持零侵入,但有些功能不得不用 API 侵入才能实现 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。</p>\n<p>API 汇总如下:</p>\n<h2>配置 API</h2>\n<pre><code>com.alibaba.dubbo.config.ServiceConfig\ncom.alibaba.dubbo.config.ReferenceConfig\ncom.alibaba.dubbo.config.ProtocolConfig\ncom.alibaba.dubbo.config.RegistryConfig\ncom.alibaba.dubbo.config.MonitorConfig\ncom.alibaba.dubbo.config.ApplicationConfig\ncom.alibaba.dubbo.config.ModuleConfig\ncom.alibaba.dubbo.config.ProviderConfig\ncom.alibaba.dubbo.config.ConsumerConfig\ncom.alibaba.dubbo.config.MethodConfig\ncom.alibaba.dubbo.config.ArgumentConfig\n</code></pre>\n<p>详细参见:<a href=\"../configuration/api.md\">API配置</a></p>\n<h2>注解 API</h2>\n<pre><code>com.alibaba.dubbo.config.annotation.Service\ncom.alibaba.dubbo.config.annotation.Reference\n</code></pre>\n<p>详细参见:<a href=\"../configuration/annotation.md\">注解配置</a></p>\n<h2>模型 API</h2>\n<pre><code>com.alibaba.dubbo.common.URL\ncom.alibaba.dubbo.rpc.RpcException\n</code></pre>\n<h2>上下文 API</h2>\n<pre><code>com.alibaba.dubbo.rpc.RpcContext\n</code></pre>\n<p>详细参见:<a href=\"../demos/context.md\">上下文信息</a> &amp; <a href=\"../demos/attachment.md\">隐式传参</a> &amp; <a href=\"../demos/async-call.md\">异步调用</a></p>\n<h2>服务API</h2>\n<pre><code>com.alibaba.dubbo.rpc.service.GenericService\ncom.alibaba.dubbo.rpc.service.GenericException\n</code></pre>\n<p>详细参见:<a href=\"../demos/generic-reference.md\">泛化引用</a> &amp; <a href=\"../demos/generic-service.md\">泛化实现</a></p>\n<pre><code>com.alibaba.dubbo.rpc.service.EchoService\n</code></pre>\n<p>详细参见:<a href=\"../demos/echo-service.md\">回声测试</a></p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>注意:Dubbo 中除这里声明以外的接口或类,都是内部接口或扩展接口,普通用户请不要直接依赖,否则升级版本可能出现不兼容。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/references/api.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/maven.json b/zh-cn/docs/user/references/maven.json
index 78770e5a..ef947e3c 100644
--- a/zh-cn/docs/user/references/maven.json
+++ b/zh-cn/docs/user/references/maven.json
@@ -1,4 +1,6 @@
 {
   "filename": "maven.md",
-  "__html": "<h1>Maven 插件参考手册</h1>\n<h2>启动一个简易注册中心</h2>\n<p>以指定的9099端口启动一个简易注册中心 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">mvn dubbo:registry -Dport=9099 \n</code></pre>\n<h2>生成demo服务提供者应用</h2>\n<p>生成指定接口和版本的服务提供者应用:</p>\n<pre><code class=\"language-sh\">mvn dubbo:create -Dapplication=xxx -Dpackage=com.alibaba.xxx -Dservice=XxxService,YyyService -Dversion=1.0.0 \n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>如果端口不指定,默认端口为 9090 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>Maven 插件参考手册</h1>\n<h2>启动一个简易注册中心</h2>\n<p>以指定的9099端口启动一个简易注册中心 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>:</p>\n<pre><code class=\"language-sh\">mvn dubbo:registry -Dport=9099 \n</code></pre>\n<h2>生成demo服务提供者应用</h2>\n<p>生成指定接口和版本的服务提供者应用:</p>\n<pre><code class=\"language-sh\">mvn dubbo:create -Dapplication=xxx -Dpackage=com.alibaba.xxx -Dservice=XxxService,YyyService -Dversion=1.0.0 \n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>如果端口不指定,默认端口为 9090 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/references/maven.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/dubbo.json b/zh-cn/docs/user/references/protocol/dubbo.json
index 13df49fb..b971aa8f 100644
--- a/zh-cn/docs/user/references/protocol/dubbo.json
+++ b/zh-cn/docs/user/references/protocol/dubbo.json
@@ -1,4 +1,6 @@
 {
   "filename": "dubbo.md",
-  "__html": "<h1>dubbo://</h1>\n<p>Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。</p>\n<p>反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。</p>\n<p><img src=\"../../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol.jpg\"></p>\n<ul>\n<li>Transporter: mina, netty, grizzy</li>\n<li>Serialization: dubbo, hessian2, java, json</li>\n<li>Dispatcher: all, direct, message, execution, connection</li>\n<li>ThreadPool: fixed, cached</li>\n</ul>\n<h2>特性</h2>\n<p>缺省协议,使用基于 mina <code>1.1.7</code> 和 hessian <code>3.2.1</code> 的 tbremoting 交互。</p>\n<ul>\n<li>连接个数:单连接</li>\n<li>连接方式:长连接</li>\n<li>传输协议:TCP</li>\n<li>传输方式:NIO 异步传输</li>\n<li>序列化:Hessian 二进制序列化</li>\n<li>适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。</li>\n<li>适用场景:常规远程服务方法调用</li>\n</ul>\n<h2>约束</h2>\n<ul>\n<li>参数及返回值需实现 <code>Serializable</code> 接口</li>\n<li>参数及返回值不能自定义实现 <code>List</code>, <code>Map</code>, <code>Number</code>, <code>Date</code>, <code>Calendar</code> 等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。</li>\n<li>Hessian 序列化,只传成员属性值和值的类型,不传方法或静态变量,兼容情况 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup><sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>数据通讯</th>\n<th>情况</th>\n<th>结果</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A-&gt;B</td>\n<td>类A多一种 属性(或者说类B少一种 属性)</td>\n<td>不抛异常,A多的那 个属性的值,B没有, 其他正常</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>枚举A多一种 枚举(或者说B少一种 枚举),A使用多 出来的枚举进行传输</td>\n<td>抛异常</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>枚举A多一种 枚举(或者说B少一种 枚举),A不使用 多出来的枚举进行传输</td>\n<td>不抛异常,B正常接 收数据</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>A和B的属性 名相同,但类型不相同</td>\n<td>抛异常</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>serialId 不相同</td>\n<td>正常传输</td>\n</tr>\n</tbody>\n</table>\n<p>接口增加方法,对客户端无影响,如果该方法不是客户端需要的,客户端不需要重新部署。输入参数和结果集中增加属性,对客户端无影响,如果客户端并不需要新属性,不用重新部署。</p>\n<p>输入参数和结果集属性名变化,对客户端序列化无影响,但是如果客户端不重新部署,不管输入还是输出,属性名变化的属性值是获取不到的。</p>\n<p>总结:服务器端和客户端对领域对象并不需要完全一致,而是按照最大匹配原则。</p>\n<h2>配置</h2>\n<p>配置协议:</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n<p>设置默认协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>设置服务协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>多端口:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20880\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20881\"</span> /&gt;</span>\n</code></pre>\n<p>配置协议选项:</p>\n<pre><code class=\"language-xml\"><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\">“9090”</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">“dubbo”</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">“hessian2”</span> <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">“UTF-8”</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">“fixed”</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">“100”</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">“0”</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">“9”</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">“8192”</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">“1000”</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">“8388608”</span> /&gt;</span>\n</code></pre>\n<p>多连接配置:</p>\n<p>Dubbo 协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span>/&gt;</span>\n</code></pre>\n<ul>\n<li><code>&lt;dubbo:service connections=&quot;0&quot;&gt;</code> 或 <code>&lt;dubbo:reference connections=&quot;0&quot;&gt;</code> 表示该服务使用 JVM 共享长连接。<strong>缺省</strong></li>\n<li><code>&lt;dubbo:service connections=&quot;1&quot;&gt;</code> 或 <code>&lt;dubbo:reference connections=&quot;1&quot;&gt;</code> 表示该服务使用独立长连接。</li>\n<li><code>&lt;dubbo:service connections=&quot;2&quot;&gt;</code> 或<code>&lt;dubbo:reference connections=&quot;2&quot;&gt;</code> 表示该服务使用独立两条长连接。</li>\n</ul>\n<p>为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护。</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n</code></pre>\n<p><code>dubbo.properties</code> 配置:</p>\n<pre><code class=\"language-sh\">dubbo.service.protocol=dubbo\n</code></pre>\n<h2>常见问题</h2>\n<h4>为什么要消费者比提供者个数多?</h4>\n<p>因 dubbo 协议采用单一长连接,假设网络为千兆网卡 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,根据测试经验数据每条连接最多只能压满 7MByte(不同的环境可能不一样,供参考),理论上 1 个服务提供者需要 20 个服务消费者才能压满网卡。</p>\n<h4>为什么不能传大包?</h4>\n<p>因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3:1\">[3:1]</a></sup>,每条连接最大 7MByte(不同的环境可能不一样,供参考),单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为瓶颈。</p>\n<h4>为什么采用异步单一长连接?</h4>\n<p>因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,比如 Morgan 的提供者只有 6 台提供者,却有上百台消费者,每天有 1.5 亿次调用,如果采用常规的 hessian 服务,服务提供者很容易就被压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,并使用异步 IO,复用线程池,防止 C10K 问题。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>由吴亚军提供 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>总结:会抛异常的情况:枚举值一边多一种,一边少一种,正好使用了差别的那种,或者属性名相同,类型不同 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>1024Mbit=128MByte <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref3:1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>dubbo://</h1>\n<p>Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。</p>\n<p>反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。</p>\n<p><img src=\"../../sources/images/dubbo-protocol.jpg\" alt=\"dubbo-protocol.jpg\"></p>\n<ul>\n<li>Transporter: mina, netty, grizzy</li>\n<li>Serialization: dubbo, hessian2, java, json</li>\n<li>Dispatcher: all, direct, message, execution, connection</li>\n<li>ThreadPool: fixed, cached</li>\n</ul>\n<h2>特性</h2>\n<p>缺省协议,使用基于 mina <code>1.1.7</code> 和 hessian <code>3.2.1</code> 的 tbremoting 交互。</p>\n<ul>\n<li>连接个数:单连接</li>\n<li>连接方式:长连接</li>\n<li>传输协议:TCP</li>\n<li>传输方式:NIO 异步传输</li>\n<li>序列化:Hessian 二进制序列化</li>\n<li>适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。</li>\n<li>适用场景:常规远程服务方法调用</li>\n</ul>\n<h2>约束</h2>\n<ul>\n<li>参数及返回值需实现 <code>Serializable</code> 接口</li>\n<li>参数及返回值不能自定义实现 <code>List</code>, <code>Map</code>, <code>Number</code>, <code>Date</code>, <code>Calendar</code> 等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。</li>\n<li>Hessian 序列化,只传成员属性值和值的类型,不传方法或静态变量,兼容情况 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup><sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>:</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>数据通讯</th>\n<th>情况</th>\n<th>结果</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A-&gt;B</td>\n<td>类A多一种 属性(或者说类B少一种 属性)</td>\n<td>不抛异常,A多的那 个属性的值,B没有, 其他正常</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>枚举A多一种 枚举(或者说B少一种 枚举),A使用多 出来的枚举进行传输</td>\n<td>抛异常</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>枚举A多一种 枚举(或者说B少一种 枚举),A不使用 多出来的枚举进行传输</td>\n<td>不抛异常,B正常接 收数据</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>A和B的属性 名相同,但类型不相同</td>\n<td>抛异常</td>\n</tr>\n<tr>\n<td>A-&gt;B</td>\n<td>serialId 不相同</td>\n<td>正常传输</td>\n</tr>\n</tbody>\n</table>\n<p>接口增加方法,对客户端无影响,如果该方法不是客户端需要的,客户端不需要重新部署。输入参数和结果集中增加属性,对客户端无影响,如果客户端并不需要新属性,不用重新部署。</p>\n<p>输入参数和结果集属性名变化,对客户端序列化无影响,但是如果客户端不重新部署,不管输入还是输出,属性名变化的属性值是获取不到的。</p>\n<p>总结:服务器端和客户端对领域对象并不需要完全一致,而是按照最大匹配原则。</p>\n<h2>配置</h2>\n<p>配置协议:</p>\n<pre><code class=\"language-xml\"><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\">\"20880\"</span> /&gt;</span>\n</code></pre>\n<p>设置默认协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>设置服务协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"dubbo\"</span> /&gt;</span>\n</code></pre>\n<p>多端口:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20880\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"dubbo2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"20881\"</span> /&gt;</span>\n</code></pre>\n<p>配置协议选项:</p>\n<pre><code class=\"language-xml\"><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\">“9090”</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">client</span>=<span class=\"hljs-string\">“netty”</span> <span class=\"hljs-attr\">codec</span>=<span class=\"hljs-string\">“dubbo”</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">“hessian2”</span> <span class=\"hljs-attr\">charset</span>=<span class=\"hljs-string\">“UTF-8”</span> <span class=\"hljs-attr\">threadpool</span>=<span class=\"hljs-string\">“fixed”</span> <span class=\"hljs-attr\">threads</span>=<span class=\"hljs-string\">“100”</span> <span class=\"hljs-attr\">queues</span>=<span class=\"hljs-string\">“0”</span> <span class=\"hljs-attr\">iothreads</span>=<span class=\"hljs-string\">“9”</span> <span class=\"hljs-attr\">buffer</span>=<span class=\"hljs-string\">“8192”</span> <span class=\"hljs-attr\">accepts</span>=<span class=\"hljs-string\">“1000”</span> <span class=\"hljs-attr\">payload</span>=<span class=\"hljs-string\">“8388608”</span> /&gt;</span>\n</code></pre>\n<p>多连接配置:</p>\n<p>Dubbo 协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span>/&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> <span class=\"hljs-attr\">connections</span>=<span class=\"hljs-string\">\"1\"</span>/&gt;</span>\n</code></pre>\n<ul>\n<li><code>&lt;dubbo:service connections=&quot;0&quot;&gt;</code> 或 <code>&lt;dubbo:reference connections=&quot;0&quot;&gt;</code> 表示该服务使用 JVM 共享长连接。<strong>缺省</strong></li>\n<li><code>&lt;dubbo:service connections=&quot;1&quot;&gt;</code> 或 <code>&lt;dubbo:reference connections=&quot;1&quot;&gt;</code> 表示该服务使用独立长连接。</li>\n<li><code>&lt;dubbo:service connections=&quot;2&quot;&gt;</code> 或<code>&lt;dubbo:reference connections=&quot;2&quot;&gt;</code> 表示该服务使用独立两条长连接。</li>\n</ul>\n<p>为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护。</p>\n<pre><code class=\"language-xml\"><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\">accepts</span>=<span class=\"hljs-string\">\"1000\"</span> /&gt;</span>\n</code></pre>\n<p><code>dubbo.properties</code> 配置:</p>\n<pre><code class=\"language-sh\">dubbo.service.protocol=dubbo\n</code></pre>\n<h2>常见问题</h2>\n<h4>为什么要消费者比提供者个数多?</h4>\n<p>因 dubbo 协议采用单一长连接,假设网络为千兆网卡 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3\">[3]</a></sup>,根据测试经验数据每条连接最多只能压满 7MByte(不同的环境可能不一样,供参考),理论上 1 个服务提供者需要 20 个服务消费者才能压满网卡。</p>\n<h4>为什么不能传大包?</h4>\n<p>因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡 <sup class=\"footnote-ref\"><a href=\"#fn3\" id=\"fnref3:1\">[3:1]</a></sup>,每条连接最大 7MByte(不同的环境可能不一样,供参考),单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为瓶颈。</p>\n<h4>为什么采用异步单一长连接?</h4>\n<p>因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,比如 Morgan 的提供者只有 6 台提供者,却有上百台消费者,每天有 1.5 亿次调用,如果采用常规的 hessian 服务,服务提供者很容易就被压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,并使用异步 IO,复用线程池,防止 C10K 问题。</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>由吴亚军提供 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn2\" class=\"footnote-item\"><p>总结:会抛异常的情况:枚举值一边多一种,一边少一种,正好使用了差别的那种,或者属性名相同,类型不同 <a href=\"#fnref2\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n<li id=\"fn3\" class=\"footnote-item\"><p>1024Mbit=128MByte <a href=\"#fnref3\" class=\"footnote-backref\">↩︎</a> <a href=\"#fnref3:1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/references/protocol/dubbo.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/hessian.json b/zh-cn/docs/user/references/protocol/hessian.json
index 42f2e3c5..b5b68005 100644
--- a/zh-cn/docs/user/references/protocol/hessian.json
+++ b/zh-cn/docs/user/references/protocol/hessian.json
@@ -1,4 +1,6 @@
 {
   "filename": "hessian.md",
-  "__html": "<h1>hessian://</h1>\n<p>Hessian <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。</p>\n<p>Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:</p>\n<ul>\n<li>提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用</li>\n<li>或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。</li>\n</ul>\n<h2>特性</h2>\n<ul>\n<li>连接个数:多连接</li>\n<li>连接方式:短连接</li>\n<li>传输协议:HTTP</li>\n<li>传输方式:同步传输</li>\n<li>序列化:Hessian二进制序列化</li>\n<li>适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。</li>\n<li>适用场景:页面传输,文件传输,或与原生hessian服务互操作</li>\n</ul>\n<h2>依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.caucho<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hessian<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.0.7<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>约束</h2>\n<ul>\n<li>参数及返回值需实现 <code>Serializable</code> 接口</li>\n<li>参数及返回值不能自定义实现 <code>List</code>, <code>Map</code>, <code>Number</code>, <code>Date</code>, <code>Calendar</code> 等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。</li>\n</ul>\n<h2>配置</h2>\n<p>定义 hessian 协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>设置默认协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>设置 service 协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>多端口:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8081\"</span> /&gt;</span>\n</code></pre>\n<p>直连:</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"HelloWorld\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"hessian://10.20.153.10:8080/helloWorld\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><a href=\"http://hessian.caucho.com\">Hessian</a> 是 Caucho 开源的一个 RPC 框架,其通讯效率高于 WebService 和 Java 自带的序列化。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>hessian://</h1>\n<p>Hessian <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。</p>\n<p>Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:</p>\n<ul>\n<li>提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用</li>\n<li>或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。</li>\n</ul>\n<h2>特性</h2>\n<ul>\n<li>连接个数:多连接</li>\n<li>连接方式:短连接</li>\n<li>传输协议:HTTP</li>\n<li>传输方式:同步传输</li>\n<li>序列化:Hessian二进制序列化</li>\n<li>适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。</li>\n<li>适用场景:页面传输,文件传输,或与原生hessian服务互操作</li>\n</ul>\n<h2>依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId</span>&gt;</span>com.caucho<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">groupId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId</span>&gt;</span>hessian<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">artifactId</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version</span>&gt;</span>4.0.7<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">version</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">dependency</span>&gt;</span>\n</code></pre>\n<h2>约束</h2>\n<ul>\n<li>参数及返回值需实现 <code>Serializable</code> 接口</li>\n<li>参数及返回值不能自定义实现 <code>List</code>, <code>Map</code>, <code>Number</code>, <code>Date</code>, <code>Calendar</code> 等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。</li>\n</ul>\n<h2>配置</h2>\n<p>定义 hessian 协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>设置默认协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:provider</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>设置 service 协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">protocol</span>=<span class=\"hljs-string\">\"hessian\"</span> /&gt;</span>\n</code></pre>\n<p>多端口:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian1\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">id</span>=<span class=\"hljs-string\">\"hessian2\"</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"hessian\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8081\"</span> /&gt;</span>\n</code></pre>\n<p>直连:</p>\n<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\">\"helloService\"</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"HelloWorld\"</span> <span class=\"hljs-attr\">url</span>=<span class=\"hljs-string\">\"hessian://10.20.153.10:8080/helloWorld\"</span> /&gt;</span>\n</code></pre>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><a href=\"http://hessian.caucho.com\">Hessian</a> 是 Caucho 开源的一个 RPC 框架,其通讯效率高于 WebService 和 Java 自带的序列化。 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
+  "link": "/zh-cn/docs/user/references/protocol/hessian.html",
+  "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/http.json b/zh-cn/docs/user/references/protocol/http.json
index cffdd4d5..e22f1f11 100644
--- a/zh-cn/docs/user/references/protocol/http.json
+++ b/zh-cn/docs/user/references/protocol/http.json
@@ -1,4 +1,6 @@
 {
   "filename": "http.md",
-  "__html": "<h1>http://</h1>\n<p>基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>特性</h2>\n<ul>\n<li>连接个数:多连接</li>\n<li>连接方式:短连接</li>\n<li>传输协议:HTTP</li>\n<li>传输方式:同步传输</li>\n<li>序列化:表单序列化</li>\n<li>适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。</li>\n<li>适用场景:需同时给应用程序和浏览器 JS 使用的服务。</li>\n</ul>\n<h2>约束</h2>\n<ul>\n<li>参数及返回值需符合 Bean 规范</li>\n</ul>\n<h2>配置</h2>\n<p>配置协议:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"http\"</span> <span class=\"hljs-attr\">port</span>=<span class=\"hljs-string\">\"8080\"</span> /&gt;</span>\n</code></pre>\n<p>配置 Jetty Server (默认):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"jetty\"</span> /&gt;</span>\n</code></pre>\n<p>配置 Servlet Bridge Server (推荐使用):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">...</span> <span class=\"hljs-attr\">server</span>=<span class=\"hljs-string\">\"servlet\"</span> /&gt;</span>\n</code></pre>\n<p>配置 DispatcherServlet:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-class</span>&gt;</span>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-class</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">load-on-startup</span>&gt;</span>1<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">load-on-startup</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">servlet-name</span>&gt;</span>dubbo<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-name</span>&gt;</span>\n         <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">url-pattern</span>&gt;</span>/*<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">url-pattern</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;/<span class=\"hljs-name\">servlet-mapping</span>&gt;</span>\n</code></pre>\n<p>注意,如果使用 servlet 派发请求:</p>\n<ul>\n<li>协议的端口 <code>&lt;dubbo:protocol port=&quot;8080&quot; /&gt;</code> 必须与 servlet 容器的端口相同,</li>\n<li>协议的上下文路径 <code>&lt;dubbo:protocol contextpath=&quot;foo&quot; /&gt;</code> 必须与 servlet 应用的上下文路径相同。</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p><code>2.3.0</code> 以上版本支持 <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n"
+  "__html": "<h1>http://</h1>\n<p>基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fn

  (This diff was greater than 5MB in size, and has been truncated...)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org