You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by wa...@apache.org on 2019/08/13 13:41:07 UTC

[dubbo-website] branch ecology-page updated (b659fa5 -> e592751)

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

wangxin pushed a change to branch ecology-page
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git.


    from b659fa5  feat: 优化移动端适配及窗口尺寸变化
     add 21c544f  Fix typos in architecture.md & xml.md (#364)
     add bd0881d  Add title, keywords, descriptions to blogs (#362)
     add b02e30d  fix doc issue, protocolconfig does not support specifying of token  (#369)
     add 5e66b18  Remove incubating word
     add 5fd8a83  [UPDATE] zkclient has remove in 2.7.x(#370)
     add d4e6dd9  fix 404 link (#372)
     add 0d2f3c5  Update README.md (#366)
     add 574428a  new acticle: study dubbo network interfaces seletion (#363)
     add bebf6f8  add new page for docker image build (#373)
     add 627292e  Fix some issues of Blog (#374)
     add 1a3a85c  Blog & Docs translation plan (#375)
     add 03be83b  rebuild website
     add 9b409db  update README
     add 07c8518  remove incubator (#377)
     add 1a57773  build htmls
     add 9416627  Add Nacos registry center page. (#380)
     add 0dccd17  add nacos registry
     add ff36d3f  Feature nacos registry center (#381)
     add cc5a045  nacos registry
     add c90ef9f  add a committer (#384)
     add 87f6b8f  fixed service test blog link #379 (#383)
     add 72c4883  Add dubbo-erlang user doc (#382)
     add e03ad80  update stub-mock (#385)
     add bab5988  htmls generated from e03ad801d7ccd3df3e3918ea518390f013ca667f
     add bb941e7  'fix#389' (#390)
     add ae41535  fix wrong word (#396)
     add 81f61c0  Fix typo (#397)
     add e24be04  modify 2.7.2-release
     add 8496a46  Avoid global install for docsite (#378)
     add 43731b8  Update home.jsx (#394)
     add 3ca0682  Website updated
     add f3b7ed6  Fix dead links and typo (#400)
     add 9709cb8  remove genereated htmls from source branch
     add 5b2a221  remove build folder
     add 5bec06c  remove md_json folder
     add bb39ed8  fix typos and make some changes on readme (#404)
     add 5bc58d5  Update requirements.md (#406)
     add 9e420ce  Fix typo for Maturity in menu list(#411)
     add bb7f4b7  [Doc] update rest.md (#412)
     add 0dc1740  fix Eco System some item url (#413)
     add d5b2314  Fix registry protocol description (#407)
     add f1df26c  Correct word separator to '-' (#417)
     add ef991ad  [Doc] Dubbo's Config Center model corresponding to different thirdparty products (#388)
     add 4895708  Fix typo in sidebar title for Serialization (#418)
     add 7927661  Fix typos in maturity.md (#419)
     add 2f99615  add config center dev doc (#423)
     add 3dd4933  Addd new docs (#424)
     add e6e439a  覆盖规则需要添加版本 (#420)
     add c2f9412  fix a typo and reformat the format (#425)
     add a6b4934  Separate the tables of maturity.md (#426)
     add c7cbfe5  Fix a typo in architecture page(#428)
     add 9c5ca0e  Fix classpath didn't update#409 (#431)
     add cf9f34c  Fix typo (#429)
     new 6631510  add ecology-page
     new 962cefd  update gitignore
     new e592751  delete static files

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitignore                                         |    7 +-
 PULL_REQUEST_TEMPLATE.md                           |    4 +-
 README.md                                          |   15 +-
 blog/en-us/apachecon-na-2018.md                    |    8 +-
 blog/en-us/download.md                             |   32 +-
 blog/en-us/dubbo-101.md                            |    4 +-
 blog/en-us/dubbo-new-async.md                      |    6 +-
 blog/en-us/dubbo2-js.md                            |    4 +-
 blog/en-us/gsoc-2018.md                            |    8 +-
 blog/en-us/prepare-an-apache-release.md            |   50 +-
 blog/en-us/qcon-beijing-2018.md                    |    7 +
 .../en-us/spring-boot-dubbo-start-stop-analysis.md |   12 +-
 blog/en-us/tracing-with-skywalking.md              |    2 +-
 blog/zh-cn/apachecon-na-2018.md                    |    6 +
 blog/zh-cn/build-new-docker-image-in-dockerhub.md  |   58 +
 blog/zh-cn/download.md                             |   24 +-
 blog/zh-cn/dubbo-27-features.md                    |    2 +-
 blog/zh-cn/dubbo-admin.md                          |    2 +-
 ...source.md => dubbo-contribute-to-opensource.md} |   18 +-
 blog/zh-cn/dubbo-integrate-with-hystrix.md         |    6 +-
 blog/zh-cn/dubbo-local-call.md                     |    2 +-
 blog/zh-cn/dubbo-meet-arthas.md                    |    6 +-
 blog/zh-cn/dubbo-network-interfaces.md             |  526 +++++
 blog/zh-cn/dubbo-new-async.md                      |    6 +-
 blog/zh-cn/dubbo-registry-nacos-integration.md     |   12 +-
 blog/zh-cn/dubbo-stub-mock.md                      |    6 +-
 blog/zh-cn/dubbo2-js.md                            |    4 +-
 blog/zh-cn/gsoc-2018.md                            |   10 +
 blog/zh-cn/how-to-involve-dubbo-community.md       |   12 +-
 blog/zh-cn/introduction-to-dubbo-url.md            |    4 +-
 blog/zh-cn/optimization-branch-prediction.md       |    2 +-
 blog/zh-cn/prepare-an-apache-release.md            |   47 +-
 blog/zh-cn/qcon-beijing-2018.md                    |    6 +
 blog/zh-cn/sentinel-introduction-for-dubbo.md      |    2 +-
 .../zh-cn/spring-boot-dubbo-start-stop-analysis.md |   12 +-
 build/TXD_D-Medium.eot                             |  Bin 5025 -> 0 bytes
 build/TXD_D-Medium.ttf                             |  Bin 8984 -> 0 bytes
 build/TXD_D-Medium.woff                            |  Bin 5488 -> 0 bytes
 build/TXD_D-Regular.eot                            |  Bin 4837 -> 0 bytes
 build/TXD_D-Regular.ttf                            |  Bin 8832 -> 0 bytes
 build/TXD_D-Regular.woff                           |  Bin 5336 -> 0 bytes
 build/blog.css                                     |    1 -
 build/blog.js                                      |    6 -
 build/blogDetail.css                               |    1 -
 build/blogDetail.js                                |    6 -
 build/community.css                                |    1 -
 build/community.js                                 |    6 -
 build/documentation.css                            |    1 -
 build/documentation.js                             |    6 -
 build/ecology.css                                  |    1 -
 build/ecology.js                                   |   11 -
 build/home.css                                     |    1 -
 build/home.js                                      |    6 -
 docs/en-us/admin/install/admin-console.md          |    4 +-
 docs/en-us/admin/install/consumer-demo.md          |   18 +-
 docs/en-us/admin/install/provider-demo.md          |   14 +-
 docs/en-us/admin/introduction.md                   |    6 +-
 docs/en-us/admin/ops/skywalking.md                 |    2 +-
 docs/en-us/admin/serviceTest.md                    |    2 +-
 docs/en-us/dev/build.md                            |    6 +-
 docs/en-us/dev/impls/protocol.md                   |   12 +-
 .../committer-guide/apache-dubbo-page_dev.md       |    7 +-
 .../committer-guide/label-an-issue-guide_dev.md    |    4 +-
 .../committer-guide/release-guide_dev.md           |  156 +-
 .../committer-guide/website-guide_dev.md           |    2 +-
 .../contributor-guide/dubbo-extension-guide_dev.md |    4 +-
 .../mailing-list-subscription-guide_dev.md         |   12 +-
 .../contributor-guide/new-contributor-guide_dev.md |   36 +-
 .../reporting-security-issues_dev.md               |    4 +-
 .../software-donation-guide_dev.md                 |    6 +-
 .../contributor-guide/test-coverage-guide_dev.md   |    2 +-
 docs/en-us/developers/developers_dev.md            |   33 +-
 docs/en-us/developers/guide_dev.md                 |   18 +-
 docs/en-us/developers/user-guide/faq_dev.md        |    4 +-
 docs/en-us/user/SUMMARY.md                         |    2 +-
 docs/en-us/user/benchmark-tool.md                  |    6 +-
 docs/en-us/user/configuration/xml.md               |    2 +-
 docs/en-us/user/coveragence.md                     |    4 +-
 docs/en-us/user/demos/group-merger.md              |    2 +-
 docs/en-us/user/demos/local-call.md                |    2 +-
 docs/en-us/user/demos/parameter-validation.md      |    2 +-
 docs/en-us/user/demos/result-cache.md              |    2 +-
 docs/en-us/user/languages/erlang/reference.md      |   15 +
 docs/en-us/user/languages/erlang/serialization.md  |   17 +
 docs/en-us/user/languages/erlang/service.md        |   22 +
 docs/en-us/user/languages/erlang/start.md          |   62 +
 docs/en-us/user/maturity.md                        |   66 +-
 docs/en-us/user/preface/architecture.md            |    4 +-
 docs/en-us/user/preface/requirements.md            |    2 +-
 docs/en-us/user/references/protocol/thrift.md      |    2 +-
 docs/en-us/user/references/registry/nacos.md       |  122 ++
 docs/en-us/user/references/registry/zookeeper.md   |    2 +
 docs/en-us/user/references/xml/dubbo-registry.md   |    2 +-
 docs/zh-cn/admin/install/admin-console.md          |    4 +-
 docs/zh-cn/admin/install/consumer-demo.md          |    4 +-
 docs/zh-cn/admin/install/provider-demo.md          |    4 +-
 docs/zh-cn/admin/introduction.md                   |    6 +-
 docs/zh-cn/dev/SUMMARY.md                          |    1 +
 docs/zh-cn/dev/build.md                            |    6 +-
 docs/zh-cn/dev/impls/config-center.md              |   95 +
 docs/zh-cn/dev/impls/protocol.md                   |   12 +-
 .../committer-guide/apache-dubbo-page_dev.md       |    9 +-
 .../committer-guide/release-guide_dev.md           |  162 +-
 .../committer-guide/website-guide_dev.md           |    2 +-
 .../contributor-guide/dubbo-extension-guide_dev.md |    2 +-
 .../mailing-list-subscription-guide_dev.md         |   12 +-
 .../contributor-guide/new-contributor-guide_dev.md |   16 +-
 .../reporting-security-issues_dev.md               |    4 +-
 .../software-donation-guide_dev.md                 |    4 +-
 .../contributor-guide/test-coverage-guide_dev.md   |    2 +-
 docs/zh-cn/developers/developers_dev.md            |   33 +-
 docs/zh-cn/developers/guide_dev.md                 |   18 +-
 docs/zh-cn/developers/user-guide/faq_dev.md        |    4 +-
 docs/zh-cn/source_code_guide/export-service.md     |    2 +-
 docs/zh-cn/source_code_guide/loadbalance.md        |    4 +-
 docs/zh-cn/source_code_guide/refer-service.md      |    4 +-
 docs/zh-cn/user/SUMMARY.md                         |    1 +
 docs/zh-cn/user/benchmark-tool.md                  |    6 +-
 docs/zh-cn/user/configuration/annotation.md        |    2 +-
 docs/zh-cn/user/configuration/config-center.md     |    4 +-
 .../configuration/configuration-load-process.md    |    8 +-
 .../user/configuration/environment-variables.md    |   31 +
 docs/zh-cn/user/configuration/xml.md               |    2 +-
 docs/zh-cn/user/coveragence.md                     |    4 +-
 docs/zh-cn/user/demos/config-rule.md               |    9 +-
 docs/zh-cn/user/demos/parameter-validation.md      |    2 +-
 docs/zh-cn/user/demos/result-cache.md              |    2 +-
 docs/zh-cn/user/demos/routing-rule.md              |    4 +-
 docs/zh-cn/user/demos/set-host.md                  |    4 +-
 docs/zh-cn/user/demos/token-authorization.md       |   13 -
 docs/zh-cn/user/languages/erlang/reference.md      |   15 +
 docs/zh-cn/user/languages/erlang/serialization.md  |   21 +
 docs/zh-cn/user/languages/erlang/service.md        |   22 +
 docs/zh-cn/user/languages/erlang/start.md          |   60 +
 docs/zh-cn/user/maturity.md                        |   21 +-
 docs/zh-cn/user/recommend.md                       |    2 +-
 .../zh-cn/user/references/metadata/introduction.md |    2 +-
 docs/zh-cn/user/references/protocol/rest.md        |   28 +-
 docs/zh-cn/user/references/protocol/thrift.md      |    4 +-
 docs/zh-cn/user/references/registry/nacos.md       |  130 ++
 docs/zh-cn/user/references/registry/zookeeper.md   |    2 +
 docs/zh-cn/user/references/xml/dubbo-registry.md   |    2 +-
 docs/zh-cn/user/versions/version-270.md            |    4 +-
 en-us/blog/apachecon-na-2018.html                  |   10 +-
 en-us/blog/apachecon-na-2018.json                  |    8 +-
 en-us/blog/download.html                           |   32 +-
 en-us/blog/download.json                           |    8 +-
 en-us/blog/dubbo-101.html                          |    6 +-
 en-us/blog/dubbo-101.json                          |    2 +-
 en-us/blog/dubbo-annotation.html                   |    2 +-
 ...o-basic-usage-dubbo-provider-configuration.html |    2 +-
 en-us/blog/dubbo-fescar.html                       |    2 +-
 en-us/blog/dubbo-generic-invoke.html               |    2 +-
 en-us/blog/dubbo-invoke.html                       |    2 +-
 en-us/blog/dubbo-k8s.html                          |    2 +-
 en-us/blog/dubbo-loadbalance.html                  |    2 +-
 en-us/blog/dubbo-meetup-beijing-may-12th-2018.html |    2 +-
 en-us/blog/dubbo-meetup-chengdu.html               |    2 +-
 en-us/blog/dubbo-meetup-hangzhou.html              |    2 +-
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.html  |    2 +-
 en-us/blog/dubbo-meetup-shenzhen.html              |    2 +-
 en-us/blog/dubbo-new-async.html                    |    8 +-
 en-us/blog/dubbo-new-async.json                    |    2 +-
 en-us/blog/dubbo-zk.html                           |    2 +-
 en-us/blog/dubbo2-js.html                          |    6 +-
 en-us/blog/dubbo2-js.json                          |    4 +-
 en-us/blog/gsoc-2018.html                          |    8 +-
 en-us/blog/gsoc-2018.json                          |    6 +-
 en-us/blog/index.html                              |    2 +-
 en-us/blog/introduction-to-dubbo-qos.html          |    2 +-
 en-us/blog/introduction-to-dubbo-spi-2.html        |    2 +-
 en-us/blog/introduction-to-dubbo-spi.html          |    2 +-
 en-us/blog/pinpoint.html                           |    2 +-
 en-us/blog/prepare-an-apache-release.html          |   55 +-
 en-us/blog/prepare-an-apache-release.json          |    5 +-
 en-us/blog/qcon-beijing-2018.html                  |    8 +-
 en-us/blog/qcon-beijing-2018.json                  |    6 +-
 en-us/blog/sentinel-introduction-for-dubbo.html    |    2 +-
 .../spring-boot-dubbo-start-stop-analysis.html     |   12 +-
 .../spring-boot-dubbo-start-stop-analysis.json     |    4 +-
 en-us/blog/tracing-with-skywalking.html            |    4 +-
 en-us/blog/tracing-with-skywalking.json            |    2 +-
 en-us/community/index.html                         |    2 +-
 en-us/docs/admin/README.html                       |    4 +-
 en-us/docs/admin/SUMMARY.html                      |    4 +-
 en-us/docs/admin/install/admin-console.html        |    8 +-
 en-us/docs/admin/install/admin-console.json        |    2 +-
 en-us/docs/admin/install/consumer-demo.html        |   20 +-
 en-us/docs/admin/install/consumer-demo.json        |    2 +-
 en-us/docs/admin/install/introduction.html         |    4 +-
 en-us/docs/admin/install/provider-demo.html        |   16 +-
 en-us/docs/admin/install/provider-demo.json        |    2 +-
 en-us/docs/admin/install/redis.html                |    4 +-
 .../docs/admin/install/simple-monitor-center.html  |    4 +-
 .../docs/admin/install/simple-registry-center.html |    4 +-
 en-us/docs/admin/install/zookeeper.html            |    4 +-
 en-us/docs/admin/introduction.html                 |   10 +-
 en-us/docs/admin/introduction.json                 |    2 +-
 en-us/docs/admin/ops/dubbo-ops.html                |    4 +-
 en-us/docs/admin/ops/introduction.html             |    4 +-
 en-us/docs/admin/ops/pinpoint.html                 |    4 +-
 en-us/docs/admin/ops/skywalking.html               |    6 +-
 en-us/docs/admin/ops/skywalking.json               |    2 +-
 en-us/docs/admin/ops/skywalking.md                 |  121 --
 en-us/docs/admin/serviceGovernance.html            |    4 +-
 en-us/docs/admin/serviceSearch.html                |    4 +-
 en-us/docs/admin/serviceTest.html                  |    4 +-
 en-us/docs/admin/serviceTest.json                  |    2 +-
 en-us/docs/dev/README.html                         |    4 +-
 en-us/docs/dev/SPI.html                            |    4 +-
 en-us/docs/dev/SUMMARY.html                        |    4 +-
 en-us/docs/dev/TCK.html                            |    4 +-
 en-us/docs/dev/build.html                          |   10 +-
 en-us/docs/dev/build.json                          |    2 +-
 en-us/docs/dev/checklist.html                      |    4 +-
 en-us/docs/dev/code-smell.html                     |    4 +-
 en-us/docs/dev/coding.html                         |    4 +-
 en-us/docs/dev/contract.html                       |    4 +-
 en-us/docs/dev/contribution.html                   |    4 +-
 en-us/docs/dev/design.html                         |    4 +-
 en-us/docs/dev/implementation.html                 |    4 +-
 en-us/docs/dev/impls/cache.html                    |    4 +-
 en-us/docs/dev/impls/cluster.html                  |    4 +-
 en-us/docs/dev/impls/compiler.html                 |    4 +-
 en-us/docs/dev/impls/container.html                |    4 +-
 en-us/docs/dev/impls/dispatcher.html               |    4 +-
 en-us/docs/dev/impls/exchanger.html                |    4 +-
 en-us/docs/dev/impls/exporter-listener.html        |    4 +-
 en-us/docs/dev/impls/extension-factory.html        |    4 +-
 en-us/docs/dev/impls/filter.html                   |    4 +-
 en-us/docs/dev/impls/introduction.html             |    4 +-
 en-us/docs/dev/impls/invoker-listener.html         |    4 +-
 en-us/docs/dev/impls/load-balance.html             |    4 +-
 en-us/docs/dev/impls/logger-adapter.html           |    4 +-
 en-us/docs/dev/impls/merger.html                   |    4 +-
 en-us/docs/dev/impls/monitor.html                  |    4 +-
 en-us/docs/dev/impls/networker.html                |    4 +-
 en-us/docs/dev/impls/page.html                     |    4 +-
 en-us/docs/dev/impls/protocol.html                 |   14 +-
 en-us/docs/dev/impls/protocol.json                 |    2 +-
 en-us/docs/dev/impls/proxy-factory.html            |    4 +-
 en-us/docs/dev/impls/registry.html                 |    4 +-
 en-us/docs/dev/impls/remoting.html                 |    4 +-
 en-us/docs/dev/impls/router.html                   |    4 +-
 en-us/docs/dev/impls/serialize.html                |    4 +-
 en-us/docs/dev/impls/status-checker.html           |    4 +-
 en-us/docs/dev/impls/telnet-handler.html           |    4 +-
 en-us/docs/dev/impls/threadpool.html               |    4 +-
 en-us/docs/dev/impls/validation.html               |    4 +-
 en-us/docs/dev/introduction.html                   |    2 +-
 en-us/docs/dev/principals/code-detail.html         |    4 +-
 en-us/docs/dev/principals/configuration.html       |    4 +-
 en-us/docs/dev/principals/dummy.html               |    4 +-
 en-us/docs/dev/principals/expansibility.html       |    4 +-
 en-us/docs/dev/principals/extension.html           |    4 +-
 en-us/docs/dev/principals/general-knowledge.html   |    4 +-
 en-us/docs/dev/principals/introduction.html        |    4 +-
 en-us/docs/dev/principals/robustness.html          |    4 +-
 en-us/docs/dev/release.html                        |    4 +-
 .../committer-guide/apache-dubbo-page_dev.html     |   12 +-
 .../committer-guide/apache-dubbo-page_dev.json     |    2 +-
 .../committer-guide/label-an-issue-guide_dev.html  |    6 +-
 .../committer-guide/label-an-issue-guide_dev.json  |    2 +-
 .../committer-guide/new-committer-guide_dev.html   |    4 +-
 .../developers/committer-guide/release-guide.html  |   34 -
 .../developers/committer-guide/release-guide.json  |    6 -
 .../committer-guide/release-guide_dev.html         |  157 +-
 .../committer-guide/release-guide_dev.json         |    2 +-
 .../committer-guide/website-guide_dev.html         |    6 +-
 .../committer-guide/website-guide_dev.json         |    2 +-
 .../contributor-guide/become-a-committer_dev.html  |    4 +-
 .../contributor-guide/cla-signing-guide_dev.html   |    4 +-
 .../dubbo-extension-guide_dev.html                 |    6 +-
 .../dubbo-extension-guide_dev.json                 |    2 +-
 .../mailing-list-subscription-guide_dev.html       |   14 +-
 .../mailing-list-subscription-guide_dev.json       |    2 +-
 .../new-contributor-guide_dev.html                 |   40 +-
 .../new-contributor-guide_dev.json                 |    2 +-
 .../reporting-security-issues_dev.html             |    6 +-
 .../reporting-security-issues_dev.json             |    2 +-
 .../software-donation-guide_dev.html               |    8 +-
 .../software-donation-guide_dev.json               |    2 +-
 .../contributor-guide/test-coverage-guide_dev.html |    6 +-
 .../contributor-guide/test-coverage-guide_dev.json |    2 +-
 en-us/docs/developers/developers_dev.html          |   67 +-
 en-us/docs/developers/developers_dev.json          |    2 +-
 en-us/docs/developers/faq.html                     |   54 -
 en-us/docs/developers/faq.json                     |    6 -
 en-us/docs/developers/guide_dev.html               |   22 +-
 en-us/docs/developers/guide_dev.json               |    2 +-
 en-us/docs/developers/user-guide/faq_dev.html      |    8 +-
 en-us/docs/developers/user-guide/faq_dev.json      |    2 +-
 en-us/docs/user/README.html                        |    4 +-
 en-us/docs/user/SUMMARY.html                       |    6 +-
 en-us/docs/user/SUMMARY.json                       |    2 +-
 en-us/docs/user/benchmark-tool.html                |   10 +-
 en-us/docs/user/benchmark-tool.json                |    2 +-
 en-us/docs/user/best-practice.html                 |    4 +-
 en-us/docs/user/capacity-plan.html                 |    4 +-
 en-us/docs/user/configuration/annotation.html      |    4 +-
 en-us/docs/user/configuration/api.html             |    4 +-
 en-us/docs/user/configuration/index.html           |    4 +-
 en-us/docs/user/configuration/properties.html      |    4 +-
 en-us/docs/user/configuration/xml.html             |    6 +-
 en-us/docs/user/configuration/xml.json             |    2 +-
 en-us/docs/user/coveragence.html                   |    6 +-
 en-us/docs/user/coveragence.json                   |    2 +-
 en-us/docs/user/demos/accesslog.html               |    4 +-
 en-us/docs/user/demos/async-call.html              |    4 +-
 en-us/docs/user/demos/attachment.html              |    4 +-
 en-us/docs/user/demos/callback-parameter.html      |    4 +-
 en-us/docs/user/demos/concurrency-control.html     |    4 +-
 en-us/docs/user/demos/config-connections.html      |    4 +-
 en-us/docs/user/demos/config-rule.html             |    4 +-
 en-us/docs/user/demos/context.html                 |    4 +-
 en-us/docs/user/demos/delay-publish.html           |    4 +-
 en-us/docs/user/demos/distributed-transaction.html |    4 +-
 en-us/docs/user/demos/dump.html                    |    4 +-
 en-us/docs/user/demos/echo-service.html            |    4 +-
 en-us/docs/user/demos/events-notify.html           |    4 +-
 en-us/docs/user/demos/explicit-target.html         |    4 +-
 en-us/docs/user/demos/fault-tolerent-strategy.html |    4 +-
 en-us/docs/user/demos/generic-reference.html       |    4 +-
 en-us/docs/user/demos/generic-service.html         |    4 +-
 en-us/docs/user/demos/graceful-shutdown.html       |    4 +-
 en-us/docs/user/demos/group-merger.html            |    6 +-
 en-us/docs/user/demos/group-merger.json            |    2 +-
 en-us/docs/user/demos/hostname-binding.html        |    4 +-
 en-us/docs/user/demos/index.html                   |    4 +-
 en-us/docs/user/demos/introduction.html            |    4 +-
 en-us/docs/user/demos/lazy-connect.html            |    4 +-
 en-us/docs/user/demos/loadbalance.html             |    4 +-
 en-us/docs/user/demos/local-call.html              |    6 +-
 en-us/docs/user/demos/local-call.json              |    2 +-
 en-us/docs/user/demos/local-mock.html              |    4 +-
 en-us/docs/user/demos/local-stub.html              |    4 +-
 en-us/docs/user/demos/logger-strategy.html         |    4 +-
 en-us/docs/user/demos/multi-protocols.html         |    4 +-
 en-us/docs/user/demos/multi-registry.html          |    4 +-
 en-us/docs/user/demos/multi-versions.html          |    4 +-
 en-us/docs/user/demos/netty4.html                  |    4 +-
 en-us/docs/user/demos/parameter-validation.html    |    6 +-
 en-us/docs/user/demos/parameter-validation.json    |    2 +-
 en-us/docs/user/demos/preflight-check.html         |    4 +-
 en-us/docs/user/demos/reference-config-cache.html  |    4 +-
 en-us/docs/user/demos/registry-only.html           |    4 +-
 en-us/docs/user/demos/result-cache.html            |    6 +-
 en-us/docs/user/demos/result-cache.json            |    2 +-
 en-us/docs/user/demos/routing-rule.html            |    4 +-
 en-us/docs/user/demos/serialization.html           |    4 +-
 en-us/docs/user/demos/service-container.html       |    4 +-
 en-us/docs/user/demos/service-downgrade.html       |    4 +-
 en-us/docs/user/demos/service-group.html           |    4 +-
 en-us/docs/user/demos/static-service.html          |    4 +-
 en-us/docs/user/demos/stickiness.html              |    4 +-
 en-us/docs/user/demos/subscribe-only.html          |    4 +-
 en-us/docs/user/demos/thread-model.html            |    4 +-
 en-us/docs/user/demos/token-authorization.html     |    4 +-
 en-us/docs/user/dependencies.html                  |    4 +-
 .../languages/erlang/reference.html}               |   30 +-
 en-us/docs/user/languages/erlang/reference.json    |    6 +
 .../erlang/serialization.html}                     |   49 +-
 .../docs/user/languages/erlang/serialization.json  |    6 +
 .../erlang/service.html}                           |   79 +-
 en-us/docs/user/languages/erlang/service.json      |    6 +
 .../erlang/start.html}                             |   88 +-
 en-us/docs/user/languages/erlang/start.json        |    6 +
 en-us/docs/user/maturity.html                      |  214 +-
 en-us/docs/user/maturity.json                      |    2 +-
 en-us/docs/user/perf-test.html                     |    4 +-
 en-us/docs/user/preface/architecture.html          |    8 +-
 en-us/docs/user/preface/architecture.json          |    2 +-
 en-us/docs/user/preface/background.html            |    4 +-
 en-us/docs/user/preface/index.html                 |    4 +-
 en-us/docs/user/preface/requirements.html          |    6 +-
 en-us/docs/user/preface/requirements.json          |    2 +-
 en-us/docs/user/preface/usage.html                 |    4 +-
 en-us/docs/user/quick-start.html                   |    4 +-
 en-us/docs/user/recommend.html                     |    4 +-
 en-us/docs/user/references/api.html                |    4 +-
 en-us/docs/user/references/maven.html              |    4 +-
 en-us/docs/user/references/protocol/dubbo.html     |    4 +-
 en-us/docs/user/references/protocol/hessian.html   |    4 +-
 en-us/docs/user/references/protocol/http.html      |    4 +-
 .../user/references/protocol/introduction.html     |    4 +-
 en-us/docs/user/references/protocol/memcached.html |    4 +-
 en-us/docs/user/references/protocol/redis.html     |    4 +-
 en-us/docs/user/references/protocol/rest.html      |    4 +-
 en-us/docs/user/references/protocol/rmi.html       |    4 +-
 en-us/docs/user/references/protocol/thrift.html    |    6 +-
 en-us/docs/user/references/protocol/thrift.json    |    2 +-
 .../docs/user/references/protocol/webservice.html  |    4 +-
 en-us/docs/user/references/qos.html                |    4 +-
 .../user/references/registry/introduction.html     |    4 +-
 en-us/docs/user/references/registry/multicast.html |    4 +-
 en-us/docs/user/references/registry/nacos.html     |  111 ++
 en-us/docs/user/references/registry/nacos.json     |    6 +
 en-us/docs/user/references/registry/redis.html     |    4 +-
 en-us/docs/user/references/registry/simple.html    |    4 +-
 en-us/docs/user/references/registry/zookeeper.html |    5 +-
 en-us/docs/user/references/registry/zookeeper.json |    2 +-
 en-us/docs/user/references/telnet.html             |    4 +-
 .../user/references/xml/dubbo-application.html     |    4 +-
 en-us/docs/user/references/xml/dubbo-argument.html |    4 +-
 en-us/docs/user/references/xml/dubbo-consumer.html |    4 +-
 en-us/docs/user/references/xml/dubbo-method.html   |    4 +-
 en-us/docs/user/references/xml/dubbo-module.html   |    4 +-
 en-us/docs/user/references/xml/dubbo-monitor.html  |    4 +-
 .../docs/user/references/xml/dubbo-parameter.html  |    4 +-
 en-us/docs/user/references/xml/dubbo-protocol.html |    4 +-
 en-us/docs/user/references/xml/dubbo-provider.html |    4 +-
 .../docs/user/references/xml/dubbo-reference.html  |    4 +-
 en-us/docs/user/references/xml/dubbo-registry.html |    6 +-
 en-us/docs/user/references/xml/dubbo-registry.json |    2 +-
 en-us/docs/user/references/xml/dubbo-service.html  |    4 +-
 en-us/docs/user/references/xml/introduction.html   |    4 +-
 en-us/docs/user/rest.html                          |    4 +-
 en-us/docs/user/simple-monitor.html                |    4 +-
 en-us/download/index.html                          |   32 -
 en-us/ecology/index.html                           |   32 -
 en-us/index.html                                   |    2 +-
 img/blog/dockerhub-build-rules.png                 |  Bin 0 -> 154981 bytes
 img/configcenter_nacos_model.jpg                   |  Bin 0 -> 78352 bytes
 img/configcenter_zk_model.jpg                      |  Bin 0 -> 189160 bytes
 img/configcenter_zk_properties.jpg                 |  Bin 0 -> 92946 bytes
 img/configcenter_zk_rule.jpg                       |  Bin 0 -> 131167 bytes
 img/configcenter_zk_singleitem.jpg                 |  Bin 0 -> 53837 bytes
 index.html                                         |   33 -
 md_json/blog.json                                  |  714 -------
 md_json/docs.json                                  | 2050 --------------------
 package.json                                       |    7 +-
 site_config/blog.js                                |   21 +
 site_config/community.jsx                          |   60 +-
 site_config/docs.js                                |   60 +-
 site_config/home.jsx                               |   19 +-
 site_config/site.js                                |   16 +-
 src/pages/home/index.jsx                           |    8 +-
 zh-cn/blog/Configuration Conclude.html             |  189 --
 zh-cn/blog/Configuration Conclude.json             |    6 -
 zh-cn/blog/Guides for upgrading to 2.7.x.html      |  342 ----
 zh-cn/blog/Guides for upgrading to 2.7.x.json      |    6 -
 zh-cn/blog/Guides-for-upgrading-to-27x.html        |  342 ----
 zh-cn/blog/Guides-for-upgrading-to-27x.json        |    6 -
 zh-cn/blog/apachecon-na-2018.html                  |    8 +-
 zh-cn/blog/apachecon-na-2018.json                  |    6 +-
 .../blog/build-new-docker-image-in-dockerhub.html  |   73 +
 .../blog/build-new-docker-image-in-dockerhub.json  |   10 +
 zh-cn/blog/download.html                           |   26 +-
 zh-cn/blog/download.json                           |    8 +-
 zh-cn/blog/dubbo-101.html                          |    2 +-
 zh-cn/blog/dubbo-27-features.html                  |    4 +-
 zh-cn/blog/dubbo-27-features.json                  |    2 +-
 zh-cn/blog/dubbo-admin.html                        |    4 +-
 zh-cn/blog/dubbo-admin.json                        |    2 +-
 zh-cn/blog/dubbo-annotation-driven.html            |    2 +-
 zh-cn/blog/dubbo-annotation.html                   |    2 +-
 ...o-basic-usage-dubbo-consumer-configuration.html |    2 +-
 ...o-basic-usage-dubbo-provider-configuration.html |    2 +-
 zh-cn/blog/dubbo-cluster-error-handling.html       |    2 +-
 zh-cn/blog/dubbo-compatible.html                   |    2 +-
 zh-cn/blog/dubbo-context-information.html          |    2 +-
 zh-cn/blog/dubbo-contribue-to-opensource.json      |   10 -
 ...ce.html => dubbo-contribute-to-opensource.html} |   18 +-
 zh-cn/blog/dubbo-contribute-to-opensource.json     |   10 +
 zh-cn/blog/dubbo-copywriting-style.html            |    2 +-
 zh-cn/blog/dubbo-echo-test.html                    |    2 +-
 zh-cn/blog/dubbo-externalized-configuration.html   |    2 +-
 zh-cn/blog/dubbo-fescar.html                       |    2 +-
 zh-cn/blog/dubbo-generic-invoke.html               |    2 +-
 zh-cn/blog/dubbo-gracefully-shutdown.html          |    2 +-
 zh-cn/blog/dubbo-heartbeat-design.html             |    2 +-
 zh-cn/blog/dubbo-integrate-with-hystrix.html       |    6 +-
 zh-cn/blog/dubbo-integrate-with-hystrix.json       |    2 +-
 zh-cn/blog/dubbo-invoke.html                       |    2 +-
 zh-cn/blog/dubbo-k8s.html                          |    2 +-
 zh-cn/blog/dubbo-loadbalance.html                  |    2 +-
 zh-cn/blog/dubbo-local-call.html                   |    4 +-
 zh-cn/blog/dubbo-local-call.json                   |    2 +-
 zh-cn/blog/dubbo-meet-arthas.html                  |    6 +-
 zh-cn/blog/dubbo-meet-arthas.json                  |    2 +-
 zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.html |    2 +-
 zh-cn/blog/dubbo-meetup-chengdu.html               |    2 +-
 zh-cn/blog/dubbo-meetup-hangzhou.html              |    2 +-
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.html  |    2 +-
 zh-cn/blog/dubbo-meetup-shenzhen.html              |    2 +-
 zh-cn/blog/dubbo-mesh-in-thinking.html             |    2 +-
 zh-cn/blog/dubbo-mesh-service-mesh-exploring.html  |    2 +-
 zh-cn/blog/dubbo-network-interfaces.html           |  406 ++++
 zh-cn/blog/dubbo-network-interfaces.json           |   10 +
 zh-cn/blog/dubbo-new-async.html                    |    8 +-
 zh-cn/blog/dubbo-new-async.json                    |    2 +-
 zh-cn/blog/dubbo-protocol.html                     |    2 +-
 zh-cn/blog/dubbo-registry-nacos-integration.html   |   12 +-
 zh-cn/blog/dubbo-registry-nacos-integration.json   |    2 +-
 zh-cn/blog/dubbo-rest.html                         |    2 +-
 zh-cn/blog/dubbo-stub-mock.html                    |    8 +-
 zh-cn/blog/dubbo-stub-mock.json                    |    2 +-
 zh-cn/blog/dubbo-zk.html                           |    2 +-
 zh-cn/blog/dubbo2-js.html                          |    4 +-
 zh-cn/blog/dubbo2-js.json                          |    2 +-
 zh-cn/blog/dubboAsync_client.html                  |    2 +-
 zh-cn/blog/dubboAsync_server.html                  |    2 +-
 zh-cn/blog/first-dubbo-filter.html                 |    2 +-
 zh-cn/blog/gsoc-2018.html                          |   34 +
 zh-cn/blog/gsoc-2018.json                          |   10 +
 zh-cn/blog/how-to-involve-dubbo-community.html     |   12 +-
 zh-cn/blog/how-to-involve-dubbo-community.json     |    2 +-
 zh-cn/blog/index.html                              |    2 +-
 zh-cn/blog/introduction-to-dubbo-qos.html          |    2 +-
 zh-cn/blog/introduction-to-dubbo-spi-2.html        |    2 +-
 zh-cn/blog/introduction-to-dubbo-spi.html          |    2 +-
 zh-cn/blog/introduction-to-dubbo-url.html          |    4 +-
 zh-cn/blog/introduction-to-dubbo-url.json          |    2 +-
 zh-cn/blog/meet-dubbo.html                         |    2 +-
 zh-cn/blog/optimization-branch-prediction.html     |    4 +-
 zh-cn/blog/optimization-branch-prediction.json     |    2 +-
 zh-cn/blog/pinpoint.html                           |    2 +-
 zh-cn/blog/prepare-an-apache-release.html          |   50 +-
 zh-cn/blog/prepare-an-apache-release.json          |    5 +-
 zh-cn/blog/qcon-beijing-2018.html                  |    8 +-
 zh-cn/blog/qcon-beijing-2018.json                  |    6 +-
 zh-cn/blog/sentinel-introduction-for-dubbo.html    |    4 +-
 zh-cn/blog/sentinel-introduction-for-dubbo.json    |    2 +-
 zh-cn/blog/service-and-version.html                |    2 +-
 zh-cn/blog/service-test.html                       |    2 +-
 .../spring-boot-dubbo-start-stop-analysis.html     |   12 +-
 .../spring-boot-dubbo-start-stop-analysis.json     |    4 +-
 zh-cn/blog/test-verification.html                  |    2 +-
 zh-cn/blog/tracing-with-skywalking.html            |    2 +-
 zh-cn/blog/use-zipkin-in-dubbo.html                |    2 +-
 zh-cn/community/index.html                         |    2 +-
 zh-cn/docs/admin/README.html                       |    4 +-
 zh-cn/docs/admin/SUMMARY.html                      |    4 +-
 zh-cn/docs/admin/install/admin-console.html        |    8 +-
 zh-cn/docs/admin/install/admin-console.json        |    2 +-
 zh-cn/docs/admin/install/consumer-demo.html        |    8 +-
 zh-cn/docs/admin/install/consumer-demo.json        |    2 +-
 zh-cn/docs/admin/install/introduction.html         |    4 +-
 zh-cn/docs/admin/install/provider-demo.html        |    8 +-
 zh-cn/docs/admin/install/provider-demo.json        |    2 +-
 zh-cn/docs/admin/install/redis.html                |    4 +-
 .../docs/admin/install/simple-monitor-center.html  |    4 +-
 .../docs/admin/install/simple-registry-center.html |    4 +-
 zh-cn/docs/admin/install/zookeeper.html            |    4 +-
 zh-cn/docs/admin/introduction.html                 |   10 +-
 zh-cn/docs/admin/introduction.json                 |    2 +-
 zh-cn/docs/admin/ops/dubbo-ops.html                |    4 +-
 zh-cn/docs/admin/ops/introduction.html             |    4 +-
 zh-cn/docs/admin/ops/pinpoint.html                 |    4 +-
 zh-cn/docs/admin/ops/skywalking.html               |    4 +-
 zh-cn/docs/admin/serviceGovernance.html            |    4 +-
 zh-cn/docs/admin/serviceSearch.html                |    4 +-
 zh-cn/docs/admin/serviceTest.html                  |    4 +-
 zh-cn/docs/dev/README.html                         |    4 +-
 zh-cn/docs/dev/SPI.html                            |    4 +-
 zh-cn/docs/dev/SUMMARY.html                        |    5 +-
 zh-cn/docs/dev/SUMMARY.json                        |    2 +-
 zh-cn/docs/dev/TCK.html                            |    4 +-
 zh-cn/docs/dev/build.html                          |   10 +-
 zh-cn/docs/dev/build.json                          |    2 +-
 zh-cn/docs/dev/checklist.html                      |    4 +-
 zh-cn/docs/dev/code-smell.html                     |    4 +-
 zh-cn/docs/dev/coding.html                         |    4 +-
 zh-cn/docs/dev/contract.html                       |    4 +-
 zh-cn/docs/dev/contribution.html                   |    4 +-
 zh-cn/docs/dev/design.html                         |    4 +-
 zh-cn/docs/dev/implementation.html                 |    4 +-
 zh-cn/docs/dev/impls/cache.html                    |    4 +-
 zh-cn/docs/dev/impls/cluster.html                  |    4 +-
 zh-cn/docs/dev/impls/compiler.html                 |    4 +-
 zh-cn/docs/dev/impls/config-center.html            |  116 ++
 zh-cn/docs/dev/impls/config-center.json            |    6 +
 zh-cn/docs/dev/impls/container.html                |    4 +-
 zh-cn/docs/dev/impls/dispatcher.html               |    4 +-
 zh-cn/docs/dev/impls/exchanger.html                |    4 +-
 zh-cn/docs/dev/impls/exporter-listener.html        |    4 +-
 zh-cn/docs/dev/impls/extension-factory.html        |    4 +-
 zh-cn/docs/dev/impls/filter.html                   |    4 +-
 zh-cn/docs/dev/impls/introduction.html             |    4 +-
 zh-cn/docs/dev/impls/invoker-listener.html         |    4 +-
 zh-cn/docs/dev/impls/load-balance.html             |    4 +-
 zh-cn/docs/dev/impls/logger-adapter.html           |    4 +-
 zh-cn/docs/dev/impls/merger.html                   |    4 +-
 zh-cn/docs/dev/impls/monitor.html                  |    4 +-
 zh-cn/docs/dev/impls/networker.html                |    4 +-
 zh-cn/docs/dev/impls/page.html                     |    4 +-
 zh-cn/docs/dev/impls/protocol.html                 |   14 +-
 zh-cn/docs/dev/impls/protocol.json                 |    2 +-
 zh-cn/docs/dev/impls/proxy-factory.html            |    4 +-
 zh-cn/docs/dev/impls/registry.html                 |    4 +-
 zh-cn/docs/dev/impls/remoting.html                 |    4 +-
 zh-cn/docs/dev/impls/router.html                   |    4 +-
 zh-cn/docs/dev/impls/serialize.html                |    4 +-
 zh-cn/docs/dev/impls/status-checker.html           |    4 +-
 zh-cn/docs/dev/impls/telnet-handler.html           |    4 +-
 zh-cn/docs/dev/impls/threadpool.html               |    4 +-
 zh-cn/docs/dev/impls/validation.html               |    4 +-
 zh-cn/docs/dev/introduction.html                   |    4 +-
 zh-cn/docs/dev/principals/code-detail.html         |    4 +-
 zh-cn/docs/dev/principals/configuration.html       |    4 +-
 zh-cn/docs/dev/principals/dummy.html               |    4 +-
 zh-cn/docs/dev/principals/expansibility.html       |    4 +-
 zh-cn/docs/dev/principals/extension.html           |    4 +-
 zh-cn/docs/dev/principals/general-knowledge.html   |    4 +-
 zh-cn/docs/dev/principals/introduction.html        |    4 +-
 zh-cn/docs/dev/principals/robustness.html          |    4 +-
 zh-cn/docs/dev/release.html                        |    4 +-
 .../committer-guide/apache-dubbo-page_dev.html     |   16 +-
 .../committer-guide/apache-dubbo-page_dev.json     |    2 +-
 .../committer-guide/label-an-issue-guide_dev.html  |    4 +-
 .../committer-guide/new-committer-guide_dev.html   |    4 +-
 .../developers/committer-guide/release-guide.html  |   34 -
 .../developers/committer-guide/release-guide.json  |    6 -
 .../committer-guide/release-guide_dev.html         |  156 +-
 .../committer-guide/release-guide_dev.json         |    2 +-
 .../committer-guide/website-guide_dev.html         |    6 +-
 .../committer-guide/website-guide_dev.json         |    2 +-
 .../contributor-guide/become-a-committer_dev.html  |    4 +-
 .../contributor-guide/cla-signing-guide_dev.html   |    4 +-
 .../dubbo-extension-guide_dev.html                 |    6 +-
 .../dubbo-extension-guide_dev.json                 |    2 +-
 .../mailing-list-subscription-guide_dev.html       |   14 +-
 .../mailing-list-subscription-guide_dev.json       |    2 +-
 .../new-contributor-guide_dev.html                 |   18 +-
 .../new-contributor-guide_dev.json                 |    2 +-
 .../reporting-security-issues_dev.html             |    6 +-
 .../reporting-security-issues_dev.json             |    2 +-
 .../software-donation-guide_dev.html               |    8 +-
 .../software-donation-guide_dev.json               |    2 +-
 .../contributor-guide/test-coverage-guide_dev.html |    6 +-
 .../contributor-guide/test-coverage-guide_dev.json |    2 +-
 zh-cn/docs/developers/developers_dev.html          |   67 +-
 zh-cn/docs/developers/developers_dev.json          |    2 +-
 zh-cn/docs/developers/guide_dev.html               |   22 +-
 zh-cn/docs/developers/guide_dev.json               |    2 +-
 zh-cn/docs/developers/user-guide/faq_dev.html      |    8 +-
 zh-cn/docs/developers/user-guide/faq_dev.json      |    2 +-
 .../docs/source_code_guide/adaptive-extension.html |    4 +-
 zh-cn/docs/source_code_guide/cluster.html          |    4 +-
 zh-cn/docs/source_code_guide/directory.html        |    4 +-
 zh-cn/docs/source_code_guide/dubbo-spi.html        |    4 +-
 zh-cn/docs/source_code_guide/export-service.html   |    6 +-
 zh-cn/docs/source_code_guide/export-service.json   |    2 +-
 zh-cn/docs/source_code_guide/loadbalance.html      |    8 +-
 zh-cn/docs/source_code_guide/loadbalance.json      |    2 +-
 zh-cn/docs/source_code_guide/refer-service.html    |    8 +-
 zh-cn/docs/source_code_guide/refer-service.json    |    2 +-
 zh-cn/docs/source_code_guide/router.html           |    4 +-
 .../service-invoking-process.html                  |    4 +-
 zh-cn/docs/user/README.html                        |    4 +-
 zh-cn/docs/user/SUMMARY.html                       |    5 +-
 zh-cn/docs/user/SUMMARY.json                       |    2 +-
 zh-cn/docs/user/benchmark-tool.html                |   10 +-
 zh-cn/docs/user/benchmark-tool.json                |    2 +-
 zh-cn/docs/user/best-practice.html                 |    4 +-
 zh-cn/docs/user/capacity-plan.html                 |    4 +-
 zh-cn/docs/user/configuration/annotation.html      |    6 +-
 zh-cn/docs/user/configuration/annotation.json      |    2 +-
 zh-cn/docs/user/configuration/api.html             |    4 +-
 zh-cn/docs/user/configuration/config-center.html   |    8 +-
 zh-cn/docs/user/configuration/config-center.json   |    2 +-
 .../configuration/configuration-load-process.html  |   12 +-
 .../configuration/configuration-load-process.json  |    2 +-
 .../user/configuration/environment-variables.html  |   58 +
 .../user/configuration/environment-variables.json  |    6 +
 zh-cn/docs/user/configuration/index.html           |    4 +-
 .../user/configuration/properties deprecated.html  |   65 -
 .../user/configuration/properties deprecated.json  |    6 -
 .../user/configuration/properties-deprecated.html  |    4 +-
 zh-cn/docs/user/configuration/properties.html      |   65 -
 zh-cn/docs/user/configuration/properties.json      |    6 -
 zh-cn/docs/user/configuration/xml.html             |    6 +-
 zh-cn/docs/user/configuration/xml.json             |    2 +-
 zh-cn/docs/user/coveragence.html                   |    6 +-
 zh-cn/docs/user/coveragence.json                   |    2 +-
 zh-cn/docs/user/demos/accesslog.html               |    4 +-
 zh-cn/docs/user/demos/async-call-deprecated.html   |    4 +-
 zh-cn/docs/user/demos/async-call.html              |    4 +-
 .../docs/user/demos/async-execute-on-provider.html |    4 +-
 zh-cn/docs/user/demos/attachment.html              |    4 +-
 zh-cn/docs/user/demos/callback-parameter.html      |    4 +-
 zh-cn/docs/user/demos/concurrency-control.html     |    4 +-
 zh-cn/docs/user/demos/config-connections.html      |    4 +-
 zh-cn/docs/user/demos/config-rule-deprecated.html  |    4 +-
 zh-cn/docs/user/demos/config-rule.html             |   12 +-
 zh-cn/docs/user/demos/config-rule.json             |    2 +-
 zh-cn/docs/user/demos/context.html                 |    4 +-
 zh-cn/docs/user/demos/delay-publish.html           |    4 +-
 zh-cn/docs/user/demos/distributed-transaction.html |    4 +-
 zh-cn/docs/user/demos/dump.html                    |    4 +-
 zh-cn/docs/user/demos/echo-service.html            |    4 +-
 zh-cn/docs/user/demos/events-notify.html           |    4 +-
 zh-cn/docs/user/demos/explicit-target.html         |    4 +-
 zh-cn/docs/user/demos/fault-tolerent-strategy.html |    4 +-
 zh-cn/docs/user/demos/generic-reference.html       |    4 +-
 zh-cn/docs/user/demos/generic-service.html         |    4 +-
 zh-cn/docs/user/demos/graceful-shutdown.html       |    4 +-
 zh-cn/docs/user/demos/group-merger.html            |    4 +-
 zh-cn/docs/user/demos/hostname-binding.html        |    4 +-
 zh-cn/docs/user/demos/index.html                   |    4 +-
 zh-cn/docs/user/demos/introduction.html            |    4 +-
 zh-cn/docs/user/demos/lazy-connect.html            |    4 +-
 zh-cn/docs/user/demos/loadbalance.html             |    4 +-
 zh-cn/docs/user/demos/local-call.html              |    4 +-
 zh-cn/docs/user/demos/local-mock.html              |    4 +-
 zh-cn/docs/user/demos/local-stub.html              |    4 +-
 zh-cn/docs/user/demos/logger-strategy.html         |    4 +-
 zh-cn/docs/user/demos/metadata-report.html         |  328 ----
 zh-cn/docs/user/demos/metadata-report.json         |    6 -
 zh-cn/docs/user/demos/multi-protocols.html         |    4 +-
 zh-cn/docs/user/demos/multi-registry.html          |    4 +-
 zh-cn/docs/user/demos/multi-versions.html          |    4 +-
 zh-cn/docs/user/demos/netty4.html                  |    4 +-
 zh-cn/docs/user/demos/parameter-validation.html    |    6 +-
 zh-cn/docs/user/demos/parameter-validation.json    |    2 +-
 zh-cn/docs/user/demos/preflight-check.html         |    4 +-
 zh-cn/docs/user/demos/reference-config-cache.html  |    4 +-
 zh-cn/docs/user/demos/registry-only.html           |    4 +-
 zh-cn/docs/user/demos/result-cache.html            |    6 +-
 zh-cn/docs/user/demos/result-cache.json            |    2 +-
 zh-cn/docs/user/demos/routing-rule deprecated.html |  207 --
 zh-cn/docs/user/demos/routing-rule deprecated.json |    6 -
 zh-cn/docs/user/demos/routing-rule-deprecated.html |    4 +-
 zh-cn/docs/user/demos/routing-rule.html            |    8 +-
 zh-cn/docs/user/demos/routing-rule.json            |    2 +-
 zh-cn/docs/user/demos/serialization.html           |    4 +-
 zh-cn/docs/user/demos/service-container.html       |    4 +-
 zh-cn/docs/user/demos/service-downgrade.html       |    4 +-
 zh-cn/docs/user/demos/service-group.html           |    4 +-
 zh-cn/docs/user/demos/set-host.html                |    6 +-
 zh-cn/docs/user/demos/set-host.json                |    2 +-
 zh-cn/docs/user/demos/simplify-registry-data.html  |    4 +-
 zh-cn/docs/user/demos/static-service.html          |    4 +-
 zh-cn/docs/user/demos/stickiness.html              |    4 +-
 zh-cn/docs/user/demos/subscribe-only.html          |    4 +-
 zh-cn/docs/user/demos/thread-model.html            |    4 +-
 zh-cn/docs/user/demos/token-authorization.html     |   12 +-
 zh-cn/docs/user/demos/token-authorization.json     |    2 +-
 zh-cn/docs/user/dependencies.html                  |    4 +-
 zh-cn/docs/user/languages/erlang/reference.html    |   45 +
 zh-cn/docs/user/languages/erlang/reference.json    |    6 +
 .../docs/user/languages/erlang/serialization.html  |   60 +
 .../docs/user/languages/erlang/serialization.json  |    6 +
 zh-cn/docs/user/languages/erlang/service.html      |   75 +
 zh-cn/docs/user/languages/erlang/service.json      |    6 +
 zh-cn/docs/user/languages/erlang/start.html        |   77 +
 zh-cn/docs/user/languages/erlang/start.json        |    6 +
 zh-cn/docs/user/maturity.html                      |  166 +-
 zh-cn/docs/user/maturity.json                      |    2 +-
 zh-cn/docs/user/perf-test.html                     |    4 +-
 zh-cn/docs/user/preface/architecture.html          |    4 +-
 zh-cn/docs/user/preface/background.html            |    4 +-
 zh-cn/docs/user/preface/index.html                 |    4 +-
 zh-cn/docs/user/preface/requirements.html          |    4 +-
 zh-cn/docs/user/preface/usage.html                 |    4 +-
 zh-cn/docs/user/quick-start.html                   |    4 +-
 zh-cn/docs/user/recommend.html                     |    6 +-
 zh-cn/docs/user/recommend.json                     |    2 +-
 zh-cn/docs/user/references/api.html                |    4 +-
 zh-cn/docs/user/references/maven.html              |    4 +-
 .../user/references/metadata/introduction.html     |    6 +-
 .../user/references/metadata/introduction.json     |    2 +-
 .../user/references/metadata/metadata-redis.html   |    4 +-
 .../references/metadata/metadata-zookeeper.html    |    4 +-
 zh-cn/docs/user/references/protocol/dubbo.html     |    4 +-
 zh-cn/docs/user/references/protocol/hessian.html   |    4 +-
 zh-cn/docs/user/references/protocol/http.html      |    4 +-
 .../user/references/protocol/introduction.html     |    4 +-
 zh-cn/docs/user/references/protocol/memcached.html |    4 +-
 zh-cn/docs/user/references/protocol/redis.html     |    4 +-
 zh-cn/docs/user/references/protocol/rest.html      |   32 +-
 zh-cn/docs/user/references/protocol/rest.json      |    2 +-
 zh-cn/docs/user/references/protocol/rmi.html       |    4 +-
 zh-cn/docs/user/references/protocol/thrift.html    |    6 +-
 zh-cn/docs/user/references/protocol/thrift.json    |    2 +-
 .../docs/user/references/protocol/webservice.html  |    4 +-
 zh-cn/docs/user/references/qos.html                |    4 +-
 .../user/references/registry/introduction.html     |    4 +-
 zh-cn/docs/user/references/registry/multicast.html |    4 +-
 zh-cn/docs/user/references/registry/nacos.html     |  111 ++
 zh-cn/docs/user/references/registry/nacos.json     |    6 +
 zh-cn/docs/user/references/registry/redis.html     |    4 +-
 zh-cn/docs/user/references/registry/simple.html    |    4 +-
 zh-cn/docs/user/references/registry/zookeeper.html |    5 +-
 zh-cn/docs/user/references/registry/zookeeper.json |    2 +-
 zh-cn/docs/user/references/telnet.html             |    4 +-
 .../user/references/xml/dubbo-application.html     |    4 +-
 zh-cn/docs/user/references/xml/dubbo-argument.html |    4 +-
 .../user/references/xml/dubbo-config-center.html   |    4 +-
 zh-cn/docs/user/references/xml/dubbo-consumer.html |    4 +-
 zh-cn/docs/user/references/xml/dubbo-method.html   |    4 +-
 zh-cn/docs/user/references/xml/dubbo-module.html   |    4 +-
 zh-cn/docs/user/references/xml/dubbo-monitor.html  |    4 +-
 .../docs/user/references/xml/dubbo-parameter.html  |    4 +-
 zh-cn/docs/user/references/xml/dubbo-protocol.html |    4 +-
 zh-cn/docs/user/references/xml/dubbo-provider.html |    4 +-
 .../docs/user/references/xml/dubbo-reference.html  |    4 +-
 zh-cn/docs/user/references/xml/dubbo-registry.html |    6 +-
 zh-cn/docs/user/references/xml/dubbo-registry.json |    2 +-
 zh-cn/docs/user/references/xml/dubbo-service.html  |    4 +-
 zh-cn/docs/user/references/xml/introduction.html   |    4 +-
 zh-cn/docs/user/rest.html                          |    4 +-
 zh-cn/docs/user/serialization.html                 |    4 +-
 zh-cn/docs/user/simple-monitor.html                |    4 +-
 zh-cn/docs/user/version-upgrading.html             |   38 -
 zh-cn/docs/user/version-upgrading.json             |    6 -
 zh-cn/docs/user/versions/index.html                |    4 +-
 zh-cn/docs/user/versions/version-270.html          |    8 +-
 zh-cn/docs/user/versions/version-270.json          |    2 +-
 zh-cn/docs/user/versions/version-upgrading.html    |   38 -
 zh-cn/docs/user/versions/version-upgrading.json    |    6 -
 zh-cn/download/index.html                          |   32 -
 zh-cn/ecology/index.html                           |   32 -
 zh-cn/index.html                                   |    2 +-
 814 files changed, 5138 insertions(+), 7425 deletions(-)
 create mode 100644 blog/zh-cn/build-new-docker-image-in-dockerhub.md
 rename blog/zh-cn/{dubbo-contribue-to-opensource.md => dubbo-contribute-to-opensource.md} (88%)
 create mode 100644 blog/zh-cn/dubbo-network-interfaces.md
 create mode 100644 blog/zh-cn/gsoc-2018.md
 delete mode 100644 build/TXD_D-Medium.eot
 delete mode 100644 build/TXD_D-Medium.ttf
 delete mode 100644 build/TXD_D-Medium.woff
 delete mode 100644 build/TXD_D-Regular.eot
 delete mode 100644 build/TXD_D-Regular.ttf
 delete mode 100644 build/TXD_D-Regular.woff
 delete mode 100644 build/blog.css
 delete mode 100644 build/blog.js
 delete mode 100644 build/blogDetail.css
 delete mode 100644 build/blogDetail.js
 delete mode 100644 build/community.css
 delete mode 100644 build/community.js
 delete mode 100644 build/documentation.css
 delete mode 100644 build/documentation.js
 delete mode 100644 build/ecology.css
 delete mode 100644 build/ecology.js
 delete mode 100644 build/home.css
 delete mode 100644 build/home.js
 create mode 100644 docs/en-us/user/languages/erlang/reference.md
 create mode 100644 docs/en-us/user/languages/erlang/serialization.md
 create mode 100644 docs/en-us/user/languages/erlang/service.md
 create mode 100644 docs/en-us/user/languages/erlang/start.md
 create mode 100644 docs/en-us/user/references/registry/nacos.md
 create mode 100644 docs/zh-cn/dev/impls/config-center.md
 create mode 100644 docs/zh-cn/user/configuration/environment-variables.md
 create mode 100644 docs/zh-cn/user/languages/erlang/reference.md
 create mode 100644 docs/zh-cn/user/languages/erlang/serialization.md
 create mode 100644 docs/zh-cn/user/languages/erlang/service.md
 create mode 100644 docs/zh-cn/user/languages/erlang/start.md
 create mode 100644 docs/zh-cn/user/references/registry/nacos.md
 delete mode 100644 en-us/docs/admin/ops/skywalking.md
 delete mode 100644 en-us/docs/developers/committer-guide/release-guide.html
 delete mode 100644 en-us/docs/developers/committer-guide/release-guide.json
 delete mode 100644 en-us/docs/developers/faq.html
 delete mode 100644 en-us/docs/developers/faq.json
 copy en-us/docs/{admin/install/provider-demo.html => user/languages/erlang/reference.html} (61%)
 create mode 100644 en-us/docs/user/languages/erlang/reference.json
 copy en-us/docs/user/{references/xml/dubbo-monitor.html => languages/erlang/serialization.html} (61%)
 create mode 100644 en-us/docs/user/languages/erlang/serialization.json
 copy en-us/docs/user/{references/xml/dubbo-module.html => languages/erlang/service.html} (60%)
 create mode 100644 en-us/docs/user/languages/erlang/service.json
 copy en-us/docs/user/{demos/service-container.html => languages/erlang/start.html} (56%)
 create mode 100644 en-us/docs/user/languages/erlang/start.json
 create mode 100644 en-us/docs/user/references/registry/nacos.html
 create mode 100644 en-us/docs/user/references/registry/nacos.json
 delete mode 100644 en-us/download/index.html
 delete mode 100644 en-us/ecology/index.html
 create mode 100644 img/blog/dockerhub-build-rules.png
 create mode 100644 img/configcenter_nacos_model.jpg
 create mode 100644 img/configcenter_zk_model.jpg
 create mode 100644 img/configcenter_zk_properties.jpg
 create mode 100644 img/configcenter_zk_rule.jpg
 create mode 100644 img/configcenter_zk_singleitem.jpg
 delete mode 100644 index.html
 delete mode 100644 md_json/blog.json
 delete mode 100644 md_json/docs.json
 delete mode 100644 zh-cn/blog/Configuration Conclude.html
 delete mode 100644 zh-cn/blog/Configuration Conclude.json
 delete mode 100644 zh-cn/blog/Guides for upgrading to 2.7.x.html
 delete mode 100644 zh-cn/blog/Guides for upgrading to 2.7.x.json
 delete mode 100644 zh-cn/blog/Guides-for-upgrading-to-27x.html
 delete mode 100644 zh-cn/blog/Guides-for-upgrading-to-27x.json
 create mode 100644 zh-cn/blog/build-new-docker-image-in-dockerhub.html
 create mode 100644 zh-cn/blog/build-new-docker-image-in-dockerhub.json
 delete mode 100644 zh-cn/blog/dubbo-contribue-to-opensource.json
 rename zh-cn/blog/{dubbo-contribue-to-opensource.html => dubbo-contribute-to-opensource.html} (81%)
 create mode 100644 zh-cn/blog/dubbo-contribute-to-opensource.json
 create mode 100644 zh-cn/blog/dubbo-network-interfaces.html
 create mode 100644 zh-cn/blog/dubbo-network-interfaces.json
 create mode 100644 zh-cn/blog/gsoc-2018.html
 create mode 100644 zh-cn/blog/gsoc-2018.json
 create mode 100644 zh-cn/docs/dev/impls/config-center.html
 create mode 100644 zh-cn/docs/dev/impls/config-center.json
 delete mode 100644 zh-cn/docs/developers/committer-guide/release-guide.html
 delete mode 100644 zh-cn/docs/developers/committer-guide/release-guide.json
 create mode 100644 zh-cn/docs/user/configuration/environment-variables.html
 create mode 100644 zh-cn/docs/user/configuration/environment-variables.json
 delete mode 100644 zh-cn/docs/user/configuration/properties deprecated.html
 delete mode 100644 zh-cn/docs/user/configuration/properties deprecated.json
 delete mode 100644 zh-cn/docs/user/configuration/properties.html
 delete mode 100644 zh-cn/docs/user/configuration/properties.json
 delete mode 100644 zh-cn/docs/user/demos/metadata-report.html
 delete mode 100644 zh-cn/docs/user/demos/metadata-report.json
 delete mode 100644 zh-cn/docs/user/demos/routing-rule deprecated.html
 delete mode 100644 zh-cn/docs/user/demos/routing-rule deprecated.json
 create mode 100644 zh-cn/docs/user/languages/erlang/reference.html
 create mode 100644 zh-cn/docs/user/languages/erlang/reference.json
 create mode 100644 zh-cn/docs/user/languages/erlang/serialization.html
 create mode 100644 zh-cn/docs/user/languages/erlang/serialization.json
 create mode 100644 zh-cn/docs/user/languages/erlang/service.html
 create mode 100644 zh-cn/docs/user/languages/erlang/service.json
 create mode 100644 zh-cn/docs/user/languages/erlang/start.html
 create mode 100644 zh-cn/docs/user/languages/erlang/start.json
 create mode 100644 zh-cn/docs/user/references/registry/nacos.html
 create mode 100644 zh-cn/docs/user/references/registry/nacos.json
 delete mode 100644 zh-cn/docs/user/version-upgrading.html
 delete mode 100644 zh-cn/docs/user/version-upgrading.json
 delete mode 100644 zh-cn/docs/user/versions/version-upgrading.html
 delete mode 100644 zh-cn/docs/user/versions/version-upgrading.json
 delete mode 100644 zh-cn/download/index.html
 delete mode 100644 zh-cn/ecology/index.html


[dubbo-website] 03/03: delete static files

Posted by wa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wangxin pushed a commit to branch ecology-page
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git

commit e592751f62e557d8d1ab842dea3c9a7b83bd7107
Author: Xin Wang <xi...@gmail.com>
AuthorDate: Tue Aug 13 21:40:44 2019 +0800

    delete static files
---
 index.html        |   33 -
 md_json/blog.json |  771 --------------------
 md_json/docs.json | 2110 -----------------------------------------------------
 3 files changed, 2914 deletions(-)

diff --git a/index.html b/index.html
deleted file mode 100644
index 9dd7634..0000000
--- a/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-	<meta charset="UTF-8">
-</head>
-<body>
-  <!-- 添加Apache校验项开始 -->
-  <!-- 只加a标签和img标签,不要有其余的标签出现,同时设置style="display: none" -->
-  <a style="display: none" href="http://www.apache.org/events/current-event">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 comp [...]
-  <img style="display: none" src="http://dubbo.apache.org/img/apache_logo.png"/>
-  <ul style="display: none">
-    <p class="header">ASF</p>
-    <li><a href="http://www.apache.org">Foundation</a></li>
-    <li><a href="http://www.apache.org/licenses/">License</a></li>
-    <li><a href="http://www.apache.org/events/current-event">Events</a></li>
-    <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
-    <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
-  </ul>
-  <p style="display: none">Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
-  <a style="display: none" href="http://www.apache.org/security/">Security</a>
-  <!-- 添加Apache校验项结束 -->
-  <script src="//cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
-	<script>
-    window.rootPath = '';
-    window.defaultLanguage = 'en-us';
-    var lang = Cookies.get('docsite_language');
-    if (!lang) {
-      lang = 'en-us';
-    }
-    window.location = window.rootPath + '/' + lang;
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/md_json/blog.json b/md_json/blog.json
deleted file mode 100644
index 6cfad96..0000000
--- a/md_json/blog.json
+++ /dev/null
@@ -1,771 +0,0 @@
-{
-  "en-us": [
-    {
-      "filename": "apachecon-na-2018.md",
-      "link": "/en-us/blog/apachecon-na-2018.html",
-      "meta": {
-        "title": "The ApacheCon NA schedule has been announced",
-        "keywords": "Dubbo, ApacheCon NA",
-        "description": "This article will introduce you that the ApacheCon NA schedule has been announced attention."
-      }
-    },
-    {
-      "filename": "download.md",
-      "link": "/en-us/blog/download.html",
-      "meta": {
-        "title": "Downloads",
-        "keywords": "Dubbo, Downloads, Version",
-        "description": "This article will introduce you how to understand the details of each version and upgrade matters needing attention."
-      }
-    },
-    {
-      "filename": "dubbo-101.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-annotation.md",
-      "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`."
-      }
-    },
-    {
-      "filename": "dubbo-basic-usage-dubbo-provider-configuration.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-fescar.md",
-      "link": "/en-us/blog/dubbo-fescar.html",
-      "meta": {
-        "title": "How to use Fescar to ensure consistency between Dubbo Microservices",
-        "keywords": "Dubbo,Fescar,Consistency",
-        "description": "This article will introduce you how to use Fescar to ensure consistency between Dubbo Microservices."
-      }
-    },
-    {
-      "filename": "dubbo-generic-invoke.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-invoke.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-k8s.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-loadbalance.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-meetup-beijing-may-12th-2018.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-meetup-chengdu.md",
-      "link": "/en-us/blog/dubbo-meetup-chengdu.html",
-      "meta": {
-        "title": "The fourth Dubbo meetup has been held in Chengdu",
-        "keywords": "Dubbo, Chengdu, meetup",
-        "description": "The fourth Dubbo meetup has been held in Chengdu."
-      }
-    },
-    {
-      "filename": "dubbo-meetup-hangzhou.md",
-      "link": "/en-us/blog/dubbo-meetup-hangzhou.html",
-      "meta": {
-        "title": "The fifth Dubbo meetup has been held in Hangzhou",
-        "keywords": "Dubbo, Hangzhou, meetup",
-        "description": "The fifth Dubbo meetup has been held in Hangzhou"
-      }
-    },
-    {
-      "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
-      "link": "/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
-      "meta": {
-        "title": "The second Dubbo Shanghai meetup has been held successfully",
-        "keywords": "Dubbo, Shanghai, meetup",
-        "description": "The second Dubbo Shanghai meetup has been held successfully."
-      }
-    },
-    {
-      "filename": "dubbo-meetup-shenzhen.md",
-      "link": "/en-us/blog/dubbo-meetup-shenzhen.html",
-      "meta": {
-        "title": "The third Dubbo meetup has been held in Shenzhen",
-        "keywords": "Dubbo, Shenzhen, meetup",
-        "description": "The third Dubbo meetup has been held in Shenzhen"
-      }
-    },
-    {
-      "filename": "dubbo-new-async.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo-zk.md",
-      "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."
-      }
-    },
-    {
-      "filename": "dubbo2-js.md",
-      "link": "/en-us/blog/dubbo2-js.html",
-      "meta": {
-        "title": "Implementation of cross-language calls by Dubbo2.js",
-        "keywords": "Dubbo, Cross-language, Node, NodeJS, js",
-        "description": "This article introduces how to use Dubbo.js to implement cross-language calls."
-      }
-    },
-    {
-      "filename": "gsoc-2018.md",
-      "link": "/en-us/blog/gsoc-2018.html",
-      "meta": {
-        "title": "GSoC 2018",
-        "keywords": "Dubbo, GSoC",
-        "description": "The GSoC(Google Summer of Code) 2018 projects has been announced"
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-qos.md",
-      "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."
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-spi-2.md",
-      "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."
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-spi.md",
-      "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."
-      }
-    },
-    {
-      "filename": "pinpoint.md",
-      "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."
-      }
-    },
-    {
-      "filename": "prepare-an-apache-release.md",
-      "link": "/en-us/blog/prepare-an-apache-release.html",
-      "meta": {
-        "title": "Understanding the Apache Release Cycle",
-        "keywords": "Dubbo, Apache, Release",
-        "description": "This article introduces how to the Apache publish content and process"
-      }
-    },
-    {
-      "filename": "qcon-beijing-2018.md",
-      "link": "/en-us/blog/qcon-beijing-2018.html",
-      "meta": {
-        "title": "Dubbo roadmap is announced in QCon Beijing 2018",
-        "keywords": "Dubbo, roadmap, QCon Beijing",
-        "description": "This article will introduce you that Dubbo roadmap is announced in QCon Beijing 2018."
-      }
-    },
-    {
-      "filename": "sentinel-introduction-for-dubbo.md",
-      "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."
-      }
-    },
-    {
-      "filename": "spring-boot-dubbo-start-stop-analysis.md",
-      "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 `dubbo-spring-boot-project`."
-      }
-    },
-    {
-      "filename": "tracing-with-skywalking.md",
-      "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."
-      }
-    }
-  ],
-  "zh-cn": [
-    {
-      "filename": "apachecon-na-2018.md",
-      "link": "/zh-cn/blog/apachecon-na-2018.html",
-      "meta": {
-        "title": "ApacheCon大会议程公布",
-        "keywords": "Dubbo, ApacheCon NA",
-        "description": "本文将向你介绍在ApacheCon大会议程公布上相关Dubbo议题演讲。"
-      }
-    },
-    {
-      "filename": "build-new-docker-image-in-dockerhub.md",
-      "link": "/zh-cn/blog/build-new-docker-image-in-dockerhub.html",
-      "meta": {
-        "title": "在DockerHub发布Dubbo Admin镜像",
-        "keywords": "Dubbo Admin,Docker,Dockerhub",
-        "description": "本文将介绍如何在Dockerhub上发布Dubbo Admin镜像。"
-      }
-    },
-    {
-      "filename": "download.md",
-      "link": "/zh-cn/blog/download.html",
-      "meta": {
-        "title": "下载中心",
-        "keywords": "Dubbo, Downloads, Version",
-        "description": "本文将向你介绍如何点击了解各版本详情和升级注意事项。"
-      }
-    },
-    {
-      "filename": "dubbo-101.md",
-      "link": "/zh-cn/blog/dubbo-101.html",
-      "meta": {
-        "title": "第一个 Dubbo 应用",
-        "keywords": "Dubbo, RPC, RMI",
-        "description": "现代的分布式服务框架的基本概念与 RMI 是类似的,同样是使用 Java 的 Interface 作为服务契约,通过注册中心来完成服务的注册和发现,远程通讯的细节也是通过代理类来屏蔽。"
-      }
-    },
-    {
-      "filename": "dubbo-27-features.md",
-      "link": "/zh-cn/blog/dubbo-27-features.html",
-      "meta": {
-        "title": "Dubbo2.7 三大新特性详解",
-        "keywords": "Dubbo2.7",
-        "description": "异步化改造,三大中心改造,服务治理增强"
-      }
-    },
-    {
-      "filename": "dubbo-admin.md",
-      "link": "/zh-cn/blog/dubbo-admin.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-annotation-driven.md",
-      "link": "/zh-cn/blog/dubbo-annotation-driven.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-annotation.md",
-      "link": "/zh-cn/blog/dubbo-annotation.html",
-      "meta": {
-        "title": "在 Dubbo 中使用注解",
-        "keywords": "Dubbo, Annotation, Spring",
-        "description": "介绍了如何使用注解方式而非 XML 方式来开发 Dubbo 应用,可以学习到如何使用 @EnableDubbo、@Service、@Reference 的用法。"
-      }
-    },
-    {
-      "filename": "dubbo-basic-usage-dubbo-consumer-configuration.md",
-      "link": "/zh-cn/blog/dubbo-basic-usage-dubbo-consumer-configuration.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-basic-usage-dubbo-provider-configuration.md",
-      "link": "/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.html",
-      "meta": {
-        "title": "Dubbo基础用法之Provider配置",
-        "keywords": "Dubbo, Provider, Configuration",
-        "description": "主要讲述如何配置dubbo,按照配置方式上可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。"
-      }
-    },
-    {
-      "filename": "dubbo-cluster-error-handling.md",
-      "link": "/zh-cn/blog/dubbo-cluster-error-handling.html",
-      "meta": {
-        "title": "Dubbo集群容错",
-        "keywords": "Dubbo, RPC, cluster, Error-handling",
-        "description": "在分布式系统中,集群某个某些节点出现问题是大概率事件,因此在设计分布式RPC框架的过程中,必须要把失败作为设计的一等公民来对待。一次调用失败之后,应该如何选择对失败的选择策略,这是一个见仁见智的问题,每种策略可能都有自己独特的应用场景。因此,作为框架来说,应当针对不同场景提供多种策略,供用户进行选择。本文介绍了Dubbo框架提供的多种错误处理策略,并通过实例说明如何进行配置。"
-      }
-    },
-    {
-      "filename": "dubbo-compatible.md",
-      "link": "/zh-cn/blog/dubbo-compatible.html",
-      "meta": {
-        "title": "Dubbo 2.7.x repackage后的兼容实现方案",
-        "keywords": "Dubbo, repackage, 兼容",
-        "description": "本文简单描述了2.7.x repackage后对老版本的兼容性实现方案。"
-      }
-    },
-    {
-      "filename": "dubbo-context-information.md",
-      "link": "/zh-cn/blog/dubbo-context-information.html",
-      "meta": {
-        "title": "Dubbo 上下文信息",
-        "keywords": "Dubbo,RPC Context, Attachment",
-        "description": "介绍Dubbo上下文信息的作用、应用场景、使用方式以及注意事项"
-      }
-    },
-    {
-      "filename": "dubbo-contribute-to-opensource.md",
-      "link": "/zh-cn/blog/dubbo-contribute-to-opensource.html",
-      "meta": {
-        "title": "以Dubbo为例,聊聊如何向开源项目做贡献",
-        "keywords": "Dubbo, opensource",
-        "description": "本文将会以 dubbo 项目为例向你阐释,给开源项目做贡献并不是一件难事"
-      }
-    },
-    {
-      "filename": "dubbo-copywriting-style.md",
-      "link": "/zh-cn/blog/dubbo-copywriting-style.html",
-      "meta": {
-        "title": "Dubbo 博客文档中文排版指南",
-        "keywords": "Dubbo, Copywriting",
-        "description": "统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。"
-      }
-    },
-    {
-      "filename": "dubbo-echo-test.md",
-      "link": "/zh-cn/blog/dubbo-echo-test.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-externalized-configuration.md",
-      "link": "/zh-cn/blog/dubbo-externalized-configuration.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-fescar.md",
-      "link": "/zh-cn/blog/dubbo-fescar.html",
-      "meta": {
-        "title": "如何使用Fescar保证Dubbo微服务间的一致性",
-        "keywords": "Dubbo,Fescar,一致性",
-        "description": "本文主要介绍如何使用Fescar保证Dubbo微服务间的一致性"
-      }
-    },
-    {
-      "filename": "dubbo-generic-invoke.md",
-      "link": "/zh-cn/blog/dubbo-generic-invoke.html",
-      "meta": {
-        "title": "Dubbo的泛化调用",
-        "keywords": "Dubbo, Generic invoke",
-        "description": "本文介绍了 Dubbo 泛化调用的使用场景及相关示例"
-      }
-    },
-    {
-      "filename": "dubbo-gracefully-shutdown.md",
-      "link": "/zh-cn/blog/dubbo-gracefully-shutdown.html",
-      "meta": {
-        "title": "Dubbo 优雅停机",
-        "keywords": "Dubbo, Gracefully Shutdown, Safely Shutdown",
-        "description": "介绍Dubbo优雅停机的原理和使用方式"
-      }
-    },
-    {
-      "filename": "dubbo-heartbeat-design.md",
-      "link": "/zh-cn/blog/dubbo-heartbeat-design.html",
-      "meta": {
-        "title": "Dubbo 现有心跳方案总结以及改进建议",
-        "keywords": "Dubbo, 心跳",
-        "description": "一种心跳,两种设计"
-      }
-    },
-    {
-      "filename": "dubbo-integrate-with-hystrix.md",
-      "link": "/zh-cn/blog/dubbo-integrate-with-hystrix.html",
-      "meta": {
-        "title": "Spring应用快速集成Dubbo + Hystrix",
-        "keywords": "Dubbo, Spring, Hystrix",
-        "description": "本文介绍在spring应用里,怎么把Dubbo和Hystrix结合起来使用。"
-      }
-    },
-    {
-      "filename": "dubbo-invoke.md",
-      "link": "/zh-cn/blog/dubbo-invoke.html",
-      "meta": {
-        "title": "Dubbo 关于同步/异步调用的几种方式",
-        "keywords": "Dubbo, Invoke, Async",
-        "description": "本文介绍了Dubbo基于异步通讯机制实现的几种同步和异步调用方式。"
-      }
-    },
-    {
-      "filename": "dubbo-k8s.md",
-      "link": "/zh-cn/blog/dubbo-k8s.html",
-      "meta": {
-        "title": "Dubbo与Kubernetes集成",
-        "keywords": "Dubbo, Kubernetes, K8S",
-        "description": "本文主要尝试将Dubbo服务注册到Kubernetes,同时无缝融入Kubernetes的多租户安全体系。"
-      }
-    },
-    {
-      "filename": "dubbo-loadbalance.md",
-      "link": "/zh-cn/blog/dubbo-loadbalance.html",
-      "meta": {
-        "title": "Dubbo的负载均衡",
-        "keywords": "Dubbo, LoadBalance",
-        "description": "本文介绍了负载均衡的相关概念以及 Dubbo 中的负载均衡策略实现。"
-      }
-    },
-    {
-      "filename": "dubbo-local-call.md",
-      "link": "/zh-cn/blog/dubbo-local-call.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-meet-arthas.md",
-      "link": "/zh-cn/blog/dubbo-meet-arthas.html",
-      "meta": {
-        "title": "当Dubbo遇上Arthas:排查问题的实践",
-        "keywords": "Dubbo, Arthas",
-        "description": "使用Alibaba开源的应用诊断利器Arthas来排查Dubbo应用的问题。"
-      }
-    },
-    {
-      "filename": "dubbo-meetup-beijing-may-12th-2018.md",
-      "link": "/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.html",
-      "meta": {
-        "title": "首届Dubbo开发者沙龙在北京成功举办",
-        "keywords": "Dubbo, Beijing, meetup",
-        "description": "首届Dubbo开发者沙龙在北京成功举办"
-      }
-    },
-    {
-      "filename": "dubbo-meetup-chengdu.md",
-      "link": "/zh-cn/blog/dubbo-meetup-chengdu.html",
-      "meta": {
-        "title": "第四届Dubbo开发者沙龙于8月26日在成都举行",
-        "keywords": "Dubbo, 成都, meetup",
-        "description": "第四届Dubbo开发者沙龙于8月26日在成都举行。"
-      }
-    },
-    {
-      "filename": "dubbo-meetup-hangzhou.md",
-      "link": "/zh-cn/blog/dubbo-meetup-hangzhou.html",
-      "meta": {
-        "title": "第五届Dubbo开发者沙龙在杭州成功举办",
-        "keywords": "Dubbo, 杭州, meetup",
-        "description": "第五届Dubbo开发者沙龙在杭州成功举办。"
-      }
-    },
-    {
-      "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
-      "link": "/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
-      "meta": {
-        "title": "第二届Dubbo开发者沙龙在上海成功举办",
-        "keywords": "Dubbo, 上海, meetup",
-        "description": "第二届Dubbo开发者沙龙在上海成功举办。"
-      }
-    },
-    {
-      "filename": "dubbo-meetup-shenzhen.md",
-      "link": "/zh-cn/blog/dubbo-meetup-shenzhen.html",
-      "meta": {
-        "title": "第三届Dubbo开发者沙龙在深圳成功举办",
-        "keywords": "Dubbo, 深圳, meetup",
-        "description": "第三届Dubbo开发者沙龙在深圳成功举办。"
-      }
-    },
-    {
-      "filename": "dubbo-mesh-in-thinking.md",
-      "link": "/zh-cn/blog/dubbo-mesh-in-thinking.html",
-      "meta": {
-        "title": "Dubbo在Service Mesh下的思考和方案",
-        "keywords": "Dubbo, Service Mesh, Cloud Native",
-        "description": "Dubbo是实现框架,融入servcemesh理念就是我们今天分享的。"
-      }
-    },
-    {
-      "filename": "dubbo-mesh-service-mesh-exploring.md",
-      "link": "/zh-cn/blog/dubbo-mesh-service-mesh-exploring.html",
-      "meta": {
-        "title": "Dubbo Mesh | Service Mesh的实践与探索",
-        "keywords": "Dubbo, Service Mesh",
-        "description": "本文介绍了Dubbo在Service Mesh方向的实践与探索"
-      }
-    },
-    {
-      "filename": "dubbo-network-interfaces.md",
-      "link": "/zh-cn/blog/dubbo-network-interfaces.html",
-      "meta": {
-        "title": "研究 Dubbo 网卡地址注册时的一点思考",
-        "keywords": "网卡地址注册",
-        "description": "研究 Dubbo 网卡地址注册时的一点思考"
-      }
-    },
-    {
-      "filename": "dubbo-new-async.md",
-      "link": "/zh-cn/blog/dubbo-new-async.html",
-      "meta": {
-        "title": "如何基于Dubbo实现全异步调用链",
-        "keywords": "Dubbo, 异步, async chain",
-        "description": "本文回顾了 2.6.x 版本的异步实现,然后引出了 2.7.0 版本基于 CompletableFuture 的异步编程方式。"
-      }
-    },
-    {
-      "filename": "dubbo-protocol.md",
-      "link": "/zh-cn/blog/dubbo-protocol.html",
-      "meta": {
-        "title": "DUBBO协议详解",
-        "keywords": "Dubbo, Protocol, RPC",
-        "description": "本文介绍了dubbo协议的设计"
-      }
-    },
-    {
-      "filename": "dubbo-registry-nacos-integration.md",
-      "link": "/zh-cn/blog/dubbo-registry-nacos-integration.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-rest.md",
-      "link": "/zh-cn/blog/dubbo-rest.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-stub-mock.md",
-      "link": "/zh-cn/blog/dubbo-stub-mock.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-zk.md",
-      "link": "/zh-cn/blog/dubbo-zk.html",
-      "meta": {
-        "title": "在 Dubbo 应用中使用 Zookeeper",
-        "keywords": "Dubbo, 注册中心, Zookeeper, ZK",
-        "description": "本文介绍了 Zookeeper 的基本概念、用法,以及如何在 Dubbo 应用中使用 Zookeeper 作为注册中心。"
-      }
-    },
-    {
-      "filename": "dubbo2-js.md",
-      "link": "/zh-cn/blog/dubbo2-js.html",
-      "meta": {
-        "title": "从跨语言调用到dubbo2.js",
-        "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
-        "description": "本文介绍了如何使用 dubbo2.js 进行跨语言的 dubbo 调用。"
-      }
-    },
-    {
-      "filename": "dubboAsync_client.md",
-      "link": "/zh-cn/blog/dubboAsync_client.html",
-      "meta": {
-        "title": "Dubbo客户端异步接口的实现背景和实践",
-        "keywords": "Dubbo, 异步, Reactive",
-        "description": "Dubbo客户端异步接口的实现背景和实践"
-      }
-    },
-    {
-      "filename": "dubboAsync_server.md",
-      "link": "/zh-cn/blog/dubboAsync_server.html",
-      "meta": {
-        "title": "Dubbo客户端异步接口的实现背景和实践",
-        "keywords": "Dubbo, 异步, Reactive",
-        "description": "Dubbo服务端异步接口的实现背景和实践"
-      }
-    },
-    {
-      "filename": "first-dubbo-filter.md",
-      "link": "/zh-cn/blog/first-dubbo-filter.html",
-      "meta": {}
-    },
-    {
-      "filename": "gsoc-2018.md",
-      "link": "/zh-cn/blog/gsoc-2018.html",
-      "meta": {
-        "title": "谷歌编程之夏会议上2018个项目被宣布",
-        "keywords": "Dubbo, GSoC",
-        "description": "谷歌编程之夏会议上2018个项目被宣布,Dubbo位列其中。"
-      }
-    },
-    {
-      "filename": "how-to-involve-dubbo-community.md",
-      "link": "/zh-cn/blog/how-to-involve-dubbo-community.html",
-      "meta": {
-        "title": "如何参与贡献Dubbo社区",
-        "keywords": "Dubbo, Apache Way",
-        "description": "本文介绍了如何以Apache Way的方式参与Dubbo社区并做贡献"
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-qos.md",
-      "link": "/zh-cn/blog/introduction-to-dubbo-qos.html",
-      "meta": {
-        "title": "通过QoS对服务进行动态控制",
-        "keywords": "Dubbo, qos",
-        "description": "本文介绍了如何使用Dubbo的QoS功能对服务进行动态配置,以及相关的参数及配置方式。"
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-spi-2.md",
-      "link": "/zh-cn/blog/introduction-to-dubbo-spi-2.html",
-      "meta": {
-        "title": "Dubbo可扩展机制源码解析",
-        "keywords": "Dubbo, SPI, 源码分析",
-        "description": "本文介绍了SPI扩展机制的实现原理与细节。"
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-spi.md",
-      "link": "/zh-cn/blog/introduction-to-dubbo-spi.html",
-      "meta": {
-        "title": "Dubbo可扩展机制实战",
-        "keywords": "Dubbo, SPI",
-        "description": "本文介绍了Dubbo框架的核心,SPI扩展机制。"
-      }
-    },
-    {
-      "filename": "introduction-to-dubbo-url.md",
-      "link": "/zh-cn/blog/introduction-to-dubbo-url.html",
-      "meta": {
-        "title": "Dubbo 中的 URL 统一模型",
-        "keywords": "Dubbo, URL",
-        "description": "URL 是 Dubbo 种一个重要的领域模型,了解它可以更加轻松的理解 Dubbo 的设计理念。"
-      }
-    },
-    {
-      "filename": "meet-dubbo.md",
-      "link": "/zh-cn/blog/meet-dubbo.html",
-      "meta": {
-        "title": "遇见Dubbo",
-        "keywords": "Dubbo, Committer",
-        "description": "本文记录了一个小白成长为Dubbo committer的过程。"
-      }
-    },
-    {
-      "filename": "optimization-branch-prediction.md",
-      "link": "/zh-cn/blog/optimization-branch-prediction.html",
-      "meta": {
-        "title": "提前if判断帮助CPU分支预测"
-      }
-    },
-    {
-      "filename": "pinpoint.md",
-      "link": "/zh-cn/blog/pinpoint.html",
-      "meta": {
-        "title": "使用Pinpoint做分布式跟踪",
-        "keywords": "Dubbo, Pinpoint, tracing",
-        "description": "本文介绍了利用Pinpoint对Dubbo分布式应用进行调用链跟踪与性能监控。"
-      }
-    },
-    {
-      "filename": "prepare-an-apache-release.md",
-      "link": "/zh-cn/blog/prepare-an-apache-release.html",
-      "meta": {
-        "title": "如何准备Apache Release",
-        "keywords": "Dubbo, Apache, Release",
-        "description": "本文介绍了Apache如何发布内容和流程"
-      }
-    },
-    {
-      "filename": "qcon-beijing-2018.md",
-      "link": "/zh-cn/blog/qcon-beijing-2018.html",
-      "meta": {
-        "title": "Dubbo路线图在QCon Beijing 2018上公布",
-        "keywords": "Dubbo, roadmap, QCon Beijing",
-        "description": "本文将向你介绍在QCon Beijing 2018上公布Dubbo路线图。"
-      }
-    },
-    {
-      "filename": "sentinel-introduction-for-dubbo.md",
-      "link": "/zh-cn/blog/sentinel-introduction-for-dubbo.html",
-      "meta": {
-        "title": "Sentinel 为 Dubbo 服务保驾护航",
-        "keywords": "Dubbo, Sentinel, 限流, 熔断",
-        "description": "本文主要介绍了面向分布式服务架构的轻量级流量控制组件 Sentinel 以及在 Dubbo 中整合使用 Sentinel 的最佳实践。"
-      }
-    },
-    {
-      "filename": "service-and-version.md",
-      "link": "/zh-cn/blog/service-and-version.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-test.md",
-      "link": "/zh-cn/blog/service-test.html",
-      "meta": {}
-    },
-    {
-      "filename": "spring-boot-dubbo-start-stop-analysis.md",
-      "link": "/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html",
-      "meta": {
-        "title": "Spring Boot Dubbo应用启停源码分析",
-        "keywords": "Dubbo, Spring Boot, 源码分析",
-        "description": "本文分析 `dubbo-spring-boot-project` 中 Dubbo 启停源码的实现原理。"
-      }
-    },
-    {
-      "filename": "test-verification.md",
-      "link": "/zh-cn/blog/test-verification.html",
-      "meta": {}
-    },
-    {
-      "filename": "tracing-with-skywalking.md",
-      "link": "/zh-cn/blog/tracing-with-skywalking.html",
-      "meta": {
-        "title": "使用Apache Skywalking (Incubator) 做分布式跟踪",
-        "keywords": "Dubbo, Skywalking, tracing, 分布式跟踪",
-        "description": "本文介绍如何使用 Apache Skywalking 对 Dubbo 应用做分布式链路追踪。"
-      }
-    },
-    {
-      "filename": "use-zipkin-in-dubbo.md",
-      "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/md_json/docs.json b/md_json/docs.json
deleted file mode 100644
index e356d32..0000000
--- a/md_json/docs.json
+++ /dev/null
@@ -1,2110 +0,0 @@
-{
-  "en-us": [
-    {
-      "filename": "README.md",
-      "link": "/en-us/docs/admin/README.html",
-      "meta": {}
-    },
-    {
-      "filename": "SUMMARY.md",
-      "link": "/en-us/docs/admin/SUMMARY.html",
-      "meta": {}
-    },
-    {
-      "filename": "admin-console.md",
-      "link": "/en-us/docs/admin/install/admin-console.html",
-      "meta": {}
-    },
-    {
-      "filename": "consumer-demo.md",
-      "link": "/en-us/docs/admin/install/consumer-demo.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/admin/install/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "provider-demo.md",
-      "link": "/en-us/docs/admin/install/provider-demo.html",
-      "meta": {}
-    },
-    {
-      "filename": "redis.md",
-      "link": "/en-us/docs/admin/install/redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple-monitor-center.md",
-      "link": "/en-us/docs/admin/install/simple-monitor-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple-registry-center.md",
-      "link": "/en-us/docs/admin/install/simple-registry-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "zookeeper.md",
-      "link": "/en-us/docs/admin/install/zookeeper.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/admin/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-ops.md",
-      "link": "/en-us/docs/admin/ops/dubbo-ops.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/admin/ops/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "pinpoint.md",
-      "link": "/en-us/docs/admin/ops/pinpoint.html",
-      "meta": {}
-    },
-    {
-      "filename": "skywalking.md",
-      "link": "/en-us/docs/admin/ops/skywalking.html",
-      "meta": {}
-    },
-    {
-      "filename": "serviceGovernance.md",
-      "link": "/en-us/docs/admin/serviceGovernance.html",
-      "meta": {}
-    },
-    {
-      "filename": "serviceSearch.md",
-      "link": "/en-us/docs/admin/serviceSearch.html",
-      "meta": {}
-    },
-    {
-      "filename": "serviceTest.md",
-      "link": "/en-us/docs/admin/serviceTest.html",
-      "meta": {}
-    },
-    {
-      "filename": "README.md",
-      "link": "/en-us/docs/dev/README.html",
-      "meta": {}
-    },
-    {
-      "filename": "SPI.md",
-      "link": "/en-us/docs/dev/SPI.html",
-      "meta": {}
-    },
-    {
-      "filename": "SUMMARY.md",
-      "link": "/en-us/docs/dev/SUMMARY.html",
-      "meta": {}
-    },
-    {
-      "filename": "TCK.md",
-      "link": "/en-us/docs/dev/TCK.html",
-      "meta": {}
-    },
-    {
-      "filename": "build.md",
-      "link": "/en-us/docs/dev/build.html",
-      "meta": {}
-    },
-    {
-      "filename": "checklist.md",
-      "link": "/en-us/docs/dev/checklist.html",
-      "meta": {}
-    },
-    {
-      "filename": "code-smell.md",
-      "link": "/en-us/docs/dev/code-smell.html",
-      "meta": {}
-    },
-    {
-      "filename": "coding.md",
-      "link": "/en-us/docs/dev/coding.html",
-      "meta": {}
-    },
-    {
-      "filename": "contract.md",
-      "link": "/en-us/docs/dev/contract.html",
-      "meta": {}
-    },
-    {
-      "filename": "contribution.md",
-      "link": "/en-us/docs/dev/contribution.html",
-      "meta": {}
-    },
-    {
-      "filename": "design.md",
-      "link": "/en-us/docs/dev/design.html",
-      "meta": {}
-    },
-    {
-      "filename": "implementation.md",
-      "link": "/en-us/docs/dev/implementation.html",
-      "meta": {}
-    },
-    {
-      "filename": "cache.md",
-      "link": "/en-us/docs/dev/impls/cache.html",
-      "meta": {}
-    },
-    {
-      "filename": "cluster.md",
-      "link": "/en-us/docs/dev/impls/cluster.html",
-      "meta": {}
-    },
-    {
-      "filename": "compiler.md",
-      "link": "/en-us/docs/dev/impls/compiler.html",
-      "meta": {}
-    },
-    {
-      "filename": "container.md",
-      "link": "/en-us/docs/dev/impls/container.html",
-      "meta": {}
-    },
-    {
-      "filename": "dispatcher.md",
-      "link": "/en-us/docs/dev/impls/dispatcher.html",
-      "meta": {}
-    },
-    {
-      "filename": "exchanger.md",
-      "link": "/en-us/docs/dev/impls/exchanger.html",
-      "meta": {}
-    },
-    {
-      "filename": "exporter-listener.md",
-      "link": "/en-us/docs/dev/impls/exporter-listener.html",
-      "meta": {}
-    },
-    {
-      "filename": "extension-factory.md",
-      "link": "/en-us/docs/dev/impls/extension-factory.html",
-      "meta": {}
-    },
-    {
-      "filename": "filter.md",
-      "link": "/en-us/docs/dev/impls/filter.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/dev/impls/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "invoker-listener.md",
-      "link": "/en-us/docs/dev/impls/invoker-listener.html",
-      "meta": {}
-    },
-    {
-      "filename": "load-balance.md",
-      "link": "/en-us/docs/dev/impls/load-balance.html",
-      "meta": {}
-    },
-    {
-      "filename": "logger-adapter.md",
-      "link": "/en-us/docs/dev/impls/logger-adapter.html",
-      "meta": {}
-    },
-    {
-      "filename": "merger.md",
-      "link": "/en-us/docs/dev/impls/merger.html",
-      "meta": {}
-    },
-    {
-      "filename": "monitor.md",
-      "link": "/en-us/docs/dev/impls/monitor.html",
-      "meta": {}
-    },
-    {
-      "filename": "networker.md",
-      "link": "/en-us/docs/dev/impls/networker.html",
-      "meta": {}
-    },
-    {
-      "filename": "page.md",
-      "link": "/en-us/docs/dev/impls/page.html",
-      "meta": {}
-    },
-    {
-      "filename": "protocol.md",
-      "link": "/en-us/docs/dev/impls/protocol.html",
-      "meta": {}
-    },
-    {
-      "filename": "proxy-factory.md",
-      "link": "/en-us/docs/dev/impls/proxy-factory.html",
-      "meta": {}
-    },
-    {
-      "filename": "registry.md",
-      "link": "/en-us/docs/dev/impls/registry.html",
-      "meta": {}
-    },
-    {
-      "filename": "remoting.md",
-      "link": "/en-us/docs/dev/impls/remoting.html",
-      "meta": {}
-    },
-    {
-      "filename": "router.md",
-      "link": "/en-us/docs/dev/impls/router.html",
-      "meta": {}
-    },
-    {
-      "filename": "serialize.md",
-      "link": "/en-us/docs/dev/impls/serialize.html",
-      "meta": {}
-    },
-    {
-      "filename": "status-checker.md",
-      "link": "/en-us/docs/dev/impls/status-checker.html",
-      "meta": {}
-    },
-    {
-      "filename": "telnet-handler.md",
-      "link": "/en-us/docs/dev/impls/telnet-handler.html",
-      "meta": {}
-    },
-    {
-      "filename": "threadpool.md",
-      "link": "/en-us/docs/dev/impls/threadpool.html",
-      "meta": {}
-    },
-    {
-      "filename": "validation.md",
-      "link": "/en-us/docs/dev/impls/validation.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/dev/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "code-detail.md",
-      "link": "/en-us/docs/dev/principals/code-detail.html",
-      "meta": {}
-    },
-    {
-      "filename": "configuration.md",
-      "link": "/en-us/docs/dev/principals/configuration.html",
-      "meta": {}
-    },
-    {
-      "filename": "dummy.md",
-      "link": "/en-us/docs/dev/principals/dummy.html",
-      "meta": {}
-    },
-    {
-      "filename": "expansibility.md",
-      "link": "/en-us/docs/dev/principals/expansibility.html",
-      "meta": {}
-    },
-    {
-      "filename": "extension.md",
-      "link": "/en-us/docs/dev/principals/extension.html",
-      "meta": {}
-    },
-    {
-      "filename": "general-knowledge.md",
-      "link": "/en-us/docs/dev/principals/general-knowledge.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/dev/principals/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "robustness.md",
-      "link": "/en-us/docs/dev/principals/robustness.html",
-      "meta": {}
-    },
-    {
-      "filename": "release.md",
-      "link": "/en-us/docs/dev/release.html",
-      "meta": {}
-    },
-    {
-      "filename": "apache-dubbo-page_dev.md",
-      "link": "/en-us/docs/developers/committer-guide/apache-dubbo-page_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "label-an-issue-guide_dev.md",
-      "link": "/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "new-committer-guide_dev.md",
-      "link": "/en-us/docs/developers/committer-guide/new-committer-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "release-guide_dev.md",
-      "link": "/en-us/docs/developers/committer-guide/release-guide_dev.html",
-      "meta": {
-        "title": "Understanding the Apache Release Cycle",
-        "keywords": "Dubbo, Apache, Release"
-      }
-    },
-    {
-      "filename": "website-guide_dev.md",
-      "link": "/en-us/docs/developers/committer-guide/website-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "become-a-committer_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/become-a-committer_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "cla-signing-guide_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-extension-guide_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "mailing-list-subscription-guide_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "new-contributor-guide_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "reporting-security-issues_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/reporting-security-issues_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "software-donation-guide_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "test-coverage-guide_dev.md",
-      "link": "/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "developers_dev.md",
-      "link": "/en-us/docs/developers/developers_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "guide_dev.md",
-      "link": "/en-us/docs/developers/guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "faq_dev.md",
-      "link": "/en-us/docs/developers/user-guide/faq_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "README.md",
-      "link": "/en-us/docs/user/README.html",
-      "meta": {}
-    },
-    {
-      "filename": "SUMMARY.md",
-      "link": "/en-us/docs/user/SUMMARY.html",
-      "meta": {}
-    },
-    {
-      "filename": "benchmark-tool.md",
-      "link": "/en-us/docs/user/benchmark-tool.html",
-      "meta": {}
-    },
-    {
-      "filename": "best-practice.md",
-      "link": "/en-us/docs/user/best-practice.html",
-      "meta": {}
-    },
-    {
-      "filename": "capacity-plan.md",
-      "link": "/en-us/docs/user/capacity-plan.html",
-      "meta": {}
-    },
-    {
-      "filename": "annotation.md",
-      "link": "/en-us/docs/user/configuration/annotation.html",
-      "meta": {}
-    },
-    {
-      "filename": "api.md",
-      "link": "/en-us/docs/user/configuration/api.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/en-us/docs/user/configuration/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "properties.md",
-      "link": "/en-us/docs/user/configuration/properties.html",
-      "meta": {}
-    },
-    {
-      "filename": "xml.md",
-      "link": "/en-us/docs/user/configuration/xml.html",
-      "meta": {}
-    },
-    {
-      "filename": "coveragence.md",
-      "link": "/en-us/docs/user/coveragence.html",
-      "meta": {}
-    },
-    {
-      "filename": "accesslog.md",
-      "link": "/en-us/docs/user/demos/accesslog.html",
-      "meta": {}
-    },
-    {
-      "filename": "async-call.md",
-      "link": "/en-us/docs/user/demos/async-call.html",
-      "meta": {}
-    },
-    {
-      "filename": "attachment.md",
-      "link": "/en-us/docs/user/demos/attachment.html",
-      "meta": {}
-    },
-    {
-      "filename": "callback-parameter.md",
-      "link": "/en-us/docs/user/demos/callback-parameter.html",
-      "meta": {}
-    },
-    {
-      "filename": "concurrency-control.md",
-      "link": "/en-us/docs/user/demos/concurrency-control.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-connections.md",
-      "link": "/en-us/docs/user/demos/config-connections.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-rule.md",
-      "link": "/en-us/docs/user/demos/config-rule.html",
-      "meta": {}
-    },
-    {
-      "filename": "context.md",
-      "link": "/en-us/docs/user/demos/context.html",
-      "meta": {}
-    },
-    {
-      "filename": "delay-publish.md",
-      "link": "/en-us/docs/user/demos/delay-publish.html",
-      "meta": {}
-    },
-    {
-      "filename": "distributed-transaction.md",
-      "link": "/en-us/docs/user/demos/distributed-transaction.html",
-      "meta": {}
-    },
-    {
-      "filename": "dump.md",
-      "link": "/en-us/docs/user/demos/dump.html",
-      "meta": {}
-    },
-    {
-      "filename": "echo-service.md",
-      "link": "/en-us/docs/user/demos/echo-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "events-notify.md",
-      "link": "/en-us/docs/user/demos/events-notify.html",
-      "meta": {}
-    },
-    {
-      "filename": "explicit-target.md",
-      "link": "/en-us/docs/user/demos/explicit-target.html",
-      "meta": {}
-    },
-    {
-      "filename": "fault-tolerent-strategy.md",
-      "link": "/en-us/docs/user/demos/fault-tolerent-strategy.html",
-      "meta": {}
-    },
-    {
-      "filename": "generic-reference.md",
-      "link": "/en-us/docs/user/demos/generic-reference.html",
-      "meta": {}
-    },
-    {
-      "filename": "generic-service.md",
-      "link": "/en-us/docs/user/demos/generic-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "graceful-shutdown.md",
-      "link": "/en-us/docs/user/demos/graceful-shutdown.html",
-      "meta": {}
-    },
-    {
-      "filename": "group-merger.md",
-      "link": "/en-us/docs/user/demos/group-merger.html",
-      "meta": {}
-    },
-    {
-      "filename": "hostname-binding.md",
-      "link": "/en-us/docs/user/demos/hostname-binding.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/en-us/docs/user/demos/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/user/demos/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "lazy-connect.md",
-      "link": "/en-us/docs/user/demos/lazy-connect.html",
-      "meta": {}
-    },
-    {
-      "filename": "loadbalance.md",
-      "link": "/en-us/docs/user/demos/loadbalance.html",
-      "meta": {}
-    },
-    {
-      "filename": "local-call.md",
-      "link": "/en-us/docs/user/demos/local-call.html",
-      "meta": {}
-    },
-    {
-      "filename": "local-mock.md",
-      "link": "/en-us/docs/user/demos/local-mock.html",
-      "meta": {}
-    },
-    {
-      "filename": "local-stub.md",
-      "link": "/en-us/docs/user/demos/local-stub.html",
-      "meta": {}
-    },
-    {
-      "filename": "logger-strategy.md",
-      "link": "/en-us/docs/user/demos/logger-strategy.html",
-      "meta": {}
-    },
-    {
-      "filename": "multi-protocols.md",
-      "link": "/en-us/docs/user/demos/multi-protocols.html",
-      "meta": {}
-    },
-    {
-      "filename": "multi-registry.md",
-      "link": "/en-us/docs/user/demos/multi-registry.html",
-      "meta": {}
-    },
-    {
-      "filename": "multi-versions.md",
-      "link": "/en-us/docs/user/demos/multi-versions.html",
-      "meta": {}
-    },
-    {
-      "filename": "netty4.md",
-      "link": "/en-us/docs/user/demos/netty4.html",
-      "meta": {}
-    },
-    {
-      "filename": "parameter-validation.md",
-      "link": "/en-us/docs/user/demos/parameter-validation.html",
-      "meta": {}
-    },
-    {
-      "filename": "preflight-check.md",
-      "link": "/en-us/docs/user/demos/preflight-check.html",
-      "meta": {}
-    },
-    {
-      "filename": "reference-config-cache.md",
-      "link": "/en-us/docs/user/demos/reference-config-cache.html",
-      "meta": {}
-    },
-    {
-      "filename": "registry-only.md",
-      "link": "/en-us/docs/user/demos/registry-only.html",
-      "meta": {}
-    },
-    {
-      "filename": "result-cache.md",
-      "link": "/en-us/docs/user/demos/result-cache.html",
-      "meta": {}
-    },
-    {
-      "filename": "routing-rule.md",
-      "link": "/en-us/docs/user/demos/routing-rule.html",
-      "meta": {}
-    },
-    {
-      "filename": "serialization.md",
-      "link": "/en-us/docs/user/demos/serialization.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-container.md",
-      "link": "/en-us/docs/user/demos/service-container.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-downgrade.md",
-      "link": "/en-us/docs/user/demos/service-downgrade.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-group.md",
-      "link": "/en-us/docs/user/demos/service-group.html",
-      "meta": {}
-    },
-    {
-      "filename": "static-service.md",
-      "link": "/en-us/docs/user/demos/static-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "stickiness.md",
-      "link": "/en-us/docs/user/demos/stickiness.html",
-      "meta": {}
-    },
-    {
-      "filename": "subscribe-only.md",
-      "link": "/en-us/docs/user/demos/subscribe-only.html",
-      "meta": {}
-    },
-    {
-      "filename": "thread-model.md",
-      "link": "/en-us/docs/user/demos/thread-model.html",
-      "meta": {}
-    },
-    {
-      "filename": "token-authorization.md",
-      "link": "/en-us/docs/user/demos/token-authorization.html",
-      "meta": {}
-    },
-    {
-      "filename": "dependencies.md",
-      "link": "/en-us/docs/user/dependencies.html",
-      "meta": {}
-    },
-    {
-      "filename": "reference.md",
-      "link": "/en-us/docs/user/languages/erlang/reference.html",
-      "meta": {}
-    },
-    {
-      "filename": "serialization.md",
-      "link": "/en-us/docs/user/languages/erlang/serialization.html",
-      "meta": {}
-    },
-    {
-      "filename": "service.md",
-      "link": "/en-us/docs/user/languages/erlang/service.html",
-      "meta": {}
-    },
-    {
-      "filename": "start.md",
-      "link": "/en-us/docs/user/languages/erlang/start.html",
-      "meta": {}
-    },
-    {
-      "filename": "maturity.md",
-      "link": "/en-us/docs/user/maturity.html",
-      "meta": {}
-    },
-    {
-      "filename": "perf-test.md",
-      "link": "/en-us/docs/user/perf-test.html",
-      "meta": {}
-    },
-    {
-      "filename": "architecture.md",
-      "link": "/en-us/docs/user/preface/architecture.html",
-      "meta": {}
-    },
-    {
-      "filename": "background.md",
-      "link": "/en-us/docs/user/preface/background.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/en-us/docs/user/preface/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "requirements.md",
-      "link": "/en-us/docs/user/preface/requirements.html",
-      "meta": {}
-    },
-    {
-      "filename": "usage.md",
-      "link": "/en-us/docs/user/preface/usage.html",
-      "meta": {}
-    },
-    {
-      "filename": "quick-start.md",
-      "link": "/en-us/docs/user/quick-start.html",
-      "meta": {}
-    },
-    {
-      "filename": "recommend.md",
-      "link": "/en-us/docs/user/recommend.html",
-      "meta": {}
-    },
-    {
-      "filename": "api.md",
-      "link": "/en-us/docs/user/references/api.html",
-      "meta": {}
-    },
-    {
-      "filename": "maven.md",
-      "link": "/en-us/docs/user/references/maven.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo.md",
-      "link": "/en-us/docs/user/references/protocol/dubbo.html",
-      "meta": {}
-    },
-    {
-      "filename": "hessian.md",
-      "link": "/en-us/docs/user/references/protocol/hessian.html",
-      "meta": {}
-    },
-    {
-      "filename": "http.md",
-      "link": "/en-us/docs/user/references/protocol/http.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/user/references/protocol/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "memcached.md",
-      "link": "/en-us/docs/user/references/protocol/memcached.html",
-      "meta": {}
-    },
-    {
-      "filename": "redis.md",
-      "link": "/en-us/docs/user/references/protocol/redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "rest.md",
-      "link": "/en-us/docs/user/references/protocol/rest.html",
-      "meta": {}
-    },
-    {
-      "filename": "rmi.md",
-      "link": "/en-us/docs/user/references/protocol/rmi.html",
-      "meta": {}
-    },
-    {
-      "filename": "thrift.md",
-      "link": "/en-us/docs/user/references/protocol/thrift.html",
-      "meta": {}
-    },
-    {
-      "filename": "webservice.md",
-      "link": "/en-us/docs/user/references/protocol/webservice.html",
-      "meta": {}
-    },
-    {
-      "filename": "qos.md",
-      "link": "/en-us/docs/user/references/qos.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/user/references/registry/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "multicast.md",
-      "link": "/en-us/docs/user/references/registry/multicast.html",
-      "meta": {}
-    },
-    {
-      "filename": "nacos.md",
-      "link": "/en-us/docs/user/references/registry/nacos.html",
-      "meta": {}
-    },
-    {
-      "filename": "redis.md",
-      "link": "/en-us/docs/user/references/registry/redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple.md",
-      "link": "/en-us/docs/user/references/registry/simple.html",
-      "meta": {}
-    },
-    {
-      "filename": "zookeeper.md",
-      "link": "/en-us/docs/user/references/registry/zookeeper.html",
-      "meta": {}
-    },
-    {
-      "filename": "telnet.md",
-      "link": "/en-us/docs/user/references/telnet.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-application.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-application.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-argument.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-argument.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-consumer.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-consumer.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-method.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-method.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-module.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-module.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-monitor.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-monitor.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-parameter.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-parameter.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-protocol.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-protocol.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-provider.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-provider.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-reference.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-reference.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-registry.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-registry.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-service.md",
-      "link": "/en-us/docs/user/references/xml/dubbo-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/en-us/docs/user/references/xml/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "rest.md",
-      "link": "/en-us/docs/user/rest.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple-monitor.md",
-      "link": "/en-us/docs/user/simple-monitor.html",
-      "meta": {}
-    }
-  ],
-  "zh-cn": [
-    {
-      "filename": "README.md",
-      "link": "/zh-cn/docs/admin/README.html",
-      "meta": {}
-    },
-    {
-      "filename": "SUMMARY.md",
-      "link": "/zh-cn/docs/admin/SUMMARY.html",
-      "meta": {}
-    },
-    {
-      "filename": "admin-console.md",
-      "link": "/zh-cn/docs/admin/install/admin-console.html",
-      "meta": {}
-    },
-    {
-      "filename": "consumer-demo.md",
-      "link": "/zh-cn/docs/admin/install/consumer-demo.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/admin/install/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "provider-demo.md",
-      "link": "/zh-cn/docs/admin/install/provider-demo.html",
-      "meta": {}
-    },
-    {
-      "filename": "redis.md",
-      "link": "/zh-cn/docs/admin/install/redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple-monitor-center.md",
-      "link": "/zh-cn/docs/admin/install/simple-monitor-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple-registry-center.md",
-      "link": "/zh-cn/docs/admin/install/simple-registry-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "zookeeper.md",
-      "link": "/zh-cn/docs/admin/install/zookeeper.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/admin/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-ops.md",
-      "link": "/zh-cn/docs/admin/ops/dubbo-ops.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/admin/ops/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "pinpoint.md",
-      "link": "/zh-cn/docs/admin/ops/pinpoint.html",
-      "meta": {}
-    },
-    {
-      "filename": "skywalking.md",
-      "link": "/zh-cn/docs/admin/ops/skywalking.html",
-      "meta": {}
-    },
-    {
-      "filename": "serviceGovernance.md",
-      "link": "/zh-cn/docs/admin/serviceGovernance.html",
-      "meta": {}
-    },
-    {
-      "filename": "serviceSearch.md",
-      "link": "/zh-cn/docs/admin/serviceSearch.html",
-      "meta": {}
-    },
-    {
-      "filename": "serviceTest.md",
-      "link": "/zh-cn/docs/admin/serviceTest.html",
-      "meta": {}
-    },
-    {
-      "filename": "README.md",
-      "link": "/zh-cn/docs/dev/README.html",
-      "meta": {}
-    },
-    {
-      "filename": "SPI.md",
-      "link": "/zh-cn/docs/dev/SPI.html",
-      "meta": {}
-    },
-    {
-      "filename": "SUMMARY.md",
-      "link": "/zh-cn/docs/dev/SUMMARY.html",
-      "meta": {}
-    },
-    {
-      "filename": "TCK.md",
-      "link": "/zh-cn/docs/dev/TCK.html",
-      "meta": {}
-    },
-    {
-      "filename": "build.md",
-      "link": "/zh-cn/docs/dev/build.html",
-      "meta": {}
-    },
-    {
-      "filename": "checklist.md",
-      "link": "/zh-cn/docs/dev/checklist.html",
-      "meta": {}
-    },
-    {
-      "filename": "code-smell.md",
-      "link": "/zh-cn/docs/dev/code-smell.html",
-      "meta": {}
-    },
-    {
-      "filename": "coding.md",
-      "link": "/zh-cn/docs/dev/coding.html",
-      "meta": {}
-    },
-    {
-      "filename": "contract.md",
-      "link": "/zh-cn/docs/dev/contract.html",
-      "meta": {}
-    },
-    {
-      "filename": "contribution.md",
-      "link": "/zh-cn/docs/dev/contribution.html",
-      "meta": {}
-    },
-    {
-      "filename": "design.md",
-      "link": "/zh-cn/docs/dev/design.html",
-      "meta": {}
-    },
-    {
-      "filename": "implementation.md",
-      "link": "/zh-cn/docs/dev/implementation.html",
-      "meta": {}
-    },
-    {
-      "filename": "cache.md",
-      "link": "/zh-cn/docs/dev/impls/cache.html",
-      "meta": {}
-    },
-    {
-      "filename": "cluster.md",
-      "link": "/zh-cn/docs/dev/impls/cluster.html",
-      "meta": {}
-    },
-    {
-      "filename": "compiler.md",
-      "link": "/zh-cn/docs/dev/impls/compiler.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-center.md",
-      "link": "/zh-cn/docs/dev/impls/config-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "container.md",
-      "link": "/zh-cn/docs/dev/impls/container.html",
-      "meta": {}
-    },
-    {
-      "filename": "dispatcher.md",
-      "link": "/zh-cn/docs/dev/impls/dispatcher.html",
-      "meta": {}
-    },
-    {
-      "filename": "exchanger.md",
-      "link": "/zh-cn/docs/dev/impls/exchanger.html",
-      "meta": {}
-    },
-    {
-      "filename": "exporter-listener.md",
-      "link": "/zh-cn/docs/dev/impls/exporter-listener.html",
-      "meta": {}
-    },
-    {
-      "filename": "extension-factory.md",
-      "link": "/zh-cn/docs/dev/impls/extension-factory.html",
-      "meta": {}
-    },
-    {
-      "filename": "filter.md",
-      "link": "/zh-cn/docs/dev/impls/filter.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/dev/impls/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "invoker-listener.md",
-      "link": "/zh-cn/docs/dev/impls/invoker-listener.html",
-      "meta": {}
-    },
-    {
-      "filename": "load-balance.md",
-      "link": "/zh-cn/docs/dev/impls/load-balance.html",
-      "meta": {}
-    },
-    {
-      "filename": "logger-adapter.md",
-      "link": "/zh-cn/docs/dev/impls/logger-adapter.html",
-      "meta": {}
-    },
-    {
-      "filename": "merger.md",
-      "link": "/zh-cn/docs/dev/impls/merger.html",
-      "meta": {}
-    },
-    {
-      "filename": "monitor.md",
-      "link": "/zh-cn/docs/dev/impls/monitor.html",
-      "meta": {}
-    },
-    {
-      "filename": "networker.md",
-      "link": "/zh-cn/docs/dev/impls/networker.html",
-      "meta": {}
-    },
-    {
-      "filename": "page.md",
-      "link": "/zh-cn/docs/dev/impls/page.html",
-      "meta": {}
-    },
-    {
-      "filename": "protocol.md",
-      "link": "/zh-cn/docs/dev/impls/protocol.html",
-      "meta": {}
-    },
-    {
-      "filename": "proxy-factory.md",
-      "link": "/zh-cn/docs/dev/impls/proxy-factory.html",
-      "meta": {}
-    },
-    {
-      "filename": "registry.md",
-      "link": "/zh-cn/docs/dev/impls/registry.html",
-      "meta": {}
-    },
-    {
-      "filename": "remoting.md",
-      "link": "/zh-cn/docs/dev/impls/remoting.html",
-      "meta": {}
-    },
-    {
-      "filename": "router.md",
-      "link": "/zh-cn/docs/dev/impls/router.html",
-      "meta": {}
-    },
-    {
-      "filename": "serialize.md",
-      "link": "/zh-cn/docs/dev/impls/serialize.html",
-      "meta": {}
-    },
-    {
-      "filename": "status-checker.md",
-      "link": "/zh-cn/docs/dev/impls/status-checker.html",
-      "meta": {}
-    },
-    {
-      "filename": "telnet-handler.md",
-      "link": "/zh-cn/docs/dev/impls/telnet-handler.html",
-      "meta": {}
-    },
-    {
-      "filename": "threadpool.md",
-      "link": "/zh-cn/docs/dev/impls/threadpool.html",
-      "meta": {}
-    },
-    {
-      "filename": "validation.md",
-      "link": "/zh-cn/docs/dev/impls/validation.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/dev/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "code-detail.md",
-      "link": "/zh-cn/docs/dev/principals/code-detail.html",
-      "meta": {}
-    },
-    {
-      "filename": "configuration.md",
-      "link": "/zh-cn/docs/dev/principals/configuration.html",
-      "meta": {}
-    },
-    {
-      "filename": "dummy.md",
-      "link": "/zh-cn/docs/dev/principals/dummy.html",
-      "meta": {}
-    },
-    {
-      "filename": "expansibility.md",
-      "link": "/zh-cn/docs/dev/principals/expansibility.html",
-      "meta": {}
-    },
-    {
-      "filename": "extension.md",
-      "link": "/zh-cn/docs/dev/principals/extension.html",
-      "meta": {}
-    },
-    {
-      "filename": "general-knowledge.md",
-      "link": "/zh-cn/docs/dev/principals/general-knowledge.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/dev/principals/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "robustness.md",
-      "link": "/zh-cn/docs/dev/principals/robustness.html",
-      "meta": {}
-    },
-    {
-      "filename": "release.md",
-      "link": "/zh-cn/docs/dev/release.html",
-      "meta": {}
-    },
-    {
-      "filename": "apache-dubbo-page_dev.md",
-      "link": "/zh-cn/docs/developers/committer-guide/apache-dubbo-page_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "label-an-issue-guide_dev.md",
-      "link": "/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "new-committer-guide_dev.md",
-      "link": "/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "release-guide_dev.md",
-      "link": "/zh-cn/docs/developers/committer-guide/release-guide_dev.html",
-      "meta": {
-        "title": "如何准备Apache Release",
-        "keywords": "Dubbo, Apache, Release"
-      }
-    },
-    {
-      "filename": "website-guide_dev.md",
-      "link": "/zh-cn/docs/developers/committer-guide/website-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "become-a-committer_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/become-a-committer_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "cla-signing-guide_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-extension-guide_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "mailing-list-subscription-guide_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "new-contributor-guide_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "reporting-security-issues_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/reporting-security-issues_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "software-donation-guide_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "test-coverage-guide_dev.md",
-      "link": "/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "developers_dev.md",
-      "link": "/zh-cn/docs/developers/developers_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "guide_dev.md",
-      "link": "/zh-cn/docs/developers/guide_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "faq_dev.md",
-      "link": "/zh-cn/docs/developers/user-guide/faq_dev.html",
-      "meta": {}
-    },
-    {
-      "filename": "adaptive-extension.md",
-      "link": "/zh-cn/docs/source_code_guide/adaptive-extension.html",
-      "meta": {
-        "title": "SPI 自适应拓展",
-        "keywords": "Dubbo, SPI, Adaptive Extension",
-        "description": "本文介绍了自适应拓展的原理和实现细节"
-      }
-    },
-    {
-      "filename": "cluster.md",
-      "link": "/zh-cn/docs/source_code_guide/cluster.html",
-      "meta": {
-        "title": "集群",
-        "keywords": "Dubbo, Cluster",
-        "description": "本文介绍了集群的原理和实现细节"
-      }
-    },
-    {
-      "filename": "directory.md",
-      "link": "/zh-cn/docs/source_code_guide/directory.html",
-      "meta": {
-        "title": "服务目录",
-        "keywords": "Dubbo, Directory",
-        "description": "本文介绍了服务目录的原理和实现细节"
-      }
-    },
-    {
-      "filename": "dubbo-spi.md",
-      "link": "/zh-cn/docs/source_code_guide/dubbo-spi.html",
-      "meta": {
-        "title": "Dubbo SPI",
-        "keywords": "Dubbo, SPI",
-        "description": "本文介绍了 Dubbo SPI 的原理和实现细节"
-      }
-    },
-    {
-      "filename": "export-service.md",
-      "link": "/zh-cn/docs/source_code_guide/export-service.html",
-      "meta": {
-        "title": "服务导出",
-        "keywords": "Dubbo, service, export",
-        "description": "本文介绍了 Dubbo 服务导出的过程和实现细节"
-      }
-    },
-    {
-      "filename": "loadbalance.md",
-      "link": "/zh-cn/docs/source_code_guide/loadbalance.html",
-      "meta": {
-        "title": "负载均衡",
-        "keywords": "Dubbo, LoadBalance",
-        "description": "本文介绍了集群的原理和实现细节"
-      }
-    },
-    {
-      "filename": "refer-service.md",
-      "link": "/zh-cn/docs/source_code_guide/refer-service.html",
-      "meta": {
-        "title": "服务引用",
-        "keywords": "Dubbo, service, refer",
-        "description": "本文介绍了 Dubbo 服务引用的过程和实现细节"
-      }
-    },
-    {
-      "filename": "router.md",
-      "link": "/zh-cn/docs/source_code_guide/router.html",
-      "meta": {
-        "title": "服务路由",
-        "keywords": "Dubbo, Router",
-        "description": "本文介绍了服务\b路由的原理和实现细节"
-      }
-    },
-    {
-      "filename": "service-invoking-process.md",
-      "link": "/zh-cn/docs/source_code_guide/service-invoking-process.html",
-      "meta": {
-        "title": "服务调用过程",
-        "keywords": "Dubbo, Service",
-        "description": "本文介绍了服务调用过程\b的原理和实现细节"
-      }
-    },
-    {
-      "filename": "README.md",
-      "link": "/zh-cn/docs/user/README.html",
-      "meta": {}
-    },
-    {
-      "filename": "SUMMARY.md",
-      "link": "/zh-cn/docs/user/SUMMARY.html",
-      "meta": {}
-    },
-    {
-      "filename": "benchmark-tool.md",
-      "link": "/zh-cn/docs/user/benchmark-tool.html",
-      "meta": {}
-    },
-    {
-      "filename": "best-practice.md",
-      "link": "/zh-cn/docs/user/best-practice.html",
-      "meta": {
-        "title": "服务化最佳实践",
-        "keywords": "分包, 粒度, 版本, 兼容性, 枚举, 序列化,异常",
-        "description": "Dubbo 最佳实践"
-      }
-    },
-    {
-      "filename": "capacity-plan.md",
-      "link": "/zh-cn/docs/user/capacity-plan.html",
-      "meta": {
-        "title": "容量规划",
-        "keywords": "容量规划",
-        "description": "Dubbo 应用容量规划参考"
-      }
-    },
-    {
-      "filename": "annotation.md",
-      "link": "/zh-cn/docs/user/configuration/annotation.html",
-      "meta": {}
-    },
-    {
-      "filename": "api.md",
-      "link": "/zh-cn/docs/user/configuration/api.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-center.md",
-      "link": "/zh-cn/docs/user/configuration/config-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "configuration-load-process.md",
-      "link": "/zh-cn/docs/user/configuration/configuration-load-process.html",
-      "meta": {}
-    },
-    {
-      "filename": "environment-variables.md",
-      "link": "/zh-cn/docs/user/configuration/environment-variables.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/zh-cn/docs/user/configuration/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "properties-deprecated.md",
-      "link": "/zh-cn/docs/user/configuration/properties-deprecated.html",
-      "meta": {}
-    },
-    {
-      "filename": "xml.md",
-      "link": "/zh-cn/docs/user/configuration/xml.html",
-      "meta": {}
-    },
-    {
-      "filename": "coveragence.md",
-      "link": "/zh-cn/docs/user/coveragence.html",
-      "meta": {}
-    },
-    {
-      "filename": "accesslog.md",
-      "link": "/zh-cn/docs/user/demos/accesslog.html",
-      "meta": {}
-    },
-    {
-      "filename": "async-call-deprecated.md",
-      "link": "/zh-cn/docs/user/demos/async-call-deprecated.html",
-      "meta": {}
-    },
-    {
-      "filename": "async-call.md",
-      "link": "/zh-cn/docs/user/demos/async-call.html",
-      "meta": {}
-    },
-    {
-      "filename": "async-execute-on-provider.md",
-      "link": "/zh-cn/docs/user/demos/async-execute-on-provider.html",
-      "meta": {}
-    },
-    {
-      "filename": "attachment.md",
-      "link": "/zh-cn/docs/user/demos/attachment.html",
-      "meta": {}
-    },
-    {
-      "filename": "callback-parameter.md",
-      "link": "/zh-cn/docs/user/demos/callback-parameter.html",
-      "meta": {}
-    },
-    {
-      "filename": "concurrency-control.md",
-      "link": "/zh-cn/docs/user/demos/concurrency-control.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-connections.md",
-      "link": "/zh-cn/docs/user/demos/config-connections.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-rule-deprecated.md",
-      "link": "/zh-cn/docs/user/demos/config-rule-deprecated.html",
-      "meta": {}
-    },
-    {
-      "filename": "config-rule.md",
-      "link": "/zh-cn/docs/user/demos/config-rule.html",
-      "meta": {}
-    },
-    {
-      "filename": "context.md",
-      "link": "/zh-cn/docs/user/demos/context.html",
-      "meta": {}
-    },
-    {
-      "filename": "delay-publish.md",
-      "link": "/zh-cn/docs/user/demos/delay-publish.html",
-      "meta": {}
-    },
-    {
-      "filename": "distributed-transaction.md",
-      "link": "/zh-cn/docs/user/demos/distributed-transaction.html",
-      "meta": {}
-    },
-    {
-      "filename": "dump.md",
-      "link": "/zh-cn/docs/user/demos/dump.html",
-      "meta": {}
-    },
-    {
-      "filename": "echo-service.md",
-      "link": "/zh-cn/docs/user/demos/echo-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "events-notify.md",
-      "link": "/zh-cn/docs/user/demos/events-notify.html",
-      "meta": {}
-    },
-    {
-      "filename": "explicit-target.md",
-      "link": "/zh-cn/docs/user/demos/explicit-target.html",
-      "meta": {}
-    },
-    {
-      "filename": "fault-tolerent-strategy.md",
-      "link": "/zh-cn/docs/user/demos/fault-tolerent-strategy.html",
-      "meta": {}
-    },
-    {
-      "filename": "generic-reference.md",
-      "link": "/zh-cn/docs/user/demos/generic-reference.html",
-      "meta": {}
-    },
-    {
-      "filename": "generic-service.md",
-      "link": "/zh-cn/docs/user/demos/generic-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "graceful-shutdown.md",
-      "link": "/zh-cn/docs/user/demos/graceful-shutdown.html",
-      "meta": {}
-    },
-    {
-      "filename": "group-merger.md",
-      "link": "/zh-cn/docs/user/demos/group-merger.html",
-      "meta": {}
-    },
-    {
-      "filename": "hostname-binding.md",
-      "link": "/zh-cn/docs/user/demos/hostname-binding.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/zh-cn/docs/user/demos/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/user/demos/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "lazy-connect.md",
-      "link": "/zh-cn/docs/user/demos/lazy-connect.html",
-      "meta": {}
-    },
-    {
-      "filename": "loadbalance.md",
-      "link": "/zh-cn/docs/user/demos/loadbalance.html",
-      "meta": {}
-    },
-    {
-      "filename": "local-call.md",
-      "link": "/zh-cn/docs/user/demos/local-call.html",
-      "meta": {}
-    },
-    {
-      "filename": "local-mock.md",
-      "link": "/zh-cn/docs/user/demos/local-mock.html",
-      "meta": {}
-    },
-    {
-      "filename": "local-stub.md",
-      "link": "/zh-cn/docs/user/demos/local-stub.html",
-      "meta": {}
-    },
-    {
-      "filename": "logger-strategy.md",
-      "link": "/zh-cn/docs/user/demos/logger-strategy.html",
-      "meta": {}
-    },
-    {
-      "filename": "multi-protocols.md",
-      "link": "/zh-cn/docs/user/demos/multi-protocols.html",
-      "meta": {}
-    },
-    {
-      "filename": "multi-registry.md",
-      "link": "/zh-cn/docs/user/demos/multi-registry.html",
-      "meta": {}
-    },
-    {
-      "filename": "multi-versions.md",
-      "link": "/zh-cn/docs/user/demos/multi-versions.html",
-      "meta": {}
-    },
-    {
-      "filename": "netty4.md",
-      "link": "/zh-cn/docs/user/demos/netty4.html",
-      "meta": {}
-    },
-    {
-      "filename": "parameter-validation.md",
-      "link": "/zh-cn/docs/user/demos/parameter-validation.html",
-      "meta": {}
-    },
-    {
-      "filename": "preflight-check.md",
-      "link": "/zh-cn/docs/user/demos/preflight-check.html",
-      "meta": {}
-    },
-    {
-      "filename": "reference-config-cache.md",
-      "link": "/zh-cn/docs/user/demos/reference-config-cache.html",
-      "meta": {}
-    },
-    {
-      "filename": "registry-only.md",
-      "link": "/zh-cn/docs/user/demos/registry-only.html",
-      "meta": {}
-    },
-    {
-      "filename": "result-cache.md",
-      "link": "/zh-cn/docs/user/demos/result-cache.html",
-      "meta": {}
-    },
-    {
-      "filename": "routing-rule-deprecated.md",
-      "link": "/zh-cn/docs/user/demos/routing-rule-deprecated.html",
-      "meta": {}
-    },
-    {
-      "filename": "routing-rule.md",
-      "link": "/zh-cn/docs/user/demos/routing-rule.html",
-      "meta": {}
-    },
-    {
-      "filename": "serialization.md",
-      "link": "/zh-cn/docs/user/demos/serialization.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-container.md",
-      "link": "/zh-cn/docs/user/demos/service-container.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-downgrade.md",
-      "link": "/zh-cn/docs/user/demos/service-downgrade.html",
-      "meta": {}
-    },
-    {
-      "filename": "service-group.md",
-      "link": "/zh-cn/docs/user/demos/service-group.html",
-      "meta": {}
-    },
-    {
-      "filename": "set-host.md",
-      "link": "/zh-cn/docs/user/demos/set-host.html",
-      "meta": {}
-    },
-    {
-      "filename": "simplify-registry-data.md",
-      "link": "/zh-cn/docs/user/demos/simplify-registry-data.html",
-      "meta": {}
-    },
-    {
-      "filename": "static-service.md",
-      "link": "/zh-cn/docs/user/demos/static-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "stickiness.md",
-      "link": "/zh-cn/docs/user/demos/stickiness.html",
-      "meta": {}
-    },
-    {
-      "filename": "subscribe-only.md",
-      "link": "/zh-cn/docs/user/demos/subscribe-only.html",
-      "meta": {}
-    },
-    {
-      "filename": "thread-model.md",
-      "link": "/zh-cn/docs/user/demos/thread-model.html",
-      "meta": {}
-    },
-    {
-      "filename": "token-authorization.md",
-      "link": "/zh-cn/docs/user/demos/token-authorization.html",
-      "meta": {}
-    },
-    {
-      "filename": "dependencies.md",
-      "link": "/zh-cn/docs/user/dependencies.html",
-      "meta": {
-        "title": "依赖",
-        "keywords": "必须依赖, 缺省依赖, 可选依赖",
-        "description": "Dubbo 依赖基本介绍"
-      }
-    },
-    {
-      "filename": "reference.md",
-      "link": "/zh-cn/docs/user/languages/erlang/reference.html",
-      "meta": {}
-    },
-    {
-      "filename": "serialization.md",
-      "link": "/zh-cn/docs/user/languages/erlang/serialization.html",
-      "meta": {}
-    },
-    {
-      "filename": "service.md",
-      "link": "/zh-cn/docs/user/languages/erlang/service.html",
-      "meta": {}
-    },
-    {
-      "filename": "start.md",
-      "link": "/zh-cn/docs/user/languages/erlang/start.html",
-      "meta": {}
-    },
-    {
-      "filename": "maturity.md",
-      "link": "/zh-cn/docs/user/maturity.html",
-      "meta": {
-        "title": "成熟度",
-        "keywords": "功能成熟度, 策略成熟度",
-        "description": "介绍 Dubbo 各个功能、策略的成熟度"
-      }
-    },
-    {
-      "filename": "perf-test.md",
-      "link": "/zh-cn/docs/user/perf-test.html",
-      "meta": {
-        "title": "性能测试报告",
-        "keywords": "性能测试",
-        "description": "Dubbo 2.0 性能测试报告"
-      }
-    },
-    {
-      "filename": "architecture.md",
-      "link": "/zh-cn/docs/user/preface/architecture.html",
-      "meta": {}
-    },
-    {
-      "filename": "background.md",
-      "link": "/zh-cn/docs/user/preface/background.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/zh-cn/docs/user/preface/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "requirements.md",
-      "link": "/zh-cn/docs/user/preface/requirements.html",
-      "meta": {}
-    },
-    {
-      "filename": "usage.md",
-      "link": "/zh-cn/docs/user/preface/usage.html",
-      "meta": {}
-    },
-    {
-      "filename": "quick-start.md",
-      "link": "/zh-cn/docs/user/quick-start.html",
-      "meta": {
-        "title": "快速启动",
-        "keywords": "XML configuration, Consumer, Provider",
-        "description": "使用 XML 配置方式快速上手 Dubbo"
-      }
-    },
-    {
-      "filename": "recommend.md",
-      "link": "/zh-cn/docs/user/recommend.html",
-      "meta": {
-        "title": "推荐用法",
-        "keywords": "Provider 配置, 管理信息, 缓存, 监控",
-        "description": "Dubbo 推荐用法举例"
-      }
-    },
-    {
-      "filename": "api.md",
-      "link": "/zh-cn/docs/user/references/api.html",
-      "meta": {}
-    },
-    {
-      "filename": "maven.md",
-      "link": "/zh-cn/docs/user/references/maven.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/user/references/metadata/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "metadata-redis.md",
-      "link": "/zh-cn/docs/user/references/metadata/metadata-redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "metadata-zookeeper.md",
-      "link": "/zh-cn/docs/user/references/metadata/metadata-zookeeper.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo.md",
-      "link": "/zh-cn/docs/user/references/protocol/dubbo.html",
-      "meta": {}
-    },
-    {
-      "filename": "hessian.md",
-      "link": "/zh-cn/docs/user/references/protocol/hessian.html",
-      "meta": {}
-    },
-    {
-      "filename": "http.md",
-      "link": "/zh-cn/docs/user/references/protocol/http.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/user/references/protocol/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "memcached.md",
-      "link": "/zh-cn/docs/user/references/protocol/memcached.html",
-      "meta": {}
-    },
-    {
-      "filename": "redis.md",
-      "link": "/zh-cn/docs/user/references/protocol/redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "rest.md",
-      "link": "/zh-cn/docs/user/references/protocol/rest.html",
-      "meta": {}
-    },
-    {
-      "filename": "rmi.md",
-      "link": "/zh-cn/docs/user/references/protocol/rmi.html",
-      "meta": {}
-    },
-    {
-      "filename": "thrift.md",
-      "link": "/zh-cn/docs/user/references/protocol/thrift.html",
-      "meta": {}
-    },
-    {
-      "filename": "webservice.md",
-      "link": "/zh-cn/docs/user/references/protocol/webservice.html",
-      "meta": {}
-    },
-    {
-      "filename": "qos.md",
-      "link": "/zh-cn/docs/user/references/qos.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/user/references/registry/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "multicast.md",
-      "link": "/zh-cn/docs/user/references/registry/multicast.html",
-      "meta": {}
-    },
-    {
-      "filename": "nacos.md",
-      "link": "/zh-cn/docs/user/references/registry/nacos.html",
-      "meta": {}
-    },
-    {
-      "filename": "redis.md",
-      "link": "/zh-cn/docs/user/references/registry/redis.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple.md",
-      "link": "/zh-cn/docs/user/references/registry/simple.html",
-      "meta": {}
-    },
-    {
-      "filename": "zookeeper.md",
-      "link": "/zh-cn/docs/user/references/registry/zookeeper.html",
-      "meta": {}
-    },
-    {
-      "filename": "telnet.md",
-      "link": "/zh-cn/docs/user/references/telnet.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-application.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-application.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-argument.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-argument.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-config-center.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-config-center.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-consumer.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-consumer.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-method.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-method.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-module.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-module.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-monitor.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-monitor.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-parameter.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-parameter.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-protocol.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-protocol.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-provider.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-provider.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-reference.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-reference.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-registry.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-registry.html",
-      "meta": {}
-    },
-    {
-      "filename": "dubbo-service.md",
-      "link": "/zh-cn/docs/user/references/xml/dubbo-service.html",
-      "meta": {}
-    },
-    {
-      "filename": "introduction.md",
-      "link": "/zh-cn/docs/user/references/xml/introduction.html",
-      "meta": {}
-    },
-    {
-      "filename": "rest.md",
-      "link": "/zh-cn/docs/user/rest.html",
-      "meta": {
-        "title": "在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)",
-        "keywords": "RESTful Remoting, REST",
-        "description": "在 Dubbo 中开发 REST 风格的远程调用"
-      }
-    },
-    {
-      "filename": "serialization.md",
-      "link": "/zh-cn/docs/user/serialization.html",
-      "meta": {}
-    },
-    {
-      "filename": "simple-monitor.md",
-      "link": "/zh-cn/docs/user/simple-monitor.html",
-      "meta": {}
-    },
-    {
-      "filename": "index.md",
-      "link": "/zh-cn/docs/user/versions/index.html",
-      "meta": {}
-    },
-    {
-      "filename": "version-270.md",
-      "link": "/zh-cn/docs/user/versions/version-270.html",
-      "meta": {}
-    }
-  ]
-}
\ No newline at end of file


[dubbo-website] 02/03: update gitignore

Posted by wa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wangxin pushed a commit to branch ecology-page
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git

commit 962cefd1f32039f4a8568eca558e60c8e008476b
Author: Xin Wang <xi...@gmail.com>
AuthorDate: Tue Aug 13 21:39:41 2019 +0800

    update gitignore
---
 .gitignore                                         |   10 +-
 en-us/blog/apachecon-na-2018.json                  |   10 +
 en-us/blog/download.json                           |   10 +
 en-us/blog/dubbo-101.json                          |   10 +
 en-us/blog/dubbo-annotation.json                   |   10 +
 ...o-basic-usage-dubbo-provider-configuration.json |   10 +
 en-us/blog/dubbo-fescar.json                       |   10 +
 en-us/blog/dubbo-generic-invoke.json               |   10 +
 en-us/blog/dubbo-invoke.json                       |   10 +
 en-us/blog/dubbo-k8s.json                          |   10 +
 en-us/blog/dubbo-loadbalance.json                  |   10 +
 en-us/blog/dubbo-meetup-beijing-may-12th-2018.json |   10 +
 en-us/blog/dubbo-meetup-chengdu.json               |   10 +
 en-us/blog/dubbo-meetup-hangzhou.json              |   10 +
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.json  |   10 +
 en-us/blog/dubbo-meetup-shenzhen.json              |   10 +
 en-us/blog/dubbo-new-async.json                    |   10 +
 en-us/blog/gsoc-2018.json                          |   10 +
 en-us/blog/introduction-to-dubbo-spi-2.json        |   10 +
 en-us/blog/introduction-to-dubbo-spi.json          |   10 +
 en-us/blog/prepare-an-apache-release.json          |   10 +
 en-us/blog/qcon-beijing-2018.json                  |   10 +
 en-us/blog/sentinel-introduction-for-dubbo.json    |   10 +
 .../spring-boot-dubbo-start-stop-analysis.json     |   10 +
 en-us/blog/tracing-with-skywalking.json            |   10 +
 en-us/docs/admin/README.json                       |    6 +
 en-us/docs/admin/SUMMARY.json                      |    6 +
 en-us/docs/admin/install/admin-console.json        |    6 +
 en-us/docs/admin/install/consumer-demo.json        |    6 +
 en-us/docs/admin/install/introduction.json         |    6 +
 en-us/docs/admin/install/provider-demo.json        |    6 +
 en-us/docs/admin/install/redis.json                |    6 +
 .../docs/admin/install/simple-monitor-center.json  |    6 +
 .../docs/admin/install/simple-registry-center.json |    6 +
 en-us/docs/admin/ops/dubbo-ops.json                |    6 +
 en-us/docs/admin/ops/introduction.json             |    6 +
 en-us/docs/admin/ops/skywalking.json               |    6 +
 en-us/docs/admin/serviceGovernance.json            |    6 +
 en-us/docs/admin/serviceSearch.json                |    6 +
 en-us/docs/admin/serviceTest.json                  |    6 +
 en-us/docs/dev/README.json                         |    6 +
 en-us/docs/dev/SUMMARY.json                        |    6 +
 en-us/docs/dev/TCK.json                            |    6 +
 en-us/docs/dev/build.json                          |    6 +
 en-us/docs/dev/checklist.json                      |    6 +
 en-us/docs/dev/code-smell.json                     |    6 +
 en-us/docs/dev/coding.json                         |    6 +
 en-us/docs/dev/contract.json                       |    6 +
 en-us/docs/dev/contribution.json                   |    6 +
 en-us/docs/dev/design.json                         |    6 +
 en-us/docs/dev/implementation.json                 |    6 +
 en-us/docs/dev/impls/introduction.json             |    6 +
 en-us/docs/dev/introduction.json                   |    6 +
 en-us/docs/dev/principals/code-detail.json         |    6 +
 en-us/docs/dev/principals/configuration.json       |    6 +
 en-us/docs/dev/principals/dummy.json               |    6 +
 en-us/docs/dev/principals/expansibility.json       |    6 +
 en-us/docs/dev/principals/extension.json           |    6 +
 en-us/docs/dev/principals/general-knowledge.json   |    6 +
 en-us/docs/dev/principals/introduction.json        |    6 +
 en-us/docs/dev/principals/robustness.json          |    6 +
 en-us/docs/dev/release.json                        |    6 +
 .../committer-guide/apache-dubbo-page_dev.json     |    6 +
 .../committer-guide/label-an-issue-guide_dev.json  |    6 +
 .../committer-guide/new-committer-guide_dev.json   |    6 +
 .../committer-guide/website-guide_dev.json         |    6 +
 .../contributor-guide/become-a-committer_dev.json  |    6 +
 .../contributor-guide/cla-signing-guide_dev.json   |    6 +
 .../dubbo-extension-guide_dev.json                 |    6 +
 .../mailing-list-subscription-guide_dev.json       |    6 +
 .../new-contributor-guide_dev.json                 |    6 +
 .../reporting-security-issues_dev.json             |    6 +
 .../software-donation-guide_dev.json               |    6 +
 .../contributor-guide/test-coverage-guide_dev.json |    6 +
 en-us/docs/developers/developers_dev.json          |    6 +
 en-us/docs/developers/guide_dev.json               |    6 +
 en-us/docs/developers/user-guide/faq_dev.json      |    6 +
 en-us/docs/user/README.json                        |    6 +
 en-us/docs/user/SUMMARY.json                       |    6 +
 en-us/docs/user/benchmark-tool.json                |    6 +
 en-us/docs/user/best-practice.json                 |    6 +
 en-us/docs/user/capacity-plan.json                 |    6 +
 en-us/docs/user/configuration/annotation.json      |    6 +
 en-us/docs/user/configuration/api.json             |    6 +
 en-us/docs/user/configuration/index.json           |    6 +
 en-us/docs/user/coveragence.json                   |    6 +
 en-us/docs/user/demos/accesslog.json               |    6 +
 en-us/docs/user/demos/async-call.json              |    6 +
 en-us/docs/user/demos/attachment.json              |    6 +
 en-us/docs/user/demos/callback-parameter.json      |    6 +
 en-us/docs/user/demos/concurrency-control.json     |    6 +
 en-us/docs/user/demos/config-connections.json      |    6 +
 en-us/docs/user/demos/config-rule.json             |    6 +
 en-us/docs/user/demos/context.json                 |    6 +
 en-us/docs/user/demos/delay-publish.json           |    6 +
 en-us/docs/user/demos/distributed-transaction.json |    6 +
 en-us/docs/user/demos/echo-service.json            |    6 +
 en-us/docs/user/demos/events-notify.json           |    6 +
 en-us/docs/user/demos/fault-tolerent-strategy.json |    6 +
 en-us/docs/user/demos/generic-reference.json       |    6 +
 en-us/docs/user/demos/generic-service.json         |    6 +
 en-us/docs/user/demos/group-merger.json            |    6 +
 en-us/docs/user/demos/index.json                   |    6 +
 en-us/docs/user/demos/introduction.json            |    6 +
 en-us/docs/user/demos/lazy-connect.json            |    6 +
 en-us/docs/user/demos/loadbalance.json             |    6 +
 en-us/docs/user/demos/local-mock.json              |    6 +
 en-us/docs/user/demos/local-stub.json              |    6 +
 en-us/docs/user/demos/multi-versions.json          |    6 +
 en-us/docs/user/demos/netty4.json                  |    6 +
 en-us/docs/user/demos/parameter-validation.json    |    6 +
 en-us/docs/user/demos/reference-config-cache.json  |    6 +
 en-us/docs/user/demos/registry-only.json           |    6 +
 en-us/docs/user/demos/result-cache.json            |    6 +
 en-us/docs/user/demos/routing-rule.json            |    6 +
 en-us/docs/user/demos/serialization.json           |    6 +
 en-us/docs/user/demos/service-downgrade.json       |    6 +
 en-us/docs/user/demos/service-group.json           |    6 +
 en-us/docs/user/demos/static-service.json          |    6 +
 en-us/docs/user/demos/stickiness.json              |    6 +
 en-us/docs/user/demos/subscribe-only.json          |    6 +
 en-us/docs/user/demos/thread-model.json            |    6 +
 en-us/docs/user/demos/token-authorization.json     |    6 +
 en-us/docs/user/dependencies.json                  |    6 +
 en-us/docs/user/languages/erlang/reference.html    |   45 +
 en-us/docs/user/languages/erlang/reference.json    |    6 +
 .../docs/user/languages/erlang/serialization.html  |   59 +
 .../docs/user/languages/erlang/serialization.json  |    6 +
 en-us/docs/user/languages/erlang/service.html      |   75 +
 en-us/docs/user/languages/erlang/service.json      |    6 +
 en-us/docs/user/languages/erlang/start.html        |   78 +
 en-us/docs/user/languages/erlang/start.json        |    6 +
 en-us/docs/user/maturity.json                      |    6 +
 en-us/docs/user/perf-test.json                     |    6 +
 en-us/docs/user/preface/architecture.json          |    6 +
 en-us/docs/user/preface/background.json            |    6 +
 en-us/docs/user/preface/index.json                 |    6 +
 en-us/docs/user/preface/requirements.json          |    6 +
 en-us/docs/user/preface/usage.json                 |    6 +
 en-us/docs/user/recommend.json                     |    6 +
 en-us/docs/user/references/api.json                |    6 +
 en-us/docs/user/references/maven.json              |    6 +
 en-us/docs/user/references/protocol/dubbo.json     |    6 +
 en-us/docs/user/references/protocol/hessian.json   |    6 +
 en-us/docs/user/references/protocol/http.json      |    6 +
 .../user/references/protocol/introduction.json     |    6 +
 en-us/docs/user/references/protocol/memcached.json |    6 +
 en-us/docs/user/references/protocol/redis.json     |    6 +
 en-us/docs/user/references/protocol/rest.json      |    6 +
 en-us/docs/user/references/protocol/thrift.json    |    6 +
 .../docs/user/references/protocol/webservice.json  |    6 +
 .../user/references/registry/introduction.json     |    6 +
 en-us/docs/user/references/registry/multicast.json |    6 +
 en-us/docs/user/references/registry/nacos.html     |  111 +
 en-us/docs/user/references/registry/nacos.json     |    6 +
 en-us/docs/user/references/registry/redis.json     |    6 +
 en-us/docs/user/references/registry/zookeeper.json |    6 +
 en-us/docs/user/references/telnet.json             |    6 +
 .../user/references/xml/dubbo-application.json     |    6 +
 en-us/docs/user/references/xml/dubbo-argument.json |    6 +
 en-us/docs/user/references/xml/dubbo-consumer.json |    6 +
 en-us/docs/user/references/xml/dubbo-method.json   |    6 +
 en-us/docs/user/references/xml/dubbo-module.json   |    6 +
 en-us/docs/user/references/xml/dubbo-monitor.json  |    6 +
 .../docs/user/references/xml/dubbo-parameter.json  |    6 +
 en-us/docs/user/references/xml/dubbo-protocol.json |    6 +
 en-us/docs/user/references/xml/dubbo-provider.json |    6 +
 .../docs/user/references/xml/dubbo-reference.json  |    6 +
 en-us/docs/user/references/xml/dubbo-registry.json |    6 +
 en-us/docs/user/references/xml/dubbo-service.json  |    6 +
 en-us/docs/user/references/xml/introduction.json   |    6 +
 en-us/docs/user/rest.json                          |    6 +
 en-us/docs/user/simple-monitor.json                |    6 +
 index.html                                         |   33 +
 md_json/blog.json                                  |  771 +++++++
 md_json/docs.json                                  | 2110 ++++++++++++++++++++
 zh-cn/blog/apachecon-na-2018.json                  |   10 +
 .../blog/build-new-docker-image-in-dockerhub.html  |   73 +
 .../blog/build-new-docker-image-in-dockerhub.json  |   10 +
 zh-cn/blog/download.json                           |   10 +
 zh-cn/blog/dubbo-101.json                          |   10 +
 zh-cn/blog/dubbo-27-features.json                  |   10 +
 zh-cn/blog/dubbo-annotation.json                   |   10 +
 ...o-basic-usage-dubbo-consumer-configuration.json |    6 +
 ...o-basic-usage-dubbo-provider-configuration.json |   10 +
 zh-cn/blog/dubbo-cluster-error-handling.json       |   10 +
 zh-cn/blog/dubbo-compatible.json                   |   10 +
 zh-cn/blog/dubbo-context-information.json          |   10 +
 zh-cn/blog/dubbo-contribute-to-opensource.html     |  157 ++
 zh-cn/blog/dubbo-contribute-to-opensource.json     |   10 +
 zh-cn/blog/dubbo-copywriting-style.json            |   10 +
 zh-cn/blog/dubbo-echo-test.json                    |    6 +
 zh-cn/blog/dubbo-fescar.json                       |   10 +
 zh-cn/blog/dubbo-generic-invoke.json               |   10 +
 zh-cn/blog/dubbo-gracefully-shutdown.json          |   10 +
 zh-cn/blog/dubbo-heartbeat-design.json             |   10 +
 zh-cn/blog/dubbo-integrate-with-hystrix.json       |   10 +
 zh-cn/blog/dubbo-invoke.json                       |   10 +
 zh-cn/blog/dubbo-k8s.json                          |   10 +
 zh-cn/blog/dubbo-loadbalance.json                  |   10 +
 zh-cn/blog/dubbo-local-call.json                   |    6 +
 zh-cn/blog/dubbo-meet-arthas.json                  |   10 +
 zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.json |   10 +
 zh-cn/blog/dubbo-meetup-chengdu.json               |   10 +
 zh-cn/blog/dubbo-meetup-hangzhou.json              |   10 +
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.json  |   10 +
 zh-cn/blog/dubbo-meetup-shenzhen.json              |   10 +
 zh-cn/blog/dubbo-mesh-in-thinking.json             |   10 +
 zh-cn/blog/dubbo-mesh-service-mesh-exploring.json  |   10 +
 zh-cn/blog/dubbo-network-interfaces.html           |  406 ++++
 zh-cn/blog/dubbo-network-interfaces.json           |   10 +
 zh-cn/blog/dubbo-new-async.json                    |   10 +
 zh-cn/blog/dubbo-protocol.json                     |   10 +
 zh-cn/blog/dubbo-stub-mock.json                    |    6 +
 zh-cn/blog/dubboAsync_client.json                  |   10 +
 zh-cn/blog/dubboAsync_server.json                  |   10 +
 zh-cn/blog/first-dubbo-filter.json                 |    6 +
 zh-cn/blog/gsoc-2018.html                          |   34 +
 zh-cn/blog/gsoc-2018.json                          |   10 +
 zh-cn/blog/how-to-involve-dubbo-community.json     |   10 +
 zh-cn/blog/introduction-to-dubbo-spi-2.json        |   10 +
 zh-cn/blog/introduction-to-dubbo-spi.json          |   10 +
 zh-cn/blog/introduction-to-dubbo-url.json          |   10 +
 zh-cn/blog/meet-dubbo.json                         |   10 +
 zh-cn/blog/optimization-branch-prediction.json     |    8 +
 zh-cn/blog/prepare-an-apache-release.json          |   10 +
 zh-cn/blog/qcon-beijing-2018.json                  |   10 +
 zh-cn/blog/sentinel-introduction-for-dubbo.json    |   10 +
 zh-cn/blog/service-and-version.json                |    6 +
 zh-cn/blog/service-test.json                       |    6 +
 .../spring-boot-dubbo-start-stop-analysis.json     |   10 +
 zh-cn/blog/test-verification.json                  |    6 +
 zh-cn/blog/tracing-with-skywalking.json            |   10 +
 zh-cn/blog/use-zipkin-in-dubbo.json                |   10 +
 zh-cn/docs/admin/README.json                       |    6 +
 zh-cn/docs/admin/SUMMARY.json                      |    6 +
 zh-cn/docs/admin/install/admin-console.json        |    6 +
 zh-cn/docs/admin/install/consumer-demo.json        |    6 +
 zh-cn/docs/admin/install/introduction.json         |    6 +
 zh-cn/docs/admin/install/provider-demo.json        |    6 +
 zh-cn/docs/admin/install/redis.json                |    6 +
 .../docs/admin/install/simple-monitor-center.json  |    6 +
 .../docs/admin/install/simple-registry-center.json |    6 +
 zh-cn/docs/admin/ops/dubbo-ops.json                |    6 +
 zh-cn/docs/admin/ops/introduction.json             |    6 +
 zh-cn/docs/admin/ops/skywalking.json               |    6 +
 zh-cn/docs/admin/serviceGovernance.json            |    6 +
 zh-cn/docs/admin/serviceSearch.json                |    6 +
 zh-cn/docs/admin/serviceTest.json                  |    6 +
 zh-cn/docs/dev/README.json                         |    6 +
 zh-cn/docs/dev/SUMMARY.json                        |    6 +
 zh-cn/docs/dev/TCK.json                            |    6 +
 zh-cn/docs/dev/build.json                          |    6 +
 zh-cn/docs/dev/checklist.json                      |    6 +
 zh-cn/docs/dev/code-smell.json                     |    6 +
 zh-cn/docs/dev/coding.json                         |    6 +
 zh-cn/docs/dev/contract.json                       |    6 +
 zh-cn/docs/dev/contribution.json                   |    6 +
 zh-cn/docs/dev/design.json                         |    6 +
 zh-cn/docs/dev/implementation.json                 |    6 +
 zh-cn/docs/dev/impls/config-center.html            |  116 ++
 zh-cn/docs/dev/impls/config-center.json            |    6 +
 zh-cn/docs/dev/impls/introduction.json             |    6 +
 zh-cn/docs/dev/introduction.json                   |    6 +
 zh-cn/docs/dev/principals/code-detail.json         |    6 +
 zh-cn/docs/dev/principals/configuration.json       |    6 +
 zh-cn/docs/dev/principals/dummy.json               |    6 +
 zh-cn/docs/dev/principals/expansibility.json       |    6 +
 zh-cn/docs/dev/principals/extension.json           |    6 +
 zh-cn/docs/dev/principals/general-knowledge.json   |    6 +
 zh-cn/docs/dev/principals/introduction.json        |    6 +
 zh-cn/docs/dev/principals/robustness.json          |    6 +
 zh-cn/docs/dev/release.json                        |    6 +
 .../committer-guide/apache-dubbo-page_dev.json     |    6 +
 .../committer-guide/label-an-issue-guide_dev.json  |    6 +
 .../committer-guide/new-committer-guide_dev.json   |    6 +
 .../committer-guide/website-guide_dev.json         |    6 +
 .../contributor-guide/become-a-committer_dev.json  |    6 +
 .../contributor-guide/cla-signing-guide_dev.json   |    6 +
 .../dubbo-extension-guide_dev.json                 |    6 +
 .../mailing-list-subscription-guide_dev.json       |    6 +
 .../new-contributor-guide_dev.json                 |    6 +
 .../reporting-security-issues_dev.json             |    6 +
 .../software-donation-guide_dev.json               |    6 +
 .../contributor-guide/test-coverage-guide_dev.json |    6 +
 zh-cn/docs/developers/developers_dev.json          |    6 +
 zh-cn/docs/developers/guide_dev.json               |    6 +
 zh-cn/docs/developers/user-guide/faq_dev.json      |    6 +
 .../docs/source_code_guide/adaptive-extension.json |   10 +
 zh-cn/docs/source_code_guide/cluster.json          |   10 +
 zh-cn/docs/source_code_guide/directory.json        |   10 +
 zh-cn/docs/source_code_guide/dubbo-spi.json        |   10 +
 zh-cn/docs/source_code_guide/export-service.json   |   10 +
 zh-cn/docs/source_code_guide/loadbalance.json      |   10 +
 zh-cn/docs/source_code_guide/refer-service.json    |   10 +
 zh-cn/docs/source_code_guide/router.json           |   10 +
 .../service-invoking-process.json                  |   10 +
 zh-cn/docs/user/README.json                        |    6 +
 zh-cn/docs/user/SUMMARY.json                       |    6 +
 zh-cn/docs/user/benchmark-tool.json                |    6 +
 zh-cn/docs/user/best-practice.json                 |   10 +
 zh-cn/docs/user/capacity-plan.json                 |   10 +
 zh-cn/docs/user/configuration/api.json             |    6 +
 .../user/configuration/environment-variables.html  |   58 +
 .../user/configuration/environment-variables.json  |    6 +
 zh-cn/docs/user/configuration/index.json           |    6 +
 zh-cn/docs/user/configuration/xml.json             |    6 +
 zh-cn/docs/user/coveragence.json                   |    6 +
 zh-cn/docs/user/demos/accesslog.json               |    6 +
 zh-cn/docs/user/demos/async-call-deprecated.json   |    6 +
 zh-cn/docs/user/demos/async-call.json              |    6 +
 .../docs/user/demos/async-execute-on-provider.json |    6 +
 zh-cn/docs/user/demos/attachment.json              |    6 +
 zh-cn/docs/user/demos/callback-parameter.json      |    6 +
 zh-cn/docs/user/demos/concurrency-control.json     |    6 +
 zh-cn/docs/user/demos/config-connections.json      |    6 +
 zh-cn/docs/user/demos/config-rule-deprecated.json  |    6 +
 zh-cn/docs/user/demos/config-rule.json             |    6 +
 zh-cn/docs/user/demos/context.json                 |    6 +
 zh-cn/docs/user/demos/delay-publish.json           |    6 +
 zh-cn/docs/user/demos/distributed-transaction.json |    6 +
 zh-cn/docs/user/demos/echo-service.json            |    6 +
 zh-cn/docs/user/demos/events-notify.json           |    6 +
 zh-cn/docs/user/demos/fault-tolerent-strategy.json |    6 +
 zh-cn/docs/user/demos/generic-reference.json       |    6 +
 zh-cn/docs/user/demos/generic-service.json         |    6 +
 zh-cn/docs/user/demos/group-merger.json            |    6 +
 zh-cn/docs/user/demos/index.json                   |    6 +
 zh-cn/docs/user/demos/introduction.json            |    6 +
 zh-cn/docs/user/demos/lazy-connect.json            |    6 +
 zh-cn/docs/user/demos/loadbalance.json             |    6 +
 zh-cn/docs/user/demos/local-call.json              |    6 +
 zh-cn/docs/user/demos/local-mock.json              |    6 +
 zh-cn/docs/user/demos/local-stub.json              |    6 +
 zh-cn/docs/user/demos/logger-strategy.json         |    6 +
 zh-cn/docs/user/demos/multi-versions.json          |    6 +
 zh-cn/docs/user/demos/netty4.json                  |    6 +
 zh-cn/docs/user/demos/parameter-validation.json    |    6 +
 zh-cn/docs/user/demos/reference-config-cache.json  |    6 +
 zh-cn/docs/user/demos/registry-only.json           |    6 +
 zh-cn/docs/user/demos/result-cache.json            |    6 +
 zh-cn/docs/user/demos/routing-rule-deprecated.json |    6 +
 zh-cn/docs/user/demos/serialization.json           |    6 +
 zh-cn/docs/user/demos/service-downgrade.json       |    6 +
 zh-cn/docs/user/demos/service-group.json           |    6 +
 zh-cn/docs/user/demos/set-host.json                |    6 +
 zh-cn/docs/user/demos/static-service.json          |    6 +
 zh-cn/docs/user/demos/subscribe-only.json          |    6 +
 zh-cn/docs/user/demos/thread-model.json            |    6 +
 zh-cn/docs/user/demos/token-authorization.json     |    6 +
 zh-cn/docs/user/dependencies.json                  |   10 +
 zh-cn/docs/user/languages/erlang/reference.html    |   45 +
 zh-cn/docs/user/languages/erlang/reference.json    |    6 +
 .../docs/user/languages/erlang/serialization.html  |   60 +
 .../docs/user/languages/erlang/serialization.json  |    6 +
 zh-cn/docs/user/languages/erlang/service.html      |   75 +
 zh-cn/docs/user/languages/erlang/service.json      |    6 +
 zh-cn/docs/user/languages/erlang/start.html        |   77 +
 zh-cn/docs/user/languages/erlang/start.json        |    6 +
 zh-cn/docs/user/maturity.json                      |   10 +
 zh-cn/docs/user/perf-test.json                     |   10 +
 zh-cn/docs/user/preface/architecture.json          |    6 +
 zh-cn/docs/user/preface/background.json            |    6 +
 zh-cn/docs/user/preface/index.json                 |    6 +
 zh-cn/docs/user/preface/requirements.json          |    6 +
 zh-cn/docs/user/preface/usage.json                 |    6 +
 zh-cn/docs/user/recommend.json                     |   10 +
 zh-cn/docs/user/references/api.json                |    6 +
 zh-cn/docs/user/references/maven.json              |    6 +
 .../user/references/metadata/introduction.json     |    6 +
 .../user/references/metadata/metadata-redis.json   |    6 +
 .../references/metadata/metadata-zookeeper.json    |    6 +
 zh-cn/docs/user/references/protocol/dubbo.json     |    6 +
 zh-cn/docs/user/references/protocol/hessian.json   |    6 +
 zh-cn/docs/user/references/protocol/http.json      |    6 +
 .../user/references/protocol/introduction.json     |    6 +
 zh-cn/docs/user/references/protocol/memcached.json |    6 +
 zh-cn/docs/user/references/protocol/redis.json     |    6 +
 zh-cn/docs/user/references/protocol/rest.json      |    6 +
 zh-cn/docs/user/references/protocol/thrift.json    |    6 +
 .../docs/user/references/protocol/webservice.json  |    6 +
 .../user/references/registry/introduction.json     |    6 +
 zh-cn/docs/user/references/registry/multicast.json |    6 +
 zh-cn/docs/user/references/registry/nacos.html     |  111 +
 zh-cn/docs/user/references/registry/nacos.json     |    6 +
 zh-cn/docs/user/references/registry/redis.json     |    6 +
 zh-cn/docs/user/references/registry/zookeeper.json |    6 +
 zh-cn/docs/user/references/telnet.json             |    6 +
 .../user/references/xml/dubbo-application.json     |    6 +
 zh-cn/docs/user/references/xml/dubbo-argument.json |    6 +
 .../user/references/xml/dubbo-config-center.json   |    6 +
 zh-cn/docs/user/references/xml/dubbo-consumer.json |    6 +
 zh-cn/docs/user/references/xml/dubbo-method.json   |    6 +
 zh-cn/docs/user/references/xml/dubbo-module.json   |    6 +
 zh-cn/docs/user/references/xml/dubbo-monitor.json  |    6 +
 .../docs/user/references/xml/dubbo-parameter.json  |    6 +
 zh-cn/docs/user/references/xml/dubbo-protocol.json |    6 +
 zh-cn/docs/user/references/xml/dubbo-provider.json |    6 +
 .../docs/user/references/xml/dubbo-reference.json  |    6 +
 zh-cn/docs/user/references/xml/dubbo-registry.json |    6 +
 zh-cn/docs/user/references/xml/dubbo-service.json  |    6 +
 zh-cn/docs/user/references/xml/introduction.json   |    6 +
 zh-cn/docs/user/rest.json                          |   10 +
 zh-cn/docs/user/serialization.json                 |    6 +
 zh-cn/docs/user/simple-monitor.json                |    6 +
 zh-cn/docs/user/versions/index.json                |    6 +
 406 files changed, 7157 insertions(+), 5 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8b7e577..b1b1567 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,8 +5,8 @@ npm-debug.log
 *.orig
 package-lock.json
 *.iml
-/en-us/
-/zh-cn/
-build/
-index.html
-md_json/
+#/en-us/
+#/zh-cn/
+#build/
+#index.html
+#md_json/
diff --git a/en-us/blog/apachecon-na-2018.json b/en-us/blog/apachecon-na-2018.json
new file mode 100644
index 0000000..2351fd0
--- /dev/null
+++ b/en-us/blog/apachecon-na-2018.json
@@ -0,0 +1,10 @@
+{
+  "filename": "apachecon-na-2018.md",
+  "__html": "<h2>The ApacheCon NA schedule has been announced</h2>\n<p>Ian Luo(PMC) and Jun Liu(PMC) 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": {
+    "title": "The ApacheCon NA schedule has been announced",
+    "keywords": "Dubbo, ApacheCon NA",
+    "description": "This article will introduce you that the ApacheCon NA schedule has been announced attention."
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/download.json b/en-us/blog/download.json
new file mode 100644
index 0000000..bebdbe2
--- /dev/null
+++ b/en-us/blog/download.json
@@ -0,0 +1,10 @@
+{
+  "filename": "download.md",
+  "__html": "<h1>Downloads</h1>\n<h2>Verification</h2>\n<p>you can follow these <a href=\"https://www.apache.org/info/verification\">procedures</a> and the <a href=\"https://www.apache.org/dist/dubbo/KEYS\">KEYS</a> file to verify the download files</p>\n<h2>Apache Dubbo</h2>\n<blockquote>\n<p>GitHub: <a href=\"https://github.com/apache/dubbo\">https://github.com/apache/dubbo</a> <br>\nRelease Notes: <a href=\"https://github.com/apache/dubbo/releases\">https://github.com/apache/dubbo/rel [...]
+  "link": "/en-us/blog/download.html",
+  "meta": {
+    "title": "Downloads",
+    "keywords": "Dubbo, Downloads, Version",
+    "description": "This article will introduce you how to understand the details of each version and upgrade matters needing attention."
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/dubbo-101.json b/en-us/blog/dubbo-101.json
new file mode 100644
index 0000000..1c42ab1
--- /dev/null
+++ b/en-us/blog/dubbo-101.json
@@ -0,0 +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 n [...]
+  "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
new file mode 100644
index 0000000..ce139f7
--- /dev/null
+++ b/en-us/blog/dubbo-annotation.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..fe75644
--- /dev/null
+++ b/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.json
@@ -0,0 +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 Prov [...]
+  "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-fescar.json b/en-us/blog/dubbo-fescar.json
new file mode 100644
index 0000000..cc8023a
--- /dev/null
+++ b/en-us/blog/dubbo-fescar.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-fescar.md",
+  "__html": "<h1>How to use Fescar to ensure consistency between Dubbo Microservices</h1>\n<h2>Use case</h2>\n<p>A business logic for user purchasing commodities. The whole business logic is powered by 3 microservices:</p>\n<ul>\n<li>Storage service: deduct storage count on given commodity.</li>\n<li>Order service: create order according to purchase request.</li>\n<li>Account service: debit the balance of user's account.</li>\n</ul>\n<h3>Architecture</h3>\n<p><img src=\"../../img/blog/fe [...]
+  "link": "/en-us/blog/dubbo-fescar.html",
+  "meta": {
+    "title": "How to use Fescar to ensure consistency between Dubbo Microservices",
+    "keywords": "Dubbo,Fescar,Consistency",
+    "description": "This article will introduce you how to use Fescar to ensure consistency between Dubbo Microservices."
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/dubbo-generic-invoke.json b/en-us/blog/dubbo-generic-invoke.json
new file mode 100644
index 0000000..7b7dfd0
--- /dev/null
+++ b/en-us/blog/dubbo-generic-invoke.json
@@ -0,0 +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 <cod [...]
+  "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
new file mode 100644
index 0000000..e05a847
--- /dev/null
+++ b/en-us/blog/dubbo-invoke.json
@@ -0,0 +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>\ [...]
+  "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
new file mode 100644
index 0000000..e53fd8a
--- /dev/null
+++ b/en-us/blog/dubbo-k8s.json
@@ -0,0 +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 se [...]
+  "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
new file mode 100644
index 0000000..2df2a9e
--- /dev/null
+++ b/en-us/blog/dubbo-loadbalance.json
@@ -0,0 +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-t [...]
+  "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
new file mode 100644
index 0000000..97b1878
--- /dev/null
+++ b/en-us/blog/dubbo-meetup-beijing-may-12th-2018.json
@@ -0,0 +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 C [...]
+  "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-chengdu.json b/en-us/blog/dubbo-meetup-chengdu.json
new file mode 100644
index 0000000..0870914
--- /dev/null
+++ b/en-us/blog/dubbo-meetup-chengdu.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meetup-chengdu.md",
+  "__html": "<h1>The fourth Dubbo meetup has been held in Chengdu</h1>\n<p><img src=\"../../img/blog/meetup-chengdu/all-hands.webp\" alt=\"img\"></p>\n<h2>The depth of the user communication</h2>\n<p>On August 26, 10:00 am - 12:00am, invited the arrival of the car to help, cloud gold, former BBD, flying fish star four companies open source enthusiasts and heavy users participate in face-to-face communication;According to the participants' feedback, answer to Dubbo many doubt, especially  [...]
+  "link": "/en-us/blog/dubbo-meetup-chengdu.html",
+  "meta": {
+    "title": "The fourth Dubbo meetup has been held in Chengdu",
+    "keywords": "Dubbo, Chengdu, meetup",
+    "description": "The fourth Dubbo meetup has been held in Chengdu."
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/dubbo-meetup-hangzhou.json b/en-us/blog/dubbo-meetup-hangzhou.json
new file mode 100644
index 0000000..a565cdf
--- /dev/null
+++ b/en-us/blog/dubbo-meetup-hangzhou.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meetup-hangzhou.md",
+  "__html": "<h1>The fifth Dubbo meetup has been held in Hangzhou</h1>\n<p>The fifth Dubbo meetup has been held in Hangzhou,</p>\n<p>Please enjoy the slides of the topics:</p>\n<ul>\n<li>Ding Li: How to involve in dubbo community <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/how-to-involve-in-dubbo-community.pdf\">slides</a></li>\n<li>Shenli Cao: Dubbo 2.7 introduction <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetu [...]
+  "link": "/en-us/blog/dubbo-meetup-hangzhou.html",
+  "meta": {
+    "title": "The fifth Dubbo meetup has been held in Hangzhou",
+    "keywords": "Dubbo, Hangzhou, meetup",
+    "description": "The fifth Dubbo meetup has been held in Hangzhou"
+  }
+}
\ 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
new file mode 100644
index 0000000..589c0d8
--- /dev/null
+++ b/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
+  "__html": "<h2>The second 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.</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\ [...]
+  "link": "/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
+  "meta": {
+    "title": "The second Dubbo Shanghai meetup has been held successfully",
+    "keywords": "Dubbo, Shanghai, meetup",
+    "description": "The second Dubbo Shanghai meetup has been held successfully."
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/dubbo-meetup-shenzhen.json b/en-us/blog/dubbo-meetup-shenzhen.json
new file mode 100644
index 0000000..976bc67
--- /dev/null
+++ b/en-us/blog/dubbo-meetup-shenzhen.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meetup-shenzhen.md",
+  "__html": "<h2>The third Dubbo meetup has been held in Shenzhen</h2>\n<p>The third Dubbo meetup has successfully been held in Shenzhen, over 2000 people submitted registration, and over 700 were present, more than 17,000 watched the live online.</p>\n<p>Please enjoy the slides of the topics:</p>\n<ul>\n<li>Zhixuan Chen: Dubbo-present-and-2.7-update (Chinese) <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201807%40shenzhen/dubbo-present-and-2.7-update.pdf\">s [...]
+  "link": "/en-us/blog/dubbo-meetup-shenzhen.html",
+  "meta": {
+    "title": "The third Dubbo meetup has been held in Shenzhen",
+    "keywords": "Dubbo, Shenzhen, meetup",
+    "description": "The third Dubbo meetup has been held in Shenzhen"
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/dubbo-new-async.json b/en-us/blog/dubbo-new-async.json
new file mode 100644
index 0000000..a860f7a
--- /dev/null
+++ b/en-us/blog/dubbo-new-async.json
@@ -0,0 +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 enha [...]
+  "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/gsoc-2018.json b/en-us/blog/gsoc-2018.json
new file mode 100644
index 0000000..dfc7dcb
--- /dev/null
+++ b/en-us/blog/gsoc-2018.json
@@ -0,0 +1,10 @@
+{
+  "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",
+  "link": "/en-us/blog/gsoc-2018.html",
+  "meta": {
+    "title": "GSoC 2018",
+    "keywords": "Dubbo, GSoC",
+    "description": "The GSoC(Google Summer of Code) 2018 projects has been announced"
+  }
+}
\ 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
new file mode 100644
index 0000000..188bef6
--- /dev/null
+++ b/en-us/blog/introduction-to-dubbo-spi-2.json
@@ -0,0 +1,10 @@
+{
+  "filename": "introduction-to-dubbo-spi-2.md",
+  "__html": "<h1>Dubbo extensible mechanism source code analysis</h1>\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</h [...]
+  "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
new file mode 100644
index 0000000..f46d9de
--- /dev/null
+++ b/en-us/blog/introduction-to-dubbo-spi.json
@@ -0,0 +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 t [...]
+  "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/prepare-an-apache-release.json b/en-us/blog/prepare-an-apache-release.json
new file mode 100644
index 0000000..adb0d68
--- /dev/null
+++ b/en-us/blog/prepare-an-apache-release.json
@@ -0,0 +1,10 @@
+{
+  "filename": "prepare-an-apache-release.md",
+  "__html": "<h1>How to prepare an the Apache Release</h1>\n<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\"> [...]
+  "link": "/en-us/blog/prepare-an-apache-release.html",
+  "meta": {
+    "title": "Understanding the Apache Release Cycle",
+    "keywords": "Dubbo, Apache, Release",
+    "description": "This article introduces how to the Apache publish content and process"
+  }
+}
\ No newline at end of file
diff --git a/en-us/blog/qcon-beijing-2018.json b/en-us/blog/qcon-beijing-2018.json
new file mode 100644
index 0000000..6ff4dc1
--- /dev/null
+++ b/en-us/blog/qcon-beijing-2018.json
@@ -0,0 +1,10 @@
+{
+  "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",
+  "link": "/en-us/blog/qcon-beijing-2018.html",
+  "meta": {
+    "title": "Dubbo roadmap is announced in QCon Beijing 2018",
+    "keywords": "Dubbo, roadmap, QCon Beijing",
+    "description": "This article will introduce you that Dubbo roadmap is announced in QCon Beijing 2018."
+  }
+}
\ 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
new file mode 100644
index 0000000..1454dde
--- /dev/null
+++ b/en-us/blog/sentinel-introduction-for-dubbo.json
@@ -0,0 +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 - Se [...]
+  "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
new file mode 100644
index 0000000..60e0cc8
--- /dev/null
+++ b/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
@@ -0,0 +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/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/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">Autoconfigure</ [...]
+  "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 `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
new file mode 100644
index 0000000..71388a7
--- /dev/null
+++ b/en-us/blog/tracing-with-skywalking.json
@@ -0,0 +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 tra [...]
+  "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
new file mode 100644
index 0000000..905d401
--- /dev/null
+++ b/en-us/docs/admin/README.json
@@ -0,0 +1,6 @@
+{
+  "filename": "README.md",
+  "__html": "<p>This document explains the structure, deploy procedure and function of 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
new file mode 100644
index 0000000..4e28087
--- /dev/null
+++ b/en-us/docs/admin/SUMMARY.json
@@ -0,0 +1,6 @@
+{
+  "filename": "SUMMARY.md",
+  "__html": "<ul>\n<li><a href=\"introduction.md\">1 Dubbo Admin introduction</a>\n<ul>\n<li><a href=\"serviceSearch.md\">1.1 service search and detail</a></li>\n<li><a href=\"serviceGovernance.md\">1.2 service governance</a></li>\n<li><a href=\"serviceTest.md\">1.3 service test</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
new file mode 100644
index 0000000..9a0b9e5
--- /dev/null
+++ b/en-us/docs/admin/install/admin-console.json
@@ -0,0 +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/dubbo-admin.git /var/tmp/dubbo-admin\n<span class=\"hljs-built_in\">cd</span> /var/tmp/dubbo-admin\nmvn clean package\n</code></pre>\n<p>Configuration <sup cla [...]
+  "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
new file mode 100644
index 0000000..a3d80d1
--- /dev/null
+++ b/en-us/docs/admin/install/consumer-demo.json
@@ -0,0 +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/dubbo.git\n$ <span class=\"hljs-built_in\">cd</span> dubbo\n<span class=\"hljs-comment\"># please start Provider first</span>\n<span class=\"hljs-comment\"># add -Djava.net.preferIPv4Stack=true if your IDE is Intellij Idea</span>\n</code></pre>\n<p>Configuration:</p>\n<pre><code class=\"language-sh\"><span class=\"hljs-c [...]
+  "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
new file mode 100644
index 0000000..4821997
--- /dev/null
+++ b/en-us/docs/admin/install/introduction.json
@@ -0,0 +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 an [...]
+  "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
new file mode 100644
index 0000000..1d7ac19
--- /dev/null
+++ b/en-us/docs/admin/install/provider-demo.json
@@ -0,0 +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/dubbo.git\n$ <span class=\"hljs-built_in\">cd</span> dubbo\n<span class=\"hljs-comment\"># run org.apache.dubbo.demo.provider.Provider under dubbo-demo-provider module</span>\n<span class=\"hljs-comment\"># add -Djava.net.preferIPv4Stack=true if your IDE is Intellij Idea</span>\n</code></pre>\n<p>configuration:</p>\n<pre [...]
+  "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
new file mode 100644
index 0000000..3ac1038
--- /dev/null
+++ b/en-us/docs/admin/install/redis.json
@@ -0,0 +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=\ [...]
+  "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
new file mode 100644
index 0000000..3650495
--- /dev/null
+++ b/en-us/docs/admin/install/simple-monitor-center.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..1231365
--- /dev/null
+++ b/en-us/docs/admin/install/simple-registry-center.json
@@ -0,0 +1,6 @@
+{
+  "filename": "simple-registry-center.md",
+  "__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/ops/dubbo-ops.json b/en-us/docs/admin/ops/dubbo-ops.json
new file mode 100644
index 0000000..1decedb
--- /dev/null
+++ b/en-us/docs/admin/ops/dubbo-ops.json
@@ -0,0 +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-consume [...]
+  "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
new file mode 100644
index 0000000..bca737c
--- /dev/null
+++ b/en-us/docs/admin/ops/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__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/skywalking.json b/en-us/docs/admin/ops/skywalking.json
new file mode 100644
index 0000000..c5b4b56
--- /dev/null
+++ b/en-us/docs/admin/ops/skywalking.json
@@ -0,0 +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 tra [...]
+  "link": "/en-us/docs/admin/ops/skywalking.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/admin/serviceGovernance.json b/en-us/docs/admin/serviceGovernance.json
new file mode 100644
index 0000000..2e91d31
--- /dev/null
+++ b/en-us/docs/admin/serviceGovernance.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serviceGovernance.md",
+  "__html": "<h1>Service governance and configuration management</h1>\n<h2>Service governance</h2>\n<p>服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的,主要有以下几个功能:<br>\nthe basic function of service governance is changing the runtime behaviour and routing logic, to do weight configuration and current limiting:</p>\n<h3>应用级别的服务治理</h3>\n<h3>application level service governance</h3>\n<p>在Dubbo2.6及更早版本中,所有的服务治理规则都只针对服务粒度,如果要把某条规则作用到应用粒度上,需要为应用下的所有服务配合相同的规则,变更,删除的时候也需要对应的操作,这样的操作很不友好,因此Dubbo2.7版本中增加了应用粒度 [...]
+  "link": "/en-us/docs/admin/serviceGovernance.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/admin/serviceSearch.json b/en-us/docs/admin/serviceSearch.json
new file mode 100644
index 0000000..9ff0592
--- /dev/null
+++ b/en-us/docs/admin/serviceSearch.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serviceSearch.md",
+  "__html": "<h1>Service search and service detail</h1>\n<p>Service search is the basic function of Dubbo OPS, you can search by service name, application name and IP address, the service name and application name support wildcard and autocomplete:\n<img src=\"sources/images/searchResult.png\" alt=\"searchResult\">\nthe service detail page display providers, consumers, medata information is supported in Dubbo 2.7 or higher version:\n<img src=\"sources/images/detail.jpg\" alt=\"detail\"></p>\n",
+  "link": "/en-us/docs/admin/serviceSearch.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/admin/serviceTest.json b/en-us/docs/admin/serviceTest.json
new file mode 100644
index 0000000..44e89a9
--- /dev/null
+++ b/en-us/docs/admin/serviceTest.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serviceTest.md",
+  "__html": "<p>please refer to this <a href=\"../../../zh-cn/blog/service-test.md\">blog</a></p>\n",
+  "link": "/en-us/docs/admin/serviceTest.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/README.json b/en-us/docs/dev/README.json
new file mode 100644
index 0000000..2dfd479
--- /dev/null
+++ b/en-us/docs/dev/README.json
@@ -0,0 +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",
+  "link": "/en-us/docs/dev/README.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/SUMMARY.json b/en-us/docs/dev/SUMMARY.json
new file mode 100644
index 0000000..9978b5d
--- /dev/null
+++ b/en-us/docs/dev/SUMMARY.json
@@ -0,0 +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\"> [...]
+  "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
new file mode 100644
index 0000000..c2e0699
--- /dev/null
+++ b/en-us/docs/dev/TCK.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..7acbfc8
--- /dev/null
+++ b/en-us/docs/dev/build.json
@@ -0,0 +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/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/dubbo/tags [...]
+  "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
new file mode 100644
index 0000000..d7b93c9
--- /dev/null
+++ b/en-us/docs/dev/checklist.json
@@ -0,0 +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>Comple [...]
+  "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
new file mode 100644
index 0000000..9ec087a
--- /dev/null
+++ b/en-us/docs/dev/code-smell.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..81fac35
--- /dev/null
+++ b/en-us/docs/dev/coding.json
@@ -0,0 +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 contex [...]
+  "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
new file mode 100644
index 0000000..805a146
--- /dev/null
+++ b/en-us/docs/dev/contract.json
@@ -0,0 +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 unr [...]
+  "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
new file mode 100644
index 0000000..07e822f
--- /dev/null
+++ b/en-us/docs/dev/contribution.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..22c2627
--- /dev/null
+++ b/en-us/docs/dev/design.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..05b2205
--- /dev/null
+++ b/en-us/docs/dev/implementation.json
@@ -0,0 +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  [...]
+  "link": "/en-us/docs/dev/implementation.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
new file mode 100644
index 0000000..a413d9f
--- /dev/null
+++ b/en-us/docs/dev/impls/introduction.json
@@ -0,0 +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",
+  "link": "/en-us/docs/dev/impls/introduction.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/introduction.json b/en-us/docs/dev/introduction.json
new file mode 100644
index 0000000..7235c07
--- /dev/null
+++ b/en-us/docs/dev/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__html": "",
+  "link": "/en-us/docs/dev/introduction.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/code-detail.json b/en-us/docs/dev/principals/code-detail.json
new file mode 100644
index 0000000..a0e5e7d
--- /dev/null
+++ b/en-us/docs/dev/principals/code-detail.json
@@ -0,0 +1,6 @@
+{
+  "filename": "code-detail.md",
+  "__html": "<h1>The devil is in the details</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>Recently, I have been worried about the quality of the Dubbo distributed service framework. If there are more maintenance personnel or changes, there will be a decline in quality. I am thinking, is there any need for everyone to abide by it, according to a habit when writing code, I have summarized it. The c [...]
+  "link": "/en-us/docs/dev/principals/code-detail.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/configuration.json b/en-us/docs/dev/principals/configuration.json
new file mode 100644
index 0000000..82000cb
--- /dev/null
+++ b/en-us/docs/dev/principals/configuration.json
@@ -0,0 +1,6 @@
+{
+  "filename": "configuration.md",
+  "__html": "<h1>The configuration design</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 design is now completely unobtrusive, namely the user only depends on the configuration of contract.After multiple versions of the development, in order to meet the demand of various scenarios, configuration is more and <a href=\"http://more.In\">more.In</a> order to maintain compatibility with only grow, l [...]
+  "link": "/en-us/docs/dev/principals/configuration.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/dummy.json b/en-us/docs/dev/principals/dummy.json
new file mode 100644
index 0000000..93f27d6
--- /dev/null
+++ b/en-us/docs/dev/principals/dummy.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dummy.md",
+  "__html": "<h1>&quot;Fool-proof&quot; design</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>Recently I was feeling stupid because I solved too many stupid problems. The service framework is becoming more widely used. Every day, I have to help the endpoint user to resolve problems. Gradually, it is found that most of the problems are configuration errors, or duplicated files or classes, or network f [...]
+  "link": "/en-us/docs/dev/principals/dummy.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/expansibility.json b/en-us/docs/dev/principals/expansibility.json
new file mode 100644
index 0000000..93b255a
--- /dev/null
+++ b/en-us/docs/dev/principals/expansibility.json
@@ -0,0 +1,6 @@
+{
+  "filename": "expansibility.md",
+  "__html": "<h1>Talk about expansion of extension and incremental extension</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>There are more and more products in our platform, the function of the product also more and more.Platform products in order to meet the requirement of each BU and department as well as product line, will surely will be a lot of irrelevant function together, the customer can use  [...]
+  "link": "/en-us/docs/dev/principals/expansibility.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/extension.json b/en-us/docs/dev/principals/extension.json
new file mode 100644
index 0000000..aecfb45
--- /dev/null
+++ b/en-us/docs/dev/principals/extension.json
@@ -0,0 +1,6 @@
+{
+  "filename": "extension.md",
+  "__html": "<h1>Extension points to reconstruct</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>With the promotion of service, the website of Dubbo service framework requirements gradually increase, Dubbo existing developers can implement demand is limited, many requirements have been delay, and site classmates also want to participate, combined with field, so the platform will be open to internal  [...]
+  "link": "/en-us/docs/dev/principals/extension.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/general-knowledge.json b/en-us/docs/dev/principals/general-knowledge.json
new file mode 100644
index 0000000..ed0b3bf
--- /dev/null
+++ b/en-us/docs/dev/principals/general-knowledge.json
@@ -0,0 +1,6 @@
+{
+  "filename": "general-knowledge.md",
+  "__html": "<h1>Some in the design of the basic common sense</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>Recently told the new team some design on the common sense, is likely to be new and some other help, the thought of a few temporarily, first write here.</p>\n<h2>The API and SPI separation</h2>\n<p>Framework or component there are generally two types of customers, one is a consumer, is an exte [...]
+  "link": "/en-us/docs/dev/principals/general-knowledge.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/introduction.json b/en-us/docs/dev/principals/introduction.json
new file mode 100644
index 0000000..d72e34a
--- /dev/null
+++ b/en-us/docs/dev/principals/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__html": "<h1>Design principals</h1>\n<p>The design principles in this chapter are taken from a series of articles published by Liang Fei on javaeye.</p>\n",
+  "link": "/en-us/docs/dev/principals/introduction.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/robustness.json b/en-us/docs/dev/principals/robustness.json
new file mode 100644
index 0000000..c4034be
--- /dev/null
+++ b/en-us/docs/dev/principals/robustness.json
@@ -0,0 +1,6 @@
+{
+  "filename": "robustness.md",
+  "__html": "<h1>The robustness of the design implementation</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 as a remote service exposure, calls and management solutions, through the meridians of the application is running, its itself to achieve robustness of importance is self-evident.</p>\n<p>Here are some Dubbo principle and method of use. [...]
+  "link": "/en-us/docs/dev/principals/robustness.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/dev/release.json b/en-us/docs/dev/release.json
new file mode 100644
index 0000000..463c963
--- /dev/null
+++ b/en-us/docs/dev/release.json
@@ -0,0 +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 b [...]
+  "link": "/en-us/docs/dev/release.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/developers/committer-guide/apache-dubbo-page_dev.json b/en-us/docs/developers/committer-guide/apache-dubbo-page_dev.json
new file mode 100644
index 0000000..78193d7
--- /dev/null
+++ b/en-us/docs/developers/committer-guide/apache-dubbo-page_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "apache-dubbo-page_dev.md",
+  "__html": "<h1>Apache Official Dubbo Page Maintenance</h1>\n<p>Apache has an official website that maintains information about all incubation projects.\nEach incubation project has an information page under this website.\nDubbo's information page address is <a href=\"https://incubator.apache.org/projects/dubbo.html\">https://incubator.apache.org/projects/dubbo.html</a>.</p>\n<p>When the project has undergone major changes, such as the addition of a new committer,\nthe election of a new [...]
+  "link": "/en-us/docs/developers/committer-guide/apache-dubbo-page_dev.html",
+  "meta": {}
+}
\ 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 0000000..e21f2d6
--- /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/dubbo/milestones\">milestone</a></strong>.</p>\ [...]
+  "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/new-committer-guide_dev.json b/en-us/docs/developers/committer-guide/new-committer-guide_dev.json
new file mode 100644
index 0000000..2b215a3
--- /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  [...]
+  "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_dev.json b/en-us/docs/developers/committer-guide/website-guide_dev.json
new file mode 100644
index 0000000..d9f6880
--- /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 is <a href=\"https://github.com/apache/dubbo-website\">https://github.com/apache/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/become-a-committer_dev.json b/en-us/docs/developers/contributor-guide/become-a-committer_dev.json
new file mode 100644
index 0000000..ad3cfac
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/become-a-committer_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "become-a-committer_dev.md",
+  "__html": "<h1>How to become a Dubbo committer</h1>\n<p>Anyone can be a contributor to an Apache project. Being a contributor simply means that you take an interest in the project and contribute in some way, ranging from asking sensible questions (which documents the project and provides feedback to developers) through to providing new features as patches.</p>\n<p>If you become a valuable contributor to the project you may well be invited to become a committer. Committer is a term used [...]
+  "link": "/en-us/docs/developers/contributor-guide/become-a-committer_dev.html",
+  "meta": {}
+}
\ 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 0000000..3ad99cb
--- /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://w [...]
+  "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_dev.json b/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.json
new file mode 100644
index 0000000..da2824f
--- /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 de [...]
+  "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_dev.json b/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json
new file mode 100644
index 0000000..1e40247
--- /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.apache.org\">dev@dubbo.apache.org</a>) for Apache Incubator has been established, please feel free to subscribe and refer to [^1] for more details.</p>\n<p>You can also view <a href=\"https://lists.apache.org/list.html?dev@dubbo.apache.org\">the archive of the mailing list</a></p>\n<p>Here is a brief guide specific to Dubbo:</p>\n<ol>\n<li>Send an email to <a href=\"mail [...]
+  "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_dev.json b/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.json
new file mode 100644
index 0000000..7af98fd
--- /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/dubbo/issues/1393\">issue</a> for detailed documentation on how to subscribe.</p>\n<ul>\n<li><a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a>: the develop mailing l [...]
+  "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/reporting-security-issues_dev.json b/en-us/docs/developers/contributor-guide/reporting-security-issues_dev.json
new file mode 100644
index 0000000..f6eb1c8
--- /dev/null
+++ b/en-us/docs/developers/contributor-guide/reporting-security-issues_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "reporting-security-issues_dev.md",
+  "__html": "<h1>Reporting Security Issues</h1>\n<p>The Apache Software Foundation takes a rigorous standpoint in annihilating the security issues in its software projects. Apache Dubbo is highly sensitive and forthcoming to issues pertaining to its features and functionality.</p>\n<h2>REPORTING VULNERABILITY</h2>\n<p>If you have apprehensions regarding Dubbo's security or you discover vulnerability or potential threat, don’t hesitate to get in touch with the Apache Dubbo Security Team b [...]
+  "link": "/en-us/docs/developers/contributor-guide/reporting-security-issues_dev.html",
+  "meta": {}
+}
\ 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 0000000..60375e5
--- /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 PMC that a SGA is actually needed.</p>\n<p>If you are donating significant amount of code or documentation to Apache Dubbo , 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-templat [...]
+  "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_dev.json b/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.json
new file mode 100644
index 0000000..709366c
--- /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 [...]
+  "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
new file mode 100644
index 0000000..d8da56b
--- /dev/null
+++ b/en-us/docs/developers/developers_dev.json
@@ -0,0 +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>wav [...]
+  "link": "/en-us/docs/developers/developers_dev.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
new file mode 100644
index 0000000..723293b
--- /dev/null
+++ b/en-us/docs/developers/guide_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "guide_dev.md",
+  "__html": "<h2>Contributing to Dubbo</h2>\n<p>Dubbo is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into master. If you want to contribute even something trivial please do not hesitate, but follow the guidelines below.</p>\n<h3>Sign the Contributor License Agreement</h3>\n<p>Before we accept a non-trivial patch or pull request we will need you to sign the Contribu [...]
+  "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.json b/en-us/docs/developers/user-guide/faq_dev.json
new file mode 100644
index 0000000..ed9f4c5
--- /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/dubbo-admin\">https://github.com/apache/dubbo-admin</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, productio [...]
+  "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
new file mode 100644
index 0000000..9eab64e
--- /dev/null
+++ b/en-us/docs/user/README.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..ddeaec5
--- /dev/null
+++ b/en-us/docs/user/SUMMARY.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..dadb0a6
--- /dev/null
+++ b/en-us/docs/user/benchmark-tool.json
@@ -0,0 +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/dubbo.git\">https://github.com/apache/dubbo.git</a></li>\n<li>compile benchmark: cd dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>uncompress benchmark: 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< [...]
+  "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
new file mode 100644
index 0000000..b618e66
--- /dev/null
+++ b/en-us/docs/user/best-practice.json
@@ -0,0 +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 pa [...]
+  "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
new file mode 100644
index 0000000..e797957
--- /dev/null
+++ b/en-us/docs/user/capacity-plan.json
@@ -0,0 +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 autho [...]
+  "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
new file mode 100644
index 0000000..f56955b
--- /dev/null
+++ b/en-us/docs/user/configuration/annotation.json
@@ -0,0 +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> org.apache.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\"> [...]
+  "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
new file mode 100644
index 0000000..bb5868b
--- /dev/null
+++ b/en-us/docs/user/configuration/api.json
@@ -0,0 +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>  [...]
+  "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
new file mode 100644
index 0000000..b41e028
--- /dev/null
+++ b/en-us/docs/user/configuration/index.json
@@ -0,0 +1,6 @@
+{
+  "filename": "index.md",
+  "__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/coveragence.json b/en-us/docs/user/coveragence.json
new file mode 100644
index 0000000..f59e04f
--- /dev/null
+++ b/en-us/docs/user/coveragence.json
@@ -0,0 +1,6 @@
+{
+  "filename": "coveragence.md",
+  "__html": "<h1>Test coverage report</h1>\n<ul>\n<li>v2.0   Codecov report , Statistics since  2017-12-29\nThe test coverage is : <a href=\"https://codecov.io/gh/apache/dubbo\"><img src=\"https://codecov.io/gh/apache/dubbo/branch/master/graph/badge.svg\" alt=\"codecov\"></a> , we can get the report in <a href=\"https://codecov.io/gh/apache/dubbo\">https://codecov.io/gh/apache/dubbo</a></li>\n<li>v1.0   Based on version <code>2.0.12</code>,Statistics on 2012-02-03</li>\n</ul>\n<p><img sr [...]
+  "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
new file mode 100644
index 0000000..8ff246b
--- /dev/null
+++ b/en-us/docs/user/demos/accesslog.json
@@ -0,0 +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-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
new file mode 100644
index 0000000..e8c9924
--- /dev/null
+++ b/en-us/docs/user/demos/async-call.json
@@ -0,0 +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-t [...]
+  "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
new file mode 100644
index 0000000..e4a0627
--- /dev/null
+++ b/en-us/docs/user/demos/attachment.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..a9979bc
--- /dev/null
+++ b/en-us/docs/user/demos/callback-parameter.json
@@ -0,0 +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 interfac [...]
+  "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
new file mode 100644
index 0000000..154834d
--- /dev/null
+++ b/en-us/docs/user/demos/concurrency-control.json
@@ -0,0 +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</s [...]
+  "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
new file mode 100644
index 0000000..793a9c1
--- /dev/null
+++ b/en-us/docs/user/demos/config-connections.json
@@ -0,0 +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=\"l [...]
+  "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
new file mode 100644
index 0000000..1e1013a
--- /dev/null
+++ b/en-us/docs/user/demos/config-rule.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..59aaed5
--- /dev/null
+++ b/en-us/docs/user/demos/context.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..8b83698
--- /dev/null
+++ b/en-us/docs/user/demos/delay-publish.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..7bb5203
--- /dev/null
+++ b/en-us/docs/user/demos/distributed-transaction.json
@@ -0,0 +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",
+  "link": "/en-us/docs/user/demos/distributed-transaction.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
new file mode 100644
index 0000000..5e324c5
--- /dev/null
+++ b/en-us/docs/user/demos/echo-service.json
@@ -0,0 +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 cl [...]
+  "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
new file mode 100644
index 0000000..612c8ee
--- /dev/null
+++ b/en-us/docs/user/demos/events-notify.json
@@ -0,0 +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=\"h [...]
+  "link": "/en-us/docs/user/demos/events-notify.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
new file mode 100644
index 0000000..65c9a35
--- /dev/null
+++ b/en-us/docs/user/demos/fault-tolerent-strategy.json
@@ -0,0 +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< [...]
+  "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
new file mode 100644
index 0000000..9bfb776
--- /dev/null
+++ b/en-us/docs/user/demos/generic-reference.json
@@ -0,0 +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>g [...]
+  "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
new file mode 100644
index 0000000..1bd5f6a
--- /dev/null
+++ b/en-us/docs/user/demos/generic-service.json
@@ -0,0 +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>  [...]
+  "link": "/en-us/docs/user/demos/generic-service.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
new file mode 100644
index 0000000..60d40a8
--- /dev/null
+++ b/en-us/docs/user/demos/group-merger.json
@@ -0,0 +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/apach [...]
+  "link": "/en-us/docs/user/demos/group-merger.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
new file mode 100644
index 0000000..21a2911
--- /dev/null
+++ b/en-us/docs/user/demos/index.json
@@ -0,0 +1,6 @@
+{
+  "filename": "index.md",
+  "__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
new file mode 100644
index 0000000..62fb593
--- /dev/null
+++ b/en-us/docs/user/demos/introduction.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..d73e4fe
--- /dev/null
+++ b/en-us/docs/user/demos/lazy-connect.json
@@ -0,0 +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-strin [...]
+  "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
new file mode 100644
index 0000000..b576239
--- /dev/null
+++ b/en-us/docs/user/demos/loadbalance.json
@@ -0,0 +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, bu [...]
+  "link": "/en-us/docs/user/demos/loadbalance.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
new file mode 100644
index 0000000..760cc46
--- /dev/null
+++ b/en-us/docs/user/demos/local-mock.json
@@ -0,0 +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-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
new file mode 100644
index 0000000..280a4ec
--- /dev/null
+++ b/en-us/docs/user/demos/local-stub.json
@@ -0,0 +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=\" [...]
+  "link": "/en-us/docs/user/demos/local-stub.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
new file mode 100644
index 0000000..9d0ddc7
--- /dev/null
+++ b/en-us/docs/user/demos/multi-versions.json
@@ -0,0 +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 ver [...]
+  "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
new file mode 100644
index 0000000..d6e4d33
--- /dev/null
+++ b/en-us/docs/user/demos/netty4.json
@@ -0,0 +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=\" [...]
+  "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
new file mode 100644
index 0000000..a6be139
--- /dev/null
+++ b/en-us/docs/user/demos/parameter-validation.json
@@ -0,0 +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- [...]
+  "link": "/en-us/docs/user/demos/parameter-validation.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
new file mode 100644
index 0000000..9011b60
--- /dev/null
+++ b/en-us/docs/user/demos/reference-config-cache.json
@@ -0,0 +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 ReferenceConfigCac [...]
+  "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
new file mode 100644
index 0000000..bf0bce3
--- /dev/null
+++ b/en-us/docs/user/demos/registry-only.json
@@ -0,0 +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= [...]
+  "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
new file mode 100644
index 0000000..0a1891f
--- /dev/null
+++ b/en-us/docs/user/demos/result-cache.json
@@ -0,0 +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>threadloc [...]
+  "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
new file mode 100644
index 0000000..112b6b0
--- /dev/null
+++ b/en-us/docs/user/demos/routing-rule.json
@@ -0,0 +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 co [...]
+  "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
new file mode 100644
index 0000000..5a5ae98
--- /dev/null
+++ b/en-us/docs/user/demos/serialization.json
@@ -0,0 +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</ [...]
+  "link": "/en-us/docs/user/demos/serialization.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
new file mode 100644
index 0000000..b1e4b76
--- /dev/null
+++ b/en-us/docs/user/demos/service-downgrade.json
@@ -0,0 +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.1 [...]
+  "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
new file mode 100644
index 0000000..8beb908
--- /dev/null
+++ b/en-us/docs/user/demos/service-group.json
@@ -0,0 +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;<spa [...]
+  "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
new file mode 100644
index 0000000..26e4e73
--- /dev/null
+++ b/en-us/docs/user/demos/static-service.json
@@ -0,0 +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\"</ [...]
+  "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
new file mode 100644
index 0000000..1aaeef2
--- /dev/null
+++ b/en-us/docs/user/demos/stickiness.json
@@ -0,0 +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:reference</span> <spa [...]
+  "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
new file mode 100644
index 0000000..aaea2e0
--- /dev/null
+++ b/en-us/docs/user/demos/subscribe-only.json
@@ -0,0 +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 conne [...]
+  "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
new file mode 100644
index 0000000..0e94f1e
--- /dev/null
+++ b/en-us/docs/user/demos/thread-model.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..4840246
--- /dev/null
+++ b/en-us/docs/user/demos/token-authorization.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..d6dfe18
--- /dev/null
+++ b/en-us/docs/user/dependencies.json
@@ -0,0 +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.jav [...]
+  "link": "/en-us/docs/user/dependencies.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/languages/erlang/reference.html b/en-us/docs/user/languages/erlang/reference.html
new file mode 100644
index 0000000..114b9c2
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/reference.html
@@ -0,0 +1,45 @@
+<!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="reference" />
+	<meta name="description" content="reference" />
+	<!-- 网页标签标题 -->
+	<title>reference</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  [...]
+<h2>Base Config</h2>
+<p>Consumer config is under the dubboerl application with sys.config</p>
+<pre><code class="language-erlang">{dubboerl,[
+	<span class="hljs-comment">%% other config ...</span>
+	{consumer,[
+		{&lt;&lt;<span class="hljs-string">"interface fullname"</span>&gt;&gt;,[Option]},
+		<span class="hljs-comment">%% eg:</span>
+		{&lt;&lt;<span class="hljs-string">"org.apache.dubbo.erlang.sample.service.facade.UserOperator"</span>&gt;&gt;,[]},
+	]}
+]}
+</code></pre>
+<p>Option is to be added.</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">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 [...]
+	<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/user/languages/erlang/reference.json b/en-us/docs/user/languages/erlang/reference.json
new file mode 100644
index 0000000..f5fe1d4
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/reference.json
@@ -0,0 +1,6 @@
+{
+  "filename": "reference.md",
+  "__html": "<h1>Consumer Configurations</h1>\n<h2>Base Config</h2>\n<p>Consumer config is under the dubboerl application with sys.config</p>\n<pre><code class=\"language-erlang\">{dubboerl,[\n\t<span class=\"hljs-comment\">%% other config ...</span>\n\t{consumer,[\n\t\t{&lt;&lt;<span class=\"hljs-string\">\"interface fullname\"</span>&gt;&gt;,[Option]},\n\t\t<span class=\"hljs-comment\">%% eg:</span>\n\t\t{&lt;&lt;<span class=\"hljs-string\">\"org.apache.dubbo.erlang.sample.service.faca [...]
+  "link": "/en-us/docs/user/languages/erlang/reference.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/languages/erlang/serialization.html b/en-us/docs/user/languages/erlang/serialization.html
new file mode 100644
index 0000000..f626906
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/serialization.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="serialization" />
+	<meta name="description" content="serialization" />
+	<!-- 网页标签标题 -->
+	<title>serialization</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  [...]
+<p>The library now only supports hessian and json serialization.</p>
+<h2>Configuration example</h2>
+<p>Protocol config is under the dubboerl application with sys.config</p>
+<pre><code class="language-erlang">{dubboerl,[
+	<span class="hljs-comment">%% other config ...</span>
+	{protocol,hessian}
+]}
+</code></pre>
+<table>
+<thead>
+<tr>
+<th>ConfigName</th>
+<th>Type</th>
+<th>DefaultValue</th>
+<th>Remarks</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>protocol</td>
+<td>atom()</td>
+<td>hessian</td>
+<td>hessian,json</td>
+</tr>
+</tbody>
+</table>
+</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">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 [...]
+	<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/user/languages/erlang/serialization.json b/en-us/docs/user/languages/erlang/serialization.json
new file mode 100644
index 0000000..5a12c92
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/serialization.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serialization.md",
+  "__html": "<h1>Protocol Configurations</h1>\n<p>The library now only supports hessian and json serialization.</p>\n<h2>Configuration example</h2>\n<p>Protocol config is under the dubboerl application with sys.config</p>\n<pre><code class=\"language-erlang\">{dubboerl,[\n\t<span class=\"hljs-comment\">%% other config ...</span>\n\t{protocol,hessian}\n]}\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>ConfigName</th>\n<th>Type</th>\n<th>DefaultValue</th>\n<th>Remarks</th>\n</tr>\n</thead>\n< [...]
+  "link": "/en-us/docs/user/languages/erlang/serialization.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/languages/erlang/service.html b/en-us/docs/user/languages/erlang/service.html
new file mode 100644
index 0000000..975ec82
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/service.html
@@ -0,0 +1,75 @@
+<!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="service" />
+	<meta name="description" content="service" />
+	<!-- 网页标签标题 -->
+	<title>service</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  [...]
+<h2>Base Config</h2>
+<p>Provider config is under the dubboerl application with sys.config</p>
+<pre><code class="language-erlang">{dubboerl,[
+	<span class="hljs-comment">%% other config ...</span>
+	{provider,[
+		{module_implements,interface_module,interface_fullname,[Options]},
+		<span class="hljs-comment">%% eg:</span>
+		{userOperator_impl,userOperator,&lt;&lt;<span class="hljs-string">"org.apache.dubbo.erlang.sample.service.facade.UserOperator"</span>&gt;&gt;,[Option]}
+	]}
+]}
+</code></pre>
+<table>
+<thead>
+<tr>
+<th>ConfigName</th>
+<th>Type</th>
+<th>DefaultValue</th>
+<th>Remarks</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>module_implements</td>
+<td>atom()</td>
+<td>-</td>
+<td>The service implements module name</td>
+</tr>
+<tr>
+<td>interface_module</td>
+<td>atom()</td>
+<td>-</td>
+<td>Interface module name is transfer form java jar</td>
+</tr>
+<tr>
+<td>interface_fullname</td>
+<td>binary()</td>
+<td>-</td>
+<td>Interface full name is the java class name</td>
+</tr>
+</tbody>
+</table>
+<p>Option is to be added.</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">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 [...]
+	<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/user/languages/erlang/service.json b/en-us/docs/user/languages/erlang/service.json
new file mode 100644
index 0000000..936ad0d
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/service.json
@@ -0,0 +1,6 @@
+{
+  "filename": "service.md",
+  "__html": "<h1>Provider Configurations</h1>\n<h2>Base Config</h2>\n<p>Provider config is under the dubboerl application with sys.config</p>\n<pre><code class=\"language-erlang\">{dubboerl,[\n\t<span class=\"hljs-comment\">%% other config ...</span>\n\t{provider,[\n\t\t{module_implements,interface_module,interface_fullname,[Options]},\n\t\t<span class=\"hljs-comment\">%% eg:</span>\n\t\t{userOperator_impl,userOperator,&lt;&lt;<span class=\"hljs-string\">\"org.apache.dubbo.erlang.sample. [...]
+  "link": "/en-us/docs/user/languages/erlang/service.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/languages/erlang/start.html b/en-us/docs/user/languages/erlang/start.html
new file mode 100644
index 0000000..373991f
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/start.html
@@ -0,0 +1,78 @@
+<!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="start" />
+	<meta name="description" content="start" />
+	<!-- 网页标签标题 -->
+	<title>start</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  [...]
+<p>We recommend using java to define the Dubbo interface. And use <a href="https://github.com/apache/dubbo-erlang/tree/master/tools/erlanalysis">erlanalysis</a>
+tool parse java interface transfer to erlang lib.</p>
+<h2>Import Dependency Lib</h2>
+<h3>Using Rebar Build Tool</h3>
+<p>Add dubblerl to rebar.config with your project</p>
+<pre><code class="language-erlang">{deps, [
+    {dubboerl, {git, <span class="hljs-string">"https://github.com/apache/dubbo-erlang.git"</span>, {branch, <span class="hljs-string">"master"</span>}}}
+]}.
+</code></pre>
+<h3>User <a href="http://erlang.mk">erlang.mk</a> Build Tool</h3>
+<p><code>Waiting for improvement</code></p>
+<h2>Import interface lib</h2>
+<p>Suppose the interface lib you exported is called dubbo_service.</p>
+<ul>
+<li>If you didn't upload your lib to your git repository, It is recommended that you copy the <code>dubbo_service</code> lib
+into the project's <code>apps</code> directory.</li>
+<li>If it is upload to your git repository, you can import like this:</li>
+</ul>
+<pre><code class="language-erlang">{deps, [
+    {dubboerl, {git, <span class="hljs-string">"https://github.com/apache/dubbo-erlang.git"</span>, {branch, <span class="hljs-string">"master"</span>}}},
+    {dubbo_service,{git,<span class="hljs-string">"${INTERFACE_LIB_URL}"</span>,{branch,<span class="hljs-string">"master"</span>}}} <span class="hljs-comment">%% replace ${INTERFACE_LIB_URL} with your lib git repos url</span>
+]}.
+</code></pre>
+<h2>Consumer Configuration</h2>
+<p>Please reference <a href="./reference.md">Reference Config</a></p>
+<h2>Init dubbolib in your project</h2>
+<p>It is need you</p>
+<pre><code class="language-erlang">dubboerl:init().
+</code></pre>
+<h2>How to invoke?</h2>
+<h3>Sync Call</h3>
+<pre><code class="language-erlang">Request = #userInfoRequest{requestId = <span class="hljs-number">123</span>, username = <span class="hljs-string">"testname"</span>},
+{ok,RequestRef,Response,RpcContent}  = userOperator:<span class="hljs-keyword">query</span>UserInfo(Request,#{sync=&gt; true}).
+</code></pre>
+<p>If it occur error, is reponse <code>{error,Reason}</code>.</p>
+<h3>Async Call</h3>
+<p>Default is Async call.</p>
+<pre><code class="language-erlang">Request = #userInfoRequest{requestId = <span class="hljs-number">123</span>, username = <span class="hljs-string">"testname"</span>},
+{ok,RequestRef} = userOperator:<span class="hljs-keyword">query</span>UserInfo(Request).
+
+<span class="hljs-comment">%% you can receive the message after.</span>
+{msg_back,RequestRef,Response,RpcContent}.
+</code></pre>
+<h2>Sample</h2>
+<p>Reference the demo project <a href="https://github.com/apache/dubbo-erlang/tree/master/samples">dubboerl_demo</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">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 [...]
+	<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/user/languages/erlang/start.json b/en-us/docs/user/languages/erlang/start.json
new file mode 100644
index 0000000..39828ce
--- /dev/null
+++ b/en-us/docs/user/languages/erlang/start.json
@@ -0,0 +1,6 @@
+{
+  "filename": "start.md",
+  "__html": "<h1>Quick Start</h1>\n<p>We recommend using java to define the Dubbo interface. And use <a href=\"https://github.com/apache/dubbo-erlang/tree/master/tools/erlanalysis\">erlanalysis</a>\ntool parse java interface transfer to erlang lib.</p>\n<h2>Import Dependency Lib</h2>\n<h3>Using Rebar Build Tool</h3>\n<p>Add dubblerl to rebar.config with your project</p>\n<pre><code class=\"language-erlang\">{deps, [\n    {dubboerl, {git, <span class=\"hljs-string\">\"https://github.com/a [...]
+  "link": "/en-us/docs/user/languages/erlang/start.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/maturity.json b/en-us/docs/user/maturity.json
new file mode 100644
index 0000000..b8f8895
--- /dev/null
+++ b/en-us/docs/user/maturity.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..29b07d4
--- /dev/null
+++ b/en-us/docs/user/perf-test.json
@@ -0,0 +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 stab [...]
+  "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
new file mode 100644
index 0000000..5ddb083
--- /dev/null
+++ b/en-us/docs/user/preface/architecture.json
@@ -0,0 +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 i [...]
+  "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
new file mode 100644
index 0000000..80de071
--- /dev/null
+++ b/en-us/docs/user/preface/background.json
@@ -0,0 +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=\"imag [...]
+  "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
new file mode 100644
index 0000000..6f386e3
--- /dev/null
+++ b/en-us/docs/user/preface/index.json
@@ -0,0 +1,6 @@
+{
+  "filename": "index.md",
+  "__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
new file mode 100644
index 0000000..07d85a8
--- /dev/null
+++ b/en-us/docs/user/preface/requirements.json
@@ -0,0 +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 service 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 F [...]
+  "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
new file mode 100644
index 0000000..0f843c2
--- /dev/null
+++ b/en-us/docs/user/preface/usage.json
@@ -0,0 +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</s [...]
+  "link": "/en-us/docs/user/preface/usage.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/en-us/docs/user/recommend.json b/en-us/docs/user/recommend.json
new file mode 100644
index 0000000..243fec6
--- /dev/null
+++ b/en-us/docs/user/recommend.json
@@ -0,0 +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. T [...]
+  "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
new file mode 100644
index 0000000..e331f5f
--- /dev/null
+++ b/en-us/docs/user/references/api.json
@@ -0,0 +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>org.apache.dubbo.config.ServiceConfig\norg.apache.dubbo.config.ReferenceConfig\norg.apache.dubbo.config.ProtocolConfig\norg. [...]
+  "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
new file mode 100644
index 0000000..0c2d232
--- /dev/null
+++ b/en-us/docs/user/references/maven.json
@@ -0,0 +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 -Dapp [...]
+  "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
new file mode 100644
index 0000000..a191708
--- /dev/null
+++ b/en-us/docs/user/references/protocol/dubbo.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..fb97d7f
--- /dev/null
+++ b/en-us/docs/user/references/protocol/hessian.json
@@ -0,0 +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 us [...]
+  "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
new file mode 100644
index 0000000..4ba8ca3
--- /dev/null
+++ b/en-us/docs/user/references/protocol/http.json
@@ -0,0 +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>A [...]
+  "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
new file mode 100644
index 0000000..4697b27
--- /dev/null
+++ b/en-us/docs/user/references/protocol/introduction.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..838e53a
--- /dev/null
+++ b/en-us/docs/user/references/protocol/memcached.json
@@ -0,0 +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: [...]
+  "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
new file mode 100644
index 0000000..c05d639
--- /dev/null
+++ b/en-us/docs/user/references/protocol/redis.json
@@ -0,0 +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. [...]
+  "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/rest.json b/en-us/docs/user/references/protocol/rest.json
new file mode 100644
index 0000000..00b0ae5
--- /dev/null
+++ b/en-us/docs/user/references/protocol/rest.json
@@ -0,0 +1,6 @@
+{
+  "filename": "rest.md",
+  "__html": "<h1>rest://</h1>\n<p>基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持</p>\n<h2>快速入门</h2>\n<p>在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。</p>\n<p>这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。</p>\n<p>首先,开发服务的接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span  [...]
+  "link": "/en-us/docs/user/references/protocol/rest.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
new file mode 100644
index 0000000..21c1b73
--- /dev/null
+++ b/en-us/docs/user/references/protocol/thrift.json
@@ -0,0 +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=\"hl [...]
+  "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
new file mode 100644
index 0000000..4b460d1
--- /dev/null
+++ b/en-us/docs/user/references/protocol/webservice.json
@@ -0,0 +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 WebServic [...]
+  "link": "/en-us/docs/user/references/protocol/webservice.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
new file mode 100644
index 0000000..f2223ea
--- /dev/null
+++ b/en-us/docs/user/references/registry/introduction.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..8ee5a92
--- /dev/null
+++ b/en-us/docs/user/references/registry/multicast.json
@@ -0,0 +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 [...]
+  "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/nacos.html b/en-us/docs/user/references/registry/nacos.html
new file mode 100644
index 0000000..80e88fe
--- /dev/null
+++ b/en-us/docs/user/references/registry/nacos.html
@@ -0,0 +1,111 @@
+<!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="nacos" />
+	<meta name="description" content="nacos" />
+	<!-- 网页标签标题 -->
+	<title>nacos</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  [...]
+<p>Nacos is a very important registry center for Dubbo ecosystem, <a href="https://github.com/apache/incubator-dubbo/tree/master/dubbo-registry/dubbo-registry-nacos"><code>dubbo-registry-nacos</code></a> is the implementation of Nacos integration to Nacos.</p>
+<h2>Prepare Work</h2>
+<p>When you integrate <a href="https://github.com/apache/incubator-dubbo/tree/master/dubbo-registry/dubbo-registry-nacos"><code>dubbo-registry-nacos</code></a> into your Dubbo project, please Make sure the Nacos service is started in the background. If you are not familiar with the basic use of Nacos, you can refer to <a href="https://nacos.io/en-us/docs/quick-start.html">Nacos Quick Start</a>. It is recommended to use the version equal or above Nacos <code>1.0.0</code>.</p>
+<h2>Quick Start</h2>
+<p>The steps for Dubbo to integrate Nacos as a registry center are very simple. The general steps can be divided into &quot;add Maven dependencies&quot; and &quot;configure registry center&quot;.</p>
+<h3>Add Maven Dependencies</h3>
+<p>First, you need to add the <code>dubbo-registry-nacos</code> Maven dependency to your project's <code>pom.xml</code> file, and we strongly recommend that you use Dubbo <code>2.6.5</code>:</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
+
+    ...
+        
+    <span class="hljs-comment">&lt;!-- Dubbo Nacos registry dependency --&gt;</span>
+    <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>com.alibaba<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-registry-nacos<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>0.0.2<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>   
+    
+    <span class="hljs-comment">&lt;!-- Keep latest Nacos client version --&gt;</span>
+    <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>com.alibaba.nacos<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>nacos-client<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>[0.6.1,)<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>
+    
+    <span class="hljs-comment">&lt;!-- Dubbo dependency --&gt;</span>
+    <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>com.alibaba<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<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>2.6.5<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>
+    
+    <span class="hljs-comment">&lt;!-- Alibaba Spring Context extension --&gt;</span>
+    <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>com.alibaba.spring<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>spring-context-support<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>1.0.2<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>
+
+    ...
+    
+<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
+</code></pre>
+<p>When you add <code>dubbo-registry-nacos</code> to your project, you don't need to explicitly program the service discovery and registration logic. The actual implementation is provided by the three-party package.</p>
+<h3>Configure Registry Center</h3>
+<p>Assuming your Dubbo app uses the Spring Framework assembly, there are two configuration options available: [Dubbo Spring Externalization Configuration](<a href="https://mercyblitz.github.io/2018/01/18/Dubbo-%E5%25">https://mercyblitz.github.io/2018/01/18/Dubbo-�%</a> A4%96%E9%83%A8%E5%8C%96%E9%85%8D%E7%BD%AE/) and the Spring XML configuration file.</p>
+<h3><a href="https://mercyblitz.github.io/2018/01/18/Dubbo-%E5%A4%96%E9%83%A8%E5%8C%96%E9%85%8D%E7%BD%AE/">Dubbo Spring Externalization Configuration</a></h3>
+<p>The Dubbo Spring externalization configuration is a new feature introduced by Dubbo <code>2.5.8</code> that automatically generates and binds Dubbo configuration beans through the Spring <code>Environment</code> property, simplifying configuration and lowering the microservice development threshold.</p>
+<p>Assuming your Nacos Server is also running on server <code>10.20.153.10</code> and using the default Nacos service port <code>8848</code>, you only need to adjust the <code>dubbo.registry.address</code> property as follows:</p>
+<pre><code class="language-properties">## Other properties remain unchanged
+
+## Nacos registry address
+dubbo.registry.address = nacos://10.20.153.10:8848
+...
+</code></pre>
+<p>Then, restart your Dubbo app, Dubbo's service provider and consumer information can be displayed on the Nacos console:</p>
+<p><img src="../../../../../img/blog/dubbo-registry-nacos-1.png" alt="image-20181213103845976"></p>
+<p>As shown in the figure, the information whose service name prefix is <code>providers:</code> is the meta information of the service provider, and the <code>consumers:</code> represents the meta information of the service consumer. Click on &quot;<strong>Details</strong>&quot; to view service status details:</p>
+<p><img src="../../../../../img/blog/dubbo-registry-nacos-2.png" alt="image-20181213104145998"></p>
+<p>If you are using the Spring XML configuration file to assemble the Dubbo registry, please refer to the next section.</p>
+<h3>Spring XML Configuration File</h3>
+<p>Similar to <a href="https://mercyblitz.github.io/2018/01/18/Dubbo-%E5%A4%96%E9%83%A8%E5%8C%96%E9%85%8D%E7%BD%AE/">Dubbo Spring Externalization Configuration</a>, just adjust the <code>address</code> attribute to configure:</p>
+<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
+<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>
+    <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span>
+    <span class="hljs-attr">xmlns:dubbo</span>=<span class="hljs-string">"http://dubbo.apache.org/schema/dubbo"</span>
+    <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>
+ 
+    <span class="hljs-comment">&lt;!-- Provider application information for calculating dependencies --&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">dubbo:application</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dubbo-provider-xml-demo"</span>  /&gt;</span>
+ 
+    <span class="hljs-comment">&lt;!-- Use Nacos as Registry Center --&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"nacos://10.20.153.10:8848"</span> /&gt;</span>
+ 	...
+<span class="hljs-tag">&lt;/<span class="hljs-name">beans</span>&gt;</span>
+</code></pre>
+<p>After restarting the Dubbo app, you can also find that the registration meta-information of the service provider and consumer is presented on the Nacos console:</p>
+<p><img src="../../../../../img/blog/dubbo-registry-nacos-3.png" alt="image-20181213113049185"></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">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 [...]
+	<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/user/references/registry/nacos.json b/en-us/docs/user/references/registry/nacos.json
new file mode 100644
index 0000000..6d8e55d
--- /dev/null
+++ b/en-us/docs/user/references/registry/nacos.json
@@ -0,0 +1,6 @@
+{
+  "filename": "nacos.md",
+  "__html": "<h1>Nacos Registry Center</h1>\n<p>Nacos is a very important registry center for Dubbo ecosystem, <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-registry/dubbo-registry-nacos\"><code>dubbo-registry-nacos</code></a> is the implementation of Nacos integration to Nacos.</p>\n<h2>Prepare Work</h2>\n<p>When you integrate <a href=\"https://github.com/apache/incubator-dubbo/tree/master/dubbo-registry/dubbo-registry-nacos\"><code>dubbo-registry-nacos</code></a [...]
+  "link": "/en-us/docs/user/references/registry/nacos.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
new file mode 100644
index 0000000..a277905
--- /dev/null
+++ b/en-us/docs/user/references/registry/redis.json
@@ -0,0 +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 [...]
+  "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/zookeeper.json b/en-us/docs/user/references/registry/zookeeper.json
new file mode 100644
index 0000000..20deaff
--- /dev/null
+++ b/en-us/docs/user/references/registry/zookeeper.json
@@ -0,0 +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/zookeep [...]
+  "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
new file mode 100644
index 0000000..9bea1c5
--- /dev/null
+++ b/en-us/docs/user/references/telnet.json
@@ -0,0 +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://dubb [...]
+  "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
new file mode 100644
index 0000000..ac50d0a
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-application.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-application.md",
+  "__html": "<h1>dubbo:application</h1>\n<p>Application configuration. The corresponding class: <code>org.apache.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< [...]
+  "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
new file mode 100644
index 0000000..346d1ec
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-argument.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-argument.md",
+  "__html": "<h1>dubbo:argument</h1>\n<p>Method argument configuration. The corresponding class:<code>org.apache.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\"> [...]
+  "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
new file mode 100644
index 0000000..ffb7f11
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-consumer.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-consumer.md",
+  "__html": "<h1>dubbo:consumer</h1>\n<p>Consumer default configuration. The corresponding clas: <code>org.apache.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.time [...]
+  "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
new file mode 100644
index 0000000..05eb13b
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-method.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-method.md",
+  "__html": "<h1>dubbo:method</h1>\n<p>Method level configuration. The corresponding class: <code>org.apache.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 [...]
+  "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
new file mode 100644
index 0000000..78ffde6
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-module.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-module.md",
+  "__html": "<h1>dubbo:module</h1>\n<p>Module configuration. The corresponding class <code>org.apache.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  [...]
+  "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
new file mode 100644
index 0000000..43f96e7
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-monitor.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-monitor.md",
+  "__html": "<h1>dubbo:monitor</h1>\n<p>Monitor center configuration. The corresponding class: <code>org.apache.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> [...]
+  "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
new file mode 100644
index 0000000..db82377
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-parameter.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-parameter.md",
+  "__html": "<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 [...]
+  "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
new file mode 100644
index 0000000..6f04829
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-protocol.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-protocol.md",
+  "__html": "<h1>dubbo:protocol</h1>\n<p>Service provider protocol configuration. The corresponding class is <code>org.apache.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 [...]
+  "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
new file mode 100644
index 0000000..5ba8ec6
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-provider.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-provider.md",
+  "__html": "<h1>dubbo:provider</h1>\n<p>The default configuration of service provider. The corresponding class is <code>org.apache.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< [...]
+  "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
new file mode 100644
index 0000000..da26763
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-reference.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-reference.md",
+  "__html": "<h1>dubbo:reference</h1>\n<p>The configuration of service consumer. The corresponding class is<code>org.apache.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>Configuratio [...]
+  "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
new file mode 100644
index 0000000..8ddf180
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-registry.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-registry.md",
+  "__html": "<h1>dubbo:registry</h1>\n<p>The configuration of the registry center. The corresponding class is <code>org.apache.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>Correspon [...]
+  "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
new file mode 100644
index 0000000..290e7eb
--- /dev/null
+++ b/en-us/docs/user/references/xml/dubbo-service.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-service.md",
+  "__html": "<h1>dubbo:service</h1>\n<p>The configuration of the service provider. The corresponding class is <code>org.apache.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>Serv [...]
+  "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
new file mode 100644
index 0000000..1336f80
--- /dev/null
+++ b/en-us/docs/user/references/xml/introduction.json
@@ -0,0 +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  [...]
+  "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
new file mode 100644
index 0000000..9b078c0
--- /dev/null
+++ b/en-us/docs/user/rest.json
@@ -0,0 +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 t [...]
+  "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
new file mode 100644
index 0000000..9d296a5
--- /dev/null
+++ b/en-us/docs/user/simple-monitor.json
@@ -0,0 +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 [...]
+  "link": "/en-us/docs/user/simple-monitor.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..9dd7634
--- /dev/null
+++ b/index.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="UTF-8">
+</head>
+<body>
+  <!-- 添加Apache校验项开始 -->
+  <!-- 只加a标签和img标签,不要有其余的标签出现,同时设置style="display: none" -->
+  <a style="display: none" href="http://www.apache.org/events/current-event">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 comp [...]
+  <img style="display: none" src="http://dubbo.apache.org/img/apache_logo.png"/>
+  <ul style="display: none">
+    <p class="header">ASF</p>
+    <li><a href="http://www.apache.org">Foundation</a></li>
+    <li><a href="http://www.apache.org/licenses/">License</a></li>
+    <li><a href="http://www.apache.org/events/current-event">Events</a></li>
+    <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
+    <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+  </ul>
+  <p style="display: none">Copyright © 2018 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+  <a style="display: none" href="http://www.apache.org/security/">Security</a>
+  <!-- 添加Apache校验项结束 -->
+  <script src="//cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
+	<script>
+    window.rootPath = '';
+    window.defaultLanguage = 'en-us';
+    var lang = Cookies.get('docsite_language');
+    if (!lang) {
+      lang = 'en-us';
+    }
+    window.location = window.rootPath + '/' + lang;
+  </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/md_json/blog.json b/md_json/blog.json
new file mode 100644
index 0000000..6cfad96
--- /dev/null
+++ b/md_json/blog.json
@@ -0,0 +1,771 @@
+{
+  "en-us": [
+    {
+      "filename": "apachecon-na-2018.md",
+      "link": "/en-us/blog/apachecon-na-2018.html",
+      "meta": {
+        "title": "The ApacheCon NA schedule has been announced",
+        "keywords": "Dubbo, ApacheCon NA",
+        "description": "This article will introduce you that the ApacheCon NA schedule has been announced attention."
+      }
+    },
+    {
+      "filename": "download.md",
+      "link": "/en-us/blog/download.html",
+      "meta": {
+        "title": "Downloads",
+        "keywords": "Dubbo, Downloads, Version",
+        "description": "This article will introduce you how to understand the details of each version and upgrade matters needing attention."
+      }
+    },
+    {
+      "filename": "dubbo-101.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-annotation.md",
+      "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`."
+      }
+    },
+    {
+      "filename": "dubbo-basic-usage-dubbo-provider-configuration.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-fescar.md",
+      "link": "/en-us/blog/dubbo-fescar.html",
+      "meta": {
+        "title": "How to use Fescar to ensure consistency between Dubbo Microservices",
+        "keywords": "Dubbo,Fescar,Consistency",
+        "description": "This article will introduce you how to use Fescar to ensure consistency between Dubbo Microservices."
+      }
+    },
+    {
+      "filename": "dubbo-generic-invoke.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-invoke.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-k8s.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-loadbalance.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-meetup-beijing-may-12th-2018.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-meetup-chengdu.md",
+      "link": "/en-us/blog/dubbo-meetup-chengdu.html",
+      "meta": {
+        "title": "The fourth Dubbo meetup has been held in Chengdu",
+        "keywords": "Dubbo, Chengdu, meetup",
+        "description": "The fourth Dubbo meetup has been held in Chengdu."
+      }
+    },
+    {
+      "filename": "dubbo-meetup-hangzhou.md",
+      "link": "/en-us/blog/dubbo-meetup-hangzhou.html",
+      "meta": {
+        "title": "The fifth Dubbo meetup has been held in Hangzhou",
+        "keywords": "Dubbo, Hangzhou, meetup",
+        "description": "The fifth Dubbo meetup has been held in Hangzhou"
+      }
+    },
+    {
+      "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
+      "link": "/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
+      "meta": {
+        "title": "The second Dubbo Shanghai meetup has been held successfully",
+        "keywords": "Dubbo, Shanghai, meetup",
+        "description": "The second Dubbo Shanghai meetup has been held successfully."
+      }
+    },
+    {
+      "filename": "dubbo-meetup-shenzhen.md",
+      "link": "/en-us/blog/dubbo-meetup-shenzhen.html",
+      "meta": {
+        "title": "The third Dubbo meetup has been held in Shenzhen",
+        "keywords": "Dubbo, Shenzhen, meetup",
+        "description": "The third Dubbo meetup has been held in Shenzhen"
+      }
+    },
+    {
+      "filename": "dubbo-new-async.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo-zk.md",
+      "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."
+      }
+    },
+    {
+      "filename": "dubbo2-js.md",
+      "link": "/en-us/blog/dubbo2-js.html",
+      "meta": {
+        "title": "Implementation of cross-language calls by Dubbo2.js",
+        "keywords": "Dubbo, Cross-language, Node, NodeJS, js",
+        "description": "This article introduces how to use Dubbo.js to implement cross-language calls."
+      }
+    },
+    {
+      "filename": "gsoc-2018.md",
+      "link": "/en-us/blog/gsoc-2018.html",
+      "meta": {
+        "title": "GSoC 2018",
+        "keywords": "Dubbo, GSoC",
+        "description": "The GSoC(Google Summer of Code) 2018 projects has been announced"
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-qos.md",
+      "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."
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-spi-2.md",
+      "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."
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-spi.md",
+      "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."
+      }
+    },
+    {
+      "filename": "pinpoint.md",
+      "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."
+      }
+    },
+    {
+      "filename": "prepare-an-apache-release.md",
+      "link": "/en-us/blog/prepare-an-apache-release.html",
+      "meta": {
+        "title": "Understanding the Apache Release Cycle",
+        "keywords": "Dubbo, Apache, Release",
+        "description": "This article introduces how to the Apache publish content and process"
+      }
+    },
+    {
+      "filename": "qcon-beijing-2018.md",
+      "link": "/en-us/blog/qcon-beijing-2018.html",
+      "meta": {
+        "title": "Dubbo roadmap is announced in QCon Beijing 2018",
+        "keywords": "Dubbo, roadmap, QCon Beijing",
+        "description": "This article will introduce you that Dubbo roadmap is announced in QCon Beijing 2018."
+      }
+    },
+    {
+      "filename": "sentinel-introduction-for-dubbo.md",
+      "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."
+      }
+    },
+    {
+      "filename": "spring-boot-dubbo-start-stop-analysis.md",
+      "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 `dubbo-spring-boot-project`."
+      }
+    },
+    {
+      "filename": "tracing-with-skywalking.md",
+      "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."
+      }
+    }
+  ],
+  "zh-cn": [
+    {
+      "filename": "apachecon-na-2018.md",
+      "link": "/zh-cn/blog/apachecon-na-2018.html",
+      "meta": {
+        "title": "ApacheCon大会议程公布",
+        "keywords": "Dubbo, ApacheCon NA",
+        "description": "本文将向你介绍在ApacheCon大会议程公布上相关Dubbo议题演讲。"
+      }
+    },
+    {
+      "filename": "build-new-docker-image-in-dockerhub.md",
+      "link": "/zh-cn/blog/build-new-docker-image-in-dockerhub.html",
+      "meta": {
+        "title": "在DockerHub发布Dubbo Admin镜像",
+        "keywords": "Dubbo Admin,Docker,Dockerhub",
+        "description": "本文将介绍如何在Dockerhub上发布Dubbo Admin镜像。"
+      }
+    },
+    {
+      "filename": "download.md",
+      "link": "/zh-cn/blog/download.html",
+      "meta": {
+        "title": "下载中心",
+        "keywords": "Dubbo, Downloads, Version",
+        "description": "本文将向你介绍如何点击了解各版本详情和升级注意事项。"
+      }
+    },
+    {
+      "filename": "dubbo-101.md",
+      "link": "/zh-cn/blog/dubbo-101.html",
+      "meta": {
+        "title": "第一个 Dubbo 应用",
+        "keywords": "Dubbo, RPC, RMI",
+        "description": "现代的分布式服务框架的基本概念与 RMI 是类似的,同样是使用 Java 的 Interface 作为服务契约,通过注册中心来完成服务的注册和发现,远程通讯的细节也是通过代理类来屏蔽。"
+      }
+    },
+    {
+      "filename": "dubbo-27-features.md",
+      "link": "/zh-cn/blog/dubbo-27-features.html",
+      "meta": {
+        "title": "Dubbo2.7 三大新特性详解",
+        "keywords": "Dubbo2.7",
+        "description": "异步化改造,三大中心改造,服务治理增强"
+      }
+    },
+    {
+      "filename": "dubbo-admin.md",
+      "link": "/zh-cn/blog/dubbo-admin.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-annotation-driven.md",
+      "link": "/zh-cn/blog/dubbo-annotation-driven.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-annotation.md",
+      "link": "/zh-cn/blog/dubbo-annotation.html",
+      "meta": {
+        "title": "在 Dubbo 中使用注解",
+        "keywords": "Dubbo, Annotation, Spring",
+        "description": "介绍了如何使用注解方式而非 XML 方式来开发 Dubbo 应用,可以学习到如何使用 @EnableDubbo、@Service、@Reference 的用法。"
+      }
+    },
+    {
+      "filename": "dubbo-basic-usage-dubbo-consumer-configuration.md",
+      "link": "/zh-cn/blog/dubbo-basic-usage-dubbo-consumer-configuration.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-basic-usage-dubbo-provider-configuration.md",
+      "link": "/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.html",
+      "meta": {
+        "title": "Dubbo基础用法之Provider配置",
+        "keywords": "Dubbo, Provider, Configuration",
+        "description": "主要讲述如何配置dubbo,按照配置方式上可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。"
+      }
+    },
+    {
+      "filename": "dubbo-cluster-error-handling.md",
+      "link": "/zh-cn/blog/dubbo-cluster-error-handling.html",
+      "meta": {
+        "title": "Dubbo集群容错",
+        "keywords": "Dubbo, RPC, cluster, Error-handling",
+        "description": "在分布式系统中,集群某个某些节点出现问题是大概率事件,因此在设计分布式RPC框架的过程中,必须要把失败作为设计的一等公民来对待。一次调用失败之后,应该如何选择对失败的选择策略,这是一个见仁见智的问题,每种策略可能都有自己独特的应用场景。因此,作为框架来说,应当针对不同场景提供多种策略,供用户进行选择。本文介绍了Dubbo框架提供的多种错误处理策略,并通过实例说明如何进行配置。"
+      }
+    },
+    {
+      "filename": "dubbo-compatible.md",
+      "link": "/zh-cn/blog/dubbo-compatible.html",
+      "meta": {
+        "title": "Dubbo 2.7.x repackage后的兼容实现方案",
+        "keywords": "Dubbo, repackage, 兼容",
+        "description": "本文简单描述了2.7.x repackage后对老版本的兼容性实现方案。"
+      }
+    },
+    {
+      "filename": "dubbo-context-information.md",
+      "link": "/zh-cn/blog/dubbo-context-information.html",
+      "meta": {
+        "title": "Dubbo 上下文信息",
+        "keywords": "Dubbo,RPC Context, Attachment",
+        "description": "介绍Dubbo上下文信息的作用、应用场景、使用方式以及注意事项"
+      }
+    },
+    {
+      "filename": "dubbo-contribute-to-opensource.md",
+      "link": "/zh-cn/blog/dubbo-contribute-to-opensource.html",
+      "meta": {
+        "title": "以Dubbo为例,聊聊如何向开源项目做贡献",
+        "keywords": "Dubbo, opensource",
+        "description": "本文将会以 dubbo 项目为例向你阐释,给开源项目做贡献并不是一件难事"
+      }
+    },
+    {
+      "filename": "dubbo-copywriting-style.md",
+      "link": "/zh-cn/blog/dubbo-copywriting-style.html",
+      "meta": {
+        "title": "Dubbo 博客文档中文排版指南",
+        "keywords": "Dubbo, Copywriting",
+        "description": "统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。"
+      }
+    },
+    {
+      "filename": "dubbo-echo-test.md",
+      "link": "/zh-cn/blog/dubbo-echo-test.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-externalized-configuration.md",
+      "link": "/zh-cn/blog/dubbo-externalized-configuration.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-fescar.md",
+      "link": "/zh-cn/blog/dubbo-fescar.html",
+      "meta": {
+        "title": "如何使用Fescar保证Dubbo微服务间的一致性",
+        "keywords": "Dubbo,Fescar,一致性",
+        "description": "本文主要介绍如何使用Fescar保证Dubbo微服务间的一致性"
+      }
+    },
+    {
+      "filename": "dubbo-generic-invoke.md",
+      "link": "/zh-cn/blog/dubbo-generic-invoke.html",
+      "meta": {
+        "title": "Dubbo的泛化调用",
+        "keywords": "Dubbo, Generic invoke",
+        "description": "本文介绍了 Dubbo 泛化调用的使用场景及相关示例"
+      }
+    },
+    {
+      "filename": "dubbo-gracefully-shutdown.md",
+      "link": "/zh-cn/blog/dubbo-gracefully-shutdown.html",
+      "meta": {
+        "title": "Dubbo 优雅停机",
+        "keywords": "Dubbo, Gracefully Shutdown, Safely Shutdown",
+        "description": "介绍Dubbo优雅停机的原理和使用方式"
+      }
+    },
+    {
+      "filename": "dubbo-heartbeat-design.md",
+      "link": "/zh-cn/blog/dubbo-heartbeat-design.html",
+      "meta": {
+        "title": "Dubbo 现有心跳方案总结以及改进建议",
+        "keywords": "Dubbo, 心跳",
+        "description": "一种心跳,两种设计"
+      }
+    },
+    {
+      "filename": "dubbo-integrate-with-hystrix.md",
+      "link": "/zh-cn/blog/dubbo-integrate-with-hystrix.html",
+      "meta": {
+        "title": "Spring应用快速集成Dubbo + Hystrix",
+        "keywords": "Dubbo, Spring, Hystrix",
+        "description": "本文介绍在spring应用里,怎么把Dubbo和Hystrix结合起来使用。"
+      }
+    },
+    {
+      "filename": "dubbo-invoke.md",
+      "link": "/zh-cn/blog/dubbo-invoke.html",
+      "meta": {
+        "title": "Dubbo 关于同步/异步调用的几种方式",
+        "keywords": "Dubbo, Invoke, Async",
+        "description": "本文介绍了Dubbo基于异步通讯机制实现的几种同步和异步调用方式。"
+      }
+    },
+    {
+      "filename": "dubbo-k8s.md",
+      "link": "/zh-cn/blog/dubbo-k8s.html",
+      "meta": {
+        "title": "Dubbo与Kubernetes集成",
+        "keywords": "Dubbo, Kubernetes, K8S",
+        "description": "本文主要尝试将Dubbo服务注册到Kubernetes,同时无缝融入Kubernetes的多租户安全体系。"
+      }
+    },
+    {
+      "filename": "dubbo-loadbalance.md",
+      "link": "/zh-cn/blog/dubbo-loadbalance.html",
+      "meta": {
+        "title": "Dubbo的负载均衡",
+        "keywords": "Dubbo, LoadBalance",
+        "description": "本文介绍了负载均衡的相关概念以及 Dubbo 中的负载均衡策略实现。"
+      }
+    },
+    {
+      "filename": "dubbo-local-call.md",
+      "link": "/zh-cn/blog/dubbo-local-call.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-meet-arthas.md",
+      "link": "/zh-cn/blog/dubbo-meet-arthas.html",
+      "meta": {
+        "title": "当Dubbo遇上Arthas:排查问题的实践",
+        "keywords": "Dubbo, Arthas",
+        "description": "使用Alibaba开源的应用诊断利器Arthas来排查Dubbo应用的问题。"
+      }
+    },
+    {
+      "filename": "dubbo-meetup-beijing-may-12th-2018.md",
+      "link": "/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.html",
+      "meta": {
+        "title": "首届Dubbo开发者沙龙在北京成功举办",
+        "keywords": "Dubbo, Beijing, meetup",
+        "description": "首届Dubbo开发者沙龙在北京成功举办"
+      }
+    },
+    {
+      "filename": "dubbo-meetup-chengdu.md",
+      "link": "/zh-cn/blog/dubbo-meetup-chengdu.html",
+      "meta": {
+        "title": "第四届Dubbo开发者沙龙于8月26日在成都举行",
+        "keywords": "Dubbo, 成都, meetup",
+        "description": "第四届Dubbo开发者沙龙于8月26日在成都举行。"
+      }
+    },
+    {
+      "filename": "dubbo-meetup-hangzhou.md",
+      "link": "/zh-cn/blog/dubbo-meetup-hangzhou.html",
+      "meta": {
+        "title": "第五届Dubbo开发者沙龙在杭州成功举办",
+        "keywords": "Dubbo, 杭州, meetup",
+        "description": "第五届Dubbo开发者沙龙在杭州成功举办。"
+      }
+    },
+    {
+      "filename": "dubbo-meetup-shanghai-jun-23rd-2018.md",
+      "link": "/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.html",
+      "meta": {
+        "title": "第二届Dubbo开发者沙龙在上海成功举办",
+        "keywords": "Dubbo, 上海, meetup",
+        "description": "第二届Dubbo开发者沙龙在上海成功举办。"
+      }
+    },
+    {
+      "filename": "dubbo-meetup-shenzhen.md",
+      "link": "/zh-cn/blog/dubbo-meetup-shenzhen.html",
+      "meta": {
+        "title": "第三届Dubbo开发者沙龙在深圳成功举办",
+        "keywords": "Dubbo, 深圳, meetup",
+        "description": "第三届Dubbo开发者沙龙在深圳成功举办。"
+      }
+    },
+    {
+      "filename": "dubbo-mesh-in-thinking.md",
+      "link": "/zh-cn/blog/dubbo-mesh-in-thinking.html",
+      "meta": {
+        "title": "Dubbo在Service Mesh下的思考和方案",
+        "keywords": "Dubbo, Service Mesh, Cloud Native",
+        "description": "Dubbo是实现框架,融入servcemesh理念就是我们今天分享的。"
+      }
+    },
+    {
+      "filename": "dubbo-mesh-service-mesh-exploring.md",
+      "link": "/zh-cn/blog/dubbo-mesh-service-mesh-exploring.html",
+      "meta": {
+        "title": "Dubbo Mesh | Service Mesh的实践与探索",
+        "keywords": "Dubbo, Service Mesh",
+        "description": "本文介绍了Dubbo在Service Mesh方向的实践与探索"
+      }
+    },
+    {
+      "filename": "dubbo-network-interfaces.md",
+      "link": "/zh-cn/blog/dubbo-network-interfaces.html",
+      "meta": {
+        "title": "研究 Dubbo 网卡地址注册时的一点思考",
+        "keywords": "网卡地址注册",
+        "description": "研究 Dubbo 网卡地址注册时的一点思考"
+      }
+    },
+    {
+      "filename": "dubbo-new-async.md",
+      "link": "/zh-cn/blog/dubbo-new-async.html",
+      "meta": {
+        "title": "如何基于Dubbo实现全异步调用链",
+        "keywords": "Dubbo, 异步, async chain",
+        "description": "本文回顾了 2.6.x 版本的异步实现,然后引出了 2.7.0 版本基于 CompletableFuture 的异步编程方式。"
+      }
+    },
+    {
+      "filename": "dubbo-protocol.md",
+      "link": "/zh-cn/blog/dubbo-protocol.html",
+      "meta": {
+        "title": "DUBBO协议详解",
+        "keywords": "Dubbo, Protocol, RPC",
+        "description": "本文介绍了dubbo协议的设计"
+      }
+    },
+    {
+      "filename": "dubbo-registry-nacos-integration.md",
+      "link": "/zh-cn/blog/dubbo-registry-nacos-integration.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-rest.md",
+      "link": "/zh-cn/blog/dubbo-rest.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-stub-mock.md",
+      "link": "/zh-cn/blog/dubbo-stub-mock.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-zk.md",
+      "link": "/zh-cn/blog/dubbo-zk.html",
+      "meta": {
+        "title": "在 Dubbo 应用中使用 Zookeeper",
+        "keywords": "Dubbo, 注册中心, Zookeeper, ZK",
+        "description": "本文介绍了 Zookeeper 的基本概念、用法,以及如何在 Dubbo 应用中使用 Zookeeper 作为注册中心。"
+      }
+    },
+    {
+      "filename": "dubbo2-js.md",
+      "link": "/zh-cn/blog/dubbo2-js.html",
+      "meta": {
+        "title": "从跨语言调用到dubbo2.js",
+        "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
+        "description": "本文介绍了如何使用 dubbo2.js 进行跨语言的 dubbo 调用。"
+      }
+    },
+    {
+      "filename": "dubboAsync_client.md",
+      "link": "/zh-cn/blog/dubboAsync_client.html",
+      "meta": {
+        "title": "Dubbo客户端异步接口的实现背景和实践",
+        "keywords": "Dubbo, 异步, Reactive",
+        "description": "Dubbo客户端异步接口的实现背景和实践"
+      }
+    },
+    {
+      "filename": "dubboAsync_server.md",
+      "link": "/zh-cn/blog/dubboAsync_server.html",
+      "meta": {
+        "title": "Dubbo客户端异步接口的实现背景和实践",
+        "keywords": "Dubbo, 异步, Reactive",
+        "description": "Dubbo服务端异步接口的实现背景和实践"
+      }
+    },
+    {
+      "filename": "first-dubbo-filter.md",
+      "link": "/zh-cn/blog/first-dubbo-filter.html",
+      "meta": {}
+    },
+    {
+      "filename": "gsoc-2018.md",
+      "link": "/zh-cn/blog/gsoc-2018.html",
+      "meta": {
+        "title": "谷歌编程之夏会议上2018个项目被宣布",
+        "keywords": "Dubbo, GSoC",
+        "description": "谷歌编程之夏会议上2018个项目被宣布,Dubbo位列其中。"
+      }
+    },
+    {
+      "filename": "how-to-involve-dubbo-community.md",
+      "link": "/zh-cn/blog/how-to-involve-dubbo-community.html",
+      "meta": {
+        "title": "如何参与贡献Dubbo社区",
+        "keywords": "Dubbo, Apache Way",
+        "description": "本文介绍了如何以Apache Way的方式参与Dubbo社区并做贡献"
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-qos.md",
+      "link": "/zh-cn/blog/introduction-to-dubbo-qos.html",
+      "meta": {
+        "title": "通过QoS对服务进行动态控制",
+        "keywords": "Dubbo, qos",
+        "description": "本文介绍了如何使用Dubbo的QoS功能对服务进行动态配置,以及相关的参数及配置方式。"
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-spi-2.md",
+      "link": "/zh-cn/blog/introduction-to-dubbo-spi-2.html",
+      "meta": {
+        "title": "Dubbo可扩展机制源码解析",
+        "keywords": "Dubbo, SPI, 源码分析",
+        "description": "本文介绍了SPI扩展机制的实现原理与细节。"
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-spi.md",
+      "link": "/zh-cn/blog/introduction-to-dubbo-spi.html",
+      "meta": {
+        "title": "Dubbo可扩展机制实战",
+        "keywords": "Dubbo, SPI",
+        "description": "本文介绍了Dubbo框架的核心,SPI扩展机制。"
+      }
+    },
+    {
+      "filename": "introduction-to-dubbo-url.md",
+      "link": "/zh-cn/blog/introduction-to-dubbo-url.html",
+      "meta": {
+        "title": "Dubbo 中的 URL 统一模型",
+        "keywords": "Dubbo, URL",
+        "description": "URL 是 Dubbo 种一个重要的领域模型,了解它可以更加轻松的理解 Dubbo 的设计理念。"
+      }
+    },
+    {
+      "filename": "meet-dubbo.md",
+      "link": "/zh-cn/blog/meet-dubbo.html",
+      "meta": {
+        "title": "遇见Dubbo",
+        "keywords": "Dubbo, Committer",
+        "description": "本文记录了一个小白成长为Dubbo committer的过程。"
+      }
+    },
+    {
+      "filename": "optimization-branch-prediction.md",
+      "link": "/zh-cn/blog/optimization-branch-prediction.html",
+      "meta": {
+        "title": "提前if判断帮助CPU分支预测"
+      }
+    },
+    {
+      "filename": "pinpoint.md",
+      "link": "/zh-cn/blog/pinpoint.html",
+      "meta": {
+        "title": "使用Pinpoint做分布式跟踪",
+        "keywords": "Dubbo, Pinpoint, tracing",
+        "description": "本文介绍了利用Pinpoint对Dubbo分布式应用进行调用链跟踪与性能监控。"
+      }
+    },
+    {
+      "filename": "prepare-an-apache-release.md",
+      "link": "/zh-cn/blog/prepare-an-apache-release.html",
+      "meta": {
+        "title": "如何准备Apache Release",
+        "keywords": "Dubbo, Apache, Release",
+        "description": "本文介绍了Apache如何发布内容和流程"
+      }
+    },
+    {
+      "filename": "qcon-beijing-2018.md",
+      "link": "/zh-cn/blog/qcon-beijing-2018.html",
+      "meta": {
+        "title": "Dubbo路线图在QCon Beijing 2018上公布",
+        "keywords": "Dubbo, roadmap, QCon Beijing",
+        "description": "本文将向你介绍在QCon Beijing 2018上公布Dubbo路线图。"
+      }
+    },
+    {
+      "filename": "sentinel-introduction-for-dubbo.md",
+      "link": "/zh-cn/blog/sentinel-introduction-for-dubbo.html",
+      "meta": {
+        "title": "Sentinel 为 Dubbo 服务保驾护航",
+        "keywords": "Dubbo, Sentinel, 限流, 熔断",
+        "description": "本文主要介绍了面向分布式服务架构的轻量级流量控制组件 Sentinel 以及在 Dubbo 中整合使用 Sentinel 的最佳实践。"
+      }
+    },
+    {
+      "filename": "service-and-version.md",
+      "link": "/zh-cn/blog/service-and-version.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-test.md",
+      "link": "/zh-cn/blog/service-test.html",
+      "meta": {}
+    },
+    {
+      "filename": "spring-boot-dubbo-start-stop-analysis.md",
+      "link": "/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html",
+      "meta": {
+        "title": "Spring Boot Dubbo应用启停源码分析",
+        "keywords": "Dubbo, Spring Boot, 源码分析",
+        "description": "本文分析 `dubbo-spring-boot-project` 中 Dubbo 启停源码的实现原理。"
+      }
+    },
+    {
+      "filename": "test-verification.md",
+      "link": "/zh-cn/blog/test-verification.html",
+      "meta": {}
+    },
+    {
+      "filename": "tracing-with-skywalking.md",
+      "link": "/zh-cn/blog/tracing-with-skywalking.html",
+      "meta": {
+        "title": "使用Apache Skywalking (Incubator) 做分布式跟踪",
+        "keywords": "Dubbo, Skywalking, tracing, 分布式跟踪",
+        "description": "本文介绍如何使用 Apache Skywalking 对 Dubbo 应用做分布式链路追踪。"
+      }
+    },
+    {
+      "filename": "use-zipkin-in-dubbo.md",
+      "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/md_json/docs.json b/md_json/docs.json
new file mode 100644
index 0000000..e356d32
--- /dev/null
+++ b/md_json/docs.json
@@ -0,0 +1,2110 @@
+{
+  "en-us": [
+    {
+      "filename": "README.md",
+      "link": "/en-us/docs/admin/README.html",
+      "meta": {}
+    },
+    {
+      "filename": "SUMMARY.md",
+      "link": "/en-us/docs/admin/SUMMARY.html",
+      "meta": {}
+    },
+    {
+      "filename": "admin-console.md",
+      "link": "/en-us/docs/admin/install/admin-console.html",
+      "meta": {}
+    },
+    {
+      "filename": "consumer-demo.md",
+      "link": "/en-us/docs/admin/install/consumer-demo.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/admin/install/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "provider-demo.md",
+      "link": "/en-us/docs/admin/install/provider-demo.html",
+      "meta": {}
+    },
+    {
+      "filename": "redis.md",
+      "link": "/en-us/docs/admin/install/redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple-monitor-center.md",
+      "link": "/en-us/docs/admin/install/simple-monitor-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple-registry-center.md",
+      "link": "/en-us/docs/admin/install/simple-registry-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "zookeeper.md",
+      "link": "/en-us/docs/admin/install/zookeeper.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/admin/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-ops.md",
+      "link": "/en-us/docs/admin/ops/dubbo-ops.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/admin/ops/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "pinpoint.md",
+      "link": "/en-us/docs/admin/ops/pinpoint.html",
+      "meta": {}
+    },
+    {
+      "filename": "skywalking.md",
+      "link": "/en-us/docs/admin/ops/skywalking.html",
+      "meta": {}
+    },
+    {
+      "filename": "serviceGovernance.md",
+      "link": "/en-us/docs/admin/serviceGovernance.html",
+      "meta": {}
+    },
+    {
+      "filename": "serviceSearch.md",
+      "link": "/en-us/docs/admin/serviceSearch.html",
+      "meta": {}
+    },
+    {
+      "filename": "serviceTest.md",
+      "link": "/en-us/docs/admin/serviceTest.html",
+      "meta": {}
+    },
+    {
+      "filename": "README.md",
+      "link": "/en-us/docs/dev/README.html",
+      "meta": {}
+    },
+    {
+      "filename": "SPI.md",
+      "link": "/en-us/docs/dev/SPI.html",
+      "meta": {}
+    },
+    {
+      "filename": "SUMMARY.md",
+      "link": "/en-us/docs/dev/SUMMARY.html",
+      "meta": {}
+    },
+    {
+      "filename": "TCK.md",
+      "link": "/en-us/docs/dev/TCK.html",
+      "meta": {}
+    },
+    {
+      "filename": "build.md",
+      "link": "/en-us/docs/dev/build.html",
+      "meta": {}
+    },
+    {
+      "filename": "checklist.md",
+      "link": "/en-us/docs/dev/checklist.html",
+      "meta": {}
+    },
+    {
+      "filename": "code-smell.md",
+      "link": "/en-us/docs/dev/code-smell.html",
+      "meta": {}
+    },
+    {
+      "filename": "coding.md",
+      "link": "/en-us/docs/dev/coding.html",
+      "meta": {}
+    },
+    {
+      "filename": "contract.md",
+      "link": "/en-us/docs/dev/contract.html",
+      "meta": {}
+    },
+    {
+      "filename": "contribution.md",
+      "link": "/en-us/docs/dev/contribution.html",
+      "meta": {}
+    },
+    {
+      "filename": "design.md",
+      "link": "/en-us/docs/dev/design.html",
+      "meta": {}
+    },
+    {
+      "filename": "implementation.md",
+      "link": "/en-us/docs/dev/implementation.html",
+      "meta": {}
+    },
+    {
+      "filename": "cache.md",
+      "link": "/en-us/docs/dev/impls/cache.html",
+      "meta": {}
+    },
+    {
+      "filename": "cluster.md",
+      "link": "/en-us/docs/dev/impls/cluster.html",
+      "meta": {}
+    },
+    {
+      "filename": "compiler.md",
+      "link": "/en-us/docs/dev/impls/compiler.html",
+      "meta": {}
+    },
+    {
+      "filename": "container.md",
+      "link": "/en-us/docs/dev/impls/container.html",
+      "meta": {}
+    },
+    {
+      "filename": "dispatcher.md",
+      "link": "/en-us/docs/dev/impls/dispatcher.html",
+      "meta": {}
+    },
+    {
+      "filename": "exchanger.md",
+      "link": "/en-us/docs/dev/impls/exchanger.html",
+      "meta": {}
+    },
+    {
+      "filename": "exporter-listener.md",
+      "link": "/en-us/docs/dev/impls/exporter-listener.html",
+      "meta": {}
+    },
+    {
+      "filename": "extension-factory.md",
+      "link": "/en-us/docs/dev/impls/extension-factory.html",
+      "meta": {}
+    },
+    {
+      "filename": "filter.md",
+      "link": "/en-us/docs/dev/impls/filter.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/dev/impls/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "invoker-listener.md",
+      "link": "/en-us/docs/dev/impls/invoker-listener.html",
+      "meta": {}
+    },
+    {
+      "filename": "load-balance.md",
+      "link": "/en-us/docs/dev/impls/load-balance.html",
+      "meta": {}
+    },
+    {
+      "filename": "logger-adapter.md",
+      "link": "/en-us/docs/dev/impls/logger-adapter.html",
+      "meta": {}
+    },
+    {
+      "filename": "merger.md",
+      "link": "/en-us/docs/dev/impls/merger.html",
+      "meta": {}
+    },
+    {
+      "filename": "monitor.md",
+      "link": "/en-us/docs/dev/impls/monitor.html",
+      "meta": {}
+    },
+    {
+      "filename": "networker.md",
+      "link": "/en-us/docs/dev/impls/networker.html",
+      "meta": {}
+    },
+    {
+      "filename": "page.md",
+      "link": "/en-us/docs/dev/impls/page.html",
+      "meta": {}
+    },
+    {
+      "filename": "protocol.md",
+      "link": "/en-us/docs/dev/impls/protocol.html",
+      "meta": {}
+    },
+    {
+      "filename": "proxy-factory.md",
+      "link": "/en-us/docs/dev/impls/proxy-factory.html",
+      "meta": {}
+    },
+    {
+      "filename": "registry.md",
+      "link": "/en-us/docs/dev/impls/registry.html",
+      "meta": {}
+    },
+    {
+      "filename": "remoting.md",
+      "link": "/en-us/docs/dev/impls/remoting.html",
+      "meta": {}
+    },
+    {
+      "filename": "router.md",
+      "link": "/en-us/docs/dev/impls/router.html",
+      "meta": {}
+    },
+    {
+      "filename": "serialize.md",
+      "link": "/en-us/docs/dev/impls/serialize.html",
+      "meta": {}
+    },
+    {
+      "filename": "status-checker.md",
+      "link": "/en-us/docs/dev/impls/status-checker.html",
+      "meta": {}
+    },
+    {
+      "filename": "telnet-handler.md",
+      "link": "/en-us/docs/dev/impls/telnet-handler.html",
+      "meta": {}
+    },
+    {
+      "filename": "threadpool.md",
+      "link": "/en-us/docs/dev/impls/threadpool.html",
+      "meta": {}
+    },
+    {
+      "filename": "validation.md",
+      "link": "/en-us/docs/dev/impls/validation.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/dev/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "code-detail.md",
+      "link": "/en-us/docs/dev/principals/code-detail.html",
+      "meta": {}
+    },
+    {
+      "filename": "configuration.md",
+      "link": "/en-us/docs/dev/principals/configuration.html",
+      "meta": {}
+    },
+    {
+      "filename": "dummy.md",
+      "link": "/en-us/docs/dev/principals/dummy.html",
+      "meta": {}
+    },
+    {
+      "filename": "expansibility.md",
+      "link": "/en-us/docs/dev/principals/expansibility.html",
+      "meta": {}
+    },
+    {
+      "filename": "extension.md",
+      "link": "/en-us/docs/dev/principals/extension.html",
+      "meta": {}
+    },
+    {
+      "filename": "general-knowledge.md",
+      "link": "/en-us/docs/dev/principals/general-knowledge.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/dev/principals/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "robustness.md",
+      "link": "/en-us/docs/dev/principals/robustness.html",
+      "meta": {}
+    },
+    {
+      "filename": "release.md",
+      "link": "/en-us/docs/dev/release.html",
+      "meta": {}
+    },
+    {
+      "filename": "apache-dubbo-page_dev.md",
+      "link": "/en-us/docs/developers/committer-guide/apache-dubbo-page_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "label-an-issue-guide_dev.md",
+      "link": "/en-us/docs/developers/committer-guide/label-an-issue-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "new-committer-guide_dev.md",
+      "link": "/en-us/docs/developers/committer-guide/new-committer-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "release-guide_dev.md",
+      "link": "/en-us/docs/developers/committer-guide/release-guide_dev.html",
+      "meta": {
+        "title": "Understanding the Apache Release Cycle",
+        "keywords": "Dubbo, Apache, Release"
+      }
+    },
+    {
+      "filename": "website-guide_dev.md",
+      "link": "/en-us/docs/developers/committer-guide/website-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "become-a-committer_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/become-a-committer_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "cla-signing-guide_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/cla-signing-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-extension-guide_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/dubbo-extension-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "mailing-list-subscription-guide_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "new-contributor-guide_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "reporting-security-issues_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/reporting-security-issues_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "software-donation-guide_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/software-donation-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "test-coverage-guide_dev.md",
+      "link": "/en-us/docs/developers/contributor-guide/test-coverage-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "developers_dev.md",
+      "link": "/en-us/docs/developers/developers_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "guide_dev.md",
+      "link": "/en-us/docs/developers/guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "faq_dev.md",
+      "link": "/en-us/docs/developers/user-guide/faq_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "README.md",
+      "link": "/en-us/docs/user/README.html",
+      "meta": {}
+    },
+    {
+      "filename": "SUMMARY.md",
+      "link": "/en-us/docs/user/SUMMARY.html",
+      "meta": {}
+    },
+    {
+      "filename": "benchmark-tool.md",
+      "link": "/en-us/docs/user/benchmark-tool.html",
+      "meta": {}
+    },
+    {
+      "filename": "best-practice.md",
+      "link": "/en-us/docs/user/best-practice.html",
+      "meta": {}
+    },
+    {
+      "filename": "capacity-plan.md",
+      "link": "/en-us/docs/user/capacity-plan.html",
+      "meta": {}
+    },
+    {
+      "filename": "annotation.md",
+      "link": "/en-us/docs/user/configuration/annotation.html",
+      "meta": {}
+    },
+    {
+      "filename": "api.md",
+      "link": "/en-us/docs/user/configuration/api.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/en-us/docs/user/configuration/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "properties.md",
+      "link": "/en-us/docs/user/configuration/properties.html",
+      "meta": {}
+    },
+    {
+      "filename": "xml.md",
+      "link": "/en-us/docs/user/configuration/xml.html",
+      "meta": {}
+    },
+    {
+      "filename": "coveragence.md",
+      "link": "/en-us/docs/user/coveragence.html",
+      "meta": {}
+    },
+    {
+      "filename": "accesslog.md",
+      "link": "/en-us/docs/user/demos/accesslog.html",
+      "meta": {}
+    },
+    {
+      "filename": "async-call.md",
+      "link": "/en-us/docs/user/demos/async-call.html",
+      "meta": {}
+    },
+    {
+      "filename": "attachment.md",
+      "link": "/en-us/docs/user/demos/attachment.html",
+      "meta": {}
+    },
+    {
+      "filename": "callback-parameter.md",
+      "link": "/en-us/docs/user/demos/callback-parameter.html",
+      "meta": {}
+    },
+    {
+      "filename": "concurrency-control.md",
+      "link": "/en-us/docs/user/demos/concurrency-control.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-connections.md",
+      "link": "/en-us/docs/user/demos/config-connections.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-rule.md",
+      "link": "/en-us/docs/user/demos/config-rule.html",
+      "meta": {}
+    },
+    {
+      "filename": "context.md",
+      "link": "/en-us/docs/user/demos/context.html",
+      "meta": {}
+    },
+    {
+      "filename": "delay-publish.md",
+      "link": "/en-us/docs/user/demos/delay-publish.html",
+      "meta": {}
+    },
+    {
+      "filename": "distributed-transaction.md",
+      "link": "/en-us/docs/user/demos/distributed-transaction.html",
+      "meta": {}
+    },
+    {
+      "filename": "dump.md",
+      "link": "/en-us/docs/user/demos/dump.html",
+      "meta": {}
+    },
+    {
+      "filename": "echo-service.md",
+      "link": "/en-us/docs/user/demos/echo-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "events-notify.md",
+      "link": "/en-us/docs/user/demos/events-notify.html",
+      "meta": {}
+    },
+    {
+      "filename": "explicit-target.md",
+      "link": "/en-us/docs/user/demos/explicit-target.html",
+      "meta": {}
+    },
+    {
+      "filename": "fault-tolerent-strategy.md",
+      "link": "/en-us/docs/user/demos/fault-tolerent-strategy.html",
+      "meta": {}
+    },
+    {
+      "filename": "generic-reference.md",
+      "link": "/en-us/docs/user/demos/generic-reference.html",
+      "meta": {}
+    },
+    {
+      "filename": "generic-service.md",
+      "link": "/en-us/docs/user/demos/generic-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "graceful-shutdown.md",
+      "link": "/en-us/docs/user/demos/graceful-shutdown.html",
+      "meta": {}
+    },
+    {
+      "filename": "group-merger.md",
+      "link": "/en-us/docs/user/demos/group-merger.html",
+      "meta": {}
+    },
+    {
+      "filename": "hostname-binding.md",
+      "link": "/en-us/docs/user/demos/hostname-binding.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/en-us/docs/user/demos/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/user/demos/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "lazy-connect.md",
+      "link": "/en-us/docs/user/demos/lazy-connect.html",
+      "meta": {}
+    },
+    {
+      "filename": "loadbalance.md",
+      "link": "/en-us/docs/user/demos/loadbalance.html",
+      "meta": {}
+    },
+    {
+      "filename": "local-call.md",
+      "link": "/en-us/docs/user/demos/local-call.html",
+      "meta": {}
+    },
+    {
+      "filename": "local-mock.md",
+      "link": "/en-us/docs/user/demos/local-mock.html",
+      "meta": {}
+    },
+    {
+      "filename": "local-stub.md",
+      "link": "/en-us/docs/user/demos/local-stub.html",
+      "meta": {}
+    },
+    {
+      "filename": "logger-strategy.md",
+      "link": "/en-us/docs/user/demos/logger-strategy.html",
+      "meta": {}
+    },
+    {
+      "filename": "multi-protocols.md",
+      "link": "/en-us/docs/user/demos/multi-protocols.html",
+      "meta": {}
+    },
+    {
+      "filename": "multi-registry.md",
+      "link": "/en-us/docs/user/demos/multi-registry.html",
+      "meta": {}
+    },
+    {
+      "filename": "multi-versions.md",
+      "link": "/en-us/docs/user/demos/multi-versions.html",
+      "meta": {}
+    },
+    {
+      "filename": "netty4.md",
+      "link": "/en-us/docs/user/demos/netty4.html",
+      "meta": {}
+    },
+    {
+      "filename": "parameter-validation.md",
+      "link": "/en-us/docs/user/demos/parameter-validation.html",
+      "meta": {}
+    },
+    {
+      "filename": "preflight-check.md",
+      "link": "/en-us/docs/user/demos/preflight-check.html",
+      "meta": {}
+    },
+    {
+      "filename": "reference-config-cache.md",
+      "link": "/en-us/docs/user/demos/reference-config-cache.html",
+      "meta": {}
+    },
+    {
+      "filename": "registry-only.md",
+      "link": "/en-us/docs/user/demos/registry-only.html",
+      "meta": {}
+    },
+    {
+      "filename": "result-cache.md",
+      "link": "/en-us/docs/user/demos/result-cache.html",
+      "meta": {}
+    },
+    {
+      "filename": "routing-rule.md",
+      "link": "/en-us/docs/user/demos/routing-rule.html",
+      "meta": {}
+    },
+    {
+      "filename": "serialization.md",
+      "link": "/en-us/docs/user/demos/serialization.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-container.md",
+      "link": "/en-us/docs/user/demos/service-container.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-downgrade.md",
+      "link": "/en-us/docs/user/demos/service-downgrade.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-group.md",
+      "link": "/en-us/docs/user/demos/service-group.html",
+      "meta": {}
+    },
+    {
+      "filename": "static-service.md",
+      "link": "/en-us/docs/user/demos/static-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "stickiness.md",
+      "link": "/en-us/docs/user/demos/stickiness.html",
+      "meta": {}
+    },
+    {
+      "filename": "subscribe-only.md",
+      "link": "/en-us/docs/user/demos/subscribe-only.html",
+      "meta": {}
+    },
+    {
+      "filename": "thread-model.md",
+      "link": "/en-us/docs/user/demos/thread-model.html",
+      "meta": {}
+    },
+    {
+      "filename": "token-authorization.md",
+      "link": "/en-us/docs/user/demos/token-authorization.html",
+      "meta": {}
+    },
+    {
+      "filename": "dependencies.md",
+      "link": "/en-us/docs/user/dependencies.html",
+      "meta": {}
+    },
+    {
+      "filename": "reference.md",
+      "link": "/en-us/docs/user/languages/erlang/reference.html",
+      "meta": {}
+    },
+    {
+      "filename": "serialization.md",
+      "link": "/en-us/docs/user/languages/erlang/serialization.html",
+      "meta": {}
+    },
+    {
+      "filename": "service.md",
+      "link": "/en-us/docs/user/languages/erlang/service.html",
+      "meta": {}
+    },
+    {
+      "filename": "start.md",
+      "link": "/en-us/docs/user/languages/erlang/start.html",
+      "meta": {}
+    },
+    {
+      "filename": "maturity.md",
+      "link": "/en-us/docs/user/maturity.html",
+      "meta": {}
+    },
+    {
+      "filename": "perf-test.md",
+      "link": "/en-us/docs/user/perf-test.html",
+      "meta": {}
+    },
+    {
+      "filename": "architecture.md",
+      "link": "/en-us/docs/user/preface/architecture.html",
+      "meta": {}
+    },
+    {
+      "filename": "background.md",
+      "link": "/en-us/docs/user/preface/background.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/en-us/docs/user/preface/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "requirements.md",
+      "link": "/en-us/docs/user/preface/requirements.html",
+      "meta": {}
+    },
+    {
+      "filename": "usage.md",
+      "link": "/en-us/docs/user/preface/usage.html",
+      "meta": {}
+    },
+    {
+      "filename": "quick-start.md",
+      "link": "/en-us/docs/user/quick-start.html",
+      "meta": {}
+    },
+    {
+      "filename": "recommend.md",
+      "link": "/en-us/docs/user/recommend.html",
+      "meta": {}
+    },
+    {
+      "filename": "api.md",
+      "link": "/en-us/docs/user/references/api.html",
+      "meta": {}
+    },
+    {
+      "filename": "maven.md",
+      "link": "/en-us/docs/user/references/maven.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo.md",
+      "link": "/en-us/docs/user/references/protocol/dubbo.html",
+      "meta": {}
+    },
+    {
+      "filename": "hessian.md",
+      "link": "/en-us/docs/user/references/protocol/hessian.html",
+      "meta": {}
+    },
+    {
+      "filename": "http.md",
+      "link": "/en-us/docs/user/references/protocol/http.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/user/references/protocol/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "memcached.md",
+      "link": "/en-us/docs/user/references/protocol/memcached.html",
+      "meta": {}
+    },
+    {
+      "filename": "redis.md",
+      "link": "/en-us/docs/user/references/protocol/redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "rest.md",
+      "link": "/en-us/docs/user/references/protocol/rest.html",
+      "meta": {}
+    },
+    {
+      "filename": "rmi.md",
+      "link": "/en-us/docs/user/references/protocol/rmi.html",
+      "meta": {}
+    },
+    {
+      "filename": "thrift.md",
+      "link": "/en-us/docs/user/references/protocol/thrift.html",
+      "meta": {}
+    },
+    {
+      "filename": "webservice.md",
+      "link": "/en-us/docs/user/references/protocol/webservice.html",
+      "meta": {}
+    },
+    {
+      "filename": "qos.md",
+      "link": "/en-us/docs/user/references/qos.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/user/references/registry/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "multicast.md",
+      "link": "/en-us/docs/user/references/registry/multicast.html",
+      "meta": {}
+    },
+    {
+      "filename": "nacos.md",
+      "link": "/en-us/docs/user/references/registry/nacos.html",
+      "meta": {}
+    },
+    {
+      "filename": "redis.md",
+      "link": "/en-us/docs/user/references/registry/redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple.md",
+      "link": "/en-us/docs/user/references/registry/simple.html",
+      "meta": {}
+    },
+    {
+      "filename": "zookeeper.md",
+      "link": "/en-us/docs/user/references/registry/zookeeper.html",
+      "meta": {}
+    },
+    {
+      "filename": "telnet.md",
+      "link": "/en-us/docs/user/references/telnet.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-application.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-application.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-argument.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-argument.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-consumer.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-consumer.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-method.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-method.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-module.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-module.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-monitor.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-monitor.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-parameter.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-parameter.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-protocol.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-protocol.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-provider.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-provider.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-reference.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-reference.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-registry.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-registry.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-service.md",
+      "link": "/en-us/docs/user/references/xml/dubbo-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/en-us/docs/user/references/xml/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "rest.md",
+      "link": "/en-us/docs/user/rest.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple-monitor.md",
+      "link": "/en-us/docs/user/simple-monitor.html",
+      "meta": {}
+    }
+  ],
+  "zh-cn": [
+    {
+      "filename": "README.md",
+      "link": "/zh-cn/docs/admin/README.html",
+      "meta": {}
+    },
+    {
+      "filename": "SUMMARY.md",
+      "link": "/zh-cn/docs/admin/SUMMARY.html",
+      "meta": {}
+    },
+    {
+      "filename": "admin-console.md",
+      "link": "/zh-cn/docs/admin/install/admin-console.html",
+      "meta": {}
+    },
+    {
+      "filename": "consumer-demo.md",
+      "link": "/zh-cn/docs/admin/install/consumer-demo.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/admin/install/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "provider-demo.md",
+      "link": "/zh-cn/docs/admin/install/provider-demo.html",
+      "meta": {}
+    },
+    {
+      "filename": "redis.md",
+      "link": "/zh-cn/docs/admin/install/redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple-monitor-center.md",
+      "link": "/zh-cn/docs/admin/install/simple-monitor-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple-registry-center.md",
+      "link": "/zh-cn/docs/admin/install/simple-registry-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "zookeeper.md",
+      "link": "/zh-cn/docs/admin/install/zookeeper.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/admin/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-ops.md",
+      "link": "/zh-cn/docs/admin/ops/dubbo-ops.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/admin/ops/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "pinpoint.md",
+      "link": "/zh-cn/docs/admin/ops/pinpoint.html",
+      "meta": {}
+    },
+    {
+      "filename": "skywalking.md",
+      "link": "/zh-cn/docs/admin/ops/skywalking.html",
+      "meta": {}
+    },
+    {
+      "filename": "serviceGovernance.md",
+      "link": "/zh-cn/docs/admin/serviceGovernance.html",
+      "meta": {}
+    },
+    {
+      "filename": "serviceSearch.md",
+      "link": "/zh-cn/docs/admin/serviceSearch.html",
+      "meta": {}
+    },
+    {
+      "filename": "serviceTest.md",
+      "link": "/zh-cn/docs/admin/serviceTest.html",
+      "meta": {}
+    },
+    {
+      "filename": "README.md",
+      "link": "/zh-cn/docs/dev/README.html",
+      "meta": {}
+    },
+    {
+      "filename": "SPI.md",
+      "link": "/zh-cn/docs/dev/SPI.html",
+      "meta": {}
+    },
+    {
+      "filename": "SUMMARY.md",
+      "link": "/zh-cn/docs/dev/SUMMARY.html",
+      "meta": {}
+    },
+    {
+      "filename": "TCK.md",
+      "link": "/zh-cn/docs/dev/TCK.html",
+      "meta": {}
+    },
+    {
+      "filename": "build.md",
+      "link": "/zh-cn/docs/dev/build.html",
+      "meta": {}
+    },
+    {
+      "filename": "checklist.md",
+      "link": "/zh-cn/docs/dev/checklist.html",
+      "meta": {}
+    },
+    {
+      "filename": "code-smell.md",
+      "link": "/zh-cn/docs/dev/code-smell.html",
+      "meta": {}
+    },
+    {
+      "filename": "coding.md",
+      "link": "/zh-cn/docs/dev/coding.html",
+      "meta": {}
+    },
+    {
+      "filename": "contract.md",
+      "link": "/zh-cn/docs/dev/contract.html",
+      "meta": {}
+    },
+    {
+      "filename": "contribution.md",
+      "link": "/zh-cn/docs/dev/contribution.html",
+      "meta": {}
+    },
+    {
+      "filename": "design.md",
+      "link": "/zh-cn/docs/dev/design.html",
+      "meta": {}
+    },
+    {
+      "filename": "implementation.md",
+      "link": "/zh-cn/docs/dev/implementation.html",
+      "meta": {}
+    },
+    {
+      "filename": "cache.md",
+      "link": "/zh-cn/docs/dev/impls/cache.html",
+      "meta": {}
+    },
+    {
+      "filename": "cluster.md",
+      "link": "/zh-cn/docs/dev/impls/cluster.html",
+      "meta": {}
+    },
+    {
+      "filename": "compiler.md",
+      "link": "/zh-cn/docs/dev/impls/compiler.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-center.md",
+      "link": "/zh-cn/docs/dev/impls/config-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "container.md",
+      "link": "/zh-cn/docs/dev/impls/container.html",
+      "meta": {}
+    },
+    {
+      "filename": "dispatcher.md",
+      "link": "/zh-cn/docs/dev/impls/dispatcher.html",
+      "meta": {}
+    },
+    {
+      "filename": "exchanger.md",
+      "link": "/zh-cn/docs/dev/impls/exchanger.html",
+      "meta": {}
+    },
+    {
+      "filename": "exporter-listener.md",
+      "link": "/zh-cn/docs/dev/impls/exporter-listener.html",
+      "meta": {}
+    },
+    {
+      "filename": "extension-factory.md",
+      "link": "/zh-cn/docs/dev/impls/extension-factory.html",
+      "meta": {}
+    },
+    {
+      "filename": "filter.md",
+      "link": "/zh-cn/docs/dev/impls/filter.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/dev/impls/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "invoker-listener.md",
+      "link": "/zh-cn/docs/dev/impls/invoker-listener.html",
+      "meta": {}
+    },
+    {
+      "filename": "load-balance.md",
+      "link": "/zh-cn/docs/dev/impls/load-balance.html",
+      "meta": {}
+    },
+    {
+      "filename": "logger-adapter.md",
+      "link": "/zh-cn/docs/dev/impls/logger-adapter.html",
+      "meta": {}
+    },
+    {
+      "filename": "merger.md",
+      "link": "/zh-cn/docs/dev/impls/merger.html",
+      "meta": {}
+    },
+    {
+      "filename": "monitor.md",
+      "link": "/zh-cn/docs/dev/impls/monitor.html",
+      "meta": {}
+    },
+    {
+      "filename": "networker.md",
+      "link": "/zh-cn/docs/dev/impls/networker.html",
+      "meta": {}
+    },
+    {
+      "filename": "page.md",
+      "link": "/zh-cn/docs/dev/impls/page.html",
+      "meta": {}
+    },
+    {
+      "filename": "protocol.md",
+      "link": "/zh-cn/docs/dev/impls/protocol.html",
+      "meta": {}
+    },
+    {
+      "filename": "proxy-factory.md",
+      "link": "/zh-cn/docs/dev/impls/proxy-factory.html",
+      "meta": {}
+    },
+    {
+      "filename": "registry.md",
+      "link": "/zh-cn/docs/dev/impls/registry.html",
+      "meta": {}
+    },
+    {
+      "filename": "remoting.md",
+      "link": "/zh-cn/docs/dev/impls/remoting.html",
+      "meta": {}
+    },
+    {
+      "filename": "router.md",
+      "link": "/zh-cn/docs/dev/impls/router.html",
+      "meta": {}
+    },
+    {
+      "filename": "serialize.md",
+      "link": "/zh-cn/docs/dev/impls/serialize.html",
+      "meta": {}
+    },
+    {
+      "filename": "status-checker.md",
+      "link": "/zh-cn/docs/dev/impls/status-checker.html",
+      "meta": {}
+    },
+    {
+      "filename": "telnet-handler.md",
+      "link": "/zh-cn/docs/dev/impls/telnet-handler.html",
+      "meta": {}
+    },
+    {
+      "filename": "threadpool.md",
+      "link": "/zh-cn/docs/dev/impls/threadpool.html",
+      "meta": {}
+    },
+    {
+      "filename": "validation.md",
+      "link": "/zh-cn/docs/dev/impls/validation.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/dev/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "code-detail.md",
+      "link": "/zh-cn/docs/dev/principals/code-detail.html",
+      "meta": {}
+    },
+    {
+      "filename": "configuration.md",
+      "link": "/zh-cn/docs/dev/principals/configuration.html",
+      "meta": {}
+    },
+    {
+      "filename": "dummy.md",
+      "link": "/zh-cn/docs/dev/principals/dummy.html",
+      "meta": {}
+    },
+    {
+      "filename": "expansibility.md",
+      "link": "/zh-cn/docs/dev/principals/expansibility.html",
+      "meta": {}
+    },
+    {
+      "filename": "extension.md",
+      "link": "/zh-cn/docs/dev/principals/extension.html",
+      "meta": {}
+    },
+    {
+      "filename": "general-knowledge.md",
+      "link": "/zh-cn/docs/dev/principals/general-knowledge.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/dev/principals/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "robustness.md",
+      "link": "/zh-cn/docs/dev/principals/robustness.html",
+      "meta": {}
+    },
+    {
+      "filename": "release.md",
+      "link": "/zh-cn/docs/dev/release.html",
+      "meta": {}
+    },
+    {
+      "filename": "apache-dubbo-page_dev.md",
+      "link": "/zh-cn/docs/developers/committer-guide/apache-dubbo-page_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "label-an-issue-guide_dev.md",
+      "link": "/zh-cn/docs/developers/committer-guide/label-an-issue-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "new-committer-guide_dev.md",
+      "link": "/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "release-guide_dev.md",
+      "link": "/zh-cn/docs/developers/committer-guide/release-guide_dev.html",
+      "meta": {
+        "title": "如何准备Apache Release",
+        "keywords": "Dubbo, Apache, Release"
+      }
+    },
+    {
+      "filename": "website-guide_dev.md",
+      "link": "/zh-cn/docs/developers/committer-guide/website-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "become-a-committer_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/become-a-committer_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "cla-signing-guide_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/cla-signing-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-extension-guide_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "mailing-list-subscription-guide_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "new-contributor-guide_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "reporting-security-issues_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/reporting-security-issues_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "software-donation-guide_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/software-donation-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "test-coverage-guide_dev.md",
+      "link": "/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "developers_dev.md",
+      "link": "/zh-cn/docs/developers/developers_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "guide_dev.md",
+      "link": "/zh-cn/docs/developers/guide_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "faq_dev.md",
+      "link": "/zh-cn/docs/developers/user-guide/faq_dev.html",
+      "meta": {}
+    },
+    {
+      "filename": "adaptive-extension.md",
+      "link": "/zh-cn/docs/source_code_guide/adaptive-extension.html",
+      "meta": {
+        "title": "SPI 自适应拓展",
+        "keywords": "Dubbo, SPI, Adaptive Extension",
+        "description": "本文介绍了自适应拓展的原理和实现细节"
+      }
+    },
+    {
+      "filename": "cluster.md",
+      "link": "/zh-cn/docs/source_code_guide/cluster.html",
+      "meta": {
+        "title": "集群",
+        "keywords": "Dubbo, Cluster",
+        "description": "本文介绍了集群的原理和实现细节"
+      }
+    },
+    {
+      "filename": "directory.md",
+      "link": "/zh-cn/docs/source_code_guide/directory.html",
+      "meta": {
+        "title": "服务目录",
+        "keywords": "Dubbo, Directory",
+        "description": "本文介绍了服务目录的原理和实现细节"
+      }
+    },
+    {
+      "filename": "dubbo-spi.md",
+      "link": "/zh-cn/docs/source_code_guide/dubbo-spi.html",
+      "meta": {
+        "title": "Dubbo SPI",
+        "keywords": "Dubbo, SPI",
+        "description": "本文介绍了 Dubbo SPI 的原理和实现细节"
+      }
+    },
+    {
+      "filename": "export-service.md",
+      "link": "/zh-cn/docs/source_code_guide/export-service.html",
+      "meta": {
+        "title": "服务导出",
+        "keywords": "Dubbo, service, export",
+        "description": "本文介绍了 Dubbo 服务导出的过程和实现细节"
+      }
+    },
+    {
+      "filename": "loadbalance.md",
+      "link": "/zh-cn/docs/source_code_guide/loadbalance.html",
+      "meta": {
+        "title": "负载均衡",
+        "keywords": "Dubbo, LoadBalance",
+        "description": "本文介绍了集群的原理和实现细节"
+      }
+    },
+    {
+      "filename": "refer-service.md",
+      "link": "/zh-cn/docs/source_code_guide/refer-service.html",
+      "meta": {
+        "title": "服务引用",
+        "keywords": "Dubbo, service, refer",
+        "description": "本文介绍了 Dubbo 服务引用的过程和实现细节"
+      }
+    },
+    {
+      "filename": "router.md",
+      "link": "/zh-cn/docs/source_code_guide/router.html",
+      "meta": {
+        "title": "服务路由",
+        "keywords": "Dubbo, Router",
+        "description": "本文介绍了服务\b路由的原理和实现细节"
+      }
+    },
+    {
+      "filename": "service-invoking-process.md",
+      "link": "/zh-cn/docs/source_code_guide/service-invoking-process.html",
+      "meta": {
+        "title": "服务调用过程",
+        "keywords": "Dubbo, Service",
+        "description": "本文介绍了服务调用过程\b的原理和实现细节"
+      }
+    },
+    {
+      "filename": "README.md",
+      "link": "/zh-cn/docs/user/README.html",
+      "meta": {}
+    },
+    {
+      "filename": "SUMMARY.md",
+      "link": "/zh-cn/docs/user/SUMMARY.html",
+      "meta": {}
+    },
+    {
+      "filename": "benchmark-tool.md",
+      "link": "/zh-cn/docs/user/benchmark-tool.html",
+      "meta": {}
+    },
+    {
+      "filename": "best-practice.md",
+      "link": "/zh-cn/docs/user/best-practice.html",
+      "meta": {
+        "title": "服务化最佳实践",
+        "keywords": "分包, 粒度, 版本, 兼容性, 枚举, 序列化,异常",
+        "description": "Dubbo 最佳实践"
+      }
+    },
+    {
+      "filename": "capacity-plan.md",
+      "link": "/zh-cn/docs/user/capacity-plan.html",
+      "meta": {
+        "title": "容量规划",
+        "keywords": "容量规划",
+        "description": "Dubbo 应用容量规划参考"
+      }
+    },
+    {
+      "filename": "annotation.md",
+      "link": "/zh-cn/docs/user/configuration/annotation.html",
+      "meta": {}
+    },
+    {
+      "filename": "api.md",
+      "link": "/zh-cn/docs/user/configuration/api.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-center.md",
+      "link": "/zh-cn/docs/user/configuration/config-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "configuration-load-process.md",
+      "link": "/zh-cn/docs/user/configuration/configuration-load-process.html",
+      "meta": {}
+    },
+    {
+      "filename": "environment-variables.md",
+      "link": "/zh-cn/docs/user/configuration/environment-variables.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/zh-cn/docs/user/configuration/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "properties-deprecated.md",
+      "link": "/zh-cn/docs/user/configuration/properties-deprecated.html",
+      "meta": {}
+    },
+    {
+      "filename": "xml.md",
+      "link": "/zh-cn/docs/user/configuration/xml.html",
+      "meta": {}
+    },
+    {
+      "filename": "coveragence.md",
+      "link": "/zh-cn/docs/user/coveragence.html",
+      "meta": {}
+    },
+    {
+      "filename": "accesslog.md",
+      "link": "/zh-cn/docs/user/demos/accesslog.html",
+      "meta": {}
+    },
+    {
+      "filename": "async-call-deprecated.md",
+      "link": "/zh-cn/docs/user/demos/async-call-deprecated.html",
+      "meta": {}
+    },
+    {
+      "filename": "async-call.md",
+      "link": "/zh-cn/docs/user/demos/async-call.html",
+      "meta": {}
+    },
+    {
+      "filename": "async-execute-on-provider.md",
+      "link": "/zh-cn/docs/user/demos/async-execute-on-provider.html",
+      "meta": {}
+    },
+    {
+      "filename": "attachment.md",
+      "link": "/zh-cn/docs/user/demos/attachment.html",
+      "meta": {}
+    },
+    {
+      "filename": "callback-parameter.md",
+      "link": "/zh-cn/docs/user/demos/callback-parameter.html",
+      "meta": {}
+    },
+    {
+      "filename": "concurrency-control.md",
+      "link": "/zh-cn/docs/user/demos/concurrency-control.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-connections.md",
+      "link": "/zh-cn/docs/user/demos/config-connections.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-rule-deprecated.md",
+      "link": "/zh-cn/docs/user/demos/config-rule-deprecated.html",
+      "meta": {}
+    },
+    {
+      "filename": "config-rule.md",
+      "link": "/zh-cn/docs/user/demos/config-rule.html",
+      "meta": {}
+    },
+    {
+      "filename": "context.md",
+      "link": "/zh-cn/docs/user/demos/context.html",
+      "meta": {}
+    },
+    {
+      "filename": "delay-publish.md",
+      "link": "/zh-cn/docs/user/demos/delay-publish.html",
+      "meta": {}
+    },
+    {
+      "filename": "distributed-transaction.md",
+      "link": "/zh-cn/docs/user/demos/distributed-transaction.html",
+      "meta": {}
+    },
+    {
+      "filename": "dump.md",
+      "link": "/zh-cn/docs/user/demos/dump.html",
+      "meta": {}
+    },
+    {
+      "filename": "echo-service.md",
+      "link": "/zh-cn/docs/user/demos/echo-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "events-notify.md",
+      "link": "/zh-cn/docs/user/demos/events-notify.html",
+      "meta": {}
+    },
+    {
+      "filename": "explicit-target.md",
+      "link": "/zh-cn/docs/user/demos/explicit-target.html",
+      "meta": {}
+    },
+    {
+      "filename": "fault-tolerent-strategy.md",
+      "link": "/zh-cn/docs/user/demos/fault-tolerent-strategy.html",
+      "meta": {}
+    },
+    {
+      "filename": "generic-reference.md",
+      "link": "/zh-cn/docs/user/demos/generic-reference.html",
+      "meta": {}
+    },
+    {
+      "filename": "generic-service.md",
+      "link": "/zh-cn/docs/user/demos/generic-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "graceful-shutdown.md",
+      "link": "/zh-cn/docs/user/demos/graceful-shutdown.html",
+      "meta": {}
+    },
+    {
+      "filename": "group-merger.md",
+      "link": "/zh-cn/docs/user/demos/group-merger.html",
+      "meta": {}
+    },
+    {
+      "filename": "hostname-binding.md",
+      "link": "/zh-cn/docs/user/demos/hostname-binding.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/zh-cn/docs/user/demos/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/user/demos/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "lazy-connect.md",
+      "link": "/zh-cn/docs/user/demos/lazy-connect.html",
+      "meta": {}
+    },
+    {
+      "filename": "loadbalance.md",
+      "link": "/zh-cn/docs/user/demos/loadbalance.html",
+      "meta": {}
+    },
+    {
+      "filename": "local-call.md",
+      "link": "/zh-cn/docs/user/demos/local-call.html",
+      "meta": {}
+    },
+    {
+      "filename": "local-mock.md",
+      "link": "/zh-cn/docs/user/demos/local-mock.html",
+      "meta": {}
+    },
+    {
+      "filename": "local-stub.md",
+      "link": "/zh-cn/docs/user/demos/local-stub.html",
+      "meta": {}
+    },
+    {
+      "filename": "logger-strategy.md",
+      "link": "/zh-cn/docs/user/demos/logger-strategy.html",
+      "meta": {}
+    },
+    {
+      "filename": "multi-protocols.md",
+      "link": "/zh-cn/docs/user/demos/multi-protocols.html",
+      "meta": {}
+    },
+    {
+      "filename": "multi-registry.md",
+      "link": "/zh-cn/docs/user/demos/multi-registry.html",
+      "meta": {}
+    },
+    {
+      "filename": "multi-versions.md",
+      "link": "/zh-cn/docs/user/demos/multi-versions.html",
+      "meta": {}
+    },
+    {
+      "filename": "netty4.md",
+      "link": "/zh-cn/docs/user/demos/netty4.html",
+      "meta": {}
+    },
+    {
+      "filename": "parameter-validation.md",
+      "link": "/zh-cn/docs/user/demos/parameter-validation.html",
+      "meta": {}
+    },
+    {
+      "filename": "preflight-check.md",
+      "link": "/zh-cn/docs/user/demos/preflight-check.html",
+      "meta": {}
+    },
+    {
+      "filename": "reference-config-cache.md",
+      "link": "/zh-cn/docs/user/demos/reference-config-cache.html",
+      "meta": {}
+    },
+    {
+      "filename": "registry-only.md",
+      "link": "/zh-cn/docs/user/demos/registry-only.html",
+      "meta": {}
+    },
+    {
+      "filename": "result-cache.md",
+      "link": "/zh-cn/docs/user/demos/result-cache.html",
+      "meta": {}
+    },
+    {
+      "filename": "routing-rule-deprecated.md",
+      "link": "/zh-cn/docs/user/demos/routing-rule-deprecated.html",
+      "meta": {}
+    },
+    {
+      "filename": "routing-rule.md",
+      "link": "/zh-cn/docs/user/demos/routing-rule.html",
+      "meta": {}
+    },
+    {
+      "filename": "serialization.md",
+      "link": "/zh-cn/docs/user/demos/serialization.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-container.md",
+      "link": "/zh-cn/docs/user/demos/service-container.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-downgrade.md",
+      "link": "/zh-cn/docs/user/demos/service-downgrade.html",
+      "meta": {}
+    },
+    {
+      "filename": "service-group.md",
+      "link": "/zh-cn/docs/user/demos/service-group.html",
+      "meta": {}
+    },
+    {
+      "filename": "set-host.md",
+      "link": "/zh-cn/docs/user/demos/set-host.html",
+      "meta": {}
+    },
+    {
+      "filename": "simplify-registry-data.md",
+      "link": "/zh-cn/docs/user/demos/simplify-registry-data.html",
+      "meta": {}
+    },
+    {
+      "filename": "static-service.md",
+      "link": "/zh-cn/docs/user/demos/static-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "stickiness.md",
+      "link": "/zh-cn/docs/user/demos/stickiness.html",
+      "meta": {}
+    },
+    {
+      "filename": "subscribe-only.md",
+      "link": "/zh-cn/docs/user/demos/subscribe-only.html",
+      "meta": {}
+    },
+    {
+      "filename": "thread-model.md",
+      "link": "/zh-cn/docs/user/demos/thread-model.html",
+      "meta": {}
+    },
+    {
+      "filename": "token-authorization.md",
+      "link": "/zh-cn/docs/user/demos/token-authorization.html",
+      "meta": {}
+    },
+    {
+      "filename": "dependencies.md",
+      "link": "/zh-cn/docs/user/dependencies.html",
+      "meta": {
+        "title": "依赖",
+        "keywords": "必须依赖, 缺省依赖, 可选依赖",
+        "description": "Dubbo 依赖基本介绍"
+      }
+    },
+    {
+      "filename": "reference.md",
+      "link": "/zh-cn/docs/user/languages/erlang/reference.html",
+      "meta": {}
+    },
+    {
+      "filename": "serialization.md",
+      "link": "/zh-cn/docs/user/languages/erlang/serialization.html",
+      "meta": {}
+    },
+    {
+      "filename": "service.md",
+      "link": "/zh-cn/docs/user/languages/erlang/service.html",
+      "meta": {}
+    },
+    {
+      "filename": "start.md",
+      "link": "/zh-cn/docs/user/languages/erlang/start.html",
+      "meta": {}
+    },
+    {
+      "filename": "maturity.md",
+      "link": "/zh-cn/docs/user/maturity.html",
+      "meta": {
+        "title": "成熟度",
+        "keywords": "功能成熟度, 策略成熟度",
+        "description": "介绍 Dubbo 各个功能、策略的成熟度"
+      }
+    },
+    {
+      "filename": "perf-test.md",
+      "link": "/zh-cn/docs/user/perf-test.html",
+      "meta": {
+        "title": "性能测试报告",
+        "keywords": "性能测试",
+        "description": "Dubbo 2.0 性能测试报告"
+      }
+    },
+    {
+      "filename": "architecture.md",
+      "link": "/zh-cn/docs/user/preface/architecture.html",
+      "meta": {}
+    },
+    {
+      "filename": "background.md",
+      "link": "/zh-cn/docs/user/preface/background.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/zh-cn/docs/user/preface/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "requirements.md",
+      "link": "/zh-cn/docs/user/preface/requirements.html",
+      "meta": {}
+    },
+    {
+      "filename": "usage.md",
+      "link": "/zh-cn/docs/user/preface/usage.html",
+      "meta": {}
+    },
+    {
+      "filename": "quick-start.md",
+      "link": "/zh-cn/docs/user/quick-start.html",
+      "meta": {
+        "title": "快速启动",
+        "keywords": "XML configuration, Consumer, Provider",
+        "description": "使用 XML 配置方式快速上手 Dubbo"
+      }
+    },
+    {
+      "filename": "recommend.md",
+      "link": "/zh-cn/docs/user/recommend.html",
+      "meta": {
+        "title": "推荐用法",
+        "keywords": "Provider 配置, 管理信息, 缓存, 监控",
+        "description": "Dubbo 推荐用法举例"
+      }
+    },
+    {
+      "filename": "api.md",
+      "link": "/zh-cn/docs/user/references/api.html",
+      "meta": {}
+    },
+    {
+      "filename": "maven.md",
+      "link": "/zh-cn/docs/user/references/maven.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/user/references/metadata/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "metadata-redis.md",
+      "link": "/zh-cn/docs/user/references/metadata/metadata-redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "metadata-zookeeper.md",
+      "link": "/zh-cn/docs/user/references/metadata/metadata-zookeeper.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo.md",
+      "link": "/zh-cn/docs/user/references/protocol/dubbo.html",
+      "meta": {}
+    },
+    {
+      "filename": "hessian.md",
+      "link": "/zh-cn/docs/user/references/protocol/hessian.html",
+      "meta": {}
+    },
+    {
+      "filename": "http.md",
+      "link": "/zh-cn/docs/user/references/protocol/http.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/user/references/protocol/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "memcached.md",
+      "link": "/zh-cn/docs/user/references/protocol/memcached.html",
+      "meta": {}
+    },
+    {
+      "filename": "redis.md",
+      "link": "/zh-cn/docs/user/references/protocol/redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "rest.md",
+      "link": "/zh-cn/docs/user/references/protocol/rest.html",
+      "meta": {}
+    },
+    {
+      "filename": "rmi.md",
+      "link": "/zh-cn/docs/user/references/protocol/rmi.html",
+      "meta": {}
+    },
+    {
+      "filename": "thrift.md",
+      "link": "/zh-cn/docs/user/references/protocol/thrift.html",
+      "meta": {}
+    },
+    {
+      "filename": "webservice.md",
+      "link": "/zh-cn/docs/user/references/protocol/webservice.html",
+      "meta": {}
+    },
+    {
+      "filename": "qos.md",
+      "link": "/zh-cn/docs/user/references/qos.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/user/references/registry/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "multicast.md",
+      "link": "/zh-cn/docs/user/references/registry/multicast.html",
+      "meta": {}
+    },
+    {
+      "filename": "nacos.md",
+      "link": "/zh-cn/docs/user/references/registry/nacos.html",
+      "meta": {}
+    },
+    {
+      "filename": "redis.md",
+      "link": "/zh-cn/docs/user/references/registry/redis.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple.md",
+      "link": "/zh-cn/docs/user/references/registry/simple.html",
+      "meta": {}
+    },
+    {
+      "filename": "zookeeper.md",
+      "link": "/zh-cn/docs/user/references/registry/zookeeper.html",
+      "meta": {}
+    },
+    {
+      "filename": "telnet.md",
+      "link": "/zh-cn/docs/user/references/telnet.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-application.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-application.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-argument.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-argument.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-config-center.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-config-center.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-consumer.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-consumer.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-method.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-method.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-module.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-module.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-monitor.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-monitor.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-parameter.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-parameter.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-protocol.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-protocol.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-provider.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-provider.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-reference.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-reference.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-registry.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-registry.html",
+      "meta": {}
+    },
+    {
+      "filename": "dubbo-service.md",
+      "link": "/zh-cn/docs/user/references/xml/dubbo-service.html",
+      "meta": {}
+    },
+    {
+      "filename": "introduction.md",
+      "link": "/zh-cn/docs/user/references/xml/introduction.html",
+      "meta": {}
+    },
+    {
+      "filename": "rest.md",
+      "link": "/zh-cn/docs/user/rest.html",
+      "meta": {
+        "title": "在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)",
+        "keywords": "RESTful Remoting, REST",
+        "description": "在 Dubbo 中开发 REST 风格的远程调用"
+      }
+    },
+    {
+      "filename": "serialization.md",
+      "link": "/zh-cn/docs/user/serialization.html",
+      "meta": {}
+    },
+    {
+      "filename": "simple-monitor.md",
+      "link": "/zh-cn/docs/user/simple-monitor.html",
+      "meta": {}
+    },
+    {
+      "filename": "index.md",
+      "link": "/zh-cn/docs/user/versions/index.html",
+      "meta": {}
+    },
+    {
+      "filename": "version-270.md",
+      "link": "/zh-cn/docs/user/versions/version-270.html",
+      "meta": {}
+    }
+  ]
+}
\ No newline at end of file
diff --git a/zh-cn/blog/apachecon-na-2018.json b/zh-cn/blog/apachecon-na-2018.json
new file mode 100644
index 0000000..142aa76
--- /dev/null
+++ b/zh-cn/blog/apachecon-na-2018.json
@@ -0,0 +1,10 @@
+{
+  "filename": "apachecon-na-2018.md",
+  "__html": "<h2>ApacheCon大会议程公布</h2>\n<p>罗毅/刘军将在蒙特利尔举办的 ApacheCon 大会上进行题为&quot;Introducing Apache Dubbo(Incubating): What is Dubbo and How it Works&quot;的演讲。请点击<a href=\"https://apachecon.dukecon.org/acna/2018/#/scheduledEvent/b8db9dc580d85853f\">此处</a>查看大会议程,并在<a href=\"https://www.eventbrite.com/e/apachecon-north-america-2018-registration-43200327342\">此处</a>中进行注册。</p>\n",
+  "link": "/zh-cn/blog/apachecon-na-2018.html",
+  "meta": {
+    "title": "ApacheCon大会议程公布",
+    "keywords": "Dubbo, ApacheCon NA",
+    "description": "本文将向你介绍在ApacheCon大会议程公布上相关Dubbo议题演讲。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/build-new-docker-image-in-dockerhub.html b/zh-cn/blog/build-new-docker-image-in-dockerhub.html
new file mode 100644
index 0000000..c11b98b
--- /dev/null
+++ b/zh-cn/blog/build-new-docker-image-in-dockerhub.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="Dubbo Admin,Docker,Dockerhub" />
+	<meta name="description" content="本文将介绍如何在Dockerhub上发布Dubbo Admin镜像。" />
+	<!-- 网页标签标题 -->
+	<title>在DockerHub发布Dubbo Admin镜像</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 Admin是Dubbo的服务治理中心,提供了大量日常运维所需的服务治理、配置管理等功能。</p>
+<p>Dubbo Admin同时包含了前端代码和后端代码,如果用户需要自己下载源码并编译打包,需要花费一定时间。
+特别是对于一些希望快速调研和试用Dubbo Admin的用户,这种流程的体验并不是很好。</p>
+<p>Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,社区对于提供Dubbo Admin镜像的呼声较高。
+Docker官方维护了一个公共仓库DockerHub,该仓库还有很多国内镜像,访问速度快,将Dubbo Admin镜像发布到DockerHub是一个较好的选择。</p>
+<h2>DockerHub账号申请</h2>
+<p>要在DockerHub上发布镜像,自然需要对应的账号。
+而DockerHub有两种常见账号,一种是面向个人的,一种是面向组织的。Apache在DockerHub上有一个组织账号<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>。
+自然我们首选是发布在组织账号下。</p>
+<p>DockerHub对于组织账号的管理是基于组的,也就是一个组织账号下有多个组,每个组有不同的成员,而一个组可以管理一个或者多个镜像。</p>
+<p>所以要做的第一步就是申请权限,这个需要提一个issue给Apache Infrastructure团队,申请DockerHub的镜像仓库和组权限。
+目前镜像和组已经申请好了,只需要申请组的权限就行了,可以参考之前的申请<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>。</p>
+<p>申请完权限以后使用Apache账号登陆应该就可以看到对应的镜像和配置选项了。</p>
+<h2>添加新的构建规则</h2>
+<p>发布镜像到DockerHub有两种办法,一种是本地构建好镜像以后远程push到DockerHub,另外一种是提供Dockerfile并借助DockerHub提供的构建功能直接在DockerHub构建。
+后者明显操作性和便捷性要好很多,目前Dubbo Admin的镜像也是这样构建发布的。</p>
+<p>当Dubbo Admin有新版本发布以后,需要在项目的docker目录新增一个Dockerfile文件,可以参考目前0.1.0版本的Dockerfile<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>,其中的配置根据具体的版本可能有细微差别,但是大致上是一致的。</p>
+<p>在添加了Dockerfile之后,进入DockerHub对应的管理界面新增Build Rules</p>
+<p><img src="../../img/blog/dockerhub-build-rules.png" alt="dockerhub-build-rules.png | center "></p>
+<p>根据实际情况填写即可。这里需要注意两点:</p>
+<ul>
+<li>latest 版本要和最新的版本配置一致</li>
+<li>不要勾选Autobuild</li>
+</ul>
+<p>勾选Autobuild会导致每次git提交都会触发自动构建,但是由于Dubbo Admin不提供snapshot的Docker镜像,所以只有发布新版本的时候才需要构建发布。</p>
+<p>修改以后点Save,然后手动触发构建即可。</p>
+<h2>总结</h2>
+<p>总的来说DockerHub上发布镜像的步骤并不复杂,如果已经申请过权限的话,操作起来是很流畅的。</p>
+<p>另外DockerHub的构建是需要排队的,有时候会遇到长时间没有开始构建的情况,需要耐心等待。</p>
+<hr class="footnotes-sep">
+<section class="footnotes">
+<ol class="footnotes-list">
+<li id="fn1" class="footnote-item"><p><a href="https://hub.docker.com/r/apache">https://hub.docker.com/r/apache</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
+</li>
+<li id="fn2" class="footnote-item"><p><a href="https://issues.apache.org/jira/browse/INFRA-18167">https://issues.apache.org/jira/browse/INFRA-18167</a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
+</li>
+<li id="fn3" class="footnote-item"><p><a href="https://github.com/apache/dubbo-admin/blob/develop/docker/0.1.0/Dockerfile">https://github.com/apache/dubbo-admin/blob/develop/docker/0.1.0/Dockerfile</a> <a href="#fnref3" class="footnote-backref">↩︎</a></p>
+</li>
+</ol>
+</section>
+</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/build-new-docker-image-in-dockerhub.json b/zh-cn/blog/build-new-docker-image-in-dockerhub.json
new file mode 100644
index 0000000..9e3139d
--- /dev/null
+++ b/zh-cn/blog/build-new-docker-image-in-dockerhub.json
@@ -0,0 +1,10 @@
+{
+  "filename": "build-new-docker-image-in-dockerhub.md",
+  "__html": "<h1>在DockerHub发布Dubbo Admin镜像</h1>\n<p>Dubbo Admin是Dubbo的服务治理中心,提供了大量日常运维所需的服务治理、配置管理等功能。</p>\n<p>Dubbo Admin同时包含了前端代码和后端代码,如果用户需要自己下载源码并编译打包,需要花费一定时间。\n特别是对于一些希望快速调研和试用Dubbo Admin的用户,这种流程的体验并不是很好。</p>\n<p>Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,社区对于提供Dubbo Admin镜像的呼声较高。\nDocker官方维护了一个公共仓库DockerHub,该仓库还有很多国内镜像,访问速度快,将Dubbo Admin镜像发布到DockerHub是一个较好的选择。</p>\n<h2>DockerHub账号申请</h2>\n<p>要在DockerHub上发布镜像,自然需要对应的账号。\n而DockerHub有两种常见账号,一种是面向个人的,一种是面向组织的。Apache
 在DockerHub上有一个组织账 [...]
+  "link": "/zh-cn/blog/build-new-docker-image-in-dockerhub.html",
+  "meta": {
+    "title": "在DockerHub发布Dubbo Admin镜像",
+    "keywords": "Dubbo Admin,Docker,Dockerhub",
+    "description": "本文将介绍如何在Dockerhub上发布Dubbo Admin镜像。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/download.json b/zh-cn/blog/download.json
new file mode 100644
index 0000000..2a76aa0
--- /dev/null
+++ b/zh-cn/blog/download.json
@@ -0,0 +1,10 @@
+{
+  "filename": "download.md",
+  "__html": "<h1>下载中心</h1>\n<h2>验证</h2>\n<p>可以按照这里的<a href=\"https://www.apache.org/info/verification\">步骤</a>, 利用<a href=\"https://www.apache.org/dist/incubator/dubbo/KEYS\">KEYS</a>文件来验证下载。</p>\n<h2>Apache Dubbo</h2>\n<p>请点击了解各<a href=\"http://dubbo.apache.org/zh-cn/docs/user/versions/index.html\">版本详情和升级注意事项</a></p>\n<blockquote>\n<p>GitHub: <a href=\"https://github.com/apache/incubator-dubbo\">https://github.com/apache/incubator-dubbo</a> <br>\n发布说明:<a href=\"https://github.com/apach [...]
+  "link": "/zh-cn/blog/download.html",
+  "meta": {
+    "title": "下载中心",
+    "keywords": "Dubbo, Downloads, Version",
+    "description": "本文将向你介绍如何点击了解各版本详情和升级注意事项。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-101.json b/zh-cn/blog/dubbo-101.json
new file mode 100644
index 0000000..8ae9717
--- /dev/null
+++ b/zh-cn/blog/dubbo-101.json
@@ -0,0 +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>然后找到真正 [...]
+  "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-27-features.json b/zh-cn/blog/dubbo-27-features.json
new file mode 100644
index 0000000..44b2a7a
--- /dev/null
+++ b/zh-cn/blog/dubbo-27-features.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-27-features.md",
+  "__html": "<h1></h1>\n<h2>1 背景介绍</h2>\n<p>自 2017 年 7 月阿里重启 Dubbo 开源,到目前为止 github star 数,contributor 数都有了非常大的提升。2018 年 2 月 9 日阿里决定将 Dubbo 项目贡献给 Apache,经过一周的投票,顺利成为了 Apache 的孵化项目,也就是大家现在看到的 <strong>Incubator Dubbo</strong>。预计在 2019 年 4 月,Dubbo 可以达成毕业,成为 Apache 的顶级项目。</p>\n<h2>2 分支介绍</h2>\n<p><img src=\"http://kirito.iocoder.cn/image-20190321153455566.png\" alt=\"分支\"></p>\n<p>Dubbo 目前有如图所示的 5 个分支,其中 2.7.1-release 只是一个临时分支,忽略不计,对其他 4 个分支进行介绍。</p>\n<ul>\n<li>2.5.x 近期已经通过投票,Dubbo 社区即将停止对其的维 [...]
+  "link": "/zh-cn/blog/dubbo-27-features.html",
+  "meta": {
+    "title": "Dubbo2.7 三大新特性详解",
+    "keywords": "Dubbo2.7",
+    "description": "异步化改造,三大中心改造,服务治理增强"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-annotation.json b/zh-cn/blog/dubbo-annotation.json
new file mode 100644
index 0000000..f9a4f15
--- /dev/null
+++ b/zh-cn/blog/dubbo-annotation.json
@@ -0,0 +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>@ [...]
+  "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-consumer-configuration.json b/zh-cn/blog/dubbo-basic-usage-dubbo-consumer-configuration.json
new file mode 100644
index 0000000..a95fd75
--- /dev/null
+++ b/zh-cn/blog/dubbo-basic-usage-dubbo-consumer-configuration.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-basic-usage-dubbo-consumer-configuration.md",
+  "__html": "<h1>Dubbo基本用法-Dubbo Consumer配置</h1>\n<h2>Dubbo Consumer配置</h2>\n<h3>Consumer配置详解</h3>\n<p>配置Dubbo Consumer有3种方式:XML配置,API调用方式配置,注解方式配置。</p>\n<h4>XML配置</h4>\n<h6>最简单的配置的样例:</h6>\n<pre><code>\n&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:schema [...]
+  "link": "/zh-cn/blog/dubbo-basic-usage-dubbo-consumer-configuration.html",
+  "meta": {}
+}
\ 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
new file mode 100644
index 0000000..51b3be7
--- /dev/null
+++ b/zh-cn/blog/dubbo-basic-usage-dubbo-provider-configuration.json
@@ -0,0 +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;htt [...]
+  "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-cluster-error-handling.json b/zh-cn/blog/dubbo-cluster-error-handling.json
new file mode 100644
index 0000000..b158a33
--- /dev/null
+++ b/zh-cn/blog/dubbo-cluster-error-handling.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-cluster-error-handling.md",
+  "__html": "<h3>Design For failure</h3>\n<p>在分布式系统中,集群某个某些节点出现问题是大概率事件,因此在设计分布式RPC框架的过程中,必须要把失败作为设计的一等公民来对待。一次调用失败之后,应该如何选择对失败的选择策略,这是一个见仁见智的问题,每种策略可能都有自己独特的应用场景。因此,作为框架来说,应当针对不同场景提供多种策略,供用户进行选择。</p>\n<p>在Dubbo设计中,通过Cluster这个接口的抽象,把一组可供调用的Provider信息组合成为一个统一的<code>Invoker</code>供调用方进行调用。经过路由规则过滤,负载均衡选址后,选中一个具体地址进行调用,如果调用失败,则会按照集群配置的容错策略进行容错处理。</p>\n<p>Dubbo默认内置了若干容错策略,如果不能满足用户需求,则可以通过自定义容错策略进行配置。</p>\n<h3>内置容错
 策略</h3>\n<p>Dubbo主要内置了如下几种策略:</p>\n<ul>\n<li>Failover(失败自动切换)</li>\n<li>Failsaf [...]
+  "link": "/zh-cn/blog/dubbo-cluster-error-handling.html",
+  "meta": {
+    "title": "Dubbo集群容错",
+    "keywords": "Dubbo, RPC, cluster, Error-handling",
+    "description": "在分布式系统中,集群某个某些节点出现问题是大概率事件,因此在设计分布式RPC框架的过程中,必须要把失败作为设计的一等公民来对待。一次调用失败之后,应该如何选择对失败的选择策略,这是一个见仁见智的问题,每种策略可能都有自己独特的应用场景。因此,作为框架来说,应当针对不同场景提供多种策略,供用户进行选择。本文介绍了Dubbo框架提供的多种错误处理策略,并通过实例说明如何进行配置。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-compatible.json b/zh-cn/blog/dubbo-compatible.json
new file mode 100644
index 0000000..ba40f67
--- /dev/null
+++ b/zh-cn/blog/dubbo-compatible.json
@@ -0,0 +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是最直接最原始的使用方式,其他方 [...]
+  "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-context-information.json b/zh-cn/blog/dubbo-context-information.json
new file mode 100644
index 0000000..869474b
--- /dev/null
+++ b/zh-cn/blog/dubbo-context-information.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-context-information.md",
+  "__html": "<h1>Dubbo 上下文信息</h1>\n<h2>简介</h2>\n<p>上下文信息是一次 RPC 调用过程中附带的环境信息,如方法名、参数类型、真实参数、本端/对端地址等。这些数据仅属于一次调用,作用于 Consumer 到 Provider 调用的整个流程。</p>\n<p>提供上下文信息是 RPC 框架很重要的一个功能,使用上下文不仅可以为单次调用指定不同配置,还能在此基础上提供强大的上层功能,如分布式链路追踪。其实现原理就是在上下文中维护一个<code>span_id</code>,Consumer 和 Provider 通过传递<code>span_id</code>来连接一次RPC调用,分别上报日志后可以在追踪系统中串联并展示完整的调用流程。这样可以更方便地发现异常,定位问题。</p>\n<h2>使用说明</h2>\n<p>Dubbo中代表上下文的类是<code>org.apache.dubbo.rpc.RpcContext</code>,可通过下述代码来获取上下文信息。</p>\n<pre><code>RpcContext.ge [...]
+  "link": "/zh-cn/blog/dubbo-context-information.html",
+  "meta": {
+    "title": "Dubbo 上下文信息",
+    "keywords": "Dubbo,RPC Context, Attachment",
+    "description": "介绍Dubbo上下文信息的作用、应用场景、使用方式以及注意事项"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-contribute-to-opensource.html b/zh-cn/blog/dubbo-contribute-to-opensource.html
new file mode 100644
index 0000000..0c1b1de
--- /dev/null
+++ b/zh-cn/blog/dubbo-contribute-to-opensource.html
@@ -0,0 +1,157 @@
+<!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, opensource" />
+	<meta name="description" content="本文将会以 dubbo 项目为例向你阐释,给开源项目做贡献并不是一件难事" />
+	<!-- 网页标签标题 -->
+	<title>以Dubbo为例,聊聊如何向开源项目做贡献</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>Github 上有众多优秀的开源项目,大多数 IT 从业者将其当做了予取予求的工具库,遇到什么需求,先去 Github 搜一把,但有没有想过有一天自己也可以给开源事业做一些贡献呢?本文将会以 dubbo 项目为例,向你阐释,给开源项目做贡献并不是一件难事。</p>
+<h2>1 为何要给开源贡献力量</h2>
+<p>为开源项目做贡献得到的收益是多方面的,为了让你有足够的信心加入到开源项目中,我在文章最开始列举出它的诸多好处。</p>
+<h3>1.1 巩固技能</h3>
+<p>无论你是提交代码,撰写文档,提交 Issue,组织活动,当你切身参与到一个开源项目中,相关的技能都会得到历练,并且在开源项目中找到自己的位置。一方面,日常工作中我们中的大多数人接触到的是业务场景,并没有太多机会接触到基础架构组件,开源项目为我们提供了一个平台,在这里,你可以尽情挑选自己熟悉的项目为它添砖加瓦(以 Dubbo 为例,并不是所有 IT 公司都有能力自研服务治理框架);另一方面,你所提交的代码,会有管理员协助审核,他们会给出专业的建议,更好的代码规范以及更优的编程思路最终都会变成你的经验。</p>
+<h3>1.2 结交朋友</h3>
+<p>开源社区为你提供了一个平台,在这里,你可以认识很多纯粹的技术爱好者,开源贡献者是最符合 geek 定义的那群人,你所接触到的往往是某个领域最厉害的那批人。</p>
+<h3>1.3 建立口碑</h3>
+<p>这是一个很好的展示个人实力的地方,俗话说:talk is cheap,show me the code. 作为技术人员,没有什么比一个漂亮的 Github 主页更有说服力的了。如果你能够为开源项目做出可观的贡献,你也将收获到业界的知名度,此时开源项目的成就和你是密不可分的。</p>
+<h3>1.4 传承开源精神</h3>
+<p>只有源源不断的贡献者给开源项目添砖加瓦,才可以为 Github 一类的开源社区形成良好的开源风气。否则,只有输出没有输入,开源会失去活力。</p>
+<h3>1.5 养成习惯</h3>
+<p>相信我,一旦养成了每天提交代码的习惯,就像你不想中断打卡一样,你绝不想中断 commit。不止有英语打卡,健身打卡,还有开源打卡!</p>
+<p><img src="http://ov0zuistv.bkt.clouddn.com/image-20180827141007663.png" alt="开源程序员的日常"></p>
+<h2>2 贡献代码时的一些疑难杂症</h2>
+<p>如果你是一名开源界的新手,可能会对贡献的流程心生畏惧。比如:我该怎么修改代码并提交?我的代码要是存在bug怎么办?我的代码别人会不会很 low?我该如何寻找合适的开源项目?开源社区那么多的工具和词汇都是什么意思?</p>
+<p>文章的第二部分将从一个<strong>小白</strong>的角度,介绍一下开源中的一些常见问题。</p>
+<h3>2.1 git 常规操作</h3>
+<p>一般而言,我们选择使用 git 来作为版本管理的工具,你不一定要非常熟练的使用它,在我看来掌握 clone,add,commit,pull,push 即可,遇到复杂的场景,你还有谷歌。</p>
+<p><strong>fork 与 clone</strong></p>
+<p><img src="http://ov0zuistv.bkt.clouddn.com/image-20180827143942178.png" alt="fork 与 clone"></p>
+<p>如果你只是想下载源码,查看他的源码实现,使用 Clone or download 按钮即可。</p>
+<p>如果你想要给开源项目做改动,并且最终请求合并,让开源项目存在你贡献的代码,就应该使用 fork。</p>
+<p>fork 将会复制一份当前主分支的代码进入到你的仓库中,之后你所有的修改,应当基于自己的仓库进行,在功能开发/bug 修复之后,可以使用你的仓库向源仓库提交 pull request。只有源仓库的管理员才有权利合并你的请求。</p>
+<p>一些可能对你有帮助的高级指令。</p>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 设置源仓库</span>
+git remote add upstream https://github.com/apache/dubbo.git
+<span class="hljs-meta">#</span><span class="bash"> 拉取源仓库的更新</span>
+git fetch upstream
+<span class="hljs-meta">#</span><span class="bash"> 将自己仓库的主分支合并源仓库的更新</span>
+git checkout master
+git merge upstream/master
+</code></pre>
+<p><strong>pull request</strong></p>
+<p><img src="http://ov0zuistv.bkt.clouddn.com/image-20180827150703869.png" alt="pull request"></p>
+<p>pull request 经常被缩写为 PR,指的是一次向源仓库请求合并的行为,如上是我 fork 了 dubbo 的仓库之后才存在的操作按钮。</p>
+<p><strong>源仓库视角的 pull request</strong></p>
+<p><img src="http://ov0zuistv.bkt.clouddn.com/image-20180827155239155.png" alt="pull request management"></p>
+<p>管理者会对 pull request 涉及的改动进行 review,以确保你的代码是符合规范的,逻辑有没有偏差,以及符合框架的功能需求。</p>
+<h3>2.2 Travis CI</h3>
+<p>一些自动化的 CI 流程被植入在每一次 pull request 的构建之中,用于给开源仓库去校验提交者的代码是否符合既定的规范,如:是否有编译问题,单元测试是否通过,覆盖率是否达标,代码风格是否合规等等。</p>
+<p><img src="http://ov0zuistv.bkt.clouddn.com/image-20180827160503114.png" alt="CI报告"></p>
+<p>一般情况下,必须通过 CI,你的 pull request 才会被管理 review。</p>
+<h3>2.3 Mailing list</h3>
+<p>每个开源项目都会有自己的贡献规范,可以参考首页的 Contributing,来获取具体的信息。dubbo 作为一个孵化中的 apache 项目,遵守了 apache 的传统,在 <a href="https://github.com/apache/dubbo/blob/master/CONTRIBUTING.md">Contributing</a> 中描述道:当你有新特性想要贡献给 Dubbo 时,官方推荐使用 Mailing list 的方式描述一遍你想要做的改动。</p>
+<p>Mailing list 简单来说,就是一个邮件通知机制,所有的 Dubbo 开发者都会订阅该邮箱:dev@dubbo.apache.org。有任何新特性的改动,或者什么建议想要通知其他开发者,都可以通过向该邮箱发送邮件来达到这个目的,相同地,你也会收到其转发的其他开发者的邮件。</p>
+<p>或者你是一个 Dubbo 的使用者,你想要得知开发者的改造方向,也可以订阅,这个<a href="https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide">指南</a>可以帮助你订阅 Dubbo 的 Mailing list。</p>
+<blockquote>
+<p>作为一个 modern developer,你可能觉得 mailing list 的交流方式存在滞后性,这样的沟通方式不是特别的高效,但它作为 apache 项目的推荐交流方式存在其特殊的原因,在此不多赘述。总之遵循一个原则:bug fix或者讨论,可以在 github issue 中进行,影响较大的特性和讨论则推荐在 mailing list 中展开。</p>
+</blockquote>
+<h2>3 其他贡献形式</h2>
+<p>不仅仅只有贡献代码,修复 bug 等行为才算作为开源做贡献,以下这些行为也属于主要形式:</p>
+<h3>3.1 撰写文档</h3>
+<p><a href="http://dubbo.apache.org/zh-cn/">Dubbo文档</a>是其开源组成成分的重要一环,其内容源文件位于:<a href="https://github.com/apache/dubbo-website">https://github.com/apache/dubbo-website</a>。同样也是一个 Git 仓库,任何你想要对 dubbo 知识点的补充,都可以在这儿提交 pull request,只需要一些 markdown 的语法知识,和一些可有可无的 npm 语法即可。如果你觉得贡献代码对于现在的自己仍然有点难度,不妨从贡献文档开始接触开源。</p>
+<h3>3.2 ISSUE</h3>
+<p>无论是 Github 中的 Issue 还是 mailing list 中的讨论,无论是提出问题,汇报 bug,还是回答问题(bugfix 则不仅仅需要 Issue 了),协助管理者 review pull request,都是贡献的一种形式,勿以善小而不为。</p>
+<h3>3.3 其他行为</h3>
+<p>任何你能够想到的,可以帮助开源项目变得更好的的行为,都属于开源贡献。例如,给每个 Issue 打上合适的 tag,关闭重复的 Issue,链接相关联的 Issue,线下组织沙龙,回答 Stack Overflow 上相关的问题,以及文档中一个错别字的修改等等。</p>
+<h2>4 开源最佳实践</h2>
+<h3>4.1 有效沟通</h3>
+<p>无论你处于什么样的目的:仅仅是一次性的贡献,亦或是永久性的加入社区,都的和他人进行沟通和交往,这是你要在开源圈发展必须修炼的技能。</p>
+<p>在你开启一个isse或PR之前,或者是在聊天室问问题之前,请牢记下面所列出的几点建议,会让你的工作更加的高效。</p>
+<p><strong>给出上下文</strong> 以便于让其他人能够快速的理解。比方说你运行程序时遇到一个错误,要解释你是如何做的,并描述如何才能再现错误现象。又比方说你是提交一个新的想法,要解释你为什么这么想,对于项目有用处吗(不仅仅是只有你!)</p>
+<blockquote>
+<p>😇 <em>“当我做 Y 的时候 X 不能工作”</em></p>
+<p>😢 <em>“X 出问题! 请修复它。”</em></p>
+</blockquote>
+<p><strong>在进一步行动前,做好准备工作。</strong> 不知道没关系,但是要展现你尝试过、努力过。在寻求帮助之前,请确认阅读了项目的 README、文档、问题(开放的和关闭的)、邮件列表,并搜索了网络。当你表现出很强烈的求知欲的时候,人们是非常欣赏这点的,会很乐意的帮助你。</p>
+<blockquote>
+<p>😇 <em>“我不确定 X 是如何实现的,我查阅了相关的帮助文档,然而毫无所获。”</em></p>
+<p>😢 <em>“我该怎么做 X ?”</em></p>
+</blockquote>
+<p><strong>保持请求内容短小而直接。</strong> 正如发送一份邮件,每一次的贡献,无论是多么的简单,都是需要他人去查阅的。很多项目都是请求的人多,提供帮助的人少。相信我,保持简洁,你能得到他人帮助的机会会大大的增加。</p>
+<blockquote>
+<p>😇 <em>“我很乐意写 API 教程。”</em></p>
+<p>😢 <em>” 有一天我驾驶汽车行驶在高速公路上,在某个加油站加油的时候,突发奇想,我们应该这么做,不过在我进一步解释之前,我先和大家展示一下。。。”</em></p>
+</blockquote>
+<p><strong>让所有的沟通都是在公开场合下进行。</strong> 哪怕是很不起眼的小事,也不要去给维护者发私信,除非是你要分享一些敏感信息(诸如安全问题或严重的过失)。你若能够保持谈话是公开的,很多人可以你们交换的意见中学习和受益。</p>
+<blockquote>
+<p>😇 <em>(评论) “@维护者 你好!我们该如何处理这个PR?”</em></p>
+<p>😢 <em>(邮件) “你好,非常抱歉给发信,但是我实在很希望你能看一下我提交的PR。”</em></p>
+</blockquote>
+<p><strong>大胆的提问(但是要谨慎!)。</strong> 每个人参与社区,开始的时候都是新手,哪怕是非常有经验的贡献者也一样,在刚进入一个新的项目的时候,也是新手。出于同样的原因,甚至长期维护人员并不总是熟悉一个项目的每一部分。给他们同样的耐心,你也会得到同样的回报。</p>
+<blockquote>
+<p>😇 <em>“感谢查看了这个错误,我按照您的建议做了,这是输出结果。”</em></p>
+<p>😢 <em>“你为什么不修复我的问题?这难道不是你的项目吗?”</em></p>
+</blockquote>
+<p><strong>尊重社区的决定。</strong> 你的想法可能会和社区的优先级、愿景等有差异,他们可能对于你的想法提供了反馈和最后的决定的理由,这时你应该去积极的讨论,并寻求妥协的办法,维护者必须慎重的考虑你的想法。但是如果你实在是不能同意社区的做法,你可以坚持自己!保持自己的分支,或者另起炉灶。</p>
+<blockquote>
+<p>😇 <em>“你不能支持我的用例,我蛮失望,但是你的解释仅仅是对一小部分用户起作用,我理解是为什么。感谢你的耐心倾听。”</em></p>
+<p>😢 <em>“你为什么不支持我的用例?这是不可接受的!”</em></p>
+</blockquote>
+<p><strong>以上几点,要铭记在心。</strong> 开源是由来自世界各地的人们共同协作实现的。面临的问题是跨语言、跨文化、不同的地理为止、不同的时区,另外,撰写文字的沟通更是难上加难,无法传达语气和情绪。请让这些会话都充满善意吧!在以下情形中请保持礼貌:推动一个想法、请求更多的上下文、进一步澄清你的立场。既然你在互联网找到了自己的所需,那么请尝试让它变得更好!</p>
+<h3>4.2 创建 issue</h3>
+<p>你应该在遇到下列情况下,去创建一个 issue:</p>
+<ul>
+<li>报告你自己无法解决的错误</li>
+<li>讨论一个高级主题或想法</li>
+<li>期望实现某新的特性,或者其它项目的想法</li>
+</ul>
+<p>在 issue 的沟通中几点实用的技巧:</p>
+<ul>
+<li><strong>如果你刚好看到一个开放的issue,恰是你打算解决的,</strong> 添加评论,告诉他人你将对此展开工作,并及时响应。这样的话,可以避免他人重复劳动。</li>
+<li><strong>如果说某个issue已经开放很久了,</strong> 这可能是已经有人正在解决中,又或者是早已经解决过了,所以也请添加评论,在打算开始工作之前,最好是确认一下。</li>
+<li><strong>如果你创建了一个issue,但是没多久自己解决了,</strong> 也要添加评论,让其他人知道,然后关闭该issue。记录本身就是对社区的贡献。</li>
+</ul>
+<h3>4.3 创建 pull request</h3>
+<p>在下面的情形时,请你务必使用 PR:</p>
+<ul>
+<li>提交补丁 (例如,纠正拼写错误、损坏的链接、或者是其它较明显的错误)</li>
+<li>开始一项别人请求的任务,或者是过去在issue中早就讨论过的</li>
+</ul>
+<p>一个 PR 并不代表着工作已经完成。它通常是尽早的开启一个PR,是为了其他人可以观看或者给作者反馈意见。只需要在子标题标记为“WIP”(正在进行中)。作者可以在后面添加很多评论。</p>
+<p>如果说项目是托管在 GitHub上的,以下是我们总结出的提交RP的建议:</p>
+<ul>
+<li><strong>Fork 代码仓库</strong> 并克隆到本地,在本地的仓库配置“上游”为远端仓库。这样你可以在提交你的PR时保持和“上游”同步,会减少很多解决冲突的时间。(更多关于同步的说明,请参考<a href="https://help.github.com/articles/syncing-a-fork/">这里</a>.)</li>
+<li><strong>创建一个分支</strong> 用于自己编辑。</li>
+<li><strong>参考任何相关的issue</strong> 或者在你的RP中支持文档(比如. “Closes #37.”)</li>
+<li><strong>包含之前和之后的快照</strong> 如果你的改动是包含了不同的 HTML/CSS。在你的PR中拖拉相应的图片。</li>
+<li><strong>测试你的改动!</strong> 若测试用例存在的话,跑一遍,以覆盖你的更改,若没有的话,则创建相应的用例。无论测试是否存在,一定要确保你的改动不会破坏掉现有的项目。</li>
+<li><strong>和项目现有的风格保持一致</strong> 尽你最大的努力,这也就是意味着在使用缩进、分号、以及注释很可能和你自己的风格大相径庭,但是为了节省维护者的精力,以及未来他人更好的理解和维护,还请你容忍一下。</li>
+</ul>
+<h2>5 成为一个开源贡献者</h2>
+<p>如果你有志于参与开源事业,可以尝试从自己最熟悉的项目开始,开源并不是属于高级开发者的专属词汇,它就是由你我这样的人在需求,修复,构建中演进下去的。Let's try it !</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/dubbo-contribute-to-opensource.json b/zh-cn/blog/dubbo-contribute-to-opensource.json
new file mode 100644
index 0000000..5aa4b6b
--- /dev/null
+++ b/zh-cn/blog/dubbo-contribute-to-opensource.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-contribute-to-opensource.md",
+  "__html": "<h1>以Dubbo为例,聊聊如何向开源项目做贡献</h1>\n<p>Github 上有众多优秀的开源项目,大多数 IT 从业者将其当做了予取予求的工具库,遇到什么需求,先去 Github 搜一把,但有没有想过有一天自己也可以给开源事业做一些贡献呢?本文将会以 dubbo 项目为例,向你阐释,给开源项目做贡献并不是一件难事。</p>\n<h2>1 为何要给开源贡献力量</h2>\n<p>为开源项目做贡献得到的收益是多方面的,为了让你有足够的信心加入到开源项目中,我在文章最开始列举出它的诸多好处。</p>\n<h3>1.1 巩固技能</h3>\n<p>无论你是提交代码,撰写文档,提交 Issue,组织活动,当你切身参与到一个开源项目中,相关的技能都会得到历练,并且在开源项目中找到自己的位置。一方面,日常工作中我们中的大多数人接触到的是业务场景,并没有太多机会接触到基础架构组件�
 �开源项目为我们提供了一个平台,在这里,你可以尽情挑选自己熟悉的项目为它添砖加瓦(以 Dubbo 为例,并不是所有 IT 公司都有能力自研服务治理框架);另一方面,你所提交的 [...]
+  "link": "/zh-cn/blog/dubbo-contribute-to-opensource.html",
+  "meta": {
+    "title": "以Dubbo为例,聊聊如何向开源项目做贡献",
+    "keywords": "Dubbo, opensource",
+    "description": "本文将会以 dubbo 项目为例向你阐释,给开源项目做贡献并不是一件难事"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-copywriting-style.json b/zh-cn/blog/dubbo-copywriting-style.json
new file mode 100644
index 0000000..734b1d2
--- /dev/null
+++ b/zh-cn/blog/dubbo-copywriting-style.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-copywriting-style.md",
+  "__html": "<h1>Dubbo 博客文档中文排版指南</h1>\n<p>[TOC]</p>\n<h2>空格</h2>\n<p>「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。与大家共勉之。」—— <a href=\"https://github.com/vinta/pangu.js\">vinta/paranoid-auto-spacing</a></p>\n<h3>中英文之间需要增加空格</h3>\n<p>正确:</p>\n<blockquote>\n<p>在 LeanCloud 上,数据存储是围绕 <code>AVObject</code> 进行的。</p>\n</blockquote>\n<p>错误:</p>\n<blockquote>\n<p>在LeanCloud上,数据存储是围绕<code>AVObject</code>进行的。</p>\n</blockquote>\n<blockquote> [...]
+  "link": "/zh-cn/blog/dubbo-copywriting-style.html",
+  "meta": {
+    "title": "Dubbo 博客文档中文排版指南",
+    "keywords": "Dubbo, Copywriting",
+    "description": "统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-echo-test.json b/zh-cn/blog/dubbo-echo-test.json
new file mode 100644
index 0000000..0dc2f88
--- /dev/null
+++ b/zh-cn/blog/dubbo-echo-test.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-echo-test.md",
+  "__html": "<h1>回声测试</h1>\n<p>回声测试用于检测服务是否可用。客户端通过 EchoService 来使用回声测试。EchoService 申明如下:</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\">EchoService</span> </span>{\n\n    <span class=\"hljs-comment\">/**\n     * echo test.\n     *\n     * <span class=\"hljs-doctag\">@param</span> message message.\n     * <span class=\"hljs-doctag\">@return</span> messag [...]
+  "link": "/zh-cn/blog/dubbo-echo-test.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-fescar.json b/zh-cn/blog/dubbo-fescar.json
new file mode 100644
index 0000000..26b1384
--- /dev/null
+++ b/zh-cn/blog/dubbo-fescar.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-fescar.md",
+  "__html": "<h1>如何使用Fescar保证Dubbo微服务间的一致性</h1>\n<h2>案例</h2>\n<p>用户采购商品业务,整个业务包含3个微服务:</p>\n<ul>\n<li>库存服务: 扣减给定商品的库存数量。</li>\n<li>订单服务: 根据采购请求生成订单。</li>\n<li>账户服务: 用户账户金额扣减。</li>\n</ul>\n<h3>业务结构图</h3>\n<p><img src=\"../../img/blog/fescar/fescar-1.png\" alt=\"Architecture\"></p>\n<h3>StorageService</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">Storage [...]
+  "link": "/zh-cn/blog/dubbo-fescar.html",
+  "meta": {
+    "title": "如何使用Fescar保证Dubbo微服务间的一致性",
+    "keywords": "Dubbo,Fescar,一致性",
+    "description": "本文主要介绍如何使用Fescar保证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
new file mode 100644
index 0000000..2bb28e8
--- /dev/null
+++ b/zh-cn/blog/dubbo-generic-invoke.json
@@ -0,0 +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> [...]
+  "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-gracefully-shutdown.json b/zh-cn/blog/dubbo-gracefully-shutdown.json
new file mode 100644
index 0000000..d026b9e
--- /dev/null
+++ b/zh-cn/blog/dubbo-gracefully-shutdown.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-gracefully-shutdown.md",
+  "__html": "<h1>Dubbo 优雅停机</h1>\n<h2>背景</h2>\n<p>对于任何一个线上应用,如何在服务更新部署过程中保证客户端无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求。理想条件下,在没有请求的时候再进行更新是最安全可靠的,然而互联网应用必须要保证可用性,因此在技术层面上优化应用更新流程来保证服务在更新时无损是必要的。</p>\n<p>传统的解决方式是通过将应用更新流程划分为手工摘流量、停应用、更新重启三个步骤,由人工操作实现客户端无对更新感知。这种方式简单而有效,但是限制较多:不仅需要使用借助网关的支持来摘流量,还需要在停应用前人工判断来保证在途请求已经处理完毕。这种需要人工介入的方式运维复杂度较高,只能适用规模较小的应用,无法在大规模系统上使用。</
 p>\n<p>因此,如果在容器/框架级别提供某种自动化机制,来自动进行摘流量并确保处理完以到达的请求,不仅能保证业务不受更新影响,还可以极大地提升更新应用时的运维效率。</p>\n<p>这个机制也就是优雅停机,目前Tomcat/Undertow/ [...]
+  "link": "/zh-cn/blog/dubbo-gracefully-shutdown.html",
+  "meta": {
+    "title": "Dubbo 优雅停机",
+    "keywords": "Dubbo, Gracefully Shutdown, Safely Shutdown",
+    "description": "介绍Dubbo优雅停机的原理和使用方式"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-heartbeat-design.json b/zh-cn/blog/dubbo-heartbeat-design.json
new file mode 100644
index 0000000..1d60ed2
--- /dev/null
+++ b/zh-cn/blog/dubbo-heartbeat-design.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-heartbeat-design.md",
+  "__html": "<h1>Dubbo 现有心跳方案总结以及改进建议</h1>\n<h3>1 前言</h3>\n<p>设计一个好的心跳机制并不是一件容易的事,就我所熟知的几个 RPC 框架,它们的心跳机制可以说大相径庭,这篇文章我将探讨一下<strong>如何设计一个优雅的心跳机制,主要从 Dubbo 的现有方案以及一个改进方案来做分析</strong>。</p>\n<h3>2 预备知识</h3>\n<p>因为后续我们将从源码层面来进行介绍,所以一些服务治理框架的细节还需要提前交代一下,方便大家理解。</p>\n<h4>2.1 客户端如何得知请求失败了?</h4>\n<p>高性能的 RPC 框架几乎都会选择使用 Netty 来作为通信层的组件,非阻塞式通信的高效不需要我做过多的介绍。但也由于非阻塞的特性,导致其发送数据和接收数据是一个异步的过程,所以当存在服务端异常、网络问题时,客户端是接收不到响应的,那么我们如何判断一次 RP
 C 调用是失败的呢?</p>\n<p>误区一:Dubbo 调用不是默认同步的吗?</p>\n<p>Dubbo 在通信层是异步的,呈现给使用 [...]
+  "link": "/zh-cn/blog/dubbo-heartbeat-design.html",
+  "meta": {
+    "title": "Dubbo 现有心跳方案总结以及改进建议",
+    "keywords": "Dubbo, 心跳",
+    "description": "一种心跳,两种设计"
+  }
+}
\ 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
new file mode 100644
index 0000000..c736cc4
--- /dev/null
+++ b/zh-cn/blog/dubbo-integrate-with-hystrix.json
@@ -0,0 +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/dubbo\">https://github.com/apache/dubbo</a></li>\n</ul>\n<h2>Spring Boot应用</h2>\n [...]
+  "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
new file mode 100644
index 0000000..4825f68
--- /dev/null
+++ b/zh-cn/blog/dubbo-invoke.json
@@ -0,0 +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>这里 [...]
+  "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
new file mode 100644
index 0000000..cf343f9
--- /dev/null
+++ b/zh-cn/blog/dubbo-k8s.json
@@ -0,0 +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),存储服 [...]
+  "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
new file mode 100644
index 0000000..9f188b1
--- /dev/null
+++ b/zh-cn/blog/dubbo-loadbalance.json
@@ -0,0 +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>根据配置的随机负载均衡 [...]
+  "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-local-call.json b/zh-cn/blog/dubbo-local-call.json
new file mode 100644
index 0000000..dc1bb3a
--- /dev/null
+++ b/zh-cn/blog/dubbo-local-call.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-local-call.md",
+  "__html": "<h1>本地调用</h1>\n<h3>本地调用介绍</h3>\n<p>当一个应用既是一个服务的提供者,同时也是这个服务的消费者的时候,可以直接对本机提供的服务发起本地调用。从 <code>2.2.0</code> 版本开始,Dubbo 默认在本地以 <em>injvm</em> 的方式暴露服务,这样的话,在同一个进程里对这个服务的调用会优先走本地调用。</p>\n<p>与本地对象上方法调用不同的是,Dubbo 本地调用会经过 Filter 链,其中包括了 Consumer 端的 Filter 链以及 Provider 端的 Filter 链。通过这样的机制,本地消费者和其他消费者都是统一对待,统一监控,服务统一进行治理。</p>\n<p><img src=\"../../img/blog/dubbo-local-call-filter.png\" alt=\"filter-chain\"></p>\n<p>同时,相比于远程调用来说,Dubbo 本地调用性能较优,省去了请求、响应的编解码及网络传输的过程。</p>\n<p>要使用 Dubbo 本地 [...]
+  "link": "/zh-cn/blog/dubbo-local-call.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-meet-arthas.json b/zh-cn/blog/dubbo-meet-arthas.json
new file mode 100644
index 0000000..d00b163
--- /dev/null
+++ b/zh-cn/blog/dubbo-meet-arthas.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meet-arthas.md",
+  "__html": "<h1>当Dubbo遇上Arthas:排查问题的实践</h1>\n<p>Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/apache/dubbo\">https://github.com/apache/dubbo</a></li>\n<li>文档:<a href=\"http://dubbo.apache.org/zh-cn/\">http://dubbo.apache.org/zh-cn/</a></li>\n</ul>\n<p>Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/alibaba/arthas\">https://github.com/alibaba/arthas</a></li>\n<li>文档:<a href=\"http [...]
+  "link": "/zh-cn/blog/dubbo-meet-arthas.html",
+  "meta": {
+    "title": "当Dubbo遇上Arthas:排查问题的实践",
+    "keywords": "Dubbo, Arthas",
+    "description": "使用Alibaba开源的应用诊断利器Arthas来排查Dubbo应用的问题。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.json b/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.json
new file mode 100644
index 0000000..1c268af
--- /dev/null
+++ b/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meetup-beijing-may-12th-2018.md",
+  "__html": "<h2>首届Dubbo开发者沙龙在北京成功举办</h2>\n<p>首届Dubbo开发者沙龙在北京成功举办, 超过400位开发者参加。这是一个很好的开始!</p>\n<p>分享嘉宾及主体如下:</p>\n<ul>\n<li>罗毅: Dubbo 的现状现状与未来规划 <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/dubbo-present-and-future.pdf\">PDF</a></li>\n<li>刘军: 第四届阿里中间件性能挑战赛 <a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/introduction-to-4th-aliware-performance-challenge.pdf\">PDF</a></li>\n<li>陈志轩: 通过 Dubbo 和 Spring-b [...]
+  "link": "/zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.html",
+  "meta": {
+    "title": "首届Dubbo开发者沙龙在北京成功举办",
+    "keywords": "Dubbo, Beijing, meetup",
+    "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
new file mode 100644
index 0000000..6e0a169
--- /dev/null
+++ b/zh-cn/blog/dubbo-meetup-chengdu.json
@@ -0,0 +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>报名链接: [...]
+  "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-hangzhou.json b/zh-cn/blog/dubbo-meetup-hangzhou.json
new file mode 100644
index 0000000..8bc4f38
--- /dev/null
+++ b/zh-cn/blog/dubbo-meetup-hangzhou.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-meetup-hangzhou.md",
+  "__html": "<h1>第五届Dubbo开发者沙龙在杭州成功举办</h1>\n<p>第五届Dubbo开发者沙龙在杭州成功举办,</p>\n<p>分享嘉宾</p>\n<ul>\n<li>李鼎: 如何参与Dubbo开源社区 <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/how-to-involve-in-dubbo-community.pdf\">slides</a></li>\n<li>曹胜利: Dubbo 2.7新特性介绍及演示 <a href=\"https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-2.7-introduction.pdf\">slides</a></li>\n<li>陶杨:  Dubbo在考拉的应用实践 <a href=\"https://github.com/dubbo/awe [...]
+  "link": "/zh-cn/blog/dubbo-meetup-hangzhou.html",
+  "meta": {
+    "title": "第五届Dubbo开发者沙龙在杭州成功举办",
+    "keywords": "Dubbo, 杭州, meetup",
+    "description": "第五届Dubbo开发者沙龙在杭州成功举办。"
+  }
+}
\ 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
new file mode 100644
index 0000000..bb0596a
--- /dev/null
+++ b/zh-cn/blog/dubbo-meetup-shanghai-jun-23rd-2018.json
@@ -0,0 +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-th [...]
+  "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
new file mode 100644
index 0000000..d7a6257
--- /dev/null
+++ b/zh-cn/blog/dubbo-meetup-shenzhen.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..8489c42
--- /dev/null
+++ b/zh-cn/blog/dubbo-mesh-in-thinking.json
@@ -0,0 +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 |  [...]
+  "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
new file mode 100644
index 0000000..f213869
--- /dev/null
+++ b/zh-cn/blog/dubbo-mesh-service-mesh-exploring.json
@@ -0,0 +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</l [...]
+  "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-network-interfaces.html b/zh-cn/blog/dubbo-network-interfaces.html
new file mode 100644
index 0000000..67155f2
--- /dev/null
+++ b/zh-cn/blog/dubbo-network-interfaces.html
@@ -0,0 +1,406 @@
+<!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="网卡地址注册" />
+	<meta name="description" content="研究 Dubbo 网卡地址注册时的一点思考" />
+	<!-- 网页标签标题 -->
+	<title>研究 Dubbo 网卡地址注册时的一点思考</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 [...]
+<h2>1 如何选择合适的网卡地址</h2>
+<p>可能相当一部分人还不知道我这篇文章到底要讲什么,我说个场景,大家应该就明晰了。在分布式服务调用过程中,以 Dubbo 为例,服务提供者往往需要将自身的 IP 地址上报给注册中心,供消费者去发现。在大多数情况下 Dubbo 都可以正常工作,但如果你留意过 Dubbo 的 github issue,其实有不少人反馈:Dubbo Provider 注册了错误的 IP。如果你能立刻联想到:多网卡、内外网地址共存、VPN、虚拟网卡等关键词,那我建议你一定要继续将本文看下去,因为我也想到了这些,它们都是本文所要探讨的东西!那么“如何选择合适的网卡地址”呢,Dubbo 现有的逻辑到底算不算完备?我们不急着回答它,而是带着这些问题一起进行研究,相信到文末,其中答案,各位看官自有评说。</p>
+<h2>2 Dubbo 是怎么做的</h2>
+<p>Dubbo 获取网卡地址的逻辑在各个版本中也是千回百转,走过弯路,也做过优化,我们用最新的 2.7.2-SNAPSHOT 版本来介绍,在看以下源码时,大家可以怀着质疑的心态去阅读,在 dubbo github 的 master 分支可以获取源码。获取 localhost 的逻辑位于 <code>org.apache.dubbo.common.utils.NetUtils#getLocalAddress0()</code> 之中</p>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> InetAddress <span class="hljs-title">getLocalAddress0</span><span class="hljs-params">()</span> </span>{
+    InetAddress localAddress = <span class="hljs-keyword">null</span>;
+    <span class="hljs-comment">// 首先尝试获取 /etc/hosts 中 hostname 对应的 IP</span>
+    localAddress = InetAddress.getLocalHost();
+    Optional&lt;InetAddress&gt; addressOp = toValidAddress(localAddress);
+    <span class="hljs-keyword">if</span> (addressOp.isPresent()) {
+        <span class="hljs-keyword">return</span> addressOp.get();
+    }
+
+    <span class="hljs-comment">// 没有找到适合注册的 IP,则开始轮询网卡</span>
+    Enumeration&lt;NetworkInterface&gt; interfaces = NetworkInterface.getNetworkInterfaces();
+    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == interfaces) {
+        <span class="hljs-keyword">return</span> localAddress;
+    }
+    <span class="hljs-keyword">while</span> (interfaces.hasMoreElements()) {
+        NetworkInterface network = interfaces.nextElement();
+        Enumeration&lt;InetAddress&gt; addresses = network.getInetAddresses();
+        <span class="hljs-keyword">while</span> (addresses.hasMoreElements()) {
+            <span class="hljs-comment">// 返回第一个匹配的适合注册的 IP</span>
+            Optional&lt;InetAddress&gt; addressOp = toValidAddress(addresses.nextElement());
+            <span class="hljs-keyword">if</span> (addressOp.isPresent()) {
+                <span class="hljs-keyword">return</span> addressOp.get();
+            }
+        }
+    }
+    <span class="hljs-keyword">return</span> localAddress;
+}
+</code></pre>
+<p>Dubbo 这段选取本地地址的逻辑大致分成了两步</p>
+<ol>
+<li>先去 /etc/hosts 文件中找 hostname 对应的 IP 地址,找到则返回;找不到则转 2</li>
+<li>轮询网卡,寻找合适的 IP 地址,找到则返回;找不到返回 null,在 getLocalAddress0 外侧还有一段逻辑,如果返回 null,则注册 127.0.0.1 这个本地回环地址</li>
+</ol>
+<p>首先强调下,这段逻辑并没有太大的问题,先别急着挑刺,让我们来分析下其中的一些细节,并进行验证。</p>
+<h3>2.1 尝试获取 hostname 映射 IP</h3>
+<p>Dubbo 首先选取的是 hostname 对应的 IP,在源码中对应的 <code>InetAddress.getLocalHost();</code>  在 <code>*nix</code> 系统实际部署 Dubbo 应用时,可以首先使用 <code>hostname</code> 命令获取主机名</p>
+<pre><code class="language-shell">xujingfengdeMacBook-Pro:~ xujingfeng$ hostname
+xujingfengdeMacBook-Pro.local
+</code></pre>
+<p>紧接着在 <code>/etc/hosts</code> 配置 IP 映射,为了验证 Dubbo 的机制,我们随意为 hostname 配置一个 IP 地址</p>
+<pre><code>127.0.0.1	localhost
+1.2.3.4 xujingfengdeMacBook-Pro.local
+</code></pre>
+<p>接着调用 <code>NetUtils.getLocalAddress0()</code> 进行验证,控制台打印如下:</p>
+<pre><code>xujingfengdeMacBook-Pro.local/1.2.3.4
+</code></pre>
+<h3>2.2 判定有效的 IP 地址</h3>
+<p>在 toValidAddress 逻辑中,Dubbo 存在以下逻辑判定一个 IP 地址是否有效</p>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Optional&lt;InetAddress&gt; <span class="hljs-title">toValidAddress</span><span class="hljs-params">(InetAddress address)</span> </span>{
+    <span class="hljs-keyword">if</span> (address <span class="hljs-keyword">instanceof</span> Inet6Address) {
+        Inet6Address v6Address = (Inet6Address) address;
+        <span class="hljs-keyword">if</span> (isValidV6Address(v6Address)) {
+            <span class="hljs-keyword">return</span> Optional.ofNullable(normalizeV6Address(v6Address));
+        }
+    }
+    <span class="hljs-keyword">if</span> (isValidV4Address(address)) {
+        <span class="hljs-keyword">return</span> Optional.of(address);
+    }
+    <span class="hljs-keyword">return</span> Optional.empty();
+}
+</code></pre>
+<p>依次校验其符合 Ipv6 或者 Ipv4 的 IP 规范,对于 Ipv6 的地址,见如下代码:</p>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isValidV6Address</span><span class="hljs-params">(Inet6Address address)</span> </span>{
+    <span class="hljs-keyword">boolean</span> preferIpv6 = Boolean.getBoolean(<span class="hljs-string">"java.net.preferIPv6Addresses"</span>);
+    <span class="hljs-keyword">if</span> (!preferIpv6) {
+        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
+    }
+    <span class="hljs-keyword">try</span> {
+        <span class="hljs-keyword">return</span> address.isReachable(<span class="hljs-number">100</span>);
+    } <span class="hljs-keyword">catch</span> (IOException e) {
+        <span class="hljs-comment">// ignore</span>
+    }
+    <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
+}
+</code></pre>
+<p>首先获取 <code>java.net.preferIPv6Addresses</code> 参数,其默认值为 false,鉴于大多数应用并没有使用 Ipv6 地址作为理想的注册 IP,这问题不大,紧接着通过 isReachable 判断网卡的连通性。例如一些网卡可能是 VPN/虚拟网卡的地址,如果没有配置路由表,往往无法连通,可以将之过滤。</p>
+<p>对于 Ipv4 的地址,见如下代码:</p>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isValidV4Address</span><span class="hljs-params">(InetAddress address)</span> </span>{
+    <span class="hljs-keyword">if</span> (address == <span class="hljs-keyword">null</span> || address.isLoopbackAddress()) {
+        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
+    }
+    String name = address.getHostAddress();
+    <span class="hljs-keyword">boolean</span> result = (name != <span class="hljs-keyword">null</span>
+            &amp;&amp; IP_PATTERN.matcher(name).matches()
+            &amp;&amp; !Constants.ANYHOST_VALUE.equals(name)
+            &amp;&amp; !Constants.LOCALHOST_VALUE.equals(name));
+    <span class="hljs-keyword">return</span> result;
+}
+</code></pre>
+<p>对比 Ipv6 的判断,这里我们已经发现前后不对称的情况了</p>
+<ul>
+<li>Ipv4 相比 Ipv6 的逻辑多了 Ipv4 格式的正则校验、本地回环地址校验、ANYHOST 校验</li>
+<li>Ipv4 相比 Ipv6 的逻辑少了网卡连通性的校验</li>
+</ul>
+<p>大家都知道,Ipv4 将 127.0.0.1 定为本地回环地址, Ipv6 也存在回环地址:0:0:0:0:0:0:0:1 或者表示为 ::1。改进建议也很明显,我们放到文末统一总结。</p>
+<h3>2.3 轮询网卡</h3>
+<p>如果上述地址获取为 null 则进入轮询网卡的逻辑(例如 hosts 未指定 hostname 的映射或者 hostname 配置成了 127.0.0.1 之类的地址便会导致获取到空的网卡地址),轮询网卡对应的源码是 <code>NetworkInterface.getNetworkInterfaces()</code> ,这里面涉及的知识点就比较多了,支撑起了我写这篇文章的素材,Dubbo 的逻辑并不复杂,进行简单的校验,返回第一个可用的 IP 即可。</p>
+<p>性子急的读者可能忍不住了,多网卡!合适的网卡可能不止一个,Dubbo 怎么应对呢?按道理说,我们也替 Dubbo 说句公道话,客官要不你自己指定下?我们首先得对多网卡的场景达成一致看法,才能继续把这篇文章完成下去:我们只能<strong>尽可能</strong>过滤那些“<strong>不对</strong>”的网卡。Dubbo 看样子对所有网卡是一视同仁了,那么是不是可以尝试优化一下其中的逻辑呢?</p>
+<p>许多开源的服务治理框架在 stackoverflow 或者其 issue 中,注册错 IP 相关的问题都十分高频,大多数都是轮询网卡出了问题。既然事情发展到这儿,势必需要了解一些网络、网卡的知识,我们才能过滤掉那些明显不适合 RPC 服务注册的 IP 地址了。</p>
+<h2>3 Ifconfig 介绍</h2>
+<p>我并没有想要让大家对后续的内容望而却步,特地选择了这个大家最熟悉的 Linux 命令!对于那些吐槽:“天呐,都 2019 年了,你怎么还在用 net-tools/ifconfig,iproute2/ip 了解一下”的言论,请大家视而不见。无论你使用的是 mac,还是 linux,都可以使用它去 CRUD 你的网卡配置。</p>
+<h3>3.1 常用指令</h3>
+<p><strong>启动关闭指定网卡:</strong></p>
+<pre><code>ifconfig eth0 up
+ifconfig eth0 down
+</code></pre>
+<p><code>ifconfig eth0 up</code> 为启动网卡 eth0,<code>ifconfig eth0 down</code> 为关闭网卡 eth0。ssh 登陆 linux 服务器操作的用户要小心执行这个操作了,千万不要蠢哭自己。不然你下一步就需要去 google:“禁用 eth0 网卡后如何远程连接 Linux 服务器” 了。</p>
+<p><strong>为网卡配置和删除IPv6地址:</strong></p>
+<pre><code>ifconfig eth0 add 33ffe:3240:800:1005::2/64    #为网卡eth0配置IPv6地址
+ifconfig eth0 del 33ffe:3240:800:1005::2/64    #为网卡eth0删除IPv6地址
+</code></pre>
+<p><strong>用 ifconfig 修改 MAC 地址:</strong></p>
+<pre><code>ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE
+</code></pre>
+<p><strong>配置 IP 地址:</strong></p>
+<pre><code>[root@localhost ~]# ifconfig eth0 192.168.2.10
+[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0
+[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
+</code></pre>
+<p><strong>启用和关闭arp协议:</strong></p>
+<pre><code>ifconfig eth0 arp    #开启网卡eth0 的arp协议
+ifconfig eth0 -arp   #关闭网卡eth0 的arp协议
+</code></pre>
+<p><strong>设置最大传输单元:</strong></p>
+<pre><code>ifconfig eth0 mtu 1500    #设置能通过的最大数据包大小为 1500 bytes
+</code></pre>
+<h3>3.2 查看网卡信息</h3>
+<p>在一台 ubuntu 上执行 <code>ifconfig -a</code></p>
+<pre><code class="language-shell">ubuntu@VM-30-130-ubuntu:~$ ifconfig -a
+eth0      Link encap:Ethernet  HWaddr 52:54:00:a9:5f:ae
+          inet addr:10.154.30.130  Bcast:10.154.63.255  Mask:255.255.192.0
+          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
+          RX packets:149673 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:152271 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:1000
+          RX bytes:15205083 (15.2 MB)  TX bytes:21386362 (21.3 MB)
+
+lo        Link encap:Local Loopback
+          inet addr:127.0.0.1  Mask:255.0.0.0
+          UP LOOPBACK RUNNING  MTU:65536  Metric:1
+          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:1
+          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
+          
+docker0   Link encap:Ethernet  HWaddr 02:42:58:45:c1:15
+          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
+          UP BROADCAST MULTICAST  MTU:1500  Metric:1
+          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:0
+          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
+
+tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
+          UP POINTOPOINT NOARP MULTICAST  MTU:1500  Metric:1
+          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:100
+          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
+</code></pre>
+<p>为了防止黑客对我的 Linux 发起攻击,我还是偷偷对 IP 做了一点“改造”,请不要为难一个趁着打折+组团购买廉价云服务器的小伙子。对于部分网卡的详细解读:</p>
+<p>eth0 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC 地址)是 02:42:38:52:70:54</p>
+<p>inet addr 用来表示网卡的 IP 地址,此网卡的 IP 地址是 10.154.30.130,广播地址, Bcast: 172.18.255.255,掩码地址 Mask:255.255.0.0</p>
+<p>lo 是表示主机的回环地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 HTTPD 服务器的指定到回坏地址,在浏览器输入 127.0.0.1 就能看到你所架构的 WEB 网站了。但只有你能看得到,局域网的其它主机或用户则无从知晓。</p>
+<p>第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)</p>
+<p>第二行:网卡的IP地址、子网、掩码</p>
+<p>第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节(ifconfig 不加 -a 则无法看到 DOWN 的网卡)</p>
+<p>第四、五行:接收、发送数据包情况统计</p>
+<p>第七行:接收、发送数据字节数统计信息。</p>
+<p>紧接着的两个网卡 docker0,tun0 是怎么出来的呢?我在我的 ubuntu 上装了 docker 和 openvpn。这两个东西应该是日常干扰我们做服务注册时的罪魁祸首了,当然,也有可能存在 eth1 这样的第二块网卡。ifconfig -a 看到的东西就对应了 JDK 的 api :<code>NetworkInterface.getNetworkInterfaces()</code> 。我们简单做个总结,大致有三个干扰因素</p>
+<ul>
+<li>以 docker 网桥为首的虚拟网卡地址,毕竟这东西这么火,怎么也得单独列出来吧?</li>
+<li>以 TUN/TAP 为代表的虚拟网卡地址,多为 VPN 场景</li>
+<li>以 eth1 为代表的多网卡场景,有钱就可以装多网卡了!</li>
+</ul>
+<p>我们后续的篇幅将针对这些场景做分别的介绍,力求让大家没吃过猪肉,起码看下猪怎么跑的。</p>
+<h2>4 干扰因素一:Docker 网桥</h2>
+<p>熟悉 docker 的朋友应该知道 docker 会默认创建一个 docker0 的网桥,供容器实例连接。如果嫌默认的网桥不够直观,我们可以使用 bridge 模式自定义创建一个新的网桥:</p>
+<pre><code class="language-shell">ubuntu@VM-30-130-ubuntu:~$ docker network create kirito-bridge
+a38696dbbe58aa916894c674052c4aa6ab32266dcf6d8111fb794b8a344aa0d9
+ubuntu@VM-30-130-ubuntu:~$ ifconfig -a
+br-a38696dbbe58 Link encap:Ethernet  HWaddr 02:42:6e:aa:fd:0c
+          inet addr:172.19.0.1  Bcast:172.19.255.255  Mask:255.255.0.0
+          UP BROADCAST MULTICAST  MTU:1500  Metric:1
+          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:0
+          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
+</code></pre>
+<p>使用 docker network 指令创建网桥之后,自动创建了对应的网卡,我只给出了 <code>ifconfig -a</code> 的增量返回部分,可以看出多了一个 br-a38696dbbe58 的网卡。</p>
+<p>我有意区分了“网桥”和“网卡”,可以使用 bridge-utils/brctl 来查看网桥信息:</p>
+<pre><code class="language-shell">ubuntu@VM-30-130-ubuntu:~$ sudo brctl show
+bridge name	bridge id		STP enabled	interfaces
+br-a38696dbbe58		8000.02426eaafd0c	no
+docker0		8000.02425845c215	no
+</code></pre>
+<p>网桥是一个虚拟设备,这个设备只有 brctl show 能看到,网桥创建之后,会自动创建一个同名的网卡,并将这个网卡加入网桥。</p>
+<h2>5 干扰因素二:TUN/TAP 虚拟网络设备</h2>
+<p>平时我们所说的虚拟网卡、虚拟机,大致都跟 TUN/TAP 有关。我的读者大多数是 Java 从业者,相信我下面的内容并没有太超纲,不要被陌生的名词唬住。对于被唬住的读者,也可以直接跳过 5.1~5.3,直接看 5.4 的实战。</p>
+<h3>5.1 真实网卡工作原理</h3>
+<p><img src="http://kirito.iocoder.cn/1918847-496d0e96c237f25a.png" alt="1918847-496d0e96c237f25a"></p>
+<p>上图中的 <strong>eth0</strong> 表示我们主机已有的真实的网卡接口 (<strong>interface</strong>)。</p>
+<p>网卡接口 <strong>eth0</strong> 所代表的真实网卡通过网线(<strong>wire</strong>)和外部网络相连,该物理网卡收到的数据包会经由接口 <strong>eth0</strong> 传递给内核的网络协议栈(<strong>Network Stack</strong>)。然后协议栈对这些数据包进行进一步的处理。</p>
+<p>对于一些错误的数据包,协议栈可以选择丢弃;对于不属于本机的数据包,协议栈可以选择转发;而对于确实是传递给本机的数据包,而且该数据包确实被上层的应用所需要,协议栈会通过 <strong>Socket API</strong> 告知上层正在等待的应用程序。</p>
+<h3>5.2 TUN 工作原理</h3>
+<p><img src="http://kirito.iocoder.cn/1918847-85ea08bc89d9427e.png" alt="1918847-85ea08bc89d9427e"></p>
+<p>我们知道,普通的网卡是通过网线来收发数据包的话,而 <strong>TUN</strong> 设备比较特殊,它通过一个文件收发数据包。</p>
+<p>如上图所示,<strong>tunX</strong> 和上面的 <strong>eth0</strong> 在逻辑上面是等价的, <strong>tunX</strong> 也代表了一个网络接口,虽然这个接口是系统通过软件所模拟出来的.</p>
+<p>网卡接口 <strong>tunX 所代表的虚拟网卡通过文件 /dev/tunX 与我们的应用程序(App)相连</strong>,应用程序每次使用 <strong>write</strong> 之类的系统调用将数据写入该文件,这些数据会以网络层数据包的形式,通过该虚拟网卡,经由网络接口 <strong>tunX</strong> 传递给网络协议栈,同时该应用程序也可以通过 <strong>read</strong> 之类的系统调用,经由文件 <strong>/dev/tunX</strong> 读取到协议栈向 <strong>tunX</strong> 传递的<strong>所有</strong>数据包。</p>
+<p>此外,协议栈可以像操纵普通网卡一样来操纵 <strong>tunX</strong> 所代表的虚拟网卡。比如说,给 <strong>tunX</strong> 设定 <strong>IP</strong> 地址,设置路由,总之,在协议栈看来,<strong>tunX</strong> 所代表的网卡和其他普通的网卡区别不大,当然,硬要说区别,那还是有的,那就是 <strong>tunX</strong> 设备不存在 <strong>MAC</strong> 地址,这个很好理解,<strong>tunX</strong> 只模拟到了网络层,要 <strong>MAC</strong>地址没有任何意义。当然,如果是 <strong>tapX</strong> 的话,在协议栈的眼中,<strong>tapX</strong> 和真实网卡没有任何区别。</p>
+<p>是不是有些懵了?我是谁,为什么我要在这篇文章里面学习 TUN!因为我们常用的 VPN 基本就是基于 TUN/TAP 搭建的,如果我们使用 <strong>TUN</strong> 设备搭建一个基于 <strong>UDP</strong> 的 <strong>VPN</strong> ,那么整个处理过程可能是这幅样子:</p>
+<p><img src="http://kirito.iocoder.cn/1918847-ac4155ec7e9489b2.png" alt="1918847-ac4155ec7e9489b2"></p>
+<h3>5.3 TAP 工作原理</h3>
+<p><strong>TAP</strong> 设备与 <strong>TUN</strong> 设备工作方式完全相同,区别在于:</p>
+<ol>
+<li><strong>TUN</strong> 设备是一个三层设备,它只模拟到了 <strong>IP</strong> 层,即网络层 我们可以通过 <strong>/dev/tunX</strong> 文件收发 <strong>IP</strong> 层数据包,它无法与物理网卡做 <strong>bridge</strong>,但是可以通过三层交换(如  <strong>ip_forward</strong>)与物理网卡连通。可以使用<code>ifconfig</code>之类的命令给该设备设定 <strong>IP</strong> 地址。</li>
+<li><strong>TAP</strong> 设备是一个二层设备,它比 <strong>TUN</strong> 更加深入,通过 <strong>/dev/tapX</strong> 文件可以收发 <strong>MAC</strong> 层数据包,即数据链路层,拥有 <strong>MAC</strong> 层功能,可以与物理网卡做 <strong>bridge</strong>,支持 <strong>MAC</strong> 层广播。同样的,我们也可以通过<code>ifconfig</code>之类的命令给该设备设定 <strong>IP</strong> 地址,你如果愿意,我们可以给它设定 <strong>MAC</strong> 地址。</li>
+</ol>
+<p>关于文章中出现的二层,三层,我这里说明一下,第一层是物理层,第二层是数据链路层,第三层是网络层,第四层是传输层。</p>
+<h3>5.4 openvpn 实战</h3>
+<p>openvpn 是 Linux 上一款开源的 vpn 工具,我们通过它来复现出影响我们做网卡选择的场景。</p>
+<p>安装 openvpn</p>
+<pre><code class="language-shell">sudo apt-get install openvpn
+</code></pre>
+<p>安装一个 TUN 设备:</p>
+<pre><code class="language-shell">ubuntu@VM-30-130-ubuntu:~$ sudo openvpn --mktun --dev tun0
+Mon Apr 29 22:23:31 2019 TUN/TAP device tun0 opened
+Mon Apr 29 22:23:31 2019 Persist state set to: ON
+</code></pre>
+<p>安装一个 TAP 设备:</p>
+<pre><code class="language-shell">ubuntu@VM-30-130-ubuntu:~$ sudo openvpn --mktun --dev tap0
+Mon Apr 29 22:24:36 2019 TUN/TAP device tap0 opened
+Mon Apr 29 22:24:36 2019 Persist state set to: ON
+</code></pre>
+<p>执行 <code>ifconfig -a</code> 查看网卡,只给出增量的部分:</p>
+<pre><code class="language-shell">tap0      Link encap:Ethernet  HWaddr 7a:a2:a8:f1:6b:df
+          BROADCAST MULTICAST  MTU:1500  Metric:1
+          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:100
+          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
+
+tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
+          inet addr:10.154.30.131  P-t-P:10.154.30.131  Mask:255.255.255.255
+          UP POINTOPOINT NOARP MULTICAST  MTU:1500  Metric:1
+          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:100
+          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
+</code></pre>
+<p>这样就解释了文章一开始为什么会有 tun0 这样的网卡了。这里读者可能会有疑惑,使用 ifconfig 不是也可以创建 tap 和 tun 网卡吗?当然啦,openvpn 是一个 vpn 工具,只能创建名为 tunX/tapX 的网卡,其遵守着一定的规范,ifconfig 可以随意创建,但没人认那些随意创建的网卡。</p>
+<h2>6 干扰因素三:多网卡</h2>
+<p><img src="http://kirito.iocoder.cn/image-20190429223515625.png" alt="image-20190429223515625"></p>
+<p>这个没有太多好说的,有多张真实的网卡,从普哥那儿搞到如上的 IP 信息。</p>
+<h2>7 MAC 下的差异</h2>
+<p>虽然 ifconfig 等指令是 <code>*nux</code> 通用的,但是其展示信息,网卡相关的属性和命名都有较大的差异。例如这是我 MAC 下执行 <code>ifconfig -a</code> 的返回:</p>
+<pre><code class="language-shell">xujingfengdeMacBook-Pro:dubbo-in-action xujingfeng$ ifconfig -a
+lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; mtu 16384
+	options=1203&lt;RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP&gt;
+	inet 127.0.0.1 netmask 0xff000000
+	inet6 ::1 prefixlen 128
+	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
+	nd6 options=201&lt;PERFORMNUD,DAD&gt;
+gif0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1280
+stf0: flags=0&lt;&gt; mtu 1280
+XHC0: flags=0&lt;&gt; mtu 0
+XHC20: flags=0&lt;&gt; mtu 0
+en0: flags=8863&lt;UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+	ether 88:e9:fe:88:a0:76
+	inet6 fe80::1cab:f689:60d1:bacb%en0 prefixlen 64 secured scopeid 0x6
+	inet 30.130.11.242 netmask 0xffffff80 broadcast 30.130.11.255
+	nd6 options=201&lt;PERFORMNUD,DAD&gt;
+	media: autoselect
+	status: active
+p2p0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 2304
+	ether 0a:e9:fe:88:a0:76
+	media: autoselect
+	status: inactive
+awdl0: flags=8943&lt;UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST&gt; mtu 1484
+	ether 66:d2:8c:8c:dd:85
+	inet6 fe80::64d2:8cff:fe8c:dd85%awdl0 prefixlen 64 scopeid 0x8
+	nd6 options=201&lt;PERFORMNUD,DAD&gt;
+	media: autoselect
+	status: active
+en1: flags=8963&lt;UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST&gt; mtu 1500
+	options=60&lt;TSO4,TSO6&gt;
+	ether aa:00:d0:13:0e:01
+	media: autoselect &lt;full-duplex&gt;
+	status: inactive
+en2: flags=8963&lt;UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST&gt; mtu 1500
+	options=60&lt;TSO4,TSO6&gt;
+	ether aa:00:d0:13:0e:00
+	media: autoselect &lt;full-duplex&gt;
+	status: inactive
+bridge0: flags=8863&lt;UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
+	options=63&lt;RXCSUM,TXCSUM,TSO4,TSO6&gt;
+	ether aa:00:d0:13:0e:01
+	Configuration:
+		id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
+		maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
+		root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
+		ipfilter disabled flags 0x2
+	member: en1 flags=3&lt;LEARNING,DISCOVER&gt;
+	        ifmaxaddr 0 port 9 priority 0 path cost 0
+	member: en2 flags=3&lt;LEARNING,DISCOVER&gt;
+	        ifmaxaddr 0 port 10 priority 0 path cost 0
+	nd6 options=201&lt;PERFORMNUD,DAD&gt;
+	media: &lt;unknown type&gt;
+	status: inactive
+utun0: flags=8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 2000
+	inet6 fe80::3fe0:3e8b:384:9968%utun0 prefixlen 64 scopeid 0xc
+	nd6 options=201&lt;PERFORMNUD,DAD&gt;
+utun1: flags=8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1380
+	inet6 fe80::7894:3abc:5abd:457d%utun1 prefixlen 64 scopeid 0xd
+	nd6 options=201&lt;PERFORMNUD,DAD&gt;  
+</code></pre>
+<p>内容很多,我挑几点差异简述下:</p>
+<ul>
+<li>
+<p>内容展示形式不一样,没有 Linux 下的接收、发送数据字节数等统计信息</p>
+</li>
+<li>
+<p>真实网卡的命名不一样:eth0 -&gt; en0</p>
+</li>
+<li>
+<p>虚拟网卡的命名格式不一样:tun/tap -&gt; utun</p>
+</li>
+</ul>
+<p>对于这些常见网卡命名的解读,我摘抄一部分来自 stackoverflow 的回答:</p>
+<blockquote>
+<p>In arbitrary order of my familarity / widespread relevance:</p>
+<p><code>lo0</code> is loopback.</p>
+<p><code>en0</code> at one point &quot;ethernet&quot;, now is WiFi (and I have no idea what extra <code>en1</code> or <code>en2</code> are used for).</p>
+<p><code>fw0</code> is the FireWire network interface.</p>
+<p><code>stf0</code> is an <a href="https://www.freebsd.org/cgi/man.cgi?gif(4)">IPv6 to IPv4 tunnel interface</a> to support <a href="http://en.wikipedia.org/wiki/6to4">the transition</a> from IPv4 to the IPv6 standard.</p>
+<p><code>gif0</code> is a more <a href="https://www.freebsd.org/cgi/man.cgi?gif(4)">generic tunneling interface</a> [46]-to-[46].</p>
+<p><code>awdl0</code> is <a href="https://stackoverflow.com/questions/19587701/what-is-awdl-apple-wireless-direct-link-and-how-does-it-work">Apple Wireless Direct Link</a></p>
+<p><code>p2p0</code> is related to AWDL features. Either as an old version, or virtual interface with different semantics than <code>awdl</code>.</p>
+<p>the &quot;Network&quot; panel in System Preferences to see what network devices &quot;exist&quot; or &quot;can exist&quot; with current configuration.</p>
+<p>many VPNs will add additional devices, often &quot;utun#&quot; or &quot;utap#&quot; following <a href="https://en.wikipedia.org/wiki/TUN/TAP">TUN/TAP (L3/L2)</a>virtual networking devices.</p>
+<p>use <code>netstat -nr</code> to see how traffic is currently routed via network devices according to destination.</p>
+<p>interface naming conventions started in BSD were retained in OS X / macOS, and now there also additions.</p>
+</blockquote>
+<h2>8 Dubbo 改进建议</h2>
+<p>我们进行了以上探索,算是对网卡有一点了解了。回过头来看看 Dubbo 获取网卡的逻辑,是否可以做出改进呢?</p>
+<p><strong>Dubbo Action 1:</strong></p>
+<p>保持 Ipv4 和 Ipv6 的一致性校验。为 Ipv4 增加连通性校验;为 Ipv6 增加 LoopBack 和 ANYHOST 等校验。</p>
+<p><strong>Dubbo Action 2:</strong></p>
+<pre><code class="language-java">NetworkInterface network = interfaces.nextElement();
+<span class="hljs-keyword">if</span> (network.isLoopback() || network.isVirtual() || !network.isUp()) {
+    <span class="hljs-keyword">continue</span>;
+}
+</code></pre>
+<p>JDK 提供了以上的 API,我们可以利用起来,过滤一部分一定不正确的网卡。</p>
+<p><strong>Dubbo Action 3:</strong></p>
+<p>我们本文花了较多的篇幅介绍了 docker 和 TUN/TAP 两种场景导致的虚拟网卡的问题,算是较为常见的一个影响因素,虽然他们的命名具有固定性,如 docker0、tunX、tapX,但我觉得通过网卡名称的判断方式去过滤注册 IP 有一些 hack,所以不建议 dubbo contributor 提出相应的 pr 去增加这些 hack 判断,尽管可能会对判断有所帮助。</p>
+<p>对于真实多网卡、内外网 IP 共存的场景,不能仅仅是框架侧在做努力,用户也需要做一些事,就像爱情一样,我可以主动一点,但你也得反馈,才能发展出故事。</p>
+<p><strong>Dubbo User Action 1:</strong></p>
+<p>可以配置 <code>/etc/hosts</code> 文件,将 hostname 对应的 IP 显式配置进去。</p>
+<p><strong>Dubbo User Action 2:</strong></p>
+<p>可以使用启动参数去显式指定注册的 IP:</p>
+<pre><code class="language-java">-DDUBBO_IP_TO_REGISTRY=<span class="hljs-number">1.2</span>.3.4
+</code></pre>
+<p>也可以指定 Dubbo 服务绑定在哪块网卡上:</p>
+<pre><code class="language-java">-DDUBBO_IP_TO_BIND=<span class="hljs-number">1.2</span>.3.4
+</code></pre>
+<h2>9 参考文章</h2>
+<p><a href="https://www.jianshu.com/p/09f9375b7fa7">TUN/TAP 设备浅析</a></p>
+<p><a href="https://stackoverflow.com/questions/29958143/what-are-en0-en1-p2p-and-so-on-that-are-displayed-after-executing-ifconfig">what-are-en0-en1-p2p-and-so-on-that-are-displayed-after-executing-ifconfig</a></p>
+</section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3></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/dubbo-network-interfaces.json b/zh-cn/blog/dubbo-network-interfaces.json
new file mode 100644
index 0000000..92380d9
--- /dev/null
+++ b/zh-cn/blog/dubbo-network-interfaces.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-network-interfaces.md",
+  "__html": "<h1>研究 Dubbo 网卡地址注册时的一点思考</h1>\n<h2>1 如何选择合适的网卡地址</h2>\n<p>可能相当一部分人还不知道我这篇文章到底要讲什么,我说个场景,大家应该就明晰了。在分布式服务调用过程中,以 Dubbo 为例,服务提供者往往需要将自身的 IP 地址上报给注册中心,供消费者去发现。在大多数情况下 Dubbo 都可以正常工作,但如果你留意过 Dubbo 的 github issue,其实有不少人反馈:Dubbo Provider 注册了错误的 IP。如果你能立刻联想到:多网卡、内外网地址共存、VPN、虚拟网卡等关键词,那我建议你一定要继续将本文看下去,因为我也想到了这些,它们都是本文所要探讨的东西!那么“如何选择合适的网卡地址”呢,Dubbo 现有的逻辑到底算不算完备?我们不急着回答它,而是带着这些问题一起进行研究,相信到文末,其中答案,各位看官自有
 评说。</p>\n<h2>2 Dubbo 是怎么做的</h2>\n<p>Dubbo 获取网卡地址的逻辑在各个版本中也是千回百转,走过弯路,也做过优化,我们用最新的 2.7 [...]
+  "link": "/zh-cn/blog/dubbo-network-interfaces.html",
+  "meta": {
+    "title": "研究 Dubbo 网卡地址注册时的一点思考",
+    "keywords": "网卡地址注册",
+    "description": "研究 Dubbo 网卡地址注册时的一点思考"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-new-async.json b/zh-cn/blog/dubbo-new-async.json
new file mode 100644
index 0000000..c5619ea
--- /dev/null
+++ b/zh-cn/blog/dubbo-new-async.json
@@ -0,0 +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<p>从3.0.0版本开始,Dubbo框架提供了对Reactive编程范式的支持,除了编程接口之外,在跨进程的RPC通信中引入了Reactive的语义。如果你所在的环境需要使用Reactive编程范式,或者你的RPC调用需要支持流式传输,Reactive应该会给你带来帮助,具体请参考发布在阿里巴巴中间件公众号上的<a href=\"\">响�
 �式编程支持</a>相关文章。</p>\n<blockquote>\n<p>注意,你可能并不是总需要Reactiv [...]
+  "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-protocol.json b/zh-cn/blog/dubbo-protocol.json
new file mode 100644
index 0000000..157a0a4
--- /dev/null
+++ b/zh-cn/blog/dubbo-protocol.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-protocol.md",
+  "__html": "<h2>协议的概念</h2>\n<p>协议是两个网络实体进行通信的基础,数据在网络上从一个实体传输到另一个实体,以字节流的形式传递到对端。在这个字节流的世界里,如果没有协议,就无法将这个一维的字节流重塑成为二维或者多维的数据结构以及领域对象。</p>\n<h3>协议是什么</h3>\n<p>协议是双方确定的交流语义,比如:我们设计一个字符串传输的协议,它允许客户端发送一个字符串,服务端接收到对应的字符\t串。这个协议很简单,首先发送一个4字节的消息总长度,然后再发送1字节的字符集charset长度,接下来就是消息的payload,字符集名称和字符串正文。</p>\n<p>发送一个<code>iso-8859-1</code>的字符串<code>abc</code>到对端。经过协议编码,内容是:<code>18 = 4 + 1 + 10 + 3|10|iso-8859-1|abc</code>,当这些字节流发往服务端后,当服务端收到字节流后,首先
 读取4个字节,将其转换为int,在这个例子中是18,接下来继续读14个字节,将首个字节得到字符集名称长 [...]
+  "link": "/zh-cn/blog/dubbo-protocol.html",
+  "meta": {
+    "title": "DUBBO协议详解",
+    "keywords": "Dubbo, Protocol, RPC",
+    "description": "本文介绍了dubbo协议的设计"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-stub-mock.json b/zh-cn/blog/dubbo-stub-mock.json
new file mode 100644
index 0000000..573ea7b
--- /dev/null
+++ b/zh-cn/blog/dubbo-stub-mock.json
@@ -0,0 +1,6 @@
+{
+  "filename": "dubbo-stub-mock.md",
+  "__html": "<h1>本地存根和本地伪装</h1>\n<h2>基本概念</h2>\n<p>典型的 RPC 调用客户端是依赖并且只依赖接口编程来进行远程调用的。在真正发起远程调用之前,用户往往需要做一些预处理的工作,比如提前校验参数。在拿到返回调用结果之后,用户可能需要缓存结果,或者是在调用失败的时候构造容错数据,而不是简单的抛出异常。</p>\n<p>这个时候,用户可以编写出类似以下的代码来处理上面提出的这些场景:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">try</span> {\n    preProcess();\n    <span class=\"hljs-keyword\">return</span> service.invoke(...);\n} <span class=\"hljs-keyword\">catch</span> (Throwable e) {\n    <span class=\"hljs-keyword\">return</spa [...]
+  "link": "/zh-cn/blog/dubbo-stub-mock.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubboAsync_client.json b/zh-cn/blog/dubboAsync_client.json
new file mode 100644
index 0000000..d4159f3
--- /dev/null
+++ b/zh-cn/blog/dubboAsync_client.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubboAsync_client.md",
+  "__html": "<h1>Dubbo客户端异步接口的实现背景和实践</h1>\n<h2>铺垫</h2>\n<p><img src=\"../../img/blog/dubboasyn_client/1.png\" alt=\"image | left\"></p>\n<p>先简单介绍下一次完整的Dubbo调用所经历的线程阶段。几个信息这里罗列下</p>\n<ol>\n<li>\n<p>Biz~代表业务线程,即便是业务逻辑处理所处的线程,Biz~线程池可能是业务自己创建维护,大多数的可能是系统框架自身管理的(比如web型的业务系统跑在Tomcat容器下,Biz~线程就是Tomcat维护);IO~代表网络数据处理线程,是IO框架(比如Netty,Grizzly)创建维护,Dubbo Remoting所默认Netty实现是NioEventloopLoopGroup;另外按照Channel与IO线程的绑定关系,也可以直接把IO~看成一个可接受事件消息的Channel。像Biz和IO这样的异步处理阶段在JDK8中有个很精确地抽象描述,叫CompletionStage。</ [...]
+  "link": "/zh-cn/blog/dubboAsync_client.html",
+  "meta": {
+    "title": "Dubbo客户端异步接口的实现背景和实践",
+    "keywords": "Dubbo, 异步, Reactive",
+    "description": "Dubbo客户端异步接口的实现背景和实践"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubboAsync_server.json b/zh-cn/blog/dubboAsync_server.json
new file mode 100644
index 0000000..989ea0c
--- /dev/null
+++ b/zh-cn/blog/dubboAsync_server.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubboAsync_server.md",
+  "__html": "<h1>Dubbo服务端异步接口的实现背景和实践</h1>\n<h2>铺垫</h2>\n<p>建议先对Dubbo的处理过程中涉及的线程阶段先做个了解,具体可参考<a href=\"http://dubbo.apache.org/zh-cn/blog/dubboAsync_client.html\">Dubbo客户端异步接口的实现背景和使用场景</a>。</p>\n<h2>实现背景</h2>\n<p>有必要比较详细点的介绍下服务端的线程策略来加深用户在选择服务端异步的判断依据,同时有必要引出协程这一在服务端异步中常常会用到的“秘密武器”。</p>\n<h3>服务端的线程策略</h3>\n<p>Dubbo是支持多种NIO框架来做Remoting的协议实现,无论是Netty,Mina或者Grizzly,实现都大同小异,都是基于事件驱动的方式来做网络通道建立,数据流读取的,其中Grizzly对于线程策略介绍的为例,通常支持以下四种。Dubbo作为一个RPC框架,默认选择的是第一种策略,原因在于业务服务是CPU密集型还是IO阻�
 ��性,是无法断定的,第一种策 [...]
+  "link": "/zh-cn/blog/dubboAsync_server.html",
+  "meta": {
+    "title": "Dubbo客户端异步接口的实现背景和实践",
+    "keywords": "Dubbo, 异步, Reactive",
+    "description": "Dubbo服务端异步接口的实现背景和实践"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/first-dubbo-filter.json b/zh-cn/blog/first-dubbo-filter.json
new file mode 100644
index 0000000..529a40b
--- /dev/null
+++ b/zh-cn/blog/first-dubbo-filter.json
@@ -0,0 +1,6 @@
+{
+  "filename": "first-dubbo-filter.md",
+  "__html": "<h1>第一个Dubbo Filter</h1>\n<h3>概述</h3>\n<p>在Dubbo的整体设计中,Filter是一个很重要的概念,包括Dubbo本身的大多数功能,都是基于此扩展点实现的,在每次的调用过程中,Filter的拦截都会被执行。</p>\n<h4>Dubbo Filter的加载机制</h4>\n<p>Dubbo中已经实现的Filter大概有二十几个,它们的入口都是ProtocolFilterWrapper,ProtocolFilterWrapper对Protocol做了Wrapper,会在加载扩展的时候被加载进来,下面我们来看下然后我们看一下这个Filter链是如何构造的。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">//ProtocolFilterWrapper.java</span>\n<span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs- [...]
+  "link": "/zh-cn/blog/first-dubbo-filter.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/gsoc-2018.html b/zh-cn/blog/gsoc-2018.html
new file mode 100644
index 0000000..9fa4218
--- /dev/null
+++ b/zh-cn/blog/gsoc-2018.html
@@ -0,0 +1,34 @@
+<!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, GSoC" />
+	<meta name="description" content="谷歌编程之夏会议上2018个项目被宣布,Dubbo位列其中。" />
+	<!-- 网页标签标题 -->
+	<title>谷歌编程之夏会议上2018个项目被宣布</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>谷歌编程之夏会议上2018个项目被宣布, Raghu Reddy 的项目&quot;Apache Dubbo 扩展串行协议支持&quot; 被<a href="https://summerofcode.withgoogle.com/projects/#4747840161579008">接受</a>! 祝贺他!</p>
+</section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3></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/gsoc-2018.json b/zh-cn/blog/gsoc-2018.json
new file mode 100644
index 0000000..ec34a25
--- /dev/null
+++ b/zh-cn/blog/gsoc-2018.json
@@ -0,0 +1,10 @@
+{
+  "filename": "gsoc-2018.md",
+  "__html": "<h2>谷歌编程之夏会议上2018个项目被宣布</h2>\n<p>谷歌编程之夏会议上2018个项目被宣布, Raghu Reddy 的项目&quot;Apache Dubbo 扩展串行协议支持&quot; 被<a href=\"https://summerofcode.withgoogle.com/projects/#4747840161579008\">接受</a>! 祝贺他!</p>\n",
+  "link": "/zh-cn/blog/gsoc-2018.html",
+  "meta": {
+    "title": "谷歌编程之夏会议上2018个项目被宣布",
+    "keywords": "Dubbo, GSoC",
+    "description": "谷歌编程之夏会议上2018个项目被宣布,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
new file mode 100644
index 0000000..fef6f53
--- /dev/null
+++ b/zh-cn/blog/how-to-involve-dubbo-community.json
@@ -0,0 +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成都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< [...]
+  "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-spi-2.json b/zh-cn/blog/introduction-to-dubbo-spi-2.json
new file mode 100644
index 0000000..b046e8f
--- /dev/null
+++ b/zh-cn/blog/introduction-to-dubbo-spi-2.json
@@ -0,0 +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>ExtensionLoader 是最核心的类,负责扩展点的加载和生命周期管理。我们就以这个类开始吧。\nExtensionLoader 的方法比较多,比较常用的方法有:</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(Stri [...]
+  "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
new file mode 100644
index 0000000..3d0da31
--- /dev/null
+++ b/zh-cn/blog/introduction-to-dubbo-spi.json
@@ -0,0 +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>作为框架的使用者,在添加一个新功能时,不需要去修改框架 [...]
+  "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/introduction-to-dubbo-url.json b/zh-cn/blog/introduction-to-dubbo-url.json
new file mode 100644
index 0000000..bb26bd9
--- /dev/null
+++ b/zh-cn/blog/introduction-to-dubbo-url.json
@@ -0,0 +1,10 @@
+{
+  "filename": "introduction-to-dubbo-url.md",
+  "__html": "<h1>Dubbo 中的 URL 统一模型</h1>\n<h3>定义</h3>\n<p>在不谈及 dubbo 时,我们大多数人对 URL 这个概念并不会感到陌生。统一资源定位器 (<a href=\"https://www.ietf.org/rfc/rfc1738.txt\">RFC1738</a>――Uniform Resource Locators (URL))应该是最广为人知的一个 RFC 规范,它的定义也非常简单</p>\n<blockquote>\n<p>因特网上的可用资源可以用简单字符串来表示,该文档就是描述了这种字符串的语法和语\n义。而这些字符串则被称为:“统一资源定位器”(URL)</p>\n</blockquote>\n<p><strong>一个标准的 URL 格式</strong>至多可以包含如下的几个部分</p>\n<pre><code>protocol://username:password@host:port/path?key=value&amp;key=value\n</code></pre>\n<p><stron [...]
+  "link": "/zh-cn/blog/introduction-to-dubbo-url.html",
+  "meta": {
+    "title": "Dubbo 中的 URL 统一模型",
+    "keywords": "Dubbo, URL",
+    "description": "URL 是 Dubbo 种一个重要的领域模型,了解它可以更加轻松的理解 Dubbo 的设计理念。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/meet-dubbo.json b/zh-cn/blog/meet-dubbo.json
new file mode 100644
index 0000000..bf904d7
--- /dev/null
+++ b/zh-cn/blog/meet-dubbo.json
@@ -0,0 +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,还有个阿里巴巴的R [...]
+  "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
new file mode 100644
index 0000000..8c085bf
--- /dev/null
+++ b/zh-cn/blog/optimization-branch-prediction.json
@@ -0,0 +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>那么 [...]
+  "link": "/zh-cn/blog/optimization-branch-prediction.html",
+  "meta": {
+    "title": "提前if判断帮助CPU分支预测"
+  }
+}
\ 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
new file mode 100644
index 0000000..91cada8
--- /dev/null
+++ b/zh-cn/blog/prepare-an-apache-release.json
@@ -0,0 +1,10 @@
+{
+  "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</ [...]
+  "link": "/zh-cn/blog/prepare-an-apache-release.html",
+  "meta": {
+    "title": "如何准备Apache Release",
+    "keywords": "Dubbo, Apache, Release",
+    "description": "本文介绍了Apache如何发布内容和流程"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/qcon-beijing-2018.json b/zh-cn/blog/qcon-beijing-2018.json
new file mode 100644
index 0000000..260c7bb
--- /dev/null
+++ b/zh-cn/blog/qcon-beijing-2018.json
@@ -0,0 +1,10 @@
+{
+  "filename": "qcon-beijing-2018.md",
+  "__html": "<h2>Dubbo路线图在QCon Beijing 2018上公布</h2>\n<p>罗毅在Qcon Beijing 2018上进行了Dubbo开源现状及未来规划的主题演讲。详细内容请查看<a href=\"https://github.com/dubbo/awesome-dubbo/raw/master/slides/qcon2018/dubbo-present-and-future.pdf\">幻灯片</a>。</p>\n",
+  "link": "/zh-cn/blog/qcon-beijing-2018.html",
+  "meta": {
+    "title": "Dubbo路线图在QCon Beijing 2018上公布",
+    "keywords": "Dubbo, roadmap, QCon Beijing",
+    "description": "本文将向你介绍在QCon Beijing 2018上公布Dubbo路线图。"
+  }
+}
\ 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
new file mode 100644
index 0000000..5273313
--- /dev/null
+++ b/zh-cn/blog/sentinel-introduction-for-dubbo.json
@@ -0,0 +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</h [...]
+  "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/service-and-version.json b/zh-cn/blog/service-and-version.json
new file mode 100644
index 0000000..aa6638c
--- /dev/null
+++ b/zh-cn/blog/service-and-version.json
@@ -0,0 +1,6 @@
+{
+  "filename": "service-and-version.md",
+  "__html": "<h1>Dubbo服务分组和版本聚合</h1>\n<p>我们在调用Dubbo服务的时候,一般只需要将Consumer端的<code>dubbo:reference</code>指定成服务端中<code>dubbo:service</code>暴露的服务,就可以找到服务端,完成调用,也就是说,Dubbo只需要服务接口信息就可以找到服务提供者。\n其实除了服务提供者以外,Dubbo也有服务分组和版本的概念,在客户端去寻找“匹配”的服务端的时候,需要服务接口,版本号,组别这三个信息都匹配,才算是一个有效的服务端:</p>\n<pre><code class=\"language-java\">   <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">boolean</span> <span class=\"hljs- [...]
+  "link": "/zh-cn/blog/service-and-version.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/service-test.json b/zh-cn/blog/service-test.json
new file mode 100644
index 0000000..dc3a599
--- /dev/null
+++ b/zh-cn/blog/service-test.json
@@ -0,0 +1,6 @@
+{
+  "filename": "service-test.md",
+  "__html": "<h1>Dubbo Admin服务测试功能</h1>\n<p>基于Dubbo2.7的元数据,Dubbo Admin实现了服务测试功能,可以通过泛化调用,在控制台上调用真实的服务提供者</p>\n<h2>使用方式</h2>\n<ul>\n<li>部署服务提供者: 可以在<a href=\"https://github.com/nzomkxia/dubbo-demo\">这里</a>下载demo,此工程基于spring boot,方便在IDE或者命令行启动,对于服务测试来说,只需要启动<code>dubbo-basic-provider</code>即可。</li>\n<li>服务查询: 完成服务端部署后,可以到Dubbo Admin的<code>服务测试</code>页面上查询对应的服务:\n<img src=\"../../img/blog/admin/testSearch.jpg\" alt=\"testSearch\"><br>\n这里的信息和元数据类似,包含方法名,参数类型和返回值信息,点击右边的标签就可以进入服务测试页面</li>\n< [...]
+  "link": "/zh-cn/blog/service-test.html",
+  "meta": {}
+}
\ 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
new file mode 100644
index 0000000..181862a
--- /dev/null
+++ b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
@@ -0,0 +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/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/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">自动装配</a> (比如: 注解驱动, 自动装配等).</li>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator\">Production-R [...]
+  "link": "/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html",
+  "meta": {
+    "title": "Spring Boot Dubbo应用启停源码分析",
+    "keywords": "Dubbo, Spring Boot, 源码分析",
+    "description": "本文分析 `dubbo-spring-boot-project` 中 Dubbo 启停源码的实现原理。"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/blog/test-verification.json b/zh-cn/blog/test-verification.json
new file mode 100644
index 0000000..225b52f
--- /dev/null
+++ b/zh-cn/blog/test-verification.json
@@ -0,0 +1,6 @@
+{
+  "filename": "test-verification.md",
+  "__html": "<h1>Dubbo测试验证</h1>\n<p>除了线上常规的使用场景以外,我们在日常使用中还需要一些特定的使用方式,比如对正在开发的功能进行验证测试,比如单独调用某台机器的服务,这篇文章就来介绍一下这些场景下的使用方式。</p>\n<h3>只订阅</h3>\n<p>为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。</p>\n<p>可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。<br>\n<img src=\"https://cdn.nlark.com/lark/0/2018/jpeg/6752/1535447102196-eabbff47-287d-4f85-8fea-05b4f4921d75.jpeg\" alt=\"subscribe-only.jpg\">\n禁用注册配置</p>\n<pre><code>&lt;dubbo:registry address=&quot;10.20.15 [...]
+  "link": "/zh-cn/blog/test-verification.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/tracing-with-skywalking.json b/zh-cn/blog/tracing-with-skywalking.json
new file mode 100644
index 0000000..38e000f
--- /dev/null
+++ b/zh-cn/blog/tracing-with-skywalking.json
@@ -0,0 +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 h [...]
+  "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
new file mode 100644
index 0000000..9c7dd35
--- /dev/null
+++ b/zh-cn/blog/use-zipkin-in-dubbo.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..e3bfd59
--- /dev/null
+++ b/zh-cn/docs/admin/README.json
@@ -0,0 +1,6 @@
+{
+  "filename": "README.md",
+  "__html": "<p>这篇文档详细讲述了 Dubbo Admin的结构,部署方式和功能介绍</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
new file mode 100644
index 0000000..bf2f17d
--- /dev/null
+++ b/zh-cn/docs/admin/SUMMARY.json
@@ -0,0 +1,6 @@
+{
+  "filename": "SUMMARY.md",
+  "__html": "<ul>\n<li><a href=\"introduction.md\">1 Dubbo Admin介绍</a>\n<ul>\n<li><a href=\"serviceSearch.md\">1.1 服务搜索和详情</a></li>\n<li><a href=\"serviceGovernance.md\">1.2 服务治理</a></li>\n<li><a href=\"serviceTest.md\">1.3 服务测试</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
new file mode 100644
index 0000000..a5b6c4f
--- /dev/null
+++ b/zh-cn/docs/admin/install/admin-console.json
@@ -0,0 +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/dubbo-admin.git /var/tmp/dubbo-admin\n<span class=\"hljs-built_in\">cd</span> /var/tmp/dubbo-admin\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-back [...]
+  "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
new file mode 100644
index 0000000..bd1bfe5
--- /dev/null
+++ b/zh-cn/docs/admin/install/consumer-demo.json
@@ -0,0 +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/dubbo.git\n<span class=\"hljs-built_in\">cd</span> dubbo\n运行 dubbo-demo-consumer中的org.apache.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修改其 [...]
+  "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
new file mode 100644
index 0000000..8b5b87a
--- /dev/null
+++ b/zh-cn/docs/admin/install/introduction.json
@@ -0,0 +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/ [...]
+  "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
new file mode 100644
index 0000000..aab9c6a
--- /dev/null
+++ b/zh-cn/docs/admin/install/provider-demo.json
@@ -0,0 +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/dubbo.git\n<span class=\"hljs-built_in\">cd</span> dubbo\n运行 dubbo-demo-provider中的org.apache.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:registry [...]
+  "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
new file mode 100644
index 0000000..a951220
--- /dev/null
+++ b/zh-cn/docs/admin/install/redis.json
@@ -0,0 +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> 即可使用。< [...]
+  "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
new file mode 100644
index 0000000..49905cd
--- /dev/null
+++ b/zh-cn/docs/admin/install/simple-monitor-center.json
@@ -0,0 +1,6 @@
+{
+  "filename": "simple-monitor-center.md",
+  "__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
new file mode 100644
index 0000000..4aba148
--- /dev/null
+++ b/zh-cn/docs/admin/install/simple-registry-center.json
@@ -0,0 +1,6 @@
+{
+  "filename": "simple-registry-center.md",
+  "__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/ops/dubbo-ops.json b/zh-cn/docs/admin/ops/dubbo-ops.json
new file mode 100644
index 0000000..d4d9ba9
--- /dev/null
+++ b/zh-cn/docs/admin/ops/dubbo-ops.json
@@ -0,0 +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/ [...]
+  "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
new file mode 100644
index 0000000..0f1c828
--- /dev/null
+++ b/zh-cn/docs/admin/ops/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__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/skywalking.json b/zh-cn/docs/admin/ops/skywalking.json
new file mode 100644
index 0000000..7cbba17
--- /dev/null
+++ b/zh-cn/docs/admin/ops/skywalking.json
@@ -0,0 +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 h [...]
+  "link": "/zh-cn/docs/admin/ops/skywalking.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/admin/serviceGovernance.json b/zh-cn/docs/admin/serviceGovernance.json
new file mode 100644
index 0000000..af2e648
--- /dev/null
+++ b/zh-cn/docs/admin/serviceGovernance.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serviceGovernance.md",
+  "__html": "<h1>服务治理和配置管理</h1>\n<h2>服务治理</h2>\n<p>服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的,主要有以下几个功能:</p>\n<h3>应用级别的服务治理</h3>\n<p>在Dubbo2.6及更早版本中,所有的服务治理规则都只针对服务粒度,如果要把某条规则作用到应用粒度上,需要为应用下的所有服务配合相同的规则,变更,删除的时候也需要对应的操作,这样的操作很不友好,因此Dubbo2.7版本中增加了应用粒度的服务治理操作,对于条件路由(包括黑白名单),动态配置(包括权重,负载均衡)都可以做应用级别的配置:<br>\n<img src=\"../../../img/blog/admin/conditionRoute.jpg\" alt=\"condition\"><br>\n上图是条件路由的配置,可以按照应用名,服务名两个维度来填写,也可以按照这两个维度来查询。</p>\n<h3>标签路由</h3>\n<p>标签路由是Dub
 bo2.7引入的新功能,配置以应用作为维度,给不同的服务器打上不同名字 [...]
+  "link": "/zh-cn/docs/admin/serviceGovernance.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/admin/serviceSearch.json b/zh-cn/docs/admin/serviceSearch.json
new file mode 100644
index 0000000..08c392f
--- /dev/null
+++ b/zh-cn/docs/admin/serviceSearch.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serviceSearch.md",
+  "__html": "<h1>服务查询和详情展示</h1>\n<p>服务查询是Dubbo OPS最基本的功能,目前支持服务,应用和IP三个维度的查询,并且服务和应用支持模糊查询和自动提示:\n<img src=\"sources/images/searchResult.png\" alt=\"searchResult\">\n其中详情页展示了服务提供者,消费者等信息,元数据信息需要在Dubbo2.7及之后的版本才会展示:<br>\n<img src=\"sources/images/detail.jpg\" alt=\"detail\"></p>\n",
+  "link": "/zh-cn/docs/admin/serviceSearch.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/admin/serviceTest.json b/zh-cn/docs/admin/serviceTest.json
new file mode 100644
index 0000000..621d2d5
--- /dev/null
+++ b/zh-cn/docs/admin/serviceTest.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serviceTest.md",
+  "__html": "<p>请参考这篇<a href=\"../../../blog/zh-cn/service-test.md\">博客</a></p>\n",
+  "link": "/zh-cn/docs/admin/serviceTest.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/dev/README.json b/zh-cn/docs/dev/README.json
new file mode 100644
index 0000000..ccb90ba
--- /dev/null
+++ b/zh-cn/docs/dev/README.json
@@ -0,0 +1,6 @@
+{
+  "filename": "README.md",
+  "__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/SUMMARY.json b/zh-cn/docs/dev/SUMMARY.json
new file mode 100644
index 0000000..3ea4caf
--- /dev/null
+++ b/zh-cn/docs/dev/SUMMARY.json
@@ -0,0 +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-li [...]
+  "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
new file mode 100644
index 0000000..891f1eb
--- /dev/null
+++ b/zh-cn/docs/dev/TCK.json
@@ -0,0 +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/referen [...]
+  "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
new file mode 100644
index 0000000..811d35b
--- /dev/null
+++ b/zh-cn/docs/dev/build.json
@@ -0,0 +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/dubbo.git dubbo\n</code></pre>\n<h2>分支</h2>\n<p>我们使用 master 作为主干版本的开发,使用分支作为维护版本。可以通过 <a href=\"https://github.com/apache/dubbo/tags\">https://github.com/apache/dubbo/tags</a> 来查看所有版本的标签。</p>\n<h2>构建</h2>\n<p>Dubbo 使用 <a href=\"http://maven.a [...]
+  "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
new file mode 100644
index 0000000..b444fc5
--- /dev/null
+++ b/zh-cn/docs/dev/checklist.json
@@ -0,0 +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 以用户的方式运行一下功能 [...]
+  "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
new file mode 100644
index 0000000..6ef3a87
--- /dev/null
+++ b/zh-cn/docs/dev/code-smell.json
@@ -0,0 +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/org.apache.dubbo.registry.RegistrySerevice?registry=dubbo&amp;export=ENCODE(d [...]
+  "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
new file mode 100644
index 0000000..32ad3f8
--- /dev/null
+++ b/zh-cn/docs/dev/coding.json
@@ -0,0 +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>尽量将直接原因写在最前 [...]
+  "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
new file mode 100644
index 0000000..3ed889e
--- /dev/null
+++ b/zh-cn/docs/dev/contract.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..c121597
--- /dev/null
+++ b/zh-cn/docs/dev/contribution.json
@@ -0,0 +1,6 @@
+{
+  "filename": "contribution.md",
+  "__html": "<h1>贡献</h1>\n<h2>流程</h2>\n<ul>\n<li>如果是扩展功能,直接新增工程,黑盒依赖 Dubbo 进行扩展。</li>\n<li>如果是改 BUG,或修改框架本身,可以从 Dubbo 的 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> [...]
+  "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
new file mode 100644
index 0000000..12a3952
--- /dev/null
+++ b/zh-cn/docs/dev/design.json
@@ -0,0 +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>各
 层说明</ [...]
+  "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
new file mode 100644
index 0000000..76e4aab
--- /dev/null
+++ b/zh-cn/docs/dev/implementation.json
@@ -0,0 +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=\" [...]
+  "link": "/zh-cn/docs/dev/implementation.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/dev/impls/config-center.html b/zh-cn/docs/dev/impls/config-center.html
new file mode 100644
index 0000000..a0dbe05
--- /dev/null
+++ b/zh-cn/docs/dev/impls/config-center.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="config-center" />
+	<meta name="description" content="config-center" />
+	<!-- 网页标签标题 -->
+	<title>config-center</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 [...]
+<h2>设计目的</h2>
+<p>配置中心的核心功能是作为Key-Value存储,Dubbo框架告知配置中心其关心的key,配置中心返回该key对应的value值。</p>
+<p>按照应用场景划分,配置中心在Dubbo框架中主要承担以下职责:</p>
+<ul>
+<li>作为外部化配置中心,即存储dubbo.properties配置文件,此时,key值通常为文件名如dubbo.properties,value则为配置文件内容。</li>
+<li>存储单个配置项,如各种开关项、常量值等。</li>
+<li>存储服务治理规则,此时key通常按照&quot;服务名+规则类型&quot;的格式来组织,而value则为具体的治理规则。</li>
+</ul>
+<p>为了进一步实现对key-value的分组管理,Dubbo的配置中心还加入了namespace、group的概念,这些概念在很多专业的第三方配置中心中都有体现,通常情况下,namespace用来隔离不同的租户,group用来对统一租户的key集合做分组。</p>
+<p>当前,Dubbo配置中心实现了对Zookeeper、Nacos、Etcd、Consul、Apollo的对接,接下来我们具体看一下Dubbo抽象的配置中心是怎么映射到具体的第三方实现中的。</p>
+<h2>扩展接口</h2>
+<ul>
+<li><code>org.apache.dubbo.configcenter.DynamicConfigurationFactory</code></li>
+<li><code>org.apache.dubbo.configcenter.DynamicConfiguration</code></li>
+</ul>
+<h2>已知扩展</h2>
+<ul>
+<li><code>org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory</code></li>
+<li><code>org.apache.dubbo.configcenter.support.zookeeper.NacosDynamicConfigurationFactory</code></li>
+<li><code>org.apache.dubbo.configcenter.support.zookeeper.EtcdDynamicConfigurationFactory</code></li>
+<li><code>org.apache.dubbo.configcenter.support.zookeeper.ConsulDynamicConfigurationFactory</code></li>
+<li><code>org.apache.dubbo.configcenter.support.zookeeper.ApolloDynamicConfigurationFactory</code></li>
+</ul>
+<h2>实现原理</h2>
+<h3>Zookeeper</h3>
+<p>zookeeper提供了一个树状的存储模型,其实现原理如下:</p>
+<p><img src="/img/configcenter_zk_model.jpg" alt="image-20190127225608553"></p>
+<p>namespace, group, key等分别对应不同层级的ZNode节点,而value则作为根ZNode节点的值存储。</p>
+<ol>
+<li>
+<p>外部化配置中心 dubbo.properties</p>
+<p><img src="/img/configcenter_zk_properties.jpg" alt="image-20190127225608553"></p>
+<p>上图展示了两个不同作用域的dubbo.properties文件在zookeeper中的存储结构:</p>
+<ul>
+<li>命名空间namespace都为:dubbo</li>
+<li>分组group:全局级别为dubbo,所有应用共享;应用级别为应用名demo-provider,只对改应用生效</li>
+<li>key:dubbo.properties</li>
+</ul>
+</li>
+<li>
+<p>单个配置项</p>
+<p><img src="/img/configcenter_zk_singleitem.jpg" alt="image-20190127225608553"></p>
+<p>设置优雅停机事件为15000:</p>
+<ul>
+<li>命名空间namespace:dubbo</li>
+<li>分组group:dubbo</li>
+<li>key:dubbo.service.shutdown.wait=15000</li>
+</ul>
+</li>
+<li>
+<p>服务治理规则</p>
+<p><img src="/img/configcenter_zk_rule.jpg" alt="image-20190127225608553"></p>
+<p>上图展示了一条应用级别的条件路由规则:</p>
+<ul>
+<li>命名空间namespace:dubbo</li>
+<li>分组group:dubbo</li>
+<li>key:governance-conditionrouter-consumer.condition-router,其中governance-conditionrouter-consumer为应用名,condition-router代表条件路由</li>
+</ul>
+<blockquote>
+<p>注意:</p>
+<p>Dubbo同时支持应用、服务两种粒度的服务治理规则,对于这两种粒度,其key取值规则如下:</p>
+<ul>
+<li>应用粒度 {应用名 + 规则后缀}。如: <code>demo-application.configurators</code>、<code>demo-application.tag-router</code>等</li>
+<li>服务粒度 {服务接口名:[服务版本]:[服务分组] + 规则后缀},其中服务版本、服务分组是可选的,如果它们有配置则在key中体现,没被配置则用&quot;:&quot;占位。如
+<code>org.apache.dubbo.demo.DemoService::.configurators</code>、<code>org.apache.dubbo.demo.DemoService:1.0.0:group1.configurators</code></li>
+</ul>
+</blockquote>
+</li>
+</ol>
+<h3>Etcd &amp; Consul</h3>
+<p>Etcd和Consul本质上也是一种类似zookeeper的树状存储结构,实现请参考zookeeper。</p>
+<h3>Nacos</h3>
+<p>Nacos作为一个专业的第三方配置中心,拥有专门为配置中心设计的存储结构,包括内置的namespace、group、dataid等概念。并且这几个概念基本上与Dubbo框架抽象的配置中心是一一对应的。</p>
+<p>与Zookeeper实现的对应关系如下:</p>
+<p><img src="/img/configcenter_nacos_model.jpg" alt="image-20190127225608553"></p>
+<p>参考上文关于zookeeper实现中描述的示例,这里的dataid可能为:</p>
+<ul>
+<li>外部化配置中心:dubbo.properties</li>
+<li>单个配置项:dubbo.service.shutdown.wait</li>
+<li>服务治理规则:org.apache.dubbo.demo.DemoService:1.0.0:group1.configurators</li>
+</ul>
+<h3>Apollo</h3>
+<p>Apollo与Nacos类似,请参考动态配置中心使用文档中关于Apollo部分的描述。</p>
+</div></section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3></h3><p></p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">基金会</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">证书</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">事件</a></dd><dd><a  [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<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/dev/impls/config-center.json b/zh-cn/docs/dev/impls/config-center.json
new file mode 100644
index 0000000..e62dd62
--- /dev/null
+++ b/zh-cn/docs/dev/impls/config-center.json
@@ -0,0 +1,6 @@
+{
+  "filename": "config-center.md",
+  "__html": "<h1>Dubbo配置中心</h1>\n<h2>设计目的</h2>\n<p>配置中心的核心功能是作为Key-Value存储,Dubbo框架告知配置中心其关心的key,配置中心返回该key对应的value值。</p>\n<p>按照应用场景划分,配置中心在Dubbo框架中主要承担以下职责:</p>\n<ul>\n<li>作为外部化配置中心,即存储dubbo.properties配置文件,此时,key值通常为文件名如dubbo.properties,value则为配置文件内容。</li>\n<li>存储单个配置项,如各种开关项、常量值等。</li>\n<li>存储服务治理规则,此时key通常按照&quot;服务名+规则类型&quot;的格式来组织,而value则为具体的治理规则。</li>\n</ul>\n<p>为了进一步实现对key-value的分组管理,Dubbo的配置中心还加入了namespace、group的概念,这些概念在很多专业的第三方配置中心中都有体现,通常情况下,namespace用来隔离不同的租户,group用来对统一租户的key集 [...]
+  "link": "/zh-cn/docs/dev/impls/config-center.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
new file mode 100644
index 0000000..760c91f
--- /dev/null
+++ b/zh-cn/docs/dev/impls/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__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/introduction.json b/zh-cn/docs/dev/introduction.json
new file mode 100644
index 0000000..1fae9b4
--- /dev/null
+++ b/zh-cn/docs/dev/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__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
new file mode 100644
index 0000000..5e34f43
--- /dev/null
+++ b/zh-cn/docs/dev/principals/code-detail.json
@@ -0,0 +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>这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常。这也是一个编写健壮程序的开发人员,在写每一行代码都应在潜意识中防止的异常。基�
 �上要能确保每一次写完的代码,在不测试的情况下,都不会出现这两个异常才算合 [...]
+  "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
new file mode 100644
index 0000000..4b78e0d
--- /dev/null
+++ b/zh-cn/docs/dev/principals/configuration.json
@@ -0,0 +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 现在的设计是完全无侵入,也就是使用者只依赖于配置契约。经过多个版本的发展,为了满足各种需求场景,配置越来越多。为了保持兼容,配置只增不减,里面潜伏着各种风格,约定,规则。新版本也将配置做了一次调整,将想到的一些记在这,备忘。</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 配置会比较方便,因为都 [...]
+  "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
new file mode 100644
index 0000000..12c1326
--- /dev/null
+++ b/zh-cn/docs/dev/principals/dummy.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..34151a3
--- /dev/null
+++ b/zh-cn/docs/dev/principals/expansibility.json
@@ -0,0 +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 可能和业务方的 Class [...]
+  "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
new file mode 100644
index 0000000..d1b5ea6
--- /dev/null
+++ b/zh-cn/docs/dev/principals/extension.json
@@ -0,0 +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>这里面虽然有部分扩展接口,但并 [...]
+  "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
new file mode 100644
index 0000000..2b973f6
--- /dev/null
+++ b/zh-cn/docs/dev/principals/general-knowledge.json
@@ -0,0 +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 框架有一个 S [...]
+  "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
new file mode 100644
index 0000000..05a6a40
--- /dev/null
+++ b/zh-cn/docs/dev/principals/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__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
new file mode 100644
index 0000000..4b6c1f1
--- /dev/null
+++ b/zh-cn/docs/dev/principals/robustness.json
@@ -0,0 +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 表示可 [...]
+  "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
new file mode 100644
index 0000000..92bf9a8
--- /dev/null
+++ b/zh-cn/docs/dev/release.json
@@ -0,0 +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, [...]
+  "link": "/zh-cn/docs/dev/release.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/developers/committer-guide/apache-dubbo-page_dev.json b/zh-cn/docs/developers/committer-guide/apache-dubbo-page_dev.json
new file mode 100644
index 0000000..5d712d1
--- /dev/null
+++ b/zh-cn/docs/developers/committer-guide/apache-dubbo-page_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "apache-dubbo-page_dev.md",
+  "__html": "<h1>Apache官方Dubbo主页的维护</h1>\n<p>Apache有一个官方的网站,用来维护所有的孵化项目的信息。每一个孵化项目在这个网站下都有一个信息页。\nDubbo的信息页地址是<a href=\"https://incubator.apache.org/projects/dubbo.html\">https://incubator.apache.org/projects/dubbo.html</a>。</p>\n<p>当项目发生比较大的变化,比如新的committer的加入,新的PMC的当选,或是新版本的Release等,都需要将这些更新信息维护到这个页面。\n这个官方网站的项目地址是<a href=\"https://svn.apache.org/repos/asf/incubator/public/trunk\">https://svn.apache.org/repos/asf/incubator/public/trunk</a>。</p>\n<p>维护这个页面的方法如下:</p>\n<p>1.安装SVN。若是Mac OS [...]
+  "link": "/zh-cn/docs/developers/committer-guide/apache-dubbo-page_dev.html",
+  "meta": {}
+}
\ 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 0000000..86db4fd
--- /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<p>如果您正在处理一个问题,请记得<strong>给这个问题标记一个或者多个您认为有意义的标签</strong>。有了标签,其他开发人员就会很轻松地识别出问题,以便对其进行分类并跟踪进度。</p>\n<p>对于需要编码和发版修复的issues和pull requests,需要您<strong>将其标记为<a href=\"https://github.com/apache/incubator*dubbo/milestones\">milestone</a></strong>。</p>\n<p>一些常用的标签:</p>\n<ul>\n<li>请求帮助\n<ul>\n<li>help wanted</li>\n<li>good first issue</li>\n</ul>\n</li>\n<li>优先级\n<ul>\n<li>priority/blocker</li>\n<li>priority/high</li>\n<li>priority/low</li>\n<li>priority/normal</li> [...]
+  "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/new-committer-guide_dev.json b/zh-cn/docs/developers/committer-guide/new-committer-guide_dev.json
new file mode 100644
index 0000000..bfd6ccb
--- /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/ [...]
+  "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_dev.json b/zh-cn/docs/developers/committer-guide/website-guide_dev.json
new file mode 100644
index 0000000..dab0000
--- /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<ol>\n<li>Apache Dubbo 的网站仓库是 <a href=\"https://github.com/apache/dubbo-website\">https://github.com/apache/dubbo-website</a></li>\n<li>网站构建完毕后,它会被自动发布到 <a href=\"http://dubbo.apache.org\">dubbo.apache.org</a>,您也可以通过 <a href=\"https://selfserve.apache.org\">https://selfserve.apache.org</a> 手动触发(需要使用 Apache 账号登陆)</li>\n</ol>\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/become-a-committer_dev.json b/zh-cn/docs/developers/contributor-guide/become-a-committer_dev.json
new file mode 100644
index 0000000..7ca76c8
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/become-a-committer_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "become-a-committer_dev.md",
+  "__html": "<h1>如何成为Dubbo committer</h1>\n<p>本文描述如何成为Dubbo committer</p>\n",
+  "link": "/zh-cn/docs/developers/contributor-guide/become-a-committer_dev.html",
+  "meta": {}
+}
\ 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 0000000..c658413
--- /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<p>以下情况,需要您签署Apache ICLA:</p>\n<ul>\n<li>在Dubbo被捐赠给Apache之前,您已经为Dubbo作出了很多贡献,并且您以前没有签署过Alibaba-CLA。</li>\n<li>您已经为Dubbo作出了很多贡献,并且您被邀请成为Dubbo提交者,且之前没有签署过Alibaba-CLA或者Apache ICLA。</li>\n</ul>\n<h3>步骤</h3>\n<ul>\n<li>下载这篇<a href=\"https://www.apache.org/licenses/icla.pdf\">pdf文档</a></li>\n<li>编辑该文档,在必要的空格处填上适当的内容</li>\n<li>打印</li>\n<li>在打印好的文件上签字</li>\n<li>扫描</li>\n<li>发送一封邮件到secretary@apache.org,并抄送给private@dubbo.apache.org:\n<ul>\n<li>邮件标题为“ICLA submission”< [...]
+  "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_dev.json b/zh-cn/docs/developers/contributor-guide/dubbo-extension-guide_dev.json
new file mode 100644
index 0000000..d6864b9
--- /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<p>Dubbo使用微内核+插件的设计模式。内核只负责组装插件,Dubbo的功能都是由扩展点(插件)实现,这就意味着Dubbo的所有功能都可以被用户定制的扩展所替代。</p>\n<h3>Dubbo生态系统</h3>\n<p>我们建议您将扩展加入到Dubbo生态系统。使用这种模式,可以使Dubbo的核心仓库更干净,并且可以减少维护工作。更少的代码也可以提高核心仓库的构建速度。</p>\n<h3>依赖</h3>\n<p>要实现您自己的Dubbo扩展,通常只需依赖API 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>&g [...]
+  "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_dev.json b/zh-cn/docs/developers/contributor-guide/mailing-list-subscription-guide_dev.json
new file mode 100644
index 0000000..7964d85
--- /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<p>Apache incubator的Dubbo开发者邮件列表(dev@dubbo.apache.org)已经建立,请随时订阅并参考[^1]获取更多细节。</p>\n<p>你也可以直接查看<a href=\"https://lists.apache.org/list.html?dev@dubbo.apache.org\">历史邮件</a></p>\n<p>下面是一个关于Dubbo邮件列表订阅的简短指南:</p>\n<ol>\n<li>发一封邮件到dev-subscribe@dubbo.apache.org,其内容和标题均可为空。随后,您会收到一封邮件,其内容如下:</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 [...]
+  "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_dev.json b/zh-cn/docs/developers/contributor-guide/new-contributor-guide_dev.json
new file mode 100644
index 0000000..e2a084b
--- /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<p>这篇向导旨在给正在准备向Dubbo提交贡献的新手提供指导。</p>\n<h3>邮件列表描述</h3>\n<p>邮件列表是Dubbo官方推荐的讨论方式,所有与Dubbo相关的内容都可以在这里讨论,请点击 <a href=\"https://github.com/apache/dubbo/issues/1393\">issue</a> 了解更多关于邮件列表订阅的内容</p>\n<ul>\n<li><a href=\"mailto:dev@dubbo.apache.org\">dev@dubbo.apache.org</a>:开发邮件列表,您在使用或者开发Dubbo的过程中遇到的任何问题,都可以在这里进行提问。</li>\n<li><a href=\"mailto:commits@dubbo.apache.org\">commits@dubbo.apache.org</a>:所有的提交内容都会推送到这个邮件列表,如果您对Dubbo的进展感兴趣,可以订阅这个邮件列表。</li>\n<li><a href=\"ma [...]
+  "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/reporting-security-issues_dev.json b/zh-cn/docs/developers/contributor-guide/reporting-security-issues_dev.json
new file mode 100644
index 0000000..32253dc
--- /dev/null
+++ b/zh-cn/docs/developers/contributor-guide/reporting-security-issues_dev.json
@@ -0,0 +1,6 @@
+{
+  "filename": "reporting-security-issues_dev.md",
+  "__html": "<h1>Reporting Security Issues</h1>\n<p>The Apache Software Foundation takes a rigorous standpoint in annihilating the security issues in its software projects. Apache Dubbo is highly sensitive and forthcoming to issues pertaining to its features and functionality.</p>\n<h2>REPORTING VULNERABILITY</h2>\n<p>If you have apprehensions regarding Dubbo's security or you discover vulnerability or potential threat, don’t hesitate to get in touch with the Apache Dubbo Security Team b [...]
+  "link": "/zh-cn/docs/developers/contributor-guide/reporting-security-issues_dev.html",
+  "meta": {}
+}
\ 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 0000000..df5d441
--- /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<p>在您阅读这篇指南之前,请确保您已经向PMC确认了实际需要的SGA。</p>\n<p>如果您向Apache Dubbo 捐赠了大量的代码或文档,则需要在合并代码或者文档之前签署<a href=\"https://www.apache.org/licenses/#grants\">软件授权书</a>。</p>\n<h3>操作步骤</h3>\n<ol>\n<li>\n<p>下载这篇<a href=\"https://www.apache.org/licenses/software-grant-template.pdf\">pdf文档</a></p>\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</li>\n<li>\n<p>将扫描好的文档以邮件的方式发送给secretary@apache.org,并抄送给pri [...]
+  "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_dev.json b/zh-cn/docs/developers/contributor-guide/test-coverage-guide_dev.json
new file mode 100644
index 0000000..4df697d
--- /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- [...]
+  "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
new file mode 100644
index 0000000..2ce306d
--- /dev/null
+++ b/zh-cn/docs/developers/developers_dev.json
@@ -0,0 +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>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>Apa [...]
+  "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
new file mode 100644
index 0000000..b43fdd7
--- /dev/null
+++ b/zh-cn/docs/developers/guide_dev.json
@@ -0,0 +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/dubbo/wiki/Mailing-list-subscription-guide\" [...]
+  "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_dev.json b/zh-cn/docs/developers/user-guide/faq_dev.json
new file mode 100644
index 0000000..b06c3a9
--- /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<h3>dubbo-admin在哪里?</h3>\n<p>从Dubbo 2.6.1版本开始,dubbo-admin已经从核心库迁移到https://github.com/apache/dubbo-admin</p>\n<h3>我应该选择哪个版本?</h3>\n<p>目前,dubbo保持着3个版本的并行推进:</p>\n<ul>\n<li>2.7.x (master) :要求java 1.8,重要功能分支。</li>\n<li>2.6.x:要求java 1.6,次要功能、bug修复分支,GA,生产准备。</li>\n<li>2.5.x:要求java 1.6,维护分支,只接受具有安全漏洞和致命性错误的bugfix,该分支将会在2019-06-15停止维护,请尽快升级到2.6.x版本。</li>\n</ul>\n<p>点击<a href=\"https://github.com/apache/dubbo/issues/1208\">这里</a>以了解更详细的版本管理计划。</p>\n<p>对于贡献者,请确保所有的变更都提交 [...]
+  "link": "/zh-cn/docs/developers/user-guide/faq_dev.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/adaptive-extension.json b/zh-cn/docs/source_code_guide/adaptive-extension.json
new file mode 100644
index 0000000..030e496
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/adaptive-extension.json
@@ -0,0 +1,10 @@
+{
+  "filename": "adaptive-extension.md",
+  "__html": "<h2>1.原理</h2>\n<p>在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法除外)。拓展方法未被调用,拓展就无法被加载。对于这个矛盾的问题,Dubbo 通过自适应拓展机制很好的解决了。自适应拓展机制的实现逻辑比较复杂,首先 Dubbo 会为拓展接口生成具有代理功能的代码。然后通过 javassist 或 jdk 编译这段代码,得到 Class 类。最后再通过反射创建代理类,整个过程比较复杂。为了让大家对自适应拓展有一个感性的认识,下面我们通过一个示例进行演示。这是一个与汽车相关的例子,我们有一个车轮制造厂接口 WheelMaker:</p>\n<p
 re><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> < [...]
+  "link": "/zh-cn/docs/source_code_guide/adaptive-extension.html",
+  "meta": {
+    "title": "SPI 自适应拓展",
+    "keywords": "Dubbo, SPI, Adaptive Extension",
+    "description": "本文介绍了自适应拓展的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/cluster.json b/zh-cn/docs/source_code_guide/cluster.json
new file mode 100644
index 0000000..d517c71
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/cluster.json
@@ -0,0 +1,10 @@
+{
+  "filename": "cluster.md",
+  "__html": "<h2>1.简介</h2>\n<p>为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。集�
 �模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。< [...]
+  "link": "/zh-cn/docs/source_code_guide/cluster.html",
+  "meta": {
+    "title": "集群",
+    "keywords": "Dubbo, Cluster",
+    "description": "本文介绍了集群的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/directory.json b/zh-cn/docs/source_code_guide/directory.json
new file mode 100644
index 0000000..473572d
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/directory.json
@@ -0,0 +1,10 @@
+{
+  "filename": "directory.md",
+  "__html": "<h2>1. 简介</h2>\n<p>本篇文章,将开始分析 Dubbo 集群容错方面的源码。集群容错源码包含四个部分,分别是服务目录 Directory、服务路由 Router、集群 Cluster 和负载均衡 LoadBalance。这几个部分的源码逻辑相对比较独立,我们将会分四篇文章进行分析。本篇文章作为集群容错的开篇文章,将和大家一起分析服务目录相关的源码。在进行深入分析之前,我们先来了解一下服务目录是什么。服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。在一个服务集群中,服务提供者数量并不是一成不变的,如果集群中新增了一台机器,相应地在服务目录中就要新增一条服务提供者记录。或者,如果服务提供者
 的配置修改了,服务目录中的记录也要做相应的更新。如果这样说,服务目录和注册中心的功能不就雷同了吗?确实如此,这里这么说是为了方便大家理解。实际上服务目录在获取注册中心的服务配置信息后,会为每条配置信息生成一 [...]
+  "link": "/zh-cn/docs/source_code_guide/directory.html",
+  "meta": {
+    "title": "服务目录",
+    "keywords": "Dubbo, Directory",
+    "description": "本文介绍了服务目录的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/dubbo-spi.json b/zh-cn/docs/source_code_guide/dubbo-spi.json
new file mode 100644
index 0000000..2ee131c
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/dubbo-spi.json
@@ -0,0 +1,10 @@
+{
+  "filename": "dubbo-spi.md",
+  "__html": "<h2>1.简介</h2>\n<p>SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。</p>\n<p>需要特别说明的是,本篇文章以及本系列其他文�
 �所分析的源码版本均为 <strong>dubbo-2.6.4</strong>。因此 [...]
+  "link": "/zh-cn/docs/source_code_guide/dubbo-spi.html",
+  "meta": {
+    "title": "Dubbo SPI",
+    "keywords": "Dubbo, SPI",
+    "description": "本文介绍了 Dubbo SPI 的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/export-service.json b/zh-cn/docs/source_code_guide/export-service.json
new file mode 100644
index 0000000..e10d3ff
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/export-service.json
@@ -0,0 +1,10 @@
+{
+  "filename": "export-service.md",
+  "__html": "<h2>1.简介</h2>\n<p>本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。</p>\n<h2>2.源码分析</h2>\n<p>服务导出的入口方法是 ServiceBean 的 onApplicationEvent。onApplicationEvent 是一个事件响应方法,该方法会在收到 Spring 上下文刷新事件后执行服务导出操作。方法代码如下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <s [...]
+  "link": "/zh-cn/docs/source_code_guide/export-service.html",
+  "meta": {
+    "title": "服务导出",
+    "keywords": "Dubbo, service, export",
+    "description": "本文介绍了 Dubbo 服务导出的过程和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/loadbalance.json b/zh-cn/docs/source_code_guide/loadbalance.json
new file mode 100644
index 0000000..0c23193
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/loadbalance.json
@@ -0,0 +1,10 @@
+{
+  "filename": "loadbalance.md",
+  "__html": "<h2>1.简介</h2>\n<p>LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分请求超时。因此将负载均衡到每个服务提供者上,是非常必要的。Dubbo 提供了4种负载均衡实现,分别是基于权重随
 机算法的 RandomLoadBalance、基于最少活跃调用数算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加权轮询算法的 Round [...]
+  "link": "/zh-cn/docs/source_code_guide/loadbalance.html",
+  "meta": {
+    "title": "负载均衡",
+    "keywords": "Dubbo, LoadBalance",
+    "description": "本文介绍了集群的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/refer-service.json b/zh-cn/docs/source_code_guide/refer-service.json
new file mode 100644
index 0000000..1f9271e
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/refer-service.json
@@ -0,0 +1,10 @@
+{
+  "filename": "refer-service.md",
+  "__html": "<h2>1. 简介</h2>\n<p>上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。这些步骤,将在后续章节中一一进行分析。</p>\n<h2>2.服务引用原理</h2>\n<p>Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 ReferenceBean 对应的服务被注入到其他类中时引用。这两�
 ��引用服务的时机区别在于,第一个是饿汉式的,第二个是懒汉式的。默认情况下,Dubbo 使用懒汉式引用服务。如果需要使用饿汉式,可通过配置 &lt [...]
+  "link": "/zh-cn/docs/source_code_guide/refer-service.html",
+  "meta": {
+    "title": "服务引用",
+    "keywords": "Dubbo, service, refer",
+    "description": "本文介绍了 Dubbo 服务引用的过程和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/router.json b/zh-cn/docs/source_code_guide/router.json
new file mode 100644
index 0000000..a552707
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/router.json
@@ -0,0 +1,10 @@
+{
+  "filename": "router.md",
+  "__html": "<h2>1. 简介</h2>\n<p>上一篇文章分析了集群容错的第一部分 — 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。在详细分析服务路由的源码之前,先来介绍一下服务路由是什么。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。Dubbo 目前提供了三种服务路由实现,分别为条件路由 ConditionRouter、脚本路由 ScriptRouter 和标签路由 TagRouter。其中条件路由是我们最常使用的,标签路由是一个新的实现,暂时还未发布,该实现预计会在 2.7.x 版本中发布。本篇文章将分析条件路由相关源码,脚本路由和标签路由这里就不分析了。</p>\n<h2>2. 源码分析</h2>\n<p>条件路由规则由两个条件组成,分别用于对服务消费者和提�
 ��者进行匹配。比如有这样一条规则:</p>\n<p><code>host = 10.20.153.10 =&gt; host = 10.20 [...]
+  "link": "/zh-cn/docs/source_code_guide/router.html",
+  "meta": {
+    "title": "服务路由",
+    "keywords": "Dubbo, Router",
+    "description": "本文介绍了服务\b路由的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/service-invoking-process.json b/zh-cn/docs/source_code_guide/service-invoking-process.json
new file mode 100644
index 0000000..8ddf8e5
--- /dev/null
+++ b/zh-cn/docs/source_code_guide/service-invoking-process.json
@@ -0,0 +1,10 @@
+{
+  "filename": "service-invoking-process.md",
+  "__html": "<h2>1. 简介</h2>\n<p>在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。介绍完本篇文章要分析的内容,接下来我们进入正题吧。</p>\n<h2>2. 源码分析</h2>\n<p>在进行源码分析之前,我们先来通过一张图了解 Dubbo 服务调用过程。</p>\n<p><img src=\"sources/images/send-reque
 st-process.jpg\" alt=\"\"></p>\n<p>首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client  [...]
+  "link": "/zh-cn/docs/source_code_guide/service-invoking-process.html",
+  "meta": {
+    "title": "服务调用过程",
+    "keywords": "Dubbo, Service",
+    "description": "本文介绍了服务调用过程\b的原理和实现细节"
+  }
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/README.json b/zh-cn/docs/user/README.json
new file mode 100644
index 0000000..6f020df
--- /dev/null
+++ b/zh-cn/docs/user/README.json
@@ -0,0 +1,6 @@
+{
+  "filename": "README.md",
+  "__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
new file mode 100644
index 0000000..3c8e629
--- /dev/null
+++ b/zh-cn/docs/user/SUMMARY.json
@@ -0,0 +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=\"./co [...]
+  "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
new file mode 100644
index 0000000..bfe4461
--- /dev/null
+++ b/zh-cn/docs/user/benchmark-tool.json
@@ -0,0 +1,6 @@
+{
+  "filename": "benchmark-tool.md",
+  "__html": "<h1>基准测试工具包</h1>\n<ul>\n<li>下载源码: git clone <a href=\"https://github.com/apache/dubbo.git\">https://github.com/apache/dubbo.git</a></li>\n<li>编译benchmark: cd dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>解压 benchmark压缩包: 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.j [...]
+  "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
new file mode 100644
index 0000000..8b8f98e
--- /dev/null
+++ b/zh-cn/docs/user/best-practice.json
@@ -0,0 +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>,这�
 ��的接口没有明确语义,会给后期维护带 [...]
+  "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
new file mode 100644
index 0000000..be479c7
--- /dev/null
+++ b/zh-cn/docs/user/capacity-plan.json
@@ -0,0 +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",
+  "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/api.json b/zh-cn/docs/user/configuration/api.json
new file mode 100644
index 0000000..ec91c0e
--- /dev/null
+++ b/zh-cn/docs/user/configuration/api.json
@@ -0,0 +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> org.apache.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">impo [...]
+  "link": "/zh-cn/docs/user/configuration/api.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/environment-variables.html b/zh-cn/docs/user/configuration/environment-variables.html
new file mode 100644
index 0000000..e679b0c
--- /dev/null
+++ b/zh-cn/docs/user/configuration/environment-variables.html
@@ -0,0 +1,58 @@
+<!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="environment-variables" />
+	<meta name="description" content="environment-variables" />
+	<!-- 网页标签标题 -->
+	<title>environment-variables</title>
+	<link rel="shortcut icon" href="/img/dubbo.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
+<p>从2.7.3版本开始,Dubbo会自动从约定key中读取配置,并将配置以Key-Value的形式写入到URL中。</p>
+<p>支持的key有以下两个:</p>
+<ol>
+<li>
+<p><code>dubbo.labels</code>,指定一些列配置到URL中的键值对,通常通过JVM -D或系统环境变量指定。</p>
+<p>增加以下配置:</p>
+<pre><code class="language-properties"># JVM
+-Ddubbo.labels = &quot;tag1=value1; tag2=value2&quot;
+
+# 环境变量
+DUBBO_LABELS = &quot;tag1=value1; tag2=value2&quot;
+</code></pre>
+<p>最终生成的URL会包含 tag1、tag2 两个 key: <code>dubbo://xxx?tag1=value1&amp;tag2=value2</code></p>
+</li>
+<li>
+<p><code>dubbo.env.keys</code>,指定环境变量key值,Dubbo会尝试从环境变量加载每个 key</p>
+<pre><code class="language-properties"># JVM
+-Ddubbo.env.keys = &quot;DUBBO_TAG1, DUBBO_TAG2&quot;
+
+# 环境变量
+DUBBO_ENV_KEYS = &quot;DUBBO_TAG1, DUBBO_TAG2&quot;
+</code></pre>
+<p>最终生成的URL会包含 DUBBO_TAG1、DUBBO_TAG2 两个 key: <code>dubbo://xxx?DUBBO_TAG1=value1&amp;DUBBO_TAG2=value2</code></p>
+</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></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>
+	<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/user/configuration/environment-variables.json b/zh-cn/docs/user/configuration/environment-variables.json
new file mode 100644
index 0000000..399d80e
--- /dev/null
+++ b/zh-cn/docs/user/configuration/environment-variables.json
@@ -0,0 +1,6 @@
+{
+  "filename": "environment-variables.md",
+  "__html": "<h1>自动加载环境变量</h1>\n<p>从2.7.3版本开始,Dubbo会自动从约定key中读取配置,并将配置以Key-Value的形式写入到URL中。</p>\n<p>支持的key有以下两个:</p>\n<ol>\n<li>\n<p><code>dubbo.labels</code>,指定一些列配置到URL中的键值对,通常通过JVM -D或系统环境变量指定。</p>\n<p>增加以下配置:</p>\n<pre><code class=\"language-properties\"># JVM\n-Ddubbo.labels = &quot;tag1=value1; tag2=value2&quot;\n\n# 环境变量\nDUBBO_LABELS = &quot;tag1=value1; tag2=value2&quot;\n</code></pre>\n<p>最终生成的URL会包含 tag1、tag2 两个 key: <code>dubbo://xxx?tag1=value1&amp;tag2=value2</code></p>\n</ [...]
+  "link": "/zh-cn/docs/user/configuration/environment-variables.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
new file mode 100644
index 0000000..46863a9
--- /dev/null
+++ b/zh-cn/docs/user/configuration/index.json
@@ -0,0 +1,6 @@
+{
+  "filename": "index.md",
+  "__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/xml.json b/zh-cn/docs/user/configuration/xml.json
new file mode 100644
index 0000000..afe2086
--- /dev/null
+++ b/zh-cn/docs/user/configuration/xml.json
@@ -0,0 +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<p>请在此查看文档描述的<a href=\"https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-basic\">完整示例</a></p>\n<h2>provider.xml 示例</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">beans</span> <span class=\"hl [...]
+  "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
new file mode 100644
index 0000000..0156547
--- /dev/null
+++ b/zh-cn/docs/user/coveragence.json
@@ -0,0 +1,6 @@
+{
+  "filename": "coveragence.md",
+  "__html": "<h1>测试覆盖率报告</h1>\n<ul>\n<li>v2.0   Codecov报表 , 从2017-12-29后开始统计\n测试覆盖率为 : <a href=\"https://codecov.io/gh/apache/dubbo\"><img src=\"https://codecov.io/gh/apache/dubbo/branch/master/graph/badge.svg\" alt=\"codecov\"></a> , 可以从 <a href=\"https://codecov.io/gh/apache/dubbo\">https://codecov.io/gh/apache/dubbo</a> 页面得到覆盖率报表</li>\n<li>v1.0   基于 <code>2.0.12</code> 版本,统计于 2012-02-03</li>\n</ul>\n<p><img src=\"sources/images/code-quality1.jpg\" alt=\"/sources/images/code-quality1.j [...]
+  "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
new file mode 100644
index 0000000..39b8279
--- /dev/null
+++ b/zh-cn/docs/user/demos/accesslog.json
@@ -0,0 +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 [...]
+  "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-deprecated.json b/zh-cn/docs/user/demos/async-call-deprecated.json
new file mode 100644
index 0000000..bdce887
--- /dev/null
+++ b/zh-cn/docs/user/demos/async-call-deprecated.json
@@ -0,0 +1,6 @@
+{
+  "filename": "async-call-deprecated.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=\ [...]
+  "link": "/zh-cn/docs/user/demos/async-call-deprecated.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
new file mode 100644
index 0000000..ed30b5d
--- /dev/null
+++ b/zh-cn/docs/user/demos/async-call.json
@@ -0,0 +1,6 @@
+{
+  "filename": "async-call.md",
+  "__html": "<h1>异步调用</h1>\n<p>从v2.7.0开始,Dubbo的所有异步编程接口开始以<a href=\"https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html\">CompletableFuture</a>为基础</p>\n<p>基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。</p>\n<p><img src=\"../sources/images/future.jpg\" alt=\"/user-guide/images/future.jpg\"></p>\n<h2>使用CompletableFuture签名的接口</h2>\n<p>需要服务提供者事先定义CompletableFuture签名的服务,具体参见<a href=\"./async-execute-on-provider.md\">服务端异步执行</a>接口定义:</p>\n<pre><code cl [...]
+  "link": "/zh-cn/docs/user/demos/async-call.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/async-execute-on-provider.json b/zh-cn/docs/user/demos/async-execute-on-provider.json
new file mode 100644
index 0000000..acca184
--- /dev/null
+++ b/zh-cn/docs/user/demos/async-execute-on-provider.json
@@ -0,0 +1,6 @@
+{
+  "filename": "async-execute-on-provider.md",
+  "__html": "<h1>异步执行</h1>\n<p>Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。</p>\n<blockquote>\n<p>注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置</p>\n<ul>\n<li>Consumer同步 - Provider同步</li>\n<li>Consumer异步 - Provider同步</li>\n<li>Consumer同步 - Provider异步</li>\n<li>Consumer异步 - Provider异步</li>\n</ul>\n</blockquote>\n<h2>定义CompletableFuture签名的接口</h2>\n<p>服务接口定义:</p>\n<pre><code class=\"language-java\"><span cla [...]
+  "link": "/zh-cn/docs/user/demos/async-execute-on-provider.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
new file mode 100644
index 0000000..55c6553
--- /dev/null
+++ b/zh-cn/docs/user/demos/attachment.json
@@ -0,0 +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\",  [...]
+  "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
new file mode 100644
index 0000000..b3f15b3
--- /dev/null
+++ b/zh-cn/docs/user/demos/callback-parameter.json
@@ -0,0 +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=\"h [...]
+  "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
new file mode 100644
index 0000000..e295c09
--- /dev/null
+++ b/zh-cn/docs/user/demos/concurrency-control.json
@@ -0,0 +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. [...]
+  "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
new file mode 100644
index 0000000..0ac796b
--- /dev/null
+++ b/zh-cn/docs/user/demos/config-connections.json
@@ -0,0 +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=\"lang [...]
+  "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-deprecated.json b/zh-cn/docs/user/demos/config-rule-deprecated.json
new file mode 100644
index 0000000..1d2b62b
--- /dev/null
+++ b/zh-cn/docs/user/demos/config-rule-deprecated.json
@@ -0,0 +1,6 @@
+{
+  "filename": "config-rule-deprecated.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\">\" [...]
+  "link": "/zh-cn/docs/user/demos/config-rule-deprecated.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
new file mode 100644
index 0000000..943ee34
--- /dev/null
+++ b/zh-cn/docs/user/demos/config-rule.json
@@ -0,0 +1,6 @@
+{
+  "filename": "config-rule.md",
+  "__html": "<h1>配置规则</h1>\n<p>查看<a href=\"./config-rule-deprecated.md\">老版本配置规则</a>。</p>\n<p>覆盖规则是Dubbo设计的在无需重启应用的情况下,动态调整RPC调用行为的一种能力。2.7.0版本开始,支持从<strong>服务</strong>和<strong>应用</strong>两个粒度来调整动态配置。</p>\n<h2>概览</h2>\n<p>请在<a href=\"http://47.91.207.147/#/governance/config\">服务治理控制台</a>查看或修改覆盖规则。</p>\n<ul>\n<li>\n<p>应用粒度</p>\n<pre><code class=\"language-yaml\"><span class=\"hljs-comment\"># 将应用demo(key:demo)在20880端口上提供(side:provider)的所有服务(scope:application)的权重修改为1000(weight:1000)。</span [...]
+  "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
new file mode 100644
index 0000000..c81e0d6
--- /dev/null
+++ b/zh-cn/docs/user/demos/context.json
@@ -0,0 +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=\" [...]
+  "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
new file mode 100644
index 0000000..47a0e64
--- /dev/null
+++ b/zh-cn/docs/user/demos/delay-publish.json
@@ -0,0 +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>=<sp [...]
+  "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
new file mode 100644
index 0000000..a18e4ef
--- /dev/null
+++ b/zh-cn/docs/user/demos/distributed-transaction.json
@@ -0,0 +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",
+  "link": "/zh-cn/docs/user/demos/distributed-transaction.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
new file mode 100644
index 0000000..fcff312
--- /dev/null
+++ b/zh-cn/docs/user/demos/echo-service.json
@@ -0,0 +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\ [...]
+  "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
new file mode 100644
index 0000000..f578ce3
--- /dev/null
+++ b/zh-cn/docs/user/demos/events-notify.json
@@ -0,0 +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> P [...]
+  "link": "/zh-cn/docs/user/demos/events-notify.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
new file mode 100644
index 0000000..cc3fed5
--- /dev/null
+++ b/zh-cn/docs/user/demos/fault-tolerent-strategy.json
@@ -0,0 +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><cod [...]
+  "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
new file mode 100644
index 0000000..a421fda
--- /dev/null
+++ b/zh-cn/docs/user/demos/generic-reference.json
@@ -0,0 +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\">in [...]
+  "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
new file mode 100644
index 0000000..40f9db9
--- /dev/null
+++ b/zh-cn/docs/user/demos/generic-service.json
@@ -0,0 +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\">implem [...]
+  "link": "/zh-cn/docs/user/demos/generic-service.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
new file mode 100644
index 0000000..49ee4e1
--- /dev/null
+++ b/zh-cn/docs/user/demos/group-merger.json
@@ -0,0 +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>=< [...]
+  "link": "/zh-cn/docs/user/demos/group-merger.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
new file mode 100644
index 0000000..32e3d9f
--- /dev/null
+++ b/zh-cn/docs/user/demos/index.json
@@ -0,0 +1,6 @@
+{
+  "filename": "index.md",
+  "__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
new file mode 100644
index 0000000..f133888
--- /dev/null
+++ b/zh-cn/docs/user/demos/introduction.json
@@ -0,0 +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",
+  "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
new file mode 100644
index 0000000..91d24b2
--- /dev/null
+++ b/zh-cn/docs/user/demos/lazy-connect.json
@@ -0,0 +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=\"foo [...]
+  "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
new file mode 100644
index 0000000..020fb67
--- /dev/null
+++ b/zh-cn/docs/user/demos/loadbalance.json
@@ -0,0 +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>\ [...]
+  "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
new file mode 100644
index 0000000..5d25a38
--- /dev/null
+++ b/zh-cn/docs/user/demos/local-call.json
@@ -0,0 +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>  [...]
+  "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
new file mode 100644
index 0000000..6248cc7
--- /dev/null
+++ b/zh-cn/docs/user/demos/local-mock.json
@@ -0,0 +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\"</ [...]
+  "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
new file mode 100644
index 0000000..89ce003
--- /dev/null
+++ b/zh-cn/docs/user/demos/local-stub.json
@@ -0,0 +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-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
new file mode 100644
index 0000000..6f43c77
--- /dev/null
+++ b/zh-cn/docs/user/demos/logger-strategy.json
@@ -0,0 +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 clas [...]
+  "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-versions.json b/zh-cn/docs/user/demos/multi-versions.json
new file mode 100644
index 0000000..a7b96d6
--- /dev/null
+++ b/zh-cn/docs/user/demos/multi-versions.json
@@ -0,0 +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 clas [...]
+  "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
new file mode 100644
index 0000000..413fd04
--- /dev/null
+++ b/zh-cn/docs/user/demos/netty4.json
@@ -0,0 +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\" [...]
+  "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
new file mode 100644
index 0000000..9ded9f6
--- /dev/null
+++ b/zh-cn/docs/user/demos/parameter-validation.json
@@ -0,0 +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=\ [...]
+  "link": "/zh-cn/docs/user/demos/parameter-validation.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
new file mode 100644
index 0000000..ca7bd9c
--- /dev/null
+++ b/zh-cn/docs/user/demos/reference-config-cache.json
@@ -0,0 +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;();\nrefer [...]
+  "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
new file mode 100644
index 0000000..d3ae971
--- /dev/null
+++ b/zh-cn/docs/user/demos/registry-only.json
@@ -0,0 +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- [...]
+  "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
new file mode 100644
index 0000000..800d96b
--- /dev/null
+++ b/zh-cn/docs/user/demos/result-cache.json
@@ -0,0 +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</ [...]
+  "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-deprecated.json b/zh-cn/docs/user/demos/routing-rule-deprecated.json
new file mode 100644
index 0000000..4d02842
--- /dev/null
+++ b/zh-cn/docs/user/demos/routing-rule-deprecated.json
@@ -0,0 +1,6 @@
+{
+  "filename": "routing-rule-deprecated.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(U [...]
+  "link": "/zh-cn/docs/user/demos/routing-rule-deprecated.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
new file mode 100644
index 0000000..b06b77e
--- /dev/null
+++ b/zh-cn/docs/user/demos/serialization.json
@@ -0,0 +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 [...]
+  "link": "/zh-cn/docs/user/demos/serialization.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
new file mode 100644
index 0000000..f6c398b
--- /dev/null
+++ b/zh-cn/docs/user/demos/service-downgrade.json
@@ -0,0 +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(<spa [...]
+  "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
new file mode 100644
index 0000000..eaf9aac
--- /dev/null
+++ b/zh-cn/docs/user/demos/service-group.json
@@ -0,0 +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\">g [...]
+  "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
new file mode 100644
index 0000000..4384e8e
--- /dev/null
+++ b/zh-cn/docs/user/demos/set-host.json
@@ -0,0 +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> [...]
+  "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
new file mode 100644
index 0000000..5519485
--- /dev/null
+++ b/zh-cn/docs/user/demos/static-service.json
@@ -0,0 +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=\"hl [...]
+  "link": "/zh-cn/docs/user/demos/static-service.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
new file mode 100644
index 0000000..14d5eb7
--- /dev/null
+++ b/zh-cn/docs/user/demos/subscribe-only.json
@@ -0,0 +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\"< [...]
+  "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
new file mode 100644
index 0000000..c1e2805
--- /dev/null
+++ b/zh-cn/docs/user/demos/thread-model.json
@@ -0,0 +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:protoco [...]
+  "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
new file mode 100644
index 0000000..6f33de6
--- /dev/null
+++ b/zh-cn/docs/user/demos/token-authorization.json
@@ -0,0 +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\">\"co [...]
+  "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
new file mode 100644
index 0000000..8841e04
--- /dev/null
+++ b/zh-cn/docs/user/dependencies.json
@@ -0,0 +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</c [...]
+  "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/languages/erlang/reference.html b/zh-cn/docs/user/languages/erlang/reference.html
new file mode 100644
index 0000000..8afdce8
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/reference.html
@@ -0,0 +1,45 @@
+<!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="reference" />
+	<meta name="description" content="reference" />
+	<!-- 网页标签标题 -->
+	<title>reference</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 [...]
+<h2>基础配置</h2>
+<p>消费者配置项需要添加到<code>sys.config</code>文件<code>dubboerl</code>应用配置项里。</p>
+<pre><code class="language-erlang">{dubboerl,[
+	<span class="hljs-comment">%% other config ...</span>
+	{consumer,[
+		{&lt;&lt;<span class="hljs-string">"interface fullname"</span>&gt;&gt;,[Option]},
+		<span class="hljs-comment">%% eg:</span>
+		{&lt;&lt;<span class="hljs-string">"org.apache.dubbo.erlang.sample.service.facade.UserOperator"</span>&gt;&gt;,[]},
+	]}
+]}
+</code></pre>
+<p>Option 配置项待添加中.</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>
+	<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/user/languages/erlang/reference.json b/zh-cn/docs/user/languages/erlang/reference.json
new file mode 100644
index 0000000..601f281
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/reference.json
@@ -0,0 +1,6 @@
+{
+  "filename": "reference.md",
+  "__html": "<h1>消费者配置</h1>\n<h2>基础配置</h2>\n<p>消费者配置项需要添加到<code>sys.config</code>文件<code>dubboerl</code>应用配置项里。</p>\n<pre><code class=\"language-erlang\">{dubboerl,[\n\t<span class=\"hljs-comment\">%% other config ...</span>\n\t{consumer,[\n\t\t{&lt;&lt;<span class=\"hljs-string\">\"interface fullname\"</span>&gt;&gt;,[Option]},\n\t\t<span class=\"hljs-comment\">%% eg:</span>\n\t\t{&lt;&lt;<span class=\"hljs-string\">\"org.apache.dubbo.erlang.sample.service.facade.UserOperator\"</span>&g [...]
+  "link": "/zh-cn/docs/user/languages/erlang/reference.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/languages/erlang/serialization.html b/zh-cn/docs/user/languages/erlang/serialization.html
new file mode 100644
index 0000000..e610aa0
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/serialization.html
@@ -0,0 +1,60 @@
+<!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="serialization" />
+	<meta name="description" content="serialization" />
+	<!-- 网页标签标题 -->
+	<title>serialization</title>
+	<link rel="shortcut icon" href="/img/dubbo.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
+<p>当前该库只实现了<code>dubbo://</code>通讯协议。</p>
+<p>序列化方式实现了<code>hessian</code>和<code>json</code>两种方式。</p>
+<h2>配置样例</h2>
+<p>序列化配置需要添加到<code>sys.config</code>文件<code>dubboerl</code>应用配置项里。</p>
+<pre><code class="language-erlang">{dubboerl,[
+	<span class="hljs-comment">%% other config ...</span>
+	{protocol,hessian}
+]}
+</code></pre>
+<table>
+<thead>
+<tr>
+<th>ConfigName</th>
+<th>Type</th>
+<th>DefaultValue</th>
+<th>Remarks</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>protocol</td>
+<td>atom()</td>
+<td>hessian</td>
+<td>hessian,json</td>
+</tr>
+</tbody>
+</table>
+</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>
+	<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/user/languages/erlang/serialization.json b/zh-cn/docs/user/languages/erlang/serialization.json
new file mode 100644
index 0000000..a0146d9
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/serialization.json
@@ -0,0 +1,6 @@
+{
+  "filename": "serialization.md",
+  "__html": "<h1>序列化配置项</h1>\n<p>当前该库只实现了<code>dubbo://</code>通讯协议。</p>\n<p>序列化方式实现了<code>hessian</code>和<code>json</code>两种方式。</p>\n<h2>配置样例</h2>\n<p>序列化配置需要添加到<code>sys.config</code>文件<code>dubboerl</code>应用配置项里。</p>\n<pre><code class=\"language-erlang\">{dubboerl,[\n\t<span class=\"hljs-comment\">%% other config ...</span>\n\t{protocol,hessian}\n]}\n</code></pre>\n<table>\n<thead>\n<tr>\n<th>ConfigName</th>\n<th>Type</th>\n<th>DefaultValue</th>\n<th>Remarks</th>\n</tr>\n</thead>\n<tbo [...]
+  "link": "/zh-cn/docs/user/languages/erlang/serialization.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/languages/erlang/service.html b/zh-cn/docs/user/languages/erlang/service.html
new file mode 100644
index 0000000..38d0965
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/service.html
@@ -0,0 +1,75 @@
+<!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="service" />
+	<meta name="description" content="service" />
+	<!-- 网页标签标题 -->
+	<title>service</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 [...]
+<h2>基本配置</h2>
+<p>提供者配置项需要添加到<code>sys.config</code>文件<code>dubboerl</code>应用配置项里。</p>
+<pre><code class="language-erlang">{dubboerl,[
+	<span class="hljs-comment">%% other config ...</span>
+	{provider,[
+		{module_implements,interface_module,interface_fullname,[Options]},
+		<span class="hljs-comment">%% eg:</span>
+		{userOperator_impl,userOperator,&lt;&lt;<span class="hljs-string">"org.apache.dubbo.erlang.sample.service.facade.UserOperator"</span>&gt;&gt;,[Option]}
+	]}
+]}
+</code></pre>
+<table>
+<thead>
+<tr>
+<th>ConfigName</th>
+<th>Type</th>
+<th>DefaultValue</th>
+<th>Remarks</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>module_implements</td>
+<td>atom()</td>
+<td>-</td>
+<td>The service implements module name</td>
+</tr>
+<tr>
+<td>interface_module</td>
+<td>atom()</td>
+<td>-</td>
+<td>Interface module name is transfer form java jar</td>
+</tr>
+<tr>
+<td>interface_fullname</td>
+<td>binary()</td>
+<td>-</td>
+<td>Interface full name is the java class name</td>
+</tr>
+</tbody>
+</table>
+<p>Option is to be added.</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>
+	<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/user/languages/erlang/service.json b/zh-cn/docs/user/languages/erlang/service.json
new file mode 100644
index 0000000..3b53482
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/service.json
@@ -0,0 +1,6 @@
+{
+  "filename": "service.md",
+  "__html": "<h1>提供者配置</h1>\n<h2>基本配置</h2>\n<p>提供者配置项需要添加到<code>sys.config</code>文件<code>dubboerl</code>应用配置项里。</p>\n<pre><code class=\"language-erlang\">{dubboerl,[\n\t<span class=\"hljs-comment\">%% other config ...</span>\n\t{provider,[\n\t\t{module_implements,interface_module,interface_fullname,[Options]},\n\t\t<span class=\"hljs-comment\">%% eg:</span>\n\t\t{userOperator_impl,userOperator,&lt;&lt;<span class=\"hljs-string\">\"org.apache.dubbo.erlang.sample.service.facade.UserOperato [...]
+  "link": "/zh-cn/docs/user/languages/erlang/service.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/languages/erlang/start.html b/zh-cn/docs/user/languages/erlang/start.html
new file mode 100644
index 0000000..2d64492
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/start.html
@@ -0,0 +1,77 @@
+<!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="start" />
+	<meta name="description" content="start" />
+	<!-- 网页标签标题 -->
+	<title>start</title>
+	<link rel="shortcut icon" href="/img/dubbo.ico"/>
+	<link rel="stylesheet" href="/build/documentation.css" />
+</head>
+<body>
+	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
+<p>建议先使用java定义接口jar,并使用<a href="https://github.com/apache/dubbo-erlang/tree/master/tools/erlanalysis">erlanalysis</a> 工具解析java接口至Erlang lib</p>
+<h2>导入依赖库</h2>
+<h3>使用 Rebar 编译工具。</h3>
+<p>Add dubblerl to rebar.config with your project</p>
+<pre><code class="language-erlang">{deps, [
+    {dubboerl, {git, <span class="hljs-string">"https://github.com/apache/dubbo-erlang.git"</span>, {branch, <span class="hljs-string">"master"</span>}}}
+]}.
+</code></pre>
+<h3>使用 <a href="http://erlang.mk">erlang.mk</a> 编译工具</h3>
+<p><code>待补充</code></p>
+<h2>导入接口库</h2>
+<p>Suppose the interface lib you exported is called dubbo_service.</p>
+<ul>
+<li>If you didn't upload your lib to your git repository, It is recommended that you copy the <code>dubbo_service</code> lib
+into the project's <code>apps</code> directory.</li>
+<li>If it is upload to your git repository, you can import like this:</li>
+</ul>
+<pre><code class="language-erlang">{deps, [
+    {dubboerl, {git, <span class="hljs-string">"https://github.com/apache/dubbo-erlang.git"</span>, {branch, <span class="hljs-string">"master"</span>}}},
+    {dubbo_service,{git,<span class="hljs-string">"${INTERFACE_LIB_URL}"</span>,{branch,<span class="hljs-string">"master"</span>}}} <span class="hljs-comment">%% replace ${INTERFACE_LIB_URL} with your lib git repos url</span>
+]}.
+</code></pre>
+<h2>消费者配置</h2>
+<p>Please reference <a href="./reference.md">Reference Config</a></p>
+<h2>Init dubbolib in your project</h2>
+<p>It is need you</p>
+<pre><code class="language-erlang">dubboerl:init().
+</code></pre>
+<h2>如何调用?</h2>
+<h3>同步调用</h3>
+<pre><code class="language-erlang">Request = #userInfoRequest{requestId = <span class="hljs-number">123</span>, username = <span class="hljs-string">"testname"</span>},
+{ok,RequestRef,Response,RpcContent}  = userOperator:<span class="hljs-keyword">query</span>UserInfo(Request,#{sync=&gt; true}).
+</code></pre>
+<p>If it occur error, is reponse <code>{error,Reason}</code>.</p>
+<h3>异步调用</h3>
+<p>Default is Async call.</p>
+<pre><code class="language-erlang">Request = #userInfoRequest{requestId = <span class="hljs-number">123</span>, username = <span class="hljs-string">"testname"</span>},
+{ok,RequestRef} = userOperator:<span class="hljs-keyword">query</span>UserInfo(Request).
+
+<span class="hljs-comment">%% you can receive the message after.</span>
+<span class="hljs-function"><span class="hljs-title">handle_cast</span><span class="hljs-params">({msg_back,RequestRef,Response,RpcContent},State)</span>.
+</span></code></pre>
+<h2>示例</h2>
+<p>参考项目 <a href="https://github.com/apache/dubbo-erlang/tree/master/samples">dubboerl_demo</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>
+	<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/user/languages/erlang/start.json b/zh-cn/docs/user/languages/erlang/start.json
new file mode 100644
index 0000000..8393a8a
--- /dev/null
+++ b/zh-cn/docs/user/languages/erlang/start.json
@@ -0,0 +1,6 @@
+{
+  "filename": "start.md",
+  "__html": "<h1>快速开始</h1>\n<p>建议先使用java定义接口jar,并使用<a href=\"https://github.com/apache/dubbo-erlang/tree/master/tools/erlanalysis\">erlanalysis</a> 工具解析java接口至Erlang lib</p>\n<h2>导入依赖库</h2>\n<h3>使用 Rebar 编译工具。</h3>\n<p>Add dubblerl to rebar.config with your project</p>\n<pre><code class=\"language-erlang\">{deps, [\n    {dubboerl, {git, <span class=\"hljs-string\">\"https://github.com/apache/dubbo-erlang.git\"</span>, {branch, <span class=\"hljs-string\">\"master\"</span>}}}\n]}.\n</code [...]
+  "link": "/zh-cn/docs/user/languages/erlang/start.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/maturity.json b/zh-cn/docs/user/maturity.json
new file mode 100644
index 0000000..acee000
--- /dev/null
+++ b/zh-cn/docs/user/maturity.json
@@ -0,0 +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>Aliba [...]
+  "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
new file mode 100644
index 0000000..6a18aed
--- /dev/null
+++ b/zh-cn/docs/user/perf-test.json
@@ -0,0 +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>磁盘</ [...]
+  "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
new file mode 100644
index 0000000..4bed880
--- /dev/null
+++ b/zh-cn/docs/user/preface/architecture.json
@@ -0,0 +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>\ [...]
+  "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
new file mode 100644
index 0000000..d4af0a8
--- /dev/null
+++ b/zh-cn/docs/user/preface/background.json
@@ -0,0 +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>当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐�
 �形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提 [...]
+  "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
new file mode 100644
index 0000000..08f47bb
--- /dev/null
+++ b/zh-cn/docs/user/preface/index.json
@@ -0,0 +1,6 @@
+{
+  "filename": "index.md",
+  "__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
new file mode 100644
index 0000000..0e2668c
--- /dev/null
+++ b/zh-cn/docs/user/preface/requirements.json
@@ -0,0 +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 [...]
+  "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
new file mode 100644
index 0000000..e5a63a1
--- /dev/null
+++ b/zh-cn/docs/user/preface/usage.json
@@ -0,0 +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-st [...]
+  "link": "/zh-cn/docs/user/preface/usage.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/recommend.json b/zh-cn/docs/user/recommend.json
new file mode 100644
index 0000000..d537044
--- /dev/null
+++ b/zh-cn/docs/user/recommend.json
@@ -0,0 +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=\"l [...]
+  "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
new file mode 100644
index 0000000..47cc130
--- /dev/null
+++ b/zh-cn/docs/user/references/api.json
@@ -0,0 +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>org.apache.dubbo.config.ServiceConfig\norg.apache.dubbo.config.ReferenceConfig\norg.apache.dubbo.config.ProtocolConfig\norg.apache.dubbo.config.RegistryConfig\norg.apache.dubbo.config.MonitorConfig\norg.apache.dubbo.config.ApplicationConfig\norg.apache.dubbo.config.ModuleConfig\norg.apache.d [...]
+  "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
new file mode 100644
index 0000000..ef947e3
--- /dev/null
+++ b/zh-cn/docs/user/references/maven.json
@@ -0,0 +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 cl [...]
+  "link": "/zh-cn/docs/user/references/maven.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/metadata/introduction.json b/zh-cn/docs/user/references/metadata/introduction.json
new file mode 100644
index 0000000..be9025b
--- /dev/null
+++ b/zh-cn/docs/user/references/metadata/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__html": "<h1>背景</h1>\n<p>dubbo provider中的服务配置项有接近<a href=\"http://dubbo.apache.org/en-us/docs/user/references/xml/dubbo-service.html\">30个配置项</a>。 排除注册中心服务治理需要之外,很大一部分配置项是provider自己使用,不需要透传给消费者。这部分数据不需要进入注册中心,而只需要以key-value形式持久化存储。\ndubbo consumer中的配置项也有<a href=\"http://dubbo.apache.org/en-us/docs/user/references/xml/dubbo-reference.html\">20+个配置项</a>。在注册中心之中,服务消费者列表中只需要关注application,version,group,ip,dubbo版本等少量配置,其他配置也可以以key-value形式持久化存储。\n这些数据是以服务为维度注册进入注册中心,导致了数据量的膨胀,进而引发注册中心(如zook [...]
+  "link": "/zh-cn/docs/user/references/metadata/introduction.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/metadata/metadata-redis.json b/zh-cn/docs/user/references/metadata/metadata-redis.json
new file mode 100644
index 0000000..de9e3a5
--- /dev/null
+++ b/zh-cn/docs/user/references/metadata/metadata-redis.json
@@ -0,0 +1,6 @@
+{
+  "filename": "metadata-redis.md",
+  "__html": "<h2>持续更新中</h2>\n",
+  "link": "/zh-cn/docs/user/references/metadata/metadata-redis.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/metadata/metadata-zookeeper.json b/zh-cn/docs/user/references/metadata/metadata-zookeeper.json
new file mode 100644
index 0000000..beda4e2
--- /dev/null
+++ b/zh-cn/docs/user/references/metadata/metadata-zookeeper.json
@@ -0,0 +1,6 @@
+{
+  "filename": "metadata-zookeeper.md",
+  "__html": "<h2>持续更新中</h2>\n",
+  "link": "/zh-cn/docs/user/references/metadata/metadata-zookeeper.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
new file mode 100644
index 0000000..b971aa8
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/dubbo.json
@@ -0,0 +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>缺省协议,使用基于 mi [...]
+  "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
new file mode 100644
index 0000000..b5b6800
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/hessian.json
@@ -0,0 +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>序列化:H [...]
+  "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
new file mode 100644
index 0000000..cd0eaed
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/http.json
@@ -0,0 +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=\"lan [...]
+  "link": "/zh-cn/docs/user/references/protocol/http.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/introduction.json b/zh-cn/docs/user/references/protocol/introduction.json
new file mode 100644
index 0000000..ff08923
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__html": "<h1>协议参考手册</h1>\n<p>推荐使用 Dubbo 协议。各协议的性能情况,请参见:<a href=\"../../perf-test.md\">性能测试报告</a></p>\n",
+  "link": "/zh-cn/docs/user/references/protocol/introduction.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/memcached.json b/zh-cn/docs/user/references/protocol/memcached.json
new file mode 100644
index 0000000..ddbc8a2
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/memcached.json
@@ -0,0 +1,6 @@
+{
+  "filename": "memcached.md",
+  "__html": "<h1>memcached://</h1>\n<p>基于 memcached <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 实现的 RPC 协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>注册 memcached 服务的地址</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookee [...]
+  "link": "/zh-cn/docs/user/references/protocol/memcached.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/redis.json b/zh-cn/docs/user/references/protocol/redis.json
new file mode 100644
index 0000000..79bd172
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/redis.json
@@ -0,0 +1,6 @@
+{
+  "filename": "redis.md",
+  "__html": "<h1>redis://</h1>\n<p>基于 Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 实现的 RPC 协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>注册 redis 服务的地址</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. [...]
+  "link": "/zh-cn/docs/user/references/protocol/redis.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/rest.json b/zh-cn/docs/user/references/protocol/rest.json
new file mode 100644
index 0000000..eed5463
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/rest.json
@@ -0,0 +1,6 @@
+{
+  "filename": "rest.md",
+  "__html": "<h1>rest://</h1>\n<p>基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持</p>\n<h2>快速入门</h2>\n<p>在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。</p>\n<p>这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。</p>\n<p>首先,开发服务的接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span  [...]
+  "link": "/zh-cn/docs/user/references/protocol/rest.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/thrift.json b/zh-cn/docs/user/references/protocol/thrift.json
new file mode 100644
index 0000000..bdb91f7
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/thrift.json
@@ -0,0 +1,6 @@
+{
+  "filename": "thrift.md",
+  "__html": "<h1>thrift://</h1>\n<p>当前 dubbo 支持 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>的 thrift 协议是对 thrift 原生协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup> 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。</p>\n<p>使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。</p>\n<h2>依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt; [...]
+  "link": "/zh-cn/docs/user/references/protocol/thrift.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/webservice.json b/zh-cn/docs/user/references/protocol/webservice.json
new file mode 100644
index 0000000..09f5bbb
--- /dev/null
+++ b/zh-cn/docs/user/references/protocol/webservice.json
@@ -0,0 +1,6 @@
+{
+  "filename": "webservice.md",
+  "__html": "<h1>webservice://</h1>\n<p>基于 WebService 的远程调用协议,基于 <a href=\"http://cxf.apache.org\">Apache CXF</a> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 的 <code>frontend-simple</code> 和 <code>transports-http</code> 实现 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<p>可以和原生 WebService 服务互操作,即:</p>\n<ul>\n<li>提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,</li>\n<li>或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 WebService 协 [...]
+  "link": "/zh-cn/docs/user/references/protocol/webservice.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/registry/introduction.json b/zh-cn/docs/user/references/registry/introduction.json
new file mode 100644
index 0000000..90351af
--- /dev/null
+++ b/zh-cn/docs/user/references/registry/introduction.json
@@ -0,0 +1,6 @@
+{
+  "filename": "introduction.md",
+  "__html": "<h2>注册中心参考手册</h2>\n<p>推荐使用 <a href=\"./zookeeper.md\">Zookeeper 注册中心</a></p>\n",
+  "link": "/zh-cn/docs/user/references/registry/introduction.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/registry/multicast.json b/zh-cn/docs/user/references/registry/multicast.json
new file mode 100644
... 419 lines suppressed ...


[dubbo-website] 01/03: add ecology-page

Posted by wa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wangxin pushed a commit to branch ecology-page
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git

commit 6631510c5776139713f8e47116ec40564eff214b
Merge: b659fa5 cf9f34c
Author: Xin Wang <xi...@gmail.com>
AuthorDate: Tue Aug 13 21:34:23 2019 +0800

    add ecology-page

 .gitignore                                         |    7 +-
 PULL_REQUEST_TEMPLATE.md                           |    4 +-
 README.md                                          |   15 +-
 blog/en-us/apachecon-na-2018.md                    |    8 +-
 blog/en-us/download.md                             |   32 +-
 blog/en-us/dubbo-101.md                            |    4 +-
 blog/en-us/dubbo-new-async.md                      |    6 +-
 blog/en-us/dubbo2-js.md                            |    4 +-
 blog/en-us/gsoc-2018.md                            |    8 +-
 blog/en-us/prepare-an-apache-release.md            |   50 +-
 blog/en-us/qcon-beijing-2018.md                    |    7 +
 .../en-us/spring-boot-dubbo-start-stop-analysis.md |   12 +-
 blog/en-us/tracing-with-skywalking.md              |    2 +-
 blog/zh-cn/apachecon-na-2018.md                    |    6 +
 blog/zh-cn/build-new-docker-image-in-dockerhub.md  |   58 +
 blog/zh-cn/download.md                             |   24 +-
 blog/zh-cn/dubbo-27-features.md                    |    2 +-
 blog/zh-cn/dubbo-admin.md                          |    2 +-
 ...source.md => dubbo-contribute-to-opensource.md} |   18 +-
 blog/zh-cn/dubbo-integrate-with-hystrix.md         |    6 +-
 blog/zh-cn/dubbo-local-call.md                     |    2 +-
 blog/zh-cn/dubbo-meet-arthas.md                    |    6 +-
 blog/zh-cn/dubbo-network-interfaces.md             |  526 +++++
 blog/zh-cn/dubbo-new-async.md                      |    6 +-
 blog/zh-cn/dubbo-registry-nacos-integration.md     |   12 +-
 blog/zh-cn/dubbo-stub-mock.md                      |    6 +-
 blog/zh-cn/dubbo2-js.md                            |    4 +-
 blog/zh-cn/gsoc-2018.md                            |   10 +
 blog/zh-cn/how-to-involve-dubbo-community.md       |   12 +-
 blog/zh-cn/introduction-to-dubbo-url.md            |    4 +-
 blog/zh-cn/optimization-branch-prediction.md       |    2 +-
 blog/zh-cn/prepare-an-apache-release.md            |   47 +-
 blog/zh-cn/qcon-beijing-2018.md                    |    6 +
 blog/zh-cn/sentinel-introduction-for-dubbo.md      |    2 +-
 .../zh-cn/spring-boot-dubbo-start-stop-analysis.md |   12 +-
 build/TXD_D-Medium.eot                             |  Bin 5025 -> 0 bytes
 build/TXD_D-Medium.ttf                             |  Bin 8984 -> 0 bytes
 build/TXD_D-Medium.woff                            |  Bin 5488 -> 0 bytes
 build/TXD_D-Regular.eot                            |  Bin 4837 -> 0 bytes
 build/TXD_D-Regular.ttf                            |  Bin 8832 -> 0 bytes
 build/TXD_D-Regular.woff                           |  Bin 5336 -> 0 bytes
 build/blog.css                                     |    1 -
 build/blog.js                                      |    6 -
 build/blogDetail.css                               |    1 -
 build/blogDetail.js                                |    6 -
 build/community.css                                |    1 -
 build/community.js                                 |    6 -
 build/documentation.css                            |    1 -
 build/documentation.js                             |    6 -
 build/ecology.css                                  |    1 -
 build/ecology.js                                   |   11 -
 build/home.css                                     |    1 -
 build/home.js                                      |    6 -
 docs/en-us/admin/install/admin-console.md          |    4 +-
 docs/en-us/admin/install/consumer-demo.md          |   18 +-
 docs/en-us/admin/install/provider-demo.md          |   14 +-
 docs/en-us/admin/introduction.md                   |    6 +-
 docs/en-us/admin/ops/skywalking.md                 |    2 +-
 docs/en-us/admin/serviceTest.md                    |    2 +-
 docs/en-us/dev/build.md                            |    6 +-
 docs/en-us/dev/impls/protocol.md                   |   12 +-
 .../committer-guide/apache-dubbo-page_dev.md       |    7 +-
 .../committer-guide/label-an-issue-guide_dev.md    |    4 +-
 .../committer-guide/release-guide_dev.md           |  156 +-
 .../committer-guide/website-guide_dev.md           |    2 +-
 .../contributor-guide/dubbo-extension-guide_dev.md |    4 +-
 .../mailing-list-subscription-guide_dev.md         |   12 +-
 .../contributor-guide/new-contributor-guide_dev.md |   36 +-
 .../reporting-security-issues_dev.md               |    4 +-
 .../software-donation-guide_dev.md                 |    6 +-
 .../contributor-guide/test-coverage-guide_dev.md   |    2 +-
 docs/en-us/developers/developers_dev.md            |   33 +-
 docs/en-us/developers/guide_dev.md                 |   18 +-
 docs/en-us/developers/user-guide/faq_dev.md        |    4 +-
 docs/en-us/user/SUMMARY.md                         |    2 +-
 docs/en-us/user/benchmark-tool.md                  |    6 +-
 docs/en-us/user/configuration/xml.md               |    2 +-
 docs/en-us/user/coveragence.md                     |    4 +-
 docs/en-us/user/demos/group-merger.md              |    2 +-
 docs/en-us/user/demos/local-call.md                |    2 +-
 docs/en-us/user/demos/parameter-validation.md      |    2 +-
 docs/en-us/user/demos/result-cache.md              |    2 +-
 docs/en-us/user/languages/erlang/reference.md      |   15 +
 docs/en-us/user/languages/erlang/serialization.md  |   17 +
 docs/en-us/user/languages/erlang/service.md        |   22 +
 docs/en-us/user/languages/erlang/start.md          |   62 +
 docs/en-us/user/maturity.md                        |   66 +-
 docs/en-us/user/preface/architecture.md            |    4 +-
 docs/en-us/user/preface/requirements.md            |    2 +-
 docs/en-us/user/references/protocol/thrift.md      |    2 +-
 docs/en-us/user/references/registry/nacos.md       |  122 ++
 docs/en-us/user/references/registry/zookeeper.md   |    2 +
 docs/en-us/user/references/xml/dubbo-registry.md   |    2 +-
 docs/zh-cn/admin/install/admin-console.md          |    4 +-
 docs/zh-cn/admin/install/consumer-demo.md          |    4 +-
 docs/zh-cn/admin/install/provider-demo.md          |    4 +-
 docs/zh-cn/admin/introduction.md                   |    6 +-
 docs/zh-cn/dev/SUMMARY.md                          |    1 +
 docs/zh-cn/dev/build.md                            |    6 +-
 docs/zh-cn/dev/impls/config-center.md              |   95 +
 docs/zh-cn/dev/impls/protocol.md                   |   12 +-
 .../committer-guide/apache-dubbo-page_dev.md       |    9 +-
 .../committer-guide/release-guide_dev.md           |  162 +-
 .../committer-guide/website-guide_dev.md           |    2 +-
 .../contributor-guide/dubbo-extension-guide_dev.md |    2 +-
 .../mailing-list-subscription-guide_dev.md         |   12 +-
 .../contributor-guide/new-contributor-guide_dev.md |   16 +-
 .../reporting-security-issues_dev.md               |    4 +-
 .../software-donation-guide_dev.md                 |    4 +-
 .../contributor-guide/test-coverage-guide_dev.md   |    2 +-
 docs/zh-cn/developers/developers_dev.md            |   33 +-
 docs/zh-cn/developers/guide_dev.md                 |   18 +-
 docs/zh-cn/developers/user-guide/faq_dev.md        |    4 +-
 docs/zh-cn/source_code_guide/export-service.md     |    2 +-
 docs/zh-cn/source_code_guide/loadbalance.md        |    4 +-
 docs/zh-cn/source_code_guide/refer-service.md      |    4 +-
 docs/zh-cn/user/SUMMARY.md                         |    1 +
 docs/zh-cn/user/benchmark-tool.md                  |    6 +-
 docs/zh-cn/user/configuration/annotation.md        |    2 +-
 docs/zh-cn/user/configuration/config-center.md     |    4 +-
 .../configuration/configuration-load-process.md    |    8 +-
 .../user/configuration/environment-variables.md    |   31 +
 docs/zh-cn/user/configuration/xml.md               |    2 +-
 docs/zh-cn/user/coveragence.md                     |    4 +-
 docs/zh-cn/user/demos/config-rule.md               |    9 +-
 docs/zh-cn/user/demos/parameter-validation.md      |    2 +-
 docs/zh-cn/user/demos/result-cache.md              |    2 +-
 docs/zh-cn/user/demos/routing-rule.md              |    4 +-
 docs/zh-cn/user/demos/set-host.md                  |    4 +-
 docs/zh-cn/user/demos/token-authorization.md       |   13 -
 docs/zh-cn/user/languages/erlang/reference.md      |   15 +
 docs/zh-cn/user/languages/erlang/serialization.md  |   21 +
 docs/zh-cn/user/languages/erlang/service.md        |   22 +
 docs/zh-cn/user/languages/erlang/start.md          |   60 +
 docs/zh-cn/user/maturity.md                        |   21 +-
 docs/zh-cn/user/recommend.md                       |    2 +-
 .../zh-cn/user/references/metadata/introduction.md |    2 +-
 docs/zh-cn/user/references/protocol/rest.md        |   28 +-
 docs/zh-cn/user/references/protocol/thrift.md      |    4 +-
 docs/zh-cn/user/references/registry/nacos.md       |  130 ++
 docs/zh-cn/user/references/registry/zookeeper.md   |    2 +
 docs/zh-cn/user/references/xml/dubbo-registry.md   |    2 +-
 docs/zh-cn/user/versions/version-270.md            |    4 +-
 en-us/blog/apachecon-na-2018.html                  |   10 +-
 en-us/blog/apachecon-na-2018.json                  |    6 -
 en-us/blog/download.html                           |   32 +-
 en-us/blog/download.json                           |    6 -
 en-us/blog/dubbo-101.html                          |    6 +-
 en-us/blog/dubbo-101.json                          |   10 -
 en-us/blog/dubbo-annotation.html                   |    2 +-
 en-us/blog/dubbo-annotation.json                   |   10 -
 ...o-basic-usage-dubbo-provider-configuration.html |    2 +-
 ...o-basic-usage-dubbo-provider-configuration.json |   10 -
 en-us/blog/dubbo-fescar.html                       |    2 +-
 en-us/blog/dubbo-fescar.json                       |   10 -
 en-us/blog/dubbo-generic-invoke.html               |    2 +-
 en-us/blog/dubbo-generic-invoke.json               |   10 -
 en-us/blog/dubbo-invoke.html                       |    2 +-
 en-us/blog/dubbo-invoke.json                       |   10 -
 en-us/blog/dubbo-k8s.html                          |    2 +-
 en-us/blog/dubbo-k8s.json                          |   10 -
 en-us/blog/dubbo-loadbalance.html                  |    2 +-
 en-us/blog/dubbo-loadbalance.json                  |   10 -
 en-us/blog/dubbo-meetup-beijing-may-12th-2018.html |    2 +-
 en-us/blog/dubbo-meetup-beijing-may-12th-2018.json |   10 -
 en-us/blog/dubbo-meetup-chengdu.html               |    2 +-
 en-us/blog/dubbo-meetup-chengdu.json               |   10 -
 en-us/blog/dubbo-meetup-hangzhou.html              |    2 +-
 en-us/blog/dubbo-meetup-hangzhou.json              |   10 -
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.html  |    2 +-
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.json  |   10 -
 en-us/blog/dubbo-meetup-shenzhen.html              |    2 +-
 en-us/blog/dubbo-meetup-shenzhen.json              |   10 -
 en-us/blog/dubbo-new-async.html                    |    8 +-
 en-us/blog/dubbo-new-async.json                    |   10 -
 en-us/blog/dubbo-zk.html                           |    2 +-
 en-us/blog/dubbo2-js.html                          |    6 +-
 en-us/blog/dubbo2-js.json                          |    4 +-
 en-us/blog/gsoc-2018.html                          |    8 +-
 en-us/blog/gsoc-2018.json                          |    6 -
 en-us/blog/index.html                              |    2 +-
 en-us/blog/introduction-to-dubbo-qos.html          |    2 +-
 en-us/blog/introduction-to-dubbo-spi-2.html        |    2 +-
 en-us/blog/introduction-to-dubbo-spi-2.json        |   10 -
 en-us/blog/introduction-to-dubbo-spi.html          |    2 +-
 en-us/blog/introduction-to-dubbo-spi.json          |   10 -
 en-us/blog/pinpoint.html                           |    2 +-
 en-us/blog/prepare-an-apache-release.html          |   55 +-
 en-us/blog/prepare-an-apache-release.json          |    9 -
 en-us/blog/qcon-beijing-2018.html                  |    8 +-
 en-us/blog/qcon-beijing-2018.json                  |    6 -
 en-us/blog/sentinel-introduction-for-dubbo.html    |    2 +-
 en-us/blog/sentinel-introduction-for-dubbo.json    |   10 -
 .../spring-boot-dubbo-start-stop-analysis.html     |   12 +-
 .../spring-boot-dubbo-start-stop-analysis.json     |   10 -
 en-us/blog/tracing-with-skywalking.html            |    4 +-
 en-us/blog/tracing-with-skywalking.json            |   10 -
 en-us/community/index.html                         |    2 +-
 en-us/docs/admin/README.html                       |    4 +-
 en-us/docs/admin/README.json                       |    6 -
 en-us/docs/admin/SUMMARY.html                      |    4 +-
 en-us/docs/admin/SUMMARY.json                      |    6 -
 en-us/docs/admin/install/admin-console.html        |    8 +-
 en-us/docs/admin/install/admin-console.json        |    6 -
 en-us/docs/admin/install/consumer-demo.html        |   20 +-
 en-us/docs/admin/install/consumer-demo.json        |    6 -
 en-us/docs/admin/install/introduction.html         |    4 +-
 en-us/docs/admin/install/introduction.json         |    6 -
 en-us/docs/admin/install/provider-demo.html        |   16 +-
 en-us/docs/admin/install/provider-demo.json        |    6 -
 en-us/docs/admin/install/redis.html                |    4 +-
 en-us/docs/admin/install/redis.json                |    6 -
 .../docs/admin/install/simple-monitor-center.html  |    4 +-
 .../docs/admin/install/simple-monitor-center.json  |    6 -
 .../docs/admin/install/simple-registry-center.html |    4 +-
 .../docs/admin/install/simple-registry-center.json |    6 -
 en-us/docs/admin/install/zookeeper.html            |    4 +-
 en-us/docs/admin/introduction.html                 |   10 +-
 en-us/docs/admin/introduction.json                 |    2 +-
 en-us/docs/admin/ops/dubbo-ops.html                |    4 +-
 en-us/docs/admin/ops/dubbo-ops.json                |    6 -
 en-us/docs/admin/ops/introduction.html             |    4 +-
 en-us/docs/admin/ops/introduction.json             |    6 -
 en-us/docs/admin/ops/pinpoint.html                 |    4 +-
 en-us/docs/admin/ops/skywalking.html               |    6 +-
 en-us/docs/admin/ops/skywalking.json               |    6 -
 en-us/docs/admin/ops/skywalking.md                 |  121 --
 en-us/docs/admin/serviceGovernance.html            |    4 +-
 en-us/docs/admin/serviceGovernance.json            |    6 -
 en-us/docs/admin/serviceSearch.html                |    4 +-
 en-us/docs/admin/serviceSearch.json                |    6 -
 en-us/docs/admin/serviceTest.html                  |    4 +-
 en-us/docs/admin/serviceTest.json                  |    6 -
 en-us/docs/dev/README.html                         |    4 +-
 en-us/docs/dev/README.json                         |    6 -
 en-us/docs/dev/SPI.html                            |    4 +-
 en-us/docs/dev/SUMMARY.html                        |    4 +-
 en-us/docs/dev/SUMMARY.json                        |    6 -
 en-us/docs/dev/TCK.html                            |    4 +-
 en-us/docs/dev/TCK.json                            |    6 -
 en-us/docs/dev/build.html                          |   10 +-
 en-us/docs/dev/build.json                          |    6 -
 en-us/docs/dev/checklist.html                      |    4 +-
 en-us/docs/dev/checklist.json                      |    6 -
 en-us/docs/dev/code-smell.html                     |    4 +-
 en-us/docs/dev/code-smell.json                     |    6 -
 en-us/docs/dev/coding.html                         |    4 +-
 en-us/docs/dev/coding.json                         |    6 -
 en-us/docs/dev/contract.html                       |    4 +-
 en-us/docs/dev/contract.json                       |    6 -
 en-us/docs/dev/contribution.html                   |    4 +-
 en-us/docs/dev/contribution.json                   |    6 -
 en-us/docs/dev/design.html                         |    4 +-
 en-us/docs/dev/design.json                         |    6 -
 en-us/docs/dev/implementation.html                 |    4 +-
 en-us/docs/dev/implementation.json                 |    6 -
 en-us/docs/dev/impls/cache.html                    |    4 +-
 en-us/docs/dev/impls/cluster.html                  |    4 +-
 en-us/docs/dev/impls/compiler.html                 |    4 +-
 en-us/docs/dev/impls/container.html                |    4 +-
 en-us/docs/dev/impls/dispatcher.html               |    4 +-
 en-us/docs/dev/impls/exchanger.html                |    4 +-
 en-us/docs/dev/impls/exporter-listener.html        |    4 +-
 en-us/docs/dev/impls/extension-factory.html        |    4 +-
 en-us/docs/dev/impls/filter.html                   |    4 +-
 en-us/docs/dev/impls/introduction.html             |    4 +-
 en-us/docs/dev/impls/introduction.json             |    6 -
 en-us/docs/dev/impls/invoker-listener.html         |    4 +-
 en-us/docs/dev/impls/load-balance.html             |    4 +-
 en-us/docs/dev/impls/logger-adapter.html           |    4 +-
 en-us/docs/dev/impls/merger.html                   |    4 +-
 en-us/docs/dev/impls/monitor.html                  |    4 +-
 en-us/docs/dev/impls/networker.html                |    4 +-
 en-us/docs/dev/impls/page.html                     |    4 +-
 en-us/docs/dev/impls/protocol.html                 |   14 +-
 en-us/docs/dev/impls/protocol.json                 |    2 +-
 en-us/docs/dev/impls/proxy-factory.html            |    4 +-
 en-us/docs/dev/impls/registry.html                 |    4 +-
 en-us/docs/dev/impls/remoting.html                 |    4 +-
 en-us/docs/dev/impls/router.html                   |    4 +-
 en-us/docs/dev/impls/serialize.html                |    4 +-
 en-us/docs/dev/impls/status-checker.html           |    4 +-
 en-us/docs/dev/impls/telnet-handler.html           |    4 +-
 en-us/docs/dev/impls/threadpool.html               |    4 +-
 en-us/docs/dev/impls/validation.html               |    4 +-
 en-us/docs/dev/introduction.html                   |    2 +-
 en-us/docs/dev/introduction.json                   |    6 -
 en-us/docs/dev/principals/code-detail.html         |    4 +-
 en-us/docs/dev/principals/code-detail.json         |    6 -
 en-us/docs/dev/principals/configuration.html       |    4 +-
 en-us/docs/dev/principals/configuration.json       |    6 -
 en-us/docs/dev/principals/dummy.html               |    4 +-
 en-us/docs/dev/principals/dummy.json               |    6 -
 en-us/docs/dev/principals/expansibility.html       |    4 +-
 en-us/docs/dev/principals/expansibility.json       |    6 -
 en-us/docs/dev/principals/extension.html           |    4 +-
 en-us/docs/dev/principals/extension.json           |    6 -
 en-us/docs/dev/principals/general-knowledge.html   |    4 +-
 en-us/docs/dev/principals/general-knowledge.json   |    6 -
 en-us/docs/dev/principals/introduction.html        |    4 +-
 en-us/docs/dev/principals/introduction.json        |    6 -
 en-us/docs/dev/principals/robustness.html          |    4 +-
 en-us/docs/dev/principals/robustness.json          |    6 -
 en-us/docs/dev/release.html                        |    4 +-
 en-us/docs/dev/release.json                        |    6 -
 .../committer-guide/apache-dubbo-page_dev.html     |   12 +-
 .../committer-guide/apache-dubbo-page_dev.json     |    6 -
 .../committer-guide/label-an-issue-guide_dev.html  |    6 +-
 .../committer-guide/label-an-issue-guide_dev.json  |    6 -
 .../committer-guide/new-committer-guide_dev.html   |    4 +-
 .../committer-guide/new-committer-guide_dev.json   |    6 -
 .../developers/committer-guide/release-guide.html  |   34 -
 .../developers/committer-guide/release-guide.json  |    6 -
 .../committer-guide/release-guide_dev.html         |  157 +-
 .../committer-guide/release-guide_dev.json         |    2 +-
 .../committer-guide/website-guide_dev.html         |    6 +-
 .../committer-guide/website-guide_dev.json         |    6 -
 .../contributor-guide/become-a-committer_dev.html  |    4 +-
 .../contributor-guide/become-a-committer_dev.json  |    6 -
 .../contributor-guide/cla-signing-guide_dev.html   |    4 +-
 .../contributor-guide/cla-signing-guide_dev.json   |    6 -
 .../dubbo-extension-guide_dev.html                 |    6 +-
 .../dubbo-extension-guide_dev.json                 |    6 -
 .../mailing-list-subscription-guide_dev.html       |   14 +-
 .../mailing-list-subscription-guide_dev.json       |    6 -
 .../new-contributor-guide_dev.html                 |   40 +-
 .../new-contributor-guide_dev.json                 |    6 -
 .../reporting-security-issues_dev.html             |    6 +-
 .../reporting-security-issues_dev.json             |    6 -
 .../software-donation-guide_dev.html               |    8 +-
 .../software-donation-guide_dev.json               |    6 -
 .../contributor-guide/test-coverage-guide_dev.html |    6 +-
 .../contributor-guide/test-coverage-guide_dev.json |    6 -
 en-us/docs/developers/developers_dev.html          |   67 +-
 en-us/docs/developers/developers_dev.json          |    6 -
 en-us/docs/developers/faq.html                     |   54 -
 en-us/docs/developers/faq.json                     |    6 -
 en-us/docs/developers/guide_dev.html               |   22 +-
 en-us/docs/developers/guide_dev.json               |    6 -
 en-us/docs/developers/user-guide/faq_dev.html      |    8 +-
 en-us/docs/developers/user-guide/faq_dev.json      |    6 -
 en-us/docs/user/README.html                        |    4 +-
 en-us/docs/user/README.json                        |    6 -
 en-us/docs/user/SUMMARY.html                       |    6 +-
 en-us/docs/user/SUMMARY.json                       |    6 -
 en-us/docs/user/benchmark-tool.html                |   10 +-
 en-us/docs/user/benchmark-tool.json                |    6 -
 en-us/docs/user/best-practice.html                 |    4 +-
 en-us/docs/user/best-practice.json                 |    6 -
 en-us/docs/user/capacity-plan.html                 |    4 +-
 en-us/docs/user/capacity-plan.json                 |    6 -
 en-us/docs/user/configuration/annotation.html      |    4 +-
 en-us/docs/user/configuration/annotation.json      |    6 -
 en-us/docs/user/configuration/api.html             |    4 +-
 en-us/docs/user/configuration/api.json             |    6 -
 en-us/docs/user/configuration/index.html           |    4 +-
 en-us/docs/user/configuration/index.json           |    6 -
 en-us/docs/user/configuration/properties.html      |    4 +-
 en-us/docs/user/configuration/xml.html             |    6 +-
 en-us/docs/user/configuration/xml.json             |    2 +-
 en-us/docs/user/coveragence.html                   |    6 +-
 en-us/docs/user/coveragence.json                   |    6 -
 en-us/docs/user/demos/accesslog.html               |    4 +-
 en-us/docs/user/demos/accesslog.json               |    6 -
 en-us/docs/user/demos/async-call.html              |    4 +-
 en-us/docs/user/demos/async-call.json              |    6 -
 en-us/docs/user/demos/attachment.html              |    4 +-
 en-us/docs/user/demos/attachment.json              |    6 -
 en-us/docs/user/demos/callback-parameter.html      |    4 +-
 en-us/docs/user/demos/callback-parameter.json      |    6 -
 en-us/docs/user/demos/concurrency-control.html     |    4 +-
 en-us/docs/user/demos/concurrency-control.json     |    6 -
 en-us/docs/user/demos/config-connections.html      |    4 +-
 en-us/docs/user/demos/config-connections.json      |    6 -
 en-us/docs/user/demos/config-rule.html             |    4 +-
 en-us/docs/user/demos/config-rule.json             |    6 -
 en-us/docs/user/demos/context.html                 |    4 +-
 en-us/docs/user/demos/context.json                 |    6 -
 en-us/docs/user/demos/delay-publish.html           |    4 +-
 en-us/docs/user/demos/delay-publish.json           |    6 -
 en-us/docs/user/demos/distributed-transaction.html |    4 +-
 en-us/docs/user/demos/distributed-transaction.json |    6 -
 en-us/docs/user/demos/dump.html                    |    4 +-
 en-us/docs/user/demos/echo-service.html            |    4 +-
 en-us/docs/user/demos/echo-service.json            |    6 -
 en-us/docs/user/demos/events-notify.html           |    4 +-
 en-us/docs/user/demos/events-notify.json           |    6 -
 en-us/docs/user/demos/explicit-target.html         |    4 +-
 en-us/docs/user/demos/fault-tolerent-strategy.html |    4 +-
 en-us/docs/user/demos/fault-tolerent-strategy.json |    6 -
 en-us/docs/user/demos/generic-reference.html       |    4 +-
 en-us/docs/user/demos/generic-reference.json       |    6 -
 en-us/docs/user/demos/generic-service.html         |    4 +-
 en-us/docs/user/demos/generic-service.json         |    6 -
 en-us/docs/user/demos/graceful-shutdown.html       |    4 +-
 en-us/docs/user/demos/group-merger.html            |    6 +-
 en-us/docs/user/demos/group-merger.json            |    6 -
 en-us/docs/user/demos/hostname-binding.html        |    4 +-
 en-us/docs/user/demos/index.html                   |    4 +-
 en-us/docs/user/demos/index.json                   |    6 -
 en-us/docs/user/demos/introduction.html            |    4 +-
 en-us/docs/user/demos/introduction.json            |    6 -
 en-us/docs/user/demos/lazy-connect.html            |    4 +-
 en-us/docs/user/demos/lazy-connect.json            |    6 -
 en-us/docs/user/demos/loadbalance.html             |    4 +-
 en-us/docs/user/demos/loadbalance.json             |    6 -
 en-us/docs/user/demos/local-call.html              |    6 +-
 en-us/docs/user/demos/local-call.json              |    2 +-
 en-us/docs/user/demos/local-mock.html              |    4 +-
 en-us/docs/user/demos/local-mock.json              |    6 -
 en-us/docs/user/demos/local-stub.html              |    4 +-
 en-us/docs/user/demos/local-stub.json              |    6 -
 en-us/docs/user/demos/logger-strategy.html         |    4 +-
 en-us/docs/user/demos/multi-protocols.html         |    4 +-
 en-us/docs/user/demos/multi-registry.html          |    4 +-
 en-us/docs/user/demos/multi-versions.html          |    4 +-
 en-us/docs/user/demos/multi-versions.json          |    6 -
 en-us/docs/user/demos/netty4.html                  |    4 +-
 en-us/docs/user/demos/netty4.json                  |    6 -
 en-us/docs/user/demos/parameter-validation.html    |    6 +-
 en-us/docs/user/demos/parameter-validation.json    |    6 -
 en-us/docs/user/demos/preflight-check.html         |    4 +-
 en-us/docs/user/demos/reference-config-cache.html  |    4 +-
 en-us/docs/user/demos/reference-config-cache.json  |    6 -
 en-us/docs/user/demos/registry-only.html           |    4 +-
 en-us/docs/user/demos/registry-only.json           |    6 -
 en-us/docs/user/demos/result-cache.html            |    6 +-
 en-us/docs/user/demos/result-cache.json            |    6 -
 en-us/docs/user/demos/routing-rule.html            |    4 +-
 en-us/docs/user/demos/routing-rule.json            |    6 -
 en-us/docs/user/demos/serialization.html           |    4 +-
 en-us/docs/user/demos/serialization.json           |    6 -
 en-us/docs/user/demos/service-container.html       |    4 +-
 en-us/docs/user/demos/service-downgrade.html       |    4 +-
 en-us/docs/user/demos/service-downgrade.json       |    6 -
 en-us/docs/user/demos/service-group.html           |    4 +-
 en-us/docs/user/demos/service-group.json           |    6 -
 en-us/docs/user/demos/static-service.html          |    4 +-
 en-us/docs/user/demos/static-service.json          |    6 -
 en-us/docs/user/demos/stickiness.html              |    4 +-
 en-us/docs/user/demos/stickiness.json              |    6 -
 en-us/docs/user/demos/subscribe-only.html          |    4 +-
 en-us/docs/user/demos/subscribe-only.json          |    6 -
 en-us/docs/user/demos/thread-model.html            |    4 +-
 en-us/docs/user/demos/thread-model.json            |    6 -
 en-us/docs/user/demos/token-authorization.html     |    4 +-
 en-us/docs/user/demos/token-authorization.json     |    6 -
 en-us/docs/user/dependencies.html                  |    4 +-
 en-us/docs/user/dependencies.json                  |    6 -
 en-us/docs/user/maturity.html                      |  214 +-
 en-us/docs/user/maturity.json                      |    6 -
 en-us/docs/user/perf-test.html                     |    4 +-
 en-us/docs/user/perf-test.json                     |    6 -
 en-us/docs/user/preface/architecture.html          |    8 +-
 en-us/docs/user/preface/architecture.json          |    6 -
 en-us/docs/user/preface/background.html            |    4 +-
 en-us/docs/user/preface/background.json            |    6 -
 en-us/docs/user/preface/index.html                 |    4 +-
 en-us/docs/user/preface/index.json                 |    6 -
 en-us/docs/user/preface/requirements.html          |    6 +-
 en-us/docs/user/preface/requirements.json          |    6 -
 en-us/docs/user/preface/usage.html                 |    4 +-
 en-us/docs/user/preface/usage.json                 |    6 -
 en-us/docs/user/quick-start.html                   |    4 +-
 en-us/docs/user/recommend.html                     |    4 +-
 en-us/docs/user/recommend.json                     |    6 -
 en-us/docs/user/references/api.html                |    4 +-
 en-us/docs/user/references/api.json                |    6 -
 en-us/docs/user/references/maven.html              |    4 +-
 en-us/docs/user/references/maven.json              |    6 -
 en-us/docs/user/references/protocol/dubbo.html     |    4 +-
 en-us/docs/user/references/protocol/dubbo.json     |    6 -
 en-us/docs/user/references/protocol/hessian.html   |    4 +-
 en-us/docs/user/references/protocol/hessian.json   |    6 -
 en-us/docs/user/references/protocol/http.html      |    4 +-
 en-us/docs/user/references/protocol/http.json      |    6 -
 .../user/references/protocol/introduction.html     |    4 +-
 .../user/references/protocol/introduction.json     |    6 -
 en-us/docs/user/references/protocol/memcached.html |    4 +-
 en-us/docs/user/references/protocol/memcached.json |    6 -
 en-us/docs/user/references/protocol/redis.html     |    4 +-
 en-us/docs/user/references/protocol/redis.json     |    6 -
 en-us/docs/user/references/protocol/rest.html      |    4 +-
 en-us/docs/user/references/protocol/rest.json      |    6 -
 en-us/docs/user/references/protocol/rmi.html       |    4 +-
 en-us/docs/user/references/protocol/thrift.html    |    6 +-
 en-us/docs/user/references/protocol/thrift.json    |    6 -
 .../docs/user/references/protocol/webservice.html  |    4 +-
 .../docs/user/references/protocol/webservice.json  |    6 -
 en-us/docs/user/references/qos.html                |    4 +-
 .../user/references/registry/introduction.html     |    4 +-
 .../user/references/registry/introduction.json     |    6 -
 en-us/docs/user/references/registry/multicast.html |    4 +-
 en-us/docs/user/references/registry/multicast.json |    6 -
 en-us/docs/user/references/registry/redis.html     |    4 +-
 en-us/docs/user/references/registry/redis.json     |    6 -
 en-us/docs/user/references/registry/simple.html    |    4 +-
 en-us/docs/user/references/registry/zookeeper.html |    5 +-
 en-us/docs/user/references/registry/zookeeper.json |    6 -
 en-us/docs/user/references/telnet.html             |    4 +-
 en-us/docs/user/references/telnet.json             |    6 -
 .../user/references/xml/dubbo-application.html     |    4 +-
 .../user/references/xml/dubbo-application.json     |    6 -
 en-us/docs/user/references/xml/dubbo-argument.html |    4 +-
 en-us/docs/user/references/xml/dubbo-argument.json |    6 -
 en-us/docs/user/references/xml/dubbo-consumer.html |    4 +-
 en-us/docs/user/references/xml/dubbo-consumer.json |    6 -
 en-us/docs/user/references/xml/dubbo-method.html   |    4 +-
 en-us/docs/user/references/xml/dubbo-method.json   |    6 -
 en-us/docs/user/references/xml/dubbo-module.html   |    4 +-
 en-us/docs/user/references/xml/dubbo-module.json   |    6 -
 en-us/docs/user/references/xml/dubbo-monitor.html  |    4 +-
 en-us/docs/user/references/xml/dubbo-monitor.json  |    6 -
 .../docs/user/references/xml/dubbo-parameter.html  |    4 +-
 .../docs/user/references/xml/dubbo-parameter.json  |    6 -
 en-us/docs/user/references/xml/dubbo-protocol.html |    4 +-
 en-us/docs/user/references/xml/dubbo-protocol.json |    6 -
 en-us/docs/user/references/xml/dubbo-provider.html |    4 +-
 en-us/docs/user/references/xml/dubbo-provider.json |    6 -
 .../docs/user/references/xml/dubbo-reference.html  |    4 +-
 .../docs/user/references/xml/dubbo-reference.json  |    6 -
 en-us/docs/user/references/xml/dubbo-registry.html |    6 +-
 en-us/docs/user/references/xml/dubbo-registry.json |    6 -
 en-us/docs/user/references/xml/dubbo-service.html  |    4 +-
 en-us/docs/user/references/xml/dubbo-service.json  |    6 -
 en-us/docs/user/references/xml/introduction.html   |    4 +-
 en-us/docs/user/references/xml/introduction.json   |    6 -
 en-us/docs/user/rest.html                          |    4 +-
 en-us/docs/user/rest.json                          |    6 -
 en-us/docs/user/simple-monitor.html                |    4 +-
 en-us/docs/user/simple-monitor.json                |    6 -
 en-us/download/index.html                          |   32 -
 en-us/ecology/index.html                           |   32 -
 en-us/index.html                                   |    2 +-
 img/blog/dockerhub-build-rules.png                 |  Bin 0 -> 154981 bytes
 img/configcenter_nacos_model.jpg                   |  Bin 0 -> 78352 bytes
 img/configcenter_zk_model.jpg                      |  Bin 0 -> 189160 bytes
 img/configcenter_zk_properties.jpg                 |  Bin 0 -> 92946 bytes
 img/configcenter_zk_rule.jpg                       |  Bin 0 -> 131167 bytes
 img/configcenter_zk_singleitem.jpg                 |  Bin 0 -> 53837 bytes
 index.html                                         |   33 -
 md_json/blog.json                                  |  714 -------
 md_json/docs.json                                  | 2050 --------------------
 package.json                                       |    7 +-
 site_config/blog.js                                |   21 +
 site_config/community.jsx                          |   60 +-
 site_config/docs.js                                |   60 +-
 site_config/home.jsx                               |   19 +-
 site_config/site.js                                |   16 +-
 src/pages/home/index.jsx                           |    8 +-
 zh-cn/blog/Configuration Conclude.html             |  189 --
 zh-cn/blog/Configuration Conclude.json             |    6 -
 zh-cn/blog/Guides for upgrading to 2.7.x.html      |  342 ----
 zh-cn/blog/Guides for upgrading to 2.7.x.json      |    6 -
 zh-cn/blog/Guides-for-upgrading-to-27x.html        |  342 ----
 zh-cn/blog/Guides-for-upgrading-to-27x.json        |    6 -
 zh-cn/blog/apachecon-na-2018.html                  |    8 +-
 zh-cn/blog/apachecon-na-2018.json                  |    6 -
 zh-cn/blog/download.html                           |   26 +-
 zh-cn/blog/download.json                           |    6 -
 zh-cn/blog/dubbo-101.html                          |    2 +-
 zh-cn/blog/dubbo-101.json                          |   10 -
 zh-cn/blog/dubbo-27-features.html                  |    4 +-
 zh-cn/blog/dubbo-27-features.json                  |   10 -
 zh-cn/blog/dubbo-admin.html                        |    4 +-
 zh-cn/blog/dubbo-admin.json                        |    2 +-
 zh-cn/blog/dubbo-annotation-driven.html            |    2 +-
 zh-cn/blog/dubbo-annotation.html                   |    2 +-
 zh-cn/blog/dubbo-annotation.json                   |   10 -
 ...o-basic-usage-dubbo-consumer-configuration.html |    2 +-
 ...o-basic-usage-dubbo-consumer-configuration.json |    6 -
 ...o-basic-usage-dubbo-provider-configuration.html |    2 +-
 ...o-basic-usage-dubbo-provider-configuration.json |   10 -
 zh-cn/blog/dubbo-cluster-error-handling.html       |    2 +-
 zh-cn/blog/dubbo-cluster-error-handling.json       |   10 -
 zh-cn/blog/dubbo-compatible.html                   |    2 +-
 zh-cn/blog/dubbo-compatible.json                   |   10 -
 zh-cn/blog/dubbo-context-information.html          |    2 +-
 zh-cn/blog/dubbo-context-information.json          |   10 -
 zh-cn/blog/dubbo-contribue-to-opensource.html      |  157 --
 zh-cn/blog/dubbo-contribue-to-opensource.json      |   10 -
 zh-cn/blog/dubbo-copywriting-style.html            |    2 +-
 zh-cn/blog/dubbo-copywriting-style.json            |   10 -
 zh-cn/blog/dubbo-echo-test.html                    |    2 +-
 zh-cn/blog/dubbo-echo-test.json                    |    6 -
 zh-cn/blog/dubbo-externalized-configuration.html   |    2 +-
 zh-cn/blog/dubbo-fescar.html                       |    2 +-
 zh-cn/blog/dubbo-fescar.json                       |   10 -
 zh-cn/blog/dubbo-generic-invoke.html               |    2 +-
 zh-cn/blog/dubbo-generic-invoke.json               |   10 -
 zh-cn/blog/dubbo-gracefully-shutdown.html          |    2 +-
 zh-cn/blog/dubbo-gracefully-shutdown.json          |   10 -
 zh-cn/blog/dubbo-heartbeat-design.html             |    2 +-
 zh-cn/blog/dubbo-heartbeat-design.json             |   10 -
 zh-cn/blog/dubbo-integrate-with-hystrix.html       |    6 +-
 zh-cn/blog/dubbo-integrate-with-hystrix.json       |   10 -
 zh-cn/blog/dubbo-invoke.html                       |    2 +-
 zh-cn/blog/dubbo-invoke.json                       |   10 -
 zh-cn/blog/dubbo-k8s.html                          |    2 +-
 zh-cn/blog/dubbo-k8s.json                          |   10 -
 zh-cn/blog/dubbo-loadbalance.html                  |    2 +-
 zh-cn/blog/dubbo-loadbalance.json                  |   10 -
 zh-cn/blog/dubbo-local-call.html                   |    4 +-
 zh-cn/blog/dubbo-local-call.json                   |    6 -
 zh-cn/blog/dubbo-meet-arthas.html                  |    6 +-
 zh-cn/blog/dubbo-meet-arthas.json                  |   10 -
 zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.html |    2 +-
 zh-cn/blog/dubbo-meetup-beijing-may-12th-2018.json |   10 -
 zh-cn/blog/dubbo-meetup-chengdu.html               |    2 +-
 zh-cn/blog/dubbo-meetup-chengdu.json               |   10 -
 zh-cn/blog/dubbo-meetup-hangzhou.html              |    2 +-
 zh-cn/blog/dubbo-meetup-hangzhou.json              |   10 -
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.html  |    2 +-
 .../blog/dubbo-meetup-shanghai-jun-23rd-2018.json  |   10 -
 zh-cn/blog/dubbo-meetup-shenzhen.html              |    2 +-
 zh-cn/blog/dubbo-meetup-shenzhen.json              |   10 -
 zh-cn/blog/dubbo-mesh-in-thinking.html             |    2 +-
 zh-cn/blog/dubbo-mesh-in-thinking.json             |   10 -
 zh-cn/blog/dubbo-mesh-service-mesh-exploring.html  |    2 +-
 zh-cn/blog/dubbo-mesh-service-mesh-exploring.json  |   10 -
 zh-cn/blog/dubbo-new-async.html                    |    8 +-
 zh-cn/blog/dubbo-new-async.json                    |   10 -
 zh-cn/blog/dubbo-protocol.html                     |    2 +-
 zh-cn/blog/dubbo-protocol.json                     |   10 -
 zh-cn/blog/dubbo-registry-nacos-integration.html   |   12 +-
 zh-cn/blog/dubbo-registry-nacos-integration.json   |    2 +-
 zh-cn/blog/dubbo-rest.html                         |    2 +-
 zh-cn/blog/dubbo-stub-mock.html                    |    8 +-
 zh-cn/blog/dubbo-stub-mock.json                    |    6 -
 zh-cn/blog/dubbo-zk.html                           |    2 +-
 zh-cn/blog/dubbo2-js.html                          |    4 +-
 zh-cn/blog/dubbo2-js.json                          |    2 +-
 zh-cn/blog/dubboAsync_client.html                  |    2 +-
 zh-cn/blog/dubboAsync_client.json                  |   10 -
 zh-cn/blog/dubboAsync_server.html                  |    2 +-
 zh-cn/blog/dubboAsync_server.json                  |   10 -
 zh-cn/blog/first-dubbo-filter.html                 |    2 +-
 zh-cn/blog/first-dubbo-filter.json                 |    6 -
 zh-cn/blog/how-to-involve-dubbo-community.html     |   12 +-
 zh-cn/blog/how-to-involve-dubbo-community.json     |   10 -
 zh-cn/blog/index.html                              |    2 +-
 zh-cn/blog/introduction-to-dubbo-qos.html          |    2 +-
 zh-cn/blog/introduction-to-dubbo-spi-2.html        |    2 +-
 zh-cn/blog/introduction-to-dubbo-spi-2.json        |   10 -
 zh-cn/blog/introduction-to-dubbo-spi.html          |    2 +-
 zh-cn/blog/introduction-to-dubbo-spi.json          |   10 -
 zh-cn/blog/introduction-to-dubbo-url.html          |    4 +-
 zh-cn/blog/introduction-to-dubbo-url.json          |   10 -
 zh-cn/blog/meet-dubbo.html                         |    2 +-
 zh-cn/blog/meet-dubbo.json                         |   10 -
 zh-cn/blog/optimization-branch-prediction.html     |    4 +-
 zh-cn/blog/optimization-branch-prediction.json     |    8 -
 zh-cn/blog/pinpoint.html                           |    2 +-
 zh-cn/blog/prepare-an-apache-release.html          |   50 +-
 zh-cn/blog/prepare-an-apache-release.json          |    9 -
 zh-cn/blog/qcon-beijing-2018.html                  |    8 +-
 zh-cn/blog/qcon-beijing-2018.json                  |    6 -
 zh-cn/blog/sentinel-introduction-for-dubbo.html    |    4 +-
 zh-cn/blog/sentinel-introduction-for-dubbo.json    |   10 -
 zh-cn/blog/service-and-version.html                |    2 +-
 zh-cn/blog/service-and-version.json                |    6 -
 zh-cn/blog/service-test.html                       |    2 +-
 zh-cn/blog/service-test.json                       |    6 -
 .../spring-boot-dubbo-start-stop-analysis.html     |   12 +-
 .../spring-boot-dubbo-start-stop-analysis.json     |   10 -
 zh-cn/blog/test-verification.html                  |    2 +-
 zh-cn/blog/test-verification.json                  |    6 -
 zh-cn/blog/tracing-with-skywalking.html            |    2 +-
 zh-cn/blog/tracing-with-skywalking.json            |   10 -
 zh-cn/blog/use-zipkin-in-dubbo.html                |    2 +-
 zh-cn/blog/use-zipkin-in-dubbo.json                |   10 -
 zh-cn/community/index.html                         |    2 +-
 zh-cn/docs/admin/README.html                       |    4 +-
 zh-cn/docs/admin/README.json                       |    6 -
 zh-cn/docs/admin/SUMMARY.html                      |    4 +-
 zh-cn/docs/admin/SUMMARY.json                      |    6 -
 zh-cn/docs/admin/install/admin-console.html        |    8 +-
 zh-cn/docs/admin/install/admin-console.json        |    6 -
 zh-cn/docs/admin/install/consumer-demo.html        |    8 +-
 zh-cn/docs/admin/install/consumer-demo.json        |    6 -
 zh-cn/docs/admin/install/introduction.html         |    4 +-
 zh-cn/docs/admin/install/introduction.json         |    6 -
 zh-cn/docs/admin/install/provider-demo.html        |    8 +-
 zh-cn/docs/admin/install/provider-demo.json        |    6 -
 zh-cn/docs/admin/install/redis.html                |    4 +-
 zh-cn/docs/admin/install/redis.json                |    6 -
 .../docs/admin/install/simple-monitor-center.html  |    4 +-
 .../docs/admin/install/simple-monitor-center.json  |    6 -
 .../docs/admin/install/simple-registry-center.html |    4 +-
 .../docs/admin/install/simple-registry-center.json |    6 -
 zh-cn/docs/admin/install/zookeeper.html            |    4 +-
 zh-cn/docs/admin/introduction.html                 |   10 +-
 zh-cn/docs/admin/introduction.json                 |    2 +-
 zh-cn/docs/admin/ops/dubbo-ops.html                |    4 +-
 zh-cn/docs/admin/ops/dubbo-ops.json                |    6 -
 zh-cn/docs/admin/ops/introduction.html             |    4 +-
 zh-cn/docs/admin/ops/introduction.json             |    6 -
 zh-cn/docs/admin/ops/pinpoint.html                 |    4 +-
 zh-cn/docs/admin/ops/skywalking.html               |    4 +-
 zh-cn/docs/admin/ops/skywalking.json               |    6 -
 zh-cn/docs/admin/serviceGovernance.html            |    4 +-
 zh-cn/docs/admin/serviceGovernance.json            |    6 -
 zh-cn/docs/admin/serviceSearch.html                |    4 +-
 zh-cn/docs/admin/serviceSearch.json                |    6 -
 zh-cn/docs/admin/serviceTest.html                  |    4 +-
 zh-cn/docs/admin/serviceTest.json                  |    6 -
 zh-cn/docs/dev/README.html                         |    4 +-
 zh-cn/docs/dev/README.json                         |    6 -
 zh-cn/docs/dev/SPI.html                            |    4 +-
 zh-cn/docs/dev/SUMMARY.html                        |    5 +-
 zh-cn/docs/dev/SUMMARY.json                        |    6 -
 zh-cn/docs/dev/TCK.html                            |    4 +-
 zh-cn/docs/dev/TCK.json                            |    6 -
 zh-cn/docs/dev/build.html                          |   10 +-
 zh-cn/docs/dev/build.json                          |    6 -
 zh-cn/docs/dev/checklist.html                      |    4 +-
 zh-cn/docs/dev/checklist.json                      |    6 -
 zh-cn/docs/dev/code-smell.html                     |    4 +-
 zh-cn/docs/dev/code-smell.json                     |    6 -
 zh-cn/docs/dev/coding.html                         |    4 +-
 zh-cn/docs/dev/coding.json                         |    6 -
 zh-cn/docs/dev/contract.html                       |    4 +-
 zh-cn/docs/dev/contract.json                       |    6 -
 zh-cn/docs/dev/contribution.html                   |    4 +-
 zh-cn/docs/dev/contribution.json                   |    6 -
 zh-cn/docs/dev/design.html                         |    4 +-
 zh-cn/docs/dev/design.json                         |    6 -
 zh-cn/docs/dev/implementation.html                 |    4 +-
 zh-cn/docs/dev/implementation.json                 |    6 -
 zh-cn/docs/dev/impls/cache.html                    |    4 +-
 zh-cn/docs/dev/impls/cluster.html                  |    4 +-
 zh-cn/docs/dev/impls/compiler.html                 |    4 +-
 zh-cn/docs/dev/impls/container.html                |    4 +-
 zh-cn/docs/dev/impls/dispatcher.html               |    4 +-
 zh-cn/docs/dev/impls/exchanger.html                |    4 +-
 zh-cn/docs/dev/impls/exporter-listener.html        |    4 +-
 zh-cn/docs/dev/impls/extension-factory.html        |    4 +-
 zh-cn/docs/dev/impls/filter.html                   |    4 +-
 zh-cn/docs/dev/impls/introduction.html             |    4 +-
 zh-cn/docs/dev/impls/introduction.json             |    6 -
 zh-cn/docs/dev/impls/invoker-listener.html         |    4 +-
 zh-cn/docs/dev/impls/load-balance.html             |    4 +-
 zh-cn/docs/dev/impls/logger-adapter.html           |    4 +-
 zh-cn/docs/dev/impls/merger.html                   |    4 +-
 zh-cn/docs/dev/impls/monitor.html                  |    4 +-
 zh-cn/docs/dev/impls/networker.html                |    4 +-
 zh-cn/docs/dev/impls/page.html                     |    4 +-
 zh-cn/docs/dev/impls/protocol.html                 |   14 +-
 zh-cn/docs/dev/impls/protocol.json                 |    2 +-
 zh-cn/docs/dev/impls/proxy-factory.html            |    4 +-
 zh-cn/docs/dev/impls/registry.html                 |    4 +-
 zh-cn/docs/dev/impls/remoting.html                 |    4 +-
 zh-cn/docs/dev/impls/router.html                   |    4 +-
 zh-cn/docs/dev/impls/serialize.html                |    4 +-
 zh-cn/docs/dev/impls/status-checker.html           |    4 +-
 zh-cn/docs/dev/impls/telnet-handler.html           |    4 +-
 zh-cn/docs/dev/impls/threadpool.html               |    4 +-
 zh-cn/docs/dev/impls/validation.html               |    4 +-
 zh-cn/docs/dev/introduction.html                   |    4 +-
 zh-cn/docs/dev/introduction.json                   |    6 -
 zh-cn/docs/dev/principals/code-detail.html         |    4 +-
 zh-cn/docs/dev/principals/code-detail.json         |    6 -
 zh-cn/docs/dev/principals/configuration.html       |    4 +-
 zh-cn/docs/dev/principals/configuration.json       |    6 -
 zh-cn/docs/dev/principals/dummy.html               |    4 +-
 zh-cn/docs/dev/principals/dummy.json               |    6 -
 zh-cn/docs/dev/principals/expansibility.html       |    4 +-
 zh-cn/docs/dev/principals/expansibility.json       |    6 -
 zh-cn/docs/dev/principals/extension.html           |    4 +-
 zh-cn/docs/dev/principals/extension.json           |    6 -
 zh-cn/docs/dev/principals/general-knowledge.html   |    4 +-
 zh-cn/docs/dev/principals/general-knowledge.json   |    6 -
 zh-cn/docs/dev/principals/introduction.html        |    4 +-
 zh-cn/docs/dev/principals/introduction.json        |    6 -
 zh-cn/docs/dev/principals/robustness.html          |    4 +-
 zh-cn/docs/dev/principals/robustness.json          |    6 -
 zh-cn/docs/dev/release.html                        |    4 +-
 zh-cn/docs/dev/release.json                        |    6 -
 .../committer-guide/apache-dubbo-page_dev.html     |   16 +-
 .../committer-guide/apache-dubbo-page_dev.json     |    6 -
 .../committer-guide/label-an-issue-guide_dev.html  |    4 +-
 .../committer-guide/label-an-issue-guide_dev.json  |    6 -
 .../committer-guide/new-committer-guide_dev.html   |    4 +-
 .../committer-guide/new-committer-guide_dev.json   |    6 -
 .../developers/committer-guide/release-guide.html  |   34 -
 .../developers/committer-guide/release-guide.json  |    6 -
 .../committer-guide/release-guide_dev.html         |  156 +-
 .../committer-guide/release-guide_dev.json         |    2 +-
 .../committer-guide/website-guide_dev.html         |    6 +-
 .../committer-guide/website-guide_dev.json         |    6 -
 .../contributor-guide/become-a-committer_dev.html  |    4 +-
 .../contributor-guide/become-a-committer_dev.json  |    6 -
 .../contributor-guide/cla-signing-guide_dev.html   |    4 +-
 .../contributor-guide/cla-signing-guide_dev.json   |    6 -
 .../dubbo-extension-guide_dev.html                 |    6 +-
 .../dubbo-extension-guide_dev.json                 |    6 -
 .../mailing-list-subscription-guide_dev.html       |   14 +-
 .../mailing-list-subscription-guide_dev.json       |    6 -
 .../new-contributor-guide_dev.html                 |   18 +-
 .../new-contributor-guide_dev.json                 |    6 -
 .../reporting-security-issues_dev.html             |    6 +-
 .../reporting-security-issues_dev.json             |    6 -
 .../software-donation-guide_dev.html               |    8 +-
 .../software-donation-guide_dev.json               |    6 -
 .../contributor-guide/test-coverage-guide_dev.html |    6 +-
 .../contributor-guide/test-coverage-guide_dev.json |    6 -
 zh-cn/docs/developers/developers_dev.html          |   67 +-
 zh-cn/docs/developers/developers_dev.json          |    6 -
 zh-cn/docs/developers/guide_dev.html               |   22 +-
 zh-cn/docs/developers/guide_dev.json               |    6 -
 zh-cn/docs/developers/user-guide/faq_dev.html      |    8 +-
 zh-cn/docs/developers/user-guide/faq_dev.json      |    6 -
 .../docs/source_code_guide/adaptive-extension.html |    4 +-
 .../docs/source_code_guide/adaptive-extension.json |   10 -
 zh-cn/docs/source_code_guide/cluster.html          |    4 +-
 zh-cn/docs/source_code_guide/cluster.json          |   10 -
 zh-cn/docs/source_code_guide/directory.html        |    4 +-
 zh-cn/docs/source_code_guide/directory.json        |   10 -
 zh-cn/docs/source_code_guide/dubbo-spi.html        |    4 +-
 zh-cn/docs/source_code_guide/dubbo-spi.json        |   10 -
 zh-cn/docs/source_code_guide/export-service.html   |    6 +-
 zh-cn/docs/source_code_guide/export-service.json   |   10 -
 zh-cn/docs/source_code_guide/loadbalance.html      |    8 +-
 zh-cn/docs/source_code_guide/loadbalance.json      |   10 -
 zh-cn/docs/source_code_guide/refer-service.html    |    8 +-
 zh-cn/docs/source_code_guide/refer-service.json    |   10 -
 zh-cn/docs/source_code_guide/router.html           |    4 +-
 zh-cn/docs/source_code_guide/router.json           |   10 -
 .../service-invoking-process.html                  |    4 +-
 .../service-invoking-process.json                  |   10 -
 zh-cn/docs/user/README.html                        |    4 +-
 zh-cn/docs/user/README.json                        |    6 -
 zh-cn/docs/user/SUMMARY.html                       |    5 +-
 zh-cn/docs/user/SUMMARY.json                       |    6 -
 zh-cn/docs/user/benchmark-tool.html                |   10 +-
 zh-cn/docs/user/benchmark-tool.json                |    6 -
 zh-cn/docs/user/best-practice.html                 |    4 +-
 zh-cn/docs/user/best-practice.json                 |   10 -
 zh-cn/docs/user/capacity-plan.html                 |    4 +-
 zh-cn/docs/user/capacity-plan.json                 |   10 -
 zh-cn/docs/user/configuration/annotation.html      |    6 +-
 zh-cn/docs/user/configuration/annotation.json      |    2 +-
 zh-cn/docs/user/configuration/api.html             |    4 +-
 zh-cn/docs/user/configuration/api.json             |    6 -
 zh-cn/docs/user/configuration/config-center.html   |    8 +-
 zh-cn/docs/user/configuration/config-center.json   |    2 +-
 .../configuration/configuration-load-process.html  |   12 +-
 .../configuration/configuration-load-process.json  |    2 +-
 zh-cn/docs/user/configuration/index.html           |    4 +-
 zh-cn/docs/user/configuration/index.json           |    6 -
 .../user/configuration/properties deprecated.html  |   65 -
 .../user/configuration/properties deprecated.json  |    6 -
 .../user/configuration/properties-deprecated.html  |    4 +-
 zh-cn/docs/user/configuration/properties.html      |   65 -
 zh-cn/docs/user/configuration/properties.json      |    6 -
 zh-cn/docs/user/configuration/xml.html             |    6 +-
 zh-cn/docs/user/configuration/xml.json             |    6 -
 zh-cn/docs/user/coveragence.html                   |    6 +-
 zh-cn/docs/user/coveragence.json                   |    6 -
 zh-cn/docs/user/demos/accesslog.html               |    4 +-
 zh-cn/docs/user/demos/accesslog.json               |    6 -
 zh-cn/docs/user/demos/async-call-deprecated.html   |    4 +-
 zh-cn/docs/user/demos/async-call-deprecated.json   |    6 -
 zh-cn/docs/user/demos/async-call.html              |    4 +-
 zh-cn/docs/user/demos/async-call.json              |    6 -
 .../docs/user/demos/async-execute-on-provider.html |    4 +-
 .../docs/user/demos/async-execute-on-provider.json |    6 -
 zh-cn/docs/user/demos/attachment.html              |    4 +-
 zh-cn/docs/user/demos/attachment.json              |    6 -
 zh-cn/docs/user/demos/callback-parameter.html      |    4 +-
 zh-cn/docs/user/demos/callback-parameter.json      |    6 -
 zh-cn/docs/user/demos/concurrency-control.html     |    4 +-
 zh-cn/docs/user/demos/concurrency-control.json     |    6 -
 zh-cn/docs/user/demos/config-connections.html      |    4 +-
 zh-cn/docs/user/demos/config-connections.json      |    6 -
 zh-cn/docs/user/demos/config-rule-deprecated.html  |    4 +-
 zh-cn/docs/user/demos/config-rule-deprecated.json  |    6 -
 zh-cn/docs/user/demos/config-rule.html             |   12 +-
 zh-cn/docs/user/demos/config-rule.json             |    6 -
 zh-cn/docs/user/demos/context.html                 |    4 +-
 zh-cn/docs/user/demos/context.json                 |    6 -
 zh-cn/docs/user/demos/delay-publish.html           |    4 +-
 zh-cn/docs/user/demos/delay-publish.json           |    6 -
 zh-cn/docs/user/demos/distributed-transaction.html |    4 +-
 zh-cn/docs/user/demos/distributed-transaction.json |    6 -
 zh-cn/docs/user/demos/dump.html                    |    4 +-
 zh-cn/docs/user/demos/echo-service.html            |    4 +-
 zh-cn/docs/user/demos/echo-service.json            |    6 -
 zh-cn/docs/user/demos/events-notify.html           |    4 +-
 zh-cn/docs/user/demos/events-notify.json           |    6 -
 zh-cn/docs/user/demos/explicit-target.html         |    4 +-
 zh-cn/docs/user/demos/fault-tolerent-strategy.html |    4 +-
 zh-cn/docs/user/demos/fault-tolerent-strategy.json |    6 -
 zh-cn/docs/user/demos/generic-reference.html       |    4 +-
 zh-cn/docs/user/demos/generic-reference.json       |    6 -
 zh-cn/docs/user/demos/generic-service.html         |    4 +-
 zh-cn/docs/user/demos/generic-service.json         |    6 -
 zh-cn/docs/user/demos/graceful-shutdown.html       |    4 +-
 zh-cn/docs/user/demos/group-merger.html            |    4 +-
 zh-cn/docs/user/demos/group-merger.json            |    6 -
 zh-cn/docs/user/demos/hostname-binding.html        |    4 +-
 zh-cn/docs/user/demos/index.html                   |    4 +-
 zh-cn/docs/user/demos/index.json                   |    6 -
 zh-cn/docs/user/demos/introduction.html            |    4 +-
 zh-cn/docs/user/demos/introduction.json            |    6 -
 zh-cn/docs/user/demos/lazy-connect.html            |    4 +-
 zh-cn/docs/user/demos/lazy-connect.json            |    6 -
 zh-cn/docs/user/demos/loadbalance.html             |    4 +-
 zh-cn/docs/user/demos/loadbalance.json             |    6 -
 zh-cn/docs/user/demos/local-call.html              |    4 +-
 zh-cn/docs/user/demos/local-call.json              |    6 -
 zh-cn/docs/user/demos/local-mock.html              |    4 +-
 zh-cn/docs/user/demos/local-mock.json              |    6 -
 zh-cn/docs/user/demos/local-stub.html              |    4 +-
 zh-cn/docs/user/demos/local-stub.json              |    6 -
 zh-cn/docs/user/demos/logger-strategy.html         |    4 +-
 zh-cn/docs/user/demos/logger-strategy.json         |    6 -
 zh-cn/docs/user/demos/metadata-report.html         |  328 ----
 zh-cn/docs/user/demos/metadata-report.json         |    6 -
 zh-cn/docs/user/demos/multi-protocols.html         |    4 +-
 zh-cn/docs/user/demos/multi-registry.html          |    4 +-
 zh-cn/docs/user/demos/multi-versions.html          |    4 +-
 zh-cn/docs/user/demos/multi-versions.json          |    6 -
 zh-cn/docs/user/demos/netty4.html                  |    4 +-
 zh-cn/docs/user/demos/netty4.json                  |    6 -
 zh-cn/docs/user/demos/parameter-validation.html    |    6 +-
 zh-cn/docs/user/demos/parameter-validation.json    |    6 -
 zh-cn/docs/user/demos/preflight-check.html         |    4 +-
 zh-cn/docs/user/demos/reference-config-cache.html  |    4 +-
 zh-cn/docs/user/demos/reference-config-cache.json  |    6 -
 zh-cn/docs/user/demos/registry-only.html           |    4 +-
 zh-cn/docs/user/demos/registry-only.json           |    6 -
 zh-cn/docs/user/demos/result-cache.html            |    6 +-
 zh-cn/docs/user/demos/result-cache.json            |    6 -
 zh-cn/docs/user/demos/routing-rule deprecated.html |  207 --
 zh-cn/docs/user/demos/routing-rule deprecated.json |    6 -
 zh-cn/docs/user/demos/routing-rule-deprecated.html |    4 +-
 zh-cn/docs/user/demos/routing-rule-deprecated.json |    6 -
 zh-cn/docs/user/demos/routing-rule.html            |    8 +-
 zh-cn/docs/user/demos/routing-rule.json            |    2 +-
 zh-cn/docs/user/demos/serialization.html           |    4 +-
 zh-cn/docs/user/demos/serialization.json           |    6 -
 zh-cn/docs/user/demos/service-container.html       |    4 +-
 zh-cn/docs/user/demos/service-downgrade.html       |    4 +-
 zh-cn/docs/user/demos/service-downgrade.json       |    6 -
 zh-cn/docs/user/demos/service-group.html           |    4 +-
 zh-cn/docs/user/demos/service-group.json           |    6 -
 zh-cn/docs/user/demos/set-host.html                |    6 +-
 zh-cn/docs/user/demos/set-host.json                |    6 -
 zh-cn/docs/user/demos/simplify-registry-data.html  |    4 +-
 zh-cn/docs/user/demos/static-service.html          |    4 +-
 zh-cn/docs/user/demos/static-service.json          |    6 -
 zh-cn/docs/user/demos/stickiness.html              |    4 +-
 zh-cn/docs/user/demos/subscribe-only.html          |    4 +-
 zh-cn/docs/user/demos/subscribe-only.json          |    6 -
 zh-cn/docs/user/demos/thread-model.html            |    4 +-
 zh-cn/docs/user/demos/thread-model.json            |    6 -
 zh-cn/docs/user/demos/token-authorization.html     |   12 +-
 zh-cn/docs/user/demos/token-authorization.json     |    6 -
 zh-cn/docs/user/dependencies.html                  |    4 +-
 zh-cn/docs/user/dependencies.json                  |   10 -
 zh-cn/docs/user/maturity.html                      |  166 +-
 zh-cn/docs/user/maturity.json                      |   10 -
 zh-cn/docs/user/perf-test.html                     |    4 +-
 zh-cn/docs/user/perf-test.json                     |   10 -
 zh-cn/docs/user/preface/architecture.html          |    4 +-
 zh-cn/docs/user/preface/architecture.json          |    6 -
 zh-cn/docs/user/preface/background.html            |    4 +-
 zh-cn/docs/user/preface/background.json            |    6 -
 zh-cn/docs/user/preface/index.html                 |    4 +-
 zh-cn/docs/user/preface/index.json                 |    6 -
 zh-cn/docs/user/preface/requirements.html          |    4 +-
 zh-cn/docs/user/preface/requirements.json          |    6 -
 zh-cn/docs/user/preface/usage.html                 |    4 +-
 zh-cn/docs/user/preface/usage.json                 |    6 -
 zh-cn/docs/user/quick-start.html                   |    4 +-
 zh-cn/docs/user/recommend.html                     |    6 +-
 zh-cn/docs/user/recommend.json                     |   10 -
 zh-cn/docs/user/references/api.html                |    4 +-
 zh-cn/docs/user/references/api.json                |    6 -
 zh-cn/docs/user/references/maven.html              |    4 +-
 zh-cn/docs/user/references/maven.json              |    6 -
 .../user/references/metadata/introduction.html     |    6 +-
 .../user/references/metadata/introduction.json     |    6 -
 .../user/references/metadata/metadata-redis.html   |    4 +-
 .../user/references/metadata/metadata-redis.json   |    6 -
 .../references/metadata/metadata-zookeeper.html    |    4 +-
 .../references/metadata/metadata-zookeeper.json    |    6 -
 zh-cn/docs/user/references/protocol/dubbo.html     |    4 +-
 zh-cn/docs/user/references/protocol/dubbo.json     |    6 -
 zh-cn/docs/user/references/protocol/hessian.html   |    4 +-
 zh-cn/docs/user/references/protocol/hessian.json   |    6 -
 zh-cn/docs/user/references/protocol/http.html      |    4 +-
 zh-cn/docs/user/references/protocol/http.json      |    6 -
 .../user/references/protocol/introduction.html     |    4 +-
 .../user/references/protocol/introduction.json     |    6 -
 zh-cn/docs/user/references/protocol/memcached.html |    4 +-
 zh-cn/docs/user/references/protocol/memcached.json |    6 -
 zh-cn/docs/user/references/protocol/redis.html     |    4 +-
 zh-cn/docs/user/references/protocol/redis.json     |    6 -
 zh-cn/docs/user/references/protocol/rest.html      |   32 +-
 zh-cn/docs/user/references/protocol/rest.json      |    6 -
 zh-cn/docs/user/references/protocol/rmi.html       |    4 +-
 zh-cn/docs/user/references/protocol/thrift.html    |    6 +-
 zh-cn/docs/user/references/protocol/thrift.json    |    6 -
 .../docs/user/references/protocol/webservice.html  |    4 +-
 .../docs/user/references/protocol/webservice.json  |    6 -
 zh-cn/docs/user/references/qos.html                |    4 +-
 .../user/references/registry/introduction.html     |    4 +-
 .../user/references/registry/introduction.json     |    6 -
 zh-cn/docs/user/references/registry/multicast.html |    4 +-
 zh-cn/docs/user/references/registry/multicast.json |    6 -
 zh-cn/docs/user/references/registry/redis.html     |    4 +-
 zh-cn/docs/user/references/registry/redis.json     |    6 -
 zh-cn/docs/user/references/registry/simple.html    |    4 +-
 zh-cn/docs/user/references/registry/zookeeper.html |    5 +-
 zh-cn/docs/user/references/registry/zookeeper.json |    6 -
 zh-cn/docs/user/references/telnet.html             |    4 +-
 zh-cn/docs/user/references/telnet.json             |    6 -
 .../user/references/xml/dubbo-application.html     |    4 +-
 .../user/references/xml/dubbo-application.json     |    6 -
 zh-cn/docs/user/references/xml/dubbo-argument.html |    4 +-
 zh-cn/docs/user/references/xml/dubbo-argument.json |    6 -
 .../user/references/xml/dubbo-config-center.html   |    4 +-
 .../user/references/xml/dubbo-config-center.json   |    6 -
 zh-cn/docs/user/references/xml/dubbo-consumer.html |    4 +-
 zh-cn/docs/user/references/xml/dubbo-consumer.json |    6 -
 zh-cn/docs/user/references/xml/dubbo-method.html   |    4 +-
 zh-cn/docs/user/references/xml/dubbo-method.json   |    6 -
 zh-cn/docs/user/references/xml/dubbo-module.html   |    4 +-
 zh-cn/docs/user/references/xml/dubbo-module.json   |    6 -
 zh-cn/docs/user/references/xml/dubbo-monitor.html  |    4 +-
 zh-cn/docs/user/references/xml/dubbo-monitor.json  |    6 -
 .../docs/user/references/xml/dubbo-parameter.html  |    4 +-
 .../docs/user/references/xml/dubbo-parameter.json  |    6 -
 zh-cn/docs/user/references/xml/dubbo-protocol.html |    4 +-
 zh-cn/docs/user/references/xml/dubbo-protocol.json |    6 -
 zh-cn/docs/user/references/xml/dubbo-provider.html |    4 +-
 zh-cn/docs/user/references/xml/dubbo-provider.json |    6 -
 .../docs/user/references/xml/dubbo-reference.html  |    4 +-
 .../docs/user/references/xml/dubbo-reference.json  |    6 -
 zh-cn/docs/user/references/xml/dubbo-registry.html |    6 +-
 zh-cn/docs/user/references/xml/dubbo-registry.json |    6 -
 zh-cn/docs/user/references/xml/dubbo-service.html  |    4 +-
 zh-cn/docs/user/references/xml/dubbo-service.json  |    6 -
 zh-cn/docs/user/references/xml/introduction.html   |    4 +-
 zh-cn/docs/user/references/xml/introduction.json   |    6 -
 zh-cn/docs/user/rest.html                          |    4 +-
 zh-cn/docs/user/rest.json                          |   10 -
 zh-cn/docs/user/serialization.html                 |    4 +-
 zh-cn/docs/user/serialization.json                 |    6 -
 zh-cn/docs/user/simple-monitor.html                |    4 +-
 zh-cn/docs/user/simple-monitor.json                |    6 -
 zh-cn/docs/user/version-upgrading.html             |   38 -
 zh-cn/docs/user/version-upgrading.json             |    6 -
 zh-cn/docs/user/versions/index.html                |    4 +-
 zh-cn/docs/user/versions/index.json                |    6 -
 zh-cn/docs/user/versions/version-270.html          |    8 +-
 zh-cn/docs/user/versions/version-270.json          |    2 +-
 zh-cn/docs/user/versions/version-upgrading.html    |   38 -
 zh-cn/docs/user/versions/version-upgrading.json    |    6 -
 zh-cn/download/index.html                          |   32 -
 zh-cn/ecology/index.html                           |   32 -
 zh-cn/index.html                                   |    2 +-
 1064 files changed, 3615 insertions(+), 9857 deletions(-)

diff --cc en-us/blog/apachecon-na-2018.html
index e0e423c,0000000..28d5f44
mode 100644,000000..100644
--- a/en-us/blog/apachecon-na-2018.html
+++ b/en-us/blog/apachecon-na-2018.html
@@@ -1,34 -1,0 +1,34 @@@
 +<!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="apachecon-na-2018" />
- 	<meta name="description" content="apachecon-na-2018" />
++	<meta name="keywords" content="Dubbo, ApacheCon NA" />
++	<meta name="description" content="This article will introduce you that the ApacheCon NA schedule has been announced attention." />
 +	<!-- 网页标签标题 -->
- 	<title>apachecon-na-2018</title>
++	<title>The ApacheCon NA schedule has been announced</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="/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 h [...]
- <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>
- </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 proc [...]
++<p>Ian Luo(PMC) and Jun Liu(PMC) 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>
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/download.html
index afbe711,0000000..a04c433
mode 100644,000000..100644
--- a/en-us/blog/download.html
+++ b/en-us/blog/download.html
@@@ -1,155 -1,0 +1,161 @@@
 +<!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="download" />
- 	<meta name="description" content="download" />
++	<meta name="keywords" content="Dubbo, Downloads, Version" />
++	<meta name="description" content="This article will introduce you how to understand the details of each version and upgrade matters needing attention." />
 +	<!-- 网页标签标题 -->
- 	<title>download</title>
++	<title>Downloads</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="/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 h [...]
 +<h2>Verification</h2>
- <p>you can follow these <a href="https://www.apache.org/info/verification">procedures</a> and the <a href="https://www.apache.org/dist/incubator/dubbo/KEYS">KEYS</a> file to verify the download files</p>
++<p>you can follow these <a href="https://www.apache.org/info/verification">procedures</a> and the <a href="https://www.apache.org/dist/dubbo/KEYS">KEYS</a> file to verify the download files</p>
 +<h2>Apache Dubbo</h2>
 +<blockquote>
- <p>GitHub: <a href="https://github.com/apache/incubator-dubbo">https://github.com/apache/incubator-dubbo</a> <br>
- Release Notes: <a href="https://github.com/apache/incubator-dubbo/releases">https://github.com/apache/incubator-dubbo/releases</a></p>
++<p>GitHub: <a href="https://github.com/apache/dubbo">https://github.com/apache/dubbo</a> <br>
++Release Notes: <a href="https://github.com/apache/dubbo/releases">https://github.com/apache/dubbo/releases</a></p>
 +</blockquote>
++<h3>2.7.2 (2019-06-06)</h3>
++<ul>
++<li><a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.2/apache-dubbo-2.7.2-src.zip">source</a> |
++<a href="https://www.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip.asc">asc</a> |
++<a href="https://www.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip.sha512">sha512</a></li>
++</ul>
 +<h3>2.7.1 (2019-03-26)</h3>
 +<ul>
- <li><a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip">source</a> |
- <a href="https://www.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip.asc">asc</a> |
- <a href="https://www.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip.sha512">sha512</a></li>
- <li><a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip">binary</a> |
- <a href="https://www.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip.asc">asc</a> |
- <a href="https://www.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip.sha512">sha512</a></li>
++<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip">source</a> |
++<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip.asc">asc</a> |
++<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip.sha512">sha512</a></li>
++<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip">binary</a> |
++<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip.asc">asc</a> |
++<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.7.0 (2019-01-29)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.6.6 (2019-03-07)</h3>
 +<ul>
 +<li><a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-source-release.zip">source</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-source-release.zip.asc">asc</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-bin-release.zip">binary</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-bin-release.zip.asc">asc</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.6.5 (2018-11-23)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.6.4 (2018-10-08)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.6.3 (2018-09-11)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.6.2 (2018-06-07)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h2>Dubbo Spring Boot Starter</h2>
 +<blockquote>
 +<p>GitHub: <a href="https://github.com/apache/incubator-dubbo-spring-boot-project">https://github.com/apache/incubator-dubbo-spring-boot-project</a> <br>
 +Release Notes: <a href="https://github.com/apache/incubator-dubbo-spring-boot-project/releases">https://github.com/apache/incubator-dubbo-spring-boot-project/releases</a></p>
 +</blockquote>
 +<h3>2.7.1 (2019-04-09)</h3>
 +<ul>
 +<li><a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/spring-boot-project/2.7.1/apache-dubbo-spring-boot-project-incubating-2.7.1-source-release.zip">source</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.1/apache-dubbo-spring-boot-project-incubating-2.7.1-source-release.zip.asc">asc</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.1/apache-dubbo-spring-boot-project-incubating-2.7.1-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/spring-boot-project/2.7.1/apache-dubbo-spring-boot-project-incubating-2.7.1-bin-release.zip">binary</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.1/apache-dubbo-spring-boot-project-incubating-2.7.1-bin-release.zip.asc">asc</a> |
 +<a href="https://www.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.1/apache-dubbo-spring-boot-project-incubating-2.7.1-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>2.7.0 (2019-02-14)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.0/apache-dubbo-spring-boot-project-incubating-2.7.0-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.0/apache-dubbo-spring-boot-project-incubating-2.7.0-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.0/apache-dubbo-spring-boot-project-incubating-2.7.0-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.0/apache-dubbo-spring-boot-project-incubating-2.7.0-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.0/apache-dubbo-spring-boot-project-incubating-2.7.0-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/2.7.0/apache-dubbo-spring-boot-project-incubating-2.7.0-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>0.2.1 (2019-01-27)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.2.1/apache-dubbo-spring-boot-project-incubating-0.2.1-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.2.1/apache-dubbo-spring-boot-project-incubating-0.2.1-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.2.1/apache-dubbo-spring-boot-project-incubating-0.2.1-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.2.1/apache-dubbo-spring-boot-project-incubating-0.2.1-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.2.1/apache-dubbo-spring-boot-project-incubating-0.2.1-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.2.1/apache-dubbo-spring-boot-project-incubating-0.2.1-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h3>0.1.2 (2019-01-27)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.1.2/apache-dubbo-spring-boot-project-incubating-0.1.2-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.1.2/apache-dubbo-spring-boot-project-incubating-0.1.2-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.1.2/apache-dubbo-spring-boot-project-incubating-0.1.2-source-release.zip.sha512">sha512</a></li>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.1.2/apache-dubbo-spring-boot-project-incubating-0.1.2-bin-release.zip">binary</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.1.2/apache-dubbo-spring-boot-project-incubating-0.1.2-bin-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/spring-boot-project/0.1.2/apache-dubbo-spring-boot-project-incubating-0.1.2-bin-release.zip.sha512">sha512</a></li>
 +</ul>
 +<h2>Dubbo Admin</h2>
 +<blockquote>
 +<p>GitHub: <a href="https://github.com/apache/incubator-dubbo-admin">https://github.com/apache/incubator-dubbo-admin</a> <br>
 +Release Notes: <a href="https://github.com/apache/incubator-dubbo-admin/releases">https://github.com/apache/incubator-dubbo-admin/releases</a></p>
 +</blockquote>
 +<h3>0.1 (2019-02-15)</h3>
 +<ul>
 +<li><a href="https://archive.apache.org/dist/incubator/dubbo/dubbo-ops/0.1/apache-dubbo-ops-incubating-0.1-source-release.zip">source</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/dubbo-ops/0.1/apache-dubbo-ops-incubating-0.1-source-release.zip.asc">asc</a> |
 +<a href="https://archive.apache.org/dist/incubator/dubbo/dubbo-ops/0.1/apache-dubbo-ops-incubating-0.1-source-release.zip.sha512">sha512</a></li>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-101.html
index aa0ec17,0000000..fbe96fe
mode 100644,000000..100644
--- a/en-us/blog/dubbo-101.html
+++ b/en-us/blog/dubbo-101.html
@@@ -1,346 -1,0 +1,346 @@@
 +<!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, RPC, RMI" />
 +	<meta name="description" content="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." />
 +	<!-- 网页标签标题 -->
 +	<title>Your First Dubbo Demo</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="/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 h [...]
 +<h2>Java RMI Introduction</h2>
 +<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>
 +<h3>Java RMI Work Flow</h3>
- <p>Here is how a typical RMI invocation usually works:</p>
++<p>Here is how a typical RMI invocation usually works:</p>
 +<ol>
 +<li>The server registers service from RMI and binds its address.</li>
 +<li>The client registers service from RMI and obtains target address.</li>
 +<li>The client invokes methods of local stub object in the same way of invoking other local objects.</li>
 +<li>Local stub object zips invoking information and send it to the server via network.</li>
 +<li>The Skeleton object of server receives the network request and unzips the information.</li>
 +<li>Server runs invocation on the target object based on the information and return the zipped results back to client via network.</li>
 +</ol>
 +<p><img src="../../img/blog/rmi-flow.png" alt="RMI Flow"></p>
 +<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>
 +<h3>Java RMI Concepts</h3>
 +<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>
 +<ol>
 +<li>The invocation is run remotely on <strong>interface</strong>.</li>
 +<li>Disguise remote invocation as local invocation by <strong>Stub object</strong> on client and <strong>Skeleton object</strong> on server.</li>
 +<li>The service is registered and looked up by <strong>RMI</strong> registry service.</li>
 +</ol>
 +<p>For 1. users are dependent on interfaces which should be implemented by server.</p>
 +<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>
 +<p>The following is a code example of registry and look-up in RMI.</p>
 +<h4>Server service registry</h4>
 +<pre><code class="language-java">Hello obj = <span class="hljs-keyword">new</span> HelloImpl(); <span class="hljs-comment">// #1</span>
 +Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, <span class="hljs-number">0</span>); <span class="hljs-comment">// #2</span>
 +Registry registry = LocateRegistry.createRegistry(<span class="hljs-number">1099</span>); <span class="hljs-comment">// #3</span>
 +registry.rebind(<span class="hljs-string">"Hello"</span>, stub); <span class="hljs-comment">// #4</span>
 +</code></pre>
 +<p>Notes:</p>
 +<ol>
 +<li>
 +<p>Initiate service object instance.</p>
 +</li>
 +<li>
 +<p>Create stub object to communicate with the server by UnicastRemoteObject.exportObject.</p>
 +</li>
 +<li>
 +<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>
 +</li>
 +<li>
 +<p>Bind stub object into registry so the client can find the remote object by looking up Hello.</p>
 +</li>
 +</ol>
 +<h4>Client service look-up</h4>
 +<pre><code class="language-java">Registry registry = LocateRegistry.getRegistry(); <span class="hljs-comment">// #1</span>
 +Hello stub = (Hello) registry.lookup(<span class="hljs-string">"Hello"</span>); <span class="hljs-comment">// #2</span>
 +String response = stub.sayHello(); <span class="hljs-comment">// #3</span>
 +</code></pre>
 +<p>Notes:</p>
 +<ol>
 +<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>
 +<li>Look up the remote object named Hello in registry service.</li>
 +<li>Run a RMI invocation via acquired Stub object and get results.
 +Understand 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>
 +</ol>
 +<h2>Basic Concepts of Dubbo</h2>
 +<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>
 +<ol>
 +<li>Serve the provider – Expose service at assigned ports at initialization and register the service address and ports at registry center</li>
 +<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>
 +<li>Registry center – Register and look up service. Store the address provided by the service provider and send it to the consumer.</li>
 +<li>Monitor center – Collect and monitor running status of providers and consumers, e.g., times of invocations, delay of invocations, etc.</li>
 +<li>Running container – Initialize and load the provider and manage the lifecycle of running.</li>
 +</ol>
 +<p><img src="../../img/blog/dubbo-architecture.png" alt="dubbo-architecture"></p>
 +<p><strong>Deploy stage</strong></p>
 +<ul>
 +<li>Service providers expose service at assigned ports and register information of service at registry center.</li>
 +<li>Service consumers subscribe the list of service addresses from registry center.</li>
 +</ul>
 +<p><strong>Run stage</strong></p>
 +<ul>
 +<li>Registry center sends the address to service consumers.</li>
 +<li>After receiving the list of addresses, service consumers select one of them and invoke an object service.</li>
 +<li>During invocation, the running status of service providers and consumers is reported to the monitor center.</li>
 +</ul>
 +<h2>Dubbo Applications Based on API</h2>
 +<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>
 +<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>
 +<h3>Define Service Contract</h3>
 +<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>{
 +    <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>
 +}
 +</code></pre>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<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>
 +</ol>
 +<h3>Provide Contract Implementation</h3>
 +<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>
 +    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"hi, "</span> + name; <span class="hljs-comment">// #2</span>
 +    }
 +}
 +</code></pre>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<li>Service providers need to implement the interface of service contract, GreetingsService.</li>
 +<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>
 +</ol>
 +<h3>Implement Dubbo Service Provider</h3>
 +<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>{
 +    <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>{
 +        ServiceConfig&lt;GreetingsService&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;&gt;(); <span class="hljs-comment">// #1</span>
 +        service.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-provider"</span>)); <span class="hljs-comment">// #2</span>
 +        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>
 +        service.setInterface(GreetingsService.class); <span class="hljs-comment">// #4</span>
 +        service.setRef(<span class="hljs-keyword">new</span> GreetingsServiceImpl()); <span class="hljs-comment">// #5</span>
 +        service.export(); <span class="hljs-comment">// #6</span>
 +        System.in.read(); <span class="hljs-comment">// #7</span>
 +    }
 +}
 +</code></pre>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<li>Create an instance <em>ServiceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li>
 +<li>Generate an instance of <em>ApplicationConfig</em> and assemble it into <em>ServiceConfig</em>.</li>
 +<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>
 +<li>Assemble the service contract <em>GreetingsService</em> into <em>ServiceConfig</em>.</li>
 +<li>Assemble the instance with implementation of <em>GreetingsServicelmpl</em> provided by service providers into <em>ServiceConfig</em>.</li>
 +<li><em>ServiceConfig</em> starts to expose itself at default ports <em>20880</em>. after being equipped with enough information.</li>
 +<li>Press any key or <em>ctrl-C</em> to exit to avoid server halt.</li>
 +</ol>
 +<h3>Implement Dubbo Service Consumer</h3>
 +<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>{
 +    <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>{
 +        ReferenceConfig&lt;GreetingsService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;&gt;(); <span class="hljs-comment">// #1</span>
 +        reference.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-client"</span>)); <span class="hljs-comment">// #2</span>
 +        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>
 +        reference.setInterface(GreetingsService.class); <span class="hljs-comment">// #4</span>
 +        GreetingsService greetingsService = reference.get(); <span class="hljs-comment">// #5</span>
 +        String message = greetingsService.sayHi(<span class="hljs-string">"dubbo"</span>); <span class="hljs-comment">// #6</span>
 +        System.out.println(message); <span class="hljs-comment">// #7</span>
 +    }
 +}
 +</code></pre>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<li>Create an instance of <em>ReferenceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li>
 +<li>Create an instance of <em>AplicatonConfig</em>, and assemble it into <em>ReferenceConfig</em>.</li>
 +<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>
 +<li>Assemble the service contract <em>GreetingsService</em> into <em>ReferenceConfig</em>.</li>
 +<li>Obtain the agency of <em>GreetingsService</em> from <em>ReferenceConfig</em>.</li>
 +<li>Invoke a remote call through <em>GreetingsSerive</em>’s agency and pass in <code>dubbo</code> as input parameter.</li>
 +<li>Return and print results <code>hi, dubbo</code>.</li>
 +</ol>
 +<h3>Run</h3>
 +<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  [...]
 +<h4>Build Example</h4>
 +<p>Synchronize the example codes and build by the following command lines:</p>
 +<ol>
 +<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>
 +<li>Build:mvn clean package</li>
 +</ol>
 +<pre><code class="language-bash">$ git <span class="hljs-built_in">clone</span> https://github.com/dubbo/dubbo-samples.git
 +$ <span class="hljs-built_in">cd</span> dubbo-samples/dubbo-samples-api/
 +$ mvn clean package
 +INFO] Scanning <span class="hljs-keyword">for</span> projects...
 +[INFO]
 +[INFO] ------------------------------------------------------------------------
 +[INFO] Building dubbo-samples-api 1.0-SNAPSHOT
 +[INFO] ------------------------------------------------------------------------
 +[INFO]
 +[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ dubbo-samples-api ---
 +...
 +[INFO] ------------------------------------------------------------------------
 +[INFO] BUILD SUCCESS
 +[INFO] ------------------------------------------------------------------------
 +[INFO] Total time: 2.182 s
 +[INFO] Finished at: 2018-05-28T14:56:08+08:00
 +[INFO] Final Memory: 20M/353M
 +[INFO] ------------------------------------------------------------------------
 +</code></pre>
 +<p>The build is finished when it shows <code>BUILD SUCCESS</code>. Then comes the running stage.</p>
 +<h4>Run the server</h4>
 +<p>Run the service provider by the following maven command lines:</p>
 +<pre><code class="language-bash">$ mvn -Djava.net.preferIPv4Stack=<span class="hljs-literal">true</span> -Dexec.mainClass=org.apache.dubbo.samples.provider.Application <span class="hljs-built_in">exec</span>:java
 +[INFO] Scanning <span class="hljs-keyword">for</span> projects...
 +[INFO]                                                                         
 +[INFO] ------------------------------------------------------------------------
 +[INFO] Building dubbo-samples-api 1.0-SNAPSHOT
 +[INFO] ------------------------------------------------------------------------
 +[INFO]
 +[INFO] --- <span class="hljs-built_in">exec</span>-maven-plugin:1.6.0:java (default-cli) @ dubbo-samples-api ---
 +log4j:WARN No appenders could be found <span class="hljs-keyword">for</span> logger (org.apache.dubbo.common.logger.LoggerFactory).
 +log4j:WARN Please initialize the log4j system properly.
 +log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html<span class="hljs-comment">#noconfig for more info.</span>
 +first-dubbo-provider is running.
 +</code></pre>
 +<p>When <em>first-dubbo-provider is running</em> appears, the service provider is ready to be called by the client.</p>
 +<h4>Run the client</h4>
 +<p>Run the service consumer by the following maven command lines:</p>
 +<pre><code class="language-bash">$ mvn -Djava.net.preferIPv4Stack=<span class="hljs-literal">true</span> -Dexec.mainClass=org.apache.dubbo.samples.consumer.Application <span class="hljs-built_in">exec</span>:java
 +[INFO] Scanning <span class="hljs-keyword">for</span> projects...
 +[INFO]                                                                         
 +[INFO] ------------------------------------------------------------------------
 +[INFO] Building dubbo-samples-api 1.0-SNAPSHOT
 +[INFO] ------------------------------------------------------------------------
 +[INFO]
 +[INFO] --- <span class="hljs-built_in">exec</span>-maven-plugin:1.6.0:java (default-cli) @ dubbo-samples-api ---
 +log4j:WARN No appenders could be found <span class="hljs-keyword">for</span> logger (org.apache.dubbo.common.logger.LoggerFactory).
 +log4j:WARN Please initialize the log4j system properly.
 +log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html<span class="hljs-comment">#noconfig for more info.</span>
 +hi, dubbo
 +</code></pre>
 +<p><code>hi, dubbo</code> is the execution results from service provider.</p>
 +<h2>Quick Creation of A Dubbo Application</h2>
 +<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>
 +<p><img src="../../img/blog/dubbo-initializr.png" alt="dubbo initializr"></p>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<li>Provide maven groupId in <em>Group</em> with default value <code>com.example</code>.</li>
 +<li>Provide maven artifactId in <em>Artifact</em> with default value <code>demo</code>.</li>
 +<li>Provide the name of service in <em>DubboServiceName</em> with default value <code>com.example.HelloService</code>.</li>
 +<li>Provide the version of service in <em>DubboServiceVersion</em> with default value <code>1.0.0</code>.</li>
 +<li>Choose server or client in <em>Client/Server</em> with default value <code>server</code>.</li>
 +<li><em>embeddedZookeeper</em> is selected by default as service registry look up.</li>
 +<li>qos ports activation is not selected by default but if it is, it can be accessed by port <em>22222</em>.</li>
 +<li>Click <em>Generate Project</em> to download the generated project.</li>
 +</ol>
 +<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>
 +<h3>Run</h3>
 +<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>
 +<pre><code class="language-java"><span class="hljs-meta">@SpringBootApplication</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoApplication</span> </span>{
 +	<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>{
 +		<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>
 +		SpringApplication.run(DemoApplication.class, args); <span class="hljs-comment">// #2</span>
 +	}
 +}
 +</code></pre>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<li>Launch embedded <em>ZooKeeper</em> on port <em>2181</em>.</li>
 +<li>Launch the context of <em>Spring Boot</em>.</li>
 +</ol>
 +<p>Run it directly in IDE and here are the results:</p>
 +<pre><code class="language-bash">2018-05-28 16:59:38.072  INFO 59943 --- [           main] a.b.d.c.e.WelcomeLogoApplicationListener :
 +
 +  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  
 +  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███
 +  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███
 +  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███
 +  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███
 +  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███
 +  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███
 +  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  
 +
 +
 + :: Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project
 + :: Dubbo (v2.0.1) : https://github.com/alibaba/dubbo
 + :: Google group : http://groups.google.com/group/dubbo
 +
 +2018-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.ba [...]
 +
 +...
 +
 +2018-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)
 +</code></pre>
 +<p><strong>Notes</strong>:</p>
 +<ol>
 +<li>In the printouts, the configuration starting with <code>dubbo.</code> Is defined in <em>main/resources/application.properties</em>.</li>
 +</ol>
 +<h3>Manage service by Telnet</h3>
- <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>
++<p>If <em>qos</em> is activated during generation, the service can be watched and managed by <em>telnet</em> or <em>nc</em>.</p>
 +<pre><code class="language-bash">$ telnet localhost 22222
 +Trying 127.0.0.1...
 +Connected to localhost.
 +Escape character is <span class="hljs-string">'^]'</span>.
 +  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  
 +  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███
 +  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███
 +  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███
 +  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███
 +  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███
 +  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███
 +  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  
 +
 +
 +dubbo&gt;
 +dubbo&gt;ls
 +As Provider side:
 ++------------------------------+---+
 +|     Provider Service Name    |PUB|
 ++------------------------------+---+
 +|com.example.HelloService:1.0.0| Y |
 ++------------------------------+---+
 +As Consumer side:
 ++---------------------+---+
 +|Consumer Service Name|NUM|
 ++---------------------+---+
 +</code></pre>
 +<p>Currently, <em>qos</em> supports following command lines. For more information please refer to the official document. [^4]:</p>
 +<ul>
 +<li><em>ls</em>:List the information of client and server.</li>
 +<li><em>online</em>:Bring the service online.</li>
 +<li><em>offline</em>:Bring the service offline.</li>
 +<li><em>help</em>:View online help.</li>
 +</ul>
 +<h2>Summary</h2>
 +<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>
 +<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>
 +<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>
 +<hr>
 +<ol>
 +<li><a href="https://docs.oracle.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html">Getting Started Using JavaTM RMI</a></li>
 +<li><a href="http://dubbo.apache.org/en-us/docs/user/demos/explicit-target.html">Explicit target</a></li>
 +<li><a href="http://dubbo.apache.org/en-us/docs/user/references/registry/multicast.html">Multicast Registry</a></li>
 +<li><a href="http://dubbo.apache.org/en-us/docs/user/references/qos.html">Online QOS command</a></li>
 +</ol>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-annotation.html
index b537b06,0000000..433c8b4
mode 100644,000000..100644
--- a/en-us/blog/dubbo-annotation.html
+++ b/en-us/blog/dubbo-annotation.html
@@@ -1,335 -1,0 +1,335 @@@
 +<!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, Annotation, Spring" />
 +	<meta name="description" content="This article will introduce you how to use annotations instead of XML to develop Dubbo applications, such as `@EnableDubbo`, `@Service` and `@Reference`." />
 +	<!-- 网页标签标题 -->
 +	<title>Use Annotations In Dubbo</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="/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 h [...]
 +<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>
 +<ul>
 +<li>Annotation-Driven</li>
 +<li>External Configuration</li>
 +<li>Auto-Configure</li>
 +</ul>
 +<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 [...]
 +<h2>Introduce Annotations</h2>
 +<h3>@EnableDubbo</h3>
 +<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>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> org.apache.dubbo.config.spring.context.annotation;
 +
 +<span class="hljs-meta">@EnableDubboConfig</span>
 +<span class="hljs-meta">@DubboComponentScan</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> EnableDubbo {
 +    <span class="hljs-comment">/**
 +     * Base packages to scan for annotated <span class="hljs-doctag">@Service</span> classes.
 +     * &lt;p&gt;
 +     * Use {<span class="hljs-doctag">@link</span> #scanBasePackageClasses()} for a type-safe alternative to String-based
 +     * package names.
 +     *
 +     * <span class="hljs-doctag">@return</span> the base packages to scan
 +     * <span class="hljs-doctag">@see</span> DubboComponentScan#basePackages()
 +     */</span>
 +    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class="hljs-string">"basePackages"</span>)
 +    String[] scanBasePackages() <span class="hljs-keyword">default</span> {};
 +
 +    <span class="hljs-comment">/**
 +     * Type-safe alternative to {<span class="hljs-doctag">@link</span> #scanBasePackages()} for specifying the packages to
 +     * scan for annotated <span class="hljs-doctag">@Service</span> classes. The package of each class specified will be
 +     * scanned.
 +     *
 +     * <span class="hljs-doctag">@return</span> classes from the base packages to scan
 +     * <span class="hljs-doctag">@see</span> DubboComponentScan#basePackageClasses
 +     */</span>
 +    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class="hljs-string">"basePackageClasses"</span>)
 +    Class&lt;?&gt;[] scanBasePackageClasses() <span class="hljs-keyword">default</span> {};    
 +}
 +</code></pre>
 +<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, i [...]
 +<h3>@Service</h3>
 +<p><code>@service</code> is used to configure Dubbo's Service provider,for example:</p>
 +<pre><code class="language-java"><span class="hljs-meta">@Service</span>
 +<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>{
 +    <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>{
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"hello, "</span> + name;
 +    }
 +}
 +</code></pre>
 +<p>Via <code>@Service</code>'s properties, you can customize Dubbo's Service provider:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> org.apache.dubbo.config.annotation;
 +
 +<span class="hljs-meta">@Documented</span>
 +<span class="hljs-meta">@Retention</span>(RetentionPolicy.RUNTIME)
 +<span class="hljs-meta">@Target</span>({ElementType.TYPE}) <span class="hljs-comment">// #1</span>
 +<span class="hljs-meta">@Inherited</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Service {
 +    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span>.class; <span class="hljs-comment">// #2</span>
 +    <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>
 +    <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>
 +    <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>
 +    <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>
 +    <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>
 +    
 +    <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>
 +    <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>
 +    <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>
 +    String[] protocol() <span class="hljs-keyword">default</span> {}; <span class="hljs-comment">// #11</span>
 +    <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>
 +    String[] registry() <span class="hljs-keyword">default</span> {}; <span class="hljs-comment">// #13</span>
 +}
 +</code></pre>
 +<p>Which is more important:</p>
 +<ol>
 +<li><strong>@Service</strong>:        Can only be defined on a class, represent a service</li>
 +<li><strong>interfaceClass</strong>: specified <code>interface</code>'s class implemented by the service provider</li>
 +<li><strong>interfaceName</strong>: specified <code>interface</code>'s class name implemented by the service provider</li>
 +<li><strong>version</strong>: specified the version number of the service</li>
 +<li><strong>group</strong>:specified the group of services</li>
 +<li><strong>export</strong>:whether to expose service</li>
 +<li><strong>registry</strong>:Whether to register service to the registry</li>
 +<li><strong>application</strong>:application configuration</li>
 +<li><strong>module</strong>:module configuration</li>
 +<li><strong>provider</strong>:service provider configuration</li>
 +<li><strong>protocol</strong>:protocol configuration</li>
 +<li><strong>monitor</strong>:monitoring center configuration</li>
 +<li><strong>registr</strong>:registry configuration</li>
 +</ol>
 +<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>
 +<h3>@Reference</h3>
 +<p><code>@Reference</code> is used to configure Dubbo's Service consumer,for example:</p>
 +<pre><code class="language-Java"><span class="hljs-meta">@Component</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GreetingServiceConsumer</span> </span>{
 +    <span class="hljs-meta">@Reference</span>
 +    <span class="hljs-keyword">private</span> GreetingService greetingService;
 +
 +    <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>{
 +        <span class="hljs-keyword">return</span> greetingService.sayHello(name);
 +    }
 +}
 +</code></pre>
 +<p>Via <code>@Reference</code>'s properties, you can customize Dubbo's Service consumer:</p>
 +<pre><code class="language-Java"><span class="hljs-keyword">package</span> org.apache.dubbo.config.annotation;
 +
 +<span class="hljs-meta">@Documented</span>
 +<span class="hljs-meta">@Retention</span>(RetentionPolicy.RUNTIME)
 +<span class="hljs-meta">@Target</span>({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) <span class="hljs-comment">// #1</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Reference {
 +    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span>.class; <span class="hljs-comment">// #2</span>
 +    <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>
 +    <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>
 +    <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>
 +    <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>
 +    
 +    <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>
 +    <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>
 +    <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>
 +    <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>
 +    <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>
 +    String[] registry() <span class="hljs-keyword">default</span> {}; <span class="hljs-comment">// #12</span>
 +}
 +</code></pre>
 +<p>Which is more important:</p>
 +<ol>
 +<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>
 +<li><strong>interfaceClass</strong> : specified <code>interface</code>'s class implemented by the service provider</li>
 +<li><strong>interfaceName</strong>: specified <code>interface</code>'s class name implemented by the service provider</li>
 +<li><strong>version</strong>: specified the version number of the service</li>
 +<li><strong>group</strong>:pecified the group of services</li>
 +<li><strong>url</strong>: invoking the registry directly by specifying the URL of the service provider</li>
 +<li><strong>application</strong>:application configuration</li>
 +<li><strong>module</strong>:module configuration</li>
 +<li><strong>consumer</strong>:service consumer configuration</li>
 +<li><strong>protocol</strong>:protocol configuration</li>
 +<li><strong>monitor</strong>:monitoring center configuration</li>
 +<li><strong>registr</strong>:registry configuration</li>
 +</ol>
 +<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>
 +<h2>Example practice</h2>
 +<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>
 +<h3>1.Interface Definition</h3>
 +<p>Define a simple <code>GreetingService</code> interface with only a simple method <code>sayHello</code> to the caller.</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">GreetingService</span> </span>{
 +    <span class="hljs-function">String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span></span>;
 +}
 +</code></pre>
 +<h3>2.Server:Service Implementation</h3>
 +<p>Implement the <code>GreetingService</code> interface, and mark it as a service for Dubbo via @Service.</p>
 +<pre><code class="language-Java"><span class="hljs-meta">@Service</span>
 +<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>{
 +    <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>{
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"hello, "</span> + name;
 +    }
 +}
 +</code></pre>
 +<h3>3.Server:Assembly Service Provider</h3>
 +<p>You can discover, assemble, and provide Dubbo's services through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p>
 +<pre><code class="language-Java"><span class="hljs-meta">@Configuration</span>
 +<span class="hljs-meta">@EnableDubbo</span>(scanBasePackages = <span class="hljs-string">"com.alibaba.dubbo.samples.impl"</span>)
 +<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderConfiguration</span> </span>{
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #1</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> ProviderConfig <span class="hljs-title">providerConfig</span><span class="hljs-params">()</span> </span>{
 +        ProviderConfig providerConfig = <span class="hljs-keyword">new</span> ProviderConfig();
 +        providerConfig.setTimeout(<span class="hljs-number">1000</span>);
 +        <span class="hljs-keyword">return</span> providerConfig;
 +    }
 +
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #2</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> ApplicationConfig <span class="hljs-title">applicationConfig</span><span class="hljs-params">()</span> </span>{
 +        ApplicationConfig applicationConfig = <span class="hljs-keyword">new</span> ApplicationConfig();
 +        applicationConfig.setName(<span class="hljs-string">"dubbo-annotation-provider"</span>);
 +        <span class="hljs-keyword">return</span> applicationConfig;
 +    }
 +
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #3</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> RegistryConfig <span class="hljs-title">registryConfig</span><span class="hljs-params">()</span> </span>{
 +        RegistryConfig registryConfig = <span class="hljs-keyword">new</span> RegistryConfig();
 +        registryConfig.setProtocol(<span class="hljs-string">"zookeeper"</span>);
 +        registryConfig.setAddress(<span class="hljs-string">"localhost"</span>);
 +        registryConfig.setPort(<span class="hljs-number">2181</span>);
 +        <span class="hljs-keyword">return</span> registryConfig;
 +    }
 +
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #4</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> ProtocolConfig <span class="hljs-title">protocolConfig</span><span class="hljs-params">()</span> </span>{
 +        ProtocolConfig protocolConfig = <span class="hljs-keyword">new</span> ProtocolConfig();
 +        protocolConfig.setName(<span class="hljs-string">"dubbo"</span>);
 +        protocolConfig.setPort(<span class="hljs-number">20880</span>);
 +        <span class="hljs-keyword">return</span> protocolConfig;
 +    }
 +}
 +</code></pre>
 +<p>Description:</p>
 +<ul>
 +<li>Scan all classes marked with <code>@Service</code> under <code>com.alibaba.dubbo.samples.impl</code> with <code>@EnableDubbo</code></li>
 +<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:
 +i. <strong>ProviderConfig</strong>:Service provider configuration
 +ii. <strong>ApplicationConfig</strong>:Application configuration
 +iii.<strong>RegistryConfig</strong>:registry configuration
 +iv. <strong>ProtocolConfig</strong>:Protocol configuration</li>
 +</ul>
 +<h3>4.Server:Start Service</h3>
 +<p>In the <code>main</code> method to provide external <code>Dubbo</code> service by starting a <code>Spring Context</code>.</p>
 +<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>{
 +    <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>{
 +        <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>
 +        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class); <span class="hljs-comment">// #2</span>
 +        context.start(); <span class="hljs-comment">// #3</span>
 +        System.in.read(); <span class="hljs-comment">// #4</span>
 +    }
 +}
 +</code></pre>
 +<p>Description:</p>
 +<ol>
 +<li>Start an embedded <code>zookeeper</code> and provide service registry on port <code>2181</code></li>
 +<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>
 +<li>Start the <code>Spring Context</code> and start providing external <code>Dubbo</code> services.</li>
 +<li>Because it is a server, you need to prevent the process exit by blocking the main thread.</li>
 +</ol>
 +<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>
 +<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
 +
 +[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
 +</code></pre>
 +<h3>5.Server:Reference Service</h3>
 +<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>
 +<pre><code class="language-Java"><span class="hljs-meta">@Component</span>(<span class="hljs-string">"annotatedConsumer"</span>)
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GreetingServiceConsumer</span> </span>{
 +    <span class="hljs-meta">@Reference</span>
 +    <span class="hljs-keyword">private</span> GreetingService greetingService;
 +
 +    <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>{
 +        <span class="hljs-keyword">return</span> greetingService.sayHello(name);
 +    }
 +}
 +</code></pre>
 +<h3>6.Server:Assembly Service consumer</h3>
 +<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>
 +<pre><code class="language-Java"><span class="hljs-meta">@Configuration</span>
 +<span class="hljs-meta">@EnableDubbo</span>(scanBasePackages = <span class="hljs-string">"com.alibaba.dubbo.samples.action"</span>)
 +<span class="hljs-meta">@ComponentScan</span>(value = {<span class="hljs-string">"com.alibaba.dubbo.samples.action"</span>})
 +<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerConfiguration</span> </span>{
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #1</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> ApplicationConfig <span class="hljs-title">applicationConfig</span><span class="hljs-params">()</span> </span>{
 +        ApplicationConfig applicationConfig = <span class="hljs-keyword">new</span> ApplicationConfig();
 +        applicationConfig.setName(<span class="hljs-string">"dubbo-annotation-consumer"</span>);
 +        <span class="hljs-keyword">return</span> applicationConfig;
 +    }
 +
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #2</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> ConsumerConfig <span class="hljs-title">consumerConfig</span><span class="hljs-params">()</span> </span>{
 +        ConsumerConfig consumerConfig = <span class="hljs-keyword">new</span> ConsumerConfig();
 +        consumerConfig.setTimeout(<span class="hljs-number">3000</span>);
 +        <span class="hljs-keyword">return</span> consumerConfig;
 +    }
 +
 +    <span class="hljs-meta">@Bean</span> <span class="hljs-comment">// #3</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> RegistryConfig <span class="hljs-title">registryConfig</span><span class="hljs-params">()</span> </span>{
 +        RegistryConfig registryConfig = <span class="hljs-keyword">new</span> RegistryConfig();
 +        registryConfig.setProtocol(<span class="hljs-string">"zookeeper"</span>);
 +        registryConfig.setAddress(<span class="hljs-string">"localhost"</span>);
 +        registryConfig.setPort(<span class="hljs-number">2181</span>);
 +        <span class="hljs-keyword">return</span> registryConfig;
 +    }
 +}
 +</code></pre>
 +<p>Description:</p>
 +<ul>
 +<li>Scan all classes marked with <code>@Service</code> under <code>com.alibaba.dubbo.samples.impl</code> with <code>@Reference</code></li>
 +<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:
 +i. <code>ApplicationConfig</code>: Application configuration
 +ii. <code>ConsumerConfig</code>:Service consumer configuration
 +iii.<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>
 +</ul>
 +<h3>7.Server: Initiate Remote Calls</h3>
 +<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>
 +<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>{
 +    <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>{
 +        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class); <span class="hljs-comment">// #1</span>
 +        context.start(); <span class="hljs-comment">// #2</span>
 +        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class); <span class="hljs-comment">// #3</span>
 +        String hello = greetingServiceConsumer.doSayHello(<span class="hljs-string">"annotation"</span>); <span class="hljs-comment">// #4</span>
 +        System.out.println(<span class="hljs-string">"result: "</span> + hello); <span class="hljs-comment">// #5</span>
 +    }
 +}
 +</code></pre>
 +<p>Description:</p>
 +<ul>
 +<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>
 +<li>start <code>Spring Context</code>.</li>
 +<li>Find <code>bean</code> which type is <code>GreetingServiceConsumer</code> from <code>Context</code>.</li>
 +<li>Call the <code>doSayHello</code> method and finally initiate a remote call via Dubbo's service reference (marked by @Reference)</li>
 +<li>Print call result
 +Start the Server's <code>main</code> method, you will see the following output, which returns the <code>result</code>:  hello, annotation:</li>
 +</ul>
 +<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;interfac [...]
 +[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="hl [...]
 +result: hello, annotation
 +</code></pre>
 +<h2>Conclusion</h2>
 +<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>
 +<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>   [...]
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.html
index 040ac48,0000000..ff8133e
mode 100644,000000..100644
--- a/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.html
+++ b/en-us/blog/dubbo-basic-usage-dubbo-provider-configuration.html
@@@ -1,405 -1,0 +1,405 @@@
 +<!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, Provider, Configuration" />
 +	<meta name="description" content="This article will introduce you how to config Dubbo, by XML, property files, annotations or Java code." />
 +	<!-- 网页标签标题 -->
 +	<title>Dubbo Basic Usage -- Dubbo Provider Configuration</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="/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 h [...]
 +<h1>Dubbo Basic Usage</h1>
 +<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>
 +<h2>Dubbo Provider Configuration</h2>
 +<h3>Provider Configuration in Detail</h3>
 +<p>The configuration mode of Dubbo Provider has 4 different ways: XML Configuration, Properties Configuration, API Invocation Mode Configuration and Annotation Configuration.</p>
 +<h4>XML Configuration</h4>
 +<h6>The simplest configuration example:</h6>
 +<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 +&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
 +    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 +    xmlns:dubbo=&quot;http://dubbo.apache.org/schema/dubbo&quot;
 +    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;  
 +    &lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;  
 +    &lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;  
 +    &lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;  
 +    &lt;dubbo:service interface=&quot;com.alibaba.dubbo.demo.DemoService&quot; ref=&quot;demoServiceLocal&quot; /&gt;  
 +    &lt;dubbo:reference id=&quot;demoServiceRemote&quot; interface=&quot;com.alibaba.dubbo.demo.DemoService&quot; /&gt;  
 +&lt;/beans&gt;
 +</code></pre>
 +<p>In the example above,note the way to write dubbo schema:</p>
 +<pre><code>&lt;beans xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 +       xmlns:dubbo=&quot;http://code.alibabatech.com/schema/dubbo&quot;
 +       xmlns=&quot;http://www.springframework.org/schema/beans&quot;
 +       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 +       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&quot;&gt;
 +</code></pre>
 +<h6>Supported Configuration Tags</h6>
 +<table>
 +<thead>
 +<tr>
 +<th>Tags</th>
 +<th>Application</th>
 +<th style="text-align:left">Describe</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td>&lt;dubbo:service/&gt;</td>
 +<td>Service Configuration</td>
 +<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>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:reference/&gt;</td>
 +<td>Reference Configuration</td>
 +<td style="text-align:left">Create a remote service agent, one reference can point to multiple registry centers</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:protocol/&gt;</td>
 +<td>Protocol Configuration</td>
 +<td style="text-align:left">Configure protocol information for providing services, protocol is specified by the provider and accepted passively by the consumer</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:application/&gt;</td>
 +<td>Application Configuration</td>
 +<td style="text-align:left">Configure current application information, regardless of whether the application is provider or consumer</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:module/&gt;</td>
 +<td>Module Configuration</td>
 +<td style="text-align:left">Configure current module information. Optional</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:registry/&gt;</td>
 +<td>Registry Center Configuration</td>
 +<td style="text-align:left">Configure information related to connect registry centers</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:monitor/&gt;</td>
 +<td>Monitoring Center Configuration</td>
 +<td style="text-align:left">Configure information related to connect monitor centers. Optional</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:provider/&gt;</td>
 +<td>Provider Configuration</td>
 +<td style="text-align:left">When some properties ProtocolConfig or ServiceConfig are not configured, use this default value. Optional</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:consumer/&gt;</td>
 +<td>Consumer Configuration</td>
 +<td style="text-align:left">When some properties of ReferenceConfig are not configured, use this default value. Optional</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:method/&gt;</td>
 +<td>Method Configuration</td>
 +<td style="text-align:left">Configure specific method level information of ServiceConfig and ReferenceConfig</td>
 +</tr>
 +<tr>
 +<td>&lt;dubbo:argument/&gt;</td>
 +<td>Parameter Configuration</td>
 +<td style="text-align:left">Configure parameters of specific method</td>
 +</tr>
 +</tbody>
 +</table>
 +<p><img src="https://cdn.yuque.com/lark/0/2018/png/15841/1527849348155-8423d401-9ea4-4dc6-8720-d9e3d90963b6.png" alt="undefined"></p>
 + <center>Configuration Diagram</center>
 +<h6>Configuration item in detail</h6>
 +<ul>
 +<li>
 +<p>&lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;<br>
 +Apply 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>
 +</li>
 +<li>
 +<p>&lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;<br>
 +Configure 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>
 +</li>
 +<li>
 +<p>&lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;<br>
 +Here is the transport protocol and the default port, generally no changes are required.</p>
 +</li>
 +</ul>
 +<blockquote>
 +<p>Next, we will focus on the configuration of &lt;dubbo:service/&gt;</p>
 +</blockquote>
 +<ul>
 +<li>&lt;dubbo:service/&gt;mainly supports the following properties:</li>
 +</ul>
 +<table>
 +<thead>
 +<tr>
 +<th>Properties Name</th>
 +<th>Description</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td>version</td>
 +<td>Version number</td>
 +</tr>
 +<tr>
 +<td>scope</td>
 +<td>Service visibility, value can be local or remote,remote by default</td>
 +</tr>
 +<tr>
 +<td>actives</td>
 +<td>Maximum number of activated requests</td>
 +</tr>
 +<tr>
 +<td>async</td>
 +<td>Whether the method called asynchronously,false by default</td>
 +</tr>
 +<tr>
 +<td>cache</td>
 +<td>Service cache,optional value:lru/threadlocal/jcache</td>
 +</tr>
 +<tr>
 +<td>callbacks</td>
 +<td>Limitation of callback instance</td>
 +</tr>
 +<tr>
 +<td>generic</td>
 +<td>Generalized calls which can be bypassed</td>
 +</tr>
 +<tr>
 +<td>class</td>
 +<td>The implementation of the service's class name</td>
 +</tr>
 +<tr>
 +<td>connections</td>
 +<td>The number of connections in the service</td>
 +</tr>
 +<tr>
 +<td>delay</td>
 +<td>The number of milliseconds delay for publicating the service</td>
 +</tr>
 +<tr>
 +<td>executes</td>
 +<td>Upper bound of service execution requests</td>
 +</tr>
 +<tr>
 +<td>retries</td>
 +<td>Timeout retry times</td>
 +</tr>
 +<tr>
 +<td>timeout</td>
 +<td>Invocation timeout time</td>
 +</tr>
 +</tbody>
 +</table>
 +<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>
 +<ul>
 +<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>
 +</ul>
 +<table>
 +<thead>
 +<tr>
 +<th>Properties Name</th>
 +<th>Description</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td>executes</td>
 +<td>Upper bound of service execution requests</td>
 +</tr>
 +<tr>
 +<td>retries</td>
 +<td>Timeout retry times</td>
 +</tr>
 +<tr>
 +<td>timeout</td>
 +<td>Invocation timeout time</td>
 +</tr>
 +</tbody>
 +</table>
 +<p>For other properties,you can refer to xsd above。</p>
 +<h6>Configuration Override Relationship</h6>
 +<p><img src="https://cdn.yuque.com/lark/0/2018/png/15841/1527849374313-94a5ea24-0e72-4d83-871b-e0e95eab646a.png" alt="undefined"></p>
 +<center>Configuration Coverage Relationship Diagram</center>
 +<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>
 +<h4>dubbo.properties Configuration</h4>
 +<blockquote>
 +<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>
 +</blockquote>
 +<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>
 +<h6>dubbo.properties Configuration example</h6>
 +<pre><code># application name
 +dubbo.application.name=dubbodemo-provider
 +# registry center address
 +dubbo.registry.address=zookeeper://localhost:2181
 +# Example of broadcasting registry center
 +#dubbo.registry.address=multicast://224.5.6.7:1234
 +# address for calling protocol
 +dubbo.protocol.name=dubbo
 +dubbo.protocol.port=28080
 +</code></pre>
 +<h6>Mapping Rule</h6>
 +<p>Split the tag name and properties in XML configuration with dots, and multiple properties should be split into multiple lines</p>
 +<ul>
 +<li>For example: dubbo.application.name=foo equivalents to &lt;dubbo:application name=&quot;foo&quot; /&gt;</li>
 +<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>
 +</ul>
 +<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>
 +<ul>
 +<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>
 +<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>
 +</ul>
 +<h6>Coverage Strategy</h6>
 +<p><img src="https://cdn.yuque.com/lark/0/2018/png/15841/1527849393591-2c3de248-1b3d-47d3-bd10-8b415e9fcd39.png" alt="undefined"></p>
 +<ul>
 +<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>
 +<li>Then comes to XML, the configurations in dubbo.properties are invalid, if they are configured in XML.</li>
 +<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>
 +</ul>
 +<blockquote>
 +<p>Note:</p>
 +</blockquote>
 +<ol>
 +<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>
 +<li>When the protocol's id is not configured, protocol name will be used as id as default.</li>
 +</ol>
 +<h4>Annotation</h4>
 +<h6>Service Annotation Exposure Service</h6>
 +<pre><code>import com.alibaba.dubbo.config.annotation.Service;
 +
 +@Service(timeout = 5000)
 +public class AnnotateServiceImpl implements AnnotateService { 
 +    // ...
 +}
 +</code></pre>
 +<h6>Javaconfig Configuration Public Module</h6>
 +<pre><code>@Configuration
 +public class DubboConfiguration {
 +
 +    @Bean
 +    public ApplicationConfig applicationConfig() {
 +        ApplicationConfig applicationConfig = new ApplicationConfig();
 +        applicationConfig.setName(&quot;provider-test&quot;);
 +        return applicationConfig;
 +    }
 +
 +    @Bean
 +    public RegistryConfig registryConfig() {
 +        RegistryConfig registryConfig = new RegistryConfig();
 +        registryConfig.setAddress(&quot;zookeeper://127.0.0.1:2181&quot;);
 +        registryConfig.setClient(&quot;curator&quot;);
 +        return registryConfig;
 +    }
 +}
 +</code></pre>
 +<p>The result of configuration using this method is the same as that of using xml.</p>
 +<h6>Specify the Dubbo Scan Path</h6>
 +<pre><code>@SpringBootApplication
 +@DubboComponentScan(basePackages = &quot;com.alibaba.dubbo.test.service.impl&quot;)
 +public class ProviderTestApp {
 +    // ...
 +}
 +</code></pre>
 +<p>or use the spring bean xml configuration:</p>
 +<pre><code>&lt;dubbo:annotation package=&quot;com.chanshuyi.service.impl&quot; /&gt;
 +</code></pre>
 +<h4>API Trigger Directly</h4>
 +<pre><code>import com.alibaba.dubbo.rpc.config.ApplicationConfig;
 +import com.alibaba.dubbo.rpc.config.RegistryConfig;
 +import com.alibaba.dubbo.rpc.config.ProviderConfig;
 +import com.alibaba.dubbo.rpc.config.ServiceConfig;
 +import com.xxx.XxxService;
 +import com.xxx.XxxServiceImpl;
 +
 +// Service implementation
 +XxxService xxxService = new XxxServiceImpl();
 +
 +// current application configuration
 +ApplicationConfig application = new ApplicationConfig();
 +application.setName(&quot;xxx&quot;);
 +
 +// connect to registry center configuration
 +RegistryConfig registry = new RegistryConfig();
 +registry.setAddress(&quot;10.20.130.230:9090&quot;);
 +registry.setUsername(&quot;aaa&quot;);
 +registry.setPassword(&quot;bbb&quot;);
 +
 +// service provider's protocol configuration
 +ProtocolConfig protocol = new ProtocolConfig();
 +protocol.setName(&quot;dubbo&quot;);
 +protocol.setPort(12345);
 +protocol.setThreads(200);
 +
 +// Note: ServiceConfig is a heavy object, which encapsulated the connection with registry center internally, and open the service port
 +
 +// Service provider exposes service configuration
 +ServiceConfig&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.
 +service.setApplication(application);
 +service.setRegistry(registry); // multiple registry centers can use setRegistries()
 +service.setProtocol(protocol); // multiple protocols can use setProtocols()
 +service.setInterface(XxxService.class);
 +service.setRef(xxxService);
 +service.setVersion(&quot;1.0.0&quot;);
 +
 +// exposure and register service
 +service.export();
 +</code></pre>
 +<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>
 +<h3>Provider Interface and Implement</h3>
 +<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>
 +<p>There is only one service UserReadService, and one method getUserById in this example.
 +This service need to be exposed to a remote service by Dubbo. Detail steps are shown below:</p>
 +<ol>
 +<li>Create Project
 +Skip 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>
 +<li>Define Interface
 +Define interface: UserReadService</li>
 +</ol>
 +<pre><code>public interface UserReadService{
 +    public User getUserById(Long userId);
 +}
 +</code></pre>
 +<p>Generally, this interface should be placed in an independent JAR file as a client package.
 +Generally, the other services need to refer this client package if they want to consume this service(except for generalized call).
 +3. Implement Interface
 +Implement UserReadService, and deploy current implementation in the Provider's application.</p>
 +<pre><code>public UserReadServiceImpl implements UserReadService{
 +    public User getUserById(Long userId){
 +        return xxx;
 +    }
 +}
 +</code></pre>
 +<ol start="4">
 +<li>Dubbo Configuration</li>
 +</ol>
 +<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 +&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
 +    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 +    xmlns:dubbo=&quot;http://dubbo.apache.org/schema/dubbo&quot;
 +    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;  
 +    &lt;dubbo:application name=&quot;hello-world-app&quot; /&gt;  
 +    &lt;dubbo:registry address=&quot;multicast://224.5.6.7:1234&quot; /&gt;  
 +    &lt;dubbo:protocol name=&quot;dubbo&quot; port=&quot;20880&quot; /&gt;  
 +    &lt;bean id=&quot;userReadService&quot; class=&quot;com.package.UserReadServiceImpl&quot;/&gt;
 +    &lt;dubbo:service interface=&quot;com.package.UserReadService&quot; ref=&quot;userReadService&quot; /&gt;  
 +&lt;/beans&gt;
 +</code></pre>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-fescar.html
index 9f4db14,0000000..f9b4f48
mode 100644,000000..100644
--- a/en-us/blog/dubbo-fescar.html
+++ b/en-us/blog/dubbo-fescar.html
@@@ -1,215 -1,0 +1,215 @@@
 +<!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,Fescar,Consistency" />
 +	<meta name="description" content="This article will introduce you how to use Fescar to ensure consistency between Dubbo Microservices." />
 +	<!-- 网页标签标题 -->
 +	<title>How to use Fescar to ensure consistency between Dubbo Microservices</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="/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 h [...]
 +<h2>Use case</h2>
 +<p>A business logic for user purchasing commodities. The whole business logic is powered by 3 microservices:</p>
 +<ul>
 +<li>Storage service: deduct storage count on given commodity.</li>
 +<li>Order service: create order according to purchase request.</li>
 +<li>Account service: debit the balance of user's account.</li>
 +</ul>
 +<h3>Architecture</h3>
 +<p><img src="../../img/blog/fescar/fescar-1.png" alt="Architecture"></p>
 +<h3>StorageService</h3>
 +<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">StorageService</span> </span>{
 +
 +    <span class="hljs-comment">/**
 +     * deduct storage count
 +     */</span>
 +    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">deduct</span><span class="hljs-params">(String commodityCode, <span class="hljs-keyword">int</span> count)</span></span>;
 +}
 +</code></pre>
 +<h3>OrderService</h3>
 +<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">OrderService</span> </span>{
 +
 +    <span class="hljs-comment">/**
 +     * create order
 +     */</span>
 +    <span class="hljs-function">Order <span class="hljs-title">create</span><span class="hljs-params">(String userId, String commodityCode, <span class="hljs-keyword">int</span> orderCount)</span></span>;
 +}
 +</code></pre>
 +<h3>AccountService</h3>
 +<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">AccountService</span> </span>{
 +
 +    <span class="hljs-comment">/**
 +     * debit balance of user's account
 +     */</span>
 +    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">debit</span><span class="hljs-params">(String userId, <span class="hljs-keyword">int</span> money)</span></span>;
 +}
 +</code></pre>
 +<h3>Main business logic</h3>
 +<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">BusinessServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">BusinessService</span> </span>{
 +
 +    <span class="hljs-keyword">private</span> StorageService storageService;
 +
 +    <span class="hljs-keyword">private</span> OrderService orderService;
 +
 +    <span class="hljs-comment">/**
 +     * purchase
 +     */</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">purchase</span><span class="hljs-params">(String userId, String commodityCode, <span class="hljs-keyword">int</span> orderCount)</span> </span>{
 +
 +        storageService.deduct(commodityCode, orderCount);
 +
 +        orderService.create(userId, commodityCode, orderCount);
 +    }
 +}
 +</code></pre>
 +<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">StorageServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">StorageService</span> </span>{
 +
 +  <span class="hljs-keyword">private</span> StorageDAO storageDAO;
 +  
 +    <span class="hljs-meta">@Override</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">deduct</span><span class="hljs-params">(String commodityCode, <span class="hljs-keyword">int</span> count)</span> </span>{
 +        Storage storage = <span class="hljs-keyword">new</span> Storage();
 +        storage.setCount(count);
 +        storage.setCommodityCode(commodityCode);
 +        storageDAO.update(storage);
 +    }
 +}
 +</code></pre>
 +<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">OrderServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">OrderService</span> </span>{
 +
 +    <span class="hljs-keyword">private</span> OrderDAO orderDAO;
 +
 +    <span class="hljs-keyword">private</span> AccountService accountService;
 +
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> Order <span class="hljs-title">create</span><span class="hljs-params">(String userId, String commodityCode, <span class="hljs-keyword">int</span> orderCount)</span> </span>{
 +
 +        <span class="hljs-keyword">int</span> orderMoney = calculate(commodityCode, orderCount);
 +
 +        accountService.debit(userId, orderMoney);
 +
 +        Order order = <span class="hljs-keyword">new</span> Order();
 +        order.userId = userId;
 +        order.commodityCode = commodityCode;
 +        order.count = orderCount;
 +        order.money = orderMoney;
 +
 +        <span class="hljs-keyword">return</span> orderDAO.insert(order);
 +    }
 +}
 +</code></pre>
 +<h2>Distributed Transaction Solution with Fescar</h2>
 +<p><img src="../../img/blog/fescar/fescar-2.png" alt="undefined"></p>
 +<p>We just need an annotation <code>@GlobalTransactional</code> on business method:</p>
 +<pre><code class="language-java">
 +    <span class="hljs-meta">@GlobalTransactional</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">purchase</span><span class="hljs-params">(String userId, String commodityCode, <span class="hljs-keyword">int</span> orderCount)</span> </span>{
 +        ......
 +    }
 +</code></pre>
 +<h2>Example powered by Dubbo + Fescar</h2>
 +<h3>Step 1: Setup database</h3>
 +<ul>
 +<li>Requirement: MySQL with InnoDB engine.</li>
 +</ul>
 +<p><strong>Note:</strong> In fact, there should be 3 database for the 3 services in the example use case. However, we can just create one database and configure 3 data sources for simple.</p>
 +<p>Modify Spring XML with the database URL/username/password you just created.</p>
 +<p>dubbo-account-service.xml
 +dubbo-order-service.xml
 +dubbo-storage-service.xml</p>
 +<pre><code class="language-xml">    <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"url"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"jdbc:mysql://x.x.x.x:3306/xxx"</span> /&gt;</span>
 +    <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xxx"</span> /&gt;</span>
 +    <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"xxx"</span> /&gt;</span>
 +</code></pre>
 +<h3>Step 2: Create undo_log table for Fescar</h3>
 +<p><code>UNDO_LOG</code> table is required by Fescar AT mode.</p>
 +<pre><code class="language-sql"><span class="hljs-comment">-- Note that when Fescar version is upgraded to 0.3.0+, it is changed from the previous normal index to the unique index.</span>
 +<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`undo_log`</span> (
 +  <span class="hljs-string">`id`</span> <span class="hljs-built_in">bigint</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
 +  <span class="hljs-string">`branch_id`</span> <span class="hljs-built_in">bigint</span>(<span class="hljs-number">20</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`xid`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`rollback_info`</span> longblob <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`log_status`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`log_created`</span> datetime <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`log_modified`</span> datetime <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`ext`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">100</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
 +  PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>),
 +  <span class="hljs-keyword">UNIQUE</span> <span class="hljs-keyword">KEY</span> <span class="hljs-string">`ux_undo_log`</span> (<span class="hljs-string">`xid`</span>,<span class="hljs-string">`branch_id`</span>)
 +) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">1</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;
 +</code></pre>
 +<h3>Step 3: Create tables for example business</h3>
 +<pre><code class="language-sql">
 +<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`storage_tbl`</span>;
 +<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`storage_tbl`</span> (
 +  <span class="hljs-string">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
 +  <span class="hljs-string">`commodity_code`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`count`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">0</span>,
 +  PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>),
 +  <span class="hljs-keyword">UNIQUE</span> <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`commodity_code`</span>)
 +) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;
 +
 +
 +<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`order_tbl`</span>;
 +<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`order_tbl`</span> (
 +  <span class="hljs-string">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
 +  <span class="hljs-string">`user_id`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`commodity_code`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`count`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">0</span>,
 +  <span class="hljs-string">`money`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">0</span>,
 +  PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>)
 +) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;
 +
 +
 +<span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`account_tbl`</span>;
 +<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`account_tbl`</span> (
 +  <span class="hljs-string">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT,
 +  <span class="hljs-string">`user_id`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">255</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span>,
 +  <span class="hljs-string">`money`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">11</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-number">0</span>,
 +  PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>)
 +) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;
 +</code></pre>
 +<h3>Step 4: Start Fescar-Server</h3>
 +<ul>
 +<li>Download server <a href="https://github.com/alibaba/fescar/releases">package</a>, unzip it.</li>
 +<li>Start Fescar-Server</li>
 +</ul>
 +<pre><code class="language-shell">sh fescar-server.sh $LISTEN_PORT $PATH_FOR_PERSISTENT_DATA
 +
 +e.g.
 +
 +sh fescar-server.sh 8091 /home/admin/fescar/data/
 +</code></pre>
 +<h3>Step 5: Run example</h3>
 +<ul>
 +<li>Start AccountService (<a href="https://github.com/fescar-group/fescar-samples/blob/master/dubbo/src/main/java/com/alibaba/fescar/samples/dubbo/starter/DubboAccountServiceStarter.java">DubboAccountServiceStarter</a>).</li>
 +<li>Start StorageService (<a href="https://github.com/fescar-group/fescar-samples/blob/master/dubbo/src/main/java/com/alibaba/fescar/samples/dubbo/starter/DubboStorageServiceStarter.java">DubboStorageServiceStarter</a>).</li>
 +<li>Start OrderService (<a href="https://github.com/fescar-group/fescar-samples/blob/master/dubbo/src/main/java/com/alibaba/fescar/samples/dubbo/starter/DubboOrderServiceStarter.java">DubboOrderServiceStarter</a>).</li>
 +<li>Run BusinessService for test (<a href="https://github.com/fescar-group/fescar-samples/blob/master/dubbo/src/main/java/com/alibaba/fescar/samples/dubbo/starter/DubboBusinessTester.java">DubboBusinessTester</a>).</li>
 +</ul>
 +<h3>Related projects</h3>
 +<ul>
 +<li>fescar:          <a href="https://github.com/alibaba/fescar/">https://github.com/alibaba/fescar/</a></li>
 +<li>fescar-samples : <a href="https://github.com/fescar-group/fescar-samples">https://github.com/fescar-group/fescar-samples</a></li>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-generic-invoke.html
index 5921b0a,0000000..e94d317
mode 100644,000000..100644
--- a/en-us/blog/dubbo-generic-invoke.html
+++ b/en-us/blog/dubbo-generic-invoke.html
@@@ -1,175 -1,0 +1,175 @@@
 +<!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, Generic invoke" />
 +	<meta name="description" content="This article introduces you when and how to use generic invoke of Dubbo." />
 +	<!-- 网页标签标题 -->
 +	<title>Generic invoke of Dubbo</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="/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 h [...]
 +<p>The generic invoke could be considered to be used in the following cases:</p>
 +<ul>
 +<li>Service test platform</li>
 +<li>API service gateway</li>
 +</ul>
 +<p>The generic invoke is mainly used when the consumer does not have an API interface;
 +instead 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>.
 +Generic invoke does not require attention on the server and can be exposed as normal services.</p>
 +<p>Next, let's take a look at how the consumer uses generic invoke for service call.</p>
 +<h2>Generic invoke through Spring XML configuration</h2>
 +<p>Declare <code>generic=&quot;true&quot;</code> in Spring configuration, such as</p>
 +<pre><code class="language-xml">"userService" interface="com.alibaba.dubbo.samples.generic.api.IUserService" generic="true"/&gt;
 +</code></pre>
 +<p>Where you need to use it, you can call it by forcing a type cast to GenericService.</p>
 +<pre><code class="language-java">GenericService userService = (GenericService) context.getBean(<span class="hljs-string">"userService"</span>);
 +<span class="hljs-comment">// primary param and return value</span>
 +String 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>});
 +System.out.println(name);
 +</code></pre>
 +<p>Among them,</p>
 +<ol>
 +<li>
 +<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>
 +</li>
 +<li>
 +<p>For arrays of method parameter types</p>
 +<p>i.	If it is a basic type, such as int or long, use <code>int.class.getName()</code> to get its type;</p>
 +<p>ii. If it is a basic type array, such as int[], use <code>int[].class.getName()</code>;</p>
 +<p>iii.	If it is a POJO, use the full class name directly, such as <code>com.alibaba.dubbo.samples.generic.api.Params</code>.</p>
 +</li>
 +</ol>
 +<h2>Generic invoke through API programming</h2>
 +<pre><code class="language-java">ApplicationConfig application = <span class="hljs-keyword">new</span> ApplicationConfig()ApplicationConfig application = <span class="hljs-keyword">new</span> ApplicationConfig();
 +application.setName(<span class="hljs-string">"api-generic-consumer"</span>);
 +
 +RegistryConfig registry = <span class="hljs-keyword">new</span> RegistryConfig();
 +registry.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>);
 +
 +application.setRegistry(registry);
 +
 +ReferenceConfig&lt;GenericService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 +<span class="hljs-comment">// weak type interface name</span>
 +reference.setInterface(<span class="hljs-string">"com.alibaba.dubbo.samples.generic.api.IUserService"</span>);
 +<span class="hljs-comment">// declared as a generalized interface</span>
 +reference.setGeneric(<span class="hljs-keyword">true</span>);
 +
 +reference.setApplication(application);
 +
 +<span class="hljs-comment">// replace all interface references with com.alibaba.dubbo.rpc.service.GenericService</span>
 +GenericService genericService = reference.get();
 +
 +String 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>});
 +System.out.println(name);
 +</code></pre>
 +<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>
 +<h2>The case where parameters or return values are POJOs</h2>
 +<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>
 +<p>The following is the code of the consumer:</p>
 +<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>};
 +Map&lt;String, Object&gt; params = <span class="hljs-keyword">new</span> HashMap&lt;String, Object&gt;();
 +param.put(<span class="hljs-string">"class"</span>, <span class="hljs-string">"com.alibaba.dubbo.samples.generic.api.Params"</span>);
 +param.put(<span class="hljs-string">"query"</span>, <span class="hljs-string">"a=b"</span>);
 +Object user = userService.$invoke(<span class="hljs-string">"get"</span>, parameterTypes, <span class="hljs-keyword">new</span> Object[]{param});
 +System.out.println(<span class="hljs-string">"sample one result: "</span> + user);
 +</code></pre>
 +<p>The output of the above code is:</p>
 +<pre><code>sample one result: {name=charles, id=1, class=com.alibaba.dubbo.samples.generic.api.User}
 +</code></pre>
 +<p>Here, the Dubbo framework will automatically convert the return value from POJO to Map.
 +It can be seen that the return value <code>user</code> is a HashMap, which stores three k/vs, name, id, and class.</p>
 +<h2>Generic interface implementation</h2>
 +<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>
 +<h3>Implementation GenericService on the server</h3>
 +<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>{
 +    <span class="hljs-meta">@Override</span>
 +    <span class="hljs-keyword">public</span> Object $invoke(String method, String[] parameterTypes, Object[] args) <span class="hljs-keyword">throws</span> GenericException {
 +        <span class="hljs-keyword">if</span> (method.equals(<span class="hljs-string">"hi"</span>)) {
 +            <span class="hljs-keyword">return</span> <span class="hljs-string">"hi, "</span> + args[<span class="hljs-number">0</span>];
 +        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (method.equals(<span class="hljs-string">"hello"</span>)) {
 +            <span class="hljs-keyword">return</span> <span class="hljs-string">"hello, "</span> + args[<span class="hljs-number">0</span>];
 +        }
 +
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"welcome"</span>;
 +    }
 +}
 +</code></pre>
 +<h3>Server exposed service</h3>
 +<pre><code class="language-java">ApplicationConfig application = <span class="hljs-keyword">new</span> ApplicationConfig();
 +application.setName(<span class="hljs-string">"api-generic-provider"</span>);
 +
 +RegistryConfig registry = <span class="hljs-keyword">new</span> RegistryConfig();
 +registry.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>);
 +
 +application.setRegistry(registry);
 +
 +GenericService genericService = <span class="hljs-keyword">new</span> GenericServiceImpl();
 +
 +ServiceConfig&lt;GenericService&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;GenericService&gt;();
 +service.setApplication(application);
 +service.setInterface(<span class="hljs-string">"com.alibaba.dubbo.samples.generic.api.HelloService"</span>);
 +service.setRef(genericService);
 +service.export();
 +
 +ServiceConfig&lt;GenericService&gt; service2 = <span class="hljs-keyword">new</span> ServiceConfig&lt;GenericService&gt;();
 +service2.setApplication(application);
 +service2.setInterface(<span class="hljs-string">"com.alibaba.dubbo.samples.generic.api.HiService"</span>);
 +service2.setRef(genericService);
 +service2.export();
 +</code></pre>
 +<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>
 +<h3>Service invoke on the consumer</h3>
 +<pre><code class="language-java">ApplicationConfig application = <span class="hljs-keyword">new</span> ApplicationConfig();
 +application.setName(<span class="hljs-string">"api-generic-consumer"</span>);
 +
 +RegistryConfig registry = <span class="hljs-keyword">new</span> RegistryConfig();
 +registry.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>);
 +
 +application.setRegistry(registry);
 +
 +ReferenceConfig&lt;GenericService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 +<span class="hljs-comment">// weak type interface name</span>
 +reference.setInterface(HiService.class);
 +reference.setApplication(application);
 +
 +HiService hiService = (HiService) reference.get();
 +System.out.println(hiService.hi(<span class="hljs-string">"dubbo"</span>));
 +
 +ReferenceConfig&lt;GenericService&gt; reference2 = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 +<span class="hljs-comment">// weak type interface name</span>
 +reference2.setInterface(HelloService.class);
 +reference2.setApplication(application);
 +
 +HelloService helloService = (HelloService) reference2.get();
 +System.out.println(helloService.hello(<span class="hljs-string">"community"</span>));
 +</code></pre>
 +<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>
 +<p>So far, a simple service Mock platform has been successfully launched!</p>
 +<h2>Others</h2>
 +<ul>
 +<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>
 +<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>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-invoke.html
index 86ac746,0000000..c1ad007
mode 100644,000000..100644
--- a/en-us/blog/dubbo-invoke.html
+++ b/en-us/blog/dubbo-invoke.html
@@@ -1,193 -1,0 +1,193 @@@
 +<!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, Invoke, Async" />
 +	<meta name="description" content="This article introduces you how to use Dubbo synchronously or asynchronously." />
 +	<!-- 网页标签标题 -->
 +	<title>Dubbo: Several ways about synchronous/asynchronous invoke</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="/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 h [...]
 +<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>
 +<ul>
 +<li>synchronous invoke</li>
 +<li>asynchronous invoke</li>
 +<li>parameters callback</li>
 +<li>event notification</li>
 +</ul>
 +<h3>Synchronous invoke</h3>
 +<p>Synchronous invoke is a kind of blocking invocation mode, that is the Consumer keeps blocking and waiting, until the Provider returns.</p>
 +<p>Generally, a typical synchronous invocation process is as follows:</p>
 +<ol>
 +<li>Consumer service thread invokes the remote API and sends requests to the Provider. Meanwhile, the current service thread stays in blocking state;</li>
 +<li>Provider process relative request after receiving it from Consumer. Then returns the results to Consumer;</li>
 +<li>After Consumer receiving results, the current thread continues to execute.</li>
 +</ol>
 +<p>Here are two problems:</p>
 +<ol>
 +<li>How does Consumer service thread turn into <code>blocking</code> state?</li>
 +<li>How does the service thread be awaked to execute after Consumer receiving results?</li>
 +</ol>
 +<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  [...]
 +<h3>Asynchronous invoke</h3>
 +<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>
 +<p>Asynchronous invoke does not need specific configuration for Provider. In the example,the API of Provider is defined as follow:</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">AsyncService</span> </span>{
 +    <span class="hljs-function">String <span class="hljs-title">goodbye</span><span class="hljs-params">(String name)</span></span>;
 +}
 +</code></pre>
 +<h5>Consumer configuration</h5>
 +<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>
 +    <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>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">dubbo:reference</span>&gt;</span>
 +</code></pre>
 +<p>Notice that if we need an asynchronous revoke method, we must use <code>&lt;dubbo:method/&gt;</code> label to describe it.</p>
 +<h5>Consumer triggers invocation</h5>
 +<pre><code class="language-java">AsyncService service = ...;
 +String result = service.goodbye(<span class="hljs-string">"samples"</span>);<span class="hljs-comment">// returns NULL and DO NOT use!</span>
 +Future&lt;String&gt; future = RpcContext.getContext().getFuture();
 +... <span class="hljs-comment">// other service thread logic</span>
 +result = future.get(); <span class="hljs-comment">// could use get(timeout, unit) to configure timeout, when it needs to get the asynchronous result</span>
 +</code></pre>
 +<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>
 +<p>Under several special conditions, it could be set whether to wait for sending the request, to accelerate the return of invocation:</p>
 +<ul>
 +<li><code>sent=&quot;true&quot;</code> Waiting for sending the request, and return an exception if it fails;</li>
 +<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>
 +</ul>
 +<p>We set it to <code>false</code> by default. And detailed configuration is as follows:</p>
 +<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>
 +</code></pre>
 +<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>
 +<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>
 +</code></pre>
 +<p>At this time,<code>RpcContext.getContext().getFuture()</code> will return <code>null</code>。</p>
 +<p>The complete sequence diagram of asynchronous invoke is as follow:</p>
 +<p><img src="../../img/blog/dubbo-async.svg" alt="Asynchronous invoke"></p>
 +<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>
 +<h3>Parameters callback</h3>
 +<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>
 +<h5>Service and Callback definition of Provider</h5>
 +<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>{
 +    <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>;
 +}
 +
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">CallbackListener</span> </span>{
 +    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">changed</span><span class="hljs-params">(String msg)</span></span>;
 +}
 +</code></pre>
 +<h5>Service implementation of Provider</h5>
 +<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>{
 +
 +    <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;();
 +
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">CallbackServiceImpl</span><span class="hljs-params">()</span> </span>{
 +        Thread t = <span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> Runnable() {
 +            <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>{
 +                <span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>) {
 +                    <span class="hljs-keyword">try</span> {
 +                        <span class="hljs-keyword">for</span> (Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()) {
 +                            <span class="hljs-keyword">try</span> {
 +                                entry.getValue().changed(getChanged(entry.getKey()));
 +                            } <span class="hljs-keyword">catch</span> (Throwable t) {
 +                                listeners.remove(entry.getKey());
 +                            }
 +                        }
 +                        Thread.sleep(<span class="hljs-number">5000</span>); <span class="hljs-comment">// timely trigger change event</span>
 +                    } <span class="hljs-keyword">catch</span> (Throwable t) {
 +                        t.printStackTrace();
 +                    }
 +                }
 +            }
 +        });
 +        t.setDaemon(<span class="hljs-keyword">true</span>);
 +        t.start();
 +    }
 +
 +    <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>{
 +        listeners.put(key, listener);
 +        listener.changed(getChanged(key)); <span class="hljs-comment">// send notification for change</span>
 +    }
 +
 +    <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>{
 +        <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());
 +    }
 +}
 +</code></pre>
 +<h5>Service exposure of Provider</h5>
 +<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>
 +
 +<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>
 +    <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>
 +        <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-comment">&lt;!--&lt;dubbo:argument type="com.demo.CallbackListener" callback="true" /&gt;--&gt;</span>
 +    <span class="hljs-tag">&lt;/<span class="hljs-name">dubbo:method</span>&gt;</span>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">dubbo:service</span>&gt;</span>
 +</code></pre>
 +<p>Here,Provider needs to declare which parameter is the Callback parameter in the method.</p>
 +<h5>Callback interface implementation of Consumer</h5>
 +<pre><code class="language-java">CallbackService callbackService = ...;
 +callbackService.addListener(<span class="hljs-string">"foo.bar"</span>, <span class="hljs-keyword">new</span> CallbackListener() {
 +        <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>{
 +            System.out.println(<span class="hljs-string">"callback1:"</span> + msg);
 +        }
 +});
 +</code></pre>
 +<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>
 +<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>
 +<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>
 +<h3>Event notification</h3>
 +<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>
 +<p>You can specify which events need to be notified during configuring Consumer, such as:</p>
 +<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoCallback"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.alibaba.dubbo.samples.notify.impl.NotifyImpl"</span> /&gt;</span>
 +
 +<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">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="hlj [...]
 +    <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>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">dubbo:reference</span>&gt;</span>
 +</code></pre>
 +<p>Among them,the code of NotifyImpl is as follow:</p>
 +<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>{
 +
 +    <span class="hljs-keyword">public</span> Map&lt;Integer, String&gt; ret = <span class="hljs-keyword">new</span> HashMap&lt;Integer, String&gt;();
 +
 +    <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>{
 +        ret.put(id, name);
 +        System.out.println(<span class="hljs-string">"onreturn: "</span> + name);
 +    }
 +
 +    <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>{
 +        System.out.println(<span class="hljs-string">"onthrow: "</span> + name);
 +    }
 +}
 +</code></pre>
 +<p>Here we address that the parameter rules of three methods in the custom Notify interface are as follows:</p>
 +<ul>
 +<li><code>oninvoke</code> method's parameters are the same as the calling method parameters;</li>
 +<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>
 +<li><code>onthrow</code> method's first parameter is an invoked exception,and the others are the same as the calling method.</li>
 +</ul>
 +<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>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-k8s.html
index 359adb3,0000000..9cf4fe2
mode 100644,000000..100644
--- a/en-us/blog/dubbo-k8s.html
+++ b/en-us/blog/dubbo-k8s.html
@@@ -1,190 -1,0 +1,190 @@@
 +<!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, Kubernetes, K8S" />
 +	<meta name="description" content="This article will try to register Dubbo service to Kubernetes and integrate with Kubernetes&#39;s multi-tenancy security system." />
 +	<!-- 网页标签标题 -->
 +	<title>Integrate Dubbo with Kubernetes</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="/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 h [...]
 +<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.
 +Dubbo'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>
 +<h1>Introduction</h1>
 +<p>Kubernates is a hierarchical system with rich secondary development function based on the expansibility.</p>
 +<ul>
 +<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>
 +<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>
 +<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>
 +</ul>
 +<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 prob [...]
 +<p><img src="../../img/blog/k8s/1.png" alt="img"></p>
 +<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>
 +<table>
 +<thead>
 +<tr>
 +<th style="text-align:left">The design of microservice</th>
 +<th style="text-align:left">The function of Kubernetes</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td style="text-align:left">Point 1:API gateway</td>
 +<td style="text-align:left">Ingress</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 2:Statelessness, distinguish between stateful and stateless applications</td>
 +<td style="text-align:left">Stateless corresponds to Deployment,and stateful corresponds to StatefulSet</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 3:Horizontal expansion of the database</td>
 +<td style="text-align:left">Headless service points to PaaS service or StatefulSet deployment</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 4:Cache</td>
 +<td style="text-align:left">Headless service points to PaaS service or StatefulSet deployment</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 5:Service splitting and service discovery</td>
 +<td style="text-align:left">Service</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 6:Service orchestration and flexibility</td>
 +<td style="text-align:left">Replicas of deployment</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 7:Unified configuration center</td>
 +<td style="text-align:left">ConfigMap</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 8:Unified log center</td>
 +<td style="text-align:left">DaemonSet deploys log agent</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 9:Circut break, current limiting and downgrade</td>
 +<td style="text-align:left">Service Mesh</td>
 +</tr>
 +<tr>
 +<td style="text-align:left">Point 10:Comprehensive monitoring</td>
 +<td style="text-align:left">Cadsivor, DaemonSet deploys and monitors Agent</td>
 +</tr>
 +</tbody>
 +</table>
 +<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>
 +<ul>
 +<li>Deployment</li>
 +<li>Delivery</li>
 +<li>APIs</li>
 +<li>Versioning</li>
 +<li>Contracts</li>
 +<li>Scaling / Autoscaling</li>
 +<li>Service Discovery</li>
 +<li>Load Balancing</li>
 +<li>Routing / Adaptive Routing</li>
 +<li>Health Checking</li>
 +<li>Configuration</li>
 +<li>Circuit Breaking</li>
 +<li>Bulk-heads</li>
 +<li>TTL / Deadlining</li>
 +<li>Latency Tracing</li>
 +<li>Service Causal Tracing</li>
 +<li>Distributed logging</li>
 +<li>Metrics Exposure, Collection</li>
 +</ul>
 +<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 Serv [...]
 +<blockquote>
 +<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>
 +</blockquote>
 +<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>
 +<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>
 +<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>
 +<blockquote>
 +<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>
 +</blockquote>
 +<p>In conclusion, the Kubernetes service has the following characteristics:</p>
 +<ul>
 +<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>
 +<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>
 +</ul>
 +<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>
 +<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>
 +<ol>
 +<li>
 +<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 t [...]
 +<p><img src="https://img.alicdn.com/tfs/TB1Kj1ktpkoBKNjSZFEXXbrEVXa-985-213.png" alt="img"></p>
 +</li>
 +<li>
 +<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>
 +</li>
 +</ol>
 +<p>The above two thoughts need to consider the following two points:</p>
 +<ol>
 +<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  [...]
 +<li>Port problem:The default Pod and Pod network interoperability is solved, need to be validated.</li>
 +</ol>
 +<h2>Demo Verification</h2>
 +<p>The following is a demo deployment through Kubernetes service in Alibaba Cloud's Container Registry and   EDAS. Visit Alibaba Cloud -》Container Registry.</p>
 +<ol>
 +<li>Create repo and bind the github codebase. As shown below.</li>
 +</ol>
 +<p><img src="https://img.alicdn.com/tfs/TB1m.tEtrorBKNjSZFjXXc_SpXa-1892-870.png" alt="img"></p>
 +<ol start="2">
 +<li>
 +<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>
 +<p><img src="https://img.alicdn.com/tfs/TB1oYqvtcIrBKNjSZK9XXagoVXa-1872-888.png" alt="img"></p>
 +</li>
 +<li>
 +<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>
 +<p><img src="https://img.alicdn.com/tfs/TB1b1p2trZnBKNjSZFKXXcGOVXa-1858-833.png" alt="img"></p>
 +</li>
 +<li>
 +<p>Application Management -&gt; Create  application, type Kubernetes application and specify the image in the container registry . As shown below.</p>
 +<p><img src="https://img.alicdn.com/tfs/TB1_YywtDCWBKNjSZFtXXaC3FXa-1737-588.png" alt="img"></p>
 +<p><img src="https://img.alicdn.com/tfs/TB18uzTtdcnBKNjSZR0XXcFqFXa-1820-861.png" alt=""></p>
 +</li>
 +<li>
 +<p>After creation , then deploy applications. As shown below.</p>
 +</li>
 +</ol>
 +<p><img src="https://img.alicdn.com/tfs/TB1fEpEtrorBKNjSZFjXXc_SpXa-1846-783.png" alt=""></p>
 +<ul>
 +<li>
 +<p>The supplementary application name cannot have uppercase letters, all lowercase, otherwise there is a problem of deployment failure.</p>
 +</li>
 +<li>
 +<p>When creating an app, after selecting the image, the next button cannot be clicked and you need to click Choose to continue.</p>
 +</li>
 +<li>
 +<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>
 +</li>
 +<li>
 +<p>The development joint of Docker and IDE integration, you need to consider the relevant plug-ins for integrating IDEA.</p>
 +</li>
 +<li>
 +<p>There is always an error in deployment, maybe there is a problem with the Kubernetes service. Need further investigation.</p>
 +</li>
 +</ul>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-loadbalance.html
index 8118b7d,0000000..076090b
mode 100644,000000..100644
--- a/en-us/blog/dubbo-loadbalance.html
+++ b/en-us/blog/dubbo-loadbalance.html
@@@ -1,258 -1,0 +1,258 @@@
 +<!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, LoadBalance" />
 +	<meta name="description" content="This article introduces you what is load balance and how load balance strategy is implemented in Dubbo." />
 +	<!-- 网页标签标题 -->
 +	<title>Dubbo&#39;s Load Balance</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="/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 h [...]
 +<h2>Background</h2>
 +<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>
 +<h2>Concepts</h2>
 +<p>Before discussing load balancing, I will explain these three concepts first.</p>
 +<ol>
 +<li>Load Balancing</li>
 +<li>Fault-tolerant Cluster</li>
 +<li>Service Route</li>
 +</ol>
 +<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>
 +<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>
 +<ol>
 +<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>
 +<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>
 +<li>As a result, calling the 7th Provider failed.</li>
 +<li>Retried other servers according to the configured Fault-tolerant Cluster mode.</li>
 +<li>The call to the 13th Provider was successful.</li>
 +</ol>
 +<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 [...]
 +<h2>Dubbo's Internal Load Balancing Strategy</h2>
 +<p>Dubbo has four Internal Load Balancing Strategies:</p>
 +<ol>
 +<li>RandomLoadBalance: Random load balancing. Choose a Provider randomly. It is Dubbo's default load balancing strategy.</li>
 +<li>Round Robin Load Balancing: Polling load balancing, then chooses one Provider.</li>
 +<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>
 +<li>ConsistentHashLoadBalance: Consistent hash load balancing. Requests with the same parameters always fall on the same machine.</li>
 +</ol>
 +<h3>1. Random Load Balancing</h3>
 +<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>
 +<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>
 +<h4>Weight-based Load Balancing Algorithm</h4>
 +<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 y [...]
 +<table>
 +<thead>
 +<tr>
 +<th>Invoker</th>
 +<th>Weight</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td>A</td>
 +<td>10</td>
 +</tr>
 +<tr>
 +<td>B</td>
 +<td>20</td>
 +</tr>
 +<tr>
 +<td>C</td>
 +<td>20</td>
 +</tr>
 +<tr>
 +<td>D</td>
 +<td>30</td>
 +</tr>
 +</tbody>
 +</table>
 +<p>The total weight of A, B, C and D is 10 + 20 + 20 + 30 = 80. Spread 80 numbers in the following diagram:</p>
 +<pre><code>+-----------------------------------------------------------------------------------+
 +|          |                    |                    |                              |
 ++-----------------------------------------------------------------------------------+
 +1          10                   30                   50                             80
 +
 +|-----A----|---------B----------|----------C---------|---------------D--------------|
 +
 +
 +---------------------15
 +
 +-------------------------------------------37
 +
 +-----------------------------------------------------------54
 +</code></pre>
 +<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>
 +<h4>Random load balancing Source code</h4>
 +<p>Below is the source code for random load balancing. For ease of reading and understanding, I removed the extraneous parts.</p>
 +<pre><code>public class RandomLoadBalance extends AbstractLoadBalance {
 +
 +    private final Random random = new Random();
 +
 +    protected &lt;T&gt; Invoker&lt;T&gt; doSelect(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) {
 +        int length = invokers.size();      // total invoker
 +        int totalWeight = 0;               // Sum of invokers' weights
 +
 +        // Determine if all the invokers have the same weight
 +        // If the weights are the same, it is simple to generate an index directly from Random.
 +        boolean sameWeight = true;
 +        for (int i = 0; i &lt; length; i++) {
 +            int weight = getWeight(invokers.get(i), invocation);
 +            totalWeight += weight; // Sum
 +            if (sameWeight &amp;&amp; i &gt; 0 &amp;&amp; weight != getWeight(invokers.get(i - 1), invocation)) {
 +                sameWeight = false;
 +            }
 +        }
 +
 +        if (totalWeight &gt; 0 &amp;&amp; !sameWeight) {
 +            // 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
 +            int offset = random.nextInt(totalWeight);
 +            for (int i = 0; i &lt; length; i++) {
 +                offset -= getWeight(invokers.get(i), invocation);
 +                if (offset &lt; 0) {
 +                    return invokers.get(i);
 +                }
 +            }
 +        }
 +        // If all invokers have the same weight
 +        return invokers.get(random.nextInt(length));
 +    }
 +}
 +</code></pre>
 +<h3>2. Round Robin Load Balancing</h3>
 +<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 [...]
 +<h3>3. Minimum Active Call Load Balancing</h3>
 +<p>Official explanation:</p>
 +<blockquote>
 +<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>
 +</blockquote>
 +<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 number [...]
 +<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>
 +<pre><code>if (leastCount == 1) {
 +    // if there is only one minimum value then return directly
 +    return invokers.get(leastIndexs[0]);
 +}
 +</code></pre>
 +<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>
 +<pre><code>if (! sameWeight &amp;&amp; totalWeight &gt; 0) {
 +    // if the weights are not equal and the toatl weight is greater than 0 then choose randomly according to total weight
 +
 +    int offsetWeight = random.nextInt(totalWeight);
 +
 +    // and determine which segment the random value falls on.
 +
 +    for (int i = 0; i &lt; leastCount; i++) {
 +        int leastIndex = leastIndexs[i];
 +        offsetWeight -= getWeight(invokers.get(leastIndex), invocation);
 +        if (offsetWeight &lt;= 0)
 +            return invokers.get(leastIndex);
 +    }
 +}
 +</code></pre>
 +<h3>4. Consistent Hash Algorithm</h3>
 +<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>
 +<p>By default, only the first parameter is hashed. Configure if you would like to modify it:</p>
 +<pre><code>&lt;dubbo:parameter key=&quot;hash.arguments&quot; value=&quot;0,1&quot; /&gt;
 +</code></pre>
 +<p>By default, 160 virtual nodes are used. Configure if you would like to modify it:</p>
 +<pre><code>&lt;dubbo:parameter key=&quot;hash.nodes&quot; value=&quot;320&quot; /&gt;
 +</code></pre>
 +<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 midd [...]
 +<h2>Load Balancing Configuration</h2>
 +<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>
 +<h3>Server Side Service Level</h3>
 +<pre><code>&lt;dubbo:service interface=&quot;...&quot; loadbalance=&quot;roundrobin&quot; /&gt;
 +</code></pre>
 +<p>All methods of the service use roundrobin load balancing.</p>
 +<h3>Client Side Service Level</h3>
 +<pre><code>&lt;dubbo:reference interface=&quot;...&quot; loadbalance=&quot;roundrobin&quot; /&gt;
 +</code></pre>
 +<p>All methods of the service use roundrobin load balancing.</p>
 +<h3>Server Side Method Level</h3>
 +<pre><code>&lt;dubbo:service interface=&quot;...&quot;&gt;
 +    &lt;dubbo:method name=&quot;hello&quot; loadbalance=&quot;roundrobin&quot;/&gt;
 +&lt;/dubbo:service&gt;
 +</code></pre>
 +<p>Only the hello method of the service uses roundrobin load balancing.</p>
 +<h3>Client Side Method Level</h3>
 +<pre><code>&lt;dubbo:reference interface=&quot;...&quot;&gt;
 +    &lt;dubbo:method name=&quot;hello&quot; loadbalance=&quot;roundrobin&quot;/&gt;
 +&lt;/dubbo:reference&gt;
 +</code></pre>
 +<p>Only the hello method of the service uses roundrobin load balancing.</p>
 +<p>Similar to other Dubbo configurations, multiple configurations are covered:</p>
 +<ol>
 +<li>The method level takes precedence, the interface level is next, and the global configuration comes last.</li>
 +<li>If the level is the same, the Consumer is given priority and the Provider is next</li>
 +</ol>
 +<p>Therefore, the priority of the above four configurations is:</p>
 +<ol>
 +<li>Client side method level configuration.</li>
 +<li>Client side interface level configuration.</li>
 +<li>Server side method level configuration.</li>
 +<li>Server side interface level configuration.</li>
 +</ol>
 +<h2>Extended Load Balancing</h2>
 +<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>
 +<ol>
 +<li>Implementing the LoadBalance interface</li>
 +</ol>
 +<p>The following is Dubbo's LoadBalance interface:</p>
 +<pre><code>@SPI(RandomLoadBalance.NAME)
 +public interface LoadBalance {
 +    @Adaptive(&quot;loadbalance&quot;)
 +    &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException;
 +}
 +</code></pre>
 +<p>This is the interface of the SPI. The parameters of the select method are as follows:</p>
 +<ul>
 +<li>invokers: A list of all service Providers.</li>
 +<li>url: Some configuration information, such as interface name, check or not, serialization.</li>
 +<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>
 +</ul>
 +<pre><code>package com.demo.dubbo;
 +public class DemoLoadBalance implements LoadBalance {
 +    @Override
 +    public &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException {
 +        System.out.println(&quot;[DemoLoadBalance]Select the first invoker...&quot;);
 +        return invokers.get(0);
 +    }
 +}
 +</code></pre>
 +<ol start="2">
 +<li>Add a resource file</li>
 +</ol>
 +<p>Add a file:
 +<code>src/main/resource/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>
 +This is a simple text file. The file contents are as follows:</p>
 +<pre><code>demo=my=com.demo.dubbo.DemoLoadBalance
 +</code></pre>
 +<ol start="3">
 +<li>Configure to use custom LoadBalance</li>
 +</ol>
 +<pre><code>&lt;dubbo:reference id=&quot;helloService&quot; interface=&quot;com.demo.dubbo.api.IHelloService&quot; loadbalance=&quot;demo&quot; /&gt;
 +</code></pre>
 +<p>Configure  <code>&lt;loadbalance=&quot;demo&quot;&gt;</code> in <code>dubbo:reference</code> at the Consumer side.</p>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-meetup-beijing-may-12th-2018.html
index 1d2d5f0,0000000..2ccd60f
mode 100644,000000..100644
--- a/en-us/blog/dubbo-meetup-beijing-may-12th-2018.html
+++ b/en-us/blog/dubbo-meetup-beijing-may-12th-2018.html
@@@ -1,41 -1,0 +1,41 @@@
 +<!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, Beijing, meetup" />
 +	<meta name="description" content="The first Dubbo meetup has been held in Beijing." />
 +	<!-- 网页标签标题 -->
 +	<title>The first Dubbo meetup has been held in Beijing</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="/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 h [...]
 +<p>The first Dubbo meetup has successfully been held in Beijing, over 400+ people were present. What a great event!</p>
 +<p>Please enjoy the slides of the topics:</p>
 +<ul>
 +<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>
 +<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>
 +<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>
 +<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>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-meetup-chengdu.html
index 6f23f11,0000000..0bd8f59
mode 100644,000000..100644
--- a/en-us/blog/dubbo-meetup-chengdu.html
+++ b/en-us/blog/dubbo-meetup-chengdu.html
@@@ -1,42 -1,0 +1,42 @@@
 +<!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, Chengdu, meetup" />
 +	<meta name="description" content="The fourth Dubbo meetup has been held in Chengdu." />
 +	<!-- 网页标签标题 -->
 +	<title>The fourth Dubbo meetup has been held in Chengdu</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="/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 h [...]
 +<p><img src="../../img/blog/meetup-chengdu/all-hands.webp" alt="img"></p>
 +<h2>The depth of the user communication</h2>
 +<p>On August 26, 10:00 am - 12:00am, invited the arrival of the car to help, cloud gold, former BBD, flying fish star four companies open source enthusiasts and heavy users participate in face-to-face communication;According to the participants' feedback, answer to Dubbo many doubt, especially how to participate in the contribution to the community, as well as code contribution value point.Hope later can be more deeply involved in Dubbo communities and activities.</p>
 +<h2>Meetup activity information</h2>
 +<p>The event is still full, total enrollment of 976, 350 + site users, live PV 13207.</p>
 +<h2>The registration information</h2>
 +<p>Aliware Open Source, headquarters - Apache Dubbo developers salon on August 26 (Sunday) in chengdu high-tech zone tianfu hemicyenine rong international plaza, 200 five street on the 8th floor held the second floor conference room, technical thinking is GG feast, dry goods and welfare will not one less.</br>
 +Sign up link:<a href="http://www.huodongxing.com/event/7453091088400">http://www.huodongxing.com/event/7453091088400</a></p>
 +<img src="../../img/blog/dubbo-chengdu-meetup-img.jpg"/>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-meetup-hangzhou.html
index ee9e1a8,0000000..85cb967
mode 100644,000000..100644
--- a/en-us/blog/dubbo-meetup-hangzhou.html
+++ b/en-us/blog/dubbo-meetup-hangzhou.html
@@@ -1,43 -1,0 +1,43 @@@
 +<!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, Hangzhou, meetup" />
 +	<meta name="description" content="The fifth Dubbo meetup has been held in Hangzhou" />
 +	<!-- 网页标签标题 -->
 +	<title>The fifth Dubbo meetup has been held in Hangzhou</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="/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 h [...]
 +<p>The fifth Dubbo meetup has been held in Hangzhou,</p>
 +<p>Please enjoy the slides of the topics:</p>
 +<ul>
 +<li>Ding Li: How to involve in dubbo community <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/how-to-involve-in-dubbo-community.pdf">slides</a></li>
 +<li>Shenli Cao: Dubbo 2.7 introduction <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-2.7-introduction.pdf">slides</a></li>
 +<li>Tao Yang:  Dubbo practice in netease koala <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-practice-in-netease-koala.pdf">slides</a></li>
 +<li>Mercy Ma: Nacos support in Dubbo <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/nacos-support-in-dubbo.pdf">slides</a></li>
 +<li>Yihao Zhao: Sentinel: Sentinel support for Dubbo <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/sentinel-support-for-dubbo.pdf">slides</a></li>
 +<li>Zhixuan Chen: Troubleshooting Dubbo with Arthas <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/troubleshooting-dubbo-with-arthas.pdf">slides</a></li>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html
index 1433d09,0000000..06e879f
mode 100644,000000..100644
--- a/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html
+++ b/en-us/blog/dubbo-meetup-shanghai-jun-23rd-2018.html
@@@ -1,41 -1,0 +1,41 @@@
 +<!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, Shanghai, meetup" />
 +	<meta name="description" content="The second Dubbo Shanghai meetup has been held successfully." />
 +	<!-- 网页标签标题 -->
 +	<title>The second Dubbo Shanghai meetup has been held successfully</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="/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 h [...]
 +<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.</p>
 +<p>Please enjoy the slides of the topics:</p>
 +<ul>
 +<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>
 +<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>
 +<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>
 +<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>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-meetup-shenzhen.html
index 94b4936,0000000..f15f950
mode 100644,000000..100644
--- a/en-us/blog/dubbo-meetup-shenzhen.html
+++ b/en-us/blog/dubbo-meetup-shenzhen.html
@@@ -1,40 -1,0 +1,40 @@@
 +<!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, Shenzhen, meetup" />
 +	<meta name="description" content="The third Dubbo meetup has been held in Shenzhen" />
 +	<!-- 网页标签标题 -->
 +	<title>The third Dubbo meetup has been held in Shenzhen</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="/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 h [...]
 +<p>The third Dubbo meetup has successfully been held in Shenzhen, over 2000 people submitted registration, and over 700 were present, more than 17,000 watched the live online.</p>
 +<p>Please enjoy the slides of the topics:</p>
 +<ul>
 +<li>Zhixuan Chen: Dubbo-present-and-2.7-update (Chinese) <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201807%40shenzhen/dubbo-present-and-2.7-update.pdf">slides</a></li>
 +<li>Bin Kang: Microservice-in-lexinfintech (Chinese) <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201807%40shenzhen/microservice-in-lexinfintech.pdf">slides</a></li>
 +<li>Jialiang lin: sentinel (Chinese) <a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201807%40shenzhen/sentinel.pdf">slides</a></li>
 +</ul>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-new-async.html
index 303ac58,0000000..094659e
mode 100644,000000..100644
--- a/en-us/blog/dubbo-new-async.html
+++ b/en-us/blog/dubbo-new-async.html
@@@ -1,416 -1,0 +1,416 @@@
 +<!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, asynchronous, async chain" />
 +	<meta name="description" content="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." />
 +	<!-- 网页标签标题 -->
 +	<title>How to implement a fully asynchronous calls chain based on Dubbo</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="/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 h [...]
 +<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 summa [...]
 +<h2>Asynchronous mode before version 2.6.x</h2>
 +<p>Dubbo Provides some asynchronous programming capabilities in 2.6.x and earlier versions, including <a href="http://dubbo.apache.org/zh-cn/docs/user/demos/async-call.html">Asynchronous Call</a>, <a href="http://dubbo.apache.org/zh-cn/docs/user/demos/callback-parameter.html">Parameter Callback</a> and <a href="http://dubbo.apache.org/zh-cn/docs/user/demos/events-notify.html">Event Notification</a> on Consumer side. There are some brief introductions to the usage and Demo in the above d [...]
 +<p>But the current asynchronous method has the following problems:</p>
 +<ul>
 +<li>Methods to access Future object are not direct enough.</li>
 +<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>
 +<li>Asynchronization on Provider side is not supported.</li>
 +</ul>
 +<p>Take the asynchronous method of Consumer side as an example:</p>
 +<ol>
 +<li>Define a original synchronous interface and add the declaration to support asynchronous calls.</li>
 +</ol>
 +<pre><code>public interface FooService {
 +    String findFoo(String name);
 +}
 +</code></pre>
 +<pre><code>&lt;dubbo:reference id=&quot;fooService&quot; interface=&quot;com.alibaba.foo.FooService&quot;&gt;
 +      &lt;dubbo:method name=&quot;findFoo&quot; async=&quot;true&quot; /&gt;
 +&lt;/dubbo:reference&gt;
 +</code></pre>
 +<ol start="2">
 +<li>Obtain Future object through RpcContext.</li>
 +</ol>
 +<pre><code>// this call will return null immediately
 +fooService.findFoo(fooId);
 +// Obtain the Future instance. When the result is returned, Future instance will be notified and the result will be set to Future instance.
 +Future&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture();
 +fooFuture.get();
 +</code></pre>
 +<p>or</p>
 +<pre><code>// this call will return null immediately
 +fooService.findFoo(fooId);
 +// get Dubbo's built-in ResponseFuture, and set the callback
 +ResponseFuture future = ((FutureAdapter)RpcContext.getContext().getFuture()).getFuture();
 +future.setCallback(new ResponseCallback() {
 +    @Override
 +    public void done(Object response) {
 +        System.out.print(response);
 +    }
 +
 +    @Override
 +    public void caught(Throwable exception) {
 +        exception.printStackTrace();
 +    }
 +});
 +</code></pre>
 +<p>From this simple example, we can see there are some inconveniences in use:</p>
 +<ol>
 +<li>The synchronization interface of findFoo cannot directly return a Future object representing the asynchronous result, which is further obtained through RpcContext.</li>
 +<li>Future object can only be obtained from get method that will block until getting the result.</li>
 +<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>
 +</ol>
 +<h2>Enhancement based on CompletableFuture in version 2.7.0</h2>
 +<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>
 +<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>
 +<ol>
 +<li>
 +<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>
 +<pre><code>public interface AsyncService {
 +    CompletableFuture&lt;String&gt; sayHello(String name);
 +}
 +</code></pre>
 +</li>
 +<li>
 +<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>
 +<pre><code>public interface AsyncService {
 +    CompletableFuture&lt;String&gt; sayHello(String name);
 +}
 +</code></pre>
 +<pre><code>@AsyncFor(AsyncService.class)
 +public interface GrettingServiceAsync extends GreetingsService {
 +    CompletableFuture&lt;String&gt; sayHiAsync(String name);
 +}
 +</code></pre>
 +<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>
 +<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>
 +</li>
 +<li>
 +<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>
 +<pre><code>public interface AsyncService {
 +    String sayHello(String name);
 +}
 +</code></pre>
 +<pre><code>public class AsyncServiceImpl implements AsyncService {
 +    public String sayHello(String name) {
 +        final AsyncContext asyncContext = RpcContext.startAsync();
 +        new Thread(() -&gt; {
 +            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);
 +        }).start();
 +        return null;
 +    }
 +}
 +</code></pre>
 +<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>
 +</li>
 +<li>
 +<p>RpcContext returns CompletableFuture directly.</p>
 +<pre><code>CompletableFuture&lt;String&gt; f = RpcContext.getContext().getCompletableFuture();
 +</code></pre>
 +</li>
 +</ol>
 +<p>All of the above enhancements are based on the compatibility with existing asynchronous programming, so asynchronous programs written based on 2.6.x versions can be successfully compiled without any modification.</p>
 +<p>Next, let's illustrate how to implement a fully asynchronous Dubbo service call chain through a few examples.</p>
 +<h2>example 1:CompletableFuture interface</h2>
- <p>CompletableFuture interface can be used both for a synchronous call and for an asynchronous call on Consumer or Provider side. This example implements asynchronous calls between Consumer and Provider sides. Code link <a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-original-future">dubbo-samples-async-original-future</a>.</p>
++<p>CompletableFuture interface can be used both for a synchronous call and for an asynchronous call on Consumer or Provider side. This example implements asynchronous calls between Consumer and Provider sides. Code link <a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-original-future">dubbo-samples-async-original-future</a>.</p>
 +<ol>
 +<li>
 +<p>Interface definition</p>
 +<pre><code>public interface AsyncService {
 +    CompletableFuture&lt;String&gt; sayHello(String name);
 +}
 +</code></pre>
 +<p>Note that the return type of this interface is <code>CompletableFuture&lt;String&gt;</code>.</p>
 +</li>
 +<li>
 +<p>Provider Side</p>
 +<ul>
 +<li>
 +<p>Implementation</p>
 +<pre><code>public class AsyncServiceImpl implements AsyncService {
 +    public CompletableFuture&lt;String&gt; sayHello(String name) {
 +        return CompletableFuture.supplyAsync(() -&gt; {
 +            try {
 +                Thread.sleep(5000);
 +            } catch (InterruptedException e) {
 +                e.printStackTrace();
 +            }
 +            return &quot;async response from provider.&quot;;
 +        });
 +    }
 +}
 +</code></pre>
 +<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>
 +</li>
 +<li>
 +<p>Config</p>
 +<pre><code>&lt;bean id=&quot;asyncService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&quot;/&gt;
 +&lt;dubbo:service interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot; ref=&quot;asyncService&quot;/&gt;
 +</code></pre>
 +<p>The Config is the same as the original interface.</p>
 +</li>
 +</ul>
 +</li>
 +<li>
 +<p>Consumer Side</p>
 +<ul>
 +<li>Config</li>
 +</ul>
 +<pre><code>&lt;dubbo:reference id=&quot;asyncService&quot; timeout=&quot;10000&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot;/&gt;
 +</code></pre>
 +<p>​	The Config is the same as the original interface.</p>
 +<ul>
 +<li>Call remote service</li>
 +</ul>
 +<pre><code>public static void main(String[] args) throws Exception {
 +        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});
 +        context.start();
 +        final AsyncService asyncService = (AsyncService) context.getBean(&quot;asyncService&quot;);
 +    
 +        CompletableFuture&lt;String&gt; future = asyncService.sayHello(&quot;async call request&quot;);
 +        future.whenComplete((v, t) -&gt; {
 +            if (t != null) {
 +                t.printStackTrace();
 +            } else {
 +                System.out.println(&quot;Response: &quot; + v);
 +            }
 +        });
 +        System.out.println(&quot;Executed before response return.&quot;);
 +        System.in.read();
 +    }
 +</code></pre>
 +<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>
 +</li>
 +</ol>
 +<h2>Example 2:Synchronous interface uses Annotation Processor</h2>
- <p>This example demonstrates how to implement the Consumer-side asynchronous service call using the Annotation Processor based on the original synchronous interface. Code link <a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future</a>.</p>
++<p>This example demonstrates how to implement the Consumer-side asynchronous service call using the Annotation Processor based on the original synchronous interface. Code link <a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future</a>.</p>
 +<ol>
 +<li>
 +<p>Interface definition</p>
 +<pre><code>@DubboAsync
 +public interface GreetingsService {
 +    String sayHi(String name);
 +}
 +</code></pre>
 +<p>This is a generic definition of the Dubbo service interface. Note that add the @DubboAsync annotation when using Annotation Processor.</p>
 +<pre><code>&lt;dependency&gt;
 +    &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
 +    &lt;artifactId&gt;dubbo-async-processer&lt;/artifactId&gt;
 +    &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
 +&lt;/dependency&gt;
 +&lt;plugin&gt;
 +    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
 +    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
 +    &lt;version&gt;3.7.0&lt;/version&gt;
 +    &lt;configuration&gt;
 +        &lt;source&gt;1.8&lt;/source&gt;
 +        &lt;target&gt;1.8&lt;/target&gt;
 +        &lt;annotationProcessorPaths&gt;
 +            &lt;path&gt;
 +                &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
 +                &lt;artifactId&gt;dubbo-async-processer&lt;/artifactId&gt;
 +                &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;
 +            &lt;/path&gt;
 +        &lt;/annotationProcessorPaths&gt;
 +    &lt;/configuration&gt;
 +&lt;/plugin&gt;
 +</code></pre>
 +<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>
 +<pre><code>/**
 +* Generated by dubbo-async-processer
 +*/
 +package com.alibaba.dubbo.samples.api;
 +import java.util.concurrent.CompletableFuture;
 +@javax.annotation.Generated(&quot;com.alibaba.dubbo.async.processor.AsyncAnnotationProcessor&quot;)
 +@org.apache.dubbo.common.config.AsyncFor(com.alibaba.dubbo.samples.api.GreetingsService.class)
 +public interface GreetingsServiceAsync extends GreetingsService {
 +CompletableFuture&lt;java.lang.String&gt; sayHiAsync(java.lang.String name);
 +}
 +</code></pre>
 +</li>
 +<li>
 +<p>Provider side</p>
 +<ul>
 +<li>Config</li>
 +</ul>
 +<pre><code>&lt;bean id=&quot;greetingsService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.GreetingsServiceImpl&quot;/&gt;
 +&lt;dubbo:service interface=&quot;com.alibaba.dubbo.samples.api.GreetingsService&quot; ref=&quot;greetingsService&quot;/&gt;
 +</code></pre>
 +<ul>
 +<li>Service implementation</li>
 +</ul>
 +<pre><code>public class GreetingsServiceImpl implements GreetingsService {
 +    @Override
 +    public String sayHi(String name) {
 +        return &quot;hi, &quot; + name;
 +    }
 +}
 +</code></pre>
 +</li>
 +<li>
 +<p>Consumer side</p>
 +<ul>
 +<li>Config</li>
 +</ul>
 +<pre><code> &lt;dubbo:reference id=&quot;greetingsService&quot; interface=&quot;com.alibaba.dubbo.samples.api.GreetingsServiceAsync&quot;/&gt;
 +</code></pre>
 +<p>Note that the service interface uses <strong>GreetingsServiceAsync</strong></p>
 +<ul>
 +<li>Service call</li>
 +</ul>
 +<pre><code> public static void main(String[] args) throws Exception {
 +        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});
 +        context.start();
 +
 +        GreetingsServiceAsync greetingsService = (GreetingsServiceAsync) context.getBean(&quot;greetingsService&quot;);
 +        CompletableFuture&lt;String&gt; future = greetingsService.sayHiAsync(&quot;async call reqeust&quot;);
 +        System.out.println(&quot;async call ret :&quot; + future.get());
 +     
 +        System.in.read();
 +    }
 +</code></pre>
 +<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>
 +</li>
 +</ol>
 +<h2>Example 3:Use AsyncContext</h2>
- <p>This example demonstrates how to implement the Provider-side asynchronous execution through AsyncContext based on the original synchronous interface. Code link <a href="https://github.com/apache/incubator-dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-provider">dubbo-samples-async-provider</a>.</p>
++<p>This example demonstrates how to implement the Provider-side asynchronous execution through AsyncContext based on the original synchronous interface. Code link <a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-provider">dubbo-samples-async-provider</a>.</p>
 +<ol>
 +<li>
 +<p>Interface definition</p>
 +<pre><code>public interface AsyncService {
 +    String sayHello(String name);
 +}
 +</code></pre>
 +</li>
 +<li>
 +<p>Provider side</p>
 +<ul>
 +<li>Config</li>
 +</ul>
 +<pre><code>&lt;bean id=&quot;asyncService&quot; class=&quot;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&quot;/&gt;
 +&lt;dubbo:service async=&quot;true&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot; ref=&quot;asyncService&quot;/&gt;
 +</code></pre>
 +<p>Note that adding <code>async=&quot;true&quot;</code> indicates that this is a service that starts the Provider-side execution asynchronously.</p>
 +<ul>
 +<li>Asynchronous execution implementation</li>
 +</ul>
 +<pre><code>public class AsyncServiceImpl implements AsyncService {
 +    public String sayHello(String name) {
 +        final AsyncContext asyncContext = RpcContext.startAsync();
 +        new Thread(() -&gt; {
 +            asyncContext.signalContextSwitch();
 +            try {
 +                Thread.sleep(500);
 +            } catch (InterruptedException e) {
 +                e.printStackTrace();
 +            }
 +            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);
 +        }).start();
 +        return null;
 +    }
 +}
 +</code></pre>
 +</li>
 +<li>
 +<p>Consumer side</p>
 +<ul>
 +<li>Config</li>
 +</ul>
 +<pre><code>&lt;dubbo:reference id=&quot;asyncService&quot; interface=&quot;com.alibaba.dubbo.samples.async.api.AsyncService&quot;/&gt;
 +</code></pre>
 +<ul>
 +<li>Service call</li>
 +</ul>
 +<pre><code> public static void main(String[] args) throws Exception {
 +        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{&quot;META-INF/spring/async-consumer.xml&quot;});
 +        context.start();
 +
 +        AsyncService asyncService = (AsyncService) context.getBean(&quot;asyncService&quot;);
 +        System.out.println(asyncService.sayHello(&quot;async call request&quot;));
 +     
 +        System.in.read();
 +    }
 +</code></pre>
 +</li>
 +</ol>
 +<h2>New problems resulted from asynchronization</h2>
 +<h3>Filter Chain</h3>
 +<p>The following is a complete Filter chain for a normal Dubbo call.</p>
 +<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>
 +<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>
 +<p>The following is an example of extending the Filter and supporting the asynchronous Filter chain.</p>
 +<pre><code>@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})
 +public class AsyncPostprocessFilter extends AbstractPostProcessFilter {
 +
 +    @Override
 +    public Result invoke(Invoker&lt;?&gt; invoker, Invocation invocation) throws RpcException {
 +        return postProcessResult(invoker.invoke(invocation), invoker, invocation);
 +    }
 +
 +    @Override
 +    protected Result doPostProcess(Result result, Invoker&lt;?&gt; invoker, Invocation invocation) {
 +        System.out.println(&quot;Filter get the return value: &quot; + result.getValue());
 +        return result;
 +    }
 +}
 +</code></pre>
 +<h3>Context passing</h3>
 +<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>
 +<pre><code>public class AsyncServiceImpl implements AsyncService {
 +    // Save the context of the current thread
 +    RpcContext context = RpcContext.getContext();
 +    public CompletableFuture&lt;String&gt; sayHello(String name) {
 +        return CompletableFuture.supplyAsync(() -&gt; {
 +            // Set context into new thread
 +            RpcContext.setContext(context);
 +            try {
 +                Thread.sleep(5000);
 +            } catch (InterruptedException e) {
 +                e.printStackTrace();
 +            }
 +            return &quot;async response from provider.&quot;;
 +        });
 +    }
 +}
 +</code></pre>
 +<p>However, AsyncContext also provides the signalContextSwitch() method for a convenient Context switch.</p>
 +<pre><code>public class AsyncServiceImpl implements AsyncService {
 +    public String sayHello(String name) {
 +        final AsyncContext asyncContext = RpcContext.startAsync();
 +        new Thread(() -&gt; {
 +            asyncContext.signalContextSwitch();
 +            try {
 +                Thread.sleep(500);
 +            } catch (InterruptedException e) {
 +                e.printStackTrace();
 +            }
 +            asyncContext.write(&quot;Hello &quot; + name + &quot;, response from provider.&quot;);
 +        }).start();
 +        return null;
 +    }
 +}
 +</code></pre>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo-zk.html
index ee43b15,0000000..99a3114
mode 100644,000000..100644
--- a/en-us/blog/dubbo-zk.html
+++ b/en-us/blog/dubbo-zk.html
@@@ -1,278 -1,0 +1,278 @@@
 +<!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, registry center, Zookeeper, ZK" />
 +	<meta name="description" content="This article introduces basic concepts of Zookeeper, and how to use Zookeeper as a registry center." />
 +	<!-- 网页标签标题 -->
 +	<title>Using Zookeeper in Dubbo</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="/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 h [...]
 +<h2>Introduction of Zookeeper</h2>
 +<h3>The basic concept</h3>
 +<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>
 +<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 [...]
 +<p><img src="../../img/blog/zk-emsemble.png" alt="Diagram shows client-server architecture of ZooKeeper">
 +<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O'Reilly</em></p>
 +<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>
 +<p><img src="../../img/blog/zk-tree.png" alt="zk-tree">
 +<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O'Reilly</em></p>
 +<h3>Basic Implementation</h3>
 +<p>You could donwload and install Zookeeper directly<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>.
 +Or 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.
 +Considering 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>
 +<h4>1. Running the Zookeeper</h4>
 +<p>Execute the command to run zookeeper in a docker container</p>
 +<pre><code class="language-shell">docker run --rm --name zookeeper -p 2181:2181 zookeeper
 +</code></pre>
 +<h4>2. Entering the zookeeper container</h4>
 +<pre><code class="language-shell">docker exec -it zookeeper bash
 +</code></pre>
 +<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>
 +<pre><code class="language-shell">bash-4.4# ls -l bin
 +total 36
 +-rwxr-xr-x    1 zookeepe zookeepe       232 Mar 27 04:32 README.txt
 +-rwxr-xr-x    1 zookeepe zookeepe      1937 Mar 27 04:32 zkCleanup.sh
 +-rwxr-xr-x    1 zookeepe zookeepe      1056 Mar 27 04:32 zkCli.cmd
 +-rwxr-xr-x    1 zookeepe zookeepe      1534 Mar 27 04:32 zkCli.sh
 +-rwxr-xr-x    1 zookeepe zookeepe      1759 Mar 27 04:32 zkEnv.cmd
 +-rwxr-xr-x    1 zookeepe zookeepe      2696 Mar 27 04:32 zkEnv.sh
 +-rwxr-xr-x    1 zookeepe zookeepe      1089 Mar 27 04:32 zkServer.cmd
 +-rwxr-xr-x    1 zookeepe zookeepe      6773 Mar 27 04:32 zkServer.sh
 +</code></pre>
 +<h4>3. Entering the zookeeper management interface via zkCli</h4>
 +<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>
 +<pre><code class="language-shell">bash-4.4# ps
 +PID   USER     TIME  COMMAND
 +    1 zookeepe  0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root
 +   32 root      0:00 bash
 +   42 root      0:00 ps
 +</code></pre>
 +<p>So, it allows you to access Zookeeper's console directly through <code>zkCli</code> for management.</p>
 +<pre><code class="language-shell">bash-4.4# bin/zkCli.sh -server 127.0.0.1:2181
 +Connecting to 127.0.0.1:2181
 +...
 +WATCHER::
 +
 +WatchedEvent state:SyncConnected type:None path:null
 +
 +[zk: 127.0.0.1:2181(CONNECTED) 0] help
 +ZooKeeper -server host:port cmd args
 +	stat path [watch]
 +	set path data [version]
 +	ls path [watch]
 +	delquota [-n|-b] path
 +	ls2 path [watch]
 +	setAcl path acl
 +	setquota -n|-b val path
 +	history
 +	redo cmdno
 +	printwatches on|off
 +	delete path [version]
 +	sync path
 +	listquota path
 +	rmr path
 +	get path [watch]
 +	create [-s] [-e] path data acl
 +	addauth scheme auth
 +	quit
 +	getAcl path
 +	close
 +	connect host:port
 +</code></pre>
 +<h4>4. Basic Examples on zkCli</h4>
 +<p>Create <code>/hello-zone</code> node:</p>
 +<pre><code class="language-shell">[zk: 127.0.0.1:2181(CONNECTED) 19] create /hello-zone 'world'
 +Created /hello-zone
 +</code></pre>
 +<p>List the child nodes under <code>/</code> and confirm that <code>hello-zone</code> is created:</p>
 +<pre><code class="language-shell">[zk: 127.0.0.1:2181(CONNECTED) 20] ls /
 +[zookeeper, hello-zone]
 +</code></pre>
 +<p>List the child nodes for <code>/hello-zone</code> and verify that it is empty:</p>
 +<pre><code class="language-shell">[zk: 127.0.0.1:2181(CONNECTED) 21] ls /hello-zone
 +[]
 +</code></pre>
 +<p>Get the data stored on the <code>/hello-zone</code> node:</p>
 +<pre><code class="language-shell">[zk: 127.0.0.1:2181(CONNECTED) 22] get /hello-zone
 +world
 +</code></pre>
 +<h2>Using Zookeeper in Dubbo</h2>
 +<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>
 +<p><img src="../../img/blog/dubbo-in-zk.jpg" alt="dubbo-in-zk"></p>
 +<p>First, all data related to Dubbo is organized under the root node of <code>/duboo</code>.</p>
 +<p>The secondary directory is the service name like <code>com.foo.BarService</code>.</p>
 +<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>
 +<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>
 +For 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>
 +<h3>Prepare the sample code</h3>
 +<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>
 +<h4>1. Interface definition</h4>
 +<p>Define a simple <code>greetingservice</code> interface with only one simple method named <code>sayHello</code> to greet to the caller.</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">GreetingService</span> </span>{
 +    <span class="hljs-function">String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span></span>;
 +}
 +</code></pre>
 +<h4>2. Server: Implementation</h4>
 +<p>Implement the <code>GreetingService</code>  interface and mark it as a service for Dubbo via <code>@Service</code>.</p>
 +<pre><code class="language-java"><span class="hljs-meta">@Service</span>
 +<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>{
 +    <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>{
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"hello, "</span> + name;
 +    }
 +}
 +</code></pre>
 +<h4>3. Server: Assembly</h4>
 +<p>Define ProviderConfiguration to assemble Dubbo services.</p>
 +<pre><code class="language-java"><span class="hljs-meta">@Configuration</span>
 +<span class="hljs-meta">@EnableDubbo</span>(scanBasePackages = <span class="hljs-string">"com.alibaba.dubbo.samples.impl"</span>)
 +<span class="hljs-meta">@PropertySource</span>(<span class="hljs-string">"classpath:/spring/dubbo-provider.properties"</span>)
 +<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderConfiguration</span> </span>{}
 +</code></pre>
 +<p>Dubbo-provider.properties is an external configuration in a spring application, as follows:</p>
 +<pre><code class="language-properties">dubbo.application.name=demo-provider
 +dubbo.registry.address=zookeeper://$DOCKER_HOST:2181
 +dubbo.protocol.name=dubbo
 +dubbo.protocol.port=20880
 +</code></pre>
 +<p>Since zookeeper runs in a docker container, please be noted that:</p>
 +<ul>
 +<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>
 +<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>
 +<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>
 +</ul>
 +<h4>4. Server: Starting Service</h4>
 +<p>In the <code>main</code> method, you could provide the Dubbo service by running a Spring Context.</p>
 +<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>{
 +    <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>{
 +        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class);
 +        context.start();
 +        System.in.read();
 +    }
 +}
 +</code></pre>
 +<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>
 +<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 [...]
 +</code></pre>
 +<p>You could find the registration information of the service provider through the Zookeeper management terminal:</p>
 +<pre><code class="language-sh">$ docker <span class="hljs-built_in">exec</span> -it zookeeper bash
 +bash-4.4<span class="hljs-comment"># bin/zkCli.sh -server localhost:218</span>
 +Connecting to localhost:2181
 +...
 +Welcome to ZooKeeper!
 +JLine support is enabled
 +...
 +[zk: localhost:2181(CONNECTED) 0] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/providers
 +[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]
 +</code></pre>
 +<p>You could find that the Dubbo services just registered its URL address at the <code>providers</code> node as follows:
 +<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>
 +<h4>5. Client: Reference Service</h4>
 +<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>
 +<pre><code class="language-java"><span class="hljs-meta">@Component</span>(<span class="hljs-string">"annotatedConsumer"</span>)
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GreetingServiceConsumer</span> </span>{
 +    <span class="hljs-meta">@Reference</span>
 +    <span class="hljs-keyword">private</span> GreetingService greetingService;
 +
 +    <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>{
 +        <span class="hljs-keyword">return</span> greetingService.sayHello(name);
 +    }
 +}
 +</code></pre>
 +<h4>6. Client: Assembling</h4>
 +<p>Define the ConsumerConfiguration to assemble Dubbo service.</p>
 +<pre><code class="language-java"><span class="hljs-meta">@Configuration</span>
 +<span class="hljs-meta">@EnableDubbo</span>(scanBasePackages = <span class="hljs-string">"com.alibaba.dubbo.samples.action"</span>)
 +<span class="hljs-meta">@PropertySource</span>(<span class="hljs-string">"classpath:/spring/dubbo-consumer.properties"</span>)
 +<span class="hljs-meta">@ComponentScan</span>(value = {<span class="hljs-string">"com.alibaba.dubbo.samples.action"</span>})
 +<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerConfiguration</span> </span>{}
 +</code></pre>
 +<p>&quot;dubbo-consumer.properties&quot; is a method of external configuration in a Spring application, as follows:</p>
 +<pre><code class="language-properties">dubbo.application.name=demo-consumer
 +dubbo.registry.address=zookeeper://$DOCKER_HOST:2181
 +dubbo.consumer.timeout=3000
 +</code></pre>
 +<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>
 +<h4>7. Client: Initiating A Remote Call</h4>
 +<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>
 +<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>{
 +    <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>{
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerBootstrap</span> </span>{
 +
 +    <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>{
 +        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);
 +        context.start();
 +        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class);
 +        String hello = greetingServiceConsumer.doSayHello(<span class="hljs-string">"zookeeper"</span>);
 +        System.out.println(<span class="hljs-string">"result: "</span> + hello);
 +        System.in.read();
 +    }
 +}
 +</code></pre>
 +<p>The output are as follows:</p>
 +<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
 +[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
 +...
 +result: hello, zookeeper
 +</code></pre>
 +<p>Description:</p>
 +<ol>
 +<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>
 +<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 subscri [...]
 +</ol>
 +<p>You could find the registration information of the service provider through the Zookeeper management terminal:</p>
 +<pre><code class="language-sh">$ docker <span class="hljs-built_in">exec</span> -it zookeeper bash
 +bash-4.4<span class="hljs-comment"># bin/zkCli.sh -server localhost:218</span>
 +Connecting to localhost:2181
 +...
 +Welcome to ZooKeeper!
 +JLine support is enabled
 +...
 +[zk: localhost:2181(CONNECTED) 4] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/consumers
 +[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]
 +</code></pre>
 +<p>You could see that  consumers of Dubbo's servicehas registered its URL address at the <code>consumers</code> node:</p>
 +<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>
 +<h2>Summary</h2>
 +<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>
 +<p>Through this document, readers can learn:</p>
 +<ul>
 +<li>Basic concepts and applications of ZooKeeper</li>
 +<li>The function of Zookeeper in Dubbo application</li>
 +<li>Learn about Zookeeper's interaction through practical sample codes</li>
 +<li>The storage of service registration and consumption information of Dubbo with ZooKeeper</li>
 +</ul>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<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>
 +</li>
 +<li id="fn2" class="footnote-item"><p><a href="https://brew.sh">https://brew.sh</a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
 +</li>
 +<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>
 +</li>
 +</ol>
 +</section>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo2-js.html
index 26a0570,0000000..ebe8208
mode 100644,000000..100644
--- a/en-us/blog/dubbo2-js.html
+++ b/en-us/blog/dubbo2-js.html
@@@ -1,233 -1,0 +1,233 @@@
 +<!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, 跨语言, Node, NodeJS, js" />
++	<meta name="keywords" content="Dubbo, Cross-language, Node, NodeJS, js" />
 +	<meta name="description" content="This article introduces how to use Dubbo.js to implement cross-language calls." />
 +	<!-- 网页标签标题 -->
 +	<title>Implementation of cross-language calls by Dubbo2.js</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="/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 h [...]
 +<blockquote>
 +<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>
 +</blockquote>
 +<h2>Cross-language calls for micro service</h2>
 +<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 l [...]
 +<ul>
 +<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>
 +<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>
 +<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. M [...]
 +</ul>
 +<p>According to the solutions below, there are two ways to solve the cross-language calls problem:</p>
 +<ul>
 +<li>communicating by a common protocol.</li>
 +<li>implementing an agent as a protocol adapter.</li>
 +</ul>
 +<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>
 +<h2>Cross-language calls by a common protocol</h2>
 +<h3>SpringMVC</h3>
 +<p><img src="../../img/blog/springmvc.png" alt="springmvc"></p>
 +<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 [...]
 +<h3>We support some common protocols</h3>
- <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>
++<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/dubbo-rpc-jsonrpc">json-rpc</a> protocol are also supported.</p>
 +<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>
 +<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  [...]
 +<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 Dubb [...]
 +<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>
 +<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>
 +</code></pre>
 +<h3>Customized Protocols for Cross-language Support</h3>
 +<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>
 +<h4>Motan2 for cross-language support</h4>
 +<p><img src="../../img/blog/motan-protocol-en.png" alt="motan2"></p>
 +<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  [...]
 +<p><img src="../../img/blog/motan-agent.png" alt="agent"></p>
 +<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>
 +<h4>Dubbo for cross-language support</h4>
 +<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 bet [...]
 +<h5>Dubbo protocol message format:</h5>
 +<p><img src="../../img/blog/dubbo-protocol.png" alt="dubbo协议"></p>
 +<p>Details in dubbo protocol header message:</p>
 +<ul>
 +<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>
 +<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>
 +<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>
 +<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>
 +<li>Body length: message body length, type int,record bytes of body content.</li>
 +<li>Body content: request param, where serializedresponse parameters are stored.</li>
 +</ul>
 +<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>
 +<ol>
 +<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>
 +<li><span data-type="color" style="color:#24292E">How to serialize string across language?</span></li>
 +</ol>
 +<h2>How does dubbo2.js solve problems?</h2>
 +<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 [...]
 +<h2>Quick Start</h2>
 +<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>
 +<h3>1. Initiate dubbo-java-provider</h3>
 +<p>Java provides the backend dubbo service. Firstly, let’s define the service interface:</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">DemoProvider</span> </span>{
 +    <span class="hljs-function">String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span></span>;
 +    <span class="hljs-function">String <span class="hljs-title">echo</span><span class="hljs-params">()</span> </span>;
 +    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">test</span><span class="hljs-params">()</span></span>;
 +    <span class="hljs-function">UserResponse <span class="hljs-title">getUserInfo</span><span class="hljs-params">(UserRequest request)</span></span>;
 +}
 +</code></pre>
 +<p>Then we implement the interface:</p>
 +<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>{
 +    <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>{
 +        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());
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"Hello "</span> + name + <span class="hljs-string">", response form provider: "</span> + RpcContext.getContext().getLocalAddress();
 +    }
 +    <span class="hljs-meta">@Override</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">echo</span><span class="hljs-params">()</span>  </span>{
 +        System.out.println(<span class="hljs-string">"receive...."</span>);
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"pang"</span>;
 +    }
 +    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        System.out.println(<span class="hljs-string">"test"</span>);
 +    }
 +    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        System.out.println(request);
 +        UserResponse response = <span class="hljs-keyword">new</span> UserResponse();
 +        response.setStatus(<span class="hljs-string">"ok"</span>);
 +        Map&lt;String, String&gt; map = <span class="hljs-keyword">new</span> HashMap&lt;String, String&gt;();
 +        map.put(<span class="hljs-string">"id"</span>, <span class="hljs-string">"1"</span>);
 +        map.put(<span class="hljs-string">"name"</span>, <span class="hljs-string">"test"</span>);
 +        response.setInfo(map);
 +        <span class="hljs-keyword">return</span> response;
 +    }
 +}
 +</code></pre>
 +<p>After that,<span data-type="color" style="color:#24292E"> we expose the dubbo service with xml files:</span></p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +       <span class="hljs-attr">xmlns:dubbo</span>=<span class="hljs-string">"http://code.alibabatech.com/schema/dubbo"</span>
 +       <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans"</span>
 +       <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
 +   http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"</span>&gt;</span>
 +
 +    <span class="hljs-comment">&lt;!-- dubbo provider info, used to compute dependency --&gt;</span>
 +    <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>
 +
 +    <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>
 +
 +    <span class="hljs-comment">&lt;!-- dubbo protocol, used to expose service at port 20880 --&gt;</span>
 +    <span class="hljs-tag">&lt;<span class="hljs-name">dubbo:protocol</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dubbo"</span> <span class="hljs-attr">port</span>=<span class="hljs-string">"20880"</span>/&gt;</span>
 +
 +    <span class="hljs-comment">&lt;!-- realize a service as a local bean --&gt;</span>
 +    <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>
 +
 +    <span class="hljs-comment">&lt;!-- claim for service interfaces to expose --&gt;</span>
 +    <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>
 +
 +<span class="hljs-tag">&lt;/<span class="hljs-name">beans</span>&gt;</span>
 +</code></pre>
 +<p>After we implemented all the configurations on server side, initiate an object initiater to register a dubbo service locally:</p>
 +<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>{
 +    <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>{
 +        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>});
 +        context.start();
 +        System.in.read();
 +    }
 +}
 +</code></pre>
 +<h3>2. Implement dubbo client-side for nodejs</h3>
 +<p>Install dubbo2.js using npm:</p>
 +<pre><code class="language-sh">npm install dubbo2.js --save
 +</code></pre>
 +<p>Configure dubboConfig.ts:</p>
 +<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>
 +
 +<span class="hljs-keyword">const</span> dubbo = <span class="hljs-keyword">new</span> Dubbo({
 +  application: {name: <span class="hljs-string">'demo-provider'</span>},
 +  register: <span class="hljs-string">'localhost:2181'</span>,
 +  dubboVersion: <span class="hljs-string">'2.0.0'</span>,
 +  interfaces: [
 +    <span class="hljs-string">'com.alibaba.dubbo.demo.DemoProvider'</span>,
 +  ],
 +});
 +
 +<span class="hljs-keyword">interface</span> IDemoService {
 +  sayHello(name: <span class="hljs-built_in">string</span>): TDubboCallResult&lt;<span class="hljs-built_in">string</span>&gt;;
 +}
 +
 +<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> demoService = dubbo.proxyService&lt;IDemoService&gt;({
 +  dubboInterface: <span class="hljs-string">'com.alibaba.dubbo.demo.DemoProvider'</span>,
 +  version: <span class="hljs-string">'1.0.0'</span>,
 +  methods: {
 +    sayHello(name: <span class="hljs-built_in">string</span>) {
 +      <span class="hljs-keyword">return</span> [java.String(name)];
 +    },
 +
 +    echo() {},
 +
 +    test() {},
 +
 +    getUserInfo() {
 +      <span class="hljs-keyword">return</span> [
 +        java.combine(<span class="hljs-string">'com.alibaba.dubbo.demo.UserRequest'</span>, {
 +          id: <span class="hljs-number">1</span>,
 +          name: <span class="hljs-string">'nodejs'</span>,
 +          email: <span class="hljs-string">'node@qianmi.com'</span>,
 +        }),
 +      ];
 +    },
 +  },
 +});
 +</code></pre>
 +<blockquote>
 +<p>Using typescript brings better coding experience.</p>
 +</blockquote>
 +<p>Implement caller class main.ts:</p>
 +<pre><code class="language-typescript"><span class="hljs-keyword">import</span> {demoService} <span class="hljs-keyword">from</span> <span class="hljs-string">'./dubboConfig'</span>
 +
 +demoService.sayHello(<span class="hljs-string">'kirito'</span>).then(<span class="hljs-function">(<span class="hljs-params">{res,err}</span>)=&gt;</span>{
 +    <span class="hljs-built_in">console</span>.log(res)
 +});
 +</code></pre>
 +<h3>3. Call main.ts:</h3>
 +<p>Run nodejs client in Debug mode:</p>
 +<pre><code class="language-sh">DEBUG=dubbo* ts-node main.ts
 +</code></pre>
 +<p>Checkout running results:</p>
 +<pre><code class="language-sh">Hello kirito, response form provider: 172.19.6.151:20880
 +</code></pre>
 +<p>Congratulations!</p>
 +<h2>Features</h2>
 +<ul>
 +<li>Support zookeeper as register center</li>
 +<li>Support TCP Dubbo Native protocol</li>
 +<li>Support directly Dubbo connection</li>
 +<li>Support link tracing</li>
 +<li>Generate dubbo interface Automatically</li>
 +</ul>
 +<h2>More details</h2>
 +<p>The sample code in this article is available here, <a href="https://github.com/dubbo/dubbo2.js">https://github.com/dubbo/dubbo2.js</a>.
 +If 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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/dubbo2-js.json
index 50b4bd8,0000000..fbe4e48
mode 100644,000000..100644
--- a/en-us/blog/dubbo2-js.json
+++ b/en-us/blog/dubbo2-js.json
@@@ -1,10 -1,0 +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>Nowad [...]
++  "__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>Nowad [...]
 +  "link": "/en-us/blog/dubbo2-js.html",
 +  "meta": {
 +    "title": "Implementation of cross-language calls by Dubbo2.js",
-     "keywords": "Dubbo, 跨语言, Node, NodeJS, js",
++    "keywords": "Dubbo, Cross-language, Node, NodeJS, js",
 +    "description": "This article introduces how to use Dubbo.js to implement cross-language calls."
 +  }
 +}
diff --cc en-us/blog/gsoc-2018.html
index 53831df,0000000..24ccda6
mode 100644,000000..100644
--- a/en-us/blog/gsoc-2018.html
+++ b/en-us/blog/gsoc-2018.html
@@@ -1,34 -1,0 +1,34 @@@
 +<!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="gsoc-2018" />
- 	<meta name="description" content="gsoc-2018" />
++	<meta name="keywords" content="Dubbo, GSoC" />
++	<meta name="description" content="The GSoC(Google Summer of Code) 2018 projects has been announced" />
 +	<!-- 网页标签标题 -->
- 	<title>gsoc-2018</title>
++	<title>GSoC 2018</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="/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 h [...]
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/index.html
index 486f4e4,0000000..960e3f5
mode 100644,000000..100644
--- a/en-us/blog/index.html
+++ b/en-us/blog/index.html
@@@ -1,32 -1,0 +1,32 @@@
 +<!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="blog" />
 +	<meta name="description" content="blog" />
 +	<!-- 网页标签标题 -->
 +	<title>blog</title>
 +	<link rel="shortcut icon" href="/img/dubbo.ico"/>
 +	<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="/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 hre [...]
++	<div id="root"><div class="blog-list-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 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>
 +		window.rootPath = '';
 +  </script>
 +  <script src="/build/blog.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>
diff --cc en-us/blog/introduction-to-dubbo-qos.html
index d99351e,0000000..daf1b66
mode 100644,000000..100644
--- a/en-us/blog/introduction-to-dubbo-qos.html
+++ b/en-us/blog/introduction-to-dubbo-qos.html
@@@ -1,245 -1,0 +1,245 @@@
 +<!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, qos" />
 +	<meta name="description" content="This article introduces how to use Dubbo&#39;s QoS to achieve dynamic configuration." />
 +	<!-- 网页标签标题 -->
 +	<title>Manipulating Services Dynamically via QoS</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="/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 h [...]
 +<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>
 +<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>
 +<h2>Mechanism of QoS</h2>
 +<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>
 +<blockquote>
 +<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>
 +</blockquote>
 +<p><img src="../../img/blog/qos-architecture.png" alt="undefined"></p>
 +<p>The picture above shows how QoS works:</p>
 +<ol>
 +<li>Start and listen to a port (22222 by default).</li>
 +<li>Choose a corresponding request handler by detecting the protocol (telnet or http) a request comply with.</li>
 +<li>Decode and parse the request to generate corresponding command according to the protocol.</li>
 +<li>Execute commands and return with responses.</li>
 +</ol>
 +<h3>QoS Commands:</h3>
 +<p>Commands that QoS supports at the current moment include:</p>
 +<ul>
 +<li><code>help</code>, list available commands</li>
 +<li><code>ls</code>: list all active provider services and consumer services</li>
 +<li><code>online</code>: dynamically register a service or all services to registration center</li>
 +<li><code>offline</code>: dynamically remove (unregister) a services or all services from registration center</li>
 +<li><code>quit</code>: quit the current telnet session</li>
 +</ul>
 +<p>Now we are going to demonstrate how to manipulate services dynamically via QoS.</p>
 +<h4>Access QoS via Telnet</h4>
 +<p>Assuming that our Dubbo server has started, connect to it via telnet:</p>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> telnet localhost 22222</span>
 +Trying 127.0.0.1...
 +Connected to localhost.
 +Escape character is '^]'.
 +  ?????????  ???    ??  ???????????  ???????????   ????????
 +  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???
 +  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???
 +  ???    ??? ???    ???  ??????????   ??????????  ???    ???
 +  ???    ??? ???    ??? ???????????  ???????????  ???    ???
 +  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???
 +  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???
 +  ?????????  ?????????  ???????????  ???????????   ????????
 +<span class="hljs-meta">
 +
 +dubbo&gt;</span><span class="bash"></span>
 +</code></pre>
 +<p>A <code>dubbo&gt;</code> prompt would show up once you connect to server. Now input <code>help</code>:</p>
 +<pre><code class="language-sh">dubbo&gt;<span class="hljs-built_in">help</span>
 ++---------+----------------------------------------------------------------------------------+
 +|    <span class="hljs-built_in">help</span> | <span class="hljs-built_in">help</span> <span class="hljs-built_in">command</span>                                                                     |
 ++---------+----------------------------------------------------------------------------------+
 +|      ls | ls service                                                                       |
 ++---------+----------------------------------------------------------------------------------+
 +| offline | offline dubbo                                                                    |
 ++---------+----------------------------------------------------------------------------------+
 +|  online | online dubbo                                                                     |
 ++---------+----------------------------------------------------------------------------------+
 +|    quit | quit telnet console                                                              |
 ++---------+----------------------------------------------------------------------------------+
 +
 +dubbo&gt;
 +</code></pre>
 +<p>This command lists all available commands with explanations.</p>
 +<p>You can also use <code>help</code> to a specific command to read examples of that command.</p>
 +<pre><code class="language-sh">dubbo&gt;<span class="hljs-built_in">help</span> online
 ++--------------+----------------------------------------------------------------------------------+
 +| COMMAND NAME | online                                                                           |
 ++--------------+----------------------------------------------------------------------------------+
 +|      EXAMPLE | online dubbo                                                                     |
 +|              | online xx.xx.xxx.service                                                         |
 ++--------------+----------------------------------------------------------------------------------+
 +</code></pre>
 +<p>Use <code>ls</code> to check services' status:</p>
 +<pre><code class="language-sh">dubbo&gt;ls
 +As Provider side:
 ++------------------------------------------+---+
 +|           Provider Service Name          |PUB|
 ++------------------------------------------+---+
 +|org.apache.dubbo.demo.provider.DemoService| Y |
 ++------------------------------------------+---+
 +As Consumer side:
 ++---------------------+---+
 +|Consumer Service Name|NUM|
 ++---------------------+---+
 +</code></pre>
 +<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>
 +<p>Assuming that we need to withdraw a service dynamically, we can use <code>offline</code> command:</p>
 +<pre><code>dubbo&gt;offline org.apache.dubbo.demo.provider.DemoService
 +OK
 +</code></pre>
 +<p>You can see that the command responds with <code>OK</code>. Check the services' status using <code>ls</code>:</p>
 +<pre><code class="language-sh">dubbo&gt;ls
 +As Provider side:
 ++------------------------------------------+---+
 +|           Provider Service Name          |PUB|
 ++------------------------------------------+---+
 +|org.apache.dubbo.demo.provider.DemoService| N |
 ++------------------------------------------+---+
 +As Consumer side:
 ++---------------------+---+
 +|Consumer Service Name|NUM|
 ++---------------------+---+
 +</code></pre>
 +<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>
 +<p>Quit the current telnet session using <code>quit</code>:</p>
 +<pre><code class="language-sh">dubbo&gt;quit
 +BYE!
 +Connection closed by foreign host.
 +</code></pre>
 +<h4>Access QoS via HTTP</h4>
 +<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>
 +<pre><code class="language-sh">$ curl -i http://localhost:22222/online?service=org.apache.dubbo.demo.provider.DemoService
 +HTTP/1.1 200 OK
 +Content-Type: text/plain
 +Content-Length: 2
 +
 +OK%
 +</code></pre>
 +<blockquote>
 +<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>
 +</blockquote>
 +<p>The action responds with <code>OK</code>. Now use <code>ls</code> to check providers' status at the current moment.</p>
 +<pre><code>$ curl -i http://localhost:22222/ls
 +HTTP/1.1 200 OK
 +Content-Type: text/plain
 +Content-Length: 365
 +
 +As Provider side:
 ++------------------------------------------+---+
 +|           Provider Service Name          |PUB|
 ++------------------------------------------+---+
 +|org.apache.dubbo.demo.provider.DemoService| Y |
 ++------------------------------------------+---+
 +As Consumer side:
 ++---------------------+---+
 +|Consumer Service Name|NUM|
 ++---------------------+---+
 +</code></pre>
 +<p>You can see that the service's <code>PUB</code> status has been changed to <code>Y</code>.</p>
 +<h3>QoS' Parameters</h3>
 +<p>You can use parameters that QoS provides to config its startup. These parameters include:</p>
 +<table>
 +<thead>
 +<tr>
 +<th>Parameter</th>
 +<th>Explanation</th>
 +<th>Default</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td>qosEnable</td>
 +<td>Activate QoS or not</td>
 +<td>true</td>
 +</tr>
 +<tr>
 +<td>qosPort</td>
 +<td>The port QoS would bind to</td>
 +<td>22222</td>
 +</tr>
 +<tr>
 +<td>qosAcceptForeignIp</td>
 +<td>Enable remote access or not</td>
 +<td>false</td>
 +</tr>
 +</tbody>
 +</table>
 +<blockquote>
 +<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>
 +</blockquote>
 +<p>You can configure these parameters in the following ways:</p>
 +<ul>
 +<li>System property</li>
 +<li><code>dubbo.properties</code></li>
 +<li>XML</li>
 +<li>Spring-boot auto configuration</li>
 +</ul>
 +<p>They have priority in the following order: system property &gt; <code>dubbo.properties</code> &gt; XML &gt; spring-boot.</p>
 +<h4>System Property</h4>
 +<pre><code>-Ddubbo.application.qos.enable=true
 +-Ddubbo.application.qos.port=33333
 +-Ddubbo.application.qos.accept.foreign.ip=false
 +</code></pre>
 +<h4><code>Dubbo.properties</code></h4>
 +<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>
 +<pre><code>dubbo.application.qos.enable=true
 +dubbo.application.qos.port=33333
 +dubbo.application.qos.accept.foreign.ip=false
 +</code></pre>
 +<h4>XML</h4>
 +<p>If you are going to config using XML, you can try this:</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +       <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span>
 +       <span class="hljs-attr">xmlns:dubbo</span>=<span class="hljs-string">"http://dubbo.apache.org/schema/dubbo"</span>
 +       <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
 +       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"</span>&gt;</span>
 +  <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>
 +    <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>
 +    <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>
 +    <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>
 +  <span class="hljs-tag">&lt;/<span class="hljs-name">dubbo:application</span>&gt;</span>
 +  <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>
 +  <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>
 +  <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>
 +  <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>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">beans</span>&gt;</span>
 +</code></pre>
 +<h4><code>spring-boot</code> auto configuration</h4>
 +<p>If you are developing a spring-boot application, you can configure in <code>application.properties</code> or <code>application.yml</code>:</p>
 +<pre><code>dubbo.application.qosEnable=true
 +dubbo.application.qosPort=33333
 +dubbo.application.qosAcceptForeignIp=false
 +</code></pre>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/introduction-to-dubbo-spi-2.html
index 564a925,0000000..c453549
mode 100644,000000..100644
--- a/en-us/blog/introduction-to-dubbo-spi-2.html
+++ b/en-us/blog/introduction-to-dubbo-spi-2.html
@@@ -1,389 -1,0 +1,389 @@@
 +<!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, SPI, source code analysis" />
 +	<meta name="description" content="This article introduces the principles and details of Dubbo&#39;s SPI." />
 +	<!-- 网页标签标题 -->
 +	<title>Dubbo extensible mechanism source code analysis</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="/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 h [...]
 +<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>
 +<h2>ExtensionLoader</h2>
 +<p><code>ExtensionLoader</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>
 +<ul>
 +<li><code>public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type)</code></li>
 +<li><code>public T getExtension(String name)</code></li>
 +<li><code>public T getAdaptiveExtension()</code></li>
 +</ul>
 +<p>The common usages are:</p>
 +<ul>
 +<li><code>LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName)</code></li>
 +<li><code>RouterFactory routerFactory = ExtensionLoader.getExtensionLoader(RouterFactory.class).getAdaptiveExtension()</code></li>
 +</ul>
 +<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>
 +<ol>
 +<li>getExtensionLoader
 +This 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>
 +</ol>
 +<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>{
 +        <span class="hljs-comment">// An extension point must be an interface</span>
 +        <span class="hljs-keyword">if</span> (!type.isInterface()) {
 +            <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>);
 +        }
 +        <span class="hljs-comment">// @SPI annotations must be provided</span>
 +        <span class="hljs-keyword">if</span> (!withExtensionAnnotation(type)) {
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Extension type without @SPI Annotation!"</span>);
 +        }
 +        <span class="hljs-comment">// Get the corresponding ExtensionLoader from the cache according to the interface</span>
 +        <span class="hljs-comment">// Each extension will only be loaded once</span>
 +        ExtensionLoader&lt;T&gt; loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);
 +        <span class="hljs-keyword">if</span> (loader == <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-comment">// Initialize extension</span>
 +            EXTENSION_LOADERS.putIfAbsent(type, <span class="hljs-keyword">new</span> ExtensionLoader&lt;T&gt;(type));
 +            loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);
 +        }
 +        <span class="hljs-keyword">return</span> loader;
 +}
 +    
 +<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>{
 +        <span class="hljs-keyword">this</span>.type = type;
 +        objectFactory = (type == ExtensionFactory.class ? <span class="hljs-keyword">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
 +}
 +</code></pre>
 +<ol start="2">
 +<li>getExtension</li>
 +</ol>
 +<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>{
 +        Holder&lt;Object&gt; holder = cachedInstances.get(name);
 +        <span class="hljs-keyword">if</span> (holder == <span class="hljs-keyword">null</span>) {
 +            cachedInstances.putIfAbsent(name, <span class="hljs-keyword">new</span> Holder&lt;Object&gt;());
 +            holder = cachedInstances.get(name);
 +        }
 +        Object instance = holder.get();
 +        <span class="hljs-comment">// Get it from the cache. If it does not exist, create</span>
 +        <span class="hljs-keyword">if</span> (instance == <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-keyword">synchronized</span> (holder) {
 +                instance = holder.get();
 +                <span class="hljs-keyword">if</span> (instance == <span class="hljs-keyword">null</span>) {
 +                    instance = createExtension(name);
 +                    holder.set(instance);
 +                }
 +            }
 +        }
 +        <span class="hljs-keyword">return</span> (T) instance;
 +}
 +</code></pre>
 +<p>Some judgments and caching have been made in the getExtension method, and the main logic is in the createExtension method. Let's move on to the createExtension method.</p>
 +<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>{
 +        <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>
 +        Class&lt;?&gt; clazz = getExtensionClasses().get(name);
 +        
 +        T instance = (T) EXTENSION_INSTANCES.get(clazz);
 +        <span class="hljs-keyword">if</span> (instance == <span class="hljs-keyword">null</span>) {
 +              <span class="hljs-comment">// Use reflection to call newInstance to create an example of an extension class</span>
 +            EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance());
 +            instance = (T) EXTENSION_INSTANCES.get(clazz);
 +        }
 +        <span class="hljs-comment">// Make dependency injection for the extended class samples</span>
 +        injectExtension(instance);
 +        <span class="hljs-comment">// If there is a wrapper, add the wrapper</span>
 +        Set&lt;Class&lt;?&gt;&gt; wrapperClasses = cachedWrapperClasses;
 +        <span class="hljs-keyword">if</span> (wrapperClasses != <span class="hljs-keyword">null</span> &amp;&amp; !wrapperClasses.isEmpty()) {
 +            <span class="hljs-keyword">for</span> (Class&lt;?&gt; wrapperClass : wrapperClasses) {
 +                instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
 +            }
 +        }
 +        <span class="hljs-keyword">return</span> instance;
 +}
 +</code></pre>
 +<p>The createExtension method has done the following:</p>
 +<ol>
 +<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>
 +<li>Use reflection to create an instance of an extended class.</li>
 +<li>make dependency injection for the attributes of the extended class instance. That is, IoC.</li>
 +<li>If there is a wrapper, add the wrapper. That is, AOP.</li>
 +</ol>
 +<p>Let's focus on these four processes.</p>
 +<ol>
 +<li>Get the corresponding extension class according to name. Let’s read the code first:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">private</span> Map&lt;String, Class&lt;?&gt;&gt; getExtensionClasses() {
 +        Map&lt;String, Class&lt;?&gt;&gt; classes = cachedClasses.get();
 +        <span class="hljs-keyword">if</span> (classes == <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-keyword">synchronized</span> (cachedClasses) {
 +                classes = cachedClasses.get();
 +                <span class="hljs-keyword">if</span> (classes == <span class="hljs-keyword">null</span>) {
 +                    classes = loadExtensionClasses();
 +                    cachedClasses.set(classes);
 +                }
 +            }
 +        }
 +        <span class="hljs-keyword">return</span> classes;
 +    }
 +
 +<span class="hljs-comment">// synchronized in getExtensionClasses</span>
 +<span class="hljs-keyword">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {
 +        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);
 +        <span class="hljs-keyword">if</span> (defaultAnnotation != <span class="hljs-keyword">null</span>) {
 +            String value = defaultAnnotation.value();
 +            <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>) {
 +                String[] names = NAME_SEPARATOR.split(value);
 +                <span class="hljs-keyword">if</span> (names.length &gt; <span class="hljs-number">1</span>) {
 +                    <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());
 +                }
 +                <span class="hljs-keyword">if</span> (names.length == <span class="hljs-number">1</span>) cachedDefaultName = names[<span class="hljs-number">0</span>];
 +            }
 +        }
 +
 +        Map&lt;String, Class&lt;?&gt;&gt; extensionClasses = <span class="hljs-keyword">new</span> HashMap&lt;String, Class&lt;?&gt;&gt;();
 +        loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY);
 +        loadFile(extensionClasses, DUBBO_DIRECTORY);
 +        loadFile(extensionClasses, SERVICES_DIRECTORY);
 +        <span class="hljs-keyword">return</span> extensionClasses;
 +}
 +</code></pre>
 +<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>
 +<ul>
 +<li><code>META-INF/dubbo/internal</code></li>
 +<li><code>META-INF/dubbo</code></li>
 +<li><code>META-INF/services</code></li>
 +</ul>
 +<ol start="2">
 +<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>
 +<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, D [...]
 +<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>
 +</ol>
 +<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>
 +<h2>Auto-assembly of Dubbo SPI advanced usage</h2>
 +<p>The relevant code for auto-assembly is in the injectExtension method:</p>
 +<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>{
 +    <span class="hljs-keyword">for</span> (Method method : instance.getClass().getMethods()) {
 +        <span class="hljs-keyword">if</span> (method.getName().startsWith(<span class="hljs-string">"set"</span>)
 +                &amp;&amp; method.getParameterTypes().length == <span class="hljs-number">1</span>
 +                &amp;&amp; Modifier.isPublic(method.getModifiers())) {
 +            Class&lt;?&gt; pt = method.getParameterTypes()[<span class="hljs-number">0</span>];
 +          
 +            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>;
 +            Object object = objectFactory.getExtension(pt, property);
 +            <span class="hljs-keyword">if</span> (object != <span class="hljs-keyword">null</span>) {
 +                method.invoke(instance, object);
 +            }
 +        }
 +    }
 +    <span class="hljs-keyword">return</span> instance;
 +}
 +</code></pre>
 +<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 [...]
 +<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>{
 +        <span class="hljs-keyword">this</span>.type = type;
 +        objectFactory = (type == ExtensionFactory.class ? <span class="hljs-keyword">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
 +}
 +</code></pre>
 +<p>ObjectFacore is also an extension, obtained through <code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()</code>.</p>
 +<p><img src="https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo-extensionfactory.png" alt="Dubbo-ExtensionFactory | left"></p>
 +<p>ExtensionFactory includes three implementations:</p>
 +<ol>
 +<li>SpiExtensionFactory: use Dubbo's Spi to load Extension.</li>
 +<li>SpringExtensionFactory: load Extension from the Spring container.</li>
 +<li>AdaptiveExtensionFactory: adaptive AdaptiveExtensionLoader</li>
 +</ol>
 +<p>Pay attention to the AdaptiveExtensionLoader here, the source code is as follows:</p>
 +<pre><code class="language-java"><span class="hljs-meta">@Adaptive</span>
 +<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>{
 +
 +    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> List&lt;ExtensionFactory&gt; factories;
 +
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">AdaptiveExtensionFactory</span><span class="hljs-params">()</span> </span>{
 +        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);
 +        List&lt;ExtensionFactory&gt; list = <span class="hljs-keyword">new</span> ArrayList&lt;ExtensionFactory&gt;();
 +        <span class="hljs-keyword">for</span> (String name : loader.getSupportedExtensions()) {
 +            list.add(loader.getExtension(name));
 +        }
 +        factories = Collections.unmodifiableList(list);
 +    }
 +
 +    <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>{
 +        <span class="hljs-keyword">for</span> (ExtensionFactory factory : factories) {
 +            T extension = factory.getExtension(type, name);
 +            <span class="hljs-keyword">if</span> (extension != <span class="hljs-keyword">null</span>) {
 +                <span class="hljs-keyword">return</span> extension;
 +            }
 +        }
 +        <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
 +    }
 +}
 +</code></pre>
 +<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.
 +The AdaptiveExtensionLoader 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. Fo [...]
 +<h2>AOP of Dubbo SPI advanced usage</h2>
 +<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.
 +Does 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>
 +<h3>What is the Wrapper class</h3>
 +<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>
 +<pre><code class="language-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">A</span></span>{
 +    <span class="hljs-keyword">private</span> A a;
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">A</span><span class="hljs-params">(A a)</span></span>{
 +        <span class="hljs-keyword">this</span>.a = a;
 +    }
 +}
 +</code></pre>
 +<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>
 +<h3>How to configure the Wrapper class</h3>
 +<p>The Wrapper 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/org.apache.dubbo.rpc.Protocol</code>:</p>
 +<pre><code class="language-text">filter=org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper
 +listener=org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper
 +mock=org.apache.dubbo.rpc.support.MockProtocol
 +</code></pre>
 +<p>When Dubbo loads the extension configuration file, there is a piece of code as follows:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">try</span> {  
 +  clazz.getConstructor(type);    
 +  Set&lt;Class&lt;?&gt;&gt; wrappers = cachedWrapperClasses;
 +  <span class="hljs-keyword">if</span> (wrappers == <span class="hljs-keyword">null</span>) {
 +    cachedWrapperClasses = <span class="hljs-keyword">new</span> ConcurrentHashSet&lt;Class&lt;?&gt;&gt;();
 +    wrappers = cachedWrapperClasses;
 +  }
 +  wrappers.add(clazz);
 +} <span class="hljs-keyword">catch</span> (NoSuchMethodException e) {}
 +</code></pre>
 +<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.
 +Take Protocol as an example. The configuration file <code>dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol defines filter=org.apache.dubbo.rpc.protocol. ProtocolFilterWrapper</code>.
 +The code of ProtocolFilterWrapper is as follows:</p>
 +<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>{
 +
 +    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> Protocol protocol;
 +
 +    <span class="hljs-comment">// One parameter is the copy constructor of Protocol</span>
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ProtocolFilterWrapper</span><span class="hljs-params">(Protocol protocol)</span> </span>{
 +        <span class="hljs-keyword">if</span> (protocol == <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"protocol == null"</span>);
 +        }
 +        <span class="hljs-keyword">this</span>.protocol = protocol;
 +    }
 +}
 +</code></pre>
 +<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>
 +<h2>Extension point adaptive</h2>
 +<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.
 +Let's first look at the code to create an adaptive extension class:</p>
 +<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>{
 +    Object instance = cachedAdaptiveInstance.get();
 +    <span class="hljs-keyword">if</span> (instance == <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-keyword">synchronized</span> (cachedAdaptiveInstance) {
 +                instance = cachedAdaptiveInstance.get();
 +                <span class="hljs-keyword">if</span> (instance == <span class="hljs-keyword">null</span>) {
 +                      instance = createAdaptiveExtension();
 +                      cachedAdaptiveInstance.set(instance); 
 +                }
 +            }        
 +    }
 +
 +    <span class="hljs-keyword">return</span> (T) instance;
 +}
 +</code></pre>
 +<p>Continue to read the createAdaptiveExtension method:</p>
 +<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>{        
 +    <span class="hljs-keyword">return</span> injectExtension((T) getAdaptiveExtensionClass().newInstance());
 +}
 +</code></pre>
 +<p>Continue to read the getAdaptiveExtensionClass method:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">private</span> Class&lt;?&gt; getAdaptiveExtensionClass() {
 +        getExtensionClasses();
 +        <span class="hljs-keyword">if</span> (cachedAdaptiveClass != <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-keyword">return</span> cachedAdaptiveClass;
 +        }
 +        <span class="hljs-keyword">return</span> cachedAdaptiveClass = createAdaptiveExtensionClass();
 +}
 +</code></pre>
 +<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>
 +<pre><code class="language-java"><span class="hljs-keyword">private</span> Class&lt;?&gt; createAdaptiveExtensionClass() {
 +        String code = createAdaptiveExtensionClassCode();
 +        ClassLoader classLoader = findClassLoader();
 +        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
 +        <span class="hljs-keyword">return</span> compiler.compile(code, classLoader);
 +}
 +</code></pre>
 +<p>The default implementation of Compiler's code is javassist.</p>
 +<pre><code class="language-java"><span class="hljs-meta">@SPI</span>(<span class="hljs-string">"javassist"</span>)
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Compiler</span> </span>{
 +    Class&lt;?&gt; compile(String code, ClassLoader classLoader);
 +}
 +</code></pre>
 +<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  [...]
 +Below are the Java code example for Protocol adaptive class created by createAdaptiveExtensionClassCode method:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> org.apache.dubbo.rpc;
 +
 +<span class="hljs-keyword">import</span> org.apache.dubbo.common.extension.ExtensionLoader;
 +
 +<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">Adaptive</span> <span class="hljs-keyword">implements</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">Protocol</span> </span>{
 +    <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>{
 +        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnsupportedOperationException(<span class="hljs-string">"method public abstract void org.apache.dubbo.rpc.Protocol.destroy() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!"</span>);
 +    }
 +
 +    <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>{
 +        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnsupportedOperationException(<span class="hljs-string">"method public abstract int org.apache.dubbo.rpc.Protocol.getDefaultPort() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!"</span>);
 +    }
 +
 +    <span class="hljs-keyword">public</span> org.apache.dubbo.rpc.<span class="hljs-function">Exporter <span class="hljs-title">export</span><span class="hljs-params">(org.apache.dubbo.rpc.Invoker arg0)</span> <span class="hljs-keyword">throws</span> org.apache.dubbo.rpc.RpcException </span>{
 +        <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">"org.apache.dubbo.rpc.Invoker argument == null"</span>);
 +        <span class="hljs-keyword">if</span> (arg0.getUrl() == <span class="hljs-keyword">null</span>)
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"org.apache.dubbo.rpc.Invoker argument getUrl() == null"</span>);
 +        org.apache.dubbo.common.URL url = arg0.getUrl();
 +        String extName = (url.getProtocol() == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"dubbo"</span> : url.getProtocol());
 +        <span class="hljs-keyword">if</span> (extName == <span class="hljs-keyword">null</span>)
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url("</span> + url.toString() + <span class="hljs-string">") use keys([protocol])"</span>);
 +        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
 +        <span class="hljs-keyword">return</span> extension.export(arg0);
 +    }
 +
 +    <span class="hljs-keyword">public</span> org.apache.dubbo.rpc.<span class="hljs-function">Invoker <span class="hljs-title">refer</span><span class="hljs-params">(java.lang.Class arg0, org.apache.dubbo.common.URL arg1)</span> <span class="hljs-keyword">throws</span> org.apache.dubbo.rpc.RpcException </span>{
 +        <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>);
 +        org.apache.dubbo.common.URL url = arg1;
 +        String extName = (url.getProtocol() == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"dubbo"</span> : url.getProtocol());
 +        <span class="hljs-keyword">if</span> (extName == <span class="hljs-keyword">null</span>)
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url("</span> + url.toString() + <span class="hljs-string">") use keys([protocol])"</span>);
 +        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
 +        <span class="hljs-keyword">return</span> extension.refer(arg0, arg1);
 +    }
 +}
 +</code></pre>
 +<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>.
 +In the generated Protocol$Adaptive, both the getDefaultPort and destroy methods are found to throw the exception directly. Why? Take a look at the source code of Protocol:</p>
 +<pre><code class="language-java"><span class="hljs-meta">@SPI</span>(<span class="hljs-string">"dubbo"</span>)
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Protocol</span> </span>{
 +
 +    <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">getDefaultPort</span><span class="hljs-params">()</span></span>;
 +
 +    <span class="hljs-meta">@Adaptive</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>;
 +
 +    <span class="hljs-meta">@Adaptive</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>;
 +
 +    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">destroy</span><span class="hljs-params">()</span></span>;
 +}
 +</code></pre>
 +<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$Adaptive class, only the export and refer methods have specific implementations, and the rest of the methods throw exceptions.</p>
- </section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache Dubbo is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/introduction-to-dubbo-spi.html
index ece5417,0000000..8066822
mode 100644,000000..100644
--- a/en-us/blog/introduction-to-dubbo-spi.html
+++ b/en-us/blog/introduction-to-dubbo-spi.html
@@@ -1,205 -1,0 +1,205 @@@
 +<!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, SPI" />
 +	<meta name="description" content="This article introduces Dubbo&#39;s SPI mechanism." />
 +	<!-- 网页标签标题 -->
 +	<title>Dubbo Extension Mechanism in Action</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="/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 h [...]
 +<h2>1. Extension Mechanism of Dubbo</h2>
 +<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 t [...]
 +When talking about software design, people always mention scalability. A framework with good scalability requires the following:
 +1.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.
 +2.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.
 +With 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>
 +<h2>2.Extension Solutions</h2>
 +<p>Creating Extensible applications usually considers:</p>
 +<ul>
 +<li>Factory method pattern</li>
 +<li>IoC container</li>
 +<li>OSGi (Open Services Gateway initiative)</li>
 +</ul>
 +<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>
 +<h2>3.Java SPI Mechanism</h2>
 +<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>
 +<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 u [...]
 +<ol>
 +<li>Define an interface IRepository to store data.</li>
 +</ol>
 +<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>{
 +    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">save</span><span class="hljs-params">(String data)</span></span>;
 +}
 +</code></pre>
 +<ol start="2">
 +<li>Create 2 implementations for IRepository: MysqlRepository and MongoRepository</li>
 +</ol>
 +<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>{
 +    <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>{
 +        System.out.println(<span class="hljs-string">"Save "</span> + data + <span class="hljs-string">" to Mysql"</span>);
 +    }
 +}
 +</code></pre>
 +<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>{
 +    <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>{
 +        System.out.println(<span class="hljs-string">"Save "</span> + data + <span class="hljs-string">" to Mongo"</span>);
 +    }
 +}
 +</code></pre>
 +<ol start="3">
 +<li>Create a configuration file under <code>META-INF/services</code>.</li>
 +</ol>
 +<p>The file name is <code>META-INF/services/com.demo.IRepository</code>, the content of file is:</p>
 +<pre><code class="language-text">com.demo.MongoRepository
 +com.demo.MysqlRepository
 +</code></pre>
 +<ol start="4">
 +<li>Load IRepository using ServiceLoader</li>
 +</ol>
 +<pre><code class="language-java">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository.class);
 +Iterator&lt;IRepository&gt; it = serviceLoader.iterator();
 +<span class="hljs-keyword">while</span> (it != <span class="hljs-keyword">null</span> &amp;&amp; it.hasNext()){
 +    IRepository demoService = it.next();
 +    System.out.println(<span class="hljs-string">"class:"</span> + demoService.getClass().getName());
 +    demoService.save(<span class="hljs-string">"tom"</span>);
 +}
 +</code></pre>
 +<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:
 +class:testDubbo.MongoRepository
 +Save tom to Mongo
 +class:testDubbo.MysqlRepository
 +Save tom to Mysql</p>
 +<h2>4. Dubbo SPI Mechanism</h2>
 +<p>Java SPI is simple to use. It also supports basic extension point functions, however, it has some disadvantages:</p>
 +<ul>
 +<li>It will load and instantiate all implementations at once to find the requested implementation.</li>
 +<li>The configuration file only includes the extension implementation but does not name them, which makes it hard to reference them in applications.</li>
 +<li>If extensions depend on other extensions, Java SPI cannot automatically load the dependency SPI.</li>
 +<li>It does not provide functions such as IOC or AOP in Spring.</li>
 +<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>
 +</ul>
 +<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>
 +<h2>5. Basic Concepts for Dubbo Extension Point Mechanism</h2>
 +<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>
 +<h3>5.1 Extension Point</h3>
 +<p>an interface of java.</p>
 +<h3>5.2 Extension</h3>
 +<p>an implementation class of the Extension Point</p>
 +<h3>5.3 Extension Instance</h3>
 +<p>instance of an extension point implementation class</p>
 +<h3>5.4 Extension Adaptive Instance</h3>
 +<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 sa [...]
 +<ul>
 +<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  [...]
 +<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. Adaptiv [...]
 +</ul>
 +<h3>5.5 @SPI</h3>
 +<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>
 +<h3>5.6 @Adaptive</h3>
 +<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 func [...]
 +<h3>5.7 ExtentionLoader</h3>
 +<p>Similar to the Java SPI ServiceLoader, it is responsible for loading extensions and life-cycle maintenance.</p>
 +<h3>5.8 Extension Alias</h3>
 +<p>Different from Java, each extension in Dubbo has an alias, which is used to reference them in the application, such as</p>
 +<pre><code class="language-bash">random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
 +roundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
 +</code></pre>
 +<p>where random, roundrobin are alias of the corresponding extensions, and we can directly use them in the configuration file.</p>
 +<h3>5.9 Paths</h3>
 +<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>
 +<ul>
 +<li><code>META-INF/dubbo/internal</code></li>
 +<li><code>META-INF/dubbo</code></li>
 +<li><code>META-INF/services</code></li>
 +</ul>
 +<h2>6. Interpretation for Dubbo's LoadBalance Extension Point</h2>
 +<p>Now that we know some basic idea about Dubbo, let us check a practical extension point in Dubbo to get some intuition.</p>
 +<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>
 +<h3>6.1 LoadBalance Interfance</h3>
 +<pre><code class="language-java"><span class="hljs-meta">@SPI</span>(RandomLoadBalance.NAME)
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">LoadBalance</span> </span>{
 +
 +    <span class="hljs-meta">@Adaptive</span>(<span class="hljs-string">"loadbalance"</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>;
 +}
 +</code></pre>
 +<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>
 +<ul>
 +<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.
 +<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>
 +</ul>
 +<pre><code class="language-bash">random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
 +roundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
 +leastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
 +consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
 +</code></pre>
 +<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>
 +<p><img src="https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo_loadbalance.png" alt="dubbo-loadbalance | left"></p>
 +<ul>
 +<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 f [...]
 +</ul>
 +<h3>6.2 Obtain LoadBalance extension</h3>
 +<p>The code of LoadBalance in Dubbo is as follows:</p>
 +<pre><code class="language-java">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName);
 +</code></pre>
 +<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>
 +<h2>7. Customize a LoadBalance Extension</h2>
 +<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>
 +<h3>7.1 implement LoadBalance Interface</h3>
 +<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>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.dubbo.spi.demo.consumer;
 +<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>{
 +    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        System.out.println(<span class="hljs-string">"DemoLoadBalance: Select the first invoker..."</span>);
 +        <span class="hljs-keyword">return</span> invokers.get(<span class="hljs-number">0</span>);
 +    }
 +}
 +</code></pre>
 +<h3>7.2 Add extension configuration file</h3>
 +<p>Add file:<code>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance</code>. The content of file is:</p>
 +<pre><code class="language-bash">demo=com.dubbo.spi.demo.consumer.DemoLoadBalance
 +</code></pre>
 +<h3>7.3 Configure customized LoadBalance</h3>
 +<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>
 +<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>
 +</code></pre>
 +<p>Configure &lt;loadbalance=&quot;demo&quot;&gt; in <a href="dubbo:reference">dubbo:reference</a> at consumer part.</p>
 +<h3>7.4 launch Dubbo</h3>
 +<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>
 +<h2>Summary</h2>
 +<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>
 +<ul>
 +<li>Build extensions on Dubbo does not require modifications on the original source code base.</li>
 +<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.
 +*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>
 +<li>Dubbo's extension mechanism default: @SPI(&quot;dubbo&quot;) represents the default SPI object.</li>
 +<li>Dubbo's extension mechanism supports the advanced features such as IoC and AoP, etc.</li>
 +<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>
 +<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>
 +</ul>
 +<p>In the next article, we will go deep and check Dubbo's source code to learn more about Dubbo's extensibility mechanism.</p>
- </section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache Dubbo is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/pinpoint.html
index c252cba,0000000..e976f27
mode 100644,000000..100644
--- a/en-us/blog/pinpoint.html
+++ b/en-us/blog/pinpoint.html
@@@ -1,403 -1,0 +1,403 @@@
 +<!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, Pinpoint, tracing" />
 +	<meta name="description" content="This article introduces how to use Pinpoint to track Dubbo applications and monitor applications&#39; performance." />
 +	<!-- 网页标签标题 -->
 +	<title>Tracking with Pinpoint</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="/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 h [...]
 +<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>
 +<h2>What is Pinpoint</h2>
 +<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>
 +<p>You should definitely check Pinpoint out If you want to</p>
 +<p>understand your application topology at a glance
 +monitor your application in Real-Time
 +gain code-level visibility to every transaction
 +install APM Agents without changing a single line of code
 +have minimal impact on the performance (approximately 3% increase in resource usage)</p>
 +<h3>ServerMap</h3>
 +<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>
 +<h3>Realtime Active Thread Chart</h3>
 +<p>Monitor active threads inside applications in real-time.</p>
 +<h3>Request/Response Scatter Chart</h3>
 +<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>
 +<h3>CallStack</h3>
 +<p>Gain code-level visibility to every transaction in a distributed environment, identifying bottlenecks and points of failure in a single view.</p>
 +<h3>Inspector</h3>
 +<p>View additional details on the application such as CPU usage, Memory/Garbage Collection, TPS, and JVM arguments.</p>
 +<h3>Supported Modules (last updated 2018/04/01)</h3>
 +<ul>
 +<li>JDK 6+</li>
 +<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>
 +<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>
 +<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>
 +<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>
 +<li>ActiveMQ, RabbitMQ</li>
 +<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>
 +<li>Arcus, Memcached, Redis, CASSANDRA</li>
 +<li>iBATIS, MyBatis</li>
 +<li>DBCP, DBCP2, HIKARICP</li>
 +<li>gson, Jackson, Json Lib</li>
 +<li>log4j, Logback</li>
 +</ul>
 +<h2>Pinpoint and Dubbo</h2>
 +<h3>Quickstart Pinpoint</h3>
 +<p><a href="http://naver.github.io/pinpoint/quickstart.html">Quick start</a>(No neet to start TestApp)</p>
 +<h3>Dubbo demo</h3>
 +<h4>Create API module</h4>
 +<p>pom.xml</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +         <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>
 +    <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>
 +
 +    <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>
 +    <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>
 +    <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>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">project</span>&gt;</span>
 +</code></pre>
 +<p>Create API interface:</p>
 +<pre><code>package com.example.demoapi;
 +
 +public interface HelloService {
 +    String sayHello(String name);
 +}
 +</code></pre>
 +<h4>Dubbo provider</h4>
 +<p>pom.xml</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +	<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">parent</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">relativePath</span>/&gt;</span> <span class="hljs-comment">&lt;!-- lookup parent from repository --&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">parent</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">repositories</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">repository</span>&gt;</span>
 +			<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>
 +			<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>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">releases</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">releases</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">snapshots</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">snapshots</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">repository</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">repositories</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
 +		<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.springframework.boot<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>spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +		<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>com.alibaba.boot<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-spring-boot-starter<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>0.2.0<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>
 +		<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>com.example<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>demo-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>0.0.1-SNAPSHOT<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>
 +
 +		<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.springframework.boot<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>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +			<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>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
 +				<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>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
 +
 +<span class="hljs-tag">&lt;/<span class="hljs-name">project</span>&gt;</span>
 +</code></pre>
 +<ol>
 +<li><code>HelloService</code> interface:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.demoprovider.provider;
 +
 +<span class="hljs-keyword">import</span> com.alibaba.dubbo.config.annotation.Service;
 +<span class="hljs-keyword">import</span> com.example.demoapi.HelloService;
 +
 +<span class="hljs-meta">@Service</span>(version = <span class="hljs-string">"${demo.service.version}"</span>,
 +        application = <span class="hljs-string">"${dubbo.application.id}"</span>,
 +        protocol = <span class="hljs-string">"${dubbo.protocol.id}"</span>,
 +        registry = <span class="hljs-string">"${dubbo.registry.id}"</span>)
 +<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>{
 +    <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>;
 +    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        i++;
 +        <span class="hljs-keyword">if</span> (i % <span class="hljs-number">3</span> == <span class="hljs-number">0</span>) {
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"ex"</span>);
 +        }
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"Hello "</span> + name + <span class="hljs-string">"!"</span>;
 +    }
 +}
 +</code></pre>
 +<ol start="2">
 +<li>Spring Boot bootstrap:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.demoprovider;
 +
 +<span class="hljs-keyword">import</span> org.springframework.boot.SpringApplication;
 +<span class="hljs-keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;
 +
 +<span class="hljs-meta">@SpringBootApplication</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoProviderApplication</span> </span>{
 +
 +	<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>{
 +		SpringApplication.run(DemoProviderApplication.class, args);
 +	}
 +}
 +</code></pre>
 +<ol start="3">
 +<li><code>application.properties</code>:</li>
 +</ol>
 +<pre><code class="language-properties"># Spring boot application
 +spring.application.name = dubbo-provider-demo
 +server.port = 9090
 +management.port = 9091
 +
 +# Service version
 +demo.service.version = 1.0.0
 +
 +# Base packages to scan Dubbo Components (e.g @Service , @Reference)
 +dubbo.scan.basePackages  = com.example.demoprovider
 +
 +# Dubbo Config properties
 +## ApplicationConfig Bean
 +dubbo.application.id = dubbo-provider-demo
 +dubbo.application.name = dubbo-provider-demo
 +
 +## ProtocolConfig Bean
 +dubbo.protocol.id = dubbo
 +dubbo.protocol.name = dubbo
 +dubbo.protocol.port = 12345
 +
 +## RegistryConfig Bean
 +dubbo.registry.id = my-registry
 +dubbo.registry.address = N/A
 +</code></pre>
 +<h4>Dubbo consumer</h4>
 +<p>pom.xml</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +	<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">parent</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">relativePath</span>/&gt;</span> <span class="hljs-comment">&lt;!-- lookup parent from repository --&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">parent</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">repositories</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">repository</span>&gt;</span>
 +			<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>
 +			<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>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">releases</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">releases</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">snapshots</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">snapshots</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">repository</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">repositories</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
 +		<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.springframework.boot<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>spring-boot-starter-web<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +		<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>com.alibaba.boot<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-spring-boot-starter<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>0.2.0<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>
 +		<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>com.example<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>demo-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>0.0.1-SNAPSHOT<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>
 +
 +		<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.springframework.boot<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>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +			<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>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
 +				<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>
 +				<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>
 +				<span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
 +					<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>
 +				<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
 +
 +<span class="hljs-tag">&lt;/<span class="hljs-name">project</span>&gt;</span>
 +</code></pre>
 +<ol>
 +<li><code>@Reference</code> injection <code>HelloService</code></li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.democonsumer.controller;
 +
 +<span class="hljs-keyword">import</span> com.alibaba.dubbo.config.annotation.Reference;
 +<span class="hljs-keyword">import</span> com.example.demoapi.HelloService;
 +<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
 +<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestParam;
 +<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RestController;
 +
 +<span class="hljs-meta">@RestController</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerController</span> </span>{
 +    <span class="hljs-meta">@Reference</span>(version = <span class="hljs-string">"${demo.service.version}"</span>,
 +            application = <span class="hljs-string">"${dubbo.application.id}"</span>,
 +            url = <span class="hljs-string">"dubbo://&lt;Real IP Address&gt;:12345"</span>)
 +    <span class="hljs-keyword">private</span> HelloService helloService;
 +
 +    <span class="hljs-meta">@RequestMapping</span>(<span class="hljs-string">"/sayHello"</span>)
 +    <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>{
 +        <span class="hljs-keyword">return</span> helloService.sayHello(name);
 +    }
 +}
 +</code></pre>
 +<ol start="2">
 +<li>Spring Boot bootstrap:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.democonsumer;
 +
 +<span class="hljs-keyword">import</span> org.springframework.boot.SpringApplication;
 +<span class="hljs-keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;
 +
 +<span class="hljs-meta">@SpringBootApplication</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerApplication</span> </span>{
 +
 +	<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>{
 +		SpringApplication.run(DemoConsumerApplication.class, args);
 +	}
 +}
 +</code></pre>
 +<ol start="3">
 +<li><code>application.properties</code>:</li>
 +</ol>
 +<pre><code class="language-properties"># Spring boot application
 +spring.application.name=dubbo-consumer-demo
 +server.port=8080
 +management.port=8081
 +
 +# Service Version
 +demo.service.version=1.0.0
 +
 +# Dubbo Config properties
 +## ApplicationConfig Bean
 +dubbo.application.id=dubbo-consumer-demo
 +dubbo.application.name=dubbo-consumer-demo
 +
 +## ProtocolConfig Bean
 +dubbo.protocol.id=dubbo
 +dubbo.protocol.name=dubbo
 +dubbo.protocol.port=12345
 +</code></pre>
 +<h3>Using Pinpoint-agent to start <code>Dubbo provider</code> and <code>Dubbo consumer</code></h3>
 +<ol>
 +<li>Maven clean package</li>
 +</ol>
 +<pre><code>mvn clean package
 +</code></pre>
 +<ol start="2">
 +<li>Start provider</li>
 +</ol>
 +<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
 +</code></pre>
 +<ol start="3">
 +<li>Start consumer</li>
 +</ol>
 +<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
 +</code></pre>
 +<ol start="4">
 +<li>Access the consumer address to simulate user requests</li>
 +</ol>
 +<p><code>http://localhost:8080/sayHello?name=ABC</code></p>
 +<h2>Using Pinpoint locate problems</h2>
 +<h3>Homepage</h3>
 +<p><img src="../../img/blog/en_pinpoint-home.png" alt="/admin-guide/images/pinpoint-home.png"></p>
 +<blockquote>
 +<p>The user request here is double the number of requests for DubboProvider, because the favicon.ico icon request is recorded.</p>
 +</blockquote>
 +<h3>Call tree</h3>
 +<p><img src="../../img/blog/en_pinpoint-calltree.png" alt="/admin-guide/images/pinpoint-calltree.png"></p>
 +<h3>Mixed view</h3>
 +<p><img src="../../img/blog/en_pinpoint-mixedview.png" alt="/admin-guide/images/pinpoint-mixedview.png"></p>
 +<h3>Other</h3>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/prepare-an-apache-release.html
index 3342c3a,0000000..c69cde3
mode 100644,000000..100644
--- a/en-us/blog/prepare-an-apache-release.html
+++ b/en-us/blog/prepare-an-apache-release.html
@@@ -1,488 -1,0 +1,489 @@@
 +<!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, Apache, Release" />
- 	<meta name="description" content="prepare-an-apache-release" />
++	<meta name="description" content="This article introduces how to the Apache publish content and process" />
 +	<!-- 网页标签标题 -->
 +	<title>Understanding the Apache Release Cycle</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="/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 h [...]
++	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a h [...]
++<h2>Understanding the Apache Release Cycle</h2>
 +<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>
 +<p>Please refer to the following links for more information on ASF's release guide:</p>
 +<ul>
 +<li><a href="http://www.apache.org/dev/release-publishing">Apache Release Guide</a></li>
 +<li><a href="http://www.apache.org/dev/release.html">Apache Release Policy</a></li>
 +<li><a href="http://www.apache.org/dev/publishing-maven-artifacts.html">Maven Release Info</a></li>
 +</ul>
 +<h2>Preparation of Local Building Environment</h2>
 +<p>Mainly including the related preparation of signature utilities and Maven repository certification</p>
 +<ol>
 +<li>
 +<p>Install GPG,refer to <a href="https://www.gnupg.org/download/index.html">https://www.gnupg.org/download/index.html</a></p>
 +<ul>
 +<li>For example, in Mac OS</li>
 +</ul>
 +<pre><code class="language-sh">$ brew install gpg
 +$ gpg --version <span class="hljs-comment">#check version,should be 2.x</span>
 +</code></pre>
 +</li>
 +<li>
 +<p>Generate the key with GPG</p>
 +<ul>
 +<li>Generate the key according to the prompt</li>
 +</ul>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> gpg2 --full-gen-key</span>
 +gpg (GnuPG) 2.0.12; Copyright (C) 2009 Free Software Foundation, Inc.
 +This is free software: you are free to change and redistribute it.
 +There is NO WARRANTY, to the extent permitted by law.
 +
 +Please select what kind of key you want:
 +  (1) RSA and RSA (default)
 +  (2) DSA and Elgamal
 +  (3) DSA (sign only)
 +  (4) RSA (sign only)
 +Your selection? 1
 +RSA keys may be between 1024 and 4096 bits long.
 +What keysize do you want? (2048) 4096
 +Requested keysize is 4096 bits
 +Please specify how long the key should be valid.
 +        0 = key does not expire
 +     &lt;n&gt;  = key expires in n days
 +     &lt;n&gt;w = key expires in n weeks
 +     &lt;n&gt;m = key expires in n months
 +     &lt;n&gt;y = key expires in n years
 +Key is valid for? (0) 
 +Key does not expire at all
 +Is this correct? (y/N) y
 +
 +GnuPG needs to construct a user ID to identify your key.
 +
 +Real name: Robert Burrell Donkin
 +Email address: rdonkin@apache.org
 +Comment: CODE SIGNING KEY
 +You selected this USER-ID:
 +   "Robert Burrell Donkin (CODE SIGNING KEY) &lt;rdonkin@apache.org&gt;"
 +
 +Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
 +You need a Passphrase to protect your secret key. # enter the password, which will be used frequently when packaging.
 +</code></pre>
 +<ul>
 +<li>View key id</li>
 +</ul>
 +<pre><code class="language-sh">$ gpg --list-keys
 +pub   rsa4096/28681CB1 2018-04-26 <span class="hljs-comment"># 28681CB1 is the key id</span>
 +uid       [ultimate] liujun (apache-dubbo) &lt;liujun@apache.org&gt;
 +sub   rsa4096/D3D6984B 2018-04-26
 +
 +<span class="hljs-comment">########### Note: Different diaplay for different version.</span>
 +$ gpg --list-keys
 +pub   rsa4096 2018-11-12 [SC]
 +      63AAE9838F4A303E40BAF5FEA3A1CA7A5D4A3981     <span class="hljs-comment"># Last 8 character(5D4A3981) as key id,it will be used when send public key to keyserver</span>
 +uid           [ 绝对 ] Victory Cao (CODE SIGNING KEY) &lt;victory@apache.org&gt;
 +sub   rsa4096 2018-11-12 [E]
 +    
 +
 +<span class="hljs-comment"># send public key to keyserver via key id </span>
 +$ gpg --keyserver pgpkeys.mit.edu --send-key 28681CB1
 +<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>
 +</code></pre>
 +<ul>
 +<li>If there are multiple public keys,you can set the default key</li>
 +</ul>
 +<p>~/.gnupg/gpg.conf</p>
 +<pre><code class="language-proper"># If you have more than 1 secret key in your keyring, you may want to
 +# uncomment the following option and set your preferred keyid.
 +
 +default-key 28681CB1
 +</code></pre>
 +<ul>
 +<li>If there are multiple public keys, you can also delete unuseful key:</li>
 +</ul>
 +<pre><code class="language-sh"><span class="hljs-comment">### Delete the private key first, then delete the public key.</span>
 +
 +$ gpg --yes --delete-secret-keys shenglicao2@gmail.com   <span class="hljs-comment">### indicate email address  </span>
 +
 +$ gpg --delete-keys 1808C6444C781C0AEA0AAD4C4D6A8007D20DB8A4 
 +
 +</code></pre>
 +</li>
 +<li>
 +<p>Set up Apache central repository.</p>
 +<ul>
 +<li>The parent pom of Dubbo project is apache pom</li>
 +</ul>
 +<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">parent</span>&gt;</span>
 +<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>
 +<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>
 +<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>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">parent</span>&gt;</span>
 +</code></pre>
 +<ul>
 +<li>
 +<p>Add the following contents to .m2/settings.xml</p>
 +<p>Enter the passwords after
 +encrypting by <a href="http://maven.apache.org/guides/mini/guide-encryption.html">maven-encryption-plugin</a></p>
 +</li>
 +</ul>
 +<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">settings</span>&gt;</span>
 +...
 + <span class="hljs-tag">&lt;<span class="hljs-name">servers</span>&gt;</span>
 +   <span class="hljs-comment">&lt;!-- To publish a snapshot of some part of Maven --&gt;</span>
 +   <span class="hljs-tag">&lt;<span class="hljs-name">server</span>&gt;</span>
 +     <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>
 +     <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>
 +     <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>
 +   <span class="hljs-tag">&lt;/<span class="hljs-name">server</span>&gt;</span>
 +   <span class="hljs-comment">&lt;!-- To stage a release of some part of Maven --&gt;</span>
 +   <span class="hljs-tag">&lt;<span class="hljs-name">server</span>&gt;</span>
 +     <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>
 +     <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>
 +     <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>
 +   <span class="hljs-tag">&lt;/<span class="hljs-name">server</span>&gt;</span>
 +  ...
 +     <span class="hljs-comment">&lt;!-- gpg passphrase used when generate key --&gt;</span>
 +    <span class="hljs-tag">&lt;<span class="hljs-name">server</span>&gt;</span>
 +     <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>
 +     <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>
 +   <span class="hljs-tag">&lt;/<span class="hljs-name">server</span>&gt;</span>
 + <span class="hljs-tag">&lt;/<span class="hljs-name">servers</span>&gt;</span>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">settings</span>&gt;</span>
 +</code></pre>
 +</li>
 +</ol>
 +<h2>Pack &amp; Upload</h2>
 +<ol>
 +<li>
 +<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
 +modifications 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>
 +</li>
 +<li>
 +<p>First of all, verify that the maven component packing, source packing, signature, etc are working properly on the ${release_version}-release branch.</p>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> mvn clean install -Papache-release</span>
 +<span class="hljs-meta">$</span><span class="bash"> mvn deploy</span>
 +</code></pre>
 +</li>
 +</ol>
 +<p>This push the snapshot package to the maven central repository.</p>
 +<ol start="3">
 +<li>
 +<p>Release with maven-release-plugin</p>
 +<ul>
 +<li>verify with dryRun</li>
 +</ul>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> mvn release:prepare -Prelease -Darguments=<span class="hljs-string">"-Dmaven.test.skip=true"</span> -DautoVersionSubmodules=<span class="hljs-literal">true</span> -Dusername=YOUR GITHUB ID -DdryRun=<span class="hljs-literal">true</span></span>
 +</code></pre>
 +<ul>
 +<li>After verification, run release:prepare</li>
 +</ul>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> mvn release:clean</span>
 +<span class="hljs-meta">$</span><span class="bash"> mvn release:prepare -Prelease -Darguments=<span class="hljs-string">"-Dmaven.test.skip=true"</span> -DautoVersionSubmodules=<span class="hljs-literal">true</span> -Dusername=YOUR GITHUB ID -DpushChanges=<span class="hljs-literal">false</span></span>
 +</code></pre>
 +<blockquote>
 +<p>If you are promted to input password for pushing to GitHub (basically including adding new commits and tags), do not input your login password of GitHub. Use <code>Personal access tokens</code> instead. You can go to <a href="https://github.com/settings/profile">https://github.com/settings/profile</a>, click <code>Developer settings</code> -&gt; <code>Personal access tokens</code>, and generate a new token if not. Please refer to this <a href="https://help.github.com/articles/creatin [...]
 +you need to choose the release artifactId, next artifactId and the release tag, the default tag is dubbo-parent-xxxx, you need to change it to dubbo-xxxx</p>
 +</blockquote>
 +<p>After executing the above commands, you will find that:</p>
 +<ol>
 +<li>source-release.zip and bin-release.zip are generated under dubbo-distribution directory, please unzip it and check the file structure</li>
 +<li><code>-DpushChanges=false</code> tells maven not to push the commits and tags to the remote repostiroy. If not specified, the version tag will be pushed to github repository, you will see a commit called <code>[maven-release-plugin] prepare release dubbo-x.x.x</code> added.</li>
 +<li>The branch version is upgraded to ${release_version+1}-SNAPSHOT automatically. If <code>-DpushChanges=true</code> is specified, the modifications will be pushed to the remote repository, you will see a commit called <code>[maven-release-plugin] prepare for next development iteration</code> added.</li>
 +</ol>
 +<p>If <code>-DpushChanges=false</code> is specified, you will have to manually push the commit to remote repository before go to next step.</p>
 +<ul>
 +<li>Run release:perform</li>
 +</ul>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> mvn release:perform -Prelease -Darguments=<span class="hljs-string">"-Dmaven.test.skip=true"</span> -DautoVersionSubmodules=<span class="hljs-literal">true</span> -Dusername=YOUR GITHUB ID</span>
 +</code></pre>
 +<p>Maven will download the source code from the tag you just pushed, compile it, and deploy to remote maven repsoitry in staging state.</p>
 +</li>
 +</ol>
 +<h3>Note</h3>
 +<blockquote>
 +<p>When you deploy the package into repository, it will be interrupted for network. So you must restart to desploy.<br>
 +The problem is that missing package occurred many times at deploying. So you should check the quantity of package, especially parent package.</p>
 +</blockquote>
 +<h2>Prepare Apache Release</h2>
 +<ol>
 +<li>
 +<p>Prepare the svn local environment (Apache hosting the release content of project by svn)</p>
 +</li>
 +<li>
 +<p>Checkout dubbo to local directory</p>
 +<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>
 +</code></pre>
 +<p>Assume that the local directory is <code>~/apache/incubator/dubbo</code></p>
 +</li>
 +<li>
 +<p>The current release version is ${release_version}, new directory</p>
 +<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>
 +<span class="hljs-meta">$</span><span class="bash"> mkdir <span class="hljs-variable">${release_version}</span></span>
 +</code></pre>
 +</li>
 +<li>
 +<p>Add public key to <a href="https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS">KEYS</a> file if you are the first time to be a release manager. KEYS is mainly used to allow people who participate in the voting to be imported locally to verify the correctness of the sign.</p>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> gpg -a --<span class="hljs-built_in">export</span> your_key_id &gt;&gt; KEYS</span>
 +</code></pre>
 +<p>For more information on how to get your key id, please refer to this <a href="https://help.github.com/articles/generating-a-new-gpg-key/">guide</a></p>
 +</li>
 +<li>
 +<p>Copy the source.zip package from the Dubbo root directory to the svn local repository dubbo/${release_version}</p>
 +</li>
 +<li>
 +<p>Generate sha512 sign</p>
 +<p>For source-release.zip</p>
- <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>
++<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> shasum -a 512 apache-dubbo-<span class="hljs-variable">${release_version}</span>-<span class="hljs-built_in">source</span>-release.zip &gt;&gt; apache-dubbo-<span class="hljs-variable">${release_version}</span>-<span class="hljs-built_in">source</span>-release.zip.sha512</span>
 +</code></pre>
 +<p>For bin-release.zip</p>
 +<p>Please add <code>-b</code> paramter when generating sha512 for bin-release.zip, which indicates it is a binary file.</p>
- <pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> shasum -b -a 512 apache-dubbo-incubating-<span class="hljs-variable">${release_version}</span>-bin-release.zip &gt;&gt; apache-dubbo-incubating-<span class="hljs-variable">${release_version}</span>-bin-release.zip.sha512</span>
++<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> shasum -b -a 512 apache-dubbo-<span class="hljs-variable">${release_version}</span>-bin-release.zip &gt;&gt; apache-dubbo-<span class="hljs-variable">${release_version}</span>-bin-release.zip.sha512</span>
 +</code></pre>
 +<p>You should generate something like this:</p>
- <pre><code>b8f13d1df6d6c9a1facc72fafc00b2d22bea1e600517c507467d8fca2f776a7a3877101742da53114bfa629ca5b941eb4d9ef989de43f0833e2a794e7ccf5c8a *apache-dubbo-spring-boot-project-incubating-2.7.0-bin-release.zip
++<pre><code>b8f13d1df6d6c9a1facc72fafc00b2d22bea1e600517c507467d8fca2f776a7a3877101742da53114bfa629ca5b941eb4d9ef989de43f0833e2a794e7ccf5c8a *apache-dubbo-spring-boot-project-2.7.0-bin-release.zip
 +</code></pre>
 +<p>Note there is a <code>*</code> sign before the file name.</p>
 +</li>
 +<li>
 +<p>If the binary release is accompanied with the source release. Run the following command in the dubbo-distribution module:</p>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> mvn install</span>
 +</code></pre>
 +<p>Go to target directory, copy bin-release.zip and bin-release.zip.asc to svn local repository dubbo/${release_version}, and refer to step 6 to generate sha512 sign.</p>
 +</li>
 +<li>
 +<p>Commit to Apache svn</p>
 +<pre><code class="language-shell"><span class="hljs-meta">$</span><span class="bash"> svn status</span>
 +<span class="hljs-meta">$</span><span class="bash"> svn commit -m <span class="hljs-string">'prepare for ${release_version} RC1'</span></span>
 +</code></pre>
 +</li>
 +</ol>
 +<h2>Verify Release Candidates</h2>
 +<p><strong>A full check list can be found <a href="https://wiki.apache.org/incubator/IncubatorReleaseChecklist">here</a></strong></p>
 +<p>The verification link includes but is not limited to the following contents and forms:</p>
 +<h3>Check signatures and hashes are good</h3>
 +<h4>check the sha512 sum</h4>
- <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
- $ shasum -c apache-dubbo-incubating-<span class="hljs-variable">${release_version}</span>-bin-release.zip.sha512
++<pre><code class="language-sh">$ shasum -c apache-dubbo-<span class="hljs-variable">${release_version}</span>-<span class="hljs-built_in">source</span>-release.zip.sha512
++$ shasum -c apache-dubbo-<span class="hljs-variable">${release_version}</span>-bin-release.zip.sha512
 +</code></pre>
 +<h4>check the gpg signarure</h4>
 +<p>If it's your first time verify a release candidte, you should import public keys first.</p>
 +<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>
 + $ gpg --import KEYS <span class="hljs-comment"># import keys</span>
 + $ gpg —edit-key liujun
 +   &gt; trust <span class="hljs-comment"># type trust command</span>
 +</code></pre>
 +<p>Now, you can verify signature with command</p>
- <pre><code class="language-sh">gpg --verify apache-dubbo-incubating-2.6.3-source-release.zip.asc apache-dubbo-incubating-2.6.3-source-release.zip
- gpg --verify apache-dubbo-incubating-2.6.3-bin-release.zip.asc apache-dubbo-incubating-2.6.3-bin-release.zip
++<pre><code class="language-sh">gpg --verify apache-dubbo-2.6.3-source-release.zip.asc apache-dubbo-2.6.3-source-release.zip
++gpg --verify apache-dubbo-2.6.3-bin-release.zip.asc apache-dubbo-2.6.3-bin-release.zip
 +</code></pre>
 +<h3>Check source release file content</h3>
- <p>Unzip apache-dubbo-incubating-${release_version}-source-release.zip to the default directory and check the following:</p>
++<p>Unzip apache-dubbo-${release_version}-source-release.zip to the default directory and check the following:</p>
 +<ul>
 +<li>Directory with 'incubating' in name
- <code>apache-dubbo-incubating-${release_version}-source-release</code></li>
++<code>apache-dubbo-${release_version}-source-release</code></li>
 +<li>DISCLAIMER exists</li>
 +<li>LICENSE and NOTICE exists and contents are good</li>
 +<li>All files and no binary files exist</li>
 +<li>All files has standard ASF License header</li>
 +<li>Can compile from source</li>
 +<li>All unit tests can pass<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>
 +<span class="hljs-comment"># you can also open rat and style plugin to check if every file meets requirements.</span>
 +mvn clean <span class="hljs-built_in">test</span> -Drat.skip=<span class="hljs-literal">false</span> -Dcheckstyle.skip=<span class="hljs-literal">false</span>
 +</code></pre>
 +</li>
 +<li>Release candidates match with corresponding tags, you can find tag link and hash in vote email.
 +<ul>
 +<li>check the version number in pom.xml are the same</li>
 +<li>check there are no extra files or directories in the source package, for example, no empty directories or useless log files.<br>
 +<code>diff -r rc_dir tag_dir</code></li>
 +<li>check the top n tag commits, dive into the related files and check if the source package has the same changes</li>
 +</ul>
 +</li>
 +</ul>
 +<h3>Check binary distribution file content</h3>
- <p>Unzip apache-dubbo-incubating-${release_version}-bin-release.zip and check:</p>
++<p>Unzip apache-dubbo-${release_version}-bin-release.zip and check:</p>
 +<ul>
 +<li>Check signatures are good</li>
 +<li>'incubating' in name</li>
 +<li>LICENSE and NOTICE exists and contents are good</li>
 +</ul>
 +<p>Note that if the binary distribution contains third party files, you may need to update LICENSE file by adding the 3rd party license files. If these dependency is Apache License 2.0, and it contains NOTICE file, you may also need to update NOTICE file as well.</p>
 +<h2>Release vote</h2>
 +<p>The voting is divided into two phases:</p>
 +<ol>
 +<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>
 +<li>Apache community votes and sends the voting email to <a href="mailto:general@incubator.apache.org">general@incubator.apache.org</a>. After reviewing by Apache IPMC(Incubator PMC) members and winning 3 binding votes that agree to release, you will be allowed to release officially.</li>
 +</ol>
 +<p>The mail template for Apache Dubbo vote:</p>
 +<pre><code class="language-tex">Hello Dubbo Community,
 +
 +This is a call for vote to release Apache Dubbo (Incubating) version 2.6.2.
 +
 +The release candidates:
 +https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.2/
 +
 +Git tag for the release:
- https://github.com/apache/incubator-dubbo/tree/dubbo-2.6.2
++https://github.com/apache/dubbo/tree/dubbo-2.6.2
 +
 +Hash for the release tag:
 +afab04c53edab38d52275d2a198ea1aff7a4f41e
 +
 +Release Notes:
- https://github.com/apache/incubator-dubbo/releases/tag/untagged-4775c0a22c60fca55118
++https://github.com/apache/dubbo/releases/tag/untagged-4775c0a22c60fca55118
 +
 +The artifacts have been signed with Key : 28681CB1, which can be found in the keys file:
 +https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS
 +
 +The vote will be open for at least 72 hours or until necessary number of votes are reached.
 +
 +Please vote accordingly:
 +
 +[ ] +1 approve 
 +[ ] +0 no opinion 
 +[ ] -1 disapprove with the reason
 +
 +Thanks,
 +The Apache Dubbo (Incubating) Team
 +</code></pre>
 +<p>The mail template for Apache Incubator vote:</p>
 +<pre><code class="language-text">Hello all,
 +
 +This is a call for vote to release Apache Dubbo (Incubating) version 2.6.4.
 +
 +The Apache Dubbo community has voted on and approved a proposal to release
 +Apache Dubbo (Incubating) version 2.6.4.
 +
 +We now kindly request the Incubator PMC members review and vote on this
 +incubator release.
 +
- Apache Dubbo™ (incubating) is a high-performance, java based, open source
++Apache Dubbo™  is a high-performance, java based, open source
 +RPC framework. Dubbo offers three key functionalities, which include
 +interface based remote call, fault tolerance &amp; load balancing, and
 +automatic service registration &amp; discovery.
 +
 +Dubbo community vote and result thread:
 +https://lists.apache.org/thread.html/8d5c39eece6288beed2e22ca976350728c571d2a9cef1c9a9e56a409@%3Cdev.dubbo.apache.org%3E
 +A minor issue also can be found in the above thread.
 +
 +The release candidates (RC1):
 +https://dist.apache.org/repos/dist/dev/incubator/dubbo/2.6.4
 +
 +Git tag for the release (RC1):
- https://github.com/apache/incubator-dubbo/tree/dubbo-2.6.4
++https://github.com/apache/dubbo/tree/dubbo-2.6.4
 +
 +Hash for the release tag:
 +88037747a3b69d3225c73f6fbcda36ebd8435887
 +
 +Release Notes:
- *https://github.com/apache/incubator-dubbo/blob/dubbo-2.6.4/CHANGES.md
- &lt;https://github.com/apache/incubator-dubbo/blob/dubbo-2.6.4/CHANGES.md&gt;*
++*https://github.com/apache/dubbo/blob/dubbo-2.6.4/CHANGES.md
++&lt;https://github.com/apache/dubbo/blob/dubbo-2.6.4/CHANGES.md&gt;*
 +
 +The artifacts have been signed with Key : 7955FB6D1DD21CF7, which can be
 +found in the keys file:
 +https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS
 +
 +Look at here for how to verify this release candidate:
- https://github.com/apache/incubator-dubbo-website/blob/asf-site/blog/en-us/prepare-an-apache-release.md#prepare-apache-release
++https://github.com/apache/dubbo-website/blob/asf-site/blog/en-us/prepare-an-apache-release.md#prepare-apache-release
 +
 +The vote will be open for at least 72 hours or until necessary number of
 +votes are reached.
 +
 +Please vote accordingly:
 +[ ] +1 approve
 +[ ] +0 no opinion
 +[ ] -1 disapprove with the reason
 +
 +Thanks,
 +The Apache Dubbo (Incubating) Team
 +</code></pre>
 +<p>The mail template to announce the vote result:</p>
 +<pre><code class="language-text">We’ve received 3 +1 binding votes and one +1 non-binding vote:
 +
 ++1 binding, Ian Luo
 ++1 binding, Huxing Zhang
 ++1 binding, Jun Liu
 +
 ++1 non-binding, Jerrick
 +
 +I will create a new vote thread in Apache community now.
 +
 +Best regards,
 +The Apache Dubbo (Incubating) Team
 +</code></pre>
 +<h2>Official Release</h2>
 +<p>When the release vote has passed,</p>
 +<ol>
 +<li>Add the release files to <a href="https://dist.apache.org/repos/dist/release/incubator/dubbo">official release directory</a></li>
 +<li>Remove the release files in <a href="https://dist.apache.org/repos/dist/dev/incubator/dubbo">dev directory</a></li>
 +<li>Remove the the release file for the previous release under <a href="https://dist.apache.org/repos/dist/release/incubator/dubbo/">official release directory</a>, which will be archived and can be found <a href="https://archive.apache.org/dist/incubator/dubbo/">here</a></li>
- <li>Publish <a href="https://github.com/apache/incubator-dubbo/releases">release notes</a> on Github.</li>
- <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>
- <li>Add the download link to official website <a href="http://dubbo.apache.org/en-us/blog/download.html">http://dubbo.apache.org/en-us/blog/download.html</a>, using the ASF mirror system. The latest release download link should be something like <a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/$VERSION/apache-dubbo-incubating-$VERSION-source-release.zip">this</a>. The download link for the previous release version should be changed like <a href="https://archive.apache [...]
++<li>Publish <a href="https://github.com/apache/dubbo/releases">release notes</a> on Github.</li>
++<li>Update the recommend dependency on <a href="https://github.com/apache/dubbo#maven-dependency">Github</a> to the latest version, also update the version in other place if necessary.</li>
++<li>Add the download link to official website <a href="http://dubbo.apache.org/en-us/blog/download.html">http://dubbo.apache.org/en-us/blog/download.html</a>, using the ASF mirror system. The latest release download link should be something like <a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/$VERSION/apache-dubbo-$VERSION-source-release.zip">this</a>. The download link for the previous release version should be changed like <a href="https://archive.apache.org/dist/i [...]
 +<li>Make sure all the commits in the release branch are merged into master branch, and then remove the remote release branch. For example: <code>git push origin --delete 2.7.0-release</code></li>
 +<li>Send mail to <a href="mailto:dev@dubbo.apache.org">dev@dubbo.apache.org</a> and <a href="mailto:general@incubator.apache.org">general@incubator.apache.org</a>, notify the community that the release is completed.
 +The mail template to announce release:</li>
 +</ol>
 +<pre><code class="language-text">Hello Community,
 +
- The Apache Dubbo(incubating) team is pleased to announce that the
++The Apache Dubbo team is pleased to announce that the
 +2.6.6 has just been released.
 +
- Apache Dubbo™ (incubating) is a high-performance, java based, open source
++Apache Dubbo™  is a high-performance, java based, open source
 +RPC framework. Dubbo offers three key functionalities, which include
 +interface based remote call, fault tolerance &amp; load balancing, and
 +automatic service registration &amp; discovery.
 +
 +Both the source release[1] and the maven binary release[2] are available
 +now, you can also find the detailed release notes in here[3].
 +
 +
 +If you have any usage questions, or have problems when upgrading or find
 +any problems about enhancements included in this release, please don’t
 +hesitate to let us know by sending feedback to this mailing list or filing
 +an issue on GitHub[4].
 +
 +
 +
 +=====
 +*Disclaimer*
 +
 +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 [...]
 +
 +
 +[1] http://dubbo.apache.org/en-us/blog/download.html
 +[2] http://central.maven.org/maven2/com/alibaba/dubbo
- [3] https://github.com/apache/incubator-dubbo/releases
- [4] https://github.com/apache/incubator-dubbo/issues
++[3] https://github.com/apache/dubbo/releases
++[4] https://github.com/apache/dubbo/issues
 +
 +</code></pre>
 +<h2>Complete Maven Convenient Binary release</h2>
 +<p><strong><a href="https://repository.apache.org/">repository.apache.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>
 +<p>To release the maven artifacts, go to <a href="https://repository.apache.org">repository.apache.org</a>, and choose the staging repository, click the release button. Wait for a moment and verify it at <a href="https://repository.apache.org/content/repositories/releases/org/apache/dubbo/">here</a>, make sure your artifacts are there and correct. It will take some time to sync to maven central repository. You can verify it at <a href="https://repo.maven.apache.org/maven2/org/apache/dub [...]
 +<h2>FAQ</h2>
 +<h4>gpg: signing failed: Inappropriate ioctl for device</h4>
 +<p>If you've encoutered this error, try the following commands:</p>
 +<pre><code>export GPG_TTY=$(tty)
 +</code></pre>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/qcon-beijing-2018.html
index 36a73bb,0000000..39efbfc
mode 100644,000000..100644
--- a/en-us/blog/qcon-beijing-2018.html
+++ b/en-us/blog/qcon-beijing-2018.html
@@@ -1,34 -1,0 +1,34 @@@
 +<!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="qcon-beijing-2018" />
- 	<meta name="description" content="qcon-beijing-2018" />
++	<meta name="keywords" content="Dubbo, roadmap, QCon Beijing" />
++	<meta name="description" content="This article will introduce you that Dubbo roadmap is announced in QCon Beijing 2018." />
 +	<!-- 网页标签标题 -->
- 	<title>qcon-beijing-2018</title>
++	<title>Dubbo roadmap is announced in QCon Beijing 2018</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="/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 h [...]
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/sentinel-introduction-for-dubbo.html
index 997a8fd,0000000..8cac65c
mode 100644,000000..100644
--- a/en-us/blog/sentinel-introduction-for-dubbo.html
+++ b/en-us/blog/sentinel-introduction-for-dubbo.html
@@@ -1,97 -1,0 +1,97 @@@
 +<!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, Sentinel, current limit, fuse" />
 +	<meta name="description" content="This article introduces the Sentinel and how to integrate it with Dubbo." />
 +	<!-- 网页标签标题 -->
 +	<title>Sentinel: The flow sentinel of Dubbo services</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="/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 h [...]
 +<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 [...]
 +<h2>Introduction to Sentinel</h2>
 +<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>
 +<p>There are mainly three features in Sentinel:</p>
 +<ul>
 +<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>
 +<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>
 +<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>
 +</ul>
 +<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 depende [...]
 +<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 [...]
 +<h2>Best Practice for using Dubbo with Sentinel</h2>
 +<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>
 +<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>com.alibaba.csp<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>sentinel-dubbo-adapter<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>x.y.z<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>
 +<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>
 +<pre><code class="language-java"><span class="hljs-meta">@Bean</span>
 +<span class="hljs-function"><span class="hljs-keyword">public</span> ConsumerConfig <span class="hljs-title">consumerConfig</span><span class="hljs-params">()</span> </span>{
 +    ConsumerConfig consumerConfig = <span class="hljs-keyword">new</span> ConsumerConfig();
 +    consumerConfig.setFilter(<span class="hljs-string">"-sentinel.dubbo.consumer.filter"</span>);
 +    <span class="hljs-keyword">return</span> consumerConfig;
 +}
 +</code></pre>
 +<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>
 +<h3>Service Provider</h3>
 +<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>
 +<p>The flow control for Dubbo services has two granularities: service interface and service method.</p>
 +<ul>
 +<li>Service interface:resourceName format is <code>interfaceName</code>,e.g. <code>com.alibaba.csp.sentinel.demo.dubbo.FooService</code></li>
 +<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>
 +</ul>
 +<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>
 +<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>
 +<pre><code>2018-07-24 17:13:43|1|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String),FlowException,default,|5,0
 +</code></pre>
 +<p>Log messages will also appear in provider's metric log:</p>
 +<pre><code>1532423623000|2018-07-24 17:13:43|com.alibaba.csp.sentinel.demo.dubbo.FooService|15|0|15|0|3
 +1532423623000|2018-07-24 17:13:43|com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)|10|5|10|0|0
 +</code></pre>
 +<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>  [...]
 +<blockquote>
 +<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 in [...]
 +</blockquote>
 +<p>The <code>sentinel-block.log</code> will also record caller name. For example:</p>
 +<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
 +</code></pre>
 +<p>The <code>demo-consumer</code> in the log is the caller name (origin).</p>
 +<h3>Service Consumer</h3>
 +<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  [...]
 +<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>
 +<h3>Sentinel Dashboard</h3>
 +<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>
 +<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
 +</code></pre>
 +<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>
 +<p><img src="../../img/blog/sentinel-dashboard-view-rules.png" alt="Rule List"></p>
 +<p>Or view real-time metrics:</p>
 +<p><img src="../../img/blog/sentinel-dashboard-metrics.png" alt="Real-time metrics monitoring"></p>
 +<h2>Summary</h2>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/spring-boot-dubbo-start-stop-analysis.html
index c0dc83d,0000000..7c08f4e
mode 100644,000000..100644
--- a/en-us/blog/spring-boot-dubbo-start-stop-analysis.html
+++ b/en-us/blog/spring-boot-dubbo-start-stop-analysis.html
@@@ -1,217 -1,0 +1,217 @@@
 +<!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, Spring Boot, source code analysis" />
- 	<meta name="description" content="This article introduces the implementation details of app start and stop in `incubator-dubbo-spring-boot-project`." />
++	<meta name="description" content="This article introduces the implementation details of app start and stop in `dubbo-spring-boot-project`." />
 +	<!-- 网页标签标题 -->
 +	<title>Source code analysis of spring-boot+Dubbo App start and stop</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="/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 h [...]
 +<h2>Introduction</h2>
- <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>
++<p><a href="https://github.com/apache/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>
 +<ul>
- <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>
- <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>
++<li><a href="https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure">Autoconfigure</a> (ex: Annotation driver, Autoconfigure, etc.)</li>
++<li><a href="https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator">Production-Ready</a> (ex: Security, Healthy check, Externalize configuration, etc.)</li>
 +</ul>
 +<h2>The analysis of DubboConsumer startup</h2>
- <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>
++<p>Have you ever thought about this : since the <code>DubboConsumerDemo</code> application in <code>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>
 +<pre><code class="language-java"><span class="hljs-meta">@SpringBootApplication</span>(scanBasePackages = <span class="hljs-string">"com.alibaba.boot.dubbo.demo.consumer.controller"</span>)
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DubboConsumerDemo</span> </span>{
 +
 +    <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>{
 +        SpringApplication.run(DubboConsumerDemo.class,args);
 +    }
 +
 +}
 +</code></pre>
 +<p>In fact, to answer this question, we need to abstract it first, that is, under what circumstances will a JVM process exit?</p>
 +<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>
 +<blockquote>
 +<p>A program terminates all its activity and <em>exits</em> when one of two things happens:</p>
 +<ul>
 +<li>All the threads that are not daemon threads terminate.</li>
 +<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>
 +</ul>
 +</blockquote>
 +<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>
 +<pre><code class="language-sh">➜  jstack 57785 | grep tid | grep -v <span class="hljs-string">"daemon"</span>
 +<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>
 +<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>
 +<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>
 +<span class="hljs-string">"VM Thread"</span> os_prio=31 tid=0x00007fbe3005e800 nid=0x3703 runnable
 +<span class="hljs-string">"GC Thread#0"</span> os_prio=31 tid=0x00007fbe30013800 nid=0x5403 runnable
 +<span class="hljs-string">"GC Thread#1"</span> os_prio=31 tid=0x00007fbe30021000 nid=0x5303 runnable
 +<span class="hljs-string">"GC Thread#2"</span> os_prio=31 tid=0x00007fbe30021800 nid=0x2d03 runnable
 +<span class="hljs-string">"GC Thread#3"</span> os_prio=31 tid=0x00007fbe30022000 nid=0x2f03 runnable
 +<span class="hljs-string">"G1 Main Marker"</span> os_prio=31 tid=0x00007fbe30040800 nid=0x5203 runnable
 +<span class="hljs-string">"G1 Conc#0"</span> os_prio=31 tid=0x00007fbe30041000 nid=0x4f03 runnable
 +<span class="hljs-string">"G1 Refine#0"</span> os_prio=31 tid=0x00007fbe31044800 nid=0x4e03 runnable
 +<span class="hljs-string">"G1 Refine#1"</span> os_prio=31 tid=0x00007fbe31045800 nid=0x4d03 runnable
 +<span class="hljs-string">"G1 Refine#2"</span> os_prio=31 tid=0x00007fbe31046000 nid=0x4c03 runnable
 +<span class="hljs-string">"G1 Refine#3"</span> os_prio=31 tid=0x00007fbe31047000 nid=0x4b03 runnable
 +<span class="hljs-string">"G1 Young RemSet Sampling"</span> os_prio=31 tid=0x00007fbe31047800 nid=0x3603 runnable
 +<span class="hljs-string">"VM Periodic Task Thread"</span> os_prio=31 tid=0x00007fbe31129000 nid=0x6703 waiting on condition
 +
 +</code></pre>
 +<blockquote>
 +<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>
 +</blockquote>
 +<p>We can get some information from the above results:</p>
 +<ul>
 +<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>
 +<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>
 +</ul>
 +<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>
 +<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>
 +<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>{
 +        Thread awaitThread = <span class="hljs-keyword">new</span> Thread(<span class="hljs-string">"container-"</span> + (containerCounter.get())) {
 +
 +            <span class="hljs-meta">@Override</span>
 +            <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>{
 +                TomcatEmbeddedServletContainer.<span class="hljs-keyword">this</span>.tomcat.getServer().await();
 +            }
 +
 +        };
 +        awaitThread.setContextClassLoader(getClass().getClassLoader());
 +        awaitThread.setDaemon(<span class="hljs-keyword">false</span>);
 +        awaitThread.start();
 +    }
 +</code></pre>
 +<p>Let's add a breakpoint in this method, and focus on the call stack:</p>
 +<pre><code class="language-plain">initialize:115, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)
 +&lt;init&gt;:84, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)
 +getTomcatEmbeddedServletContainer:554, TomcatEmbeddedServletContainerFactory (org.springframework.boot.context.embedded.tomcat)
 +getEmbeddedServletContainer:179, TomcatEmbeddedServletContainerFactory (org.springframework.boot.context.embedded.tomcat)
 +createEmbeddedServletContainer:164, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)
 +onRefresh:134, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)
 +refresh:537, AbstractApplicationContext (org.springframework.context.support)
 +refresh:122, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)
 +refresh:693, SpringApplication (org.springframework.boot)
 +refreshContext:360, SpringApplication (org.springframework.boot)
 +run:303, SpringApplication (org.springframework.boot)
 +run:1118, SpringApplication (org.springframework.boot)
 +run:1107, SpringApplication (org.springframework.boot)
 +main:35, DubboConsumerDemo (com.alibaba.boot.dubbo.demo.consumer.bootstrap)
 +</code></pre>
 +<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 w [...]
 +<p>Let's dig deeper to find out how the thread stay alive in Tomcat's <code>this.tomcat.getServer().await()</code> method.</p>
 +<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>{
 +        <span class="hljs-comment">// ...</span>
 +        <span class="hljs-keyword">if</span>( port==-<span class="hljs-number">1</span> ) {
 +            <span class="hljs-keyword">try</span> {
 +                awaitThread = Thread.currentThread();
 +                <span class="hljs-keyword">while</span>(!stopAwait) {
 +                    <span class="hljs-keyword">try</span> {
 +                        Thread.sleep( <span class="hljs-number">10000</span> );
 +                    } <span class="hljs-keyword">catch</span>( InterruptedException ex ) {
 +                        <span class="hljs-comment">// continue and check the flag</span>
 +                    }
 +                }
 +            } <span class="hljs-keyword">finally</span> {
 +                awaitThread = <span class="hljs-keyword">null</span>;
 +            }
 +            <span class="hljs-keyword">return</span>;
 +        }
 +        <span class="hljs-comment">// ...</span>
 +    }
 +</code></pre>
 +<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>
 +<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>
 +<p>Next, let's see how this Spring-boot application exits.</p>
 +<h2>The analysis of DubboConsumer exit</h2>
 +<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>
 +<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>
 +<blockquote>
 +<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>
 +</blockquote>
 +<p>You can see the method is called by a thread called <code>Thread-3</code>:</p>
 +<pre><code class="language-java">stopAwait:<span class="hljs-number">390</span>, StandardServer (org.apache.catalina.core)
 +stopInternal:<span class="hljs-number">819</span>, StandardServer (org.apache.catalina.core)
 +stop:<span class="hljs-number">226</span>, LifecycleBase (org.apache.catalina.util)
 +stop:<span class="hljs-number">377</span>, Tomcat (org.apache.catalina.startup)
 +stopTomcat:<span class="hljs-number">241</span>, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)
 +stop:<span class="hljs-number">295</span>, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)
 +stopAndReleaseEmbeddedServletContainer:<span class="hljs-number">306</span>, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)
 +onClose:<span class="hljs-number">155</span>, EmbeddedWebApplicationContext (org.springframework.boot.context.embedded)
 +doClose:<span class="hljs-number">1014</span>, AbstractApplicationContext (org.springframework.context.support)
 +run:<span class="hljs-number">929</span>, AbstractApplicationContext$<span class="hljs-number">2</span> (org.springframework.context.support)
 +</code></pre>
 +<p>Through source code analysis, it was executed by Spring's registered <code>ShutdownHook</code>.</p>
 +<pre><code class="language-java">    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.shutdownHook == <span class="hljs-keyword">null</span>) {
 +            <span class="hljs-comment">// No shutdown hook registered yet.</span>
 +            <span class="hljs-keyword">this</span>.shutdownHook = <span class="hljs-keyword">new</span> Thread() {
 +                <span class="hljs-meta">@Override</span>
 +                <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>{
 +                    <span class="hljs-keyword">synchronized</span> (startupShutdownMonitor) {
 +                        doClose();
 +                    }
 +                }
 +            };
 +            Runtime.getRuntime().addShutdownHook(<span class="hljs-keyword">this</span>.shutdownHook);
 +        }
 +    }
 +</code></pre>
 +<p>By reffering the Java API documentation[2], we found that ShutdownHook will be executed under the following two cases.</p>
 +<blockquote>
 +<p>The Java virtual machine <em>shuts down</em> in response to two kinds of events:</p>
 +<ul>
 +<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>
 +<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>
 +</ul>
 +</blockquote>
 +<ol>
 +<li>So it's either a call of <code>System.exit()</code></li>
 +<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>
 +</ol>
 +<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>
 +<h2>Summary</h2>
 +<ol>
 +<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>
 +<li>To stop the <code>DubboConsumer</code>, one should call ShutdownHook to change the variable to let the thread break the loop.</li>
 +</ol>
 +<h2>Problems</h2>
 +<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>
 +<h3>Notice</h3>
 +<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>
 +<pre><code class="language-java">    <span class="hljs-meta">@Test</span>
 +    <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>{
 +        <span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> Runnable() {
 +            <span class="hljs-meta">@Override</span>
 +            <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>{
 +                <span class="hljs-keyword">try</span> {
 +                    Thread.sleep(<span class="hljs-number">1000000</span>);
 +                } <span class="hljs-keyword">catch</span> (InterruptedException e) {
 +                    e.printStackTrace();
 +                }
 +            }
 +        }).start();
 +    }
 +</code></pre>
 +<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>
 +<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>
- </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 proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/blog/tracing-with-skywalking.html
index 5e2ba76,0000000..90711d0
mode 100644,000000..100644
--- a/en-us/blog/tracing-with-skywalking.html
+++ b/en-us/blog/tracing-with-skywalking.html
@@@ -1,131 -1,0 +1,131 @@@
 +<!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, Skywalking, tracing, distribute tracking" />
 +	<meta name="description" content="This article introduces how to use Apache Skywalking to track Dubbo applications." />
 +	<!-- 网页标签标题 -->
 +	<title>Tracing Dubbo service with Apache Skywalking(incubator)</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="/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 h [...]
 +<h2>Introduction to Apache Skywalking(Incubator)</h2>
- <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 l [...]
++<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  supports multiple languages age [...]
 +<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 sing [...]
 +<h2>Dubbo and Apache Skywalking(Incubator)</h2>
 +<h3>Build the Dubbo demo  project</h3>
 +<p>The Dubbo demo has been uploaded to the <a href="https://github.com/SkywalkingTest/dubbo-trace-example">GitHub repository</a>.</p>
 +<h4>API project</h4>
 +<p>Service interface definition:
 +package org.apache.skywalking.demo.interfaces;</p>
 +<p>public interface HelloService {
 +String sayHello(String name);
 +}</p>
 +<h4>Service provider project</h4>
 +<p>package org.apache.skywalking.demo.provider;</p>
 +<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 [...]
 +	application = &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 mathr [...]
 +protocol = &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">& [...]
 +	registry = &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"> [...]
 +public class HelloServiceImpl implements HelloService {</p>
 +<pre><code>public String sayHello(String name) {
 +	LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
 +	return &quot;Hello, &quot; + name;
 +}
 +</code></pre>
 +<p>}</p>
 +<h4>Service consumer project</h4>
 +<p>package org.apache.skywalking.demo.consumer;</p>
 +<p>@RestController
 +public class ConsumerController {</p>
 +<pre><code>private static int COUNT = 0;
 +
 +@Reference(version = &quot;${demo.service.version}&quot;,
 +	application = &quot;${dubbo.application.id}&quot;,
 +	url = &quot;dubbo://localhost:20880&quot;, timeout = 60000)
 +private HelloService helloService;
 +
 +@GetMapping(&quot;/sayHello/{name}&quot;)
 +public String sayHello(@PathVariable(name = &quot;name&quot;) String name) {
 +	if ((COUNT++) % 3 == 0){
 +		throw new RuntimeException();
 +	}
 +	LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
 +	return helloService.sayHello(name);
 +}
 +</code></pre>
 +<p>}</p>
 +<h3>Deploy Apache Skywalking(incubator)</h3>
 +<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>
 +<h4>Third-party components</h4>
 +<ol>
 +<li>JDK 8+</li>
 +<li>Elasticsearch 5.x</li>
 +</ol>
 +<h4>Deployment step</h4>
 +<ol>
 +<li>Download <a href="http://skywalking.apache.org/downloads/">Apache Skywalking Collector</a></li>
 +<li>Deploy Elasticsearch service
 +<ul>
 +<li>Set <code>cluster.name</code> to <code>CollectorDBCluster</code></li>
 +<li>Set <code>network.host</code> to <code>0.0.0.0</code></li>
 +<li>Start elasticsearch service</li>
 +</ul>
 +</li>
 +<li>Unzip and start the Skywalking Collector. Run the ' bin/startup.sh ' command to start skywalking Collector</li>
 +</ol>
 +<h4>Deploy the demo</h4>
 +<p>Before you deploy the demo service, please run the following command:</p>
 +<pre><code>./mvnw clean package
 +</code></pre>
 +<h4>Deploy the provider service</h4>
 +<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
 +</code></pre>
 +<h4>Deploy the consumer service</h4>
 +<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 
 +</code></pre>
 +<h4>visit demo service</h4>
 +<pre><code>curl http://localhost:8080/sayHello/test
 +</code></pre>
 +<h2>Skywalking scren snapshot</h2>
 +<h3>Dashboard</h3>
 +<p><img src="../../img/blog/skywalking-dashboard.png" alt="/admin-guide/images/skywalking-dashboard.png"></p>
 +<h3>Topology</h3>
 +<p><img src="../../img/blog/skywalking-topology.png" alt="/admin-guide/images/skywalking-topology.png"></p>
 +<h3>Application view</h3>
 +<p><img src="../../img/blog/skywalking-application.png" alt="/admin-guide/images/skywalking-application.png"></p>
 +<p>JVM Information
 +<img src="../../img/blog/skywalking-application_instance.png" alt="/admin-guide/images/skywalking-application_instance.png"></p>
 +<h3>Service view</h3>
 +<p>Consumer side
 +<img src="../../img/blog/skywalking-service-consumer.png" alt="/admin-guide/images/skywalking-service-consumer.png"></p>
 +<p>provider side
 +<img src="../../img/blog/skywalking-service-provider.png" alt="/admin-guide/images/skywalking-service-provider.png"></p>
 +<h3>Trace</h3>
 +<p><img src="../../img/blog/skywalking-trace.png" alt="/admin-guide/images/skywalking-trace.png"></p>
 +<p>Span info
 +<img src="../../img/blog/skywalking-span-Info.png" alt="/admin-guide/images/skywalking-span-Info.png"></p>
 +<h3>Alarm view</h3>
 +<p><img src="../../img/blog/skywalking-alarm.png" alt="/admin-guide/images/skywalking-alarm.png"></p>
- </section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3>Disclaimer</h3><p>Apache Dubbo is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making proc [...]
++</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">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>< [...]
 +	<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>
diff --cc en-us/community/index.html
index fc67a5f,0000000..8b54c93
mode 100644,000000..100644
--- a/en-us/community/index.html
+++ b/en-us/community/index.html
@@@ -1,32 -1,0 +1,32 @@@
 +<!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="community" />
 +	<meta name="description" content="community" />
 +	<!-- 网页标签标题 -->
 +	<title>community</title>
 +	<link rel="shortcut icon" href="/img/dubbo.ico"/>
 +	<link rel="stylesheet" href="/build/community.css" />
 +</head>
 +<body>
- 	<div id="root"><div class="community-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 hre [...]
++	<div id="root"><div class="community-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 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>
 +		window.rootPath = '';
 +  </script>
 +  <script src="/build/community.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>
diff --cc en-us/docs/admin/README.html
index 6fe6057,0000000..85ce538
mode 100644,000000..100644
--- a/en-us/docs/admin/README.html
+++ b/en-us/docs/admin/README.html
@@@ -1,33 -1,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="README" />
 +	<meta name="description" content="README" />
 +	<!-- 网页标签标题 -->
 +	<title>README</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 [...]
- </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 makin [...]
++	<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 [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/SUMMARY.html
index 5fb3757,0000000..32a9b08
mode 100644,000000..100644
--- a/en-us/docs/admin/SUMMARY.html
+++ b/en-us/docs/admin/SUMMARY.html
@@@ -1,41 -1,0 +1,41 @@@
 +<!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="SUMMARY" />
 +	<meta name="description" content="SUMMARY" />
 +	<!-- 网页标签标题 -->
 +	<title>SUMMARY</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 [...]
++	<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 [...]
 +<li><a href="introduction.md">1 Dubbo Admin introduction</a>
 +<ul>
 +<li><a href="serviceSearch.md">1.1 service search and detail</a></li>
 +<li><a href="serviceGovernance.md">1.2 service governance</a></li>
 +<li><a href="serviceTest.md">1.3 service test</a></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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/admin-console.html
index e4e3515,0000000..142a047
mode 100644,000000..100644
--- a/en-us/docs/admin/install/admin-console.html
+++ b/en-us/docs/admin/install/admin-console.html
@@@ -1,61 -1,0 +1,61 @@@
 +<!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="admin-console" />
 +	<meta name="description" content="admin-console" />
 +	<!-- 网页标签标题 -->
 +	<title>admin-console</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 [...]
++	<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 [...]
 +<p>The current version of dubbo admin is under development, including: route rule, dynamic configuration, access control, weight adjustment, load balance, etc.</p>
 +<p>Install:</p>
- <pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/incubator-dubbo-admin.git /var/tmp/dubbo-admin
++<pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/dubbo-admin.git /var/tmp/dubbo-admin
 +<span class="hljs-built_in">cd</span> /var/tmp/dubbo-admin
 +mvn clean package
 +</code></pre>
 +<p>Configuration <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>:</p>
 +<pre><code class="language-sh">configuration file:
 +dubbo-admin-backend/src/main/resources/application.properties
 +configurations:
 +dubbo.registry.address=zookeeper://127.0.0.1:2181
 +</code></pre>
 +<p>Start:</p>
 +<pre><code class="language-sh">mvn --projects dubbo-admin-backend spring-boot:run
 +</code></pre>
 +<p>For more information, please visit:</p>
- <pre><code class="language-sh">https://github.com/apache/incubator-dubbo-admin
++<pre><code class="language-sh">https://github.com/apache/dubbo-admin
 +</code></pre>
 +<p>Visit [^2]:</p>
 +<pre><code>http://127.0.0.1:8080
 +</code></pre>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<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>
 +</li>
 +</ol>
 +</section>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/consumer-demo.html
index c36de8b,0000000..ae1494e
mode 100644,000000..100644
--- a/en-us/docs/admin/install/consumer-demo.html
+++ b/en-us/docs/admin/install/consumer-demo.html
@@@ -1,43 -1,0 +1,43 @@@
 +<!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="consumer-demo" />
 +	<meta name="description" content="consumer-demo" />
 +	<!-- 网页标签标题 -->
 +	<title>consumer-demo</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 [...]
- <p>install:</p>
- <pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/incubator-dubbo.git
- <span class="hljs-built_in">cd</span> incubator-dubbo
- Please start Provider first
- add -Djava.net.preferIPv4Stack=<span class="hljs-literal">true</span> <span class="hljs-keyword">if</span> your IDE is Intellij Idea
++	<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 [...]
++<p>Install:</p>
++<pre><code class="language-sh">$ git <span class="hljs-built_in">clone</span> https://github.com/apache/dubbo.git
++$ <span class="hljs-built_in">cd</span> dubbo
++<span class="hljs-comment"># please start Provider first</span>
++<span class="hljs-comment"># add -Djava.net.preferIPv4Stack=true if your IDE is Intellij Idea</span>
 +</code></pre>
- <p>configuration:</p>
- <pre><code class="language-sh">resource/META-INFO.spring/dubbo-demo-consumer.xml
- change dubbo:registry to the real registry center address
++<p>Configuration:</p>
++<pre><code class="language-sh"><span class="hljs-comment"># resource/META-INFO.spring/dubbo-demo-consumer.xml</span>
++<span class="hljs-comment"># change dubbo:registry to the real registry center address</span>
 +</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/introduction.html
index 120f901,0000000..c3941f1
mode 100644,000000..100644
--- a/en-us/docs/admin/install/introduction.html
+++ b/en-us/docs/admin/install/introduction.html
@@@ -1,38 -1,0 +1,38 @@@
 +<!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="introduction" />
 +	<meta name="description" content="introduction" />
 +	<!-- 网页标签标题 -->
 +	<title>introduction</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 [...]
++	<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 [...]
 +<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>
 +<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>
 +<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>
 +<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>
 +<p>Zookeeper configuration address is recommended</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/provider-demo.html
index ab90f0e,0000000..ac4d087
mode 100644,000000..100644
--- a/en-us/docs/admin/install/provider-demo.html
+++ b/en-us/docs/admin/install/provider-demo.html
@@@ -1,43 -1,0 +1,43 @@@
 +<!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="provider-demo" />
 +	<meta name="description" content="provider-demo" />
 +	<!-- 网页标签标题 -->
 +	<title>provider-demo</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 [...]
++	<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 [...]
 +<p>install:</p>
- <pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/incubator-dubbo.git
- <span class="hljs-built_in">cd</span> incubator-dubbo
- run org.apache.dubbo.demo.provider.Provider under dubbo-demo-provider module
- add -Djava.net.preferIPv4Stack=<span class="hljs-literal">true</span> <span class="hljs-keyword">if</span> your IDE is Intellij Idea
++<pre><code class="language-sh">$ git <span class="hljs-built_in">clone</span> https://github.com/apache/dubbo.git
++$ <span class="hljs-built_in">cd</span> dubbo
++<span class="hljs-comment"># run org.apache.dubbo.demo.provider.Provider under dubbo-demo-provider module</span>
++<span class="hljs-comment"># add -Djava.net.preferIPv4Stack=true if your IDE is Intellij Idea</span>
 +</code></pre>
 +<p>configuration:</p>
- <pre><code class="language-sh">resource/META-INFO.spring/dubbo-demo-provider.xml
- change dubbo:registry to a real registry server address, zookeeper is recommanded
++<pre><code class="language-sh"><span class="hljs-comment"># resource/META-INFO.spring/dubbo-demo-provider.xml</span>
++<span class="hljs-comment"># change dubbo:registry to a real registry server address, zookeeper is recommended</span>
 +</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/redis.html
index 7da3b08,0000000..f696a32
mode 100644,000000..100644
--- a/en-us/docs/admin/install/redis.html
+++ b/en-us/docs/admin/install/redis.html
@@@ -1,72 -1,0 +1,72 @@@
 +<!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="redis" />
 +	<meta name="description" content="redis" />
 +	<!-- 网页标签标题 -->
 +	<title>redis</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 [...]
++	<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 [...]
 +<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>
 +<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>
 +<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>
 +<p>Install:</p>
 +<pre><code class="language-sh">wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz
 +tar xzf redis-2.4.8.tar.gz
 +<span class="hljs-built_in">cd</span> redis-2.4.8
 +make
 +</code></pre>
 +<p>Configuration:</p>
 +<pre><code class="language-sh">vi redis.conf
 +</code></pre>
 +<p>Start:</p>
 +<pre><code class="language-sh">nohup ./src/redis-server redis.conf &amp;
 +</code></pre>
 +<p>Stop:</p>
 +<pre><code class="language-sh">killall redis-server
 +</code></pre>
 +<ul>
 +<li>Command line <sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>:</li>
 +</ul>
 +<pre><code class="language-sh">./src/redis-cli
 +hgetall /dubbo/com.foo.BarService/providers
 +</code></pre>
 +<p>Or:</p>
 +<pre><code class="language-sh">telnet 127.0.0.1 6379
 +hgetall /dubbo/com.foo.BarService/providers
 +</code></pre>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<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>
 +</li>
 +<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>
 +</li>
 +<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>
 +</li>
 +</ol>
 +</section>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/simple-monitor-center.html
index 2333b7f,0000000..341b540
mode 100644,000000..100644
--- a/en-us/docs/admin/install/simple-monitor-center.html
+++ b/en-us/docs/admin/install/simple-monitor-center.html
@@@ -1,34 -1,0 +1,34 @@@
 +<!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="simple-monitor-center" />
 +	<meta name="description" content="simple-monitor-center" />
 +	<!-- 网页标签标题 -->
 +	<title>simple-monitor-center</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 [...]
++	<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 [...]
 +<h4>The function of monitor center will be merged to dubbo admin, based on metrics, coming soon</h4>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/simple-registry-center.html
index 14eebc9,0000000..f5e6e85
mode 100644,000000..100644
--- a/en-us/docs/admin/install/simple-registry-center.html
+++ b/en-us/docs/admin/install/simple-registry-center.html
@@@ -1,33 -1,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="simple-registry-center" />
 +	<meta name="description" content="simple-registry-center" />
 +	<!-- 网页标签标题 -->
 +	<title>simple-registry-center</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 [...]
- </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 makin [...]
++	<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 [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/install/zookeeper.html
index 5a23441,0000000..e413647
mode 100644,000000..100644
--- a/en-us/docs/admin/install/zookeeper.html
+++ b/en-us/docs/admin/install/zookeeper.html
@@@ -1,101 -1,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="zookeeper" />
 +	<meta name="description" content="zookeeper" />
 +	<!-- 网页标签标题 -->
 +	<title>zookeeper</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 [...]
++	<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 [...]
 +<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>
 +<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>
 +<p>install:</p>
 +<pre><code class="language-sh">wget http://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
 +tar zxvf zookeeper-3.3.3.tar.gz
 +<span class="hljs-built_in">cd</span> zookeeper-3.3.3
 +cp conf/zoo_sample.cfg conf/zoo.cfg
 +</code></pre>
 +<p>configuration:</p>
 +<pre><code class="language-sh">vi conf/zoo.cfg
 +</code></pre>
 +<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>
 +<pre><code class="language-properties">tickTime=2000
 +initLimit=10
 +syncLimit=5
 +dataDir=/home/dubbo/zookeeper-3.3.3/data
 +clientPort=2181
 +</code></pre>
 +<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>
 +<pre><code class="language-properties">tickTime=2000
 +initLimit=10
 +syncLimit=5
 +dataDir=/home/dubbo/zookeeper-3.3.3/data
 +clientPort=2181
 +server.1=10.20.153.10:2555:3555
 +server.2=10.20.153.11:2555:3555
 +</code></pre>
 +<p>Put myid file in data directory <sup class="footnote-ref"><a href="#fn4" id="fnref4">[4]</a></sup>:</p>
 +<pre><code class="language-sh">mkdir data
 +vi myid
 +</code></pre>
 +<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>
 +<pre><code>1
 +</code></pre>
 +<p>Start:</p>
 +<pre><code class="language-sh">./bin/zkServer.sh start
 +</code></pre>
 +<p>Stop:</p>
 +<pre><code class="language-sh">./bin/zkServer.sh stop
 +</code></pre>
 +<p>Command line <sup class="footnote-ref"><a href="#fn5" id="fnref5">[5]</a></sup>:</p>
 +<pre><code class="language-sh">telnet 127.0.0.1 2181
 +dump
 +</code></pre>
 +<p>Or:</p>
 +<pre><code class="language-shell">echo dump | nc 127.0.0.1 2181
 +</code></pre>
 +<p>Usage:</p>
 +<pre><code class="language-xml">dubbo.registry.address=zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181
 +</code></pre>
 +<p>Or:</p>
 +<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>
 +</code></pre>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<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>
 +</li>
 +<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>
 +</li>
 +<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>
 +</li>
 +<li id="fn4" class="footnote-item"><p><code>dataDir</code> in <code>zoo.cfg</code> <a href="#fnref4" class="footnote-backref">↩︎</a></p>
 +</li>
 +<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>
 +</li>
 +</ol>
 +</section>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/introduction.html
index 1349e41,0000000..ebb86b2
mode 100644,000000..100644
--- a/en-us/docs/admin/introduction.html
+++ b/en-us/docs/admin/introduction.html
@@@ -1,95 -1,0 +1,95 @@@
 +<!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="introduction" />
 +	<meta name="description" content="introduction" />
 +	<!-- 网页标签标题 -->
 +	<title>introduction</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 [...]
++	<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 [...]
 +<p>Now version 0.1 has been released, frontend uses Vue and Vuetify as javascript framework and UI framework, backend uses spring framework, you can deploy the whole project with maven or deploy frontend and backend separately.</p>
 +<h3>Deploy the whole project through maven</h3>
 +<ul>
 +<li>install</li>
 +</ul>
- <pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/incubator-dubbo-admin.git
- <span class="hljs-built_in">cd</span> incubator-dubbo-admin
++<pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/dubbo-admin.git
++<span class="hljs-built_in">cd</span> dubbo-admin
 +mvn clean package
 +<span class="hljs-built_in">cd</span> dubbo-admin-distribution/target
 +java -jar dubbo-admin-0.1.jar
 +</code></pre>
 +<ul>
 +<li>visit<br>
 +<a href="http://localhost:8080">http://localhost:8080</a></li>
 +</ul>
 +<h3>Deploy frontend and backend separately</h3>
 +<ul>
 +<li>frontend deploy</li>
 +</ul>
 +<pre><code class="language-sh"><span class="hljs-built_in">cd</span> dubbo-admin-ui 
 +npm run install 
 +npm run dev 
 +</code></pre>
 +<ul>
 +<li>backend deploy</li>
 +</ul>
 +<pre><code class="language-sh"><span class="hljs-built_in">cd</span> dubbo-admin-server
 +mvn clean package 
 +<span class="hljs-built_in">cd</span> target
 +java -jar dubbo-admin-server-0.1.jar
 +</code></pre>
 +<ul>
 +<li>visit<br>
 +<a href="http://localhost:8081">http://localhost:8081</a></li>
 +<li>in this mode, any modify of frontend will be hot reloaded</li>
 +</ul>
 +<h3>configuration: <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></h3>
 +<p>configuration file location</p>
 +<pre><code class="language-sh">dubbo-admin-server/src/main/resources/application.properties
 +</code></pre>
 +<p>configuration:</p>
 +<pre><code class="language-properties">admin.config-center=zookeeper://127.0.0.1:2181
 +admin.registry.address=zookeeper://127.0.0.1:2181
 +admin.metadata-report.address=zookeeper://127.0.0.1:2181
 +</code></pre>
 +<p>the three configure item above are configuration center, registry center and metadata center respectively, you can find explanation about the three centers <a href="../user/configuration/config-center.md">here</a>
 +Same as Dubbo 2.7, you can set the addresses of metadata center and registry center on configuration center, in zookeeper, the path and content are as below:</p>
 +<pre><code class="language-properties"># /dubbo/config/dubbo/dubbo.properties
 +dubbo.registry.address=zookeeper://127.0.0.1:2181
 +dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
 +</code></pre>
 +<p>the addresses in configuration center have higher priority than those in <code>application.properties</code></p>
 +<p>visit documents on github:</p>
- <pre><code class="language-sh">https://github.com/apache/incubator-dubbo-admin
++<pre><code class="language-sh">https://github.com/apache/dubbo-admin
 +</code></pre>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<li id="fn1" class="footnote-item"><p>there's no login module in the current version. <a href="#fnref1" class="footnote-backref">↩︎</a></p>
 +</li>
 +</ol>
 +</section>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/introduction.json
index 6d97ac7,0000000..29c4dba
mode 100644,000000..100644
--- a/en-us/docs/admin/introduction.json
+++ b/en-us/docs/admin/introduction.json
@@@ -1,6 -1,0 +1,6 @@@
 +{
 +  "filename": "introduction.md",
-   "__html": "<h1>Dubbo Admin introduction</h1>\n<p>Now version 0.1 has been released, frontend uses Vue and Vuetify as javascript framework and UI framework, backend uses spring framework, you can deploy the whole project with maven or deploy frontend and backend separately.</p>\n<h3>Deploy the whole project through maven</h3>\n<ul>\n<li>install</li>\n</ul>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/incubator-dubbo-admin.gi [...]
++  "__html": "<h1>Dubbo Admin introduction</h1>\n<p>Now version 0.1 has been released, frontend uses Vue and Vuetify as javascript framework and UI framework, backend uses spring framework, you can deploy the whole project with maven or deploy frontend and backend separately.</p>\n<h3>Deploy the whole project through maven</h3>\n<ul>\n<li>install</li>\n</ul>\n<pre><code class=\"language-sh\">git <span class=\"hljs-built_in\">clone</span> https://github.com/apache/dubbo-admin.git\n<span c [...]
 +  "link": "/en-us/docs/admin/introduction.html",
 +  "meta": {}
 +}
diff --cc en-us/docs/admin/ops/dubbo-ops.html
index eef18c2,0000000..41d16bb
mode 100644,000000..100644
--- a/en-us/docs/admin/ops/dubbo-ops.html
+++ b/en-us/docs/admin/ops/dubbo-ops.html
@@@ -1,44 -1,0 +1,44 @@@
 +<!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-ops" />
 +	<meta name="description" content="dubbo-ops" />
 +	<!-- 网页标签标题 -->
 +	<title>dubbo-ops</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 [...]
++	<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 [...]
 +<h2>Page search</h2>
 +<p>If you need to manage a Dubbo service, you need to search it first and open it's management page</p>
 +<p><img src="../sources/images/dubbo-search.jpg" alt="/admin-guide/images/dubbo-search.png"></p>
 +<h2>Service provider page</h2>
 +<p><img src="../sources/images/dubbo-providers.jpg" alt="/admin-guide/images/dubbo-providers.png"></p>
 +<h2>Service consumer page</h2>
 +<p><img src="../sources/images/dubbo-consumers.jpg" alt="/admin-guide/images/dubbo-consumers.png"></p>
 +<h2>Add route rule page</h2>
 +<p><img src="../sources/images/dubbo-add-route.jpg" alt="/admin-guide/images/dubbo-add-route.png"></p>
 +<h2>Add dynamic configuration page</h2>
 +<p><img src="../sources/images/dubbo-add-config.jpg" alt="/admin-guide/images/dubbo-add-config.png"></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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/ops/introduction.html
index 475b1ff,0000000..c005a08
mode 100644,000000..100644
--- a/en-us/docs/admin/ops/introduction.html
+++ b/en-us/docs/admin/ops/introduction.html
@@@ -1,33 -1,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="introduction" />
 +	<meta name="description" content="introduction" />
 +	<!-- 网页标签标题 -->
 +	<title>introduction</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 [...]
- </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 makin [...]
++	<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 [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/ops/pinpoint.html
index 8761b8c,0000000..c570d97
mode 100644,000000..100644
--- a/en-us/docs/admin/ops/pinpoint.html
+++ b/en-us/docs/admin/ops/pinpoint.html
@@@ -1,403 -1,0 +1,403 @@@
 +<!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="pinpoint" />
 +	<meta name="description" content="pinpoint" />
 +	<!-- 网页标签标题 -->
 +	<title>pinpoint</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 [...]
++	<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 [...]
 +<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>
 +<h2>What is Pinpoint</h2>
 +<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>
 +<p>You should definitely check Pinpoint out If you want to</p>
 +<p>understand your application topology at a glance
 +monitor your application in Real-Time
 +gain code-level visibility to every transaction
 +install APM Agents without changing a single line of code
 +have minimal impact on the performance (approximately 3% increase in resource usage)</p>
 +<h3>ServerMap</h3>
 +<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>
 +<h3>Realtime Active Thread Chart</h3>
 +<p>Monitor active threads inside applications in real-time.</p>
 +<h3>Request/Response Scatter Chart</h3>
 +<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>
 +<h3>CallStack</h3>
 +<p>Gain code-level visibility to every transaction in a distributed environment, identifying bottlenecks and points of failure in a single view.</p>
 +<h3>Inspector</h3>
 +<p>View additional details on the application such as CPU usage, Memory/Garbage Collection, TPS, and JVM arguments.</p>
 +<h3>Supported Modules (last updated 2018/04/01)</h3>
 +<ul>
 +<li>JDK 6+</li>
 +<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>
 +<li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li>
 +<li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li>
 +<li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li>
 +<li>ActiveMQ, RabbitMQ</li>
 +<li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li>
 +<li>Arcus, Memcached, Redis, CASSANDRA</li>
 +<li>iBATIS, MyBatis</li>
 +<li>DBCP, DBCP2, HIKARICP</li>
 +<li>gson, Jackson, Json Lib</li>
 +<li>log4j, Logback</li>
 +</ul>
 +<h2>Pinpoint and Dubbo</h2>
 +<h3>Quickstart Pinpoint</h3>
 +<p><a href="http://naver.github.io/pinpoint/quickstart.html">Quick start</a>(No neet to start TestApp)</p>
 +<h3>Dubbo demo</h3>
 +<h4>Create API module</h4>
 +<p>pom.xml</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +         <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>
 +    <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>
 +
 +    <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>
 +    <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>
 +    <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>
 +<span class="hljs-tag">&lt;/<span class="hljs-name">project</span>&gt;</span>
 +</code></pre>
 +<p>Create API interface:</p>
 +<pre><code>package com.example.demoapi;
 +
 +public interface HelloService {
 +    String sayHello(String name);
 +}
 +</code></pre>
 +<h4>Dubbo provider</h4>
 +<p>pom.xml</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +	<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">parent</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">relativePath</span>/&gt;</span> <span class="hljs-comment">&lt;!-- lookup parent from repository --&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">parent</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">repositories</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">repository</span>&gt;</span>
 +			<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>
 +			<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>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">releases</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">releases</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">snapshots</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">snapshots</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">repository</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">repositories</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
 +		<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.springframework.boot<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>spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +		<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>com.alibaba.boot<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-spring-boot-starter<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>0.2.0<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>
 +		<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>com.example<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>demo-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>0.0.1-SNAPSHOT<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>
 +
 +		<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.springframework.boot<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>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +			<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>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
 +				<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>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
 +
 +<span class="hljs-tag">&lt;/<span class="hljs-name">project</span>&gt;</span>
 +</code></pre>
 +<ol>
 +<li><code>HelloService</code> interface:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.demoprovider.provider;
 +
 +<span class="hljs-keyword">import</span> org.apache.dubbo.config.annotation.Service;
 +<span class="hljs-keyword">import</span> com.example.demoapi.HelloService;
 +
 +<span class="hljs-meta">@Service</span>(version = <span class="hljs-string">"${demo.service.version}"</span>,
 +        application = <span class="hljs-string">"${dubbo.application.id}"</span>,
 +        protocol = <span class="hljs-string">"${dubbo.protocol.id}"</span>,
 +        registry = <span class="hljs-string">"${dubbo.registry.id}"</span>)
 +<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>{
 +    <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>;
 +    <span class="hljs-meta">@Override</span>
 +    <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>{
 +        i++;
 +        <span class="hljs-keyword">if</span> (i % <span class="hljs-number">3</span> == <span class="hljs-number">0</span>) {
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"ex"</span>);
 +        }
 +        <span class="hljs-keyword">return</span> <span class="hljs-string">"Hello "</span> + name + <span class="hljs-string">"!"</span>;
 +    }
 +}
 +</code></pre>
 +<ol start="2">
 +<li>Spring Boot bootstrap:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.demoprovider;
 +
 +<span class="hljs-keyword">import</span> org.springframework.boot.SpringApplication;
 +<span class="hljs-keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;
 +
 +<span class="hljs-meta">@SpringBootApplication</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoProviderApplication</span> </span>{
 +
 +	<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>{
 +		SpringApplication.run(DemoProviderApplication.class, args);
 +	}
 +}
 +</code></pre>
 +<ol start="3">
 +<li><code>application.properties</code>:</li>
 +</ol>
 +<pre><code class="language-properties"># Spring boot application
 +spring.application.name = dubbo-provider-demo
 +server.port = 9090
 +management.port = 9091
 +
 +# Service version
 +demo.service.version = 1.0.0
 +
 +# Base packages to scan Dubbo Components (e.g @Service , @Reference)
 +dubbo.scan.basePackages  = com.example.demoprovider
 +
 +# Dubbo Config properties
 +## ApplicationConfig Bean
 +dubbo.application.id = dubbo-provider-demo
 +dubbo.application.name = dubbo-provider-demo
 +
 +## ProtocolConfig Bean
 +dubbo.protocol.id = dubbo
 +dubbo.protocol.name = dubbo
 +dubbo.protocol.port = 12345
 +
 +## RegistryConfig Bean
 +dubbo.registry.id = my-registry
 +dubbo.registry.address = N/A
 +</code></pre>
 +<h4>Dubbo consumer</h4>
 +<p>pom.xml</p>
 +<pre><code class="language-xml"><span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?&gt;</span></span>
 +<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +	<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>
 +	<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>
 +	<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>
 +
 +	<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>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">parent</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">relativePath</span>/&gt;</span> <span class="hljs-comment">&lt;!-- lookup parent from repository --&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">parent</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
 +		<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>
 +		<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>
 +		<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>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">repositories</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">repository</span>&gt;</span>
 +			<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>
 +			<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>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">releases</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">releases</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">snapshots</span>&gt;</span>
 +				<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>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">snapshots</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">repository</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">repositories</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
 +		<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.springframework.boot<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>spring-boot-starter-web<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +		<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>com.alibaba.boot<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-spring-boot-starter<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>0.2.0<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>
 +		<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>com.example<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>demo-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>0.0.1-SNAPSHOT<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>
 +
 +		<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.springframework.boot<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>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
 +			<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>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
 +
 +	<span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
 +		<span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
 +			<span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
 +				<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>
 +				<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>
 +				<span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
 +					<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>
 +				<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
 +			<span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
 +		<span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
 +	<span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
 +
 +<span class="hljs-tag">&lt;/<span class="hljs-name">project</span>&gt;</span>
 +</code></pre>
 +<ol>
 +<li><code>@Reference</code> injection <code>HelloService</code></li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.democonsumer.controller;
 +
 +<span class="hljs-keyword">import</span> org.apache.dubbo.config.annotation.Reference;
 +<span class="hljs-keyword">import</span> com.example.demoapi.HelloService;
 +<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
 +<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestParam;
 +<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RestController;
 +
 +<span class="hljs-meta">@RestController</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerController</span> </span>{
 +    <span class="hljs-meta">@Reference</span>(version = <span class="hljs-string">"${demo.service.version}"</span>,
 +            application = <span class="hljs-string">"${dubbo.application.id}"</span>,
 +            url = <span class="hljs-string">"dubbo://&lt;Real IP Address&gt;:12345"</span>)
 +    <span class="hljs-keyword">private</span> HelloService helloService;
 +
 +    <span class="hljs-meta">@RequestMapping</span>(<span class="hljs-string">"/sayHello"</span>)
 +    <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>{
 +        <span class="hljs-keyword">return</span> helloService.sayHello(name);
 +    }
 +}
 +</code></pre>
 +<ol start="2">
 +<li>Spring Boot bootstrap:</li>
 +</ol>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.example.democonsumer;
 +
 +<span class="hljs-keyword">import</span> org.springframework.boot.SpringApplication;
 +<span class="hljs-keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;
 +
 +<span class="hljs-meta">@SpringBootApplication</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerApplication</span> </span>{
 +
 +	<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>{
 +		SpringApplication.run(DemoConsumerApplication.class, args);
 +	}
 +}
 +</code></pre>
 +<ol start="3">
 +<li><code>application.properties</code>:</li>
 +</ol>
 +<pre><code class="language-properties"># Spring boot application
 +spring.application.name=dubbo-consumer-demo
 +server.port=8080
 +management.port=8081
 +
 +# Service Version
 +demo.service.version=1.0.0
 +
 +# Dubbo Config properties
 +## ApplicationConfig Bean
 +dubbo.application.id=dubbo-consumer-demo
 +dubbo.application.name=dubbo-consumer-demo
 +
 +## ProtocolConfig Bean
 +dubbo.protocol.id=dubbo
 +dubbo.protocol.name=dubbo
 +dubbo.protocol.port=12345
 +</code></pre>
 +<h3>Using Pinpoint-agent to start <code>Dubbo provider</code> and <code>Dubbo consumer</code></h3>
 +<ol>
 +<li>Maven clean package</li>
 +</ol>
 +<pre><code>mvn clean package
 +</code></pre>
 +<ol start="2">
 +<li>Start provider</li>
 +</ol>
 +<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
 +</code></pre>
 +<ol start="3">
 +<li>Start consumer</li>
 +</ol>
 +<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
 +</code></pre>
 +<ol start="4">
 +<li>Access the consumer address to simulate user requests</li>
 +</ol>
 +<p><code>http://localhost:8080/sayHello?name=ABC</code></p>
 +<h2>Using Pinpoint locate problems</h2>
 +<h3>Homepage</h3>
 +<p><img src="../sources/images/pinpoint-home.png" alt="/admin-guide/images/pinpoint-home.png"></p>
 +<blockquote>
 +<p>The user request here is double the number of requests for DubboProvider, because the favicon.ico icon request is recorded.</p>
 +</blockquote>
 +<h3>Call tree</h3>
 +<p><img src="../sources/images/pinpoint-calltree.png" alt="/admin-guide/images/pinpoint-calltree.png"></p>
 +<h3>Mixed view</h3>
 +<p><img src="../sources/images/pinpoint-mixedview.png" alt="/admin-guide/images/pinpoint-mixedview.png"></p>
 +<h3>Other</h3>
 +<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>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/ops/skywalking.html
index b52b61d,0000000..4860504
mode 100644,000000..100644
--- a/en-us/docs/admin/ops/skywalking.html
+++ b/en-us/docs/admin/ops/skywalking.html
@@@ -1,131 -1,0 +1,131 @@@
 +<!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="skywalking" />
 +	<meta name="description" content="skywalking" />
 +	<!-- 网页标签标题 -->
 +	<title>skywalking</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 [...]
++	<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 [...]
 +<h2>Introduction to Apache Skywalking(Incubator)</h2>
- <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 l [...]
++<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  supports multiple languages age [...]
 +<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 sing [...]
 +<h2>Dubbo and Apache Skywalking(Incubator)</h2>
 +<h3>Build the Dubbo demo  project</h3>
 +<p>The Dubbo demo has been uploaded to the <a href="https://github.com/SkywalkingTest/dubbo-trace-example">GitHub repository</a>.</p>
 +<h4>API project</h4>
 +<p>Service interface definition:
 +package org.apache.skywalking.demo.interfaces;</p>
 +<p>public interface HelloService {
 +String sayHello(String name);
 +}</p>
 +<h4>Service provider project</h4>
 +<p>package org.apache.skywalking.demo.provider;</p>
 +<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 [...]
 +	application = &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 mathr [...]
 +protocol = &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">& [...]
 +	registry = &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"> [...]
 +public class HelloServiceImpl implements HelloService {</p>
 +<pre><code>public String sayHello(String name) {
 +	LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
 +	return &quot;Hello, &quot; + name;
 +}
 +</code></pre>
 +<p>}</p>
 +<h4>Service consumer project</h4>
 +<p>package org.apache.skywalking.demo.consumer;</p>
 +<p>@RestController
 +public class ConsumerController {</p>
 +<pre><code>private static int COUNT = 0;
 +
 +@Reference(version = &quot;${demo.service.version}&quot;,
 +	application = &quot;${dubbo.application.id}&quot;,
 +	url = &quot;dubbo://localhost:20880&quot;, timeout = 60000)
 +private HelloService helloService;
 +
 +@GetMapping(&quot;/sayHello/{name}&quot;)
 +public String sayHello(@PathVariable(name = &quot;name&quot;) String name) {
 +	if ((COUNT++) % 3 == 0){
 +		throw new RuntimeException();
 +	}
 +	LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
 +	return helloService.sayHello(name);
 +}
 +</code></pre>
 +<p>}</p>
 +<h3>Deploy Apache Skywalking(incubator)</h3>
 +<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>
 +<h4>Third-party components</h4>
 +<ol>
 +<li>JDK 8+</li>
 +<li>Elasticsearch 5.x</li>
 +</ol>
 +<h4>Deployment step</h4>
 +<ol>
 +<li>Download <a href="http://skywalking.apache.org/downloads/">Apache Skywalking Collector</a></li>
 +<li>Deploy Elasticsearch service
 +<ul>
 +<li>Set <code>cluster.name</code> to <code>CollectorDBCluster</code></li>
 +<li>Set <code>network.host</code> to <code>0.0.0.0</code></li>
 +<li>Start elasticsearch service</li>
 +</ul>
 +</li>
 +<li>Unzip and start the Skywalking Collector. Run the ' bin/startup.sh ' command to start skywalking Collector</li>
 +</ol>
 +<h4>Deploy the demo</h4>
 +<p>Before you deploy the demo service, please run the following command:</p>
 +<pre><code>./mvnw clean package
 +</code></pre>
 +<h4>Deploy the provider service</h4>
 +<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
 +</code></pre>
 +<h4>Deploy the consumer service</h4>
 +<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 
 +</code></pre>
 +<h4>visit demo service</h4>
 +<pre><code>curl http://localhost:8080/sayHello/test
 +</code></pre>
 +<h2>Skywalking scren snapshot</h2>
 +<h3>Dashboard</h3>
 +<p><img src="../sources/images/skywalking-dashboard.png" alt="/admin-guide/images/skywalking-dashboard.png"></p>
 +<h3>Topology</h3>
 +<p><img src="../sources/images/skywalking-topology.png" alt="/admin-guide/images/skywalking-topology.png"></p>
 +<h3>Application view</h3>
 +<p><img src="../sources/images/skywalking-application.png" alt="/admin-guide/images/skywalking-application.png"></p>
 +<p>JVM Information
 +<img src="../sources/images/skywalking-application_instance.png" alt="/admin-guide/images/skywalking-application_instance.png"></p>
 +<h3>Service view</h3>
 +<p>Consumer side
 +<img src="../sources/images/skywalking-service-consumer.png" alt="/admin-guide/images/skywalking-service-consumer.png"></p>
 +<p>provider side
 +<img src="../sources/images/skywalking-service-provider.png" alt="/admin-guide/images/skywalking-service-provider.png"></p>
 +<h3>Trace</h3>
 +<p><img src="../sources/images/skywalking-trace.png" alt="/admin-guide/images/skywalking-trace.png"></p>
 +<p>Span info
 +<img src="../sources/images/skywalking-span-Info.png" alt="/admin-guide/images/skywalking-span-Info.png"></p>
 +<h3>Alarm view</h3>
 +<p><img src="../sources/images/skywalking-alarm.png" alt="/admin-guide/images/skywalking-alarm.png"></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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/serviceGovernance.html
index fb0a8d8,0000000..b41f98c
mode 100644,000000..100644
--- a/en-us/docs/admin/serviceGovernance.html
+++ b/en-us/docs/admin/serviceGovernance.html
@@@ -1,72 -1,0 +1,72 @@@
 +<!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="serviceGovernance" />
 +	<meta name="description" content="serviceGovernance" />
 +	<!-- 网页标签标题 -->
 +	<title>serviceGovernance</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 [...]
++	<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 [...]
 +<h2>Service governance</h2>
 +<p>服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的,主要有以下几个功能:<br>
 +the basic function of service governance is changing the runtime behaviour and routing logic, to do weight configuration and current limiting:</p>
 +<h3>应用级别的服务治理</h3>
 +<h3>application level service governance</h3>
 +<p>在Dubbo2.6及更早版本中,所有的服务治理规则都只针对服务粒度,如果要把某条规则作用到应用粒度上,需要为应用下的所有服务配合相同的规则,变更,删除的时候也需要对应的操作,这样的操作很不友好,因此Dubbo2.7版本中增加了应用粒度的服务治理操作,对于条件路由(包括黑白名单),动态配置(包括权重,负载均衡)都可以做应用级别的配置:<br>
 +In Dubbo 2.6 or earlier version, all service governance rule are in service scope, if you need to make application scope rule, you need to set the same rule for all services under an application, modify and delete need the same operation, this is very unfriendly. In Dubbo 2.7, application scope service governance is supported, condition route(including black white list) and dynamic configuration(including weight, load balance) all support application scope config.
 +<img src="../../../img/blog/admin/conditionRoute.jpg" alt="condition"><br>
 +picture above is condition route configuration, can create and search by both application name and service name.</p>
 +<h3>tag route</h3>
 +<p>标签路由是Dubbo2.7引入的新功能,配置以应用作为维度,给不同的服务器打上不同名字的标签,配置如下图所示:
 +tag route is a new feature in Dubbo2.7, in application scope, to set different tag on different server, the screenshot is shown as below:
 +<img src="../../../img/blog/admin/route.jpg" alt="tag">
 +the client can use <code>setAttachment</code> to specify different tag, is the above case, <code>setAttachment(tag1)</code>, the client will choose from the three servers in the picture above. In this way, you can implement features such as traffic isolation and gray release.</p>
 +<h3>condition route</h3>
 +<p>condition route is a traditional function in Dubbo, now you can create it in either service scope or application scope. Condition route is in <code>yaml</code> format, you can read <a href="../user/demo/routing-rule.md">here</a> to find more.</p>
 +<h3>black white list</h3>
 +<p>black white list is a part of condition route and store with condition route together, you can set black list or white list, in either service scope or application scope:
 +<img src="sources/images/blackList.jpg" alt="blackList"></p>
 +<h3>dynamic configuration</h3>
 +<p>dynamic configuration has the same level with routing rule, it can change the RPC behaviour dynamically without restart service. It supports application scope since Dubbo 2,7, in Dubbo format, the screen shot shows in below:
 +<img src="sources/images/config.jpg" alt="config">
 +to read more, please refer <a href="../user/demos/config-rule.md">here</a></p>
 +<h3>weight adjust</h3>
 +<p>weigth adjuest is part of dynamic configuration, change the weight of server side to do traffic control dynamically:
 +<img src="sources/images/weight.jpg" alt="weight"></p>
 +<h3>load balancing</h3>
 +<p>load balancing is also poart of dynamic configuration, to specify the route strategy in client side. now we have three strategies: random, least active and round robin, to read more, please refer <a href="../user/demos/loadbalance.md">here</a></p>
 +<h2>configuration management</h2>
 +<p>configuration management is also a new feaature for Dubbo 2.7. In Dubbo 2.7, we can specify configurations in global scope and application scope(including services in application), you can view, modify and create new configurations in Dubbo Admin.</p>
 +<ul>
 +<li>global configuration:
 +<img src="../../../img/blog/admin/config.jpg" alt="config"><br>
 +you can set registry center, metadata center, timeout for provider and consumer in global configurations. If the implementation of registry center and metadata center is zookeeper, you can also check the location of configuration file.</li>
 +<li>application and service scope configuration:
 +<img src="../../../img/blog/admin/appConfig.jpg" alt="appConfig"><br>
 +application configuration can also set service configuration in this application. you need to specify consumer and provider in service scope: <code>dubbo.reference.{serviceName}</code>stands for configuration as consumer side,<code>dubbo.provider.{servcieName}</code>stands for configuration as provider side. the address of registry address and metadata center address can only be configured in global configuration, which is also the recommendation way in Dubbo 2.7</li>
 +<li>priority service configuration &gt; application configuration &gt; global configuration</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/serviceSearch.html
index 9b0ccbd,0000000..3cc992f
mode 100644,000000..100644
--- a/en-us/docs/admin/serviceSearch.html
+++ b/en-us/docs/admin/serviceSearch.html
@@@ -1,37 -1,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="serviceSearch" />
 +	<meta name="description" content="serviceSearch" />
 +	<!-- 网页标签标题 -->
 +	<title>serviceSearch</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 [...]
++	<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 [...]
 +<p>Service search is the basic function of Dubbo OPS, you can search by service name, application name and IP address, the service name and application name support wildcard and autocomplete:
 +<img src="sources/images/searchResult.png" alt="searchResult">
 +the service detail page display providers, consumers, medata information is supported in Dubbo 2.7 or higher version:
 +<img src="sources/images/detail.jpg" alt="detail"></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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/admin/serviceTest.html
index 6ffc5c2,0000000..d2aba06
mode 100644,000000..100644
--- a/en-us/docs/admin/serviceTest.html
+++ b/en-us/docs/admin/serviceTest.html
@@@ -1,33 -1,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="serviceTest" />
 +	<meta name="description" content="serviceTest" />
 +	<!-- 网页标签标题 -->
 +	<title>serviceTest</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 [...]
- </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 makin [...]
++	<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 [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/README.html
index 9520aae,0000000..0bce7dd
mode 100644,000000..100644
--- a/en-us/docs/dev/README.html
+++ b/en-us/docs/dev/README.html
@@@ -1,34 -1,0 +1,34 @@@
 +<!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="README" />
 +	<meta name="description" content="README" />
 +	<!-- 网页标签标题 -->
 +	<title>README</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 [...]
++	<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 [...]
 +<p>This book dives into the design principles of dubbo, mainly covers the following topics: extension, coding styles, versio, build, etc.</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/SPI.html
index afc1830,0000000..87bb3bf
mode 100644,000000..100644
--- a/en-us/docs/dev/SPI.html
+++ b/en-us/docs/dev/SPI.html
@@@ -1,203 -1,0 +1,203 @@@
 +<!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="SPI" />
 +	<meta name="description" content="SPI" />
 +	<!-- 网页标签标题 -->
 +	<title>SPI</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 [...]
++	<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 [...]
 +<h2>SPI Config</h2>
 +<h3>Source:</h3>
 +<p>Dubbo SPI is inherited from standard JDK SPI(Service Provider Interface) and makes it more powerful.</p>
 +<p>Dubbo fixed below issues of the standard JDK SPI:</p>
 +<ul>
 +<li>The standard JDK SPI will load and instantize all the implementations at once. It will be a waste of resources if one implementation is timecosted, but never be used.</li>
 +<li>We can'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, the program throws exception that doesn't support ruby, but it is not the real cause.</li>
 +<li>Enhance the SPI functionality by supporting IoC and AOP, one SPI can be easily injected by another SPI simply using setter.</li>
 +</ul>
 +<h3>Appointment:</h3>
 +<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>
 +<h3>Example:</h3>
 +<p>To extend Dubbo Protocol, placee a text file in the extension jar file: <code>META-INF/dubbo/org.apache.dubbo.rpc.Protocol</code>, content:</p>
 +<pre><code class="language-properties">xxx=com.alibaba.xxx.XxxProtocol
 +</code></pre>
 +<p>content of the implementation <sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.alibaba.xxx;
 + 
 +<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.Protocol;
 + 
 +<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>{ 
 +    <span class="hljs-comment">// ...</span>
 +}
 +</code></pre>
 +<h3>Configuration in config module</h3>
 +<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>
 +<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>
 +</code></pre>
 +<h2>SPI Features</h2>
 +<h3>SPI Auto Wrap</h3>
 +<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>
 +<p>Wrapper class content:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">package</span> com.alibaba.xxx;
 + 
 +<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.Protocol;
 + 
 +<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>{
 +    Protocol impl;
 + 
 +    <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; }
 + 
 +    <span class="hljs-comment">//after interface method is executed, the method in extension will be executed</span>
 +    <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>{
 +        <span class="hljs-comment">//... some operation</span>
 +        impl.refer();
 +        <span class="hljs-comment">// ... some operation</span>
 +    }
 + 
 +    <span class="hljs-comment">// ...</span>
 +}
 +</code></pre>
 +<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>
 +<p>There can be many Wrapper for one spi, simply add one if you need.</p>
 +<p>With Wrapper class, you will be able to 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>
 +<h3>SPI Auto Load</h3>
 +<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>
 +<p>Demo: two SPI <code>CarMaker</code>(car maker)、<code>WheelMaker</code> (wheel maker)</p>
 +<p>Intefaces look like:</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">CarMaker</span> </span>{
 +    <span class="hljs-function">Car <span class="hljs-title">makeCar</span><span class="hljs-params">()</span></span>;
 +}
 + 
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">WheelMaker</span> </span>{
 +    <span class="hljs-function">Wheel <span class="hljs-title">makeWheel</span><span class="hljs-params">()</span></span>;
 +}
 +</code></pre>
 +<p><code>CarMaker</code>'s implementation:</p>
 +<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>{
 +    WheelMaker wheelMaker;
 + 
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">setWheelMaker</span><span class="hljs-params">(WheelMaker wheelMaker)</span> </span>{
 +        <span class="hljs-keyword">this</span>.wheelMaker = wheelMaker;
 +    }
 + 
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> Car <span class="hljs-title">makeCar</span><span class="hljs-params">()</span> </span>{
 +        <span class="hljs-comment">// ...</span>
 +        Wheel wheel = wheelMaker.makeWheel();
 +        <span class="hljs-comment">// ...</span>
 +        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> RaceCar(wheel, ...);
 +    }
 +}
 +</code></pre>
 +<p>when <code>ExtensionLoader</code> loads <code>CarMaker</code>'s implementation <code>RaceCarMaker</code>, the method <code>setWheelMaker</code> needs paramType <code>WheelMaker</code> which is also a SPI, It will be automatically loaded.</p>
 +<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>
 +<p>Good question, we will explain it in the following chapter: SPI Auto Adaptive.</p>
 +<h3>SPI Auto Adaptive</h3>
 +<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 executed.</p>
 +<p>Dubbo use URL (containing Key-Value) to pass the configuration.</p>
 +<p>The SPI method invocation has the URL parameter(Or Entity that has URL attribute)</p>
 +<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 acts as a bus when passing the config information.</p>
 +<p>Demo: two SPI <code>CarMaker</code>、<code>WheelMaker</code></p>
 +<p>interface looks like:</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">CarMaker</span> </span>{
 +    <span class="hljs-function">Car <span class="hljs-title">makeCar</span><span class="hljs-params">(URL url)</span></span>;
 +}
 + 
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">WheelMaker</span> </span>{
 +    <span class="hljs-function">Wheel <span class="hljs-title">makeWheel</span><span class="hljs-params">(URL url)</span></span>;
 +}
 +</code></pre>
 +<p><code>CarMaker</code>'s implementation:</p>
 +<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>{
 +    WheelMaker wheelMaker;
 + 
 +    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">setWheelMaker</span><span class="hljs-params">(WheelMaker wheelMaker)</span> </span>{
 +        <span class="hljs-keyword">this</span>.wheelMaker = wheelMaker;
 +    }
 + 
 +    <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>{
 +        <span class="hljs-comment">// ...</span>
 +        Wheel wheel = wheelMaker.makeWheel(url);
 +        <span class="hljs-comment">// ...</span>
 +        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> RaceCar(wheel, ...);
 +    }
 +}
 +</code></pre>
 +<p>when execute the code above</p>
 +<pre><code class="language-java"><span class="hljs-comment">// ...</span>
 +Wheel wheel = wheelMaker.makeWheel(url);
 +<span class="hljs-comment">// ...</span>
 +</code></pre>
 +<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>
 +<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>
 +<p>Below is Dubbo Transporter SPI codes:</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">Transporter</span> </span>{
 +    <span class="hljs-meta">@Adaptive</span>({<span class="hljs-string">"server"</span>, <span class="hljs-string">"transport"</span>})
 +    <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>;
 + 
 +    <span class="hljs-meta">@Adaptive</span>({<span class="hljs-string">"client"</span>, <span class="hljs-string">"transport"</span>})
 +    <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>;
 +}
 +</code></pre>
 +<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>
 +<h3>SPI Auto Activation</h3>
 +<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>
 +<pre><code class="language-java"><span class="hljs-keyword">import</span> org.apache.dubbo.common.extension.Activate;
 +<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.Filter;
 + 
 +<span class="hljs-meta">@Activate</span> <span class="hljs-comment">// Active for any condition</span>
 +<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>{
 +    <span class="hljs-comment">// ...</span>
 +}
 +</code></pre>
 +<p>Or:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">import</span> org.apache.dubbo.common.extension.Activate;
 +<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.Filter;
 + 
 +<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>
 +<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>{
 +    <span class="hljs-comment">// ...</span>
 +}
 +</code></pre>
 +<p>Or:</p>
 +<pre><code class="language-java"><span class="hljs-keyword">import</span> org.apache.dubbo.common.extension.Activate;
 +<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.Filter;
 + 
 +<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>
 +<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>{
 +    <span class="hljs-comment">// ...</span>
 +}
 +</code></pre>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<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 with the same filename in classpath and then merge them together <a href="#fnref1" class="footnote-backref">↩︎</a></p>
 +</li>
 +<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>
 +</li>
 +</ol>
 +</section>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/SUMMARY.html
index 8c317f0,0000000..a02b119
mode 100644,000000..100644
--- a/en-us/docs/dev/SUMMARY.html
+++ b/en-us/docs/dev/SUMMARY.html
@@@ -1,76 -1,0 +1,76 @@@
 +<!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="SUMMARY" />
 +	<meta name="description" content="SUMMARY" />
 +	<!-- 网页标签标题 -->
 +	<title>SUMMARY</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 [...]
++	<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 [...]
 +<ul>
 +<li><a href="./build.md">1 How To Build</a></li>
 +<li><a href="./design.md">2 Architecture</a></li>
 +<li><a href="./SPI.md">3 How SPI Works</a></li>
 +<li><a href="./implementation.md">4 Init, Process, Protocols</a></li>
 +<li><a href="./impls/introduction.md">5 SPI Extensions</a>
 +<ul>
 +<li><a href="./impls/protocol.md">5.1 Protocol</a></li>
 +<li><a href="./impls/filter.md">5.2 Filter</a></li>
 +<li><a href="./impls/invoker-listener.md">5.3 InvokerListener</a></li>
 +<li><a href="./impls/exporter-listener.md">5.4 ExporterListener</a></li>
 +<li><a href="./impls/cluster.md">5.5 Cluster</a></li>
 +<li><a href="./impls/router.md">5.6 Router</a></li>
 +<li><a href="./impls/load-balance.md">5.7 LoadBalance</a></li>
 +<li><a href="./impls/merger.md">5.8 Merger</a></li>
 +<li><a href="./impls/registry.md">5.9 Registry</a></li>
 +<li><a href="./impls/monitor.md">5.10 Monitor</a></li>
 +<li><a href="./impls/extension-factory.md">5.11 ExtensionFactory</a></li>
 +<li><a href="./impls/proxy-factory.md">5.12 ProxyFactory</a></li>
 +<li><a href="./impls/compiler.md">5.13 Compiler</a></li>
 +<li><a href="./impls/dispatcher.md">5.14 Dispatcher</a></li>
 +<li><a href="./impls/threadpool.md">5.15 Threadpool</a></li>
 +<li><a href="./impls/serialize.md">5.16 Serialization</a></li>
 +<li><a href="./impls/remoting.md">5.17 Remoting</a></li>
 +<li><a href="./impls/exchanger.md">5.18 Exchanger</a></li>
 +<li><a href="./impls/networker.md">5.19 Networker</a></li>
 +<li><a href="./impls/telnet-handler.md">5.20 TelnetHandler</a></li>
 +<li><a href="./impls/status-checker.md">5.21 StatusChecker</a></li>
 +<li><a href="./impls/container.md">5.22 Container</a></li>
 +<li><a href="./impls/page.md">5.23 PageHandler</a></li>
 +<li><a href="./impls/cache.md">5.24 Cache</a></li>
 +<li><a href="./impls/validation.md">5.25 Validation</a></li>
 +<li><a href="./impls/logger-adapter.md">5.26 LoggerAdapter</a></li>
 +</ul>
 +</li>
 +<li><a href="./contract.md">6 Contract</a></li>
 +<li><a href="./coding.md">7 Code Style</a></li>
 +<li><a href="./release.md">9 Versions</a></li>
 +<li><a href="./contribution.md">10 Contribution</a></li>
 +<li><a href="./checklist.md">11 Checklist</a></li>
 +<li><a href="./code-smell.md">12 Code Smell</a></li>
 +<li><a href="./TCK.md">13 TCK</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/TCK.html
index 71b5282,0000000..dafb943
mode 100644,000000..100644
--- a/en-us/docs/dev/TCK.html
+++ b/en-us/docs/dev/TCK.html
@@@ -1,46 -1,0 +1,46 @@@
 +<!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="TCK" />
 +	<meta name="description" content="TCK" />
 +	<!-- 网页标签标题 -->
 +	<title>TCK</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 [...]
++	<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 [...]
 +<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>
 +<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>
 +<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>
 +<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>
 +<p>Anyone interested  is welcomed to work on this together.</p>
 +<h4>Protocol TCK</h4>
 +<blockquote>
 +<p>TODO</p>
 +</blockquote>
 +<h4>Registry TCK</h4>
 +<blockquote>
 +<p>TODO</p>
 +</blockquote>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/build.html
index 9d2c28a,0000000..9777f8e
mode 100644,000000..100644
--- a/en-us/docs/dev/build.html
+++ b/en-us/docs/dev/build.html
@@@ -1,74 -1,0 +1,74 @@@
 +<!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="build" />
 +	<meta name="description" content="build" />
 +	<!-- 网页标签标题 -->
 +	<title>build</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 [...]
++	<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 [...]
 +<h2>Checkout</h2>
 +<p>checkout the lastest project source code with commands blow:</p>
- <pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/incubator-dubbo.git dubbo
++<pre><code class="language-sh">git <span class="hljs-built_in">clone</span> https://github.com/apache/dubbo.git dubbo
 +</code></pre>
 +<h2>Branches</h2>
- <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>
++<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/dubbo/tags">https://github.com/apache/dubbo/tags</a>.</p>
 +<h2>Building</h2>
 +<p>Dubbo relies on <a href="http://maven.apache.org">maven</a> as the building tool.</p>
 +<p>Requirements:</p>
 +<ul>
 +<li>Java above 1.5 version</li>
 +<li>Maven version 2.2.1 or above</li>
 +</ul>
 +<p>The following <code>MAVEN_OPTS</code>should be configured before building:</p>
 +<pre><code class="language-sh"><span class="hljs-built_in">export</span> MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=512m
 +</code></pre>
 +<p>build with below command:</p>
 +<pre><code class="language-sh">mvn clean install
 +</code></pre>
 +<p>skip testing using below building command:</p>
 +<pre><code class="language-sh">mvn install -Dmaven.test.skip
 +</code></pre>
 +<h2>Building jar package of source code</h2>
 +<p>build Dubbo source code jar package with below command, which can debug Dubbo source code.</p>
 +<pre><code class="language-sh">mvn clean <span class="hljs-built_in">source</span>:jar install -Dmaven.test.skip
 +</code></pre>
 +<h2>IDE support</h2>
 +<p>use below command to generate IDE.</p>
 +<h3>Intellij Idea</h3>
 +<pre><code class="language-sh">mvn idea:idea
 +</code></pre>
 +<h3>Eclipse</h3>
 +<pre><code class="language-sh">mvn eclipse:eclipse
 +</code></pre>
 +<p>Importing into eclipse</p>
 +<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>
 +<p>Use the following maven command as well:</p>
 +<pre><code class="language-sh">mvn eclipse:configure-workspace -Declipse.workspace=/path/to/the/workspace/
 +</code></pre>
- <p>1: view the source code through <a href="https://github.com/apache/incubator-dubbo">https://github.com/apache/incubator-dubbo</a>
++<p>1: view the source code through <a href="https://github.com/apache/dubbo">https://github.com/apache/dubbo</a>
 +2: path under UNIX is ${HOME}/.m2/repository, path under Windows is C:\Documents and Settings&lt;user&gt;.m2\repository</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/checklist.html
index 15f7630,0000000..342cce4
mode 100644,000000..100644
--- a/en-us/docs/dev/checklist.html
+++ b/en-us/docs/dev/checklist.html
@@@ -1,51 -1,0 +1,51 @@@
 +<!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="checklist" />
 +	<meta name="description" content="checklist" />
 +	<!-- 网页标签标题 -->
 +	<title>checklist</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 [...]
++	<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 [...]
 +<h2>Checklist before release</h2>
 +<ul>
 +<li>github milestones</li>
 +<li>github change lists</li>
 +<li>Travis CI</li>
 +<li>test code</li>
 +<li>find bugs</li>
 +</ul>
 +<h2>Checklist for bigfix versions</h2>
 +<ul>
 +<li>Create a <em>github issue</em> before coding</li>
 +<li>Create <em>unit test</em> before bugfix</li>
 +<li>Review</li>
 +<li>Test your code (Normal process / Abnormal process)</li>
 +<li>Record your design on <em>github issue</em></li>
 +<li>Complete javadoc and comment in code</li>
 +<li>Manager for every version, responsible for scope and check</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/code-smell.html
index 2519b39,0000000..8453797
mode 100644,000000..100644
--- a/en-us/docs/dev/code-smell.html
+++ b/en-us/docs/dev/code-smell.html
@@@ -1,160 -1,0 +1,160 @@@
 +<!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="code-smell" />
 +	<meta name="description" content="code-smell" />
 +	<!-- 网页标签标题 -->
 +	<title>code-smell</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 [...]
++	<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 [...]
 +<p>Ugly Dubbo design or implementation will be record here.</p>
 +<h2>URL Convertion</h2>
 +<h3>1. Point to Point Service export and refer</h3>
 +<p>service directly export:</p>
 +<pre><code>EXPORT(dubbo://provider-address/com.xxx.XxxService?version=1.0.0&quot;)
 +</code></pre>
 +<p>service directly refer:</p>
 +<pre><code>REFER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)
 +</code></pre>
 +<h3>2. Export servie by registry</h3>
 +<p>export service to registry:</p>
 +<pre><code>EXPORT(registry://registry-address/org.apache.dubbo.registry.RegistrySerevice?registry=dubbo&amp;export=ENCODE(dubbo://provider-address/com.xxx.XxxService?version=1.0.0))
 +</code></pre>
 +<p>accquire registry:</p>
 +<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))
 +GETREGISTRY(dubbo://registry-address/org.apache.dubbo.registry.RegistrySerevice)
 +</code></pre>
 +<p>registry service address:</p>
 +<pre><code>url.getParameterAndDecoded(&quot;export&quot;))
 +REGISTER(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)
 +</code></pre>
 +<h3>3. Refer service from registry</h3>
 +<p>refer service from registry:</p>
 +<pre><code>REFER(registry://registry-address/org.apache.dubbo.registry.RegistrySerevice?registry=dubbo&amp;refer=ENCODE(version=1.0.0))
 +</code></pre>
 +<p>accquire registry:</p>
 +<pre><code>url.setProtocol(url.getParameter(&quot;registry&quot;, &quot;dubbo&quot;))
 +GETREGISTRY(dubbo://registry-address/org.apache.dubbo.registry.RegistrySerevice)
 +</code></pre>
 +<p>subscribe service address:</p>
 +<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))
 +SUBSCRIBE(dubbo://registry-address/com.xxx.XxxService?version=1.0.0)
 +</code></pre>
 +<p>notify service address:</p>
 +<pre><code>url.addParameters(url.getParameterAndDecoded(&quot;refer&quot;))
 +NOTIFY(dubbo://provider-address/com.xxx.XxxService?version=1.0.0)
 +</code></pre>
 +<h3>4. Registry push route rule</h3>
 +<p>registry push route rule:</p>
 +<pre><code>NOTIFY(route://registry-address/com.xxx.XxxService?router=script&amp;type=js&amp;rule=ENCODE(function{...}))
 +</code></pre>
 +<p>accquire routers:</p>
 +<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;))
 +GETROUTE(script://registry-address/com.xxx.XxxService?type=js&amp;rule=ENCODE(function{...}))
 +</code></pre>
 +<h3>5. Load route rule from file</h3>
 +<p>load route rule from file:</p>
 +<pre><code>GETROUTE(file://path/file.js?router=script)
 +</code></pre>
 +<p>accquire routers:</p>
 +<pre><code>url.setProtocol(url.getParameter(&quot;router&quot;, &quot;script&quot;)).addParameter(&quot;type&quot;, SUFFIX(file)).addParameter(&quot;rule&quot;, READ(file))
 +GETROUTE(script://path/file.js?type=js&amp;rule=ENCODE(function{...}))
 +</code></pre>
 +<h2>Invoke parameters</h2>
 +<ul>
 +<li>path      service path</li>
 +<li>group    service group</li>
 +<li>version  service version</li>
 +<li>dubbo   current dubbo release version</li>
 +<li>token    verify token</li>
 +<li>timeout   invocation timeout</li>
 +</ul>
 +<h2>SPI Loading</h2>
 +<h3>1. SPI Auto Adaptive</h3>
 +<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>
 +<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>
 +<pre><code class="language-java"><span class="hljs-meta">@Extension</span>
 +<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Car</span> </span>{
 +    <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>})
 +    <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>;
 +}
 +</code></pre>
 +<p>For the rules above,ExtensionLoader  will create a adaptive instance for each SPI injected.</p>
 +<p>ExtensionLoader generated adaptive classes  look like :</p>
 +<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>;
 + 
 +<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>{
 +    <span class="hljs-keyword">public</span> &lt;contains <span class="hljs-meta">@Adaptive</span> annotation method&gt;(&lt;parameters&gt;) {
 +        <span class="hljs-keyword">if</span>(parameters containing URL Type?) <span class="hljs-function">using URL parameter
 +        <span class="hljs-keyword">else</span> <span class="hljs-title">if</span><span class="hljs-params">(method returns URL)</span> using the return URL
 +        # &lt;<span class="hljs-keyword">else</span> throw exception,inject SPI fail!&gt;
 +         
 +        <span class="hljs-title">if</span><span class="hljs-params">(URL accquired == <span class="hljs-keyword">null</span>)</span> </span>{
 +            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"url == null"</span>);
 +        }
 + 
 +        According to the Key order from <span class="hljs-meta">@Adaptive</span> annotation,get the Value from the URL as the real SPI name
 +        <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>);
 + 
 +        Invoke the method using the spi and <span class="hljs-keyword">return</span> the result.
 +    }
 + 
 +    <span class="hljs-keyword">public</span> &lt;method having annotation <span class="hljs-meta">@Adaptive</span>&gt;(&lt;parameters&gt;) {
 +        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnsupportedOperationException(<span class="hljs-string">"is not adaptive method!"</span>);
 +    }
 +}
 +</code></pre>
 +<p><code>@Adaptive</code>  annotation usage:</p>
 +<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 interf [...]
 +<h2>Callback Function</h2>
 +<h3>1. Parameter Callback</h3>
 +<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>
 +<p>Implement details:</p>
 +<ul>
 +<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>
 +<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>
 +</ul>
 +<h3>2. Event Notification</h3>
 +<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>
 +<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>
 +<h2>Lazy Connection</h2>
 +<p>DubboProtocol  specific features, default disabled</p>
 +<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>
 +<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>
 +<h2>Share Connection</h2>
 +<p>DubboProtocol specific features, default enabled。</p>
 +<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>
 +<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 whe [...]
 +<h2>sticky policy</h2>
 +<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>
 +<h2>provider selecting logic</h2>
 +<ol start="0">
 +<li>existing multi providers,firstly select by Loadbalance 。If the selected  provider is available ,then just doing the invocation</li>
 +<li>If the selected provider is not available in stage 1, then choose from the remaining ,if available then doing the inovation</li>
 +<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>
 +<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>
 +</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/coding.html
index 0f3f8fe,0000000..e1e7139
mode 100644,000000..100644
--- a/en-us/docs/dev/coding.html
+++ b/en-us/docs/dev/coding.html
@@@ -1,91 -1,0 +1,91 @@@
 +<!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="coding" />
 +	<meta name="description" content="coding" />
 +	<!-- 网页标签标题 -->
 +	<title>coding</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 [...]
++	<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 [...]
 +<h2>Code style</h2>
 +<p>The source and JavaDoc of Dubbo follow below specifications:</p>
 +<ul>
 +<li><a href="http://www.oracle.com/technetwork/java/codeconvtoc-136057.html">Code Conventions for the Java Programming Language</a></li>
 +<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>
 +</ul>
 +<h2>Exception and Logging</h2>
 +<ul>
 +<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>
 +<li>Try to put the main cause at the front, and display all other context information with key-value paris after it.</li>
 +<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>
 +<li><code>ERROR</code> log means NEED TO ALARM, <code>WARN</code> log means COULD AUTO RECOVERY, <code>INFO</code> long mean NORMAL.</li>
 +<li>Suggestion: config <code>ERROR</code> log in Monitor center for real-time alarm, summary and send <code>WARN</code> log weekly.</li>
 +<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>
 +<li><code>RpcException</code> CAN NOT have sub-class, all types of information are identified with ErrorCode in order to keep compatible.</li>
 +</ul>
 +<h2>Configuration and URL</h2>
 +<ul>
 +<li>Use initials and camelCase for multiple words for object properties <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>.</li>
 +<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>
 +<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>
 +<li>Use URL transfer parameters as possible, Don't define Map or other types, config information also transfer to URL style.</li>
 +<li>Minimize URL nesting to keep URL simplicity.</li>
 +</ul>
 +<h2>Unit testing and integration testing</h2>
 +<ul>
 +<li>Use JUnit and EasyMock for unit testing, use TestNG for integration testing, use DBUnit for database testing.</li>
 +<li>Don't put large integration test case in unit testing for running speed of unit test case.</li>
 +<li>Use <code>try...finally</code> or <code>tearDown</code> to release resource for all test cases of unit testing.</li>
 +<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>
 +<li>For fail-safe testing, unified use <code>LogUtil</code> assertion log output.</li>
 +</ul>
 +<h2>Extension point base class and AOP</h2>
 +<ul>
 +<li>AOP class should be named as <code>XxxWrapper</code>,Base class should be named as <code>AbstractXxx</code>.</li>
 +<li>Use AOP for combine relationship between extension points, <code>ExtensionLoader</code> only loads extension points, including AOP extension.</li>
 +<li>Try to use Ioc inject dependency of extension points, Don't direct dependent on factory method of <code>ExtensionLoader</code>.</li>
 +<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>
 +<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>
 +<li>The base class is also part of the SPI, and each extension should have a convenient base class support.</li>
 +</ul>
 +<h2>Module and packaging</h2>
 +<ul>
 +<li>Base on reusability for packaging, dividing the interface, base class and large implementation into separate modules.</li>
 +<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>
 +<li>Try to keep subpackage dependent on parent package, NOT reverse.</li>
 +</ul>
 +<hr class="footnotes-sep">
 +<section class="footnotes">
 +<ol class="footnotes-list">
 +<li id="fn1" class="footnote-item"><p>Java convention <a href="#fnref1" class="footnote-backref">↩︎</a></p>
 +</li>
 +<li id="fn2" class="footnote-item"><p>Spring convention <a href="#fnref2" class="footnote-backref">↩︎</a></p>
 +</li>
 +<li id="fn3" class="footnote-item"><p>Dubbo convention <a href="#fnref3" class="footnote-backref">↩︎</a></p>
 +</li>
 +</ol>
 +</section>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/contract.html
index 2dee2cf,0000000..8a363a8
mode 100644,000000..100644
--- a/en-us/docs/dev/contract.html
+++ b/en-us/docs/dev/contract.html
@@@ -1,45 -1,0 +1,45 @@@
 +<!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="contract" />
 +	<meta name="description" content="contract" />
 +	<!-- 网页标签标题 -->
 +	<title>contract</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 [...]
++	<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 [...]
 +<p>This document is Dubbo public agreement, we expect all extension points comply with it.</p>
 +<h2>URL</h2>
 +<ul>
 +<li>All extension points must include URL parameter, design URL as a context information which throughouts the whole extension point design system.</li>
 +<li>URL standard style: <code>protocol://username:password@host:port/path?key=value&amp;key=value</code></li>
 +</ul>
 +<h2>Logging</h2>
 +<ul>
 +<li>Print <code>ERROR</code> log for unrecoverable and NEED TO ALARM situation.</li>
 +<li>Print <code>WARN</code> log for recoverable exception or transient state inconsistency.</li>
 +<li>Print <code>INFO</code> log for normally status.</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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/contribution.html
index 222acfb,0000000..d95c60e
mode 100644,000000..100644
--- a/en-us/docs/dev/contribution.html
+++ b/en-us/docs/dev/contribution.html
@@@ -1,395 -1,0 +1,395 @@@
 +<!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="contribution" />
 +	<meta name="description" content="contribution" />
 +	<!-- 网页标签标题 -->
 +	<title>contribution</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 [...]
++	<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 [...]
 +table {
 +  width: 100%;
 +  max-width: 65em;
 +  border: 1px solid #dedede;
 +  margin: 15px auto;
 +  border-collapse: collapse;
 +  empty-cells: show;
 +}
 +table th,
 +table td {
 +  height: 35px;
 +  border: 1px solid #dedede;
 +  padding: 0 10px;
 +}
 +table th {
 +  font-weight: bold;
 +  text-align: center !important;
 +  background: rgba(158,188,226,0.2);
 +  white-space: nowrap;
 +}
 +table tbody tr:nth-child(2n) {
 +  background: rgba(158,188,226,0.12);
 +}
 +table td:nth-child(1) {
 +  white-space: nowrap;
 +}
 +table tr:hover {
 +  background: #efefef;
 +}
 +.table-area {
 +  overflow: auto;
 +}
 +</style>
 +<script type="text/javascript">
 +[].slice.call(document.querySelectorAll('table')).forEach(function(el){
 +    var wrapper = document.createElement('div');
 +    wrapper.className = 'table-area';
 +    el.parentNode.insertBefore(wrapper, el);
 +    el.parentNode.removeChild(el);
 +    wrapper.appendChild(el);
 +})
 +</script>
 +<h1>Contribution</h1>
 +<h2>Flow</h2>
 +<ul>
 +<li>Direct adding new project, black-box dependent on Dubbo for function extension.</li>
 +<li>Fork Dubbo on Github for BUG fixing or modify the framework.</li>
 +<li>Pull Request after changing.</li>
 +</ul>
 +<h2>Tasks</h2>
 +<table>
 +<thead>
 +<tr>
 +<th>Funcation</th>
 +<th>Type</th>
 +<th>Priority</th>
 +<th>Status</th>
 +<th>Claimer</th>
 +<th>Plan complete time</th>
 +<th>progress</th>
 +</tr>
 +</thead>
 +<tbody>
 +<tr>
 +<td><Use Guideline> Translation</td>
 +<td>Document</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td><Developing Guideline> translation</td>
 +<td>Document</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Extension point compatibility testing</td>
 +<td>Testing</td>
 +<td>High</td>
 +<td>Claimed</td>
 +<td>罗立树</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Performance benchmark testing</td>
 +<td>Testing</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Functional unit testing</td>
 +<td>Testing</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JTA/XA distributed transaction</td>
 +<td>Interceptor extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Thrift</td>
 +<td>Protocol extension</td>
 +<td>High</td>
 +<td>Developing done</td>
 +<td>闾刚</td>
 +<td>2012-04-27</td>
 +<td>90%</td>
 +</tr>
 +<tr>
 +<td>ICE</td>
 +<td>Protocol extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>ACE</td>
 +<td>Protocol extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JSON-RPC</td>
 +<td>Protocol extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>XML-RPC</td>
 +<td>Protocol extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JSR181&amp;CXF(WebService)</td>
 +<td>Protocol extension</td>
 +<td>High</td>
 +<td>Developing done</td>
 +<td>白文志</td>
 +<td>2012-04-27</td>
 +<td>90%</td>
 +</tr>
 +<tr>
 +<td>JSR311&amp;JSR339(RestfulWebService)</td>
 +<td>Protocol extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JMS&amp;ActiveMQ</td>
 +<td>Protocol extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Protobuf</td>
 +<td>Serialization extension</td>
 +<td>High</td>
 +<td>Researching</td>
 +<td>朱启恒</td>
 +<td>2012-02-30</td>
 +<td>20%</td>
 +</tr>
 +<tr>
 +<td>Avro</td>
 +<td>Serialization extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>XSocket</td>
 +<td>Transmission extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>CGLib</td>
 +<td>Dynamic proxy extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JNDI</td>
 +<td>Registry extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>LDAP</td>
 +<td>Registry extension</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JSR140&amp;SLP</td>
 +<td>Registry extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>UDDI</td>
 +<td>Registry extension</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JMX</td>
 +<td>Monitoring expansion</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>SNMP</td>
 +<td>Monitoring expansion</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Cacti</td>
 +<td>Monitoring expansion</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Nagios</td>
 +<td>Monitoring expansion</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Logstash</td>
 +<td>Monitoring expansion</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JRobin</td>
 +<td>Monitoring expansion</td>
 +<td>High</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Maven</td>
 +<td>Package management</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>Subversion</td>
 +<td>Package management</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>JCR/JSR283</td>
 +<td>Package management</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>SimpleDeployer</td>
 +<td>Local deployment agent</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +<tr>
 +<td>SimpleScheduler</td>
 +<td>Scheduler</td>
 +<td>Low</td>
 +<td>Unclaimed</td>
 +<td>Pending</td>
 +<td>Pending</td>
 +<td>0%</td>
 +</tr>
 +</tbody>
 +</table>
- </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 makin [...]
++</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">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">Event [...]
 +	<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>
diff --cc en-us/docs/dev/design.html
index 6ccebab,0000000..dc122dd
mode 100644,000000..100644
--- a/en-us/docs/dev/design.html
+++ b/en-us/docs/dev/design.html
@@@ -1,114 -1,0 +1,114 @@@
 +<!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="design" />
 +	<meta name="description" content="design" />
 +	<!-- 网页标签标题 -->
 +	<title>design</title>
 +	<link rel="shortcut icon" href="/img/dubbo.ico"/>
 +	<link rel="stylesheet" href="/build/documentation.css" />
 +</head>
 +<body>
- 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/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 [...]
++	<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 [...]
 +<h2>Overall design</h2>
 +<p><img src="sources/images/dubbo-framework.jpg" alt="/dev-guide/images/dubbo-framework.jpg"></p>
 +<p>Image description:</p>
 +<ul>
 +<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>
 +<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>
 +<li>Green boxes are extension interfaces, blue boxes are implementation classes, image only shows implementation class of associated layers.</li>
 +<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>
 +</ul>
 +<h2>Layer description</h2>
 +<ul>
 +<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>
 +<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>
 +<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>
 +<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>
 +<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>
 +<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>
 +<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>
 +<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>
 +<li><strong>serialize layer</strong>: reusable tools, extension interfaces are <code>Serialization</code>, <code>ObjectInput</code>, <code>ObjectOutput</code>, <code>ThreadPool</code></li>
 +</ul>
 +<h2>Relationship description</h2>
 +<ul>
 +<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>
 +<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>
 +<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>
 +<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>
 +<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>
 +<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>
 +</ul>
 +<h2>Modules packaging</h2>
 +<p><img src="sources/images/dubbo-modules.jpg" alt="/dev-guide/images/dubbo-modules.jpg"></p>
 +<p>Modules description:</p>
 +<ul>
 +<li><strong>dubbo-common module</strong>: includes Util classes and common modules.</li>
 +<li><strong>dubbo-remoting module</strong>: is Dubbo protocol implementation, no need to use this module if using RMI for RPC.</li>
 +<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>
 +<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>
 +<li><strong>dubbo-registry module</strong>: Based on the cluster of registry send address and the abstraction of various registry centers.</li>
 +<li><strong>dubbo-monitor module</strong>: statistics of service call times, call time, call chain tracked services.</li>
 +<li><strong>dubbo-config module</strong>: is Dubbo external API, users use Dubbo by Config, hide Dubbo details.</li>
 +<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>
 +</ul>
 +<p>Package dividing according to the layer structure, and the difference with layer dividing:</p>
 +<ul>
 +<li>container is service container, for service running deployment, not showed in the image.</li>
 +<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>
 +<li>transport layer and exchange layer are placed in remoting module, for RPC call base comminucation.</li>
 +<li>serialize layer is placed in common module, for reuse.</li>
 +</ul>
 +<h2>Dependence relationship</h2>
 +<p><img src="sources/images/dubbo-relation.jpg" alt="/dev-guide/images/dubbo-relation.jpg"></p>
 +<p>Image description:</p>
 +<ul>
 +<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>
 +<li>The backgroud boxes in image, Consumer, Provider, Registry, Monitor represent deployment logical topology node.</li>
 +<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>
 +<li>The image only includes RPC layer, don't includes Remoting layer, the whole Remoting hides in Protocol layer.</li>
 +</ul>
 +<h2>Call chain</h2>
 +<p>Expand the red call chain of the overall design map:</p>
 +<p><img src="sources/images/dubbo-extension.jpg" alt="/dev-guide/images/dubbo-extension.jpg"></p>
 +<h2>Expose service sequence</h2>
 +<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>
 +<p><img src="sources/images/dubbo-export.jpg" alt="/dev-guide/images/dubbo-export.jpg"></p>
 +<h2>Reference service sequence</h2>
 +<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>
 +<p><img src="sources/images/dubbo-refer.jpg" alt="/dev-guide/images/dubbo-refer.jpg"></p>
 +<h2>Domain model</h2>
 +<p>The core domain models of Dubbo:</p>
 +<ul>
 +<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>
 +<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>
 +<li>Invocation is session domain, it holds variables in the calling process, such as the method name, the parameters, and so on.</li>
 +</ul>
 +<h2>Base design principle</h2>
 +<ul>
 +<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>
 +<li>Use URL to be the startdard format of config information, all extension points transfer config information by URL.</li>
 +</ul>
... 64378 lines suppressed ...