You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by gi...@apache.org on 2020/08/06 06:27:44 UTC

[dubbo-website] branch asf-site updated: Automated deployment: Thu Aug 6 06:27:32 UTC 2020 e868b1199bd2cad45d9aa3faa7f033fda321fe6a

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

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


The following commit(s) were added to refs/heads/asf-site by this push:
     new 231da28  Automated deployment: Thu Aug  6 06:27:32 UTC 2020 e868b1199bd2cad45d9aa3faa7f033fda321fe6a
231da28 is described below

commit 231da28f163a97340f994a69d27b83c22ace43f8
Author: beiwei30 <be...@users.noreply.github.com>
AuthorDate: Thu Aug 6 06:27:32 2020 +0000

    Automated deployment: Thu Aug  6 06:27:32 UTC 2020 e868b1199bd2cad45d9aa3faa7f033fda321fe6a
---
 build/blog.js                                  |   2 +-
 build/blogDetail.js                            |   4 +-
 build/community.js                             |   2 +-
 build/documentation.js                         |   4 +-
 build/ecology.js                               |  32 +--
 build/home.js                                  |   2 +-
 md_json/blog.json                              |  10 +-
 zh-cn/blog/apache-dubbo-2019-2020.html         | 285 +++++++++++++++++++++++++
 zh-cn/blog/apache-dubbo-2019-2020.json         |   6 +
 zh-cn/blog/index.html                          |   2 +-
 zh-cn/docs/user/demos/consumer-threadpool.html |   7 +-
 zh-cn/docs/user/demos/consumer-threadpool.json |   2 +-
 zh-cn/docs/user/new-features-in-a-glance.html  |   8 +-
 zh-cn/docs/user/new-features-in-a-glance.json  |   2 +-
 14 files changed, 331 insertions(+), 37 deletions(-)

diff --git a/build/blog.js b/build/blog.js
index c8d9bb7..07a4cc4 100644
--- a/build/blog.js
+++ b/build/blog.js
@@ -1,4 +1,4 @@
-!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=322 [...]
+!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=323 [...]
   Copyright (c) 2017 Jed Watson.
   Licensed under the MIT License (MIT), see
   http://jedwatson.github.io/classnames
diff --git a/build/blogDetail.js b/build/blogDetail.js
index 38533c0..719eadd 100644
--- a/build/blogDetail.js
+++ b/build/blogDetail.js
@@ -1,6 +1,6 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=323 [...]
+!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=324 [...]
   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 a=n.apply(null,r);a&&e.push(a)}else if("object"===o)for(var u in r)i.call(r,u)&&r[u]&&e.push(u)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},50:function(e,t,n){"use strict";fu [...]
\ No newline at end of file
+!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r)&&r.length){var a=n.apply(null,r);a&&e.push(a)}else if("object"===o)for(var u in r)i.call(r,u)&&r[u]&&e.push(u)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},50:function(e,t,n){"use strict";fu [...]
\ No newline at end of file
diff --git a/build/community.js b/build/community.js
index fbe0459..9fcc356 100644
--- a/build/community.js
+++ b/build/community.js
@@ -1,4 +1,4 @@
-!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=324 [...]
+!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=325 [...]
   Copyright (c) 2017 Jed Watson.
   Licensed under the MIT License (MIT), see
   http://jedwatson.github.io/classnames
diff --git a/build/documentation.js b/build/documentation.js
index 188761d..1c25d91 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=325 [...]
+!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=326 [...]
   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 s in r)i.call(r,s)&&r[s]&&e.push(s)}}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))}()},50:function(e,t,n){"use strict";fu [...]
\ 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 s in r)i.call(r,s)&&r[s]&&e.push(s)}}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))}()},50:function(e,t,n){"use strict";fu [...]
\ No newline at end of file
diff --git a/build/ecology.js b/build/ecology.js
index d2fda2b..e33b422 100644
--- a/build/ecology.js
+++ b/build/ecology.js
@@ -1,11 +1,11 @@
-!function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.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=326 [...]
+!function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.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=327 [...]
 //! moment.js
-return io.isValid=Vt,io.abs=xr,io.add=Pr,io.subtract=Er,io.as=Rr,io.asMilliseconds=Rc,io.asSeconds=Ic,io.asMinutes=Bc,io.asHours=Uc,io.asDays=qc,io.asWeeks=Jc,io.asMonths=Gc,io.asQuarters=Kc,io.asYears=Zc,io.valueOf=Ir,io._bubble=Fr,io.clone=Ur,io.get=qr,io.milliseconds=Xc,io.seconds=$c,io.minutes=Qc,io.hours=eo,io.days=to,io.weeks=Gr,io.months=no,io.years=ro,io.humanize=Qr,io.toISOString=ta,io.toString=ta,io.toJSON=ta,io.locale=Cn,io.localeData=On,io.toIsoString=L("toIsoString() is depr [...]
+return io.isValid=Vt,io.abs=xr,io.add=Pr,io.subtract=Er,io.as=Rr,io.asMilliseconds=Rc,io.asSeconds=Ic,io.asMinutes=Bc,io.asHours=Uc,io.asDays=qc,io.asWeeks=Jc,io.asMonths=Gc,io.asQuarters=Kc,io.asYears=Zc,io.valueOf=Ir,io._bubble=Fr,io.clone=Ur,io.get=qr,io.milliseconds=Xc,io.seconds=$c,io.minutes=Qc,io.hours=eo,io.days=to,io.weeks=Gr,io.months=no,io.years=ro,io.humanize=Qr,io.toISOString=ta,io.toString=ta,io.toJSON=ta,io.locale=Cn,io.localeData=On,io.toIsoString=L("toIsoString() is depr [...]
   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 a=typeof r;if("string"===a||"number"===a)e.push(r);else if(Array.isArray(r)&&r.length){var o=n.apply(null,r);o&&e.push(o)}else if("object"===a)for(var i in r)c.call(r,i)&&r[i]&&e.push(i)}}return e.join(" ")}var c={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(a=function(){return n}.apply(t,r))&&(e.exports=a))}()},function(e,t,n){"use strict";Objec [...]
+!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var a=typeof r;if("string"===a||"number"===a)e.push(r);else if(Array.isArray(r)&&r.length){var o=n.apply(null,r);o&&e.push(o)}else if("object"===a)for(var i in r)c.call(r,i)&&r[i]&&e.push(i)}}return e.join(" ")}var c={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(a=function(){return n}.apply(t,r))&&(e.exports=a))}()},function(e,t,n){"use strict";Objec [...]
 //! moment.js locale configuration
 var t=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},n={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d ش [...]
 //! moment.js locale configuration
@@ -29,11 +29,11 @@ function t(e,t,n){var r=e+" ";switch(n){case"ss":return r+=1===e?"sekunda":2===e
 //! moment.js locale configuration
 var r="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),a="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_"),c=[/^led/i,/^úno/i,/^bře/i,/^dub/i,/^kvě/i,/^(čvn|červen$|června)/i,/^(čvc|červenec|července)/i,/^srp/i,/^zář/i,/^říj/i,/^lis/i,/^pro/i],o=/^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;return e.defineLocale("cs",{months:r, [...]
 //! moment.js locale configuration
-function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez. [...]
+function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Jun [...]
 //! moment.js locale configuration
-function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez. [...]
+function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Jun [...]
 //! moment.js locale configuration
-function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".s [...]
+function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_J [...]
 //! moment.js locale configuration
 var t=["ޖެނުއަރީ","ފެބްރުއަރީ","މާރިޗު","އޭޕްރީލު","މޭ","ޖޫން","ޖުލައި","އޯގަސްޓު","ސެޕްޓެމްބަރު","އޮކްޓޯބަރު","ނޮވެމްބަރު","ޑިސެމްބަރު"],n=["އާދިއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"];return e.defineLocale("dv",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:"އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/މ [...]
 //! moment.js locale configuration
@@ -47,9 +47,11 @@ var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n
 //! moment.js locale configuration
 function t(e,t,n,r){var a={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["ühe minuti","üks minut"],mm:[e+" minuti",e+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[e+" tunni",e+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[e+" kuu",e+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[e+" aasta",e+" aastat"]};return t?a[n][2]?a[n][2]:a[n][1]:r?a[n][0]:a[n][1]}return e.defineLocale("et",{months:"jaanuar_veebruar_märts_ [...]
 //! moment.js locale configuration
-var t={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};return e.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنب [...]
+var t={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};return e.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنب [...]
 //! moment.js locale configuration
-var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),a=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];return e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai [...]
+var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),a=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];return e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai [...]
+//! moment.js locale configuration
+var t=/^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,n=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,r=/(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,a=[/^janv/i,/^févr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^août/i,/^sept/i,/^oct/i,/^nov/i,/^déc/i];return e.defineLocale("fr",{mon [...]
 //! moment.js locale configuration
 var t="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),n="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");return e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,r){return e?/-MMM-/.test(r)?n[e.month()]:t[e.month()]:t},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._t [...]
 //! moment.js locale configuration
@@ -61,7 +63,7 @@ function t(e,t,n,r){var a={s:["थोडया सॅकंडांनी","थ
 //! moment.js locale configuration
 function t(e,t,n,r){var a={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return r?a[n][0]:a[n][1]}return e.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril [...]
 //! moment.js locale configuration
-var t={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},n={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};return e.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort [...]
+var t={1:"૧",2:"૨",3:"૩",4:"૪",5:"૫",6:"૬",7:"૭",8:"૮",9:"૯",0:"૦"},n={"૧":"1","૨":"2","૩":"3","૪":"4","૫":"5","૬":"6","૭":"7","૮":"8","૯":"9","૦":"0"};return e.defineLocale("gu",{months:"જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર".split("_"),monthsShort:"જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.".split("_"),monthsParseExact:!0,weekdays:"રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર".split("_"),weekdaysShort [...]
 //! moment.js locale configuration
 var t={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return e.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_ [...]
 //! moment.js locale configuration
@@ -69,7 +71,7 @@ function t(e,t,n){var r=e+" ";switch(n){case"ss":return r+=1===e?"sekunda":2===e
 //! moment.js locale configuration
 var r="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");return e.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat [...]
 //! moment.js locale configuration
-function t(e){return e%100==11||e%10!=1}function n(e,n,r,a){var c=e+" ";switch(r){case"s":return n||a?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return t(e)?c+(n||a?"sekúndur":"sekúndum"):c+"sekúnda";case"m":return n?"mínúta":"mínútu";case"mm":return t(e)?c+(n||a?"mínútur":"mínútum"):n?c+"mínúta":c+"mínútu";case"hh":return t(e)?c+(n||a?"klukkustundir":"klukkustundum"):c+"klukkustund";case"d":return n?"dagur":a?"dag":"degi";case"dd":return t(e)?n?c+"dagar":c+(a?"daga":"dögum"):n?c+"da [...]
+function t(e){return e%100==11||e%10!=1}function n(e,n,r,a){var c=e+" ";switch(r){case"s":return n||a?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return t(e)?c+(n||a?"sekúndur":"sekúndum"):c+"sekúnda";case"m":return n?"mínúta":"mínútu";case"mm":return t(e)?c+(n||a?"mínútur":"mínútum"):n?c+"mínúta":c+"mínútu";case"hh":return t(e)?c+(n||a?"klukkustundir":"klukkustundum"):c+"klukkustund";case"d":return n?"dagur":a?"dag":"degi";case"dd":return t(e)?n?c+"dagar":c+(a?"daga":"dögum"):n?c+"da [...]
 //! moment.js locale configuration
 var t={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};return e.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_ [...]
 //! moment.js locale configuration
@@ -117,11 +119,13 @@ function t(e,t,n,r){var a=e+" ";switch(n){case"s":return t||r?"nekaj sekund":"ne
 //! moment.js locale configuration
 var t={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,r){var a=t.words[r];return 1===r.length?n?a[0]:a[1]:e+" "+t.correctGrammaticalCase(e,a)}};return e.defineLocale("sr-cyrl",{months:"јану [...]
 //! moment.js locale configuration
-var t={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,r){var a=t.words[r];return 1===r.length?n?a[0]:a[1]:e+" "+t.correctGrammaticalCase(e,a)}};return e.defineLocale("sr",{months:"januar_fe [...]
+var t={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,r){var a=t.words[r];return 1===r.length?n?a[0]:a[1]:e+" "+t.correctGrammaticalCase(e,a)}};return e.defineLocale("sr",{months:"januar_fe [...]
 //! moment.js locale configuration
 var t={1:"௧",2:"௨",3:"௩",4:"௪",5:"௫",6:"௬",7:"௭",8:"௮",9:"௯",0:"௦"},n={"௧":"1","௨":"2","௩":"3","௪":"4","௫":"5","௬":"6","௭":"7","௮":"8","௯":"9","௦":"0"};return e.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_ [...]
 //! moment.js locale configuration
-var t={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};return e.defineLocale("tg",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб [...]
+var t={0:"-ум",1:"-ум",2:"-юм",3:"-юм",4:"-ум",5:"-ум",6:"-ум",7:"-ум",8:"-ум",9:"-ум",10:"-ум",12:"-ум",13:"-ум",20:"-ум",30:"-юм",40:"-ум",50:"-ум",60:"-ум",70:"-ум",80:"-ум",90:"-ум",100:"-ум"};return e.defineLocale("tg",{months:"январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе".split("_"),weekdaysShort:"яшб_дшб_сшб [...]
+//! moment.js locale configuration
+var t={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'ünji",4:"'ünji",100:"'ünji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};return e.defineLocale("tk",{months:"Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr".split("_"),monthsShort:"Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek".split("_"),weekdays:"Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe".split("_"),weekdaysShort:"Ýek_Duş_Si [...]
 //! moment.js locale configuration
 var c="pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");return e.defineLocale("tlh",{months:"tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’".split("_"),monthsShort:"jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_ [...]
 //! moment.js locale configuration
@@ -129,9 +133,9 @@ var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:
 //! moment.js locale configuration
 function t(e,t){var n=e.split("_");return t%10==1&&t%100!=11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function n(e,n,r){var a={ss:n?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:n?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:n?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===r?n?"хвилина":"хвилину":"h"===r?n?"година":"годину":e+" "+t(a[r],+e)}function r(e,t){var n,r={nominative:"неділя_ [...]
 //! moment.js locale configuration
-var t=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],n=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];return e.defineLocale("ur",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(e){return"شام"===e},meridiem:function(e,t,n){return e<12?"صبح":"شام"},calendar [...]
+var t=["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],n=["اتوار","پیر","منگل","بدھ","جمعرات","جمعہ","ہفتہ"];return e.defineLocale("ur",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd، D MMMM YYYY HH:mm"},meridiemParse:/صبح|شام/,isPM:function(e){return"شام"===e},meridiem:function(e,t,n){return e<12?"صبح":"شام"},calendar [...]
 object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var a=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
\ No newline at end of file
+var a=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
\ No newline at end of file
diff --git a/build/home.js b/build/home.js
index 654814a..1992a19 100644
--- a/build/home.js
+++ b/build/home.js
@@ -1,4 +1,4 @@
-!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=327 [...]
+!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=328 [...]
   Copyright (c) 2017 Jed Watson.
   Licensed under the MIT License (MIT), see
   http://jedwatson.github.io/classnames
diff --git a/md_json/blog.json b/md_json/blog.json
index 0c5c8c2..8b80319 100644
--- a/md_json/blog.json
+++ b/md_json/blog.json
@@ -316,6 +316,11 @@
       "meta": {}
     },
     {
+      "filename": "apache-dubbo-2019-2020.md",
+      "link": "/zh-cn/blog/apache-dubbo-2019-2020.html",
+      "meta": {}
+    },
+    {
       "filename": "apachecon-na-2018.md",
       "link": "/zh-cn/blog/apachecon-na-2018.html",
       "meta": {
@@ -325,11 +330,6 @@
       }
     },
     {
-      "filename": "apche-dubbo-2019-2020.md",
-      "link": "/zh-cn/blog/apche-dubbo-2019-2020.html",
-      "meta": {}
-    },
-    {
       "filename": "build-new-docker-image-in-dockerhub.md",
       "link": "/zh-cn/blog/build-new-docker-image-in-dockerhub.html",
       "meta": {
diff --git a/zh-cn/blog/apache-dubbo-2019-2020.html b/zh-cn/blog/apache-dubbo-2019-2020.html
new file mode 100644
index 0000000..ea14de1
--- /dev/null
+++ b/zh-cn/blog/apache-dubbo-2019-2020.html
@@ -0,0 +1,285 @@
+<!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="apache-dubbo-2019-2020" />
+	<meta name="description" content="apache-dubbo-2019-2020" />
+	<!-- 网页标签标题 -->
+	<title>apache-dubbo-2019-2020</title>
+	<link rel="shortcut icon" href="/img/dubbo.ico"/>
+	<link rel="stylesheet" href="/build/blogDetail.css" />
+</head>
+<body>
+	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a h [...]
+<p>非常感谢大家对 Dubbo 社区的关注,通过这篇文章我们将:总结过去一年 Dubbo 社区取得的成绩,包括社区和框架演进两个方面;展望未来 Dubbo 社区和框架的新的规划(roadmap)。社区建设是推动 Dubbo 健康持续发展的一个非常重要的环节,我们需要与社区保持良性的互动、有活跃的贡献者、有积极的富有建设性的讨论,而整个 Dubbo 社区过去一年在这方面都做的不错;在框架演进上,我们主要发布了 2.7.0 - 2.7.5 共 6 个特性版本,功能层面涵盖编程模型、协议、服务治理、性能优化等多个方面;除了已经发布的功能外,我们在 Dubbo 3.0 协议、服务自省和云原生等方向上也做了深入的探索,对这些方向的支持将是 Dubbo 接下来的重要工作方向,希望能通过这篇文章将其中更详细的思考和计划同步给大家。</p>
+<h2>社区回顾</h2>
+<p>回顾 Dubbo 社区过去一年的发展,其中一个重要的节点就是 2019 年 5 月从 Apache 孵化毕业。成为第二个由 Alibaba 捐献后从 Apache 毕业的项目,我有幸参与到了从重启开源、进入 Apache 孵化到毕业的整个过程,社区在此过程中做了大量的工作,包括邮件列表建设、代码规范检查、文档和代码国际化、issue/pr 处理等,这些一方面是 Apache 社区要求的工作,同时也为推动 Dubbo 的发展起到了正面的作用。</p>
+<p>在从 Apache 毕业之后,Dubbo 相关的项目也进行了迁移,都迁移到了 <a href="https://github.com/apache?utf8=%E2%9C%93&amp;q=dubbo&amp;type=&amp;language=">Apache</a> 组织之下:</p>
+<p>Dubbo 社区的项目总共有 24 个之多,维护如此多的项目,并不是单纯靠几个活跃的开发者就能做到的,而是靠整个社区努力的结果。我总结了过去一年提名的所有 Committer/PMC,总过有 27 人获得提名(23 名 committer、4 名 PMC),通过下方的饼状图可以看出,只有不到 20% 的贡献者是来自于 Alibaba,而 80% 以上是来自各个不同组织的开发者或爱好者。这样的 Committer 分布,是加入 Apache 带给 Dubbo 社区的一个最重要的变化之一:Dubbo 项目是属于整个社区的,反映的是不同组织不同开发者的共同诉求,它的发展不是由一个公司控制或决定的,而是由社区共同讨论后决定的。如果你对参与到 Dubbo 社区感兴趣,都可以参与到 Dubbo 发展的讨论、决策和 coding 中来,也非常期待各位能成为下一个 Committer。</p>
+<p><img src="../../img/docs/community-distribution.png" alt="community distribution"></p>
+<p>过去一年 Dubbo 社区组织了超过 10 场的线下 meetup 活动,覆盖了国内基本所有的开发者聚集的城市,与广大 Dubbo 开发者和使用者保持了密切交流。通过这些线下或线上的直播活动,分享了超过 100 个 topic 的演讲,深度讲解了 Dubbo 社区最新动态、功能模块开发和近期规划等。并且在所有的这些主题演讲中,绝大多数都是通过社区采集的方式,最终由 Dubbo 的深度企业分享的实践主题,其中典型的代表包括携程、工商银行、考拉、信用算力等。</p>
+<p><img src="../../img/docs/community-meetup.png" alt="community meetup"></p>
+<p>从 Github 上来看,Dubbo 在过去一年也受到了非常高的关注度,一个重要的里程碑是 Star 数突破 3w,相比重启开源时增长了近 5 倍;贡献者由最初的几十个增长到现在的 282 个,而这其中有六七十个已经被提名为 committer,不论是贡献者数量还是 committer 比例都得到很大的提升;另一个数据是发布的版本,总共发布了 64 个版本,大家如果要了解每个版本的具体信息,也可以从这里点进去查看。</p>
+<p><img src="../../img/docs/community-github.png" alt="community github"></p>
+<p>当前社区维护的大版本主要有 3 个,分别是 2.5.x 2.6.x 和 2.7.x。</p>
+<p>其中,2.7.x 是我们的主要开发版本,在过去的一年共发布了 6 个版本(2.7.0 - 2.7.5),每个版本都带来了一些值得关注的特性或功能升级,涵盖从编程模型、服务治理、性能到协议的多个方面的增强。</p>
+<p>2.6.x 版本则定位为 bugfix 版本,过去一年共发布了 3 个版本,主要以修复问题和安全漏洞为主,并没有增加什么新 feature,因此这一系列的版本在稳定性上是得到保证的。</p>
+<p>2.5.x 版本当前从去年初开始已宣布 EOF,只做安全修复;而到了下半年已经完全停止了维护。还在使用这个版本的用户建议尽快升级到 2.6 或 2.7 版本。</p>
+<p>关于 2.6 和 2.7 版本的用户分布情况,目前并没有官方的统计数据,但是根据我们从 issue 分布及一些深度用户的跟踪情况来看,这两个版本的使用分布大概是 40% - 60% 的状态。同时我们还观察到一个趋势,即很大一部分 2.6 的用户都已经开始调研升级到 2.7 版本或在升级的过程中,毕竟一个框架是否能很好的满足业务开发诉求,一个重要的因素是其是否不断的有功能的加入,是否能跟进新的技术趋势,2.6 版本已很难满足这些诉求。</p>
+<p>对于很多开发者来说,要升级到 2.7 版本,当前最大的顾虑即是其稳定性。因为 2.7 每个版本都会增加很多新内容且迭代速度较快,要保证每个发布版本的稳定性对社区来说也是一个充满挑战的事情。为了方便用户更好的完成升级评估,我们近期在 github 上列出了单独列了一个 issue 来统计现在包括未来版本的稳定性:<a href="https://github.com/apache/dubbo/issues/5669">Dubbo 各版本总结与升级建议 #5669</a></p>
+<table>
+<thead>
+<tr>
+<th></th>
+<th><strong>版本</strong></th>
+<th><strong>重要功能</strong></th>
+<th><strong>升级建议</strong></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>1</td>
+<td>2.7.5</td>
+<td>服务自省 HTTP/2(gRPC) Protobuf TLS 性能优化   <a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.5">https://github.com/apache/dubbo/releases/tag/dubbo-2.7.5</a></td>
+<td>不建议大规模生产使用</td>
+</tr>
+<tr>
+<td>2</td>
+<td>2.7.4.1</td>
+<td><a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.4.1">bugfixes and enhancements of 2.7.3</a></td>
+<td><strong>推荐生产使用</strong></td>
+</tr>
+<tr>
+<td>3</td>
+<td>2.7.3</td>
+<td><a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.3">bigfixes of and enhancements of 2.7.2</a></td>
+<td><strong>推荐生产使用</strong></td>
+</tr>
+<tr>
+<td>4</td>
+<td>2.7.2</td>
+<td><a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.2">bigfixes of and enhancements of 2.7.1</a></td>
+<td>不建议大规模生产使用</td>
+</tr>
+<tr>
+<td>5</td>
+<td>2.7.1</td>
+<td><a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.1">bigfixes of and enhancements of 2.7.0</a></td>
+<td>不建议大规模生产使用</td>
+</tr>
+<tr>
+<td>6</td>
+<td>2.7.0</td>
+<td>异步编程模型 - 消费端/提供端异步 服务治理规则增强 简化的注册模型 配置中心、元数据中心 package 重构   <a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.0">https://github.com/apache/dubbo/releases/tag/dubbo-2.7.0</a></td>
+<td>beta 版本,2.6.x 重构后首个版本</td>
+</tr>
+</tbody>
+</table>
+<p>其中 2.7.5 版本预计将在接下来的 1-2 个版本之后逐步达到稳定状态。</p>
+<p>对于后续的版本是否通过标识性的后缀如 -beta、RC 等来区分不同阶段的发布版本,社区也有过类似的讨论,后续我们将视未来发展情况而定。</p>
+<h2>重点功能回顾</h2>
+<p>接下来针对 2.7 版本中发布的新功能,从编程模型、性能优化、服务治理、传输协议、生态发展等几个角度来做具体的讲解。</p>
+<h3>编程模型</h3>
+<p>Dubbo 中涉及编程模型相关的改动主要是以下几点:</p>
+<ul>
+<li>CompletableFuture 异步方法签名的服务</li>
+<li>服务端异步支持 API</li>
+<li>IDL 跨语言服务定义</li>
+<li>Reactive-style 方法签名的服务</li>
+</ul>
+<p>首先,我们先来看一下异步化相关的增强。
+Dubbo Java 版本的典型服务定义如下:</p>
+<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">HelloService</span> </span>{
+  <span class="hljs-comment">// Synchronous style</span>
+  <span class="hljs-function">String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span></span>; 
+}
+</code></pre>
+<p>如果要实现消费端的异步服务调用,则需要单独配置异步标识,并通过 RpcContext API 配合使用</p>
+<pre><code class="language-java">String result = helloService.sayHello(<span class="hljs-string">"world"</span>); <span class="hljs-comment">// result is always null</span>
+Future future = RpcContext.getContext().getFuture();
+</code></pre>
+<p>在 2.7 版本之后,我们可以直接定义如下方法接口,以更直观的实现消费端/提供端异步:</p>
+<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">HelloService</span> </span>{
+  <span class="hljs-comment">// Asynchronous style</span>
+  <span class="hljs-function">CompletableFuture&lt;String&gt; <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span></span>; 
+}
+
+CompletableFuture&lt;String&gt; future = helloService.sayHello(<span class="hljs-string">"world"</span>); 
+</code></pre>
+<p>以上示例都是基于 Java Interface 来描述 Dubbo 服务的,如果要和多语言异构的微服务实现互调,则服务又需要用相应语言的方式重新定义一遍,无法实现跨语言的服务复用;另外跨语言的序列化也是需要注意的一个问题。</p>
+<p>为此 2.7.5 版本引入了对 IDL + Protobuf 的支持,以解决跨语言的服务定义问题,具体可参见示例:</p>
+<p><a href="https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-protobuf">dubbo-samples-protobuf</a></p>
+<p><img src="../../img/docs/service-idl.png" alt="service idl"></p>
+<p>对 Reactive-style API 的支持则和上面 CompletableFuture 有些类似,允许用户定义 RxJava、Reactor API 的服务接口</p>
+<p><img src="../../img/docs/idl-dubbo-compiler.png" alt="idl dubbo compiler"></p>
+<p>但是需要注意的一定是,由于外围的 Reactive API 需要有底层传输协议的支持才有意义,因此,目前 Reactive API 只能在使用 gRPC 协议时才有意义,具体请参见示例以及下面关于 ”<a href="https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-grpc/dubbo-samples-rxjava">Dubbo 对 gRPC 的支持</a>” 一节的讲解。</p>
+<h3>性能优化</h3>
+<p>2.7 版本在性能优化方面也做了很多的工作,对 Dubbo 业务系统的吞吐量、调用链路响应速度、服务治理链路性能等都有明显提升。</p>
+<ol>
+<li>
+<p>系统吞吐量</p>
+<p>和提升系统吞吐量相关的增强主要有框架的全异步化改造、消费端线程模型优化、引入 Stream 语义协议等。</p>
+<p>全异步化改造,很关键的一点是 Filter 链路的异步化,之前的 Filter 只有一个同步的 invoke 方法,现在为了支持异步回调,增加了 Listener 回调监听器,从而可以实现对异步调用结果的监听与拦截。</p>
+</li>
+</ol>
+<p><img src="../../img/docs/filter.png" alt="filter"></p>
+<p>关于消费端线程模型的优化,对于网关类应用,需要消费大量服务的应用,都会在系统稳定性和性能表现上有很大提升,其优化后的总体工作原理图所下所示,具体解析可以参见之前发布的文章:<a href="http://dubbo.apache.org/zh-cn/docs/user/demos/consumer-threadpool.html">《消费端线程池模型》</a></p>
+<p>老线程模型工作原理:</p>
+<p><img src="../../img/docs/consumer-threadpool0.png" alt="consumer threadpool"></p>
+<p>新线程模型工作原理:</p>
+<p><img src="../../img/docs/consumer-threadpool1.png" alt="consumer threadpool new"></p>
+<ol start="2">
+<li>
+<p>RPC 调用链路</p>
+<p>从 2.7.0 到 2.7.5,从我们的测试数据来看,通过一系列的优化调用链路性能提升在 30% 以上。总体来说,优化的目标是减少调用过程中的内存分配和 cpu 计算,主要有两个方面的改造:</p>
+<ul>
+<li>服务元数据静态化,在启动阶段尽可能多的计算并缓存,以减少调用过程中的计算成本,加快响应速度</li>
+<li>减少调用过程中的 URL 操作产生的内存分配</li>
+</ul>
+</li>
+<li>
+<p>服务治理链路</p>
+<p>服务治理链路上主要有以下几点值得关注:地址推送、服务治理规则推送、服务治理规则计算、路由选址等,尤其是在大规模服务集群的场景下,以上每个点都可能成为性能或稳定性瓶颈。在 2.7 版本中,目前着重对 “地址推送” 相关计算路径做了优化,简单概括起来主要是以下几点:</p>
+<ul>
+<li>地址推送事件合并,避免短时间重复计算</li>
+<li>全量地址推送时,避免 URL 重新分配</li>
+<li>在 URL 合并链路上,引入 URL 可变状态,避免 URL 拷贝造成的开销</li>
+</ul>
+</li>
+</ol>
+<h3>服务治理</h3>
+<p>服务治理也是 2.7 版本中着重增强的一个模块。总体上可以分为三部分</p>
+<ul>
+<li>普通路由规则相关的优化和增强</li>
+<li>增强对跨区域、跨机房部署的路由支持</li>
+<li>元数据中心、配置中心</li>
+</ul>
+<p>我们针对这三部分逐步展开讲解。以下是 2.7 版本路由规则的几个例子。</p>
+<p><img src="../../img/docs/route-app.png" alt="route app"></p>
+<p><img src="../../img/docs/route-service.png" alt="route service"></p>
+<p>其中,最明显的一个变化是路由规则都以 YAML 进行了重写,并且后续所有的路由规则都计划以 YAML 为基本描述语言;相比于之前路由规则直接存储于注册中心,在 2.7 版本中增加了配置中心后,新版本的路由规则默认将存储在于独立的配置中心,配置格式推送机制都得到了优化;另外,2.7 版本中还增加了应用粒度的路由规则,方便从整个应用的角度去设置流量规则。</p>
+<p>新增加的跨注册中心的路由机制,可以实现调用流量在多个注册中心间的负载均衡,对于需要做异地容灾、同机房优先或者注册中心迁移的场景比较有用处。</p>
+<p><img src="../../img/docs/cluster-lb.png" alt="cluster load balance"></p>
+<p>当前支持的注册中心集群负载均衡策略有:</p>
+<ul>
+<li>同区域优先</li>
+<li>权重轮询</li>
+<li>指定优先级</li>
+<li>任意可用</li>
+</ul>
+<p>元数据中心存储了 Dubbo 服务方法定义的描述,目前主要的用途是服务测试,将来也可用作服务 API 管理、网关参数映射等。</p>
+<p>新增的配置中心主要有两个用途:存储/推送配置规则、应用配置托管,接下来着重讲解应用配置托管相关功能,看其对 Dubbo 的开发与运维配置的影响。Dubbo 当前支持 JVM 动态参数、配置中心、API、本地配置文件等几种配置源,他们之间按照优先级从高到低的顺序实现配置覆盖,如下图所示:</p>
+<p><img src="../../img/docs/config.png" alt="config"></p>
+<p>配置中心相当于是共享版本的 <code>dubbo.properties</code> 的远程托管,其中,key 值有特定的命名规范:</p>
+<pre><code class="language-properties"><span class="hljs-comment"># 应⽤用级别</span>
+<span class="hljs-meta">dubbo.{config-type}[.{config-id}].{config-item}</span> <span class="hljs-string">{config-item-value}</span>
+<span class="hljs-comment"># 服务级别</span>
+<span class="hljs-meta">dubbo.service.{interface-name}[.{method-name}].{config-item}</span> <span class="hljs-string">{config-item-value}</span>
+<span class="hljs-meta">dubbo.reference.{interface-name}[.{method-name}].{config-item}</span> <span class="hljs-string">{config-item-value}</span>
+<span class="hljs-comment"># 多配置项</span>
+<span class="hljs-meta">dubbo.{config-type}s.{config-id}.{config-item}</span> <span class="hljs-string">{config-item-value}</span>
+</code></pre>
+<h3>传输协议</h3>
+<p>2.7 版本在 RPC 协议层和序列化层进行了扩展,RPC 协议层增加了对 gRPC 协议的支持,序列化层增加了对 Protobuf 协议的支持。</p>
+<p>支持 gRPC 其中一个重要原因是其基于 HTTP/2 协议构建,HTTP/2 协议作为 HTTP 标准协议,在各个层次的网络设备及网关代理上都得到了很好的支持,因此具有更好的穿透性和通用性。通过支持 gRPC 协议,对于期望使用 HTTP/2 的 Dubbo 用户提供了一种传输协议选择。</p>
+<p>gRPC 在 HTTP/2 上构建了 Stream 的 RPC 语义,支持 Request - Response、Stream - Response、Request - Stream、Bi-Stream 等多种语义,能满足不同的业务调用场景。</p>
+<p><img src="../../img/docs/service-idl2.png" alt="service idl2"></p>
+<p>在 Dubbo 的设计中,所有的 RPC 协议都处于一个平等的地位,无论是自有的 Dubbo 协议,还是扩展的其他三方协议如 Thrift、Hessian、gRPC 等,得益于这样的设计,我们可以扩展任何新协议支持。关于如何扩展 RPC 协议及其应用场景,请参见之前发布的<a href="https://mp.weixin.qq.com/s/-fvDeGlCLjz0n60naZJnQg">《使用 Dubbo 连接异构微服务体系》</a>文章。</p>
+<p>Protobuf 序列化协议支持更多的是考虑其在跨语言、安全性和性能方面。</p>
+<h2>Roadmap</h2>
+<p>未来社区将会持续推动 Dubbo 的发展,重点来说有以下几个方向:</p>
+<ul>
+<li>继续增强服务治理相关能力,以更好的满足微服务开发和运维的需求;</li>
+<li>协议层面,着手研发下一代的 RPC 协议,新协议将提供更丰富的如 Stream、Flow Control 等内置语义,同时将具有更好的扩展性、网关的友好性等;</li>
+<li>基于应用粒度的服务发现机制,</li>
+<li>云原生带来了底层基础设施的变化,同时在此基础上衍生出了如 ServiceMesh 的微服务解决方案,我们需要继续探索 Dubbo ;</li>
+</ul>
+<h3>微服务功能</h3>
+<p>目前正在开发或规划中的微服务功能有服务鉴权、熔断、路由规则增强等,预计将在接下来的 2.7.6 等版本中陆续发布。后续也将会根据社区中的诉求,陆续增加其他的微服务功能支持。</p>
+<p>以当前正在开发的服务鉴权功能为例,这是社区中很多 Dubbo 使用者在实际使用中遇到的需求:虽然 Dubbo 服务主要是在内部运转,但有些服务仍期望只对部分场景或用户开放,比如某些涉及到敏感数据操作的服务,这就需要有鉴权能力的支持。</p>
+<p><a href="https://github.com/apache/dubbo/issues/5461">Dubbo调用鉴权认证方案 #5461</a> 中有关于 Dubbo 当前正在开发中的鉴权功能的详细讨论,总体来说 Dubbo 提供的鉴权功能约束了 Dubbo 侧鉴权的基本流程,这是一套通用鉴权的方案,在 token 计算、校验等环节都被设计为可扩展的,因此可以方便的对接到各种认证及权限管理系统。</p>
+<p>非常感谢社区的活跃开发者,现就职于爱奇艺的 <a href="https://github.com/CodingSinger">CodingSinger</a>,其是鉴权模块的发起者和主要开发贡献者。</p>
+<h3>协议 - 3.0</h3>
+<p>以下是 Dubbo 2.0 协议,我们之前已经在多个场合做过详细的讲解</p>
+<p><img src="../../img/blog/grpc/dubbo-ptotocol.png" alt="Dubbo Protocol 2.0"></p>
+<p>Dubbo 2.0 协议在云原生、mesh 等场景下暴露出一些问题,如:</p>
+<ul>
+<li>协议缺少扩展性</li>
+<li>RPC 协议层和 payload 耦合在一起</li>
+<li>基于 TCP 构建的二进制私有协议</li>
+<li>缺少 Stream 语义的支持</li>
+</ul>
+<p>所以,针对以上问题,新一代的 Dubbo 协议将突出以下特点:</p>
+<p><strong>Reactive Stream</strong>
+Reactive Stream 引入 RPC,带来更丰富的通信语义和 API 编程模型支持,如 Request-Stream、Bi-Stream 等</p>
+<p><strong>协议升级</strong>
+协议内置应⽤层协议协商机制,包括自建协议升级机制、ALPN 等,以方面将来协议升级或兼容老版本协议的迁移</p>
+<p><strong>HTTP/2</strong>
+微服务云原⽣生场景下,基于 HTTP/2 构建的通信协议具有更更好的通⽤用性和穿透性</p>
+<p><strong>可扩展</strong>
+协议可扩展,区分协议头 Metadata 与 RPC 方法的参数</p>
+<p><strong>多语⾔支持</strong>
+如通过支持 Protobuf 提供了更完善的 跨语言服务定义 与 序列化传输 的支持</p>
+<p><strong>Mesh</strong>
+协议对 Mesh 更友好,方便完成与 Mesh 的协作,包括流量控制机制、应用层配置协商等</p>
+<p><strong>流量控制</strong>
+协议内置流控机制,支持类似 Reqctive Stream 的 Request (n)  流控机制</p>
+<p><strong>协议通用性</strong>
+兼顾通用性与性能,支持协议能在各种设备上运行</p>
+<h3>服务自省 - 应用粒度的服务注册</h3>
+<p>Dubbo 最大的优势之一在于其易用性,其面向接口(RPC 方法)的编程模型。同时,面向接口的治理也带来了一些问题:</p>
+<ul>
+<li>地址数量成倍增长,给地址推送带来很大压力</li>
+<li>和主流微服务体系模型不匹配,如 SpringCloud、Kubernetes 等</li>
+</ul>
+<p>为此,我们计划引入应用粒度的服务注册机制,主要有以下几个重点:</p>
+<ul>
+<li>注册中心按 “应用 - 实例IP” 组织,不再关心 RPC 接口同步</li>
+<li>引入独立的元数据服务完成 RPC 接口同步工作</li>
+</ul>
+<p>以下是应用粒度服务注册(服务自省)的基本工作原理,请持续关注后续对这部分的具体解析和开发进展。</p>
+<p><img src="../../img/docs/servicediscovery-new.png" alt="service discovery new"></p>
+<h3>云原生</h3>
+<p>云原生带来了底层基础设施,应用开发、部署和运维等全方位的变化:</p>
+<p><strong>基础设施</strong></p>
+<ul>
+<li>基础设施调度机制变化,带来运维(生命周期)、服务治理等方面的变化。</li>
+<li>服务发现能力下沉, Kubernetes 抽象了 Native Service Discovery。</li>
+</ul>
+<p><strong>Service Mesh - 云原生微服务解决方案</strong></p>
+<ul>
+<li>Mesh 为跨语言、sdk 升级等提供了解决方案,Dubbo sdk 要与 Mesh 协作,做到功能、协议、服务治理等多方便的适配。</li>
+<li>Mesh 尚未大规模铺开,且其更适合对流量管控更关注的应用,传统 SDK 的性能优势仍旧存在,两者混部迁移场景可能会长期存在。</li>
+</ul>
+<p>从应用场景上,Dubbo 可能的部署环境包括:</p>
+<ol>
+<li>不使用 Kubernetes Native Service,Kubernetes 只作为容器编排调度设施,继续使用 Dubbo  自建的服务注册、发现机制。</li>
+<li>复用 Kubernetes Native Service,Dubbo 不再关心服务注册,Dubbo Client 负责服务发现与流量分配。</li>
+<li>Dubbo sdk 往 Mesh 迁移,一方面要做到适应 Mesh 架构,成为 Mesh 体系下的 RPC 编程和通信方案;另一方面要做到 Dubbo 与 Mesh 架构长期共存,互相打通服务发现和治理体系。</li>
+<li>Kubernetes 上与云下混合部署的平滑迁移支持,包括服务发现的统一与网络通信方案的打通。</li>
+</ol>
+<p>从 Dubbo 功能划分上,将着重从以下方面提供对云原生基础设施的支持:</p>
+<p><strong>生命周期:</strong> Dubbo 与 Kubernetes 调度机制绑定,保持服务生命周期与 Pod 容器等生命周期的自动对齐
+<strong>治理规则:</strong> 服务治理规则在规则体、规则格式方面进行优化,如规则体以 YAML 描述、取消过滤规则对 IP 的直接依赖,定义规则特有的 CRD 资源等。
+<strong>服务发现:</strong> 支持 K8S Native Service 的服务发现,包括 DNS、API-Server,支持 xDS 的服务发现
+<strong>Mesh 架构协作:</strong> 构建下一代的基于 HTTP/2 的通信协议,支持 xDS 的标准化的数据下发</p>
+</section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3></h3><p></p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">基金会</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">证书</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">事件</a></dd><dd><a href=" [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+  <script src="/build/blogDetail.js"></script>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112489517-1"></script>
+	<script>
+		window.dataLayer = window.dataLayer || [];
+		function gtag(){dataLayer.push(arguments);}
+		gtag('js', new Date());
+
+		gtag('config', 'UA-112489517-1');
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/blog/apache-dubbo-2019-2020.json b/zh-cn/blog/apache-dubbo-2019-2020.json
new file mode 100644
index 0000000..fcb6ad8
--- /dev/null
+++ b/zh-cn/blog/apache-dubbo-2019-2020.json
@@ -0,0 +1,6 @@
+{
+  "filename": "apache-dubbo-2019-2020.md",
+  "__html": "<h1>从 2019 到 2020,Apache Dubbo 年度回顾与总结</h1>\n<p>非常感谢大家对 Dubbo 社区的关注,通过这篇文章我们将:总结过去一年 Dubbo 社区取得的成绩,包括社区和框架演进两个方面;展望未来 Dubbo 社区和框架的新的规划(roadmap)。社区建设是推动 Dubbo 健康持续发展的一个非常重要的环节,我们需要与社区保持良性的互动、有活跃的贡献者、有积极的富有建设性的讨论,而整个 Dubbo 社区过去一年在这方面都做的不错;在框架演进上,我们主要发布了 2.7.0 - 2.7.5 共 6 个特性版本,功能层面涵盖编程模型、协议、服务治理、性能优化等多个方面;除了已经发布的功能外,我们在 Dubbo 3.0 协议、服务自省和云原生等方向上也做了深入的探索,对这些方向的支持将是 Dubbo 接下来的重要工作方向,希望能通过这篇文章将其中更详细的思考和计划同步�
 ��大家。</p>\n<h2>社区回顾</h2>\n<p>回顾 Dubbo 社区过去一年的发展,其中一个重要的节点就是 2019 年 5 月从 Apa [...]
+  "link": "/zh-cn/blog/apache-dubbo-2019-2020.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/index.html b/zh-cn/blog/index.html
index 5375490..29b29c8 100644
--- a/zh-cn/blog/index.html
+++ b/zh-cn/blog/index.html
@@ -12,7 +12,7 @@
 	<link rel="stylesheet" href="/build/blog.css" />
 </head>
 <body>
-	<div id="root"><div class="blog-list-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a hre [...]
+	<div id="root"><div class="blog-list-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a hre [...]
 	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
 	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
 	<script>
diff --git a/zh-cn/docs/user/demos/consumer-threadpool.html b/zh-cn/docs/user/demos/consumer-threadpool.html
index 2ea7195..3a5bc6d 100644
--- a/zh-cn/docs/user/demos/consumer-threadpool.html
+++ b/zh-cn/docs/user/demos/consumer-threadpool.html
@@ -15,11 +15,10 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
 <p>2.7.5 版本对整个调用链路做了全面的优化,根据压测结果显示,总体 QPS 性能提升将近 30%,同时也减少了调用过程中的内存分配开销。其中一个值得提及的设计点是 2.7.5 引入了 Servicerepository 的概念,在服务注册阶段提前生成 ServiceDescriptor 和 MethodDescriptor,以减少 RPC 调用阶段计算 Service 原信息带来的资源消耗。</p>
 <h2>消费端线程池模型优化</h2>
-<p>对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程数分配过多的问题,具体问题讨论可参见以下 issue :</p>
-<p><a href="https://github.com/apache/dubbo/issues/2013">https://github.com/apache/dubbo/issues/2013</a></p>
+<p>对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程数分配过多的问题,具体问题讨论可参见 <a href="https://github.com/apache/dubbo/issues/2013">Need a limited Threadpool in consumer side #2013</a></p>
 <p>改进后的消费端线程池模型,通过复用业务端被阻塞的线程,很好的解决了这个问题。</p>
 <p><strong>老的线程池模型</strong></p>
-<p><img src="/img/docs/consumer-threadpool0.png" alt="消费端线程池.png"></p>
+<p><img src="../../../../img/docs/consumer-threadpool0.png" alt="消费端线程池.png"></p>
 <p>我们重点关注 Consumer 部分:</p>
 <ol>
 <li>业务线程发出请求,拿到一个 Future 实例。</li>
@@ -28,7 +27,7 @@
 <li>业务线程拿到结果直接返回</li>
 </ol>
 <p><strong>2.7.5 版本引入的线程池模型</strong></p>
-<p><img src="/img/consumer-threadpool1.png" alt="消费端线程池新.png"></p>
+<p><img src="../../../../img/docs/consumer-threadpool1.png" alt="消费端线程池新.png"></p>
 <ol>
 <li>业务线程发出请求,拿到一个 Future 实例。</li>
 <li>在调用 future.get() 之前,先调用 ThreadlessExecutor.wait(),wait 会使业务线程在一个阻塞队列上等待,直到队列中被加入元素。</li>
diff --git a/zh-cn/docs/user/demos/consumer-threadpool.json b/zh-cn/docs/user/demos/consumer-threadpool.json
index d30ea68..fcbbbd0 100644
--- a/zh-cn/docs/user/demos/consumer-threadpool.json
+++ b/zh-cn/docs/user/demos/consumer-threadpool.json
@@ -1,6 +1,6 @@
 {
   "filename": "consumer-threadpool.md",
-  "__html": "<h1>消费端线程池模型</h1>\n<p>2.7.5 版本对整个调用链路做了全面的优化,根据压测结果显示,总体 QPS 性能提升将近 30%,同时也减少了调用过程中的内存分配开销。其中一个值得提及的设计点是 2.7.5 引入了 Servicerepository 的概念,在服务注册阶段提前生成 ServiceDescriptor 和 MethodDescriptor,以减少 RPC 调用阶段计算 Service 原信息带来的资源消耗。</p>\n<h2>消费端线程池模型优化</h2>\n<p>对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程数分配过多的问题,具体问题讨论可参见以下 issue :</p>\n<p><a href=\"https://github.com/apache/dubbo/issues/2013\">https://github.com/apache/dubbo/issues/2013</a></p>\n<p> [...]
+  "__html": "<h1>消费端线程池模型</h1>\n<p>2.7.5 版本对整个调用链路做了全面的优化,根据压测结果显示,总体 QPS 性能提升将近 30%,同时也减少了调用过程中的内存分配开销。其中一个值得提及的设计点是 2.7.5 引入了 Servicerepository 的概念,在服务注册阶段提前生成 ServiceDescriptor 和 MethodDescriptor,以减少 RPC 调用阶段计算 Service 原信息带来的资源消耗。</p>\n<h2>消费端线程池模型优化</h2>\n<p>对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程数分配过多的问题,具体问题讨论可参见 <a href=\"https://github.com/apache/dubbo/issues/2013\">Need a limited Threadpool in consumer side #2013</a></p>\n<p>改进后的消费端线程池模型, [...]
   "link": "/zh-cn/docs/user/demos/consumer-threadpool.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/new-features-in-a-glance.html b/zh-cn/docs/user/new-features-in-a-glance.html
index cb1b9d3..0986009 100644
--- a/zh-cn/docs/user/new-features-in-a-glance.html
+++ b/zh-cn/docs/user/new-features-in-a-glance.html
@@ -117,16 +117,16 @@
 <li><a href="./demos/auth.md">服务鉴权</a></li>
 <li>性能优化
 <ul>
-<li><a href="../../../blog/zh-cn/2.7.5-release.md">调用链路提升 30%</a></li>
+<li><a href="/zh-cn/blog/2.7.5-release.html">调用链路提升 30%</a></li>
 <li><a href="./demos/consumer-threadpool.md">消费端线程模型</a></li>
 <li><a href="">地址推送链路</a></li>
 </ul>
 </li>
 </ul>
 <h2>热门文章列表</h2>
-<p><a href="../../../blog/zh-cn/apche-dubbo-2019-2020.md">从 2019 到 2020,Apache Dubbo 年度总结</a><br>
-<a href="../../../blog/zh-cn/2.7.5-release.md">Dubbo 2.7.5 里程碑版本发布</a><br>
-<a href="../../../blog/zh-cn/Dubbo-supporting-gRPC-HTTP2-and-protobuf.md">Dubbo 在协议与多语言方向的探索:支持 gRPC、Protobuf</a></p>
+<p><a href="/zh-cn/blog/apache-dubbo-2019-2020.html">从 2019 到 2020,Apache Dubbo 年度总结</a><br>
+<a href="/zh-cn/blog/2.7.5-release.html">Dubbo 2.7.5 里程碑版本发布</a><br>
+<a href="/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.html">Dubbo 在协议与多语言方向的探索:支持 gRPC、Protobuf</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></h3><p></p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">基金会</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">证书</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">事件</a></dd><dd><a  [...]
 	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
 	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
diff --git a/zh-cn/docs/user/new-features-in-a-glance.json b/zh-cn/docs/user/new-features-in-a-glance.json
index 9665ea0..7e8e0cc 100644
--- a/zh-cn/docs/user/new-features-in-a-glance.json
+++ b/zh-cn/docs/user/new-features-in-a-glance.json
@@ -1,6 +1,6 @@
 {
   "filename": "new-features-in-a-glance.md",
-  "__html": "<h1>Dubbo 版本发布及新特性速览</h1>\n<p>[TOC]</p>\n<h2>版本速览</h2>\n<p>Dubbo 社区目前主力维护的有 2.6.x 和 2.7.x 两大版本,其中,</p>\n<ul>\n<li>2.6.x 主要以 bugfix 和少量 enhancements 为主,因此能完全保证稳定性</li>\n<li>2.7.x 作为社区的主要开发版本,得到持续更新并增加了大量新 feature 和优化,同时也带来了一些稳定性挑战</li>\n</ul>\n<h3>2.7.x 版本</h3>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>版本</th>\n<th>重要功能</th>\n<th>升级建议</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>2.7.6</td>\n<td>bugfix of 2.7.5<br /> 服务鉴权</td>\n<td><strong>推荐生产使用</strong></td>\n</tr>\n< [...]
+  "__html": "<h1>Dubbo 版本发布及新特性速览</h1>\n<p>[TOC]</p>\n<h2>版本速览</h2>\n<p>Dubbo 社区目前主力维护的有 2.6.x 和 2.7.x 两大版本,其中,</p>\n<ul>\n<li>2.6.x 主要以 bugfix 和少量 enhancements 为主,因此能完全保证稳定性</li>\n<li>2.7.x 作为社区的主要开发版本,得到持续更新并增加了大量新 feature 和优化,同时也带来了一些稳定性挑战</li>\n</ul>\n<h3>2.7.x 版本</h3>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>版本</th>\n<th>重要功能</th>\n<th>升级建议</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>2.7.6</td>\n<td>bugfix of 2.7.5<br /> 服务鉴权</td>\n<td><strong>推荐生产使用</strong></td>\n</tr>\n< [...]
   "link": "/zh-cn/docs/user/new-features-in-a-glance.html",
   "meta": {}
 }
\ No newline at end of file