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

[dubbo-website] branch asf-site updated: deploy: 7ccfe8e91033f3de23f7185a334fa1099572a2e5

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

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


The following commit(s) were added to refs/heads/asf-site by this push:
     new da7c041  deploy: 7ccfe8e91033f3de23f7185a334fa1099572a2e5
da7c041 is described below

commit da7c041f5afa12af8d15446bc2bf6d158c6601c6
Author: beiwei30 <be...@users.noreply.github.com>
AuthorDate: Sat Jan 23 08:16:05 2021 +0000

    deploy: 7ccfe8e91033f3de23f7185a334fa1099572a2e5
---
 en/404.html                                        |    4 +
 .../index.html                                     |   38 +
 .../the-gsocgoogle-summer-of-code-2018/index.html  |   38 +
 .../index.html                                     |   38 +
 .../index.html                                     |   38 +
 .../index.html                                     |   38 +
 .../2018/07/01/your-first-dubbo-filter/index.html  |  194 +
 .../2018/07/12/tracking-with-pinpoint/index.html   |  310 ++
 .../index.html                                     |   54 +
 .../index.html                                     |   38 +
 en/blog/2018/08/07/dubbo-101/index.html            |  173 +
 .../2018/08/07/use-annotations-in-dubbo/index.html |  231 +
 .../2018/08/07/using-zookeeper-in-dubbo/index.html |  175 +
 en/blog/2018/08/10/dubbos-load-balance/index.html  |  129 +
 .../index.html                                     |  120 +
 .../index.html                                     |  157 +
 .../asynchronous-invoke/index.html                 |  126 +
 .../2018/08/14/generic-invoke-of-dubbo/index.html  |  130 +
 .../index.html                                     |  148 +
 .../index.html                                     |  148 +
 .../index.html                                     |  148 +
 .../index.html                                     |   38 +
 .../index.html                                     |  250 +
 .../02/how-to-prepare-an-apache-release/index.html |  283 +
 .../30/integrate-dubbo-with-kubernetes/index.html  |   52 +
 .../introduction-to-the-dubbo-protocol/index.html  |   61 +
 .../index.html                                     |  343 ++
 .../index.html                                     |   38 +
 .../index.html                                     |  176 +
 .../index.html                                     |   56 +
 .../index.html                                     |   60 +
 .../index.html                                     |   93 +
 .../index.html                                     |  300 ++
 .../index.html                                     |   73 +
 en/blog/2019/08/26/service-test/index.html         |  156 +
 en/blog/2020/05/18/past-releases/index.html        |  100 +
 en/blog/index.html                                 |   48 +
 en/blog/index.xml                                  | 5471 ++++++++++++++++++++
 en/blog/news/index.html                            |   45 +
 en/blog/news/index.xml                             | 5304 +++++++++++++++++++
 en/blog/news/page/1/index.html                     |    1 +
 en/blog/news/page/2/index.html                     |   40 +
 en/blog/news/page/3/index.html                     |   45 +
 en/blog/news/page/4/index.html                     |   40 +
 en/blog/page/1/index.html                          |    1 +
 en/blog/page/2/index.html                          |   40 +
 en/blog/page/3/index.html                          |   43 +
 en/blog/page/4/index.html                          |   42 +
 en/blog/releases/index.html                        |   41 +
 en/blog/releases/index.xml                         |  168 +
 en/blog/releases/page/1/index.html                 |    1 +
 en/community/index.html                            |    1 +
 en/community/index.xml                             |    1 +
 .../committer/apache-dubbo-page_dev/index.html     |  172 +
 .../contribution-guidelines/committer/index.html   |  161 +
 .../contribution-guidelines/committer/index.xml    |  522 ++
 .../committer/label-an-issue-guide_dev/index.html  |  173 +
 .../committer/new-committer-guide_dev/index.html   |  165 +
 .../committer/release-guide_dev/index.html         |  370 ++
 .../committer/website-guide_dev/index.html         |  161 +
 .../contributor/become-a-committer_dev/index.html  |  164 +
 .../contributor/cla-signing-guide_dev/index.html   |  164 +
 .../dubbo-extension-guide_dev/index.html           |  170 +
 .../contribution-guidelines/contributor/index.html |  161 +
 .../contribution-guidelines/contributor/index.xml  |  282 +
 .../mailing-list-subscription-guide_dev/index.html |  225 +
 .../new-contributor-guide_dev/index.html           |  177 +
 .../reporting-security-issues_dev/index.html       |  164 +
 .../software-donation-guide_dev/index.html         |  252 +
 .../contributor/test-coverage-guide_dev/index.html |  161 +
 en/docs/contribution-guidelines/index.html         |  169 +
 en/docs/contribution-guidelines/index.xml          |    1 +
 en/docs/index.html                                 |  161 +
 en/docs/index.xml                                  | 5000 ++++++++++++++++++
 en/docs/notices/index.html                         |  161 +
 en/docs/notices/index.xml                          |   21 +
 en/docs/notices/security/index.html                |  163 +
 en/docs/v2.7/admin/index.html                      |  161 +
 en/docs/v2.7/admin/index.xml                       |    6 +
 .../v2.7/admin/install/admin-console/index.html    |  189 +
 .../v2.7/admin/install/consumer-demo/index.html    |  175 +
 en/docs/v2.7/admin/install/index.html              |  161 +
 en/docs/v2.7/admin/install/index.xml               |  144 +
 .../v2.7/admin/install/monitor-center/index.html   |  161 +
 .../v2.7/admin/install/provider-demo/index.html    |  174 +
 en/docs/v2.7/admin/install/redis/index.html        |  193 +
 en/docs/v2.7/admin/install/zookeeper/index.html    |  203 +
 en/docs/v2.7/admin/ops/apidocs/index.html          |  189 +
 en/docs/v2.7/admin/ops/functions/index.html        |  164 +
 en/docs/v2.7/admin/ops/governance/index.html       |  164 +
 en/docs/v2.7/admin/ops/index.html                  |  161 +
 {zh => en}/docs/v2.7/admin/ops/index.xml           |  578 +--
 en/docs/v2.7/admin/ops/introduction/index.html     |  188 +
 en/docs/v2.7/admin/ops/pinpoint/index.html         |  433 ++
 en/docs/v2.7/admin/ops/search/index.html           |  164 +
 en/docs/v2.7/admin/ops/skywalking/index.html       |  212 +
 en/docs/v2.7/admin/ops/test/index.html             |  161 +
 en/docs/v2.7/dev/build/index.html                  |  169 +
 en/docs/v2.7/dev/checklist/index.html              |  161 +
 en/docs/v2.7/dev/code-smell/index.html             |  208 +
 en/docs/v2.7/dev/coding/index.html                 |  161 +
 en/docs/v2.7/dev/contract/index.html               |  161 +
 en/docs/v2.7/dev/design/index.html                 |  161 +
 en/docs/v2.7/dev/implementation/index.html         |  181 +
 en/docs/v2.7/dev/impls/cache/index.html            |  211 +
 en/docs/v2.7/dev/impls/cluster/index.html          |  204 +
 en/docs/v2.7/dev/impls/compiler/index.html         |  196 +
 en/docs/v2.7/dev/impls/config-center/index.html    |  167 +
 en/docs/v2.7/dev/impls/container/index.html        |  198 +
 en/docs/v2.7/dev/impls/dispatcher/index.html       |  196 +
 en/docs/v2.7/dev/impls/exchanger/index.html        |  214 +
 .../v2.7/dev/impls/exporter-listener/index.html    |  206 +
 .../v2.7/dev/impls/extension-factory/index.html    |  197 +
 en/docs/v2.7/dev/impls/filter/index.html           |  202 +
 en/docs/v2.7/dev/impls/index.html                  |  161 +
 {zh => en}/docs/v2.7/dev/impls/index.xml           |  914 ++--
 en/docs/v2.7/dev/impls/invoker-listener/index.html |  206 +
 en/docs/v2.7/dev/impls/load-balance/index.html     |  199 +
 en/docs/v2.7/dev/impls/logger-adapter/index.html   |  211 +
 en/docs/v2.7/dev/impls/merger/index.html           |  194 +
 en/docs/v2.7/dev/impls/monitor/index.html          |  207 +
 en/docs/v2.7/dev/impls/networker/index.html        |  196 +
 en/docs/v2.7/dev/impls/page/index.html             |  196 +
 en/docs/v2.7/dev/impls/protocol/index.html         |  255 +
 en/docs/v2.7/dev/impls/proxy-factory/index.html    |  202 +
 en/docs/v2.7/dev/impls/registry/index.html         |  313 ++
 en/docs/v2.7/dev/impls/remoting/index.html         |  237 +
 en/docs/v2.7/dev/impls/router/index.html           |  194 +
 en/docs/v2.7/dev/impls/serialize/index.html        |  199 +
 en/docs/v2.7/dev/impls/status-checker/index.html   |  193 +
 en/docs/v2.7/dev/impls/telnet-handler/index.html   |  197 +
 en/docs/v2.7/dev/impls/threadpool/index.html       |  194 +
 en/docs/v2.7/dev/impls/validation/index.html       |  211 +
 en/docs/v2.7/dev/index.html                        |  161 +
 en/docs/v2.7/dev/index.xml                         |  602 +++
 en/docs/v2.7/dev/principals/code-detail/index.html |  164 +
 .../v2.7/dev/principals/configuration/index.html   |  167 +
 en/docs/v2.7/dev/principals/dummy/index.html       |  316 ++
 .../v2.7/dev/principals/expansibility/index.html   |  164 +
 en/docs/v2.7/dev/principals/extension/index.html   |  206 +
 .../dev/principals/general-knowledge/index.html    |  167 +
 en/docs/v2.7/dev/principals/index.html             |  161 +
 en/docs/v2.7/dev/principals/index.xml              |  390 ++
 en/docs/v2.7/dev/principals/robustness/index.html  |  171 +
 en/docs/v2.7/dev/release/index.html                |  161 +
 en/docs/v2.7/dev/spi/index.html                    |  261 +
 en/docs/v2.7/dev/tck/index.html                    |  161 +
 en/docs/v2.7/index.html                            |  161 +
 en/docs/v2.7/index.xml                             |    2 +
 en/docs/v2.7/user/benchmark-tool/index.html        |  165 +
 en/docs/v2.7/user/best-practice/index.html         |  161 +
 en/docs/v2.7/user/capacity-plan/index.html         |  161 +
 .../v2.7/user/configuration/annotation/index.html  |  206 +
 en/docs/v2.7/user/configuration/api/index.html     |  251 +
 .../configuration-load-process/index.html          |  243 +
 en/docs/v2.7/user/configuration/index.html         |  161 +
 en/docs/v2.7/user/configuration/index.xml          |  412 ++
 .../v2.7/user/configuration/properties/index.html  |  164 +
 en/docs/v2.7/user/configuration/xml/index.html     |  182 +
 en/docs/v2.7/user/coveragence/index.html           |  162 +
 en/docs/v2.7/user/dependencies/index.html          |  165 +
 en/docs/v2.7/user/examples/accesslog/index.html    |  187 +
 en/docs/v2.7/user/examples/async-call/index.html   |  187 +
 .../examples/async-execute-on-provider/index.html  |  202 +
 en/docs/v2.7/user/examples/attachment/index.html   |  172 +
 .../user/examples/callback-parameter/index.html    |  236 +
 .../user/examples/concurrency-control/index.html   |  177 +
 .../user/examples/config-connections/index.html    |  165 +
 en/docs/v2.7/user/examples/config-rule/index.html  |  168 +
 en/docs/v2.7/user/examples/context/index.html      |  184 +
 .../v2.7/user/examples/delay-publish/index.html    |  164 +
 .../examples/distributed-transaction/index.html    |  161 +
 en/docs/v2.7/user/examples/dump/index.html         |  166 +
 en/docs/v2.7/user/examples/echo-service/index.html |  171 +
 .../v2.7/user/examples/events-notify/index.html    |  208 +
 .../v2.7/user/examples/explicit-target/index.html  |  165 +
 .../examples/fault-tolerent-strategy/index.html    |  168 +
 .../user/examples/generic-reference/index.html     |  221 +
 .../v2.7/user/examples/generic-service/index.html  |  186 +
 .../user/examples/graceful-shutdown/index.html     |  164 +
 en/docs/v2.7/user/examples/group-merger/index.html |  175 +
 .../v2.7/user/examples/hostname-binding/index.html |  166 +
 en/docs/v2.7/user/examples/index.html              |  161 +
 en/docs/v2.7/user/examples/index.xml               | 1668 ++++++
 en/docs/v2.7/user/examples/lazy-connect/index.html |  162 +
 en/docs/v2.7/user/examples/loadbalance/index.html  |  169 +
 en/docs/v2.7/user/examples/local-call/index.html   |  169 +
 en/docs/v2.7/user/examples/local-mock/index.html   |  184 +
 en/docs/v2.7/user/examples/local-stub/index.html   |  182 +
 .../v2.7/user/examples/logger-strategy/index.html  |  164 +
 .../v2.7/user/examples/multi-protocols/index.html  |  189 +
 .../v2.7/user/examples/multi-registry/index.html   |  212 +
 .../v2.7/user/examples/multi-versions/index.html   |  166 +
 en/docs/v2.7/user/examples/netty4/index.html       |  171 +
 .../user/examples/parameter-validation/index.html  |  294 ++
 .../v2.7/user/examples/preflight-check/index.html  |  173 +
 .../examples/reference-config-cache/index.html     |  175 +
 .../v2.7/user/examples/registry-only/index.html    |  167 +
 en/docs/v2.7/user/examples/result-cache/index.html |  165 +
 en/docs/v2.7/user/examples/routing-rule/index.html |  203 +
 .../v2.7/user/examples/serialization/index.html    |  176 +
 .../user/examples/service-container/index.html     |  166 +
 .../user/examples/service-downgrade/index.html     |  164 +
 .../v2.7/user/examples/service-group/index.html    |  166 +
 .../v2.7/user/examples/static-service/index.html   |  166 +
 en/docs/v2.7/user/examples/stickiness/index.html   |  165 +
 .../v2.7/user/examples/subscribe-only/index.html   |  163 +
 en/docs/v2.7/user/examples/thread-model/index.html |  162 +
 .../user/examples/token-authorization/index.html   |  173 +
 en/docs/v2.7/user/index.html                       |  161 +
 en/docs/v2.7/user/index.xml                        | 2313 +++++++++
 en/docs/v2.7/user/languages/erlang/index.html      |  161 +
 .../docs/v2.7/user/languages/erlang/index.xml      |   50 +-
 .../user/languages/erlang/quick-start/index.html   |  178 +
 .../user/languages/erlang/reference/index.html     |  169 +
 .../user/languages/erlang/serialization/index.html |  165 +
 .../v2.7/user/languages/erlang/service/index.html  |  169 +
 en/docs/v2.7/user/languages/index.html             |  161 +
 en/docs/v2.7/user/languages/index.xml              |    1 +
 en/docs/v2.7/user/maturity/index.html              |  161 +
 en/docs/v2.7/user/perf-test/index.html             |  164 +
 en/docs/v2.7/user/preface/architecture/index.html  |  161 +
 en/docs/v2.7/user/preface/background/index.html    |  161 +
 en/docs/v2.7/user/preface/index.html               |  161 +
 en/docs/v2.7/user/preface/index.xml                |  149 +
 en/docs/v2.7/user/preface/requirements/index.html  |  161 +
 en/docs/v2.7/user/preface/usage/index.html         |  175 +
 en/docs/v2.7/user/quick-start/index.html           |  292 ++
 en/docs/v2.7/user/recommend/index.html             |  189 +
 en/docs/v2.7/user/references/api/index.html        |  180 +
 en/docs/v2.7/user/references/index.html            |  161 +
 {zh => en}/docs/v2.7/user/references/index.xml     |  411 +-
 en/docs/v2.7/user/references/maven/index.html      |  163 +
 en/docs/v2.7/user/references/metadata/index.html   |  378 ++
 .../v2.7/user/references/protocol/dubbo/index.html |  170 +
 .../user/references/protocol/hessian/index.html    |  172 +
 .../v2.7/user/references/protocol/http/index.html  |  173 +
 en/docs/v2.7/user/references/protocol/index.html   |  161 +
 .../docs/v2.7/user/references/protocol/index.xml   |  508 +-
 .../user/references/protocol/memcached/index.html  |  168 +
 .../v2.7/user/references/protocol/redis/index.html |  168 +
 .../v2.7/user/references/protocol/rest/index.html  |  362 +-
 .../v2.7/user/references/protocol/rmi/index.html   |  171 +
 .../user/references/protocol/thrift/index.html     |  167 +
 .../user/references/protocol/webservice/index.html |  189 +
 en/docs/v2.7/user/references/qos/index.html        |  268 +
 en/docs/v2.7/user/references/registry/index.html   |  161 +
 en/docs/v2.7/user/references/registry/index.xml    |  262 +
 .../user/references/registry/multicast/index.html  |  169 +
 .../v2.7/user/references/registry/nacos/index.html |  214 +
 .../v2.7/user/references/registry/redis/index.html |  165 +
 .../user/references/registry/simple/index.html     |  181 +
 .../user/references/registry/zookeeper/index.html  |  189 +
 en/docs/v2.7/user/references/telnet/index.html     |  164 +
 .../references/xml/dubbo-application/index.html    |  161 +
 .../user/references/xml/dubbo-argument/index.html  |  164 +
 .../references/xml/dubbo-config-center/index.html  |  161 +
 .../user/references/xml/dubbo-consumer/index.html  |  161 +
 .../user/references/xml/dubbo-method/index.html    |  164 +
 .../user/references/xml/dubbo-module/index.html    |  161 +
 .../user/references/xml/dubbo-monitor/index.html   |  161 +
 .../user/references/xml/dubbo-parameter/index.html |  165 +
 .../user/references/xml/dubbo-protocol/index.html  |  161 +
 .../user/references/xml/dubbo-provider/index.html  |  161 +
 .../user/references/xml/dubbo-reference/index.html |  161 +
 .../user/references/xml/dubbo-registry/index.html  |  161 +
 .../user/references/xml/dubbo-service/index.html   |  161 +
 en/docs/v2.7/user/references/xml/index.html        |  161 +
 en/docs/v2.7/user/references/xml/index.xml         | 2323 +++++++++
 en/docs/v2.7/user/rest/index.html                  |  531 ++
 en/docs/v2.7/user/simple-monitor/index.html        |  201 +
 en/docs/v3.0/index.html                            |  161 +
 en/docs/v3.0/index.xml                             |    1 +
 en/featured-background.jpg                         |  Bin 0 -> 146971 bytes
 ...a2_146971_1920x1080_fill_q75_catmullrom_top.jpg |  Bin 0 -> 49146 bytes
 ...9fa2_146971_960x540_fill_q75_catmullrom_top.jpg |  Bin 0 -> 15763 bytes
 en/index.html                                      |    2 +-
 en/index.xml                                       | 5471 ++++++++++++++++++++
 en/sitemap.xml                                     |    2 +-
 index.html                                         |    2 +-
 ...8af304cb142e92e4bf9860e8fee7857669f773b30be9.js |    6 +
 sitemap.xml                                        |    2 +-
 zh/404.html                                        |    4 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |   12 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 zh/blog/2018/08/07/dubbo-101/index.html            |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../01/07/\346\265\205\350\260\210-rpc/index.html" |    8 +-
 .../index.html"                                    |    8 +-
 .../26/\351\201\207\350\247\201dubbo/index.html"   |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 zh/blog/2019/08/26/service-test/index.html         |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../2-grpc-\345\222\214-protobuf/index.html"       |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 zh/blog/2021/01/12/dubbo-go-1.4.0/index.html       |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 zh/blog/2021/01/14/dubbo-go-1.5.0/index.html       |    6 +-
 zh/blog/2021/01/14/dubbo-go-1.5.1/index.html       |    8 +-
 .../2021/01/14/dubbo-go-hessian2-v1.6.0/index.html |    8 +-
 .../2021/01/14/dubbo-go-hessian2-v1.7.0/index.html |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    6 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 .../index.html"                                    |    8 +-
 zh/blog/index.html                                 |    8 +-
 zh/blog/index.xml                                  |  620 +--
 zh/blog/news/index.html                            |    8 +-
 zh/blog/news/index.xml                             |  624 +--
 zh/blog/news/page/1/index.html                     |    2 +-
 zh/blog/news/page/10/index.html                    |    8 +-
 zh/blog/news/page/2/index.html                     |    8 +-
 zh/blog/news/page/3/index.html                     |    8 +-
 zh/blog/news/page/4/index.html                     |    8 +-
 zh/blog/news/page/5/index.html                     |    8 +-
 zh/blog/news/page/6/index.html                     |    8 +-
 zh/blog/news/page/7/index.html                     |    8 +-
 zh/blog/news/page/8/index.html                     |    8 +-
 zh/blog/news/page/9/index.html                     |    8 +-
 zh/blog/page/1/index.html                          |    2 +-
 zh/blog/page/10/index.html                         |    8 +-
 zh/blog/page/11/index.html                         |    8 +-
 zh/blog/page/2/index.html                          |    8 +-
 zh/blog/page/3/index.html                          |    8 +-
 zh/blog/page/4/index.html                          |    8 +-
 zh/blog/page/5/index.html                          |    8 +-
 zh/blog/page/6/index.html                          |    8 +-
 zh/blog/page/7/index.html                          |    8 +-
 zh/blog/page/8/index.html                          |    8 +-
 zh/blog/page/9/index.html                          |    8 +-
 zh/blog/releases/index.html                        |    8 +-
 zh/blog/releases/index.xml                         |   40 +-
 zh/blog/releases/page/1/index.html                 |    2 +-
 zh/community/index.html                            |    2 +-
 zh/community/index.xml                             |    2 +-
 .../committer/apache-dubbo-page_dev/index.html     |   12 +-
 .../contribution-guidelines/committer/index.html   |    8 +-
 .../contribution-guidelines/committer/index.xml    |   10 +-
 .../committer/label-an-issue-guide_dev/index.html  |   12 +-
 .../committer/new-committer-guide_dev/index.html   |   12 +-
 .../committer/release-guide_dev/index.html         |   12 +-
 .../committer/website-guide_dev/index.html         |    8 +-
 .../contributor/become-a-committer_dev/index.html  |   12 +-
 .../contributor/cla-signing-guide_dev/index.html   |   12 +-
 .../dubbo-extension-guide_dev/index.html           |   12 +-
 .../contribution-guidelines/contributor/index.html |    8 +-
 .../contribution-guidelines/contributor/index.xml  |   18 +-
 .../mailing-list-subscription-guide_dev/index.html |   12 +-
 .../new-contributor-guide_dev/index.html           |   12 +-
 .../reporting-security-issues_dev/index.html       |   12 +-
 .../software-donation-guide_dev/index.html         |   12 +-
 .../contributor/test-coverage-guide_dev/index.html |    8 +-
 zh/docs/contribution-guidelines/index.html         |    8 +-
 zh/docs/contribution-guidelines/index.xml          |    2 +-
 zh/docs/index.html                                 |    8 +-
 zh/docs/index.xml                                  |  162 +-
 zh/docs/notices/index.html                         |    8 +-
 zh/docs/notices/index.xml                          |    2 +-
 zh/docs/notices/security/index.html                |    8 +-
 zh/docs/v2.7/admin/index.html                      |    8 +-
 zh/docs/v2.7/admin/index.xml                       |    4 +-
 .../v2.7/admin/install/admin-console/index.html    |   12 +-
 .../v2.7/admin/install/consumer-demo/index.html    |   12 +-
 zh/docs/v2.7/admin/install/index.html              |    8 +-
 zh/docs/v2.7/admin/install/index.xml               |   12 +-
 .../v2.7/admin/install/monitor-center/index.html   |    8 +-
 .../v2.7/admin/install/provider-demo/index.html    |   12 +-
 zh/docs/v2.7/admin/install/redis/index.html        |   12 +-
 zh/docs/v2.7/admin/install/zookeeper/index.html    |   12 +-
 zh/docs/v2.7/admin/ops/apidocs/index.html          |   12 +-
 zh/docs/v2.7/admin/ops/functions/index.html        |   12 +-
 zh/docs/v2.7/admin/ops/governance/index.html       |   12 +-
 zh/docs/v2.7/admin/ops/index.html                  |    8 +-
 zh/docs/v2.7/admin/ops/index.xml                   |   62 +-
 zh/docs/v2.7/admin/ops/introduction/index.html     |   12 +-
 zh/docs/v2.7/admin/ops/pinpoint/index.html         |   12 +-
 zh/docs/v2.7/admin/ops/search/index.html           |   12 +-
 zh/docs/v2.7/admin/ops/skywalking/index.html       |   12 +-
 zh/docs/v2.7/admin/ops/test/index.html             |    8 +-
 zh/docs/v2.7/dev/build/index.html                  |    8 +-
 zh/docs/v2.7/dev/checklist/index.html              |    8 +-
 zh/docs/v2.7/dev/code-smell/index.html             |    8 +-
 zh/docs/v2.7/dev/coding/index.html                 |    8 +-
 zh/docs/v2.7/dev/contract/index.html               |    8 +-
 zh/docs/v2.7/dev/design/index.html                 |    8 +-
 zh/docs/v2.7/dev/implementation/index.html         |    8 +-
 zh/docs/v2.7/dev/impls/cache/index.html            |   12 +-
 zh/docs/v2.7/dev/impls/cluster/index.html          |   12 +-
 zh/docs/v2.7/dev/impls/compiler/index.html         |   12 +-
 zh/docs/v2.7/dev/impls/config-center/index.html    |   12 +-
 zh/docs/v2.7/dev/impls/container/index.html        |   12 +-
 zh/docs/v2.7/dev/impls/dispatcher/index.html       |   12 +-
 zh/docs/v2.7/dev/impls/exchanger/index.html        |   12 +-
 .../v2.7/dev/impls/exporter-listener/index.html    |   12 +-
 .../v2.7/dev/impls/extension-factory/index.html    |   12 +-
 zh/docs/v2.7/dev/impls/filter/index.html           |   12 +-
 zh/docs/v2.7/dev/impls/index.html                  |    8 +-
 zh/docs/v2.7/dev/impls/index.xml                   |   64 +-
 zh/docs/v2.7/dev/impls/invoker-listener/index.html |   12 +-
 zh/docs/v2.7/dev/impls/load-balance/index.html     |   12 +-
 zh/docs/v2.7/dev/impls/logger-adapter/index.html   |   12 +-
 zh/docs/v2.7/dev/impls/merger/index.html           |   12 +-
 zh/docs/v2.7/dev/impls/monitor/index.html          |   12 +-
 zh/docs/v2.7/dev/impls/networker/index.html        |   12 +-
 zh/docs/v2.7/dev/impls/page/index.html             |   12 +-
 zh/docs/v2.7/dev/impls/protocol/index.html         |   12 +-
 zh/docs/v2.7/dev/impls/proxy-factory/index.html    |   12 +-
 zh/docs/v2.7/dev/impls/registry/index.html         |   12 +-
 zh/docs/v2.7/dev/impls/remoting/index.html         |   12 +-
 zh/docs/v2.7/dev/impls/router/index.html           |   12 +-
 zh/docs/v2.7/dev/impls/serialize/index.html        |   12 +-
 zh/docs/v2.7/dev/impls/status-checker/index.html   |   12 +-
 zh/docs/v2.7/dev/impls/telnet-handler/index.html   |   12 +-
 zh/docs/v2.7/dev/impls/threadpool/index.html       |   12 +-
 zh/docs/v2.7/dev/impls/validation/index.html       |   12 +-
 zh/docs/v2.7/dev/index.html                        |    8 +-
 zh/docs/v2.7/dev/index.xml                         |   48 +-
 zh/docs/v2.7/dev/principals/code-detail/index.html |   12 +-
 .../v2.7/dev/principals/configuration/index.html   |   12 +-
 zh/docs/v2.7/dev/principals/dummy/index.html       |   12 +-
 .../v2.7/dev/principals/expansibility/index.html   |   12 +-
 zh/docs/v2.7/dev/principals/extension/index.html   |   12 +-
 .../dev/principals/general-knowledge/index.html    |   12 +-
 zh/docs/v2.7/dev/principals/index.html             |    8 +-
 zh/docs/v2.7/dev/principals/index.xml              |   36 +-
 .../v2.7/dev/principals/introduction/index.html    |    8 +-
 zh/docs/v2.7/dev/principals/robustness/index.html  |   12 +-
 zh/docs/v2.7/dev/release/index.html                |    8 +-
 .../v2.7/dev/source/adaptive-extension/index.html  |    8 +-
 zh/docs/v2.7/dev/source/cluster/index.html         |    8 +-
 zh/docs/v2.7/dev/source/directory/index.html       |    8 +-
 zh/docs/v2.7/dev/source/dubbo-spi/index.html       |    8 +-
 zh/docs/v2.7/dev/source/export-service/index.html  |    8 +-
 zh/docs/v2.7/dev/source/index.html                 |    8 +-
 zh/docs/v2.7/dev/source/index.xml                  |   42 +-
 zh/docs/v2.7/dev/source/loadbalance/index.html     |    8 +-
 zh/docs/v2.7/dev/source/refer-service/index.html   |    8 +-
 zh/docs/v2.7/dev/source/router/index.html          |    8 +-
 .../dev/source/service-invoking-process/index.html |    8 +-
 zh/docs/v2.7/dev/spi/index.html                    |    8 +-
 zh/docs/v2.7/dev/tck/index.html                    |    8 +-
 zh/docs/v2.7/index.html                            |    8 +-
 zh/docs/v2.7/index.xml                             |    6 +-
 zh/docs/v2.7/user/benchmark-tool/index.html        |    8 +-
 zh/docs/v2.7/user/best-practice/index.html         |    8 +-
 zh/docs/v2.7/user/capacity-plan/index.html         |    8 +-
 .../v2.7/user/configuration/annotation/index.html  |    8 +-
 zh/docs/v2.7/user/configuration/api/index.html     |    8 +-
 .../user/configuration/config-center/index.html    |    8 +-
 .../configuration-load-process/index.html          |    8 +-
 .../configuration/environment-variables/index.html |    8 +-
 zh/docs/v2.7/user/configuration/index.html         |    8 +-
 zh/docs/v2.7/user/configuration/index.xml          |   32 +-
 .../v2.7/user/configuration/properties/index.html  |    8 +-
 zh/docs/v2.7/user/configuration/xml/index.html     |    8 +-
 zh/docs/v2.7/user/coveragence/index.html           |    8 +-
 zh/docs/v2.7/user/dependencies/index.html          |    8 +-
 zh/docs/v2.7/user/examples/accesslog/index.html    |    8 +-
 zh/docs/v2.7/user/examples/async-call/index.html   |    8 +-
 .../examples/async-execute-on-provider/index.html  |    8 +-
 zh/docs/v2.7/user/examples/attachment/index.html   |    8 +-
 zh/docs/v2.7/user/examples/auth/index.html         |   12 +-
 .../user/examples/callback-parameter/index.html    |    8 +-
 .../user/examples/concurrency-control/index.html   |    8 +-
 .../user/examples/config-connections/index.html    |    8 +-
 .../examples/config-rule-deprecated/index.html     |    8 +-
 zh/docs/v2.7/user/examples/config-rule/index.html  |    8 +-
 .../user/examples/consumer-threadpool/index.html   |    8 +-
 zh/docs/v2.7/user/examples/context/index.html      |    8 +-
 .../v2.7/user/examples/delay-publish/index.html    |    8 +-
 .../examples/distributed-transaction/index.html    |    8 +-
 zh/docs/v2.7/user/examples/dump/index.html         |    8 +-
 zh/docs/v2.7/user/examples/echo-service/index.html |    8 +-
 .../v2.7/user/examples/events-notify/index.html    |    8 +-
 .../v2.7/user/examples/explicit-target/index.html  |    8 +-
 .../examples/fault-tolerent-strategy/index.html    |    8 +-
 .../user/examples/generic-reference/index.html     |    8 +-
 .../v2.7/user/examples/generic-service/index.html  |    8 +-
 .../user/examples/graceful-shutdown/index.html     |    8 +-
 zh/docs/v2.7/user/examples/group-merger/index.html |    8 +-
 .../v2.7/user/examples/hostname-binding/index.html |    8 +-
 zh/docs/v2.7/user/examples/index.html              |    8 +-
 zh/docs/v2.7/user/examples/index.xml               |  124 +-
 zh/docs/v2.7/user/examples/lazy-connect/index.html |    8 +-
 zh/docs/v2.7/user/examples/loadbalance/index.html  |    8 +-
 zh/docs/v2.7/user/examples/local-call/index.html   |    8 +-
 zh/docs/v2.7/user/examples/local-mock/index.html   |    8 +-
 zh/docs/v2.7/user/examples/local-stub/index.html   |    8 +-
 .../v2.7/user/examples/logger-strategy/index.html  |    8 +-
 .../v2.7/user/examples/multi-protocols/index.html  |    8 +-
 .../v2.7/user/examples/multi-registry/index.html   |    8 +-
 .../v2.7/user/examples/multi-versions/index.html   |    8 +-
 zh/docs/v2.7/user/examples/netty4/index.html       |    8 +-
 .../user/examples/parameter-validation/index.html  |    8 +-
 .../user/examples/pb-generic-reference/index.html  |    8 +-
 .../v2.7/user/examples/preflight-check/index.html  |    8 +-
 zh/docs/v2.7/user/examples/protobuf-idl/index.html |    8 +-
 .../examples/reference-config-cache/index.html     |    8 +-
 .../v2.7/user/examples/registry-only/index.html    |    8 +-
 zh/docs/v2.7/user/examples/result-cache/index.html |    8 +-
 .../examples/routing-rule-deprecated/index.html    |    8 +-
 zh/docs/v2.7/user/examples/routing-rule/index.html |    8 +-
 .../v2.7/user/examples/serialization/index.html    |    8 +-
 .../user/examples/service-container/index.html     |    8 +-
 .../user/examples/service-downgrade/index.html     |    8 +-
 .../v2.7/user/examples/service-group/index.html    |    8 +-
 zh/docs/v2.7/user/examples/set-host/index.html     |    8 +-
 .../examples/simplify-registry-data/index.html     |    8 +-
 .../v2.7/user/examples/static-service/index.html   |    8 +-
 zh/docs/v2.7/user/examples/stickiness/index.html   |    8 +-
 .../v2.7/user/examples/subscribe-only/index.html   |    8 +-
 zh/docs/v2.7/user/examples/thread-model/index.html |    8 +-
 zh/docs/v2.7/user/examples/tls/index.html          |    8 +-
 .../user/examples/token-authorization/index.html   |    8 +-
 zh/docs/v2.7/user/index.html                       |    8 +-
 zh/docs/v2.7/user/index.xml                        |   70 +-
 zh/docs/v2.7/user/languages/erlang/index.html      |    8 +-
 zh/docs/v2.7/user/languages/erlang/index.xml       |    8 +-
 .../user/languages/erlang/quick-start/index.html   |    8 +-
 .../user/languages/erlang/reference/index.html     |    8 +-
 .../user/languages/erlang/serialization/index.html |    8 +-
 .../v2.7/user/languages/erlang/service/index.html  |    8 +-
 zh/docs/v2.7/user/languages/index.html             |    8 +-
 zh/docs/v2.7/user/languages/index.xml              |    2 +-
 zh/docs/v2.7/user/maturity/index.html              |    8 +-
 .../v2.7/user/new-features-in-a-glance/index.html  |   12 +-
 zh/docs/v2.7/user/perf-test/index.html             |    8 +-
 zh/docs/v2.7/user/preface/architecture/index.html  |    8 +-
 zh/docs/v2.7/user/preface/background/index.html    |    8 +-
 zh/docs/v2.7/user/preface/index.html               |    8 +-
 zh/docs/v2.7/user/preface/index.xml                |   16 +-
 zh/docs/v2.7/user/preface/requirements/index.html  |    8 +-
 zh/docs/v2.7/user/preface/usage/index.html         |    8 +-
 zh/docs/v2.7/user/quick-start/index.html           |    8 +-
 zh/docs/v2.7/user/recommend/index.html             |    8 +-
 zh/docs/v2.7/user/references/api/index.html        |    8 +-
 zh/docs/v2.7/user/references/index.html            |    8 +-
 zh/docs/v2.7/user/references/index.xml             |   16 +-
 zh/docs/v2.7/user/references/maven/index.html      |    8 +-
 zh/docs/v2.7/user/references/metadata/index.html   |    8 +-
 .../v2.7/user/references/protocol/dubbo/index.html |    8 +-
 .../v2.7/user/references/protocol/grpc/index.html  |    8 +-
 .../user/references/protocol/hessian/index.html    |    8 +-
 .../v2.7/user/references/protocol/http/index.html  |    8 +-
 zh/docs/v2.7/user/references/protocol/index.html   |    8 +-
 zh/docs/v2.7/user/references/protocol/index.xml    |   22 +-
 .../user/references/protocol/memcached/index.html  |    8 +-
 .../v2.7/user/references/protocol/redis/index.html |    8 +-
 .../v2.7/user/references/protocol/rest/index.html  |    8 +-
 .../v2.7/user/references/protocol/rmi/index.html   |    8 +-
 .../user/references/protocol/thrift/index.html     |    8 +-
 .../user/references/protocol/webservice/index.html |    8 +-
 zh/docs/v2.7/user/references/qos/index.html        |    8 +-
 zh/docs/v2.7/user/references/registry/index.html   |    8 +-
 zh/docs/v2.7/user/references/registry/index.xml    |   20 +-
 .../user/references/registry/multicast/index.html  |    8 +-
 .../v2.7/user/references/registry/nacos/index.html |    8 +-
 .../v2.7/user/references/registry/redis/index.html |    8 +-
 .../user/references/registry/simple/index.html     |    8 +-
 .../user/references/registry/zookeeper/index.html  |    8 +-
 zh/docs/v2.7/user/references/telnet/index.html     |    8 +-
 .../references/xml/dubbo-application/index.html    |    8 +-
 .../user/references/xml/dubbo-argument/index.html  |    8 +-
 .../references/xml/dubbo-config-center/index.html  |    8 +-
 .../user/references/xml/dubbo-consumer/index.html  |    8 +-
 .../user/references/xml/dubbo-method/index.html    |    8 +-
 .../user/references/xml/dubbo-module/index.html    |    8 +-
 .../user/references/xml/dubbo-monitor/index.html   |    8 +-
 .../user/references/xml/dubbo-parameter/index.html |    8 +-
 .../user/references/xml/dubbo-protocol/index.html  |    8 +-
 .../user/references/xml/dubbo-provider/index.html  |    8 +-
 .../user/references/xml/dubbo-reference/index.html |    8 +-
 .../user/references/xml/dubbo-registry/index.html  |    8 +-
 .../user/references/xml/dubbo-service/index.html   |    8 +-
 zh/docs/v2.7/user/references/xml/index.html        |    8 +-
 zh/docs/v2.7/user/references/xml/index.xml         |   26 +-
 zh/docs/v2.7/user/rest/index.html                  |    8 +-
 zh/docs/v2.7/user/serialization/index.html         |    8 +-
 zh/docs/v2.7/user/simple-monitor/index.html        |    8 +-
 zh/docs/v2.7/user/versions/index.html              |    8 +-
 zh/docs/v2.7/user/versions/index.xml               |    2 +-
 zh/docs/v2.7/user/versions/version-270/index.html  |    8 +-
 zh/docs/v3.0/index.html                            |    8 +-
 zh/docs/v3.0/index.xml                             |    2 +-
 zh/index.html                                      |    2 +-
 zh/index.xml                                       |  620 +--
 zh/sitemap.xml                                     |    2 +-
 668 files changed, 76090 insertions(+), 4354 deletions(-)

diff --git a/en/404.html b/en/404.html
new file mode 100644
index 0000000..9733553
--- /dev/null
+++ b/en/404.html
@@ -0,0 +1,4 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+function newHref(path,newPath){var idx=originalHref.indexOf(path);var part1=originalHref.substring(0,idx);var part2="";if(idx+path.length<originalHref.length-1){part2=originalHref.substring(idx+path.length);}
+var newHref=part1+newPath+part2;if(newHref.endsWith('.html')){newHref=newHref.substr(0,newHref.length-5)+"/";}
+return newHref;}</script></main><footer class="bg-dark py-5 row d-print-none"><div class="container-fluid mx-sm-5"><div class=row><div class="col-6 col-sm-4 text-xs-center order-sm-2"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Dubbo mailing list archive" aria-label="Dubbo mailing list archive"><a class=text-white target=_blank rel="noopener noreferrer" href=https://lists.apache.org/list.html?dev@dubbo.apache.org><i clas [...]
\ No newline at end of file
diff --git a/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/index.html b/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/index.html
new file mode 100644
index 0000000..ad025cd
--- /dev/null
+++ b/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class=" [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/qcon-beijing-2018.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo%20roadmap%20is%20announced%20in%20QCon%20Beijing%202018" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>Dubbo roadmap is announced in QCon Beijing 2018</h1><div class=lead>This article will introduce y [...]
\ No newline at end of file
diff --git a/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/index.html b/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/index.html
new file mode 100644
index 0000000..d6f388c
--- /dev/null
+++ b/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/gsoc-2018.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+t [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20GSoC%28Google%20Summer%20of%20Code%29%202018" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>The GSoC(Google Summer of Code) 2018</h1><div class=lead>The GSoC(Google Summer of Code) 2018 pro [...]
\ No newline at end of file
diff --git a/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/index.html b/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/index.html
new file mode 100644
index 0000000..7200a5d
--- /dev/null
+++ b/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/apachecon-na-2018.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20ApacheCon%20NA%20schedule%20has%20been%20announced" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>The ApacheCon NA schedule has been announced</h1><div class=lead>This article will introduce you  [...]
\ No newline at end of file
diff --git a/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/index.html b/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/index.html
new file mode 100644
index 0000000..529744c
--- /dev/null
+++ b/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-meetup-beijing.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+secti [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20first%20Dubbo%20meetup%20has%20been%20held%20in%20Beijing" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>The first Dubbo meetup has been held in Beijing</h1><div class=lead>The first Dubbo meetup has be [...]
\ No newline at end of file
diff --git a/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/index.html b/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/index.html
new file mode 100644
index 0000000..f25ad47
--- /dev/null
+++ b/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-meetup-shanghai.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+sect [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20second%20Dubbo%20Shanghai%20meetup%20has%20been%20held%20successfully" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>The second Dubbo Shanghai meetup has been held successfully</h1><div class=lead>The second Dubbo  [...]
\ No newline at end of file
diff --git a/en/blog/2018/07/01/your-first-dubbo-filter/index.html b/en/blog/2018/07/01/your-first-dubbo-filter/index.html
new file mode 100644
index 0000000..85be413
--- /dev/null
+++ b/en/blog/2018/07/01/your-first-dubbo-filter/index.html
@@ -0,0 +1,194 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/first-dubbo-filter.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Your%20First%20Dubbo%20Filter" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>Your First Dubbo Filter</h1><div class=lead>This article will introduce you that how to implement [...]
+extension point, and the Filter interception will be executed during each call.</p><h4 id=extension-mechanism-of-dubbo-filter>Extension Mechanism of Dubbo Filter</h4><p>There are already about 20 Filters implemented in Dubbo. Their entry is ProtocolFilterWrapper, ProtocolFilterWrapper
+makes a Wrapper on Protocol and will be loaded when the extension is loaded. Then, let&rsquo;s see how
+the Filter chain is constructed.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#586e75>//ProtocolFilterWrapper.java
+</span><span style=color:#586e75></span><span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>refer</span><span style=color:#719e07>(</span>Class<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> type<span style=color:#719e07>,</span> URL url<span style=color:#719e07>)</span> <span style=color:# [...]
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>Constants<span style=color:#719e07>.</span>REGISTRY_PROTOCOL<span style=color:#719e07>.</span>equals<span style=color:#719e07>(</span>url<span style=color:#719e07>.</span>getProtocol<span style=color:#719e07>()))</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>return</span> protocol<span style=color:#719e07>.</span>refer<span style=color:#719e07>(</span>type<span style=color:#719e07>,</span> url<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> buildInvokerChain<span style=color:#719e07>(</span>protocol<span style=color:#719e07>.</span>refer<span style=color:#719e07>(</span>type<span style=color:#719e07>,</span> url<span style=color:#719e07>),</span> Constants<span style=color:#719e07>.</span>REFERENCE_FILTER_KEY<span style=color:#719e07>,</span> Constants<span style=color:#719e07>.</span>CONSUMER<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+    
+    <span style=color:#268bd2>private</span> <span style=color:#268bd2>static</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>buildInvokerChain</span><span style=color:#719e07>(</span><span style=color:#268bd2>final</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker<span style=color:#719e07>,</span>  [...]
+        Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> last <span style=color:#719e07>=</span> invoker<span style=color:#719e07>;</span>
+        List<span style=color:#719e07>&lt;</span>Filter<span style=color:#719e07>&gt;</span> filters <span style=color:#719e07>=</span> ExtensionLoader<span style=color:#719e07>.</span>getExtensionLoader<span style=color:#719e07>(</span>Filter<span style=color:#719e07>.</span>class<span style=color:#719e07>).</span>getActivateExtension<span style=color:#719e07>(</span>invoker<span style=color:#719e07>.</span>getUrl<span style=color:#719e07>(),</span> key<span style=color:#719e07>,</span> [...]
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>filters<span style=color:#719e07>.</span>size<span style=color:#719e07>()</span> <span style=color:#719e07>&gt;</span> 0<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>for</span> <span style=color:#719e07>(</span><span style=color:#dc322f>int</span> i <span style=color:#719e07>=</span> filters<span style=color:#719e07>.</span>size<span style=color:#719e07>()</span> <span style=color:#719e07>-</span> 1<span style=color:#719e07>;</span> i <span style=color:#719e07>&gt;=</span> 0<span style=color:#719e07>;</span> i <span style=color:#719e07>--)</span> <span style=color:#719e07>{</span>
+                <span style=color:#268bd2>final</span> Filter filter <span style=color:#719e07>=</span> filters<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>i<span style=color:#719e07>);</span>
+                <span style=color:#268bd2>final</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> next <span style=color:#719e07>=</span> last<span style=color:#719e07>;</span>
+                last <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;()</span> <span style=color:#719e07>{</span>
+
+                    <span style=color:#268bd2>public</span> Class<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>getInterface</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                        <span style=color:#719e07>return</span> invoker<span style=color:#719e07>.</span>getInterface<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+
+                    <span style=color:#268bd2>public</span> URL <span style=color:#268bd2>getUrl</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                        <span style=color:#719e07>return</span> invoker<span style=color:#719e07>.</span>getUrl<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+
+                    <span style=color:#268bd2>public</span> <span style=color:#dc322f>boolean</span> <span style=color:#268bd2>isAvailable</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                        <span style=color:#719e07>return</span> invoker<span style=color:#719e07>.</span>isAvailable<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+
+                    <span style=color:#268bd2>public</span> Result <span style=color:#268bd2>invoke</span><span style=color:#719e07>(</span>Invocation invocation<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> RpcException <span style=color:#719e07>{</span>
+                        <span style=color:#719e07>return</span> filter<span style=color:#719e07>.</span>invoke<span style=color:#719e07>(</span>next<span style=color:#719e07>,</span> invocation<span style=color:#719e07>);</span>
+                    <span style=color:#719e07>}</span>
+
+                    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>destroy</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                        invoker<span style=color:#719e07>.</span>destroy<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+
+                    <span style=color:#268bd2>@Override</span>
+                    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>toString</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                        <span style=color:#719e07>return</span> invoker<span style=color:#719e07>.</span>toString<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+                <span style=color:#719e07>};</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> last<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+</code></pre></div><h4 id=activation-mechanism-of-dubbo-filter>Activation Mechanism of Dubbo Filter</h4><p>Through the above code we can see that, in the method buildInvokerChain, first get all
+activated chains, the chain here is already sorted. Then construct a call chain of Filter
+through the Invoker, finally the constructed call chain can be roughly expressed as: Filter1->Filter2->Filter3->&mldr;&mldr;->Invoker,
+now let&rsquo;s see the detailed flow of the activated chain in the above step.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>    <span style=color:#268bd2>public</span> List<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>getActivateExtension</span><span style=color:#719e07>(</span>URL url<span style=color:#719e07>,</span> Str [...]
+        String value <span style=color:#719e07>=</span> url<span style=color:#719e07>.</span>getParameter<span style=color:#719e07>(</span>key<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> getActivateExtension<span style=color:#719e07>(</span>url<span style=color:#719e07>,</span> value <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>||</span> value<span style=color:#719e07>.</span>length<span style=color:#719e07>()</span> <span style=color:#719e07>==</span> 0 <span style=color:#719e07>?</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>:</span> Constants [...]
+    <span style=color:#719e07>}</span>
+    
+    <span style=color:#268bd2>public</span> List<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>getActivateExtension</span><span style=color:#719e07>(</span>URL url<span style=color:#719e07>,</span> String<span style=color:#719e07>[]</span> values<span style=color:#719e07>,</span> String group<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        List<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> exts <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;();</span>
+        
+        List<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> names <span style=color:#719e07>=</span> values <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>?</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;(</span>0<span style=color:#719e07>)</span> <span style=color:#719e07>:</span> Arrays<span style=color:#719e07>.</span>asLi [...]
+
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(!</span> names<span style=color:#719e07>.</span>contains<span style=color:#719e07>(</span>Constants<span style=color:#719e07>.</span>REMOVE_VALUE_PREFIX <span style=color:#719e07>+</span> Constants<span style=color:#719e07>.</span>DEFAULT_KEY<span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+            getExtensionClasses<span style=color:#719e07>();</span>
+            <span style=color:#719e07>for</span> <span style=color:#719e07>(</span>Map<span style=color:#719e07>.</span>Entry<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Activate<span style=color:#719e07>&gt;</span> entry <span style=color:#719e07>:</span> cachedActivates<span style=color:#719e07>.</span>entrySet<span style=color:#719e07>())</span> <span style=color:#719e07>{</span>
+                String name <span style=color:#719e07>=</span> entry<span style=color:#719e07>.</span>getKey<span style=color:#719e07>();</span>
+                Activate activate <span style=color:#719e07>=</span> entry<span style=color:#719e07>.</span>getValue<span style=color:#719e07>();</span>
+                <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>isMatchGroup<span style=color:#719e07>(</span>group<span style=color:#719e07>,</span> activate<span style=color:#719e07>.</span>group<span style=color:#719e07>()))</span> <span style=color:#719e07>{</span>
+                    T ext <span style=color:#719e07>=</span> getExtension<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+                    <span style=color:#719e07>if</span> <span style=color:#719e07>(!</span> names<span style=color:#719e07>.</span>contains<span style=color:#719e07>(</span>name<span style=color:#719e07>)</span> <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>!</span> names<span style=color:#719e07>.</span>contains<span style=color:#719e07>(</span>Constants<span style=color:#719e07>.</span>REMOVE_VALUE_PREFIX <span style=color:#719e07>+</span> name<span style=color: [...]
+                            <span style=color:#719e07>&amp;&amp;</span> isActive<span style=color:#719e07>(</span>activate<span style=color:#719e07>,</span> url<span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+                        exts<span style=color:#719e07>.</span>add<span style=color:#719e07>(</span>ext<span style=color:#719e07>);</span>
+                    <span style=color:#719e07>}</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>
+            Collections<span style=color:#719e07>.</span>sort<span style=color:#719e07>(</span>exts<span style=color:#719e07>,</span> ActivateComparator<span style=color:#719e07>.</span>COMPARATOR<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        List<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> usrs <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;();</span>
+        <span style=color:#719e07>for</span> <span style=color:#719e07>(</span><span style=color:#dc322f>int</span> i <span style=color:#719e07>=</span> 0<span style=color:#719e07>;</span> i <span style=color:#719e07>&lt;</span> names<span style=color:#719e07>.</span>size<span style=color:#719e07>();</span> i <span style=color:#719e07>++)</span> <span style=color:#719e07>{</span>
+            String name <span style=color:#719e07>=</span> names<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>i<span style=color:#719e07>);</span>
+            <span style=color:#719e07>if</span> <span style=color:#719e07>(!</span> name<span style=color:#719e07>.</span>startsWith<span style=color:#719e07>(</span>Constants<span style=color:#719e07>.</span>REMOVE_VALUE_PREFIX<span style=color:#719e07>)</span>
+                    <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>!</span> names<span style=color:#719e07>.</span>contains<span style=color:#719e07>(</span>Constants<span style=color:#719e07>.</span>REMOVE_VALUE_PREFIX <span style=color:#719e07>+</span> name<span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+                           <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>Constants<span style=color:#719e07>.</span>DEFAULT_KEY<span style=color:#719e07>.</span>equals<span style=color:#719e07>(</span>name<span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+                    <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>usrs<span style=color:#719e07>.</span>size<span style=color:#719e07>()</span> <span style=color:#719e07>&gt;</span> 0<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                        exts<span style=color:#719e07>.</span>addAll<span style=color:#719e07>(</span>0<span style=color:#719e07>,</span> usrs<span style=color:#719e07>);</span>
+                        usrs<span style=color:#719e07>.</span>clear<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+                <span style=color:#719e07>}</span> <span style=color:#719e07>else</span> <span style=color:#719e07>{</span>
+                    T ext <span style=color:#719e07>=</span> getExtension<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+                    usrs<span style=color:#719e07>.</span>add<span style=color:#719e07>(</span>ext<span style=color:#719e07>);</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>usrs<span style=color:#719e07>.</span>size<span style=color:#719e07>()</span> <span style=color:#719e07>&gt;</span> 0<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            exts<span style=color:#719e07>.</span>addAll<span style=color:#719e07>(</span>usrs<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> exts<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><p>Through the above code we can see that, some of the Filters configured by the user are activated by default,
+and some need to be activated by the configuration file. The loading order of all Filters is to process Dubbo&rsquo;s
+default Filter first, and then to process the Filter defined by the user. With the &ldquo;-&rdquo; configuration, Dubbo&rsquo;s defualt Filter
+can be replaced, with this configuration, the user can flexibly replace or modify the Filter&rsquo;s load order.</p><h4 id=built-in-filter-of-dubbo>Built-in Filter of Dubbo</h4><p>Dubbo has lots of built-in Filter. RpcContext, accesslog and other functions can be implemented by Dubbo.
+Now let&rsquo;s see the ConsumerContextFilter which used by the Consumer side for context delivery:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> Result <span style=color:#268bd2>invoke</span><span style=color:#719e07>(</span>Invoker<span style=color:#719e07>&lt;?&gt;</span> invoker<span style=color:#719e07>,</span> Invocation invocation<sp [...]
+        RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>()</span>
+                <span style=color:#719e07>.</span>setInvoker<span style=color:#719e07>(</span>invoker<span style=color:#719e07>)</span>
+                <span style=color:#719e07>.</span>setInvocation<span style=color:#719e07>(</span>invocation<span style=color:#719e07>)</span>
+                <span style=color:#719e07>.</span>setLocalAddress<span style=color:#719e07>(</span>NetUtils<span style=color:#719e07>.</span>getLocalHost<span style=color:#719e07>(),</span> 0<span style=color:#719e07>)</span>
+                <span style=color:#719e07>.</span>setRemoteAddress<span style=color:#719e07>(</span>invoker<span style=color:#719e07>.</span>getUrl<span style=color:#719e07>().</span>getHost<span style=color:#719e07>(),</span> 
+                                  invoker<span style=color:#719e07>.</span>getUrl<span style=color:#719e07>().</span>getPort<span style=color:#719e07>());</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>invocation <span style=color:#719e07>instanceof</span> RpcInvocation<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>((</span>RpcInvocation<span style=color:#719e07>)</span>invocation<span style=color:#719e07>).</span>setInvoker<span style=color:#719e07>(</span>invoker<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>return</span> invoker<span style=color:#719e07>.</span>invoke<span style=color:#719e07>(</span>invocation<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span> <span style=color:#719e07>finally</span> <span style=color:#719e07>{</span>
+            RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>().</span>clearAttachments<span style=color:#719e07>();</span>
+        <span style=color:#719e07>}</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><p>This Filter records the state information during call, and passes the attachments parameter set
+by the client to the server through the invocation object, and these parameters will be cleared
+after the call is completed, which is why the request status information can be recorded by times
+and delivered.</p><h4 id=implement-a-dubbo-filter>Implement A Dubbo Filter</h4><p>Because of Dubbo&rsquo;s flexible design and good scalability, we can implement business logic
+in the call chain by implementing our own Dubbo Filter, such as time-consuming statistics, monitor information statistics, etc.
+Now, let&rsquo;s implement a simple Filter:</p><p>Maven project structure:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>src
+ |-main
+    |-java
+        |-com
+            |-xxx
+                |-XxxFilter.java (impelement Filter interface)
+    |-resources
+        |-META-INF
+            |-dubbo
+                |-com.alibaba.dubbo.rpc.Filter (Plain text file with content:xxx=com.xxx.XxxFilter)
+</code></pre></div><p>XxxFilter.java:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>XxxFilter</span> <span style=color:#268bd2>implements</span> Filter <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> Result <span style=color:#268bd2>invoke</span><span style=color:#719e07>(</span>Invoker<span style=color:#719e07>&lt;?&gt;</span> invoker<span style=color:#719e07>,</span> Invocation invocation<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> RpcException <span style=color:#719e07>{</span>
+        <span style=color:#586e75>// before filter ...
+</span><span style=color:#586e75></span>        Result result <span style=color:#719e07>=</span> invoker<span style=color:#719e07>.</span>invoke<span style=color:#719e07>(</span>invocation<span style=color:#719e07>);</span>
+        <span style=color:#586e75>// after filter ...
+</span><span style=color:#586e75></span>        <span style=color:#719e07>return</span> result<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>META-INF/dubbo/com.alibaba.dubbo.rpc.Filter:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>xxx=com.xxx.XxxFilter
+</code></pre></div><p>configure in xml as:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#586e75>&lt;!-- Consumer call process interception --&gt;</span>
+<span style=color:#268bd2>&lt;dubbo:reference</span> filter=<span style=color:#2aa198>&#34;xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
+<span style=color:#586e75>&lt;!-- Consumer call process default interception,intercept all reference --&gt;</span>
+<span style=color:#268bd2>&lt;dubbo:consumer</span> filter=<span style=color:#2aa198>&#34;xxx&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#586e75>&lt;!-- Provider call process interception --&gt;</span>
+<span style=color:#268bd2>&lt;dubbo:service</span> filter=<span style=color:#2aa198>&#34;xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
+<span style=color:#586e75>&lt;!-- Provider call process default interception,intercept all service --&gt;</span>
+<span style=color:#268bd2>&lt;dubbo:provider</span> filter=<span style=color:#2aa198>&#34;xxx&#34;</span><span style=color:#268bd2>/&gt;</span>
+</code></pre></div><p>or use annotation as:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@Activate</span><span style=color:#719e07>(</span>group <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;consumer&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>XxxFilter</span> <span style=color:#268bd2>implements</span> Filter <span style=color:#719e07>{</span>
+    <span style=color:#586e75>// ...
+</span><span style=color:#586e75></span><span style=color:#719e07>}</span>
+</code></pre></div><p>Using xml configuration is more flexible and granular.</p><p>In before and after, you can implement your own business logic to give the filter a certain function.
+Once written and configured, the filter is activated by the Dubbo and executed in the call chain.</p><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/07/12/tracking-with-pinpoint/ class="btn btn-primary">Next <span class=ml-1>→</span></a></li></ul></div></main></div></div> [...]
\ No newline at end of file
diff --git a/en/blog/2018/07/12/tracking-with-pinpoint/index.html b/en/blog/2018/07/12/tracking-with-pinpoint/index.html
new file mode 100644
index 0000000..bad7130
--- /dev/null
+++ b/en/blog/2018/07/12/tracking-with-pinpoint/index.html
@@ -0,0 +1,310 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/pinpoint.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+to [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Tracking%20with%20Pinpoint" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#what-is-pinpoint>What is Pinpoint</a><ul><li><a href=#servermap>ServerMap</a></li><li><a href=#realtime-active-thread-chart>Realtime Active Thread Chart</a></li><li><a href=#requestresponse-scatter-chart>Request/Response Scatter Chart</a></li><li><a href=#callstack>CallStack</a></li><li><a href=#inspector>Inspector</a></ [...]
+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 id=servermap>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 id=realtime-active-thread-chart>Realtime Active Thread Chart</h3><p>Monitor active threads inside applications in real-time.</p><h3 id=requestrespons [...]
+<span style=color:#268bd2>&lt;project</span> xmlns=<span style=color:#2aa198>&#34;http://maven.apache.org/POM/4.0.0&#34;</span>
+         xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+         xsi:schemaLocation=<span style=color:#2aa198>&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;</span><span style=color:#268bd2>&gt;</span>
+    <span style=color:#268bd2>&lt;modelVersion&gt;</span>4.0.0<span style=color:#268bd2>&lt;/modelVersion&gt;</span>
+
+    <span style=color:#268bd2>&lt;groupId&gt;</span>com.example<span style=color:#268bd2>&lt;/groupId&gt;</span>
+    <span style=color:#268bd2>&lt;artifactId&gt;</span>demo-api<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+    <span style=color:#268bd2>&lt;version&gt;</span>0.0.1-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+<span style=color:#268bd2>&lt;/project&gt;</span>
+</code></pre></div><p>Create API interface:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-go data-lang=go><span style=color:#719e07>package</span> com.example.demoapi;
+
+public <span style=color:#268bd2>interface</span> HelloService {
+    String <span style=color:#268bd2>sayHello</span>(String name);
+}
+</code></pre></div><h4 id=dubbo-provider>Dubbo provider</h4><p>pom.xml</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#719e07>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
+<span style=color:#268bd2>&lt;project</span> xmlns=<span style=color:#2aa198>&#34;http://maven.apache.org/POM/4.0.0&#34;</span> xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+	xsi:schemaLocation=<span style=color:#2aa198>&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;</span><span style=color:#268bd2>&gt;</span>
+	<span style=color:#268bd2>&lt;modelVersion&gt;</span>4.0.0<span style=color:#268bd2>&lt;/modelVersion&gt;</span>
+
+	<span style=color:#268bd2>&lt;groupId&gt;</span>com.example<span style=color:#268bd2>&lt;/groupId&gt;</span>
+	<span style=color:#268bd2>&lt;artifactId&gt;</span>demo-provider<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+	<span style=color:#268bd2>&lt;version&gt;</span>0.0.1-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+	<span style=color:#268bd2>&lt;packaging&gt;</span>jar<span style=color:#268bd2>&lt;/packaging&gt;</span>
+
+	<span style=color:#268bd2>&lt;name&gt;</span>demo-provider<span style=color:#268bd2>&lt;/name&gt;</span>
+
+	<span style=color:#268bd2>&lt;parent&gt;</span>
+		<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+		<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-starter-parent<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+		<span style=color:#268bd2>&lt;version&gt;</span>2.0.3.RELEASE<span style=color:#268bd2>&lt;/version&gt;</span>
+		<span style=color:#268bd2>&lt;relativePath/&gt;</span> <span style=color:#586e75>&lt;!-- lookup parent from repository --&gt;</span>
+	<span style=color:#268bd2>&lt;/parent&gt;</span>
+
+	<span style=color:#268bd2>&lt;properties&gt;</span>
+		<span style=color:#268bd2>&lt;project.build.sourceEncoding&gt;</span>UTF-8<span style=color:#268bd2>&lt;/project.build.sourceEncoding&gt;</span>
+		<span style=color:#268bd2>&lt;project.reporting.outputEncoding&gt;</span>UTF-8<span style=color:#268bd2>&lt;/project.reporting.outputEncoding&gt;</span>
+		<span style=color:#268bd2>&lt;java.version&gt;</span>1.8<span style=color:#268bd2>&lt;/java.version&gt;</span>
+	<span style=color:#268bd2>&lt;/properties&gt;</span>
+
+	<span style=color:#268bd2>&lt;repositories&gt;</span>
+		<span style=color:#268bd2>&lt;repository&gt;</span>
+			<span style=color:#268bd2>&lt;id&gt;</span>sonatype-nexus-snapshots<span style=color:#268bd2>&lt;/id&gt;</span>
+			<span style=color:#268bd2>&lt;url&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span style=color:#268bd2>&lt;/url&gt;</span>
+			<span style=color:#268bd2>&lt;releases&gt;</span>
+				<span style=color:#268bd2>&lt;enabled&gt;</span>false<span style=color:#268bd2>&lt;/enabled&gt;</span>
+			<span style=color:#268bd2>&lt;/releases&gt;</span>
+			<span style=color:#268bd2>&lt;snapshots&gt;</span>
+				<span style=color:#268bd2>&lt;enabled&gt;</span>true<span style=color:#268bd2>&lt;/enabled&gt;</span>
+			<span style=color:#268bd2>&lt;/snapshots&gt;</span>
+		<span style=color:#268bd2>&lt;/repository&gt;</span>
+	<span style=color:#268bd2>&lt;/repositories&gt;</span>
+
+	<span style=color:#268bd2>&lt;dependencies&gt;</span>
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-starter<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>com.alibaba.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>dubbo-spring-boot-starter<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;version&gt;</span>0.2.0<span style=color:#268bd2>&lt;/version&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>com.example<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>demo-api<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;version&gt;</span>0.0.1-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-starter-test<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;scope&gt;</span>test<span style=color:#268bd2>&lt;/scope&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+	<span style=color:#268bd2>&lt;/dependencies&gt;</span>
+
+	<span style=color:#268bd2>&lt;build&gt;</span>
+		<span style=color:#268bd2>&lt;plugins&gt;</span>
+			<span style=color:#268bd2>&lt;plugin&gt;</span>
+				<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+				<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-maven-plugin<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;/plugin&gt;</span>
+		<span style=color:#268bd2>&lt;/plugins&gt;</span>
+	<span style=color:#268bd2>&lt;/build&gt;</span>
+
+<span style=color:#268bd2>&lt;/project&gt;</span>
+</code></pre></div><ol><li><code>HelloService</code> interface:</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> com.example.demoprovider.provider<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> com.alibaba.dubbo.config.annotation.Service<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> com.example.demoapi.HelloService<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>@Service</span><span style=color:#719e07>(</span>version <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${demo.service.version}&#34;</span><span style=color:#719e07>,</span>
+        application <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${dubbo.application.id}&#34;</span><span style=color:#719e07>,</span>
+        protocol <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${dubbo.protocol.id}&#34;</span><span style=color:#719e07>,</span>
+        registry <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${dubbo.registry.id}&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>HelloServiceImpl</span> <span style=color:#268bd2>implements</span> HelloService <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>static</span> <span style=color:#dc322f>int</span> i <span style=color:#719e07>=</span> 0<span style=color:#719e07>;</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        i<span style=color:#719e07>++;</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>i <span style=color:#719e07>%</span> 3 <span style=color:#719e07>==</span> 0<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> RuntimeException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;ex&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;Hello &#34;</span> <span style=color:#719e07>+</span> name <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;!&#34;</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><ol start=2><li>Spring Boot bootstrap:</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> com.example.demoprovider<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.boot.SpringApplication<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.boot.autoconfigure.SpringBootApplication<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>@SpringBootApplication</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoProviderApplication</span> <span style=color:#719e07>{</span>
+
+	<span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+		SpringApplication<span style=color:#719e07>.</span>run<span style=color:#719e07>(</span>DemoProviderApplication<span style=color:#719e07>.</span>class<span style=color:#719e07>,</span> args<span style=color:#719e07>);</span>
+	<span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><ol start=3><li><code>application.properties</code>:</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback># 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></div><h4 id=dubbo-consumer>Dubbo consumer</h4><p>pom.xml</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#719e07>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
+<span style=color:#268bd2>&lt;project</span> xmlns=<span style=color:#2aa198>&#34;http://maven.apache.org/POM/4.0.0&#34;</span> xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+	xsi:schemaLocation=<span style=color:#2aa198>&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;</span><span style=color:#268bd2>&gt;</span>
+	<span style=color:#268bd2>&lt;modelVersion&gt;</span>4.0.0<span style=color:#268bd2>&lt;/modelVersion&gt;</span>
+
+	<span style=color:#268bd2>&lt;groupId&gt;</span>com.example<span style=color:#268bd2>&lt;/groupId&gt;</span>
+	<span style=color:#268bd2>&lt;artifactId&gt;</span>demo-consumer<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+	<span style=color:#268bd2>&lt;version&gt;</span>0.0.1-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+	<span style=color:#268bd2>&lt;packaging&gt;</span>jar<span style=color:#268bd2>&lt;/packaging&gt;</span>
+
+	<span style=color:#268bd2>&lt;name&gt;</span>demo-consumer<span style=color:#268bd2>&lt;/name&gt;</span>
+
+	<span style=color:#268bd2>&lt;parent&gt;</span>
+		<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+		<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-starter-parent<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+		<span style=color:#268bd2>&lt;version&gt;</span>2.0.3.RELEASE<span style=color:#268bd2>&lt;/version&gt;</span>
+		<span style=color:#268bd2>&lt;relativePath/&gt;</span> <span style=color:#586e75>&lt;!-- lookup parent from repository --&gt;</span>
+	<span style=color:#268bd2>&lt;/parent&gt;</span>
+
+	<span style=color:#268bd2>&lt;properties&gt;</span>
+		<span style=color:#268bd2>&lt;project.build.sourceEncoding&gt;</span>UTF-8<span style=color:#268bd2>&lt;/project.build.sourceEncoding&gt;</span>
+		<span style=color:#268bd2>&lt;project.reporting.outputEncoding&gt;</span>UTF-8<span style=color:#268bd2>&lt;/project.reporting.outputEncoding&gt;</span>
+		<span style=color:#268bd2>&lt;java.version&gt;</span>1.8<span style=color:#268bd2>&lt;/java.version&gt;</span>
+	<span style=color:#268bd2>&lt;/properties&gt;</span>
+
+	<span style=color:#268bd2>&lt;repositories&gt;</span>
+		<span style=color:#268bd2>&lt;repository&gt;</span>
+			<span style=color:#268bd2>&lt;id&gt;</span>sonatype-nexus-snapshots<span style=color:#268bd2>&lt;/id&gt;</span>
+			<span style=color:#268bd2>&lt;url&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span style=color:#268bd2>&lt;/url&gt;</span>
+			<span style=color:#268bd2>&lt;releases&gt;</span>
+				<span style=color:#268bd2>&lt;enabled&gt;</span>false<span style=color:#268bd2>&lt;/enabled&gt;</span>
+			<span style=color:#268bd2>&lt;/releases&gt;</span>
+			<span style=color:#268bd2>&lt;snapshots&gt;</span>
+				<span style=color:#268bd2>&lt;enabled&gt;</span>true<span style=color:#268bd2>&lt;/enabled&gt;</span>
+			<span style=color:#268bd2>&lt;/snapshots&gt;</span>
+		<span style=color:#268bd2>&lt;/repository&gt;</span>
+	<span style=color:#268bd2>&lt;/repositories&gt;</span>
+
+	<span style=color:#268bd2>&lt;dependencies&gt;</span>
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-starter-web<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>com.alibaba.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>dubbo-spring-boot-starter<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;version&gt;</span>0.2.0<span style=color:#268bd2>&lt;/version&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>com.example<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>demo-api<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;version&gt;</span>0.0.1-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+
+		<span style=color:#268bd2>&lt;dependency&gt;</span>
+			<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+			<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-starter-test<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+			<span style=color:#268bd2>&lt;scope&gt;</span>test<span style=color:#268bd2>&lt;/scope&gt;</span>
+		<span style=color:#268bd2>&lt;/dependency&gt;</span>
+	<span style=color:#268bd2>&lt;/dependencies&gt;</span>
+
+	<span style=color:#268bd2>&lt;build&gt;</span>
+		<span style=color:#268bd2>&lt;plugins&gt;</span>
+			<span style=color:#268bd2>&lt;plugin&gt;</span>
+				<span style=color:#268bd2>&lt;groupId&gt;</span>org.springframework.boot<span style=color:#268bd2>&lt;/groupId&gt;</span>
+				<span style=color:#268bd2>&lt;artifactId&gt;</span>spring-boot-maven-plugin<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+				<span style=color:#268bd2>&lt;configuration&gt;</span>
+					<span style=color:#268bd2>&lt;classifier&gt;</span>exec<span style=color:#268bd2>&lt;/classifier&gt;</span>
+				<span style=color:#268bd2>&lt;/configuration&gt;</span>
+			<span style=color:#268bd2>&lt;/plugin&gt;</span>
+		<span style=color:#268bd2>&lt;/plugins&gt;</span>
+	<span style=color:#268bd2>&lt;/build&gt;</span>
+
+<span style=color:#268bd2>&lt;/project&gt;</span>
+</code></pre></div><ol><li><code>@Reference</code> injection <code>HelloService</code></li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> com.example.democonsumer.controller<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> com.alibaba.dubbo.config.annotation.Reference<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> com.example.demoapi.HelloService<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.web.bind.annotation.RequestMapping<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.web.bind.annotation.RequestParam<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.web.bind.annotation.RestController<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>@RestController</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoConsumerController</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Reference</span><span style=color:#719e07>(</span>version <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${demo.service.version}&#34;</span><span style=color:#719e07>,</span>
+            application <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${dubbo.application.id}&#34;</span><span style=color:#719e07>,</span>
+            url <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;dubbo://&lt;Real IP Address&gt;:12345&#34;</span><span style=color:#719e07>)</span>
+    <span style=color:#268bd2>private</span> HelloService helloService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@RequestMapping</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;/sayHello&#34;</span><span style=color:#719e07>)</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span><span style=color:#268bd2>@RequestParam</span> String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> helloService<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><ol start=2><li>Spring Boot bootstrap:</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> com.example.democonsumer<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.boot.SpringApplication<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.boot.autoconfigure.SpringBootApplication<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>@SpringBootApplication</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoConsumerApplication</span> <span style=color:#719e07>{</span>
+
+	<span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+		SpringApplication<span style=color:#719e07>.</span>run<span style=color:#719e07>(</span>DemoConsumerApplication<span style=color:#719e07>.</span>class<span style=color:#719e07>,</span> args<span style=color:#719e07>);</span>
+	<span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><ol start=3><li><code>application.properties</code>:</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback># 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></div><h3 id=using-pinpoint-agent-to-start-dubbo-provider-and-dubbo-consumer>Using Pinpoint-agent to start <code>Dubbo provider</code> and <code>Dubbo consumer</code></h3><ol><li>Maven clean package</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>mvn clean package
+</code></pre></div><ol start=2><li>Start provider</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>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></div><ol start=3><li>Start consumer</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>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></div><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 id=using-pinpoint-locate-problems>Using Pinpoint locate problems</h2><h3 id=homepage>Homepage</h3><p><img src=/imgs/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>< [...]
\ No newline at end of file
diff --git a/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/index.html b/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/index.html
new file mode 100644
index 0000000..539c275
--- /dev/null
+++ b/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/index.html
@@ -0,0 +1,54 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/sentinel-introduction-for-dubbo.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matt [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Sentinel:%20The%20flow%20sentinel%20of%20Dubbo%20services" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#introduction-to-sentinel>Introduction to Sentinel</a></li><li><a href=#best-practice-for-using-dubbo-with-sentinel>Best Practice for using Dubbo with Sentinel</a><ul><li><a href=#service-provider>Service Provider</a></li><li><a href=#service-consumer>Service Consumer</a></li><li><a href=#sentinel-dashboard>Sentinel Dashb [...]
+    <span style=color:#268bd2>&lt;groupId&gt;</span>com.alibaba.csp<span style=color:#268bd2>&lt;/groupId&gt;</span>
+    <span style=color:#268bd2>&lt;artifactId&gt;</span>sentinel-dubbo-adapter<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+    <span style=color:#268bd2>&lt;version&gt;</span>x.y.z<span style=color:#268bd2>&lt;/version&gt;</span>
+<span style=color:#268bd2>&lt;/dependency&gt;</span>
+</code></pre></div><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&rsquo;s flow control and guard ability when rules are configured. If you don&rsquo;t want to enable the filter, you can manually disable it. For example:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java da [...]
+<span style=color:#268bd2>public</span> ConsumerConfig <span style=color:#268bd2>consumerConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+    ConsumerConfig consumerConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ConsumerConfig<span style=color:#719e07>();</span>
+    consumerConfig<span style=color:#719e07>.</span>setFilter<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;-sentinel.dubbo.consumer.filter&#34;</span><span style=color:#719e07>);</span>
+    <span style=color:#719e07>return</span> consumerConfig<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>We&rsquo;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 id=service-provider>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 prov [...]
+</code></pre></div><p>Log messages will also appear in provider&rsquo;s metric log:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>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></div><p>In many circumstances, it&rsquo;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&rsqu [...]
+</code></pre></div><p>The <code>demo-consumer</code> in the log is the caller name (origin).</p><h3 id=service-consumer>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 [...]
+</code></pre></div><p>After launching the service provider demo, we can find our application in the Sentinel dashboard. It&rsquo;s convenient to configure the rules in the dashboard:</p><p><img src=/imgs/blog/sentinel-dashboard-view-rules.png alt="Rule List"></p><p>Or view real-time metrics:</p><p><img src=/imgs/blog/sentinel-dashboard-metrics.png alt="Real-time metrics monitoring"></p><h2 id=summary>Summary</h2><p>This blog post only introduces the simplest scenario in Sentinel - Traffi [...]
\ No newline at end of file
diff --git a/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/index.html b/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/index.html
new file mode 100644
index 0000000..3f05c8a
--- /dev/null
+++ b/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-meetup-shenzhen.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+sect [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20third%20Dubbo%20meetup%20has%20been%20held%20in%20Shenzhen" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>The third Dubbo meetup has been held in Shenzhen</h1><div class=lead>The third Dubbo meetup has b [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/07/dubbo-101/index.html b/en/blog/2018/08/07/dubbo-101/index.html
new file mode 100644
index 0000000..a1237fb
--- /dev/null
+++ b/en/blog/2018/08/07/dubbo-101/index.html
@@ -0,0 +1,173 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-101.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+t [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Your%20First%20Dubbo%20Demo" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#java-rmi-introduction>Java RMI Introduction</a><ul><li><a href=#java-rmi-work-flow>Java RMI Work Flow</a></li><li><a href=#java-rmi-concepts>Java RMI Concepts</a></li></ul></li><li><a href=#basic-concepts-of-dubbo>Basic Concepts of Dubbo</a></li><li><a href=#dubbo-applications-based-on-api>Dubbo Applications Based on API [...]
+</span><span style=color:#586e75></span>Hello stub <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>Hello<span style=color:#719e07>)</span> UnicastRemoteObject<span style=color:#719e07>.</span>exportObject<span style=color:#719e07>(</span>obj<span style=color:#719e07>,</span> 0<span style=color:#719e07>);</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>Registry registry <span style=color:#719e07>=</span> LocateRegistry<span style=color:#719e07>.</span>createRegistry<span style=color:#719e07>(</span>1099<span style=color:#719e07>);</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>registry<span style=color:#719e07>.</span>rebind<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Hello&#34;</span><span style=color:#719e07>,</span> stub<span style=color:#719e07>);</span> <span style=color:#586e75>// #4
+</span></code></pre></div><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 id=client-service-look-up>Client service [...]
+</span><span style=color:#586e75></span>Hello stub <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>Hello<span style=color:#719e07>)</span> registry<span style=color:#719e07>.</span>lookup<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Hello&#34;</span><span style=color:#719e07>);</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>String response <span style=color:#719e07>=</span> stub<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>();</span> <span style=color:#586e75>// #3
+</span></code></pre></div><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 id=basic-concepts-of-dubbo>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 rem [...]
+    String <span style=color:#268bd2>sayHi</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span><span style=color:#719e07>}</span>
+</code></pre></div><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 id=provide-contract-implementation>Provide Contract Implementation</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</sp [...]
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHi</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hi, &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>;</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 id=implement-dubbo-service-provider>Implement Dubbo Service Provider</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code c [...]
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException <span style=color:#719e07>{</span>
+        ServiceConfig<span style=color:#719e07>&lt;</span>GreetingsService<span style=color:#719e07>&gt;</span> service <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ServiceConfig<span style=color:#719e07>&lt;&gt;();</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>        service<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span><span style=color:#719e07>new</span> ApplicationConfig<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;first-dubbo-provider&#34;</span><span style=color:#719e07>));</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>        service<span style=color:#719e07>.</span>setRegistry<span style=color:#719e07>(</span><span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;multicast://224.5.6.7:1234&#34;</span><span style=color:#719e07>));</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>        service<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span>GreetingsService<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>        service<span style=color:#719e07>.</span>setRef<span style=color:#719e07>(</span><span style=color:#719e07>new</span> GreetingsServiceImpl<span style=color:#719e07>());</span> <span style=color:#586e75>// #5
+</span><span style=color:#586e75></span>        service<span style=color:#719e07>.</span>export<span style=color:#719e07>();</span> <span style=color:#586e75>// #6
+</span><span style=color:#586e75></span>        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span> <span style=color:#586e75>// #7
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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. [...]
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        ReferenceConfig<span style=color:#719e07>&lt;</span>GreetingsService<span style=color:#719e07>&gt;</span> reference <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ReferenceConfig<span style=color:#719e07>&lt;&gt;();</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>        reference<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span><span style=color:#719e07>new</span> ApplicationConfig<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;first-dubbo-client&#34;</span><span style=color:#719e07>));</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>        reference<span style=color:#719e07>.</span>setRegistry<span style=color:#719e07>(</span><span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;multicast://224.5.6.7:1234&#34;</span><span style=color:#719e07>));</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>        reference<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span>GreetingsService<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>        GreetingsService greetingsService <span style=color:#719e07>=</span> reference<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span> <span style=color:#586e75>// #5
+</span><span style=color:#586e75></span>        String message <span style=color:#719e07>=</span> greetingsService<span style=color:#719e07>.</span>sayHi<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;dubbo&#34;</span><span style=color:#719e07>);</span> <span style=color:#586e75>// #6
+</span><span style=color:#586e75></span>        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>message<span style=color:#719e07>);</span> <span style=color:#586e75>// #7
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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>ApplicationConfig</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 se [...]
+$ <span style=color:#b58900>cd</span> dubbo-samples/java/dubbo-samples-api/
+$ mvn clean package
+INFO<span style=color:#719e07>]</span> Scanning <span style=color:#719e07>for</span> projects...
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Building dubbo-samples-api 1.0-SNAPSHOT
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> --- maven-clean-plugin:2.5:clean <span style=color:#719e07>(</span>default-clean<span style=color:#719e07>)</span> @ dubbo-samples-api ---
+...
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> BUILD SUCCESS
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Total time: 2.182 s
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Finished at: 2018-05-28T14:56:08+08:00
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Final Memory: 20M/353M
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+</code></pre></div><p>The build is finished when it shows <code>BUILD SUCCESS</code>. Then comes the running stage.</p><h4 id=run-the-server>Run the server</h4><p>Run the service provider by the following maven command lines:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash>$ mvn -Djava.net.preferIPv4Stack<span style=color:#719e07>=</span><span style=color:#b58900>true</span> -Dexec [...]
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Scanning <span style=color:#719e07>for</span> projects...
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>                                                                         
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Building dubbo-samples-api 1.0-SNAPSHOT
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> --- exec-maven-plugin:1.6.0:java <span style=color:#719e07>(</span>default-cli<span style=color:#719e07>)</span> @ dubbo-samples-api ---
+log4j:WARN No appenders could be found <span style=color:#719e07>for</span> logger <span style=color:#719e07>(</span>org.apache.dubbo.common.logger.LoggerFactory<span style=color:#719e07>)</span>.
+log4j:WARN Please initialize the log4j system properly.
+log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig <span style=color:#719e07>for</span> more info.
+first-dubbo-provider is running.
+</code></pre></div><p>When <em>first-dubbo-provider is running</em> appears, the service provider is ready to be called by the client.</p><h4 id=run-the-client>Run the client</h4><p>Run the service consumer by the following maven command lines:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash>$ mvn -Djava.net.preferIPv4Stack<span style=color:#719e07>=</span><span style=color:#b58900 [...]
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Scanning <span style=color:#719e07>for</span> projects...
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>                                                                         
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Building dubbo-samples-api 1.0-SNAPSHOT
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
+<span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> --- exec-maven-plugin:1.6.0:java <span style=color:#719e07>(</span>default-cli<span style=color:#719e07>)</span> @ dubbo-samples-api ---
+log4j:WARN No appenders could be found <span style=color:#719e07>for</span> logger <span style=color:#719e07>(</span>org.apache.dubbo.common.logger.LoggerFactory<span style=color:#719e07>)</span>.
+log4j:WARN Please initialize the log4j system properly.
+log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig <span style=color:#719e07>for</span> more info.
+hi, dubbo
+</code></pre></div><p><code>hi, dubbo</code> is the execution results from service provider.</p><h2 id=quick-creation-of-a-dubbo-application>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>< [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoApplication</span> <span style=color:#719e07>{</span>
+	<span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+		<span style=color:#719e07>new</span> EmbeddedZooKeeper<span style=color:#719e07>(</span>2181<span style=color:#719e07>,</span> <span style=color:#cb4b16>false</span><span style=color:#719e07>).</span>start<span style=color:#719e07>();</span>  <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>		SpringApplication<span style=color:#719e07>.</span>run<span style=color:#719e07>(</span>DemoApplication<span style=color:#719e07>.</span>class<span style=color:#719e07>,</span> args<span style=color:#719e07>);</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>	<span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash>2018-05-28 16:59:38.072  INFO <span style=color:#2aa198>59943</span> --- <span style=color:#719e07>[</span>  [...]
+
+  ████████▄  ███    █▄  ▀█████████▄  ▀█████████▄   ▄██████▄  
+  ███   ▀███ ███    ███   ███    ███   ███    ███ ███    ███
+  ███    ███ ███    ███   ███    ███   ███    ███ ███    ███
+  ███    ███ ███    ███  ▄███▄▄▄██▀   ▄███▄▄▄██▀  ███    ███
+  ███    ███ ███    ███ ▀▀███▀▀▀██▄  ▀▀███▀▀▀██▄  ███    ███
+  ███    ███ ███    ███   ███    ██▄   ███    ██▄ ███    ███
+  ███   ▄███ ███    ███   ███    ███   ███    ███ ███    ███
+  ████████▀  ████████▀  ▄█████████▀  ▄█████████▀   ▀██████▀  
+
+
+ :: Dubbo Spring Boot <span style=color:#719e07>(</span>v0.1.0<span style=color:#719e07>)</span> : https://github.com/dubbo/dubbo-spring-boot-project
+ :: Dubbo <span style=color:#719e07>(</span>v2.0.1<span style=color:#719e07>)</span> : https://github.com/alibaba/dubbo
+ :: Google group : http://groups.google.com/group/dubbo
+
+2018-05-28 16:59:38.079  INFO <span style=color:#2aa198>59943</span> --- <span style=color:#719e07>[</span>           main<span style=color:#719e07>]</span> e.OverrideDubboConfigApplicationListener : Dubbo Config was overridden by externalized configuration <span style=color:#719e07>{</span>dubbo.application.name<span style=color:#719e07>=</span>dubbo-demo-server, dubbo.application.qosAcceptForeignIp<span style=color:#719e07>=</span>false, dubbo.application.qosEnable<span style=color:#71 [...]
+
+...
+
+2018-05-28 16:59:39.624  INFO <span style=color:#2aa198>59943</span> --- <span style=color:#719e07>[</span>           main<span style=color:#719e07>]</span> com.example.demo.DemoApplication         : Started DemoApplication in 1.746 seconds <span style=color:#719e07>(</span>JVM running <span style=color:#719e07>for</span> 2.963<span style=color:#719e07>)</span>
+</code></pre></div><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 id=manage-service-by-telnet>Manage service by Telnet</h3><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab- [...]
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is <span style=color:#2aa198>&#39;^]&#39;</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></div><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 id=summary>Summary</h2><p>In this tutorial, we start with RMI and introduce the basic concepts in Java distributed invocation [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/07/use-annotations-in-dubbo/index.html b/en/blog/2018/08/07/use-annotations-in-dubbo/index.html
new file mode 100644
index 0000000..7f7c85e
--- /dev/null
+++ b/en/blog/2018/08/07/use-annotations-in-dubbo/index.html
@@ -0,0 +1,231 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-annotation.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+a [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Use%20Annotations%20In%20Dubbo" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#introduce-annotations>Introduce Annotations</a><ul><li><a href=#enabledubbo>@EnableDubbo</a></li><li><a href=#service>@Service</a></li><li><a href=#reference>@Reference</a></li></ul></li><li><a href=#example-practice>Example practice</a><ul><li><a href=#1interface-definition>1.Interface Definition</a></li><li><a href=#2s [...]
+
+<span style=color:#268bd2>@EnableDubboConfig</span>
+<span style=color:#268bd2>@DubboComponentScan</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>@interface</span> EnableDubbo <span style=color:#719e07>{</span>
+    <span style=color:#586e75>/**
+</span><span style=color:#586e75>     * Base packages to scan for annotated @Service classes.
+</span><span style=color:#586e75>     * &lt;p&gt;
+</span><span style=color:#586e75>     * Use {@link #scanBasePackageClasses()} for a type-safe alternative to String-based
+</span><span style=color:#586e75>     * package names.
+</span><span style=color:#586e75>     *
+</span><span style=color:#586e75>     * @return the base packages to scan
+</span><span style=color:#586e75>     * @see DubboComponentScan#basePackages()
+</span><span style=color:#586e75>     */</span>
+    <span style=color:#268bd2>@AliasFor</span><span style=color:#719e07>(</span>annotation <span style=color:#719e07>=</span> DubboComponentScan<span style=color:#719e07>.</span>class<span style=color:#719e07>,</span> attribute <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;basePackages&#34;</span><span style=color:#719e07>)</span>
+    String<span style=color:#719e07>[]</span> <span style=color:#268bd2>scanBasePackages</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#719e07>{};</span>
+
+    <span style=color:#586e75>/**
+</span><span style=color:#586e75>     * Type-safe alternative to {@link #scanBasePackages()} for specifying the packages to
+</span><span style=color:#586e75>     * scan for annotated @Service classes. The package of each class specified will be
+</span><span style=color:#586e75>     * scanned.
+</span><span style=color:#586e75>     *
+</span><span style=color:#586e75>     * @return classes from the base packages to scan
+</span><span style=color:#586e75>     * @see DubboComponentScan#basePackageClasses
+</span><span style=color:#586e75>     */</span>
+    <span style=color:#268bd2>@AliasFor</span><span style=color:#719e07>(</span>annotation <span style=color:#719e07>=</span> DubboComponentScan<span style=color:#719e07>.</span>class<span style=color:#719e07>,</span> attribute <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;basePackageClasses&#34;</span><span style=color:#719e07>)</span>
+    Class<span style=color:#719e07>&lt;?&gt;[]</span> scanBasePackageClasses<span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#719e07>{};</span>    
+<span style=color:#719e07>}</span>
+</code></pre></div><p>The <code>@bableDubbo</code> can be used to scan Dubbo&rsquo;s service provider (marked by <code>@Service</code>) and Dubbo&rsquo;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&rsquo;s service providers and consumers have been scanned, they have been assembled corresponding and been initialized, and finally the  [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AnnotatedGreetingService</span> <span style=color:#268bd2>implements</span> GreetingService <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Via <code>@Service</code>&rsquo;s properties, you can customize Dubbo&rsquo;s Service provider:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.config.annotation<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>@Documented</span>
+<span style=color:#268bd2>@Retention</span><span style=color:#719e07>(</span>RetentionPolicy<span style=color:#719e07>.</span>RUNTIME<span style=color:#719e07>)</span>
+<span style=color:#268bd2>@Target</span><span style=color:#719e07>({</span>ElementType<span style=color:#719e07>.</span>TYPE<span style=color:#719e07>})</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span><span style=color:#268bd2>@Inherited</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>@interface</span> Service <span style=color:#719e07>{</span>
+    Class<span style=color:#719e07>&lt;?&gt;</span> interfaceClass<span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#dc322f>void</span><span style=color:#719e07>.</span>class<span style=color:#719e07>;</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>interfaceName</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>version</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>group</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #5
+</span><span style=color:#586e75></span>    <span style=color:#dc322f>boolean</span> <span style=color:#268bd2>export</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#cb4b16>true</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #6
+</span><span style=color:#586e75></span>    <span style=color:#dc322f>boolean</span> <span style=color:#268bd2>register</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#cb4b16>true</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #7
+</span><span style=color:#586e75></span>    
+    String <span style=color:#268bd2>application</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #8
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>module</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #9
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>provider</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #10
+</span><span style=color:#586e75></span>    String<span style=color:#719e07>[]</span> <span style=color:#268bd2>protocol</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#719e07>{};</span> <span style=color:#586e75>// #11
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>monitor</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #12
+</span><span style=color:#586e75></span>    String<span style=color:#719e07>[]</span> <span style=color:#268bd2>registry</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#719e07>{};</span> <span style=color:#586e75>// #13
+</span><span style=color:#586e75></span><span style=color:#719e07>}</span>
+</code></pre></div><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>&rsquo;s class implemented by the service provider</li><li><strong>interfaceName</strong>: specified <code>interface</code>&rsquo;s class name implemented by the service provider</li><li><strong>version</strong>: specified the version number of the service</li><li><strong>group</st [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingServiceConsumer</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Reference</span>
+    <span style=color:#268bd2>private</span> GreetingService greetingService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>doSayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> greetingService<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Via <code>@Reference</code>&rsquo;s properties, you can customize Dubbo&rsquo;s Service consumer:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=color:#719e07>package</span> org.apache.dubbo.config.annotation<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>@Documented</span>
+<span style=color:#268bd2>@Retention</span><span style=color:#719e07>(</span>RetentionPolicy<span style=color:#719e07>.</span>RUNTIME<span style=color:#719e07>)</span>
+<span style=color:#268bd2>@Target</span><span style=color:#719e07>({</span>ElementType<span style=color:#719e07>.</span>FIELD<span style=color:#719e07>,</span> ElementType<span style=color:#719e07>.</span>METHOD<span style=color:#719e07>,</span> ElementType<span style=color:#719e07>.</span>ANNOTATION_TYPE<span style=color:#719e07>})</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span><span style=color:#268bd2>public</span> <span style=color:#268bd2>@interface</span> Reference <span style=color:#719e07>{</span>
+    Class<span style=color:#719e07>&lt;?&gt;</span> interfaceClass<span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#dc322f>void</span><span style=color:#719e07>.</span>class<span style=color:#719e07>;</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>interfaceName</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>version</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>group</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #5
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>url</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #6
+</span><span style=color:#586e75></span>    
+    String <span style=color:#268bd2>application</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #7
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>module</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #8
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>consumer</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #9
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>protocol</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #10
+</span><span style=color:#586e75></span>    String <span style=color:#268bd2>monitor</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#2aa198>&#34;&#34;</span><span style=color:#719e07>;</span> <span style=color:#586e75>// #11
+</span><span style=color:#586e75></span>    String<span style=color:#719e07>[]</span> <span style=color:#268bd2>registry</span><span style=color:#719e07>()</span> <span style=color:#719e07>default</span> <span style=color:#719e07>{};</span> <span style=color:#586e75>// #12
+</span><span style=color:#586e75></span><span style=color:#719e07>}</span>
+</code></pre></div><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>&rsquo;s class implemented by the service provider</li><li><strong>interfaceName</strong>: specified <code>interface</code>&r [...]
+    String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=2serverservice-implementation>2.Server:Service Implementation</h3><p>Implement the <code>GreetingService</code> interface, and mark it as a service for Dubbo via @Service.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=color:#268bd2>@Service</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AnnotatedGreetingService</span> <span style=color:#268bd2>implements</span> GreetingService <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=3serverassembly-service-provider>3.Server:Assembly Service Provider</h3><p>You can discover, assemble, and provide Dubbo&rsquo;s services through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=color:#268bd2>@Configuration</span>
+<span style=color:#268bd2>@EnableDubbo</span><span style=color:#719e07>(</span>scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.impl&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>static</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ProviderConfiguration</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> ProviderConfig <span style=color:#268bd2>providerConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        ProviderConfig providerConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ProviderConfig<span style=color:#719e07>();</span>
+        providerConfig<span style=color:#719e07>.</span>setTimeout<span style=color:#719e07>(</span>1000<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> providerConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> ApplicationConfig <span style=color:#268bd2>applicationConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        ApplicationConfig applicationConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ApplicationConfig<span style=color:#719e07>();</span>
+        applicationConfig<span style=color:#719e07>.</span>setName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;dubbo-annotation-provider&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> applicationConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> RegistryConfig <span style=color:#268bd2>registryConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        RegistryConfig registryConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>();</span>
+        registryConfig<span style=color:#719e07>.</span>setProtocol<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;zookeeper&#34;</span><span style=color:#719e07>);</span>
+        registryConfig<span style=color:#719e07>.</span>setAddress<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;localhost&#34;</span><span style=color:#719e07>);</span>
+        registryConfig<span style=color:#719e07>.</span>setPort<span style=color:#719e07>(</span>2181<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> registryConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> ProtocolConfig <span style=color:#268bd2>protocolConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        ProtocolConfig protocolConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ProtocolConfig<span style=color:#719e07>();</span>
+        protocolConfig<span style=color:#719e07>.</span>setName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;dubbo&#34;</span><span style=color:#719e07>);</span>
+        protocolConfig<span style=color:#719e07>.</span>setPort<span style=color:#719e07>(</span>20880<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> protocolConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 id=4serverstart-service>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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span sty [...]
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> Exception <span style=color:#719e07>{</span>
+        <span style=color:#719e07>new</span> EmbeddedZooKeeper<span style=color:#719e07>(</span>2181<span style=color:#719e07>,</span> <span style=color:#cb4b16>false</span><span style=color:#719e07>).</span>start<span style=color:#719e07>();</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>        AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext<span style=color:#719e07>(</span>ProviderConfiguration<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 se [...]
+
+<span style=color:#719e07>[</span>01/08/18 02:12:51:051 CST<span style=color:#719e07>]</span> main  INFO zookeeper.ZookeeperRegistry:  <span style=color:#719e07>[</span>DUBBO<span style=color:#719e07>]</span> Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost<span style=color:#719e07>=</span>true&amp;<span style=color:#268bd2>application</span><span style=color:#719e07>=</span>dubbo-annotation-provider&amp;default.timeout<span style=color:#719e07>= [...]
+</code></pre></div><h3 id=5serverreference-service>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><div class=highlight><pre style=color:#93a1a1; [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingServiceConsumer</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Reference</span>
+    <span style=color:#268bd2>private</span> GreetingService greetingService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>doSayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> greetingService<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=6serverassembly-service-consumer>6.Server:Assembly Service consumer</h3><p>Just like <strong>3. Server:Assembly Service Provider</strong> You can discover, assemble, and provide Dubbo&rsquo;s service consumer through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-Java data-lang=Java><sp [...]
+<span style=color:#268bd2>@EnableDubbo</span><span style=color:#719e07>(</span>scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.action&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>@ComponentScan</span><span style=color:#719e07>(</span>value <span style=color:#719e07>=</span> <span style=color:#719e07>{</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.action&#34;</span><span style=color:#719e07>})</span>
+<span style=color:#268bd2>static</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ConsumerConfiguration</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> ApplicationConfig <span style=color:#268bd2>applicationConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        ApplicationConfig applicationConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ApplicationConfig<span style=color:#719e07>();</span>
+        applicationConfig<span style=color:#719e07>.</span>setName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;dubbo-annotation-consumer&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> applicationConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> ConsumerConfig <span style=color:#268bd2>consumerConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        ConsumerConfig consumerConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ConsumerConfig<span style=color:#719e07>();</span>
+        consumerConfig<span style=color:#719e07>.</span>setTimeout<span style=color:#719e07>(</span>3000<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> consumerConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Bean</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> RegistryConfig <span style=color:#268bd2>registryConfig</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        RegistryConfig registryConfig <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>();</span>
+        registryConfig<span style=color:#719e07>.</span>setProtocol<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;zookeeper&#34;</span><span style=color:#719e07>);</span>
+        registryConfig<span style=color:#719e07>.</span>setAddress<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;localhost&#34;</span><span style=color:#719e07>);</span>
+        registryConfig<span style=color:#719e07>.</span>setPort<span style=color:#719e07>(</span>2181<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> registryConfig<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 id=7server-initiate-remote-calls>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><div class=highlight> [...]
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext<span style=color:#719e07>(</span>ConsumerConfiguration<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span> <span style=color:#586e75>// #1
+</span><span style=color:#586e75></span>        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span> <span style=color:#586e75>// #2
+</span><span style=color:#586e75></span>        GreetingServiceConsumer greetingServiceConsumer <span style=color:#719e07>=</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span>GreetingServiceConsumer<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span> <span style=color:#586e75>// #3
+</span><span style=color:#586e75></span>        String hello <span style=color:#719e07>=</span> greetingServiceConsumer<span style=color:#719e07>.</span>doSayHello<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;annotation&#34;</span><span style=color:#719e07>);</span> <span style=color:#586e75>// #4
+</span><span style=color:#586e75></span>        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;result: &#34;</span> <span style=color:#719e07>+</span> hello<span style=color:#719e07>);</span> <span style=color:#586e75>// #5
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 re [...]
+Start the Server&rsquo;s <code>main</code> method, you will see the following output, which returns the <code>result</code>: hello, annotation:</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=color:#719e07>[</span>01/08/18 02:38:40:040 CST<span style=color:#719e07>]</span> main  INFO config.AbstractConfig:  <span style=color:#719e07>[</span>DUBBO<span style=color:#719 [...]
+<span style=color:#719e07>[</span>01/08/18 02:38:40:040 CST<span style=color:#719e07>]</span> main  INFO annotation.ReferenceBeanBuilder: &lt;dubbo:reference <span style=color:#268bd2>object</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.common.bytecode.proxy0@673be18f&#34;</span> <span style=color:#268bd2>singleton</span><span style=color:#719e07>=</span><span style=color:#2aa198>&#34;true&#34;</span> <span style=color:#268bd2>interface</span><s [...]
+result: hello, annotation
+</code></pre></div><h2 id=conclusion>Conclusion</h2><p>By studying this article, the reader can master the basic concepts of <code>Dubbo</code>&rsquo;s exclusive <code>annotations</code> , <code>@EnableDubbo</code>, <code>@Service</code>, <code>@Reference</code>, and master it&rsquo;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 [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/07/using-zookeeper-in-dubbo/index.html b/en/blog/2018/08/07/using-zookeeper-in-dubbo/index.html
new file mode 100644
index 0000000..c4f1e7e
--- /dev/null
+++ b/en/blog/2018/08/07/using-zookeeper-in-dubbo/index.html
@@ -0,0 +1,175 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-zk.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+to [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Using%20Zookeeper%20in%20Dubbo" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#introduction-of-zookeeper>Introduction of Zookeeper</a><ul><li><a href=#the-basic-concept>The basic concept</a></li><li><a href=#basic-implementation>Basic Implementation</a></li></ul></li><li><a href=#using-zookeeper-in-dubbo>Using Zookeeper in Dubbo</a><ul><li><a href=#prepare-the-sample-code>Prepare the sample code</a [...]
+<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O&rsquo;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=/imgs/blog/zk-tree.png alt=zk-tree>
+<em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O&rsquo;Reilly</em></p><h3 id=basic-implementation>Basic Implementation</h3><p>You could donwload and install Zookeeper directly<sup id=fnref:1><a href=#fn:1 class=footnote-ref role=doc-noteref>1</a></sup>.
+Or you could use Homebrew <sup id=fnref:2><a href=#fn:2 class=footnote-ref role=doc-noteref>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 id=fnref:3><a href=#fn:3 class=footnote-ref role=doc-noteref>3</a></sup></p><h4 id=1-running-the-zookeeper>1. Running the Zookeeper</h4><p>Execute the command to run zookeeper in a docker container</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code c [...]
+</code></pre></div><h4 id=2-entering-the-zookeeper-container>2. Entering the zookeeper container</h4><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>docker <span style=color:#b58900>exec</span> -it zookeeper bash
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>bash-4.4# ls -l bin
+total <span style=color:#2aa198>36</span>
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe       <span style=color:#2aa198>232</span> Mar <span style=color:#2aa198>27</span> 04:32 README.txt
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>1937</span> Mar <span style=color:#2aa198>27</span> 04:32 zkCleanup.sh
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>1056</span> Mar <span style=color:#2aa198>27</span> 04:32 zkCli.cmd
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>1534</span> Mar <span style=color:#2aa198>27</span> 04:32 zkCli.sh
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>1759</span> Mar <span style=color:#2aa198>27</span> 04:32 zkEnv.cmd
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>2696</span> Mar <span style=color:#2aa198>27</span> 04:32 zkEnv.sh
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>1089</span> Mar <span style=color:#2aa198>27</span> 04:32 zkServer.cmd
+-rwxr-xr-x    <span style=color:#2aa198>1</span> zookeepe zookeepe      <span style=color:#2aa198>6773</span> Mar <span style=color:#2aa198>27</span> 04:32 zkServer.sh
+</code></pre></div><h4 id=3-entering-the-zookeeper-management-interface-via-zkcli>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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>bash-4.4# ps
+PID   USER     TIME  COMMAND
+    <span style=color:#2aa198>1</span> zookeepe  0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir<span style=color:#719e07>=</span>. -Dzookeeper.root
+   <span style=color:#2aa198>32</span> root      0:00 bash
+   <span style=color:#2aa198>42</span> root      0:00 ps
+</code></pre></div><p>So, it allows you to access Zookeeper&rsquo;s console directly through <code>zkCli</code> for management.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=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
+
+<span style=color:#719e07>[</span>zk: 127.0.0.1:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 0<span style=color:#719e07>]</span> <span style=color:#b58900>help</span>
+ZooKeeper -server host:port cmd args
+	stat path <span style=color:#719e07>[</span>watch<span style=color:#719e07>]</span>
+	<span style=color:#b58900>set</span> path data <span style=color:#719e07>[</span>version<span style=color:#719e07>]</span>
+	ls path <span style=color:#719e07>[</span>watch<span style=color:#719e07>]</span>
+	delquota <span style=color:#719e07>[</span>-n|-b<span style=color:#719e07>]</span> path
+	ls2 path <span style=color:#719e07>[</span>watch<span style=color:#719e07>]</span>
+	setAcl path acl
+	setquota -n|-b val path
+	<span style=color:#b58900>history</span>
+	redo cmdno
+	printwatches on|off
+	delete path <span style=color:#719e07>[</span>version<span style=color:#719e07>]</span>
+	sync path
+	listquota path
+	rmr path
+	get path <span style=color:#719e07>[</span>watch<span style=color:#719e07>]</span>
+	create <span style=color:#719e07>[</span>-s<span style=color:#719e07>]</span> <span style=color:#719e07>[</span>-e<span style=color:#719e07>]</span> path data acl
+	addauth scheme auth
+	quit
+	getAcl path
+	close
+	connect host:port
+</code></pre></div><h4 id=4-basic-examples-on-zkcli>4. Basic Examples on zkCli</h4><p>Create <code>/hello-zone</code> node:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=color:#719e07>[</span>zk: 127.0.0.1:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 19<span style=color:#719e07>]</span> create /hello-zone <span style=color:#2aa19 [...]
+Created /hello-zone
+</code></pre></div><p>List the child nodes under <code>/</code> and confirm that <code>hello-zone</code> is created:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=color:#719e07>[</span>zk: 127.0.0.1:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 20<span style=color:#719e07>]</span> ls /
+<span style=color:#719e07>[</span>zookeeper, hello-zone<span style=color:#719e07>]</span>
+</code></pre></div><p>List the child nodes for <code>/hello-zone</code> and verify that it is empty:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=color:#719e07>[</span>zk: 127.0.0.1:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 21<span style=color:#719e07>]</span> ls /hello-zone
+<span style=color:#719e07>[]</span>
+</code></pre></div><p>Get the data stored on the <code>/hello-zone</code> node:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=color:#719e07>[</span>zk: 127.0.0.1:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 22<span style=color:#719e07>]</span> get /hello-zone
+world
+</code></pre></div><h2 id=using-zookeeper-in-dubbo>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>/dubbo</code>.</p><p>The secondary directory is the service name like <code>com.foo.BarService</code [...]
+    String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h4 id=2-server-implementation>2. Server: Implementation</h4><p>Implement the <code>GreetingService</code> interface and mark it as a service for Dubbo via <code>@Service</code>.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@Service</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AnnotatedGreetingService</span> <span style=color:#268bd2>implements</span> GreetingService <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h4 id=3-server-assembly>3. Server: Assembly</h4><p>Define ProviderConfiguration to assemble Dubbo services.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@Configuration</span>
+<span style=color:#268bd2>@EnableDubbo</span><span style=color:#719e07>(</span>scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.impl&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>@PropertySource</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;classpath:/spring/dubbo-provider.properties&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>static</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ProviderConfiguration</span> <span style=color:#719e07>{}</span>
+</code></pre></div><p>Dubbo-provider.properties is an external configuration in a spring application, as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>dubbo.application.name=demo-provider
+dubbo.registry.address=zookeeper://$DOCKER_HOST:2181
+dubbo.protocol.name=dubbo
+dubbo.protocol.port=20880
+</code></pre></div><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&rsquo;s name is equivalent [...]
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> Exception <span style=color:#719e07>{</span>
+        AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext<span style=color:#719e07>(</span>ProviderConfiguration<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Start the <code>main</code> method of server, you will get the following output, which represents the success of the server&rsquo;s startup, and the <code>GreetingService</code> service is registered on the ZookeeperRegistry:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=color:#719e07>[</span>03/08/18 10:50:33:033 CST<span style=color:#719e07>]</span [...]
+</code></pre></div><p>You could find the registration information of the service provider through the Zookeeper management terminal:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>$ docker <span style=color:#b58900>exec</span> -it zookeeper bash
+bash-4.4# bin/zkCli.sh -server localhost:218
+Connecting to localhost:2181
+...
+Welcome to ZooKeeper!
+JLine support is enabled
+...
+<span style=color:#719e07>[</span>zk: localhost:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 0<span style=color:#719e07>]</span> ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/providers
+<span style=color:#719e07>[</span>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<span style=color:#719e07>]</span>
+</code></pre></div><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&application=demo-provider&dubbo=2.6.2&generic=false&interface=com.alibaba.dubbo.samples.api.GreetingService&methods=sayHello&pid=12938&side=provider&timestamp=1533264631849</em></p><h4 id=5-client-reference-service>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 Zo [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingServiceConsumer</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Reference</span>
+    <span style=color:#268bd2>private</span> GreetingService greetingService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>doSayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> greetingService<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h4 id=6-client-assembling>6. Client: Assembling</h4><p>Define the ConsumerConfiguration to assemble Dubbo service.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@Configuration</span>
+<span style=color:#268bd2>@EnableDubbo</span><span style=color:#719e07>(</span>scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.action&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>@PropertySource</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;classpath:/spring/dubbo-consumer.properties&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>@ComponentScan</span><span style=color:#719e07>(</span>value <span style=color:#719e07>=</span> <span style=color:#719e07>{</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.action&#34;</span><span style=color:#719e07>})</span>
+<span style=color:#268bd2>static</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ConsumerConfiguration</span> <span style=color:#719e07>{}</span>
+</code></pre></div><p>&ldquo;dubbo-consumer.properties&rdquo; is a method of external configuration in a Spring application, as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>dubbo.application.name=demo-consumer
+dubbo.registry.address=zookeeper://$DOCKER_HOST:2181
+dubbo.consumer.timeout=3000
+</code></pre></div><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 id=7-client-initiating-a-remote-call>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  [...]
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ConsumerBootstrap</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException <span style=color:#719e07>{</span>
+        AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext<span style=color:#719e07>(</span>ConsumerConfiguration<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+        GreetingServiceConsumer greetingServiceConsumer <span style=color:#719e07>=</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span>GreetingServiceConsumer<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        String hello <span style=color:#719e07>=</span> greetingServiceConsumer<span style=color:#719e07>.</span>doSayHello<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;zookeeper&#34;</span><span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;result: &#34;</span> <span style=color:#719e07>+</span> hello<span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>The output are as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=color:#719e07>[</span>03/08/18 01:42:31:031 CST<span style=color:#719e07>]</span> main  INFO zookeeper.ZookeeperRegistry:  <span style=color:#719e07>[</span>DUBBO<span style=color:#719e07>]</span> Register: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingServ [...]
+<span style=color:#719e07>[</span>03/08/18 01:42:31:031 CST<span style=color:#719e07>]</span> main  INFO zookeeper.ZookeeperRegistry:  <span style=color:#719e07>[</span>DUBBO<span style=color:#719e07>]</span> Subscribe: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application<span style=color:#719e07>=</span>demo-consumer&amp;<span style=color:#268bd2>category</span><span style=color:#719e07>=</span>providers,configurators,routers&amp;default.timeout<span style=c [...]
+...
+result: hello, zookeeper
+</code></pre></div><p>Description:</p><ol><li><strong>Register</strong>: consumer://192.168.99.1/&mldr;&<strong>category=consumers</strong>&: 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/&mldr;&<strong>category=providers,configurators,routers</strong>&:Consumers subscribe <code>providers</code>, <code>configurators</code>, <code>routers</code> from Zookeepers. The <code [...]
+bash-4.4# bin/zkCli.sh -server localhost:218
+Connecting to localhost:2181
+...
+Welcome to ZooKeeper!
+JLine support is enabled
+...
+<span style=color:#719e07>[</span>zk: localhost:2181<span style=color:#719e07>(</span>CONNECTED<span style=color:#719e07>)</span> 4<span style=color:#719e07>]</span> ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/consumers
+<span style=color:#719e07>[</span>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<span style=color:#719e07>]</span>
+</code></pre></div><p>You could see that consumers of Dubbo&rsquo;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&category=providers,configurators,routers&default.timeout=3000&dubbo=2.6.2&interface=com.alibaba.dubbo.samples.api.GreetingService&methods=sayHello&pid=82406&side=consumer&timestamp=1533274951195</em></p><h2 id=summary>Summary</h2><p>This docume [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/10/dubbos-load-balance/index.html b/en/blog/2018/08/10/dubbos-load-balance/index.html
new file mode 100644
index 0000000..7a3bc47
--- /dev/null
+++ b/en/blog/2018/08/10/dubbos-load-balance/index.html
@@ -0,0 +1,129 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-loadbalance.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo&amp;#39;s%20Load%20Balance" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#background>Background</a></li><li><a href=#concepts>Concepts</a></li><li><a href=#dubbos-internal-load-balancing-strategy>Dubbo&rsquo;s Internal Load Balancing Strategy</a><ul><li><a href=#1-random-load-balancing>1. Random Load Balancing</a></li><li><a href=#2-round-robin-load-balancing>2. Round Robin Load Balancing</a>< [...]
+|          |                    |                    |                              |
++-----------------------------------------------------------------------------------+
+1          10                   30                   50                             80
+
+|-----A----|---------B----------|----------C---------|---------------D--------------|
+
+
+---------------------15
+
+-------------------------------------------37
+
+-----------------------------------------------------------54
+</code></pre></div><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 id=random-load-balancing-source-code>Random load balancing Source code</h4><p [...]
+
+    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&#39; 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></div><h3 id=2-round-robin-load-balancing>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. Th [...]
+    // if there is only one minimum value then return directly
+    return invokers.get(leastIndexs[0]);
+}
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>if (! sameWeight &amp;&amp; totalWeig [...]
+    // 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></div><h3 id=4-consistent-hash-algorithm>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_ha [...]
+</code></pre></div><p>By default, 160 virtual nodes are used. Configure if you would like to modify it:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;dubbo:parameter key=&#34;hash.nodes&#34; value=&#34;320&#34; /&gt;
+</code></pre></div><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 an [...]
+</code></pre></div><p>All methods of the service use roundrobin load balancing.</p><h3 id=client-side-service-level>Client Side Service Level</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;dubbo:reference interface=&#34;...&#34; loadbalance=&#34;roundrobin&#34; /&gt;
+</code></pre></div><p>All methods of the service use roundrobin load balancing.</p><h3 id=server-side-method-level>Server Side Method Level</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;dubbo:service interface=&#34;...&#34;&gt;
+    &lt;dubbo:method name=&#34;hello&#34; loadbalance=&#34;roundrobin&#34;/&gt;
+&lt;/dubbo:service&gt;
+</code></pre></div><p>Only the hello method of the service uses roundrobin load balancing.</p><h3 id=client-side-method-level>Client Side Method Level</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;dubbo:reference interface=&#34;...&#34;&gt;
+    &lt;dubbo:method name=&#34;hello&#34; loadbalance=&#34;roundrobin&#34;/&gt;
+&lt;/dubbo:reference&gt;
+</code></pre></div><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 conf [...]
+public interface LoadBalance {
+    @Adaptive(&#34;loadbalance&#34;)
+    &lt;T&gt; Invoker&lt;T&gt; select(List&lt;Invoker&lt;T&gt;&gt; invokers, URL url, Invocation invocation) throws RpcException;
+}
+</code></pre></div><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>< [...]
+public class DemoLoadBalance implements LoadBalance {
+    @Override
+    public &lt;T&gt; Invoker&lt;T&gt; <span style=color:#719e07>select</span>(List&lt;Invoker&lt;T<span style=color:#719e07>&gt;&gt;</span> invokers, URL url, Invocation invocation) throws RpcException {
+        System.out.<span style=color:#b58900>println</span>(<span style=color:#2aa198>&#34;[DemoLoadBalance]Select the first invoker...&#34;</span>);
+        <span style=color:#719e07>return</span> invokers.<span style=color:#268bd2>get</span>(<span style=color:#2aa198>0</span>);
+    }
+}
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>demo=my=com.demo.dubbo.DemoLoadBalance
+</code></pre></div><ol start=3><li>Configure to use custom LoadBalance</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;dubbo:reference id=&#34;helloService&#34; interface=&#34;com.demo.dubbo.api.IHelloService&#34; loadbalance=&#34;demo&#34; /&gt;
+</code></pre></div><p>Configure <code>&lt;loadbalance="demo"></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><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/07/use-annotations-in-dubbo/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/index.html b/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/index.html
new file mode 100644
index 0000000..58c7442
--- /dev/null
+++ b/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/index.html
@@ -0,0 +1,120 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-basic-usage-dubbo-consumer-configuration.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+th [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=%20Dubbo%20Basic%20Usage%20-%20Dubbo%20Consumer%20Configuration" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#dubbo-consumer-configuration>Dubbo Consumer Configuration</a><ul><li><a href=#consumer-configuration-detailed>Consumer Configuration Detailed</a></li><li><a href=#consumer-calling-remote-service>Consumer Calling Remote Service</a></li></ul></li></ul></nav></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role= [...]
+&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
+&lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34;
+    Xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
+    Xmlns:dubbo=&#34;http://dubbo.apache.org/schema/dubbo&#34;
+    Xsi:schemaLocation=&#34;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&#34;&gt;
+    &lt;dubbo:application name=&#34;hello-world-app&#34; /&gt;
+    &lt;dubbo:registry address=&#34;multicast://224.5.6.7:1234&#34; /&gt;
+    &lt;dubbo:protocol name=&#34;dubbo&#34; port=&#34;20880&#34; /&gt;
+    &lt;dubbo:reference id=&#34;demoServiceRemote&#34; interface=&#34;com.alibaba.dubbo.demo.DemoService&#34; /&gt;
+&lt;/beans&gt;
+</code></pre></div><blockquote><p>For the supported configuration tags and corresponding configuration items, refer to the usage in the provider.</p></blockquote><blockquote><p>Next, focus on the configuration of &lt;dubbo:reference/>.</p></blockquote><ul><li>&lt;dubbo:reference/> List of main attributes supported:</li></ul><table><thead><tr><th>Property Name</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>service reference id, as java bean id, requires unique</td></tr><tr [...]
+Public class AnnotationConsumeService {
+
+    @com.alibaba.dubbo.config.annotation.Reference
+    Public AnnotateService annotateService;
+
+    // ...
+
+}
+
+</code></pre></div><p>The configuration in this way is the same as the previous configuration in xml.</p><blockquote><p>To specify the way dubbo scans the path, refer to the implementation of the provider in the previous section.</p></blockquote><h4 id=api-direct-trigger>api direct trigger</h4><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>Import com.alibaba.dubbo.rpc.config. [...]
+Import com.alibaba.dubbo.rpc.config.RegistryConfig;
+Import com.alibaba.dubbo.rpc.config.ConsumerConfig;
+Import com.alibaba.dubbo.rpc.config.ReferenceConfig;
+Import com.xxx.XxxService;
+// current application configuration
+
+ApplicationConfig application = new ApplicationConfig();
+application.setName(&#34;yyy&#34;);
+// Connect to the registry configuration
+RegistryConfig registry = new RegistryConfig();
+registry.setAddress(&#34;10.20.130.230:9090&#34;);
+registry.setUsername(&#34;aaa&#34;);
+registry.setPassword(&#34;bbb&#34;);
+ 
+// Note: ReferenceConfig is a heavy object that internally encapsulates the connection to the registry and the connection to the service provider.
+// reference remote service
+ReferenceConfig&lt;XxxService&gt; reference = new ReferenceConfig&lt;XxxService&gt;(); // This instance is heavy, encapsulates the connection to the registry and the connection to the provider, please cache it yourself, otherwise it may cause memory and connection leaks.
+
+reference.setApplication(application);
+reference.setRegistry(registry); // Multiple registries can use setRegistries()
+reference.setInterface(XxxService.class);
+reference.setVersion(&#34;1.0.0&#34;);
+
+// Use xxxService like local beans
+XxxService xxxService = reference.get();
+</code></pre></div><h6 id=methodspecial-settings>methodSpecial settings</h6><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>
+// Method level configuration
+List&lt;MethodConfig&gt; methods = new ArrayList&lt;MethodConfig&gt;();
+MethodConfig method = new MethodConfig();
+method.setName(&#34;createXxx&#34;);
+method.setTimeout(10000);
+method.setRetries(0);
+Methods.add(method);
+// reference remote service
+ReferenceConfig&lt;XxxService&gt; reference = new ReferenceConfig&lt;XxxService&gt;(); // This instance is heavy, encapsulates the connection to the registry and the connection to the provider, please cache it yourself, otherwise it may cause memory and connection leaks.
+...
+reference.setMethods(methods); // Set method level configuration
+</code></pre></div><h3 id=consumer-calling-remote-service>Consumer Calling Remote Service</h3><p>The above chapters are more from a configuration point of view, and then through a complete example, explain the complete use of dubbo consumer.</p><p>There is only one service UserReadService in this example, there is a method getUserById. Need to call a remote service through Dubbo. The specific steps are as follows:</p><ol><li>Create a project
+If there is already a project, you can ignore it. Create a spring boot project that can be created at <a href=https://start.spring.io/>https://start.spring.io/</a>.
+The provider of the service has been defined in the provider section.</li><li>Call the service</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>@RestController
+Public class UserTestController{
+    @Autowired
+    Private UserReadService userReadService;
+    @RequestMapping(&#34;/user/getById&#34;)
+    Public String getUserById(Long id){
+        // just test
+        Return userReadService.getUserById(id).toString();
+    }
+}
+</code></pre></div><p>3.Dubbo configuration</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>
+&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
+&lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34;
+    Xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
+    Xmlns:dubbo=&#34;http://dubbo.apache.org/schema/dubbo&#34;
+    Xsi:schemaLocation=&#34;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&#34;&gt;
+    &lt;dubbo:application name=&#34;hello-world-app&#34; /&gt;
+    &lt;dubbo:registry address=&#34;multicast://224.5.6.7:1234&#34; /&gt;
+    &lt;dubbo:protocol name=&#34;dubbo&#34; port=&#34;20880&#34; /&gt;
+    &lt;dubbo:reference id=&#34;userReadService&#34; interface=&#34;com.package.UserReadService&#34;check=&#34;false&#34; /&gt;
+&lt;/beans&gt;
+</code></pre></div><p>Other ways of configuring Dubbo can refer to the relevant configuration in the previous section, or use the integrated dubbo spring boot starter mode.</p><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chen [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/index.html b/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/index.html
new file mode 100644
index 0000000..c590a93
--- /dev/null
+++ b/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/index.html
@@ -0,0 +1,157 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-basic-usage-dubbo-provider-configuration.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+th [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo%20Basic%20Usage%20--%20Dubbo%20Provider%20Configuration" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#dubbo-provider-configuration>Dubbo Provider Configuration</a><ul><li><a href=#provider-configuration-in-detail>Provider Configuration in Detail</a></li><li><a href=#provider-interface-and-implement>Provider Interface and Implement</a></li></ul></li></ul></nav></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" r [...]
+&lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34;
+    xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
+    xmlns:dubbo=&#34;http://dubbo.apache.org/schema/dubbo&#34;
+    xsi:schemaLocation=&#34;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&#34;&gt;  
+    &lt;dubbo:application name=&#34;hello-world-app&#34; /&gt;  
+    &lt;dubbo:registry address=&#34;multicast://224.5.6.7:1234&#34; /&gt;  
+    &lt;dubbo:protocol name=&#34;dubbo&#34; port=&#34;20880&#34; /&gt;  
+    &lt;dubbo:service interface=&#34;com.alibaba.dubbo.demo.DemoService&#34; ref=&#34;demoServiceLocal&#34; /&gt;  
+    &lt;dubbo:reference id=&#34;demoServiceRemote&#34; interface=&#34;com.alibaba.dubbo.demo.DemoService&#34; /&gt;  
+&lt;/beans&gt;
+</code></pre></div><p>In the example above,note the way to write dubbo schema:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;beans xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
+       xmlns:dubbo=&#34;http://code.alibabatech.com/schema/dubbo&#34;
+       xmlns=&#34;http://www.springframework.org/schema/beans&#34;
+       xsi:schemaLocation=&#34;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&#34;&gt;
+</code></pre></div><h6 id=supported-configuration-tags>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/></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/></td>< [...]
+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></div><h6 id=mapping-rule>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=&ldquo;foo&rdquo; /></li><li>For example: dubbo.registry.address=10.20.153.10:9090 equivalents to &lt;dubbo:registry address=&ldquo;10.20.153.10:9090&rdquo; /></li></ul><p>If there are multiple configurations havin [...]
+
+@Service(timeout = 5000)
+public class AnnotateServiceImpl implements AnnotateService { 
+    // ...
+}
+</code></pre></div><h6 id=javaconfig-configuration-public-module>Javaconfig Configuration Public Module</h6><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>@Configuration
+public class DubboConfiguration {
+
+    @Bean
+    public ApplicationConfig applicationConfig() {
+        ApplicationConfig applicationConfig = new ApplicationConfig();
+        applicationConfig.setName(&#34;provider-test&#34;);
+        return applicationConfig;
+    }
+
+    @Bean
+    public RegistryConfig registryConfig() {
+        RegistryConfig registryConfig = new RegistryConfig();
+        registryConfig.setAddress(&#34;zookeeper://127.0.0.1:2181&#34;);
+        registryConfig.setClient(&#34;curator&#34;);
+        return registryConfig;
+    }
+}
+</code></pre></div><p>The result of configuration using this method is the same as that of using xml.</p><h6 id=specify-the-dubbo-scan-path>Specify the Dubbo Scan Path</h6><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>@SpringBootApplication
+@DubboComponentScan(basePackages = &#34;com.alibaba.dubbo.test.service.impl&#34;)
+public class ProviderTestApp {
+    // ...
+}
+</code></pre></div><p>or use the spring bean xml configuration:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;dubbo:annotation package=&#34;com.chanshuyi.service.impl&#34; /&gt;
+</code></pre></div><h4 id=api-trigger-directly>API Trigger Directly</h4><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>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(&#34;xxx&#34;);
+
+// connect to registry center configuration
+RegistryConfig registry = new RegistryConfig();
+registry.setAddress(&#34;10.20.130.230:9090&#34;);
+registry.setUsername(&#34;aaa&#34;);
+registry.setPassword(&#34;bbb&#34;);
+
+// service provider&#39;s protocol configuration
+ProtocolConfig protocol = new ProtocolConfig();
+protocol.setName(&#34;dubbo&#34;);
+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(&#34;1.0.0&#34;);
+
+// exposure and register service
+service.export();
+</code></pre></div><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 id=provider-interface-and-implement>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 me [...]
+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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>public interface UserReadService{
+    public User getUserById(Long userId);
+}
+</code></pre></div><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&rsquo;s application.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>public UserReadServiceImpl implements UserReadService{
+    public User getUserById(Long userId){
+        return xxx;
+    }
+}
+</code></pre></div><ol start=4><li>Dubbo Configuration</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
+&lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34;
+    xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
+    xmlns:dubbo=&#34;http://dubbo.apache.org/schema/dubbo&#34;
+    xsi:schemaLocation=&#34;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&#34;&gt;  
+    &lt;dubbo:application name=&#34;hello-world-app&#34; /&gt;  
+    &lt;dubbo:registry address=&#34;multicast://224.5.6.7:1234&#34; /&gt;  
+    &lt;dubbo:protocol name=&#34;dubbo&#34; port=&#34;20880&#34; /&gt;  
+    &lt;bean id=&#34;userReadService&#34; class=&#34;com.package.UserReadServiceImpl&#34;/&gt;
+    &lt;dubbo:service interface=&#34;com.package.UserReadService&#34; ref=&#34;userReadService&#34; /&gt;  
+&lt;/beans&gt;
+</code></pre></div><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><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynch [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/index.html b/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/index.html
new file mode 100644
index 0000000..90b0bcf
--- /dev/null
+++ b/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/index.html
@@ -0,0 +1,126 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-invoke.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+th [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo:%20Several%20ways%20about%20synchronous/asynchronous%20invoke" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><ul><li><a href=#synchronous-invoke>Synchronous invoke</a></li><li><a href=#asynchronous-invoke>Asynchronous invoke</a></li><li><a href=#parameters-callback>Parameters callback</a></li><li><a href=#event-notification>Event notification</a></li></ul></li></ul></nav></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role= [...]
+    String <span style=color:#268bd2>goodbye</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h5 id=consumer-configuration>Consumer configuration</h5><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;asyncService&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.async.api.AsyncService&#34;</span><span style=color:#268bd2>&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:method</span> name=<span style=color:#2aa198>&#34;goodbye&#34;</span> async=<span style=color:#2aa198>&#34;true&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;/dubbo:reference&gt;</span>
+</code></pre></div><p>Notice that if we need an asynchronous revoke method, we must use <code>&lt;dubbo:method/></code> label to describe it.</p><h5 id=consumer-triggers-invocation>Consumer triggers invocation</h5><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>AsyncService service <span style=color:#719e07>=</span> <span style=color:#719e07>...;</span>
+String result <span style=color:#719e07>=</span> service<span style=color:#719e07>.</span>goodbye<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;samples&#34;</span><span style=color:#719e07>);</span><span style=color:#586e75>// returns NULL and DO NOT use!
+</span><span style=color:#586e75></span>Future<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> future <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>().</span>getFuture<span style=color:#719e07>();</span>
+<span style=color:#719e07>...</span> <span style=color:#586e75>// other service thread logic
+</span><span style=color:#586e75></span>result <span style=color:#719e07>=</span> future<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span> <span style=color:#586e75>// could use get(timeout, unit) to configure timeout, when it needs to get the asynchronous result
+</span></code></pre></div><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="true"</code> Waiting [...]
+</code></pre></div><p>If you only want to be asynchronous, then omit the result thoroughly, <code>return="false"</code> could be set to reduce the creation and management cost of Future:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;dubbo:method</span> name=<span style=color:#2aa198>&#34;goodbye&#34;</span> async=<span style=color:#2aa198>&#34;true&#34 [...]
+</code></pre></div><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=/imgs/blog/dubbo-async.svg alt="Asynchronous invoke"></p><p>The sample locates at:https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async</p><h3 id=parameters-callback>Parameters callback</h3><p>The parameter Callback is somewhat similar to the local Callback mechanism, but [...]
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>addListener</span><span style=color:#719e07>(</span>String key<span style=color:#719e07>,</span> CallbackListener listener<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>CallbackListener</span> <span style=color:#719e07>{</span>
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>changed</span><span style=color:#719e07>(</span>String msg<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h5 id=service-implementation-of-provider>Service implementation of Provider</h5><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>CallbackServiceImpl</span> <span style=color:#268bd2>implements</span> CallbackService <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>private</span> <span style=color:#268bd2>final</span> Map<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> CallbackListener<span style=color:#719e07>&gt;</span> listeners <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ConcurrentHashMap<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> CallbackListener<span style=color:#719e07>&gt;();</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>CallbackServiceImpl</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        Thread t <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(</span><span style=color:#719e07>new</span> Runnable<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+            <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>run</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                <span style=color:#719e07>while</span> <span style=color:#719e07>(</span><span style=color:#cb4b16>true</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                    <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                        <span style=color:#719e07>for</span> <span style=color:#719e07>(</span>Map<span style=color:#719e07>.</span>Entry<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> CallbackListener<span style=color:#719e07>&gt;</span> entry <span style=color:#719e07>:</span> listeners<span style=color:#719e07>.</span>entrySet<span style=color:#719e07>())</span> <span style=color:#719e07>{</span>
+                            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                                entry<span style=color:#719e07>.</span>getValue<span style=color:#719e07>().</span>changed<span style=color:#719e07>(</span>getChanged<span style=color:#719e07>(</span>entry<span style=color:#719e07>.</span>getKey<span style=color:#719e07>()));</span>
+                            <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>Throwable t<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                                listeners<span style=color:#719e07>.</span>remove<span style=color:#719e07>(</span>entry<span style=color:#719e07>.</span>getKey<span style=color:#719e07>());</span>
+                            <span style=color:#719e07>}</span>
+                        <span style=color:#719e07>}</span>
+                        Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>5000<span style=color:#719e07>);</span> <span style=color:#586e75>// timely trigger change event
+</span><span style=color:#586e75></span>                    <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>Throwable t<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                        t<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>});</span>
+        t<span style=color:#719e07>.</span>setDaemon<span style=color:#719e07>(</span><span style=color:#cb4b16>true</span><span style=color:#719e07>);</span>
+        t<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>addListener</span><span style=color:#719e07>(</span>String key<span style=color:#719e07>,</span> CallbackListener listener<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        listeners<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span>key<span style=color:#719e07>,</span> listener<span style=color:#719e07>);</span>
+        listener<span style=color:#719e07>.</span>changed<span style=color:#719e07>(</span>getChanged<span style=color:#719e07>(</span>key<span style=color:#719e07>));</span> <span style=color:#586e75>// send notification for change
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>private</span> String <span style=color:#268bd2>getChanged</span><span style=color:#719e07>(</span>String key<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;Changed: &#34;</span> <span style=color:#719e07>+</span> <span style=color:#719e07>new</span> SimpleDateFormat<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;yyyy-MM-dd HH:mm:ss&#34;</span><span style=color:#719e07>).</span>format<span style=color:#719e07>(</span><span style=color:#719e07>new</span> Date<span style=color:#719e07>());</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h5 id=service-exposure-of-provider>Service exposure of Provider</h5><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;callbackService&#34;</span> class=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.callback.impl.CallbackServiceImpl&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+<span style=color:#268bd2>&lt;dubbo:service</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.callback.api.CallbackService&#34;</span> ref=<span style=color:#2aa198>&#34;callbackService&#34;</span> connections=<span style=color:#2aa198>&#34;1&#34;</span> callbacks=<span style=color:#2aa198>&#34;1000&#34;</span><span style=color:#268bd2>&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:method</span> name=<span style=color:#2aa198>&#34;addListener&#34;</span><span style=color:#268bd2>&gt;</span>
+        <span style=color:#268bd2>&lt;dubbo:argument</span> index=<span style=color:#2aa198>&#34;1&#34;</span> callback=<span style=color:#2aa198>&#34;true&#34;</span><span style=color:#268bd2>/&gt;</span>
+        <span style=color:#586e75>&lt;!--&lt;dubbo:argument type=&#34;com.demo.CallbackListener&#34; callback=&#34;true&#34; /&gt;--&gt;</span>
+    <span style=color:#268bd2>&lt;/dubbo:method&gt;</span>
+<span style=color:#268bd2>&lt;/dubbo:service&gt;</span>
+</code></pre></div><p>Here,Provider needs to declare which parameter is the Callback parameter in the method.</p><h5 id=callback-interface-implementation-of-consumer>Callback interface implementation of Consumer</h5><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>CallbackService callbackService <span style=color:#719e07>=</span> <span style=color:#719e07>...;</span>
+callbackService<span style=color:#719e07>.</span>addListener<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;foo.bar&#34;</span><span style=color:#719e07>,</span> <span style=color:#719e07>new</span> CallbackListener<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>changed</span><span style=color:#719e07>(</span>String msg<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;callback1:&#34;</span> <span style=color:#719e07>+</span> msg<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+<span style=color:#719e07>});</span>
+</code></pre></div><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:https://github.com/dubbo/dubbo-samples [...]
+
+<span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;demoService&#34;</span> check=<span style=color:#2aa198>&#34;false&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.notify.api.DemoService&#34;</span> version=<span style=color:#2aa198>&#34;1.0.0&#34;</span> group=<span style=color:#2aa198>&#34;cn&#34;</span><span style=color:#268bd2>&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:method</span> name=<span style=color:#2aa198>&#34;sayHello&#34;</span> onreturn=<span style=color:#2aa198>&#34;demoCallback.onreturn&#34;</span> onthrow=<span style=color:#2aa198>&#34;demoCallback.onthrow&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;/dubbo:reference&gt;</span>
+</code></pre></div><p>Among them,the code of NotifyImpl is as follow:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>NotifyImpl</span> <span style=color:#268bd2>implements</span> Notify<span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> Map<span style=color:#719e07>&lt;</span>Integer<span style=color:#719e07>,</span> String<span style=color:#719e07>&gt;</span> ret <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> HashMap<span style=color:#719e07>&lt;</span>Integer<span style=color:#719e07>,</span> String<span style=color:#719e07>&gt;();</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>onreturn</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> id<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        ret<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span>id<span style=color:#719e07>,</span> name<span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;onreturn: &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>onthrow</span><span style=color:#719e07>(</span>Throwable ex<span style=color:#719e07>,</span> String name<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> id<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;onthrow: &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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&rsquo;s parameters are the same as the calling method parameters;</li><li><code>onreturn</code> method&rsquo;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&rsquo;s first parameter is an invoked exception,and the others are the  [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/generic-invoke-of-dubbo/index.html b/en/blog/2018/08/14/generic-invoke-of-dubbo/index.html
new file mode 100644
index 0000000..7912d4a
--- /dev/null
+++ b/en/blog/2018/08/14/generic-invoke-of-dubbo/index.html
@@ -0,0 +1,130 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-generic-invoke.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+secti [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Generic%20invoke%20of%20Dubbo" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#generic-invoke-through-spring-xml-configuration>Generic invoke through Spring XML configuration</a></li><li><a href=#generic-invoke-through-api-programming>Generic invoke through API programming</a></li><li><a href=#the-case-where-parameters-or-return-values-are-pojos>The case where parameters or return values are POJOs< [...]
+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&rsquo;s take a look at how the consumer uses generic invoke for service call.</p><h2 id=generic-invoke-through-spring-xml-configuration>Generic invoke through Spring XML configuration</h2><p>Declare <code>generic="true"</code> in Spring configuration, such as</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code  [...]
+</code></pre></div><p>Where you need to use it, you can call it by forcing a type cast to GenericService.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>GenericService userService <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>GenericService<span style=color:#719e07>)</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span><sp [...]
+<span style=color:#586e75>// primary param and return value
+</span><span style=color:#586e75></span>String name <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>String<span style=color:#719e07>)</span> userService<span style=color:#719e07>.</span>$invoke<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;delete&#34;</span><span style=color:#719e07>,</span> <span style=color:#719e07>new</span> String<span style=color:#719e07>[]{</span><span style=color:#dc322f>int</span><span style=color:#719e07>.</span>class<span  [...]
+System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+</code></pre></div><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. I [...]
+application<span style=color:#719e07>.</span>setName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;api-generic-consumer&#34;</span><span style=color:#719e07>);</span>
+
+RegistryConfig registry <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>();</span>
+registry<span style=color:#719e07>.</span>setAddress<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;zookeeper://127.0.0.1:2181&#34;</span><span style=color:#719e07>);</span>
+
+application<span style=color:#719e07>.</span>setRegistry<span style=color:#719e07>(</span>registry<span style=color:#719e07>);</span>
+
+ReferenceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;</span> reference <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ReferenceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;();</span>
+<span style=color:#586e75>// weak type interface name
+</span><span style=color:#586e75></span>reference<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.generic.api.IUserService&#34;</span><span style=color:#719e07>);</span>
+<span style=color:#586e75>// declared as a generalized interface
+</span><span style=color:#586e75></span>reference<span style=color:#719e07>.</span>setGeneric<span style=color:#719e07>(</span><span style=color:#cb4b16>true</span><span style=color:#719e07>);</span>
+
+reference<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span>application<span style=color:#719e07>);</span>
+
+<span style=color:#586e75>// replace all interface references with com.alibaba.dubbo.rpc.service.GenericService
+</span><span style=color:#586e75></span>GenericService genericService <span style=color:#719e07>=</span> reference<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+
+String name <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>String<span style=color:#719e07>)</span> genericService<span style=color:#719e07>.</span>$invoke<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;delete&#34;</span><span style=color:#719e07>,</span> <span style=color:#719e07>new</span> String<span style=color:#719e07>[]{</span><span style=color:#dc322f>int</span><span style=color:#719e07>.</span>class<span style=color:#719e07>.</span>getName<s [...]
+System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+</code></pre></div><p>Through the API, you don&rsquo;t need to configure the service in advance like XML. You can dynamically construct ReferenceConfig; the API is more common than XML.</p><h2 id=the-case-where-parameters-or-return-values-are-pojos>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.</ [...]
+Map<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Object<span style=color:#719e07>&gt;</span> params <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> HashMap<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Object<span style=color:#719e07>&gt;();</span>
+param<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;class&#34;</span><span style=color:#719e07>,</span> <span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.generic.api.Params&#34;</span><span style=color:#719e07>);</span>
+param<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;query&#34;</span><span style=color:#719e07>,</span> <span style=color:#2aa198>&#34;a=b&#34;</span><span style=color:#719e07>);</span>
+Object user <span style=color:#719e07>=</span> userService<span style=color:#719e07>.</span>$invoke<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;get&#34;</span><span style=color:#719e07>,</span> parameterTypes<span style=color:#719e07>,</span> <span style=color:#719e07>new</span> Object<span style=color:#719e07>[]{</span>param<span style=color:#719e07>});</span>
+System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;sample one result: &#34;</span> <span style=color:#719e07>+</span> user<span style=color:#719e07>);</span>
+</code></pre></div><p>The output of the above code is:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>sample one result: {name=charles, id=1, class=com.alibaba.dubbo.samples.generic.api.User}
+</code></pre></div><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 id=generic-interface-implementation>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, a [...]
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> Object <span style=color:#268bd2>$invoke</span><span style=color:#719e07>(</span>String method<span style=color:#719e07>,</span> String<span style=color:#719e07>[]</span> parameterTypes<span style=color:#719e07>,</span> Object<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> GenericException <span style=color:#719e07>{</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>method<span style=color:#719e07>.</span>equals<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;hi&#34;</span><span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hi, &#34;</span> <span style=color:#719e07>+</span> args<span style=color:#719e07>[</span>0<span style=color:#719e07>];</span>
+        <span style=color:#719e07>}</span> <span style=color:#719e07>else</span> <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>method<span style=color:#719e07>.</span>equals<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;hello&#34;</span><span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> args<span style=color:#719e07>[</span>0<span style=color:#719e07>];</span>
+        <span style=color:#719e07>}</span>
+
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;welcome&#34;</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=server-exposed-service>Server exposed service</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>ApplicationConfig application <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ApplicationConfig<span style=color:#719e07>();</span>
+application<span style=color:#719e07>.</span>setName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;api-generic-provider&#34;</span><span style=color:#719e07>);</span>
+
+RegistryConfig registry <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>();</span>
+registry<span style=color:#719e07>.</span>setAddress<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;zookeeper://127.0.0.1:2181&#34;</span><span style=color:#719e07>);</span>
+
+application<span style=color:#719e07>.</span>setRegistry<span style=color:#719e07>(</span>registry<span style=color:#719e07>);</span>
+
+GenericService genericService <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> GenericServiceImpl<span style=color:#719e07>();</span>
+
+ServiceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;</span> service <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ServiceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;();</span>
+service<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span>application<span style=color:#719e07>);</span>
+service<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.generic.api.HelloService&#34;</span><span style=color:#719e07>);</span>
+service<span style=color:#719e07>.</span>setRef<span style=color:#719e07>(</span>genericService<span style=color:#719e07>);</span>
+service<span style=color:#719e07>.</span>export<span style=color:#719e07>();</span>
+
+ServiceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;</span> service2 <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ServiceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;();</span>
+service2<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span>application<span style=color:#719e07>);</span>
+service2<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.generic.api.HiService&#34;</span><span style=color:#719e07>);</span>
+service2<span style=color:#719e07>.</span>setRef<span style=color:#719e07>(</span>genericService<span style=color:#719e07>);</span>
+service2<span style=color:#719e07>.</span>export<span style=color:#719e07>();</span>
+</code></pre></div><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 id=service-invoke-on-the-consumer>Service invoke on the consumer</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>ApplicationConfig application <span style=color:#719e07>=</span> <span style=color:#719 [...]
+application<span style=color:#719e07>.</span>setName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;api-generic-consumer&#34;</span><span style=color:#719e07>);</span>
+
+RegistryConfig registry <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> RegistryConfig<span style=color:#719e07>();</span>
+registry<span style=color:#719e07>.</span>setAddress<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;zookeeper://127.0.0.1:2181&#34;</span><span style=color:#719e07>);</span>
+
+application<span style=color:#719e07>.</span>setRegistry<span style=color:#719e07>(</span>registry<span style=color:#719e07>);</span>
+
+ReferenceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;</span> reference <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ReferenceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;();</span>
+<span style=color:#586e75>// weak type interface name
+</span><span style=color:#586e75></span>reference<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span>HiService<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+reference<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span>application<span style=color:#719e07>);</span>
+
+HiService hiService <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>HiService<span style=color:#719e07>)</span> reference<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>hiService<span style=color:#719e07>.</span>hi<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;dubbo&#34;</span><span style=color:#719e07>));</span>
+
+ReferenceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;</span> reference2 <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ReferenceConfig<span style=color:#719e07>&lt;</span>GenericService<span style=color:#719e07>&gt;();</span>
+<span style=color:#586e75>// weak type interface name
+</span><span style=color:#586e75></span>reference2<span style=color:#719e07>.</span>setInterface<span style=color:#719e07>(</span>HelloService<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+reference2<span style=color:#719e07>.</span>setApplication<span style=color:#719e07>(</span>application<span style=color:#719e07>);</span>
+
+HelloService helloService <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>HelloService<span style=color:#719e07>)</span> reference2<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>helloService<span style=color:#719e07>.</span>hello<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;community&#34;</span><span style=color:#719e07>));</span>
+</code></pre></div><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 id=others>Others</h2><ul><li>The generic invoke and generic interface implementations introduced in this article are all based on the native [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/index.html b/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/index.html
new file mode 100644
index 0000000..b25c6cc
--- /dev/null
+++ b/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/index.html
@@ -0,0 +1,148 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo2-js.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+t [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Implementation%20of%20cross-language%20calls%20by%20Dubbo2.js" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#cross-language-calls-for-micro-service>Cross-language calls for micro service</a></li><li><a href=#cross-language-calls-by-a-common-protocol>Cross-language calls by a common protocol</a><ul><li><a href=#springmvc>SpringMVC</a></li><li><a href=#we-support-some-common-protocols>We support some common protocols</a></li><li> [...]
+<span style=color:#268bd2>&lt;dubbo:protocol</span> name=<span style=color:#2aa198>&#34;jsonrpc&#34;</span> port=<span style=color:#2aa198>&#34;8080&#34;</span> <span style=color:#268bd2>/&gt;</span>
+</code></pre></div><h3 id=customized-protocols-for-cross-language-support>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, [...]
+    String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+    String <span style=color:#268bd2>echo</span><span style=color:#719e07>()</span> <span style=color:#719e07>;</span>
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>test</span><span style=color:#719e07>();</span>
+    UserResponse <span style=color:#268bd2>getUserInfo</span><span style=color:#719e07>(</span>UserRequest request<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Then we implement the interface:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoProviderImpl</span> <span style=color:#268bd2>implements</span> DemoProvider <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;[&#34;</span> <span style=color:#719e07>+</span> <span style=color:#719e07>new</span> SimpleDateFormat<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;HH:mm:ss&#34;</span><span style=color:#719e07>).</span>format<span style=color:#719e07>(</span><span style=color:#719e07>new</span> Date<span style=color:#719e07>())</s [...]
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;Hello &#34;</span> <span style=color:#719e07>+</span> name <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;, response form provider: &#34;</span> <span style=color:#719e07>+</span> RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>().</span>getLocalAddress<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>echo</span><span style=color:#719e07>()</span>  <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;receive....&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;pang&#34;</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>test</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;test&#34;</span><span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> UserResponse <span style=color:#268bd2>getUserInfo</span><span style=color:#719e07>(</span>UserRequest request<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>request<span style=color:#719e07>);</span>
+        UserResponse response <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> UserResponse<span style=color:#719e07>();</span>
+        response<span style=color:#719e07>.</span>setStatus<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;ok&#34;</span><span style=color:#719e07>);</span>
+        Map<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> String<span style=color:#719e07>&gt;</span> map <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> HashMap<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> String<span style=color:#719e07>&gt;();</span>
+        map<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;id&#34;</span><span style=color:#719e07>,</span> <span style=color:#2aa198>&#34;1&#34;</span><span style=color:#719e07>);</span>
+        map<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;name&#34;</span><span style=color:#719e07>,</span> <span style=color:#2aa198>&#34;test&#34;</span><span style=color:#719e07>);</span>
+        response<span style=color:#719e07>.</span>setInfo<span style=color:#719e07>(</span>map<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> response<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>After that,<span data-type=color style=color:#24292e> we expose the dubbo service with xml files:</span></p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#719e07>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
+<span style=color:#268bd2>&lt;beans</span> xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+       xmlns:dubbo=<span style=color:#2aa198>&#34;http://code.alibabatech.com/schema/dubbo&#34;</span>
+       xmlns=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans&#34;</span>
+       xsi:schemaLocation=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+</span><span style=color:#2aa198>   http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&#34;</span><span style=color:#268bd2>&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- dubbo provider info, used to compute dependency --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:application</span> name=<span style=color:#2aa198>&#34;demo-provider&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#268bd2>&lt;dubbo:registry</span> protocol=<span style=color:#2aa198>&#34;zookeeper&#34;</span> address=<span style=color:#2aa198>&#34;localhost:2181&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- dubbo protocol, used to expose service at port 20880 --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:protocol</span> name=<span style=color:#2aa198>&#34;dubbo&#34;</span> port=<span style=color:#2aa198>&#34;20880&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- realize a service as a local bean --&gt;</span>
+    <span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;demoProvider&#34;</span> class=<span style=color:#2aa198>&#34;com.alibaba.dubbo.demo.provider.DemoProviderImpl&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- claim for service interfaces to expose --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:service</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.demo.DemoProvider&#34;</span> ref=<span style=color:#2aa198>&#34;demoProvider&#34;</span> version=<span style=color:#2aa198>&#34;1.0.0&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+<span style=color:#268bd2>&lt;/beans&gt;</span>
+</code></pre></div><p>After we implemented all the configurations on server side, initiate an object initiater to register a dubbo service locally:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>Provider</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> Exception <span style=color:#719e07>{</span>
+        ClassPathXmlApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ClassPathXmlApplicationContext<span style=color:#719e07>(</span><span style=color:#719e07>new</span> String<span style=color:#719e07>[]{</span><span style=color:#2aa198>&#34;META-INF/spring/dubbo-demo-provider.xml&#34;</span><span style=color:#719e07>});</span>
+        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=2-implement-dubbo-client-side-for-nodejs>2. Implement dubbo client-side for nodejs</h3><p>Install dubbo2.js using npm:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>npm install dubbo2.js --save
+</code></pre></div><p>Configure dubboConfig.ts:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-typescript data-lang=typescript><span style=color:#268bd2>import</span> { Dubbo, java, TDubboCallResult } <span style=color:#268bd2>from</span> <span style=color:#2aa198>&#39;dubbo2.js&#39;</span>
+
+<span style=color:#268bd2>const</span> dubbo <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Dubbo({
+  application<span style=color:#719e07>:</span> {name<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;demo-provider&#39;</span>},
+  register<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;localhost:2181&#39;</span>,
+  dubboVersion<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;2.0.0&#39;</span>,
+  interfaces<span style=color:#719e07>:</span> [
+    <span style=color:#2aa198>&#39;com.alibaba.dubbo.demo.DemoProvider&#39;</span>,
+  ],
+});
+
+<span style=color:#268bd2>interface</span> IDemoService {
+  sayHello(name: <span style=color:#dc322f>string</span>)<span style=color:#719e07>:</span> TDubboCallResult&lt;<span style=color:#268bd2>string</span>&gt;;
+}
+
+<span style=color:#268bd2>export</span> <span style=color:#268bd2>const</span> demoService <span style=color:#719e07>=</span> dubbo.proxyService&lt;<span style=color:#268bd2>IDemoService</span>&gt;({
+  dubboInterface<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;com.alibaba.dubbo.demo.DemoProvider&#39;</span>,
+  version<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;1.0.0&#39;</span>,
+  methods<span style=color:#719e07>:</span> {
+    sayHello(name: <span style=color:#dc322f>string</span>) {
+      <span style=color:#719e07>return</span> [java.<span style=color:#b58900>String</span>(name)];
+    },
+
+    echo() {},
+
+    test() {},
+
+    getUserInfo() {
+      <span style=color:#719e07>return</span> [
+        java.combine(<span style=color:#2aa198>&#39;com.alibaba.dubbo.demo.UserRequest&#39;</span>, {
+          id: <span style=color:#dc322f>1</span>,
+          name<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;nodejs&#39;</span>,
+          email<span style=color:#719e07>:</span> <span style=color:#2aa198>&#39;node@qianmi.com&#39;</span>,
+        }),
+      ];
+    },
+  },
+});
+</code></pre></div><blockquote><p>Using typescript brings better coding experience.</p></blockquote><p>Implement caller class main.ts:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-typescript data-lang=typescript><span style=color:#268bd2>import</span> {demoService} <span style=color:#268bd2>from</span> <span style=color:#2aa198>&#39;./dubboConfig&#39;</span>
+
+demoService.sayHello(<span style=color:#2aa198>&#39;kirito&#39;</span>).then(({res,err})<span style=color:#719e07>=&gt;</span>{
+    console.log(res)
+});
+</code></pre></div><h3 id=3-call-maints>3. Call main.ts:</h3><p>Run nodejs client in Debug mode:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=color:#268bd2>DEBUG</span><span style=color:#719e07>=</span>dubbo* ts-node main.ts
+</code></pre></div><p>Checkout running results:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>Hello kirito, response form provider: 172.19.6.151:20880
+</code></pre></div><p>Congratulations!</p><h2 id=features>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 id=more-details>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><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/14/generic-invoke-of-dubbo/ class="btn btn-primary"><spa [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/index.html b/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/index.html
new file mode 100644
index 0000000..d84f6b1
--- /dev/null
+++ b/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/index.html
@@ -0,0 +1,148 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/introduction-to-dubbo-qos.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Manipulating%20Services%20Dynamically%20via%20QoS" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#mechanism-of-qos>Mechanism of QoS</a><ul><li><a href=#qos-commands>QoS Commands:</a></li><li><a href=#qos-parameters>QoS' Parameters</a></li></ul></li></ul></nav></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache [...]
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is <span style=color:#2aa198>&#39;^]&#39;</span>.
+  ?????????  ???    ??  ???????????  ???????????   ????????
+  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???
+  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???
+  ???    ??? ???    ???  ??????????   ??????????  ???    ???
+  ???    ??? ???    ??? ???????????  ???????????  ???    ???
+  ???    ??? ???    ???   ???    ???   ???    ??? ???    ???
+  ???   ???? ???    ???   ???    ???   ???    ??? ???    ???
+  ?????????  ?????????  ???????????  ???????????   ????????
+
+
+dubbo&gt;
+</code></pre></div><p>A <code>dubbo></code> prompt would show up once you connect to server. Now input <code>help</code>:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>dubbo&gt;help
++---------+----------------------------------------------------------------------------------+
+|    <span style=color:#b58900>help</span> | <span style=color:#b58900>help</span> <span style=color:#b58900>command</span>                                                                     |
++---------+----------------------------------------------------------------------------------+
+|      ls | ls service                                                                       |
++---------+----------------------------------------------------------------------------------+
+| offline | offline dubbo                                                                    |
++---------+----------------------------------------------------------------------------------+
+|  online | online dubbo                                                                     |
++---------+----------------------------------------------------------------------------------+
+|    quit | quit telnet console                                                              |
++---------+----------------------------------------------------------------------------------+
+
+dubbo&gt;
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>dubbo&gt;help online
++--------------+----------------------------------------------------------------------------------+
+| COMMAND NAME | online                                                                           |
++--------------+----------------------------------------------------------------------------------+
+|      EXAMPLE | online dubbo                                                                     |
+|              | online xx.xx.xxx.service                                                         |
++--------------+----------------------------------------------------------------------------------+
+</code></pre></div><p>Use <code>ls</code> to check services' status:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=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></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-s [...]
+OK
+</code></pre></div><p>You can see that the command responds with <code>OK</code>. Check the services' status using <code>ls</code>:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=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></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>dubbo&gt;quit
+BYE!
+Connection closed by foreign host.
+</code></pre></div><h4 id=access-qos-via-http>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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>$ curl -i http://localhost:22222/online?service<span style=color:#719e07>=</spa [...]
+HTTP/1.1 <span style=color:#2aa198>200</span> OK
+Content-Type: text/plain
+Content-Length: <span style=color:#2aa198>2</span>
+
+OK%
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback [...]
+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></div><p>You can see that the service&rsquo;s <code>PUB</code> status has been changed to <code>Y</code>.</p><h3 id=qos-parameters>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></t [...]
+-Ddubbo.application.qos.port=33333
+-Ddubbo.application.qos.accept.foreign.ip=false
+</code></pre></div><h4 id=dubboproperties><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>dubbo.application.qos.enable=true
+dubbo.application.qos.port=33333
+dubbo.application.qos.accept.foreign.ip=false
+</code></pre></div><h4 id=xml>XML</h4><p>If you are going to config using XML, you can try this:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#719e07>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
+<span style=color:#268bd2>&lt;beans</span> xmlns=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans&#34;</span>
+       xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+       xmlns:dubbo=<span style=color:#2aa198>&#34;http://dubbo.apache.org/schema/dubbo&#34;</span>
+       xsi:schemaLocation=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans
+</span><span style=color:#2aa198>       http://www.springframework.org/schema/beans/spring-beans.xsd
+</span><span style=color:#2aa198>       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd&#34;</span><span style=color:#268bd2>&gt;</span>
+  <span style=color:#268bd2>&lt;dubbo:application</span> name=<span style=color:#2aa198>&#34;demo-provider&#34;</span><span style=color:#268bd2>&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:parameter</span> key=<span style=color:#2aa198>&#34;qos.enable&#34;</span> value=<span style=color:#2aa198>&#34;true&#34;</span><span style=color:#268bd2>/&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:parameter</span> key=<span style=color:#2aa198>&#34;qos.accept.foreign.ip&#34;</span> value=<span style=color:#2aa198>&#34;false&#34;</span><span style=color:#268bd2>/&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:parameter</span> key=<span style=color:#2aa198>&#34;qos.port&#34;</span> value=<span style=color:#2aa198>&#34;33333&#34;</span><span style=color:#268bd2>/&gt;</span>
+  <span style=color:#268bd2>&lt;/dubbo:application&gt;</span>
+  <span style=color:#268bd2>&lt;dubbo:registry</span> address=<span style=color:#2aa198>&#34;multicast://224.5.6.7:1234&#34;</span><span style=color:#268bd2>/&gt;</span>
+  <span style=color:#268bd2>&lt;dubbo:protocol</span> name=<span style=color:#2aa198>&#34;dubbo&#34;</span> port=<span style=color:#2aa198>&#34;20880&#34;</span><span style=color:#268bd2>/&gt;</span>
+  <span style=color:#268bd2>&lt;dubbo:service</span> interface=<span style=color:#2aa198>&#34;org.apache.dubbo.demo.provider.DemoService&#34;</span> ref=<span style=color:#2aa198>&#34;demoService&#34;</span><span style=color:#268bd2>/&gt;</span>
+  <span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;demoService&#34;</span> class=<span style=color:#2aa198>&#34;org.apache.dubbo.demo.provider.DemoServiceImpl&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;/beans&gt;</span>
+</code></pre></div><h4 id=spring-boot-auto-configuration><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>dubbo.application.qosEnable=true
+dubbo.application.qosPort=33333
+dubbo.application.qosAcceptForeignIp=false
+</code></pre></div><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/ class="btn btn-primary">Next <span class=ml-1>→</span></a></li></ul></div></main></div></div><footer class="bg-dark py-5 row d-print-none"><div class= [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/index.html b/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/index.html
new file mode 100644
index 0000000..a70a69d
--- /dev/null
+++ b/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/index.html
@@ -0,0 +1,148 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/spring-boot-dubbo-start-stop-analysis.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22fron [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Source%20code%20analysis%20of%20spring-boot+Dubbo%20App%20start%20and%20stop" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#introduction>Introduction</a></li><li><a href=#the-analysis-of-dubboconsumer-startup>The analysis of DubboConsumer startup</a></li><li><a href=#the-analysis-of-dubboconsumer-exit>The analysis of DubboConsumer exit</a></li><li><a href=#summary>Summary</a></li><li><a href=#problems>Problems</a><ul><li><a href=#notice>Notic [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DubboConsumerDemo</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        SpringApplication<span style=color:#719e07>.</span>run<span style=color:#719e07>(</span>DubboConsumerDemo<span style=color:#719e07>.</span>class<span style=color:#719e07>,</span>args<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+<span style=color:#719e07>}</span>
+</code></pre></div><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</ [...]
+<span style=color:#2aa198>&#34;container-0&#34;</span> <span style=color:#586e75>#37 prio=5 os_prio=31 tid=0x00007fbe312f5800 nid=0x7103 waiting on condition  [0x0000700010144000]</span>
+<span style=color:#2aa198>&#34;container-1&#34;</span> <span style=color:#586e75>#49 prio=5 os_prio=31 tid=0x00007fbe3117f800 nid=0x7b03 waiting on condition  [0x0000700010859000]</span>
+<span style=color:#2aa198>&#34;DestroyJavaVM&#34;</span> <span style=color:#586e75>#83 prio=5 os_prio=31 tid=0x00007fbe30011000 nid=0x2703 waiting on condition  [0x0000000000000000]</span>
+<span style=color:#2aa198>&#34;VM Thread&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe3005e800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x3703 runnable
+<span style=color:#2aa198>&#34;GC Thread#0&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe30013800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x5403 runnable
+<span style=color:#2aa198>&#34;GC Thread#1&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe30021000 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x5303 runnable
+<span style=color:#2aa198>&#34;GC Thread#2&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe30021800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x2d03 runnable
+<span style=color:#2aa198>&#34;GC Thread#3&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe30022000 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x2f03 runnable
+<span style=color:#2aa198>&#34;G1 Main Marker&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe30040800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x5203 runnable
+<span style=color:#2aa198>&#34;G1 Conc#0&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe30041000 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x4f03 runnable
+<span style=color:#2aa198>&#34;G1 Refine#0&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe31044800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x4e03 runnable
+<span style=color:#2aa198>&#34;G1 Refine#1&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe31045800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x4d03 runnable
+<span style=color:#2aa198>&#34;G1 Refine#2&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe31046000 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x4c03 runnable
+<span style=color:#2aa198>&#34;G1 Refine#3&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe31047000 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x4b03 runnable
+<span style=color:#2aa198>&#34;G1 Young RemSet Sampling&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe31047800 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x3603 runnable
+<span style=color:#2aa198>&#34;VM Periodic Task Thread&#34;</span> <span style=color:#268bd2>os_prio</span><span style=color:#719e07>=</span><span style=color:#2aa198>31</span> <span style=color:#268bd2>tid</span><span style=color:#719e07>=</span>0x00007fbe31129000 <span style=color:#268bd2>nid</span><span style=color:#719e07>=</span>0x6703 waiting on condition
+
+</code></pre></div><blockquote><p>We can find all the thread digests by <code>grep tid</code> here, and find the line that doesn&rsquo;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 &ldquo;suspicious&rdquo; 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 w [...]
+        Thread awaitThread <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;container-&#34;</span> <span style=color:#719e07>+</span> <span style=color:#719e07>(</span>containerCounter<span style=color:#719e07>.</span>get<span style=color:#719e07>()))</span> <span style=color:#719e07>{</span>
+
+            <span style=color:#268bd2>@Override</span>
+            <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>run</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                TomcatEmbeddedServletContainer<span style=color:#719e07>.</span>this<span style=color:#719e07>.</span>tomcat<span style=color:#719e07>.</span>getServer<span style=color:#719e07>().</span>await<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span>
+
+        <span style=color:#719e07>};</span>
+        awaitThread<span style=color:#719e07>.</span>setContextClassLoader<span style=color:#719e07>(</span>getClass<span style=color:#719e07>().</span>getClassLoader<span style=color:#719e07>());</span>
+        awaitThread<span style=color:#719e07>.</span>setDaemon<span style=color:#719e07>(</span><span style=color:#cb4b16>false</span><span style=color:#719e07>);</span>
+        awaitThread<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><p>Let&rsquo;s add a breakpoint in this method, and focus on the call stack:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-plain data-lang=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></div><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 [...]
+        <span style=color:#586e75>// ...
+</span><span style=color:#586e75></span>        <span style=color:#719e07>if</span><span style=color:#719e07>(</span> port<span style=color:#719e07>==-</span>1 <span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                awaitThread <span style=color:#719e07>=</span> Thread<span style=color:#719e07>.</span>currentThread<span style=color:#719e07>();</span>
+                <span style=color:#719e07>while</span><span style=color:#719e07>(!</span>stopAwait<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                    <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                        Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span> 10000 <span style=color:#719e07>);</span>
+                    <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span><span style=color:#719e07>(</span> InterruptedException ex <span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                        <span style=color:#586e75>// continue and check the flag
+</span><span style=color:#586e75></span>                    <span style=color:#719e07>}</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>finally</span> <span style=color:#719e07>{</span>
+                awaitThread <span style=color:#719e07>=</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>;</span>
+            <span style=color:#719e07>}</span>
+            <span style=color:#719e07>return</span><span style=color:#719e07>;</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#586e75>// ...
+</span><span style=color:#586e75></span>    <span style=color:#719e07>}</span>
+</code></pre></div><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&rsquo;t exit.< [...]
+stopInternal:819<span style=color:#719e07>,</span> StandardServer <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>catalina<span style=color:#719e07>.</span>core<span style=color:#719e07>)</span>
+stop:226<span style=color:#719e07>,</span> LifecycleBase <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>catalina<span style=color:#719e07>.</span>util<span style=color:#719e07>)</span>
+stop:377<span style=color:#719e07>,</span> Tomcat <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>catalina<span style=color:#719e07>.</span>startup<span style=color:#719e07>)</span>
+stopTomcat:241<span style=color:#719e07>,</span> TomcatEmbeddedServletContainer <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>springframework<span style=color:#719e07>.</span>boot<span style=color:#719e07>.</span>context<span style=color:#719e07>.</span>embedded<span style=color:#719e07>.</span>tomcat<span style=color:#719e07>)</span>
+stop:295<span style=color:#719e07>,</span> TomcatEmbeddedServletContainer <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>springframework<span style=color:#719e07>.</span>boot<span style=color:#719e07>.</span>context<span style=color:#719e07>.</span>embedded<span style=color:#719e07>.</span>tomcat<span style=color:#719e07>)</span>
+stopAndReleaseEmbeddedServletContainer:306<span style=color:#719e07>,</span> EmbeddedWebApplicationContext <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>springframework<span style=color:#719e07>.</span>boot<span style=color:#719e07>.</span>context<span style=color:#719e07>.</span>embedded<span style=color:#719e07>)</span>
+onClose:155<span style=color:#719e07>,</span> EmbeddedWebApplicationContext <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>springframework<span style=color:#719e07>.</span>boot<span style=color:#719e07>.</span>context<span style=color:#719e07>.</span>embedded<span style=color:#719e07>)</span>
+doClose:1014<span style=color:#719e07>,</span> AbstractApplicationContext <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>springframework<span style=color:#719e07>.</span>context<span style=color:#719e07>.</span>support<span style=color:#719e07>)</span>
+run:929<span style=color:#719e07>,</span> AbstractApplicationContext$2 <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>springframework<span style=color:#719e07>.</span>context<span style=color:#719e07>.</span>support<span style=color:#719e07>)</span>
+</code></pre></div><p>Through source code analysis, it was executed by Spring&rsquo;s registered <code>ShutdownHook</code>.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>registerShutdownHook</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span><span style=color:#719e07>this</span><span style=color:#719e07>.</span>shutdownHook <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#586e75>// No shutdown hook registered yet.
+</span><span style=color:#586e75></span>            <span style=color:#719e07>this</span><span style=color:#719e07>.</span>shutdownHook <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Thread<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                <span style=color:#268bd2>@Override</span>
+                <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>run</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                    <span style=color:#268bd2>synchronized</span> <span style=color:#719e07>(</span>startupShutdownMonitor<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                        doClose<span style=color:#719e07>();</span>
+                    <span style=color:#719e07>}</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>};</span>
+            Runtime<span style=color:#719e07>.</span>getRuntime<span style=color:#719e07>().</span>addShutdownHook<span style=color:#719e07>(</span><span style=color:#719e07>this</span><span style=color:#719e07>.</span>shutdownHook<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><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 [...]
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>test</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(</span><span style=color:#719e07>new</span> Runnable<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+            <span style=color:#268bd2>@Override</span>
+            <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>run</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+                <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                    Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>1000000<span style=color:#719e07>);</span>
+                <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>InterruptedException e<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                    e<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}).</span>start<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><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><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/14/impleme [...]
\ No newline at end of file
diff --git a/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/index.html b/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/index.html
new file mode 100644
index 0000000..315c474
--- /dev/null
+++ b/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-meetup-chengdu.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+secti [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20fourth%20Dubbo%20meetup%20has%20been%20held%20in%20Chengdu" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#the-depth-of-the-user-communication>The depth of the user communication</a></li><li><a href=#meetup-activity-information>Meetup activity information</a></li><li><a href=#the-registration-information>The registration information</a></li></ul></nav></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a c [...]
\ No newline at end of file
diff --git a/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/index.html b/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/index.html
new file mode 100644
index 0000000..388f458
--- /dev/null
+++ b/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/index.html
@@ -0,0 +1,250 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-new-async.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=How%20to%20implement%20a%20fully%20asynchronous%20calls%20chain%20based%20on%20Dubbo" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#asynchronous-mode-before-version-26x>Asynchronous mode before version 2.6.x</a></li><li><a href=#enhancement-based-on-completablefuture-in-version-270>Enhancement based on CompletableFuture in version 2.7.0</a></li><li><a href=#example-1completablefuture-interface>example 1:CompletableFuture interface</a></li><li><a href [...]
+    String <span style=color:#268bd2>findFoo</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;fooService&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.foo.FooService&#34;</span><span style=color:#268bd2>&gt;</span>
+      <span style=color:#268bd2>&lt;dubbo:method</span> name=<span style=color:#2aa198>&#34;findFoo&#34;</span> async=<span style=color:#2aa198>&#34;true&#34;</span> <span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;/dubbo:reference&gt;</span>
+</code></pre></div><ol start=2><li>Obtain Future object through RpcContext.</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#586e75>// this call will return null immediately
+</span><span style=color:#586e75></span>fooService<span style=color:#719e07>.</span>findFoo<span style=color:#719e07>(</span>fooId<span style=color:#719e07>);</span>
+<span style=color:#586e75>// Obtain the Future instance. When the result is returned, Future instance will be notified and the result will be set to Future instance.
+</span><span style=color:#586e75></span>Future<span style=color:#719e07>&lt;</span>Foo<span style=color:#719e07>&gt;</span> fooFuture <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>().</span>getFuture<span style=color:#719e07>();</span>
+fooFuture<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+</code></pre></div><p>or</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#586e75>// this call will return null immediately
+</span><span style=color:#586e75></span>fooService<span style=color:#719e07>.</span>findFoo<span style=color:#719e07>(</span>fooId<span style=color:#719e07>);</span>
+<span style=color:#586e75>// get Dubbo&#39;s built-in ResponseFuture, and set the callback
+</span><span style=color:#586e75></span>ResponseFuture future <span style=color:#719e07>=</span> <span style=color:#719e07>((</span>FutureAdapter<span style=color:#719e07>)</span>RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>().</span>getFuture<span style=color:#719e07>()).</span>getFuture<span style=color:#719e07>();</span>
+future<span style=color:#719e07>.</span>setCallback<span style=color:#719e07>(</span><span style=color:#719e07>new</span> ResponseCallback<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>done</span><span style=color:#719e07>(</span>Object response<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>print<span style=color:#719e07>(</span>response<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>caught</span><span style=color:#719e07>(</span>Throwable exception<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        exception<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>});</span>
+</code></pre></div><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 [...]
+    CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div></li><li><p>If you don&rsquo;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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268b [...]
+    CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@AsyncFor</span><span style=color:#719e07>(</span>AsyncService<span style=color:#719e07>.</span>class<span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>GrettingServiceAsync</span> <span style=color:#268bd2>extends</span> GreetingsService <span style=color:#719e07>{</span>
+    CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHiAsync</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 ca [...]
+    String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AsyncServiceImpl</span> <span style=color:#268bd2>implements</span> AsyncService <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#268bd2>final</span> AsyncContext asyncContext <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>startAsync<span style=color:#719e07>();</span>
+        <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(()</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            asyncContext<span style=color:#719e07>.</span>write<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Hello &#34;</span> <span style=color:#719e07>+</span> name <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;, response from provider.&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}).</span>start<span style=color:#719e07>();</span>
+        <span style=color:#719e07>return</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-s [...]
+</code></pre></div></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&rsquo;s illustrate how to implement a fully asynchronous Dubbo service call chain through a few examples.</p><h2 id=example-1completablefuture-interface>example 1:CompletableFuture interface</h2><p>CompletableFuture interface can b [...]
+    CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Note that the return type of this interface is <code>CompletableFuture&lt;String></code>.</p></li><li><p>Provider Side</p><ul><li><p>Implementation</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AsyncServiceImpl</span> <span style=color:#268bd2>implements< [...]
+    <span style=color:#268bd2>public</span> CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> CompletableFuture<span style=color:#719e07>.</span>supplyAsync<span style=color:#719e07>(()</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>5000<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>InterruptedException e<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                e<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span>
+            <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;async response from provider.&#34;</span><span style=color:#719e07>;</span>
+        <span style=color:#719e07>});</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;asyncService&#34;</span> class=<span style=color:#2aa198>&#34;com.alibaba.dubbo.sampl [...]
+<span style=color:#268bd2>&lt;dubbo:service</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.async.api.AsyncService&#34;</span> ref=<span style=color:#2aa198>&#34;asyncService&#34;</span><span style=color:#268bd2>/&gt;</span>
+</code></pre></div><p>The Config is the same as the original interface.</p></li></ul></li><li><p>Consumer Side</p><ul><li>Config</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;asyncService&#34;</span> timeout=<span style=color:#2aa198>&#34;10000&#34;</span> interface=<span style=color:#2aa19 [...]
+</code></pre></div><p>The Config is the same as the original interface.</p><ul><li>Call remote service</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</sp [...]
+        ClassPathXmlApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ClassPathXmlApplicationContext<span style=color:#719e07>(</span><span style=color:#719e07>new</span> String<span style=color:#719e07>[]{</span><span style=color:#2aa198>&#34;META-INF/spring/async-consumer.xml&#34;</span><span style=color:#719e07>});</span>
+        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+        <span style=color:#268bd2>final</span> AsyncService asyncService <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>AsyncService<span style=color:#719e07>)</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;asyncService&#34;</span><span style=color:#719e07>);</span>
+       
+        CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> future <span style=color:#719e07>=</span> asyncService<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;async call request&#34;</span><span style=color:#719e07>);</span>
+        future<span style=color:#719e07>.</span>whenComplete<span style=color:#719e07>((</span>v<span style=color:#719e07>,</span> t<span style=color:#719e07>)</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>t <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                t<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>else</span> <span style=color:#719e07>{</span>
+                System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Response: &#34;</span> <span style=color:#719e07>+</span> v<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>});</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Executed before response return.&#34;</span><span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><p><code>CompletableFuture&lt;String> future = asyncService.sayHello("async call request");</code>It is convenient to return the Future instance, which implements the asynchronous service call on the Consumer side.</p></li></ol><h2 id=example-2synchronous-interface-uses-annotation-processor>Example 2:Synchronous interface uses Annotation Processor</h2><p>This example demonstrates how to implement the Consumer-side asynchronous service call using the Annotation Processo [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>GreetingsService</span> <span style=color:#719e07>{</span>
+    String <span style=color:#268bd2>sayHi</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>This is a generic definition of the Dubbo service interface. Note that add the @DubboAsync annotation when using Annotation Processor.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;dependency&gt;</span>
+    <span style=color:#268bd2>&lt;groupId&gt;</span>com.alibaba<span style=color:#268bd2>&lt;/groupId&gt;</span>
+    <span style=color:#268bd2>&lt;artifactId&gt;</span>dubbo-async-processer<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+    <span style=color:#268bd2>&lt;version&gt;</span>1.0.0-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+<span style=color:#268bd2>&lt;/dependency&gt;</span>
+<span style=color:#268bd2>&lt;plugin&gt;</span>
+    <span style=color:#268bd2>&lt;groupId&gt;</span>org.apache.maven.plugins<span style=color:#268bd2>&lt;/groupId&gt;</span>
+    <span style=color:#268bd2>&lt;artifactId&gt;</span>maven-compiler-plugin<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+    <span style=color:#268bd2>&lt;version&gt;</span>3.7.0<span style=color:#268bd2>&lt;/version&gt;</span>
+    <span style=color:#268bd2>&lt;configuration&gt;</span>
+        <span style=color:#268bd2>&lt;source&gt;</span>1.8<span style=color:#268bd2>&lt;/source&gt;</span>
+        <span style=color:#268bd2>&lt;target&gt;</span>1.8<span style=color:#268bd2>&lt;/target&gt;</span>
+        <span style=color:#268bd2>&lt;annotationProcessorPaths&gt;</span>
+            <span style=color:#268bd2>&lt;path&gt;</span>
+                <span style=color:#268bd2>&lt;groupId&gt;</span>com.alibaba<span style=color:#268bd2>&lt;/groupId&gt;</span>
+                <span style=color:#268bd2>&lt;artifactId&gt;</span>dubbo-async-processer<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+                <span style=color:#268bd2>&lt;version&gt;</span>1.0.0-SNAPSHOT<span style=color:#268bd2>&lt;/version&gt;</span>
+            <span style=color:#268bd2>&lt;/path&gt;</span>
+        <span style=color:#268bd2>&lt;/annotationProcessorPaths&gt;</span>
+    <span style=color:#268bd2>&lt;/configuration&gt;</span>
+<span style=color:#268bd2>&lt;/plugin&gt;</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=col [...]
+</span><span style=color:#586e75>* Generated by dubbo-async-processer
+</span><span style=color:#586e75>*/</span>
+<span style=color:#719e07>package</span> com.alibaba.dubbo.samples.api<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> java.util.concurrent.CompletableFuture<span style=color:#719e07>;</span>
+<span style=color:#268bd2>@javax.annotation.Generated</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;com.alibaba.dubbo.async.processor.AsyncAnnotationProcessor&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>@org.apache.dubbo.common.config.AsyncFor</span><span style=color:#719e07>(</span>com<span style=color:#719e07>.</span>alibaba<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>samples<span style=color:#719e07>.</span>api<span style=color:#719e07>.</span>GreetingsService<span style=color:#719e07>.</span>class<span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>GreetingsServiceAsync</span> <span style=color:#268bd2>extends</span> GreetingsService <span style=color:#719e07>{</span>
+CompletableFuture<span style=color:#719e07>&lt;</span>java<span style=color:#719e07>.</span>lang<span style=color:#719e07>.</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHiAsync</span><span style=color:#719e07>(</span>java<span style=color:#719e07>.</span>lang<span style=color:#719e07>.</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div></li><li><p>Provider side</p><ul><li>Config</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;greetingsService&#34;</span> class=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.async.impl.GreetingsServiceImpl&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;dubbo:service</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.api.GreetingsService&#34;</span> ref=<span style=color:#2aa198>&#34;greetingsService&#34;</span><span style=color:#268bd2>/&gt;</span>
+</code></pre></div><ul><li>Service implementation</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingsServiceImpl</span> <span style=color:#268bd2>implements</span> GreetingsService <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHi</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hi, &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div></li><li><p>Consumer side</p><ul><li>Config</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml> <span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;greetingsService&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.api.GreetingsServiceAsync&#34;</span><span style=color:#268bd2>/&gt;</span>
+</code></pre></div><p>Note that the service interface uses <strong>GreetingsServiceAsync</strong></p><ul><li>Service call</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style= [...]
+        ClassPathXmlApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ClassPathXmlApplicationContext<span style=color:#719e07>(</span><span style=color:#719e07>new</span> String<span style=color:#719e07>[]{</span><span style=color:#2aa198>&#34;META-INF/spring/async-consumer.xml&#34;</span><span style=color:#719e07>});</span>
+        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+   
+        GreetingsServiceAsync greetingsService <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>GreetingsServiceAsync<span style=color:#719e07>)</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;greetingsService&#34;</span><span style=color:#719e07>);</span>
+        CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> future <span style=color:#719e07>=</span> greetingsService<span style=color:#719e07>.</span>sayHiAsync<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;async call reqeust&#34;</span><span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;async call ret :&#34;</span> <span style=color:#719e07>+</span> future<span style=color:#719e07>.</span>get<span style=color:#719e07>());</span>
+        
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><p>In this way, we can use <code>CompletableFuture&lt;String> future = greetingsService.sayHiAsync("async call reqeust");</code> directly,and return CompletableFuture.</p></li></ol><h2 id=example-3use-asynccontext>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/dubbo-samples/tree/master/dubbo [...]
+    String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div></li><li><p>Provider side</p><ul><li>Config</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;asyncService&#34;</span> class=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;dubbo:service</span> async=<span style=color:#2aa198>&#34;true&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.async.api.AsyncService&#34;</span> ref=<span style=color:#2aa198>&#34;asyncService&#34;</span><span style=color:#268bd2>/&gt;</span>
+</code></pre></div><p>Note that adding <code>async="true"</code> indicates that this is a service that starts the Provider-side execution asynchronously.</p><ul><li>Asynchronous execution implementation</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AsyncServiceImpl</span [...]
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#268bd2>final</span> AsyncContext asyncContext <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>startAsync<span style=color:#719e07>();</span>
+        <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(()</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            asyncContext<span style=color:#719e07>.</span>signalContextSwitch<span style=color:#719e07>();</span>
+            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>500<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>InterruptedException e<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                e<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span>
+            asyncContext<span style=color:#719e07>.</span>write<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Hello &#34;</span> <span style=color:#719e07>+</span> name <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;, response from provider.&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}).</span>start<span style=color:#719e07>();</span>
+        <span style=color:#719e07>return</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div></li><li><p>Consumer side</p><ul><li>Config</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;asyncService&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.async.api.AsyncService&#34;</span><span style=color:#268bd2>/&gt;</span>
+</code></pre></div><ul><li>Service call</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:# [...]
+        ClassPathXmlApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ClassPathXmlApplicationContext<span style=color:#719e07>(</span><span style=color:#719e07>new</span> String<span style=color:#719e07>[]{</span><span style=color:#2aa198>&#34;META-INF/spring/async-consumer.xml&#34;</span><span style=color:#719e07>});</span>
+        context<span style=color:#719e07>.</span>start<span style=color:#719e07>();</span>
+   
+        AsyncService asyncService <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>AsyncService<span style=color:#719e07>)</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;asyncService&#34;</span><span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>asyncService<span style=color:#719e07>.</span>sayHello<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;async call request&#34;</span><span style=color:#719e07>));</span>
+        
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div></li></ol><h2 id=new-problems-resulted-from-asynchronization>New problems resulted from asynchronization</h2><h3 id=filter-chain>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  [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AsyncPostprocessFilter</span> <span style=color:#268bd2>extends</span> AbstractPostProcessFilter <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> Result <span style=color:#268bd2>invoke</span><span style=color:#719e07>(</span>Invoker<span style=color:#719e07>&lt;?&gt;</span> invoker<span style=color:#719e07>,</span> Invocation invocation<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> RpcException <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> postProcessResult<span style=color:#719e07>(</span>invoker<span style=color:#719e07>.</span>invoke<span style=color:#719e07>(</span>invocation<span style=color:#719e07>),</span> invoker<span style=color:#719e07>,</span> invocation<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>protected</span> Result <span style=color:#268bd2>doPostProcess</span><span style=color:#719e07>(</span>Result result<span style=color:#719e07>,</span> Invoker<span style=color:#719e07>&lt;?&gt;</span> invoker<span style=color:#719e07>,</span> Invocation invocation<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Filter get the return value: &#34;</span> <span style=color:#719e07>+</span> result<span style=color:#719e07>.</span>getValue<span style=color:#719e07>());</span>
+        <span style=color:#719e07>return</span> result<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=context-passing>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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>c [...]
+    <span style=color:#586e75>// Save the context of the current thread
+</span><span style=color:#586e75></span>    RpcContext context <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>();</span>
+    <span style=color:#268bd2>public</span> CompletableFuture<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> CompletableFuture<span style=color:#719e07>.</span>supplyAsync<span style=color:#719e07>(()</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            <span style=color:#586e75>// Set context into new thread
+</span><span style=color:#586e75></span>            RpcContext<span style=color:#719e07>.</span>setContext<span style=color:#719e07>(</span>context<span style=color:#719e07>);</span>
+            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>5000<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>InterruptedException e<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                e<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span>
+            <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;async response from provider.&#34;</span><span style=color:#719e07>;</span>
+        <span style=color:#719e07>});</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>However, AsyncContext also provides the signalContextSwitch() method for a convenient Context switch.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AsyncServiceImpl</span> <span style=color:#268bd2>implements</span> AsyncService <span style=color:#719e07> [...]
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#268bd2>final</span> AsyncContext asyncContext <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>startAsync<span style=color:#719e07>();</span>
+        <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(()</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            asyncContext<span style=color:#719e07>.</span>signalContextSwitch<span style=color:#719e07>();</span>
+            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>500<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>InterruptedException e<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                e<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span>
+            asyncContext<span style=color:#719e07>.</span>write<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Hello &#34;</span> <span style=color:#719e07>+</span> name <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;, response from provider.&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}).</span>start<span style=color:#719e07>();</span>
+        <span style=color:#719e07>return</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/ class="btn btn-primary">Next <span class=ml-1>→</span></a></li></ul></div></main></div></div><footer class="bg-dark py-5 row d-print-none"><div class="container-fluid mx-sm-5"> [...]
\ No newline at end of file
diff --git a/en/blog/2018/09/02/how-to-prepare-an-apache-release/index.html b/en/blog/2018/09/02/how-to-prepare-an-apache-release/index.html
new file mode 100644
index 0000000..d789dbe
--- /dev/null
+++ b/en/blog/2018/09/02/how-to-prepare-an-apache-release/index.html
@@ -0,0 +1,283 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/prepare-an-apache-release.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=How%20to%20prepare%20an%20Apache%20Release" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#understanding-the-apache-release-cycle>Understanding the Apache Release Cycle</a></li><li><a href=#preparation-of-local-building-environment>Preparation of Local Building Environment</a></li><li><a href=#pack--upload>Pack & Upload</a><ul><li><a href=#note>Note</a></li></ul></li><li><a href=#prepare-apache-release>Prepare [...]
+$ gpg --version <span style=color:#586e75>#check version,should be 2.x</span>
+</code></pre></div></li><li><p>Generate the key with GPG</p><ul><li>Generate the key according to the prompt</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ gpg2 --full-gen-key
+gpg <span style=color:#719e07>(</span>GnuPG<span style=color:#719e07>)</span> 2.0.12; Copyright <span style=color:#719e07>(</span>C<span style=color:#719e07>)</span> <span style=color:#2aa198>2009</span> 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 <span style=color:#719e07>select</span> what kind of key you want:
+  <span style=color:#719e07>(</span>1<span style=color:#719e07>)</span> RSA and RSA <span style=color:#719e07>(</span>default<span style=color:#719e07>)</span>
+  <span style=color:#719e07>(</span>2<span style=color:#719e07>)</span> DSA and Elgamal
+  <span style=color:#719e07>(</span>3<span style=color:#719e07>)</span> DSA <span style=color:#719e07>(</span>sign only<span style=color:#719e07>)</span>
+  <span style=color:#719e07>(</span>4<span style=color:#719e07>)</span> RSA <span style=color:#719e07>(</span>sign only<span style=color:#719e07>)</span>
+Your selection? <span style=color:#2aa198>1</span>
+RSA keys may be between <span style=color:#2aa198>1024</span> and <span style=color:#2aa198>4096</span> bits long.
+What keysize <span style=color:#719e07>do</span> you want? <span style=color:#719e07>(</span>2048<span style=color:#719e07>)</span> <span style=color:#2aa198>4096</span>
+Requested keysize is <span style=color:#2aa198>4096</span> bits
+Please specify how long the key should be valid.
+        <span style=color:#268bd2>0</span> <span style=color:#719e07>=</span> key does not expire
+     &lt;n&gt;  <span style=color:#719e07>=</span> key expires in n days
+     &lt;n&gt;w <span style=color:#719e07>=</span> key expires in n weeks
+     &lt;n&gt;m <span style=color:#719e07>=</span> key expires in n months
+     &lt;n&gt;y <span style=color:#719e07>=</span> key expires in n years
+Key is valid <span style=color:#719e07>for</span>? <span style=color:#719e07>(</span>0<span style=color:#719e07>)</span> 
+Key does not expire at all
+Is this correct? <span style=color:#719e07>(</span>y/N<span style=color:#719e07>)</span> 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:
+   <span style=color:#2aa198>&#34;Robert Burrell Donkin (CODE SIGNING KEY) &lt;rdonkin@apache.org&gt;&#34;</span>
+   
+Change <span style=color:#719e07>(</span>N<span style=color:#719e07>)</span>ame, <span style=color:#719e07>(</span>C<span style=color:#719e07>)</span>omment, <span style=color:#719e07>(</span>E<span style=color:#719e07>)</span>mail or <span style=color:#719e07>(</span>O<span style=color:#719e07>)</span>kay/<span style=color:#719e07>(</span>Q<span style=color:#719e07>)</span>uit? O
+You need a Passphrase to protect your secret key. <span style=color:#586e75># enter the password, which will be used frequently when packaging.</span>
+</code></pre></div><ul><li>View key id</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>$ gpg --list-keys
+pub   rsa4096/28681CB1 2018-04-26 <span style=color:#586e75># 28681CB1 is the key id</span>
+uid       <span style=color:#719e07>[</span>ultimate<span style=color:#719e07>]</span> liujun <span style=color:#719e07>(</span>apache-dubbo<span style=color:#719e07>)</span> &lt;liujun@apache.org&gt;
+sub   rsa4096/D3D6984B 2018-04-26
+   
+<span style=color:#586e75>########### Note: Different diaplay for different version.</span>
+$ gpg --list-keys
+pub   rsa4096 2018-11-12 <span style=color:#719e07>[</span>SC<span style=color:#719e07>]</span>
+      63AAE9838F4A303E40BAF5FEA3A1CA7A5D4A3981     <span style=color:#586e75># Last 8 character(5D4A3981) as key id,it will be used when send public key to keyserver</span>
+uid           <span style=color:#719e07>[</span> 绝对 <span style=color:#719e07>]</span> Victory Cao <span style=color:#719e07>(</span>CODE SIGNING KEY<span style=color:#719e07>)</span> &lt;victory@apache.org&gt;
+sub   rsa4096 2018-11-12 <span style=color:#719e07>[</span>E<span style=color:#719e07>]</span>
+       
+   
+<span style=color:#586e75># send public key to keyserver via key id </span>
+$ gpg --keyserver pgpkeys.mit.edu --send-key 28681CB1
+<span style=color:#586e75># 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></div><ul><li>If there are multiple public keys,you can set the default key</li></ul><p>~/.gnupg/gpg.conf</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback># 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></div><ul><li>If there are multiple public keys, you can also delete unuseful key:</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=color:#586e75>### Delete the private key first, then delete the public key.</span>
+   
+$ gpg --yes --delete-secret-keys shenglicao2@gmail.com   <span style=color:#586e75>### indicate email address  </span>
+   
+$ gpg --delete-keys 1808C6444C781C0AEA0AAD4C4D6A8007D20DB8A4 
+   
+</code></pre></div></li><li><p>Set up Apache central repository.</p><ul><li>The parent pom of Dubbo project is apache pom</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;parent&gt;</span>
+<span style=color:#268bd2>&lt;groupId&gt;</span>org.apache<span style=color:#268bd2>&lt;/groupId&gt;</span>
+<span style=color:#268bd2>&lt;artifactId&gt;</span>apache<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+<span style=color:#268bd2>&lt;version&gt;</span>19<span style=color:#268bd2>&lt;/version&gt;</span>
+<span style=color:#268bd2>&lt;/parent&gt;</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#268bd2>&lt;settings&gt;</span>
+...
+ <span style=color:#268bd2>&lt;servers&gt;</span>
+   <span style=color:#586e75>&lt;!-- To publish a snapshot of some part of Maven --&gt;</span>
+   <span style=color:#268bd2>&lt;server&gt;</span>
+     <span style=color:#268bd2>&lt;id&gt;</span>apache.snapshots.https<span style=color:#268bd2>&lt;/id&gt;</span>
+     <span style=color:#268bd2>&lt;username&gt;</span> <span style=color:#586e75>&lt;!-- YOUR APACHE LDAP USERNAME --&gt;</span> <span style=color:#268bd2>&lt;/username&gt;</span>
+     <span style=color:#268bd2>&lt;password&gt;</span> <span style=color:#586e75>&lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&gt;</span> <span style=color:#268bd2>&lt;/password&gt;</span>
+   <span style=color:#268bd2>&lt;/server&gt;</span>
+   <span style=color:#586e75>&lt;!-- To stage a release of some part of Maven --&gt;</span>
+   <span style=color:#268bd2>&lt;server&gt;</span>
+     <span style=color:#268bd2>&lt;id&gt;</span>apache.releases.https<span style=color:#268bd2>&lt;/id&gt;</span>
+     <span style=color:#268bd2>&lt;username&gt;</span> <span style=color:#586e75>&lt;!-- YOUR APACHE LDAP USERNAME --&gt;</span> <span style=color:#268bd2>&lt;/username&gt;</span>
+     <span style=color:#268bd2>&lt;password&gt;</span> <span style=color:#586e75>&lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&gt;</span> <span style=color:#268bd2>&lt;/password&gt;</span>
+   <span style=color:#268bd2>&lt;/server&gt;</span>
+  ...
+     <span style=color:#586e75>&lt;!-- gpg passphrase used when generate key --&gt;</span>
+    <span style=color:#268bd2>&lt;server&gt;</span>
+     <span style=color:#268bd2>&lt;id&gt;</span>gpg.passphrase<span style=color:#268bd2>&lt;/id&gt;</span>
+     <span style=color:#268bd2>&lt;passphrase&gt;</span><span style=color:#586e75>&lt;!-- yourKeyPassword --&gt;</span><span style=color:#268bd2>&lt;/passphrase&gt;</span>
+   <span style=color:#268bd2>&lt;/server&gt;</span>
+ <span style=color:#268bd2>&lt;/servers&gt;</span>
+<span style=color:#268bd2>&lt;/settings&gt;</span>
+</code></pre></div></li></ol><h2 id=pack--upload>Pack & 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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shel [...]
+$ mvn deploy
+</code></pre></div></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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ mvn release:prepare -Prelease -Darguments<span style=color:#719e07>=</span><span style=color:#2aa198>&#34;-Dmaven.test.skip=true&#34;</span> -Da [...]
+</code></pre></div><ul><li>After verification, run release:prepare</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ mvn release:clean
+$ mvn release:prepare -Prelease -Darguments<span style=color:#719e07>=</span><span style=color:#2aa198>&#34;-Dmaven.test.skip=true&#34;</span> -DautoVersionSubmodules<span style=color:#719e07>=</span><span style=color:#b58900>true</span> -Dusername<span style=color:#719e07>=</span>YOUR GITHUB ID -DpushChanges<span style=color:#719e07>=</span><span style=color:#b58900>false</span>
+</code></pre></div><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> -> <code>Personal access tokens</code>, and generate a new token if not. Please refer to this <a href=https://help.gi [...]
+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 [...]
+</code></pre></div><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 id=note>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 id=prepare [...]
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ <span style=color:#b58900>cd</span> ~/apache/incubator/dubbo <span style=color:#586e75># dubbo svn root directory</span>
+$ mkdir <span style=color:#2aa198>${</span><span style=color:#268bd2>release_version</span><span style=color:#2aa198>}</span>
+</code></pre></div></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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ gpg -a --export your_k [...]
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=langua [...]
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ shasum -b -a <span style=color:#2aa198>512</span> apache-dubbo-<span style=color:#2aa198>${</span><span style=color:#268bd2>release_version</span><span style=color:#2a [...]
+</code></pre></div><p>You should generate something like this:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>b8f13d1df6d6c9a1facc72fafc00b2d22bea1e600517c507467d8fca2f776a7a3877101742da53114bfa629ca5b941eb4d9ef989de43f0833e2a794e7ccf5c8a *apache-dubbo-spring-boot-project-2.7.0-bin-release.zip
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ mvn install
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>$ svn status
+$ svn commit -m <span style=color:#2aa198>&#39;prepare for ${release_version} RC1&#39;</span>
+</code></pre></div></li></ol><h2 id=verify-release-candidates>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 id=check-signatures-and-hashes-are-good>Check signatures and hashes are good</h3><h4 id=check-the-sha512-sum>check the sha512 sum</h4><div class=highlight><pre style=color: [...]
+$ shasum -c apache-dubbo-<span style=color:#2aa198>${</span><span style=color:#268bd2>release_version</span><span style=color:#2aa198>}</span>-bin-release.zip.sha512
+</code></pre></div><h4 id=check-the-gpg-signarure>check the gpg signarure</h4><p>If it&rsquo;s your first time verify a release candidte, you should import public keys first.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh> $ curl https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS &gt;&gt; KEYS <span style=color:#586e75># download public keys to local directory</span>
+ $ gpg --import KEYS <span style=color:#586e75># import keys</span>
+ $ gpg —edit-key liujun
+   &gt; trust <span style=color:#586e75># type trust command</span>
+</code></pre></div><p>Now, you can verify signature with command</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=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></div><h3 id=check-source-release-file-content>Check source release file content</h3><p>Unzip apache-dubbo-${release_version}-source-release.zip to the default directory and check the following:</p><ul><li>Directory with &lsquo;incubating&rsquo; in name
+<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<div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh>mvn clean <span style=color:#b58900>test</sp [...]
+<span style=color:#586e75># you can also open rat and style plugin to check if every file meets requirements.</span>
+mvn clean <span style=color:#b58900>test</span> -Drat.skip<span style=color:#719e07>=</span><span style=color:#b58900>false</span> -Dcheckstyle.skip<span style=color:#719e07>=</span><span style=color:#b58900>false</span>
+</code></pre></div></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 [...]
+
+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/dubbo/tree/dubbo-2.6.2
+
+Hash for the release tag:
+afab04c53edab38d52275d2a198ea1aff7a4f41e
+
+Release Notes:
+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></div><p>The mail template for Apache Incubator vote:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=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™  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/dubbo/tree/dubbo-2.6.4
+
+Hash for the release tag:
+88037747a3b69d3225c73f6fbcda36ebd8435887
+
+Release Notes:
+*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/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></div><p>The mail template to announce the vote result:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=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></div><h2 id=official-release>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/>offic [...]
+The mail template to announce release:</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text>Hello Community,
+
+The Apache Dubbo team is pleased to announce that the
+2.6.6 has just been released.
+
+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/dubbo/releases
+[4] https://github.com/apache/dubbo/issues
+
+</code></pre></div><h2 id=complete-maven-convenient-binary-release>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 bu [...]
+</code></pre></div><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/ class="btn btn-primary">Next <span class=ml-1>→</span></a></li></ul></div></main></div></div><footer class="bg-dark py-5 row d-print-none"><div class="container- [...]
\ No newline at end of file
diff --git a/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/index.html b/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/index.html
new file mode 100644
index 0000000..fe34d56
--- /dev/null
+++ b/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/index.html
@@ -0,0 +1,52 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-k8s.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+t [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Integrate%20Dubbo%20with%20Kubernetes" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>Integrate Dubbo with Kubernetes</h1><div class=lead>This article will try to register Dubbo servi [...]
+Dubbo&rsquo;s consumer directly discovers the corresponding service endpoints of Kubernetes during service discovery procedure, thereby reusing Dubbo&rsquo;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><h [...]
+<img src=https://img.alicdn.com/tfs/TB1m.tEtrorBKNjSZFjXXc_SpXa-1892-870.png alt=img></p></li><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.
+<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 -> Clusters. Create Kubernetes cluster and bind ECS. As shown below.
+<img src=https://img.alicdn.com/tfs/TB1b1p2trZnBKNjSZFKXXcGOVXa-1858-833.png alt=img></p></li><li><p>Application Management -> Create application, type Kubernetes application and specify the image in the container registry . As shown below.
+<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.
+<img src=https://img.alicdn.com/tfs/TB1fEpEtrorBKNjSZFjXXc_SpXa-1846-783.png alt></p></li></ol><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&rsquo;s container service [...]
+  <span style=color:#268bd2>&#34;kind&#34;</span>: <span style=color:#2aa198>&#34;Pod&#34;</span>,
+  <span style=color:#268bd2>&#34;namespace&#34;</span>: <span style=color:#2aa198>&#34;lzumwsrddf831iwarhehd14zh2-default&#34;</span>,
+  <span style=color:#268bd2>&#34;name&#34;</span>: <span style=color:#2aa198>&#34;dubbo-k8s-demo-610694273-jq238&#34;</span>,
+  <span style=color:#268bd2>&#34;uid&#34;</span>: <span style=color:#2aa198>&#34;12892e67-8bc8-11e8-b96a-00163e02c37b&#34;</span>,
+  <span style=color:#268bd2>&#34;apiVersion&#34;</span>: <span style=color:#2aa198>&#34;v1&#34;</span>,
+  <span style=color:#268bd2>&#34;resourceVersion&#34;</span>: <span style=color:#2aa198>&#34;850282769&#34;</span>
+}, <span style=color:#2aa198>&#34;reason&#34;</span>: <span style=color:#2aa198>&#34;FailedSync&#34;</span>, <span style=color:#2aa198>&#34;message&#34;</span>: <span style=color:#2aa198>&#34;Error syncing pod&#34;</span>, &#34;
+</code></pre></div><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/ class="btn btn-primary">Next <span class=ml-1>→</span></a></li></ul></div></main></div></div><footer class="bg-dark py-5 row d-print-none"><div class="container-fluid mx-sm-5"><div class=row [...]
\ No newline at end of file
diff --git a/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/index.html b/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/index.html
new file mode 100644
index 0000000..778893a
--- /dev/null
+++ b/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/index.html
@@ -0,0 +1,61 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-protocol.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Introduction%20to%20the%20Dubbo%20protocol" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#the-concept-of-the-protocol>The concept of the protocol</a><ul><li><a href=#what-is-the-protocol>What is the protocol</a></li><li><a href=#the-definition-of-codec>The definition of <code>Codec</code></a></li></ul></li><li><a href=#common-protocol-mode>Common protocol mode</a><ul><li><a href=#fixed-length-protocol>Fixed-l [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>Codec2</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>@Adaptive</span><span style=color:#719e07>({</span>Constants<span style=color:#719e07>.</span>CODEC_KEY<span style=color:#719e07>})</span>
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>encode</span><span style=color:#719e07>(</span>Channel channel<span style=color:#719e07>,</span> ChannelBuffer buffer<span style=color:#719e07>,</span> Object message<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@Adaptive</span><span style=color:#719e07>({</span>Constants<span style=color:#719e07>.</span>CODEC_KEY<span style=color:#719e07>})</span>
+    Object <span style=color:#268bd2>decode</span><span style=color:#719e07>(</span>Channel channel<span style=color:#719e07>,</span> ChannelBuffer buffer<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException<span style=color:#719e07>;</span>
+
+
+    <span style=color:#268bd2>enum</span> DecodeResult <span style=color:#719e07>{</span>
+        NEED_MORE_INPUT<span style=color:#719e07>,</span> SKIP_SOME_INPUT
+    <span style=color:#719e07>}</span>
+
+<span style=color:#719e07>}</span>
+</code></pre></div><p><code>Codec</code> works on a protocol, <code>encode</code> method means to encode the communication object to the <code>ByteBufferWrapper</code>, and <code>decode</code> method decodes the <code>ChannelBuffer</code> read from the network into <code>Object</code>, which is the communication object.</p><h2 id=common-protocol-mode>Common protocol mode</h2><p>Protocols in application layer have three general forms: fixed-length protocol, special delimiter protocol and  [...]
+|fixed-length    |
++————————————————+
+|variable content|
++————————————————+
+</code></pre></div><blockquote><p>Refer to Netty&rsquo;s <code>LengthFieldBasedFrameDecoder</code></p></blockquote><p>The Dubbo protocol is actually a variable length protocol, which is covered in more detail in later chapters.</p><h2 id=the-dubbo-protocol>The Dubbo protocol</h2><h3 id=overview-to-the-dubbo-protocol>Overview to the Dubbo protocol</h3><p>The Dubbo framework defines a proprietary RPC protocol in which the specific content of the request and response protocols is presented  [...]
+Service name bytes  (line break)
+...
+</code></pre></div><h2 id=advantages-and-disadvantages-about-the-dubbo-protocol>Advantages and disadvantages about the Dubbo protocol</h2><h3 id=advantages>Advantages</h3><ul><li>The protocol is designed to be very compact. The data type can be represented by 1 bit will not be represented by a byte, such as a boolean type identifier.</li><li>The request header is the same as response header, and the specific content is assembled to the variable part through the serializer, and it is simp [...]
\ No newline at end of file
diff --git a/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/index.html b/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/index.html
new file mode 100644
index 0000000..ac8ddd0
--- /dev/null
+++ b/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/index.html
@@ -0,0 +1,343 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-registry-nacos-integration.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+mat [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo%20Integrates%20with%20Nacos%20to%20Become%20a%20Registry" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#preparation-works>Preparation Works</a></li><li><a href=#get-started-quickly>Get Started Quickly</a></li><li><a href=#increase-maven-dependency>Increase Maven Dependency</a></li><li><a href=#configure-the-registry>Configure the Registry</a></li><li><a href=#dubbo-spring-externalization-configuration>Dubbo Spring External [...]
+
+    ...
+        
+    <span style=color:#586e75>&lt;!-- Dubbo Nacos registry dependency --&gt;</span>
+    <span style=color:#268bd2>&lt;dependency&gt;</span>
+        <span style=color:#268bd2>&lt;groupId&gt;</span>org.apache<span style=color:#268bd2>&lt;/groupId&gt;</span>
+        <span style=color:#268bd2>&lt;artifactId&gt;</span>dubbo-registry-nacos<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+        <span style=color:#268bd2>&lt;version&gt;</span>0.0.2<span style=color:#268bd2>&lt;/version&gt;</span>
+    <span style=color:#268bd2>&lt;/dependency&gt;</span>   
+    
+    <span style=color:#586e75>&lt;!-- Keep latest Nacos client version --&gt;</span>
+    <span style=color:#268bd2>&lt;dependency&gt;</span>
+        <span style=color:#268bd2>&lt;groupId&gt;</span>org.apache.nacos<span style=color:#268bd2>&lt;/groupId&gt;</span>
+        <span style=color:#268bd2>&lt;artifactId&gt;</span>nacos-client<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+        <span style=color:#268bd2>&lt;version&gt;</span>[0.6.1,)<span style=color:#268bd2>&lt;/version&gt;</span>
+    <span style=color:#268bd2>&lt;/dependency&gt;</span>
+    
+    <span style=color:#586e75>&lt;!-- Dubbo dependency --&gt;</span>
+    <span style=color:#268bd2>&lt;dependency&gt;</span>
+        <span style=color:#268bd2>&lt;groupId&gt;</span>org.apache<span style=color:#268bd2>&lt;/groupId&gt;</span>
+        <span style=color:#268bd2>&lt;artifactId&gt;</span>dubbo<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+        <span style=color:#268bd2>&lt;version&gt;</span>2.6.5<span style=color:#268bd2>&lt;/version&gt;</span>
+    <span style=color:#268bd2>&lt;/dependency&gt;</span>
+    
+    <span style=color:#586e75>&lt;!-- Alibaba Spring Context extension --&gt;</span>
+    <span style=color:#268bd2>&lt;dependency&gt;</span>
+        <span style=color:#268bd2>&lt;groupId&gt;</span>org.apache.spring<span style=color:#268bd2>&lt;/groupId&gt;</span>
+        <span style=color:#268bd2>&lt;artifactId&gt;</span>spring-context-support<span style=color:#268bd2>&lt;/artifactId&gt;</span>
+        <span style=color:#268bd2>&lt;version&gt;</span>1.0.2<span style=color:#268bd2>&lt;/version&gt;</span>
+    <span style=color:#268bd2>&lt;/dependency&gt;</span>
+
+    ...
+    
+<span style=color:#268bd2>&lt;/dependencies&gt;</span>
+</code></pre></div><p>When you add dubbo-registry-nacos to your project, you don&rsquo;t need to programmatically implement the service discovery and registration logic, the actual implementation is provided by the third-party package, and then to configure the Naocs registry.</p><h2 id=configure-the-registry>Configure the Registry</h2><p>Assuming your Dubbo application is assembled by the Spring Framework, there are two configuration options: Dubbo Spring externalization configuration a [...]
+dubbo.application.name = your-dubbo-application
+
+## Zookeeper registry address
+dubbo.registry.address = zookeeper://10.20.153.10:2181
+...
+</code></pre></div><p>Assuming your Nacos Server is also running on server 10.20.153.10 and using the default Nacos service port 8848, you can simply adjust the dubbo.registry.address property as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>## 其他属性保持不变
+
+## Nacos registry address
+dubbo.registry.address = nacos://10.20.153.10:8848
+...
+</code></pre></div><p>Subsequently, restart your Dubbo application, and Dubbo&rsquo;s service delivery and consumption information can be displayed in the Nacos console:</p><p><img src=/imgs/blog/dubbo-registry-nacos-1.png alt=image-20181213103845976></p><p>As shown in the figure, the service name prefixed with providers: is the meta-information for the service provider, and consumers: represents the meta-information of the service consumer. Click &ldquo;Details&rdquo; to view service st [...]
+<span style=color:#268bd2>&lt;beans</span> xmlns=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans&#34;</span>
+    xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+    xmlns:dubbo=<span style=color:#2aa198>&#34;http://dubbo.apache.org/schema/dubbo&#34;</span>
+    xsi:schemaLocation=<span style=color:#2aa198>&#34;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&#34;</span><span style=color:#268bd2>&gt;</span>
+ 
+    <span style=color:#586e75>&lt;!-- Provider application information for dependency calculation --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:application</span> name=<span style=color:#2aa198>&#34;dubbo-provider-xml-demo&#34;</span>  <span style=color:#268bd2>/&gt;</span>
+ 
+    <span style=color:#586e75>&lt;!-- Using the Zookeeper registry Zookeeper   --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:registry</span> address=<span style=color:#2aa198>&#34;zookeeper://10.20.153.10:2181&#34;</span> <span style=color:#268bd2>/&gt;</span>
+ 	...
+<span style=color:#268bd2>&lt;/beans&gt;</span>
+</code></pre></div><p>Similar to the Dubbo Spring externalization configuration, simply adjust the address property configuration:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#719e07>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
+<span style=color:#268bd2>&lt;beans</span> xmlns=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans&#34;</span>
+    xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+    xmlns:dubbo=<span style=color:#2aa198>&#34;http://dubbo.apache.org/schema/dubbo&#34;</span>
+    xsi:schemaLocation=<span style=color:#2aa198>&#34;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&#34;</span><span style=color:#268bd2>&gt;</span>
+ 
+    <span style=color:#586e75>&lt;!-- Provider application information for dependency calculation--&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:application</span> name=<span style=color:#2aa198>&#34;dubbo-provider-xml-demo&#34;</span>  <span style=color:#268bd2>/&gt;</span>
+ 
+    <span style=color:#586e75>&lt;!-- Using the Nacos registry  --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:registry</span> address=<span style=color:#2aa198>&#34;nacos://10.20.153.10:8848&#34;</span> <span style=color:#268bd2>/&gt;</span>
+ 	...
+<span style=color:#268bd2>&lt;/beans&gt;</span>
+</code></pre></div><p>Once you restart the Dubbo application, you can also see that the registration meta-information for both service providers and consumers is presented in the Nacos console:</p><p><img src=/imgs/blog/dubbo-registry-nacos-3.png alt=image-20181213113049185></p><p>Do you absolutely configure or switch Nacos registry super Easy? If you want to get more or unclear, refer to the complete example below.</p><h2 id=complete-example>Complete Example</h2><p>The metadata in the a [...]
+
+<span style=color:#586e75>/**
+</span><span style=color:#586e75> * DemoService
+</span><span style=color:#586e75> *
+</span><span style=color:#586e75> * @since 2.7.4
+</span><span style=color:#586e75> */</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>DemoService</span> <span style=color:#719e07>{</span>
+
+    String <span style=color:#268bd2>sayName</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>);</span>
+
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Provide implementation classes for the above interfaces:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.demo.service<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.apache.dubbo.config.annotation.Service<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.apache.dubbo.rpc.RpcContext<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.beans.factory.annotation.Value<span style=color:#719e07>;</span>
+
+<span style=color:#586e75>/**
+</span><span style=color:#586e75> * Default {@link DemoService}
+</span><span style=color:#586e75> *
+</span><span style=color:#586e75> * @since 2.7.4
+</span><span style=color:#586e75> */</span>
+<span style=color:#268bd2>@Service</span><span style=color:#719e07>(</span>version <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${demo.service.version}&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DefaultService</span> <span style=color:#268bd2>implements</span> DemoService <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>@Value</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;${demo.service.name}&#34;</span><span style=color:#719e07>)</span>
+    <span style=color:#268bd2>private</span> String serviceName<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayName</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        RpcContext rpcContext <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>();</span>
+        <span style=color:#719e07>return</span> String<span style=color:#719e07>.</span>format<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Service [name :%s , port : %d] %s(\&#34;%s\&#34;) : Hello,%s&#34;</span><span style=color:#719e07>,</span>
+                serviceName<span style=color:#719e07>,</span>
+                rpcContext<span style=color:#719e07>.</span>getLocalPort<span style=color:#719e07>(),</span>
+                rpcContext<span style=color:#719e07>.</span>getMethodName<span style=color:#719e07>(),</span>
+                name<span style=color:#719e07>,</span>
+                name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Once the interface and implementation are ready, the annotation-driven and XML configuration-driven implementations will be used below.</p><h2 id=spring-annotation-driven-example>Spring Annotation-driven Example</h2><p>Dubbo 2.7.4 reconstructs the Spring annotation-driven programming model.</p><h3 id=service-provider-annotation-driven-implementation>Service Provider Annotation-driven Implementation</h3><ul><li>Define property source of Dubbo provider externalization [...]
+dubbo.application.name = dubbo-provider-demo
+
+## Nacos registry address
+dubbo.registry.address = nacos://127.0.0.1:8848
+
+## Dubbo Protocol
+dubbo.protocol.name = dubbo
+dubbo.protocol.port = -1
+
+# Provider @Service version
+demo.service.version=1.0.0
+demo.service.name = demoService
+</code></pre></div><ul><li>Implement service provider bootstrap - DemoServiceProviderBootstrap</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.demo.provider<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.apache.dubbo.config.spring.context.annotation.EnableDubbo<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.apache.dubbo.demo.service.DemoService<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.context.annotation.AnnotationConfigApplicationContext<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.context.annotation.PropertySource<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> java.io.IOException<span style=color:#719e07>;</span>
+
+<span style=color:#586e75>/**
+</span><span style=color:#586e75> * {@link DemoService} provider demo
+</span><span style=color:#586e75> */</span>
+<span style=color:#268bd2>@EnableDubbo</span><span style=color:#719e07>(</span>scanBasePackages <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;org.apache.dubbo.demo.service&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>@PropertySource</span><span style=color:#719e07>(</span>value <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;classpath:/provider-config.properties&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoServiceProviderBootstrap</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException <span style=color:#719e07>{</span>
+        AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext<span style=color:#719e07>();</span>
+        context<span style=color:#719e07>.</span>register<span style=color:#719e07>(</span>DemoServiceProviderBootstrap<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        context<span style=color:#719e07>.</span>refresh<span style=color:#719e07>();</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;DemoService provider is starting...&#34;</span><span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+
+</code></pre></div><p>Wherein, the annotation @EnableDubbo activates the Dubbo annotation-driven and externalization configuration, its scanBasePackages property scans the specified Java package, exposes all service interface implementation classes labeled @Service as Spring Bean, and then exports the Dubbo service.</p><p>@PropertySource is the standard import property configuration resource annotation introduced by Spring Framework 3.1, which provides externalization configuration for D [...]
+dubbo.application.name = dubbo-consumer-demo
+
+## Nacos registry address
+dubbo.registry.address = nacos://127.0.0.1:8848
+
+# @Reference version
+demo.service.version= 1.0.0
+</code></pre></div><p>Similarly, the dubbo.registry.address property points to the Nacos registry, through which metadata about other Dubbo services is obtained.</p><ul><li>Implement service consumer bootstrap class - DemoServiceConsumerBootstrap</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.demo.consumer<span style= [...]
+
+<span style=color:#719e07>import</span> org.apache.dubbo.config.annotation.Reference<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.apache.dubbo.config.spring.context.annotation.EnableDubbo<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.apache.dubbo.demo.service.DemoService<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.context.annotation.AnnotationConfigApplicationContext<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> org.springframework.context.annotation.PropertySource<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> javax.annotation.PostConstruct<span style=color:#719e07>;</span>
+<span style=color:#719e07>import</span> java.io.IOException<span style=color:#719e07>;</span>
+
+<span style=color:#586e75>/**
+</span><span style=color:#586e75> * {@link DemoService} consumer demo
+</span><span style=color:#586e75> */</span>
+<span style=color:#268bd2>@EnableDubbo</span>
+<span style=color:#268bd2>@PropertySource</span><span style=color:#719e07>(</span>value <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;classpath:/consumer-config.properties&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoServiceConsumerBootstrap</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>@Reference</span><span style=color:#719e07>(</span>version <span style=color:#719e07>=</span> <span style=color:#2aa198>&#34;${demo.service.version}&#34;</span><span style=color:#719e07>)</span>
+    <span style=color:#268bd2>private</span> DemoService demoService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@PostConstruct</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>init</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>for</span> <span style=color:#719e07>(</span><span style=color:#dc322f>int</span> i <span style=color:#719e07>=</span> 0<span style=color:#719e07>;</span> i <span style=color:#719e07>&lt;</span> 10<span style=color:#719e07>;</span> i<span style=color:#719e07>++)</span> <span style=color:#719e07>{</span>
+            System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>demoService<span style=color:#719e07>.</span>sayName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;小马哥(mercyblitz)&#34;</span><span style=color:#719e07>));</span>
+        <span style=color:#719e07>}</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException <span style=color:#719e07>{</span>
+        AnnotationConfigApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> AnnotationConfigApplicationContext<span style=color:#719e07>();</span>
+        context<span style=color:#719e07>.</span>register<span style=color:#719e07>(</span>DemoServiceConsumerBootstrap<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        context<span style=color:#719e07>.</span>refresh<span style=color:#719e07>();</span>
+        context<span style=color:#719e07>.</span>close<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+
+</code></pre></div><p>Similarly, the @EnableDubbo annotation activates the Dubbo annotation-driven and externalization configuration, although it currently belongs to the service consumer and does not require the Java package name to scan the service implementation labeled @Service.</p><p>@Reference is a dependency injection annotation for Dubbo remote services that requires service provider and consumer contract interface, version, and group information. In the current service consumpti [...]
+Service [name :demoService , port : 20881] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+</code></pre></div><p>Run correctly and the service consumer uses a load balancing strategy to allocate ten RPC calls equally to two Dubbo service provider instances.</p><h3 id=spring-xml-configuration-driven-example>Spring XML Configuration-driven Example</h3><p>Spring XML configuration-driven is the programming model of traditional Spring assembly components.</p><h4 id=service-provider-xml-configuration-driven>Service Provider XML Configuration-driven</h4><p>Define the service provider [...]
+<span style=color:#268bd2>&lt;beans</span> xmlns=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans&#34;</span>
+       xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+       xmlns:dubbo=<span style=color:#2aa198>&#34;http://dubbo.apache.org/schema/dubbo&#34;</span>
+       xsi:schemaLocation=<span style=color:#2aa198>&#34;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&#34;</span><span style=color:#268bd2>&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- 
+</span><span style=color:#586e75>
+</span><span style=color:#586e75>Provider application information for dependency calculation
+</span><span style=color:#586e75> --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:application</span> name=<span style=color:#2aa198>&#34;dubbo-provider-xml-demo&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- Using the Nacos registry --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:registry</span> address=<span style=color:#2aa198>&#34;nacos://127.0.0.1:8848&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- Using Dubbo protocol to expose services on random ports --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:protocol</span> name=<span style=color:#2aa198>&#34;dubbo&#34;</span> port=<span style=color:#2aa198>&#34;-1&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- Declare the service interface to be exposed --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:service</span> interface=<span style=color:#2aa198>&#34;org.apache.dubbo.demo.service.DemoService&#34;</span> ref=<span style=color:#2aa198>&#34;demoService&#34;</span> version=<span style=color:#2aa198>&#34;2.0.0&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- Implement services like local beans --&gt;</span>
+    <span style=color:#268bd2>&lt;bean</span> id=<span style=color:#2aa198>&#34;demoService&#34;</span> class=<span style=color:#2aa198>&#34;org.apache.dubbo.demo.service.DefaultService&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;/beans&gt;</span>
+</code></pre></div><ul><li>Implement service provider bootstrap class - DemoServiceProviderBootstrap</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.demo.provider<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.apache.dubbo.demo.service.DemoService<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.context.support.ClassPathXmlApplicationContext<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> java.io.IOException<span style=color:#719e07>;</span>
+
+<span style=color:#586e75>/**
+</span><span style=color:#586e75> * {@link DemoService} provider demo XML bootstrap
+</span><span style=color:#586e75> */</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoServiceProviderXmlBootstrap</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException <span style=color:#719e07>{</span>
+        ClassPathXmlApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ClassPathXmlApplicationContext<span style=color:#719e07>();</span>
+        context<span style=color:#719e07>.</span>setConfigLocation<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;/META-INF/spring/dubbo-provider-context.xml&#34;</span><span style=color:#719e07>);</span>
+        context<span style=color:#719e07>.</span>refresh<span style=color:#719e07>();</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;DemoService provider (XML) is starting...&#34;</span><span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>in<span style=color:#719e07>.</span>read<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h4 id=service-consumer-xml-configuration-driven>Service Consumer XML Configuration-driven</h4><p>Define the consumer provider XML context configuration file - /META-INF/spring/dubbo- consumer-context.xml</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#719e07>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
+<span style=color:#268bd2>&lt;beans</span> xmlns=<span style=color:#2aa198>&#34;http://www.springframework.org/schema/beans&#34;</span>
+       xmlns:xsi=<span style=color:#2aa198>&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
+       xmlns:dubbo=<span style=color:#2aa198>&#34;http://dubbo.apache.org/schema/dubbo&#34;</span>
+       xsi:schemaLocation=<span style=color:#2aa198>&#34;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&#34;</span><span style=color:#268bd2>&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- 
+</span><span style=color:#586e75>
+</span><span style=color:#586e75>Provider application information for dependency calculation
+</span><span style=color:#586e75> --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:application</span> name=<span style=color:#2aa198>&#34;dubbo-consumer-xml-demo&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- Using the Nacos registry--&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:registry</span> address=<span style=color:#2aa198>&#34;nacos://127.0.0.1:8848&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+    <span style=color:#586e75>&lt;!-- Reference service interface --&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;demoService&#34;</span> interface=<span style=color:#2aa198>&#34;org.apache.dubbo.demo.service.DemoService&#34;</span> version=<span style=color:#2aa198>&#34;2.0.0&#34;</span><span style=color:#268bd2>/&gt;</span>
+
+<span style=color:#268bd2>&lt;/beans&gt;</span>
+</code></pre></div><ul><li>Implement service consumer bootstrap class - DemoServiceConsumerBootstrap</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.demo.consumer<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.apache.dubbo.demo.service.DemoService<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.springframework.context.support.ClassPathXmlApplicationContext<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> java.io.IOException<span style=color:#719e07>;</span>
+
+<span style=color:#586e75>/**
+</span><span style=color:#586e75> * {@link DemoService} consumer demo XML bootstrap
+</span><span style=color:#586e75> */</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoServiceConsumerXmlBootstrap</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span><span style=color:#719e07>(</span>String<span style=color:#719e07>[]</span> args<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> IOException <span style=color:#719e07>{</span>
+        ClassPathXmlApplicationContext context <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ClassPathXmlApplicationContext<span style=color:#719e07>();</span>
+        context<span style=color:#719e07>.</span>setConfigLocation<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;/META-INF/spring/dubbo-consumer-context.xml&#34;</span><span style=color:#719e07>);</span>
+        context<span style=color:#719e07>.</span>refresh<span style=color:#719e07>();</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;DemoService consumer (XML) is starting...&#34;</span><span style=color:#719e07>);</span>
+        DemoService demoService <span style=color:#719e07>=</span> context<span style=color:#719e07>.</span>getBean<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;demoService&#34;</span><span style=color:#719e07>,</span> DemoService<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        <span style=color:#719e07>for</span> <span style=color:#719e07>(</span><span style=color:#dc322f>int</span> i <span style=color:#719e07>=</span> 0<span style=color:#719e07>;</span> i <span style=color:#719e07>&lt;</span> 10<span style=color:#719e07>;</span> i<span style=color:#719e07>++)</span> <span style=color:#719e07>{</span>
+            System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span>demoService<span style=color:#719e07>.</span>sayName<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;小马哥(mercyblitz)&#34;</span><span style=color:#719e07>));</span>
+        <span style=color:#719e07>}</span>
+        context<span style=color:#719e07>.</span>close<span style=color:#719e07>();</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h4 id=run-xml-configuration-driven-example>Run XML Configuration-driven Example</h4><p>As such, start two DemoServiceProviderXmlBootstrap bootstraps and observe the changes in the Nacos registry service provider:</p><p><img src=/imgs/blog/dubbo-registry-nacos-5.png alt=image-20181213125527201></p><p>The service version driven by the XML configuration is 2.0.0, so the registration service is correct.</p><p>Run the service consumer bootstrap DemoServiceConsumerXmlBootst [...]
+Service [name :null , port : 20882] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&#34;小马哥(mercyblitz)&#34;) : Hello,小马哥(mercyblitz)
+</code></pre></div><p>As a result, both operation and load balancing are normal due to the property demo.service.name has not been added to the current example, the &ldquo;name&rdquo; information is output as null. For more information, please refer to: <a href=https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos>https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos</a>.</p><p>If you&rsquo;re interested in or fond of open source projec [...]
\ No newline at end of file
diff --git a/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/index.html b/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/index.html
new file mode 100644
index 0000000..99ed821
--- /dev/null
+++ b/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/index.html
@@ -0,0 +1,38 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-meetup-hangzhou.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+sect [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=The%20fifth%20Dubbo%20meetup%20has%20been%20held%20in%20Hangzhou" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/news/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=td-content><h1>The fifth Dubbo meetup has been held in Hangzhou</h1><div class=lead>The fifth Dubbo meetup has b [...]
\ No newline at end of file
diff --git a/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/index.html b/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/index.html
new file mode 100644
index 0000000..c8089bd
--- /dev/null
+++ b/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/index.html
@@ -0,0 +1,176 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-fescar.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+th [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=How%20to%20use%20Seata%20to%20ensure%20consistency%20between%20Dubbo%20Microservices" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#use-case>Use case</a><ul><li><a href=#architecture>Architecture</a></li><li><a href=#storageservice>StorageService</a></li><li><a href=#orderservice>OrderService</a></li><li><a href=#accountservice>AccountService</a></li><li><a href=#main-business-logic>Main business logic</a></li></ul></li><li><a href=#distributed-trans [...]
+
+    <span style=color:#586e75>/**
+</span><span style=color:#586e75>     * deduct storage count
+</span><span style=color:#586e75>     */</span>
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>deduct</span><span style=color:#719e07>(</span>String commodityCode<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> count<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=orderservice>OrderService</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>OrderService</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#586e75>/**
+</span><span style=color:#586e75>     * create order
+</span><span style=color:#586e75>     */</span>
+    Order <span style=color:#268bd2>create</span><span style=color:#719e07>(</span>String userId<span style=color:#719e07>,</span> String commodityCode<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> orderCount<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=accountservice>AccountService</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>AccountService</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#586e75>/**
+</span><span style=color:#586e75>     * debit balance of user&#39;s account
+</span><span style=color:#586e75>     */</span>
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>debit</span><span style=color:#719e07>(</span>String userId<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> money<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=main-business-logic>Main business logic</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>BusinessServiceImpl</span> <span style=color:#268bd2>implements</span> BusinessService <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>private</span> StorageService storageService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>private</span> OrderService orderService<span style=color:#719e07>;</span>
+
+    <span style=color:#586e75>/**
+</span><span style=color:#586e75>     * purchase
+</span><span style=color:#586e75>     */</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>purchase</span><span style=color:#719e07>(</span>String userId<span style=color:#719e07>,</span> String commodityCode<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> orderCount<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+
+        storageService<span style=color:#719e07>.</span>deduct<span style=color:#719e07>(</span>commodityCode<span style=color:#719e07>,</span> orderCount<span style=color:#719e07>);</span>
+
+        orderService<span style=color:#719e07>.</span>create<span style=color:#719e07>(</span>userId<span style=color:#719e07>,</span> commodityCode<span style=color:#719e07>,</span> orderCount<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>StorageServiceImpl</span> <span style=color:#268bd2>implements</span> StorageService <span style=color:#719e07>{</span>
+
+  <span style=color:#268bd2>private</span> StorageDAO storageDAO<span style=color:#719e07>;</span>
+  
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>deduct</span><span style=color:#719e07>(</span>String commodityCode<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> count<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        Storage storage <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Storage<span style=color:#719e07>();</span>
+        storage<span style=color:#719e07>.</span>setCount<span style=color:#719e07>(</span>count<span style=color:#719e07>);</span>
+        storage<span style=color:#719e07>.</span>setCommodityCode<span style=color:#719e07>(</span>commodityCode<span style=color:#719e07>);</span>
+        storageDAO<span style=color:#719e07>.</span>update<span style=color:#719e07>(</span>storage<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>OrderServiceImpl</span> <span style=color:#268bd2>implements</span> OrderService <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>private</span> OrderDAO orderDAO<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>private</span> AccountService accountService<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>public</span> Order <span style=color:#268bd2>create</span><span style=color:#719e07>(</span>String userId<span style=color:#719e07>,</span> String commodityCode<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> orderCount<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+
+        <span style=color:#dc322f>int</span> orderMoney <span style=color:#719e07>=</span> calculate<span style=color:#719e07>(</span>commodityCode<span style=color:#719e07>,</span> orderCount<span style=color:#719e07>);</span>
+
+        accountService<span style=color:#719e07>.</span>debit<span style=color:#719e07>(</span>userId<span style=color:#719e07>,</span> orderMoney<span style=color:#719e07>);</span>
+
+        Order order <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> Order<span style=color:#719e07>();</span>
+        order<span style=color:#719e07>.</span>userId <span style=color:#719e07>=</span> userId<span style=color:#719e07>;</span>
+        order<span style=color:#719e07>.</span>commodityCode <span style=color:#719e07>=</span> commodityCode<span style=color:#719e07>;</span>
+        order<span style=color:#719e07>.</span>count <span style=color:#719e07>=</span> orderCount<span style=color:#719e07>;</span>
+        order<span style=color:#719e07>.</span>money <span style=color:#719e07>=</span> orderMoney<span style=color:#719e07>;</span>
+
+        <span style=color:#719e07>return</span> orderDAO<span style=color:#719e07>.</span>insert<span style=color:#719e07>(</span>order<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h2 id=distributed-transaction-solution-with-seata>Distributed Transaction Solution with Seata</h2><p><img src=/imgs/blog/fescar/fescar-2.png alt=undefined></p><p>We just need an annotation <code>@GlobalTransactional</code> on business method:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>    <span style=color:#268bd2>@GlobalTransactional</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>purchase</span><span style=color:#719e07>(</span>String userId<span style=color:#719e07>,</span> String commodityCode<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> orderCount<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>......</span>
+    <span style=color:#719e07>}</span>
+</code></pre></div><h2 id=example-powered-by-dubbo--seata>Example powered by Dubbo + Seata</h2><h3 id=step-1-setup-database>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-acc [...]
+dubbo-order-service.xml
+dubbo-storage-service.xml</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml>    <span style=color:#268bd2>&lt;property</span> name=<span style=color:#2aa198>&#34;url&#34;</span> value=<span style=color:#2aa198>&#34;jdbc:mysql://x.x.x.x:3306/xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
+    <span style=color:#268bd2>&lt;property</span> name=<span style=color:#2aa198>&#34;username&#34;</span> value=<span style=color:#2aa198>&#34;xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
+    <span style=color:#268bd2>&lt;property</span> name=<span style=color:#2aa198>&#34;password&#34;</span> value=<span style=color:#2aa198>&#34;xxx&#34;</span> <span style=color:#268bd2>/&gt;</span>
+</code></pre></div><h3 id=step-2-create-undo_log-table-for-seata>Step 2: Create undo_log table for Seata</h3><p><code>UNDO_LOG</code> table is required by Seata AT mode.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=color:#586e75>-- Note that when Seata version is upgraded to 0.3.0+, it is changed from the previous normal index to the unique index.
+</span><span style=color:#586e75></span><span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>undo_log<span style=color:#719e07>`</span> (
+  <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>bigint</span>(<span style=color:#2aa198>20</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
+  <span style=color:#719e07>`</span>branch_id<span style=color:#719e07>`</span> <span style=color:#b58900>bigint</span>(<span style=color:#2aa198>20</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>xid<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>100</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>context<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>128</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>rollback_info<span style=color:#719e07>`</span> longblob <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>log_status<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>log_created<span style=color:#719e07>`</span> datetime <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>log_modified<span style=color:#719e07>`</span> datetime <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>ext<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>100</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>),
+  <span style=color:#719e07>UNIQUE</span> <span style=color:#719e07>KEY</span> <span style=color:#719e07>`</span>ux_undo_log<span style=color:#719e07>`</span> (<span style=color:#719e07>`</span>xid<span style=color:#719e07>`</span>,<span style=color:#719e07>`</span>branch_id<span style=color:#719e07>`</span>)
+) ENGINE<span style=color:#719e07>=</span>InnoDB AUTO_INCREMENT<span style=color:#719e07>=</span><span style=color:#2aa198>1</span> <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
+</code></pre></div><h3 id=step-3-create-tables-for-example-business>Step 3: Create tables for example business</h3><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql>
+<span style=color:#719e07>DROP</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>IF</span> <span style=color:#719e07>EXISTS</span> <span style=color:#719e07>`</span>storage_tbl<span style=color:#719e07>`</span>;
+<span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>storage_tbl<span style=color:#719e07>`</span> (
+  <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
+  <span style=color:#719e07>`</span>commodity_code<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span><span style=color:#719e07>count</span><span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
+  <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>),
+  <span style=color:#719e07>UNIQUE</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>commodity_code<span style=color:#719e07>`</span>)
+) ENGINE<span style=color:#719e07>=</span>InnoDB <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
+
+
+<span style=color:#719e07>DROP</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>IF</span> <span style=color:#719e07>EXISTS</span> <span style=color:#719e07>`</span>order_tbl<span style=color:#719e07>`</span>;
+<span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>order_tbl<span style=color:#719e07>`</span> (
+  <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
+  <span style=color:#719e07>`</span>user_id<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>commodity_code<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span><span style=color:#719e07>count</span><span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
+  <span style=color:#719e07>`</span>money<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
+  <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>)
+) ENGINE<span style=color:#719e07>=</span>InnoDB <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
+
+
+<span style=color:#719e07>DROP</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>IF</span> <span style=color:#719e07>EXISTS</span> <span style=color:#719e07>`</span>account_tbl<span style=color:#719e07>`</span>;
+<span style=color:#719e07>CREATE</span> <span style=color:#719e07>TABLE</span> <span style=color:#719e07>`</span>account_tbl<span style=color:#719e07>`</span> (
+  <span style=color:#719e07>`</span>id<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>NOT</span> <span style=color:#719e07>NULL</span> AUTO_INCREMENT,
+  <span style=color:#719e07>`</span>user_id<span style=color:#719e07>`</span> <span style=color:#b58900>varchar</span>(<span style=color:#2aa198>255</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#719e07>NULL</span>,
+  <span style=color:#719e07>`</span>money<span style=color:#719e07>`</span> <span style=color:#b58900>int</span>(<span style=color:#2aa198>11</span>) <span style=color:#719e07>DEFAULT</span> <span style=color:#2aa198>0</span>,
+  <span style=color:#719e07>PRIMARY</span> <span style=color:#719e07>KEY</span> (<span style=color:#719e07>`</span>id<span style=color:#719e07>`</span>)
+) ENGINE<span style=color:#719e07>=</span>InnoDB <span style=color:#719e07>DEFAULT</span> CHARSET<span style=color:#719e07>=</span>utf8;
+</code></pre></div><h3 id=step-4-start-seata-server>Step 4: Start Seata-Server</h3><ul><li>Download server <a href=https://github.com/seata/seata/releases>package</a>, unzip it.</li><li>Start Seata-Server</li></ul><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell>Usage: sh seata-server.sh<span style=color:#719e07>(</span><span style=color:#719e07>for</span> linux and mac<span style=co [...]
+  Options:
+    --host, -h
+      The host to bind.
+      Default: 0.0.0.0
+    --port, -p
+      The port to listen.
+      Default: <span style=color:#2aa198>8091</span>
+    --storeMode, -m
+      log store mode : file、db
+      Default: file
+    --help
+
+e.g.
+
+sh seata-server.sh -p <span style=color:#2aa198>8091</span> -h 127.0.0.1 -m file
+</code></pre></div><h3 id=step-5-run-example>Step 5: Run example</h3><ul><li>Start AccountService (<a href=https://github.com/seata/seata-samples/blob/master/dubbo/src/main/java/io/seata/samples/dubbo/starter/DubboAccountServiceStarter.java>DubboAccountServiceStarter</a>).</li><li>Start StorageService (<a href=https://github.com/seata/seata-samples/blob/master/dubbo/src/main/java/io/seata/samples/dubbo/starter/DubboStorageServiceStarter.java>DubboStorageServiceStarter</a>).</li><li>Start [...]
\ No newline at end of file
diff --git a/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/index.html b/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/index.html
new file mode 100644
index 0000000..61bd5fb
--- /dev/null
+++ b/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/index.html
@@ -0,0 +1,56 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-async-client.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Implementation%20background%20and%20practice%20of%20Dubbo%20client%20asynchronous%20interface" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#preface>Preface</a></li><li><a href=#client-asynchronization>Client Asynchronization</a><ul><li><a href=#background>Background</a></li><li><a href=#the-sample>The sample</a></li><li><a href=#practical-advice>Practical advice</a></li><li><a href=#conclusions>Conclusions</a></li></ul></li></ul></nav></div><main class="col- [...]
+
+<span style=color:#268bd2>&lt;dubbo:reference</span> id=<span style=color:#2aa198>&#34;demoService&#34;</span> check=<span style=color:#2aa198>&#34;false&#34;</span> interface=<span style=color:#2aa198>&#34;com.alibaba.dubbo.samples.notify.api.DemoService&#34;</span> version=<span style=color:#2aa198>&#34;1.0.0&#34;</span> group=<span style=color:#2aa198>&#34;cn&#34;</span><span style=color:#268bd2>&gt;</span>
+    <span style=color:#268bd2>&lt;dubbo:method</span> name=<span style=color:#2aa198>&#34;sayHello&#34;</span> onreturn=<span style=color:#2aa198>&#34;demoCallback.onreturn&#34;</span> onthrow=<span style=color:#2aa198>&#34;demoCallback.onthrow&#34;</span><span style=color:#268bd2>/&gt;</span>
+<span style=color:#268bd2>&lt;/dubbo:reference&gt;</span>
+</code></pre></div><p>The code for NotifyImpl is as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>NotifyImpl</span> <span style=color:#268bd2>implements</span> Notify<span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>public</span> Map<span style=color:#719e07>&lt;</span>Integer<span style=color:#719e07>,</span> String<span style=color:#719e07>&gt;</span> ret <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> HashMap<span style=color:#719e07>&lt;</span>Integer<span style=color:#719e07>,</span> String<span style=color:#719e07>&gt;();</span>
+    
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>onreturn</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> id<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        ret<span style=color:#719e07>.</span>put<span style=color:#719e07>(</span>id<span style=color:#719e07>,</span> name<span style=color:#719e07>);</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;onreturn: &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>onthrow</span><span style=color:#719e07>(</span>Throwable ex<span style=color:#719e07>,</span> String name<span style=color:#719e07>,</span> <span style=color:#dc322f>int</span> id<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;onthrow: &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>It is important to note that the parameters for the three methods in the custom Notify interface are as follows:</p><ul><li><code>oninvoke</code> The parameters of the method are the same as those of the calling method.</li><li><code>onreturn</code> The first parameter of the method is the return value of the calling method, and the rest is the parameters of the calling method.</li><li><code>onthrow</code> The first parameter to the method is the call exception, and [...]
\ No newline at end of file
diff --git a/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/index.html b/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/index.html
new file mode 100644
index 0000000..3c629b0
--- /dev/null
+++ b/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/index.html
@@ -0,0 +1,60 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-async-server.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Implementation%20background%20and%20practice%20of%20Dubbo%20server%20asynchronous%20interface" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#preface>Preface</a></li><li><a href=#implementation-background>Implementation background</a><ul><li><a href=#server-side-thread-strategy>Server-side thread strategy</a></li><li><a href=#coroutine-and-thread>Coroutine and thread</a></li></ul></li><li><a href=#the-sample>The sample</a></li><li><a href=#practical-suggestion [...]
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHello</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Main sayHello() method start.&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#268bd2>final</span> AsyncContext asyncContext <span style=color:#719e07>=</span> RpcContext<span style=color:#719e07>.</span>startAsync<span style=color:#719e07>();</span>
+        <span style=color:#719e07>new</span> Thread<span style=color:#719e07>(()</span> <span style=color:#719e07>-&gt;</span> <span style=color:#719e07>{</span>
+            asyncContext<span style=color:#719e07>.</span>signalContextSwitch<span style=color:#719e07>();</span>
+            System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Attachment from consumer: &#34;</span> <span style=color:#719e07>+</span> RpcContext<span style=color:#719e07>.</span>getContext<span style=color:#719e07>().</span>getAttachment<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;consumer-key1&#34;</span><span style=color:#719e07>));</span>
+            System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;    -- Async start.&#34;</span><span style=color:#719e07>);</span>
+            <span style=color:#719e07>try</span> <span style=color:#719e07>{</span>
+                Thread<span style=color:#719e07>.</span>sleep<span style=color:#719e07>(</span>500<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>InterruptedException e<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                e<span style=color:#719e07>.</span>printStackTrace<span style=color:#719e07>();</span>
+            <span style=color:#719e07>}</span>
+            asyncContext<span style=color:#719e07>.</span>write<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Hello &#34;</span> <span style=color:#719e07>+</span> name <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;, response from provider.&#34;</span><span style=color:#719e07>);</span>
+            System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;    -- Async end.&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}).</span>start<span style=color:#719e07>();</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Main sayHello() method end.&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hello, &#34;</span> <span style=color:#719e07>+</span> name<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+</code></pre></div><h2 id=practical-suggestions>Practical suggestions</h2><ul><li>Don&rsquo;t rely too much on server-side asynchrony.</li><li>Server-side asynchrony is basically a false proposition in the face of event-driven or Reactive.<span data-type=color style=color:#24292e><span data-type=background style=background-color:#fff>Supplement the reason: the server asynchrony is said Dubbo server-side business threads (default is 200) is not enough, but in the Event-Driven mode, 200 th [...]
\ No newline at end of file
diff --git a/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/index.html b/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/index.html
new file mode 100644
index 0000000..d35e1e6
--- /dev/null
+++ b/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/index.html
@@ -0,0 +1,93 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/introduction-to-dubbo-spi.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo%20extensible%20mechanism%20source%20code%20analysis%20-%20part%201" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#1-extension-mechanism-of-dubbo>1. Extension Mechanism of Dubbo</a></li><li><a href=#2extension-solutions>2.Extension Solutions</a></li><li><a href=#3java-spi-mechanism>3.Java SPI Mechanism</a></li><li><a href=#4-dubbo-spi-mechanism>4. Dubbo SPI Mechanism</a></li><li><a href=#5-basic-concepts-for-dubbo-extension-point-mec [...]
+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&rsquo;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&rsquo;s extension mechanism in detail.</p><h2 id=2extension-solutions>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 [...]
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>save</span><span style=color:#719e07>(</span>String data<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><ol start=2><li>Create 2 implementations for IRepository: MysqlRepository and MongoRepository</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>MysqlRepository</span> <span style=color:#268bd2>implements</span> IRepository <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>save</span><span style=color:#719e07>(</span>String data<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Save &#34;</span> <span style=color:#719e07>+</span> data <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; to Mysql&#34;</span><span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>MongoRepository</span> <span style=color:#268bd2>implements</span> IRepository <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>save</span><span style=color:#719e07>(</span>String data<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Save &#34;</span> <span style=color:#719e07>+</span> data <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; to Mongo&#34;</span><span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text>com.demo.MongoRepository
+com.demo.MysqlRepository
+</code></pre></div><ol start=4><li>Load IRepository using ServiceLoader</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>ServiceLoader<span style=color:#719e07>&lt;</span>IRepository<span style=color:#719e07>&gt;</span> serviceLoader <span style=color:#719e07>=</span> ServiceLoader<span style=color:#719e07>.</span>load<span style=color:#719e07>(</span>IRepository<span style=co [...]
+Iterator<span style=color:#719e07>&lt;</span>IRepository<span style=color:#719e07>&gt;</span> it <span style=color:#719e07>=</span> serviceLoader<span style=color:#719e07>.</span>iterator<span style=color:#719e07>();</span>
+<span style=color:#719e07>while</span> <span style=color:#719e07>(</span>it <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>&amp;&amp;</span> it<span style=color:#719e07>.</span>hasNext<span style=color:#719e07>()){</span>
+    IRepository demoService <span style=color:#719e07>=</span> it<span style=color:#719e07>.</span>next<span style=color:#719e07>();</span>
+    System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;class:&#34;</span> <span style=color:#719e07>+</span> demoService<span style=color:#719e07>.</span>getClass<span style=color:#719e07>().</span>getName<span style=color:#719e07>());</span>
+    demoService<span style=color:#719e07>.</span>save<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;tom&#34;</span><span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 id=4-dubbo-spi-mechanism>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 ex [...]
+<span style=color:#268bd2>roundrobin</span><span style=color:#719e07>=</span>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
+</code></pre></div><p>where random, roundrobin are alias of the corresponding extensions, and we can directly use them in the configuration file.</p><h3 id=59-paths>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< [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>LoadBalance</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>@Adaptive</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;loadbalance&#34;</span><span style=color:#719e07>)</span>
+    <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>select</span><span style=color:#719e07>(</span>List<span style=color:#719e07>&lt;</span>Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;&gt;</span> invokers<span style=color:#719e07>,</span> URL url<span style=color:#719e07>,</span> Invocation invocation<span style=color:#719 [...]
+<span style=color:#719e07>}</span>
+</code></pre></div><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 [...]
+<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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=color:#268bd2>random</span><span style=color:#719e07>=</span>com.al [...]
+<span style=color:#268bd2>roundrobin</span><span style=color:#719e07>=</span>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
+<span style=color:#268bd2>leastactive</span><span style=color:#719e07>=</span>com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
+<span style=color:#268bd2>consistenthash</span><span style=color:#719e07>=</span>com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
+</code></pre></div><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: [...]
+</code></pre></div><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 id=7-customize-a-loadbalance-extension>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 com [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoLoadBalance</span> <span style=color:#268bd2>implements</span> LoadBalance <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>select</span><span style=color:#719e07>(</span>List<span style=color:#719e07>&lt;</span>Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;&gt;</span> invokers<span style=color:#719e07>,</span> URL url<span style=color:#719e07>,</span> Inv [...]
+        System<span style=color:#719e07>.</span>out<span style=color:#719e07>.</span>println<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;DemoLoadBalance: Select the first invoker...&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> invokers<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>0<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><h3 id=72-add-extension-configuration-file>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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=color:#268bd2>demo</span><span style=color:#719e07>=</span>com.dubbo.spi.demo.consumer.DemoLoadBalance
+</code></pre></div><h3 id=73-configure-customized-loadbalance>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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o [...]
+</code></pre></div><p>Configure &lt;loadbalance=&ldquo;demo&rdquo;> in <a href=dubbo:reference>dubbo:reference</a> at consumer part.</p><h3 id=74-launch-dubbo>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 id=summary>Summary</h2><p>So far, we learnt the basic concepts of Dubbo SPI beginning with Java SPI, and we used LoadBalan [...]
+*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&rsquo;s extension mechanism default: @SPI(&ldquo;dubbo&rdquo;) represents the default SPI object.</li><li>Dubbo&rsquo;s extension mechanism supports the advanced features such as IoC and AoP, etc.</li><li>Dubbo&rsquo;s extension mechanism supports third-party IoC containers. It suppo [...]
\ No newline at end of file
diff --git a/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/index.html b/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/index.html
new file mode 100644
index 0000000..29ca800
--- /dev/null
+++ b/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/index.html
@@ -0,0 +1,300 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/introduction-to-dubbo-spi-2.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%2 [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo%20extensible%20mechanism%20source%20code%20analysis%20-%20part%202" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#extensionloader>ExtensionLoader</a></li><li><a href=#auto-assembly-of-dubbo-spi-advanced-usage>Auto-assembly of Dubbo SPI advanced usage</a></li><li><a href=#aop-of-dubbo-spi-advanced-usage>AOP of Dubbo SPI advanced usage</a><ul><li><a href=#what-is-the-wrapper-class>What is the Wrapper class</a></li><li><a href=#how-to- [...]
+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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span [...]
+        <span style=color:#586e75>// An extension point must be an interface
+</span><span style=color:#586e75></span>        <span style=color:#719e07>if</span> <span style=color:#719e07>(!</span>type<span style=color:#719e07>.</span>isInterface<span style=color:#719e07>())</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalArgumentException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Extension type(&#34;</span> <span style=color:#719e07>+</span> type <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;) is not interface!&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#586e75>// @SPI annotations must be provided
+</span><span style=color:#586e75></span>        <span style=color:#719e07>if</span> <span style=color:#719e07>(!</span>withExtensionAnnotation<span style=color:#719e07>(</span>type<span style=color:#719e07>))</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalArgumentException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Extension type without @SPI Annotation!&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#586e75>// Get the corresponding ExtensionLoader from the cache according to the interface
+</span><span style=color:#586e75></span>        <span style=color:#586e75>// Each extension will only be loaded once
+</span><span style=color:#586e75></span>        ExtensionLoader<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> loader <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>ExtensionLoader<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;)</span> EXTENSION_LOADERS<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>type<span style=color:#719e07>);</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>loader <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#586e75>// Initialize extension
+</span><span style=color:#586e75></span>            EXTENSION_LOADERS<span style=color:#719e07>.</span>putIfAbsent<span style=color:#719e07>(</span>type<span style=color:#719e07>,</span> <span style=color:#719e07>new</span> ExtensionLoader<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;(</span>type<span style=color:#719e07>));</span>
+            loader <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>ExtensionLoader<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;)</span> EXTENSION_LOADERS<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>type<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> loader<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+    
+<span style=color:#268bd2>private</span> <span style=color:#268bd2>ExtensionLoader</span><span style=color:#719e07>(</span>Class<span style=color:#719e07>&lt;?&gt;</span> type<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>this</span><span style=color:#719e07>.</span>type <span style=color:#719e07>=</span> type<span style=color:#719e07>;</span>
+        objectFactory <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>type <span style=color:#719e07>==</span> ExtensionFactory<span style=color:#719e07>.</span>class <span style=color:#719e07>?</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>:</span> ExtensionLoader<span style=color:#719e07>.</span>getExtensionLoader<span style=color:#719e07>(</span>ExtensionFactory<span style=color:#719e07>.</span>class<span style=color:#719e07>).</span>getAd [...]
+<span style=color:#719e07>}</span>
+</code></pre></div><ol start=2><li>getExtension</li></ol><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> T <span style=color:#268bd2>getExtension</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        Holder<span style=color:#719e07>&lt;</span>Object<span style=color:#719e07>&gt;</span> holder <span style=color:#719e07>=</span> cachedInstances<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>holder <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            cachedInstances<span style=color:#719e07>.</span>putIfAbsent<span style=color:#719e07>(</span>name<span style=color:#719e07>,</span> <span style=color:#719e07>new</span> Holder<span style=color:#719e07>&lt;</span>Object<span style=color:#719e07>&gt;());</span>
+            holder <span style=color:#719e07>=</span> cachedInstances<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        Object instance <span style=color:#719e07>=</span> holder<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+        <span style=color:#586e75>// Get it from the cache. If it does not exist, create
+</span><span style=color:#586e75></span>        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>instance <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#268bd2>synchronized</span> <span style=color:#719e07>(</span>holder<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                instance <span style=color:#719e07>=</span> holder<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+                <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>instance <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                    instance <span style=color:#719e07>=</span> createExtension<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+                    holder<span style=color:#719e07>.</span>set<span style=color:#719e07>(</span>instance<span style=color:#719e07>);</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> <span style=color:#719e07>(</span>T<span style=color:#719e07>)</span> instance<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Some judgments and caching have been made in the getExtension method, and the main logic is in the createExtension method. Let&rsquo;s move on to the createExtension method.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>private</span> T <span style=color:#268bd2>createExtension</span><span style=color:#719e07>(</span>String name<spa [...]
+        <span style=color:#586e75>// Get the extension class according to the name of extension point. For example,  for LoadBalance, get the RandomLoadBalance class according to random
+</span><span style=color:#586e75></span>        Class<span style=color:#719e07>&lt;?&gt;</span> clazz <span style=color:#719e07>=</span> getExtensionClasses<span style=color:#719e07>().</span>get<span style=color:#719e07>(</span>name<span style=color:#719e07>);</span>
+        
+        T instance <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>T<span style=color:#719e07>)</span> EXTENSION_INSTANCES<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>clazz<span style=color:#719e07>);</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>instance <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+              <span style=color:#586e75>// Use reflection to call newInstance to create an example of an extension class
+</span><span style=color:#586e75></span>            EXTENSION_INSTANCES<span style=color:#719e07>.</span>putIfAbsent<span style=color:#719e07>(</span>clazz<span style=color:#719e07>,</span> <span style=color:#719e07>(</span>T<span style=color:#719e07>)</span> clazz<span style=color:#719e07>.</span>newInstance<span style=color:#719e07>());</span>
+            instance <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>T<span style=color:#719e07>)</span> EXTENSION_INSTANCES<span style=color:#719e07>.</span>get<span style=color:#719e07>(</span>clazz<span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#586e75>// Make dependency injection for the extended class samples
+</span><span style=color:#586e75></span>        injectExtension<span style=color:#719e07>(</span>instance<span style=color:#719e07>);</span>
+        <span style=color:#586e75>// If there is a wrapper, add the wrapper
+</span><span style=color:#586e75></span>        Set<span style=color:#719e07>&lt;</span>Class<span style=color:#719e07>&lt;?&gt;&gt;</span> wrapperClasses <span style=color:#719e07>=</span> cachedWrapperClasses<span style=color:#719e07>;</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>wrapperClasses <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>!</span>wrapperClasses<span style=color:#719e07>.</span>isEmpty<span style=color:#719e07>())</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>for</span> <span style=color:#719e07>(</span>Class<span style=color:#719e07>&lt;?&gt;</span> wrapperClass <span style=color:#719e07>:</span> wrapperClasses<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                instance <span style=color:#719e07>=</span> injectExtension<span style=color:#719e07>((</span>T<span style=color:#719e07>)</span> wrapperClass<span style=color:#719e07>.</span>getConstructor<span style=color:#719e07>(</span>type<span style=color:#719e07>).</span>newInstance<span style=color:#719e07>(</span>instance<span style=color:#719e07>));</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> instance<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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&r [...]
+        Map<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Class<span style=color:#719e07>&lt;?&gt;&gt;</span> classes <span style=color:#719e07>=</span> cachedClasses<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>classes <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#268bd2>synchronized</span> <span style=color:#719e07>(</span>cachedClasses<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                classes <span style=color:#719e07>=</span> cachedClasses<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+                <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>classes <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                    classes <span style=color:#719e07>=</span> loadExtensionClasses<span style=color:#719e07>();</span>
+                    cachedClasses<span style=color:#719e07>.</span>set<span style=color:#719e07>(</span>classes<span style=color:#719e07>);</span>
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> classes<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+
+<span style=color:#586e75>// synchronized in getExtensionClasses
+</span><span style=color:#586e75></span><span style=color:#268bd2>private</span> Map<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Class<span style=color:#719e07>&lt;?&gt;&gt;</span> loadExtensionClasses<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#268bd2>final</span> SPI defaultAnnotation <span style=color:#719e07>=</span> type<span style=color:#719e07>.</span>getAnnotation<span style=color:#719e07>(</span>SPI<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>defaultAnnotation <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            String value <span style=color:#719e07>=</span> defaultAnnotation<span style=color:#719e07>.</span>value<span style=color:#719e07>();</span>
+            <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>value <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>(</span>value <span style=color:#719e07>=</span> value<span style=color:#719e07>.</span>trim<span style=color:#719e07>()).</span>length<span style=color:#719e07>()</span> <span style=color:#719e07>&gt;</span> 0<span style=color:#719e07>)</span> <span style=col [...]
+                String<span style=color:#719e07>[]</span> names <span style=color:#719e07>=</span> NAME_SEPARATOR<span style=color:#719e07>.</span>split<span style=color:#719e07>(</span>value<span style=color:#719e07>);</span>
+                <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>names<span style=color:#719e07>.</span>length <span style=color:#719e07>&gt;</span> 1<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                    <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalStateException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;more than 1 default extension name on extension &#34;</span> <span style=color:#719e07>+</span> type<span style=color:#719e07>.</span>getName<span style=color:#719e07>());</span>
+                <span style=color:#719e07>}</span>
+                <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>names<span style=color:#719e07>.</span>length <span style=color:#719e07>==</span> 1<span style=color:#719e07>)</span> cachedDefaultName <span style=color:#719e07>=</span> names<span style=color:#719e07>[</span>0<span style=color:#719e07>];</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+
+        Map<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Class<span style=color:#719e07>&lt;?&gt;&gt;</span> extensionClasses <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> HashMap<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>,</span> Class<span style=color:#719e07>&lt;?&gt;&gt;();</span>
+        loadFile<span style=color:#719e07>(</span>extensionClasses<span style=color:#719e07>,</span> DUBBO_INTERNAL_DIRECTORY<span style=color:#719e07>);</span>
+        loadFile<span style=color:#719e07>(</span>extensionClasses<span style=color:#719e07>,</span> DUBBO_DIRECTORY<span style=color:#719e07>);</span>
+        loadFile<span style=color:#719e07>(</span>extensionClasses<span style=color:#719e07>,</span> SERVICES_DIRECTORY<span style=color:#719e07>);</span>
+        <span style=color:#719e07>return</span> extensionClasses<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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() [...]
+    <span style=color:#719e07>for</span> <span style=color:#719e07>(</span>Method method <span style=color:#719e07>:</span> instance<span style=color:#719e07>.</span>getClass<span style=color:#719e07>().</span>getMethods<span style=color:#719e07>())</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>method<span style=color:#719e07>.</span>getName<span style=color:#719e07>().</span>startsWith<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;set&#34;</span><span style=color:#719e07>)</span>
+                <span style=color:#719e07>&amp;&amp;</span> method<span style=color:#719e07>.</span>getParameterTypes<span style=color:#719e07>().</span>length <span style=color:#719e07>==</span> 1
+                <span style=color:#719e07>&amp;&amp;</span> Modifier<span style=color:#719e07>.</span>isPublic<span style=color:#719e07>(</span>method<span style=color:#719e07>.</span>getModifiers<span style=color:#719e07>()))</span> <span style=color:#719e07>{</span>
+            Class<span style=color:#719e07>&lt;?&gt;</span> pt <span style=color:#719e07>=</span> method<span style=color:#719e07>.</span>getParameterTypes<span style=color:#719e07>()[</span>0<span style=color:#719e07>];</span>
+          
+            String property <span style=color:#719e07>=</span> method<span style=color:#719e07>.</span>getName<span style=color:#719e07>().</span>length<span style=color:#719e07>()</span> <span style=color:#719e07>&gt;</span> 3 <span style=color:#719e07>?</span> method<span style=color:#719e07>.</span>getName<span style=color:#719e07>().</span>substring<span style=color:#719e07>(</span>3<span style=color:#719e07>,</span> 4<span style=color:#719e07>).</span>toLowerCase<span style=color:#7 [...]
+            Object object <span style=color:#719e07>=</span> objectFactory<span style=color:#719e07>.</span>getExtension<span style=color:#719e07>(</span>pt<span style=color:#719e07>,</span> property<span style=color:#719e07>);</span>
+            <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>object <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                method<span style=color:#719e07>.</span>invoke<span style=color:#719e07>(</span>instance<span style=color:#719e07>,</span> object<span style=color:#719e07>);</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+    <span style=color:#719e07>}</span>
+    <span style=color:#719e07>return</span> instance<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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&rsquo;s set method. However, dependen [...]
+        <span style=color:#719e07>this</span><span style=color:#719e07>.</span>type <span style=color:#719e07>=</span> type<span style=color:#719e07>;</span>
+        objectFactory <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>type <span style=color:#719e07>==</span> ExtensionFactory<span style=color:#719e07>.</span>class <span style=color:#719e07>?</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>:</span> ExtensionLoader<span style=color:#719e07>.</span>getExtensionLoader<span style=color:#719e07>(</span>ExtensionFactory<span style=color:#719e07>.</span>class<span style=color:#719e07>).</span>getAd [...]
+<span style=color:#719e07>}</span>
+</code></pre></div><p>ObjectFacore is also an extension, obtained through <code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()</code>.</p><p><img src=/imgs/blog/dubbo-extensionfactory.png alt=Dubbo-ExtensionFactory></p><p>ExtensionFactory includes three implementations:</p><ol><li>SpiExtensionFactory: use Dubbo&rsquo;s Spi to load Extension.</li><li>SpringExtensionFactory: load Extension from the Spring container.</li><li>AdaptiveExtensionFactory: adapt [...]
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>AdaptiveExtensionFactory</span> <span style=color:#268bd2>implements</span> ExtensionFactory <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>private</span> <span style=color:#268bd2>final</span> List<span style=color:#719e07>&lt;</span>ExtensionFactory<span style=color:#719e07>&gt;</span> factories<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>AdaptiveExtensionFactory</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        ExtensionLoader<span style=color:#719e07>&lt;</span>ExtensionFactory<span style=color:#719e07>&gt;</span> loader <span style=color:#719e07>=</span> ExtensionLoader<span style=color:#719e07>.</span>getExtensionLoader<span style=color:#719e07>(</span>ExtensionFactory<span style=color:#719e07>.</span>class<span style=color:#719e07>);</span>
+        List<span style=color:#719e07>&lt;</span>ExtensionFactory<span style=color:#719e07>&gt;</span> list <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;</span>ExtensionFactory<span style=color:#719e07>&gt;();</span>
+        <span style=color:#719e07>for</span> <span style=color:#719e07>(</span>String name <span style=color:#719e07>:</span> loader<span style=color:#719e07>.</span>getSupportedExtensions<span style=color:#719e07>())</span> <span style=color:#719e07>{</span>
+            list<span style=color:#719e07>.</span>add<span style=color:#719e07>(</span>loader<span style=color:#719e07>.</span>getExtension<span style=color:#719e07>(</span>name<span style=color:#719e07>));</span>
+        <span style=color:#719e07>}</span>
+        factories <span style=color:#719e07>=</span> Collections<span style=color:#719e07>.</span>unmodifiableList<span style=color:#719e07>(</span>list<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> T <span style=color:#268bd2>getExtension</span><span style=color:#719e07>(</span>Class<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> type<span style=color:#719e07>,</span> String name<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>for</span> <span style=color:#719e07>(</span>ExtensionFactory factory <span style=color:#719e07>:</span> factories<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            T extension <span style=color:#719e07>=</span> factory<span style=color:#719e07>.</span>getExtension<span style=color:#719e07>(</span>type<span style=color:#719e07>,</span> name<span style=color:#719e07>);</span>
+            <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>extension <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                <span style=color:#719e07>return</span> extension<span style=color:#719e07>;</span>
+            <span style=color:#719e07>}</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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&rsquo;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 component [...]
+Does Dubbo&rsquo;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 id=what-is-the-wrapper-class>What is the Wrapper class</h3><p>So what kind of class is the Wrapper class  [...]
+    <span style=color:#268bd2>private</span> A a<span style=color:#719e07>;</span>
+    <span style=color:#268bd2>public</span> <span style=color:#268bd2>A</span><span style=color:#719e07>(</span>A a<span style=color:#719e07>){</span>
+        <span style=color:#719e07>this</span><span style=color:#719e07>.</span>a <span style=color:#719e07>=</span> a<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 id=how-to-configure-the-wrapper-class>How to configure the Wrapper class</h3><p>The Wrapper class in Dubbo is also an extension point [...]
+listener=org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper
+mock=org.apache.dubbo.rpc.support.MockProtocol
+</code></pre></div><p>When Dubbo loads the extension configuration file, there is a piece of code as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>try</span> <span style=color:#719e07>{</span>  
+  clazz<span style=color:#719e07>.</span>getConstructor<span style=color:#719e07>(</span>type<span style=color:#719e07>);</span>    
+  Set<span style=color:#719e07>&lt;</span>Class<span style=color:#719e07>&lt;?&gt;&gt;</span> wrappers <span style=color:#719e07>=</span> cachedWrapperClasses<span style=color:#719e07>;</span>
+  <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>wrappers <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+    cachedWrapperClasses <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ConcurrentHashSet<span style=color:#719e07>&lt;</span>Class<span style=color:#719e07>&lt;?&gt;&gt;();</span>
+    wrappers <span style=color:#719e07>=</span> cachedWrapperClasses<span style=color:#719e07>;</span>
+  <span style=color:#719e07>}</span>
+  wrappers<span style=color:#719e07>.</span>add<span style=color:#719e07>(</span>clazz<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span> <span style=color:#719e07>catch</span> <span style=color:#719e07>(</span>NoSuchMethodException e<span style=color:#719e07>)</span> <span style=color:#719e07>{}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>ProtocolFilterWrapper</span> <span style=color:#268bd2>implements</span> Protocol <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>private</span> <span style=color:#268bd2>final</span> Protocol protocol<span style=color:#719e07>;</span>
+
+    <span style=color:#586e75>// One parameter is the copy constructor of Protocol
+</span><span style=color:#586e75></span>    <span style=color:#268bd2>public</span> <span style=color:#268bd2>ProtocolFilterWrapper</span><span style=color:#719e07>(</span>Protocol protocol<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>protocol <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalArgumentException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;protocol == null&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>this</span><span style=color:#719e07>.</span>protocol <span style=color:#719e07>=</span> protocol<span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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 id=extension-point-adaptive>Extension point adaptive</h2><p>As mentioned earlier, D [...]
+Let&rsquo;s first look at the code to create an adaptive extension class:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> T <span style=color:#268bd2>getAdaptiveExtension</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+    Object instance <span style=color:#719e07>=</span> cachedAdaptiveInstance<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+    <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>instance <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#268bd2>synchronized</span> <span style=color:#719e07>(</span>cachedAdaptiveInstance<span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                instance <span style=color:#719e07>=</span> cachedAdaptiveInstance<span style=color:#719e07>.</span>get<span style=color:#719e07>();</span>
+                <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>instance <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+                      instance <span style=color:#719e07>=</span> createAdaptiveExtension<span style=color:#719e07>();</span>
+                      cachedAdaptiveInstance<span style=color:#719e07>.</span>set<span style=color:#719e07>(</span>instance<span style=color:#719e07>);</span> 
+                <span style=color:#719e07>}</span>
+            <span style=color:#719e07>}</span>        
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#719e07>return</span> <span style=color:#719e07>(</span>T<span style=color:#719e07>)</span> instance<span style=color:#719e07>;</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Continue to read the createAdaptiveExtension method:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>private</span> T <span style=color:#268bd2>createAdaptiveExtension</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>        
+    <span style=color:#719e07>return</span> injectExtension<span style=color:#719e07>((</span>T<span style=color:#719e07>)</span> getAdaptiveExtensionClass<span style=color:#719e07>().</span>newInstance<span style=color:#719e07>());</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>Continue to read the getAdaptiveExtensionClass method:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>private</span> Class<span style=color:#719e07>&lt;?&gt;</span> getAdaptiveExtensionClass<span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        getExtensionClasses<span style=color:#719e07>();</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>cachedAdaptiveClass <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>{</span>
+            <span style=color:#719e07>return</span> cachedAdaptiveClass<span style=color:#719e07>;</span>
+        <span style=color:#719e07>}</span>
+        <span style=color:#719e07>return</span> cachedAdaptiveClass <span style=color:#719e07>=</span> createAdaptiveExtensionClass<span style=color:#719e07>();</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=j [...]
+        String code <span style=color:#719e07>=</span> createAdaptiveExtensionClassCode<span style=color:#719e07>();</span>
+        ClassLoader classLoader <span style=color:#719e07>=</span> findClassLoader<span style=color:#719e07>();</span>
+        org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>common<span style=color:#719e07>.</span>compiler<span style=color:#719e07>.</span>Compiler compiler <span style=color:#719e07>=</span> ExtensionLoader<span style=color:#719e07>.</span>getExtensionLoader<span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>common<span styl [...]
+        <span style=color:#719e07>return</span> compiler<span style=color:#719e07>.</span>compile<span style=color:#719e07>(</span>code<span style=color:#719e07>,</span> classLoader<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>The default implementation of Compiler&rsquo;s code is javassist.</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@SPI</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;javassist&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>Compiler</span> <span style=color:#719e07>{</span>
+    Class<span style=color:#719e07>&lt;?&gt;</span> compile<span style=color:#719e07>(</span>String code<span style=color:#719e07>,</span> ClassLoader classLoader<span style=color:#719e07>);</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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&rsquo;t have to care about the API of the bytecode genera [...]
+Below are the Java code example for Protocol adaptive class created by createAdaptiveExtensionClassCode method:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#719e07>package</span> org.apache.dubbo.rpc<span style=color:#719e07>;</span>
+
+<span style=color:#719e07>import</span> org.apache.dubbo.common.extension.ExtensionLoader<span style=color:#719e07>;</span>
+
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>Protocol$Adaptive</span> <span style=color:#268bd2>implements</span> org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Protocol <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>destroy</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> UnsupportedOperationException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;method public abstract void org.apache.dubbo.rpc.Protocol.destroy() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!&#34;</span><span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> <span style=color:#dc322f>int</span> <span style=color:#268bd2>getDefaultPort</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> UnsupportedOperationException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;method public abstract int org.apache.dubbo.rpc.Protocol.getDefaultPort() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!&#34;</span><span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Exporter <span style=color:#268bd2>export</span><span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Invoker arg0<span style=color:#719e07>)</span> <span style=c [...]
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>arg0 <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalArgumentException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;org.apache.dubbo.rpc.Invoker argument == null&#34;</span><span style=color:#719e07>);</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>arg0<span style=color:#719e07>.</span>getUrl<span style=color:#719e07>()</span> <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalArgumentException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;org.apache.dubbo.rpc.Invoker argument getUrl() == null&#34;</span><span style=color:#719e07>);</span>
+        org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>common<span style=color:#719e07>.</span>URL url <span style=color:#719e07>=</span> arg0<span style=color:#719e07>.</span>getUrl<span style=color:#719e07>();</span>
+        String extName <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>url<span style=color:#719e07>.</span>getProtocol<span style=color:#719e07>()</span> <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>?</span> <span style=color:#2aa198>&#34;dubbo&#34;</span> <span style=color:#719e07>:</span> url<span style=color:#719e07>.</span>getProtocol<span style=color:#719e07>());</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>extName <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalStateException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url(&#34;</span> <span style=color:#719e07>+</span> url<span style=color:#719e07>.</span>toString<span style=color:#719e07>()</span> <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;) use keys([protocol])&#34;</span><span style=color:#719 [...]
+        org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Protocol extension <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Protocol<span style=color:#719e07>)</span> ExtensionLoader<span style=color:#719e07>.</spa [...]
+        <span style=color:#719e07>return</span> extension<span style=color:#719e07>.</span>export<span style=color:#719e07>(</span>arg0<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+
+    <span style=color:#268bd2>public</span> org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Invoker <span style=color:#268bd2>refer</span><span style=color:#719e07>(</span>java<span style=color:#719e07>.</span>lang<span style=color:#719e07>.</span>Class arg0<span style=color:#719e07>,</span> org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style= [...]
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>arg1 <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span> <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalArgumentException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;url == null&#34;</span><span style=color:#719e07>);</span>
+        org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>common<span style=color:#719e07>.</span>URL url <span style=color:#719e07>=</span> arg1<span style=color:#719e07>;</span>
+        String extName <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>url<span style=color:#719e07>.</span>getProtocol<span style=color:#719e07>()</span> <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>?</span> <span style=color:#2aa198>&#34;dubbo&#34;</span> <span style=color:#719e07>:</span> url<span style=color:#719e07>.</span>getProtocol<span style=color:#719e07>());</span>
+        <span style=color:#719e07>if</span> <span style=color:#719e07>(</span>extName <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span><span style=color:#719e07>)</span>
+            <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalStateException<span style=color:#719e07>(</span><span style=color:#2aa198>&#34;Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url(&#34;</span> <span style=color:#719e07>+</span> url<span style=color:#719e07>.</span>toString<span style=color:#719e07>()</span> <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;) use keys([protocol])&#34;</span><span style=color:#719 [...]
+        org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Protocol extension <span style=color:#719e07>=</span> <span style=color:#719e07>(</span>org<span style=color:#719e07>.</span>apache<span style=color:#719e07>.</span>dubbo<span style=color:#719e07>.</span>rpc<span style=color:#719e07>.</span>Protocol<span style=color:#719e07>)</span> ExtensionLoader<span style=color:#719e07>.</spa [...]
+        <span style=color:#719e07>return</span> extension<span style=color:#719e07>.</span>refer<span style=color:#719e07>(</span>arg0<span style=color:#719e07>,</span> arg1<span style=color:#719e07>);</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>@SPI</span><span style=color:#719e07>(</span><span style=color:#2aa198>&#34;dubbo&#34;</span><span style=color:#719e07>)</span>
+<span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>Protocol</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#dc322f>int</span> <span style=color:#268bd2>getDefaultPort</span><span style=color:#719e07>();</span>
+
+    <span style=color:#268bd2>@Adaptive</span>
+    <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span><span style=color:#719e07>(</span>Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> RpcException<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@Adaptive</span>
+    <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>refer</span><span style=color:#719e07>(</span>Class<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> type<span style=color:#719e07>,</span> URL url<span style=color:#719e07>)</span> <span style=color:#268bd2>throws</span> RpcException<span style=color:#719e07>;</span>
+
+    <span style=color:#dc322f>void</span> <span style=color:#268bd2>destroy</span><span style=color:#719e07>();</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><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><ul class="list-unstyled d-flex justify-content-betw [...]
\ No newline at end of file
diff --git a/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/index.html b/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/index.html
new file mode 100644
index 0000000..f93b684
--- /dev/null
+++ b/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/index.html
@@ -0,0 +1,73 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page active" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/tracing-with-skywalking.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+se [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Tracing%20Dubbo%20service%20with%20Apache%20Skywalking" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#introduction-to-apache-skywalking>Introduction to Apache Skywalking</a></li><li><a href=#dubbo-and-apache-skywalking>Dubbo and Apache Skywalking</a><ul><li><a href=#build-the-dubbo-demo--project>Build the Dubbo demo project</a></li><li><a href=#deploy-apache-skywalking>Deploy Apache Skywalking</a></li></ul></li><li><a hr [...]
+package org.apache.skywalking.demo.interfaces;</p><p>public interface HelloService {
+String sayHello(String name);
+}</p><h4 id=service-provider-project>Service provider project</h4><p>package org.apache.skywalking.demo.provider;</p><p>@Service(version = &ldquo;${demo.service.version}&rdquo;,
+application = &ldquo;${dubbo.application.id}&rdquo;,
+protocol = &ldquo;${dubbo.protocol.id}&rdquo;,
+registry = &ldquo;${dubbo.registry.id}&rdquo;, timeout = 60000)
+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 id=service-consumer-project>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 id=deploy-apache-skywalking>Deploy Apache Skywalking</h3><p><a href=https://github.com/apache/incubator-skywalking>Apache skywalking</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 id=third-party- [...]
+</code></pre></div><h4 id=deploy-the-provider-service>Deploy the provider service</h4><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>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></div><h4 id=deploy-the-consumer-service>Deploy the consumer service</h4><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>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></div><h4 id=visit-demo-service>visit demo service</h4><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback>curl http://localhost:8080/sayHello/test
+</code></pre></div><h2 id=skywalking-scren-snapshot>Skywalking scren snapshot</h2><h3 id=dashboard>Dashboard</h3><p><img src=/imgs/blog/skywalking-dashboard.png alt=/admin-guide/images/skywalking-dashboard.png></p><h3 id=topology>Topology</h3><p><img src=/imgs/blog/skywalking-topology.png alt=/admin-guide/images/skywalking-topology.png></p><h3 id=application-view>Application view</h3><p><img src=/imgs/blog/skywalking-application.png alt=/admin-guide/images/skywalking-application.png></p> [...]
+<img src=/imgs/blog/skywalking-application_instance.png alt=/admin-guide/images/skywalking-application_instance.png></p><h3 id=service-view>Service view</h3><p>Consumer side
+<img src=/imgs/blog/skywalking-service-consumer.png alt=/admin-guide/images/skywalking-service-consumer.png></p><p>provider side
+<img src=/imgs/blog/skywalking-service-provider.png alt=/admin-guide/images/skywalking-service-provider.png></p><h3 id=trace>Trace</h3><p><img src=/imgs/blog/skywalking-trace.png alt=/admin-guide/images/skywalking-trace.png></p><p>Span info
+<img src=/imgs/blog/skywalking-span-Info.png alt=/admin-guide/images/skywalking-span-Info.png></p><h3 id=alarm-view>Alarm view</h3><p><img src=/imgs/blog/skywalking-alarm.png alt=/admin-guide/images/skywalking-alarm.png></p><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/ class="btn btn-primary"><span class=mr-1>←</span> Previous</a></li><a href=/en/blog/2019/08/26 [...]
\ No newline at end of file
diff --git a/en/blog/2019/08/26/service-test/index.html b/en/blog/2019/08/26/service-test/index.html
new file mode 100644
index 0000000..6480296
--- /dev/null
+++ b/en/blog/2019/08/26/service-test/index.html
@@ -0,0 +1,156 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/service-test.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+th [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Dubbo%20Admin%20service%20test" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#usage>Usage</a></li><li><a href=#principledata-source>Principle:Data source</a></li><li><a href=#principle-generalized-calls>Principle: Generalized calls</a></li><li><a href=#summary-and-outlook>Summary and outlook</a></li></ul></nav></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn [...]
+<img src=/imgs/blog/admin/testSearch.jpg alt=testSearch><br>the information here is similar to the metadata, including the method name, parameter type and return value. Click the label on the right to enter the <code>service test</code> page.</p></li><li><p>Service test:
+<img src=/imgs/blog/admin/testSuccess.jpg alt=testSuccess><br><code>service test</code> page contains two json editor, the parameter&rsquo;s informations are all stored in a json format, where you need to fill in the corresponding parameter values (in this case, the number type is String ), after filling, click <code>execute</code> to initiate the call to the server, and the result of the call is displayed in the editor on the right. If the call fails, the detailed cause of the failure i [...]
+</span><span style=color:#586e75></span>Result <span style=color:#268bd2>getUser</span><span style=color:#719e07>(</span>String name<span style=color:#719e07>,</span> UserInfoDO userInfoDO<span style=color:#719e07>);</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>UserInfoDO</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>private</span> <span style=color:#dc322f>int</span> id<span style=color:#719e07>;</span>
+    <span style=color:#268bd2>private</span> LocationDO locationDO<span style=color:#719e07>;</span>
+    <span style=color:#268bd2>private</span> DepartmentDO departmentDO<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>toString</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;UserInfoDO{&#34;</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;id=&#34;</span> <span style=color:#719e07>+</span> id <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;, locationDO=&#34;</span> <span style=color:#719e07>+</span> locationDO<span style=color:#719e07>.</span>toString<span style=color:#719e07>()</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;, departmentDO=&#34;</span> <span style=color:#719e07>+</span> departmentDO<span style=color:#719e07>.</span>toString<span style=color:#719e07>()</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#39;}&#39;</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DepartmentDO</span> <span style=color:#719e07>{</span>
+
+    <span style=color:#268bd2>private</span> String departName<span style=color:#719e07>;</span>
+    <span style=color:#268bd2>private</span> LocationDO departLocation<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>toString</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;DepartmentDO{&#34;</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;departName=&#39;&#34;</span> <span style=color:#719e07>+</span> departName <span style=color:#719e07>+</span> <span style=color:#2aa198>&#39;\&#39;&#39;</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;, departLocation=&#34;</span> <span style=color:#719e07>+</span> departLocation<span style=color:#719e07>.</span>toString<span style=color:#719e07>()</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#39;}&#39;</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>LocationDO</span> <span style=color:#719e07>{</span>
+    <span style=color:#268bd2>private</span> String address<span style=color:#719e07>;</span>
+    <span style=color:#268bd2>private</span> <span style=color:#dc322f>int</span> postNum<span style=color:#719e07>;</span>
+
+    <span style=color:#268bd2>@Override</span>
+    <span style=color:#268bd2>public</span> String <span style=color:#268bd2>toString</span><span style=color:#719e07>()</span> <span style=color:#719e07>{</span>
+        <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;LocationDO{&#34;</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;address=&#39;&#34;</span> <span style=color:#719e07>+</span> address <span style=color:#719e07>+</span> <span style=color:#2aa198>&#39;\&#39;&#39;</span> <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#34;, postNum=&#34;</span> <span style=color:#719e07>+</span> postNum <span style=color:#719e07>+</span>
+                <span style=color:#2aa198>&#39;}&#39;</span><span style=color:#719e07>;</span>
+    <span style=color:#719e07>}</span>
+<span style=color:#719e07>}</span>
+</code></pre></div><p>The parameters are complex complex type. When the service is tested, the value of each field will be filled out layer by layer, As shown below:<br><img src=/imgs/blog/admin/complex.jpg alt=complex>
+It can also make successful call and the result is returned.</p><h2 id=principledata-source>Principle:Data source</h2><p>In the service test, the most important thing is the complete method signature, and the type information of the parameters, with which the values of each parameter can be filled step by step to assemble the complete service consumer. In Dubbo 2.7, the metadata center has been added. The method signature and parameter type information of Dubbo Admin is from here:<br><im [...]
+As shown, the server will register the metadata information of the service to the metadata center when it runs,the format is as follows:</p><div class=highlight><pre style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json>{
+    ...
+    <span style=color:#268bd2>&#34;methods&#34;</span>: [
+        {
+            <span style=color:#268bd2>&#34;name&#34;</span>: <span style=color:#2aa198>&#34;sayHello&#34;</span>,
+            <span style=color:#268bd2>&#34;parameterTypes&#34;</span>: [
+                <span style=color:#2aa198>&#34;org.apache.dubbo.demo.model.User&#34;</span>
+            ],
+            <span style=color:#268bd2>&#34;returnType&#34;</span>: <span style=color:#2aa198>&#34;org.apache.dubbo.demo.model.Result&#34;</span>
+        },
+      ...
+    ],
+    <span style=color:#268bd2>&#34;types&#34;</span>: [
+        {
+            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;char&#34;</span>
+        },
+        {
+            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;long&#34;</span>
+        },
+        {
+            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;org.apache.dubbo.demo.model.Result&#34;</span>,
+            <span style=color:#268bd2>&#34;properties&#34;</span>: {
+                <span style=color:#268bd2>&#34;msg&#34;</span>: {
+                    <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;java.lang.String&#34;</span>,
+                    <span style=color:#268bd2>&#34;properties&#34;</span>: {
+                        <span style=color:#268bd2>&#34;value&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;char[]&#34;</span>
+                        },
+                        <span style=color:#268bd2>&#34;hash&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;int&#34;</span>
+                        }
+                    }
+                },
+                <span style=color:#268bd2>&#34;userName&#34;</span>: {
+                    <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;java.lang.String&#34;</span>,
+                    <span style=color:#268bd2>&#34;properties&#34;</span>: {
+                        <span style=color:#268bd2>&#34;value&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;char[]&#34;</span>
+                        },
+                        <span style=color:#268bd2>&#34;hash&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;int&#34;</span>
+                        }
+                    }
+                }
+            }
+        },
+        {
+            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;org.apache.dubbo.demo.model.User&#34;</span>,
+            <span style=color:#268bd2>&#34;properties&#34;</span>: {
+                <span style=color:#268bd2>&#34;id&#34;</span>: {
+                    <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;java.lang.Long&#34;</span>,
+                    <span style=color:#268bd2>&#34;properties&#34;</span>: {
+                        <span style=color:#268bd2>&#34;value&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;long&#34;</span>
+                        }
+                    }
+                },
+                <span style=color:#268bd2>&#34;username&#34;</span>: {
+                    <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;java.lang.Sring&#34;</span>,
+                    <span style=color:#268bd2>&#34;properties&#34;</span>: {
+                        <span style=color:#268bd2>&#34;value&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;char[]&#34;</span>
+                        },
+                        <span style=color:#268bd2>&#34;hash&#34;</span>: {
+                            <span style=color:#268bd2>&#34;type&#34;</span>: <span style=color:#2aa198>&#34;int&#34;</span>
+                        }
+                    }
+                }
+            }
+        },
+       ...
+    ]
+}
+</code></pre></div><p>Related to service testing is the method and type information contained in <code>methods</code> and <code>types</code>. Based on this information, Dubbo Admin renders the parameters into the Json Editor of the service test page, where the user enters the values of each parameter and each member variable.</p><h2 id=principle-generalized-calls>Principle: Generalized calls</h2><p>With the parameter type, the next question is how to call to the server. In the traditiona [...]
\ No newline at end of file
diff --git a/en/blog/2020/05/18/past-releases/index.html b/en/blog/2020/05/18/past-releases/index.html
new file mode 100644
index 0000000..db6d3bd
--- /dev/null
+++ b/en/blog/2020/05/18/past-releases/index.html
@@ -0,0 +1,100 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/ [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 active td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class="collapse show" id=enblogreleases><a class="td- [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/releases/past-releases.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+ [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Past%20Releases" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#verification>Verification</a></li><li><a href=#apache-dubbo>Apache Dubbo</a><ul><li><a href=#277-2020-05-18>2.7.7 (2020-05-18)</a></li><li><a href=#275-2019-12-29>2.7.5 (2019-12-29)</a></li><li><a href=#2741-2019-10-27>2.7.4.1 (2019-10-27)</a></li><li><a href=#274-2019-10-19>2.7.4 (2019-10-19)</a></li><li><a href=#273-20 [...]
+<a href=https://www.apache.org/dist/dubbo/2.7.7/apache-dubbo-2.7.7-src.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.7/apache-dubbo-2.7.7-src.zip.sha512>sha512</a></li></ul><h3 id=275-2019-12-29>2.7.5 (2019-12-29)</h3><ul><li><a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.5/apache-dubbo-2.7.5-src.zip">source</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.5/apache-dubbo-2.7.5-src.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.5/apache-dubbo-2.7.5-src.zip.sha512>sha512</a></li></ul><h3 id=2741-2019-10-27>2.7.4.1 (2019-10-27)</h3><ul><li><a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.4.1/apache-dubbo-2.7.4.1-src.zip">source</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.4.1/apache-dubbo-2.7.4.1-src.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.4.1/apache-dubbo-2.7.4.1-src.zip.sha512>sha512</a></li></ul><h3 id=274-2019-10-19>2.7.4 (2019-10-19)</h3><ul><li><a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.4/apache-dubbo-2.7.4-src.zip">source</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.4/apache-dubbo-2.7.4-src.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.4/apache-dubbo-2.7.4-src.zip.sha512>sha512</a></li></ul><h3 id=273-2019-07-19>2.7.3 (2019-07-19)</h3><ul><li><a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.3/apache-dubbo-2.7.3-src.zip">source</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.3/apache-dubbo-2.7.3-src.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.7.3/apache-dubbo-2.7.3-src.zip.sha512>sha512</a></li></ul><h3 id=272-2019-06-06>2.7.2 (2019-06-06)</h3><ul><li><a href=https://archive.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip>source</a> |
+<a href=https://archive.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip.asc>asc</a> |
+<a href=https://archive.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip.sha512>sha512</a></li></ul><h3 id=271-2019-03-26>2.7.1 (2019-03-26)</h3><ul><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 id=270-2019-01-29>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 id=267-2019-07-15>2.6.7 (2019-07-15)</h3><ul><li><a href=https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-source-release.zip>source</a> |
+<a href=https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-source-release.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-source-release.zip.sha512>sha512</a></li><li><a href=https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-bin-release.zip>binary</a> |
+<a href=https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-bin-release.zip.asc>asc</a> |
+<a href=https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-bin-release.zip.sha512>sha512</a></li></ul><h3 id=266-2019-03-07>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 id=265-2018-11-23>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 id=264-2018-10-08>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 id=263-2018-09-11>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 id=262-2018-06-07>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 id=dubbo-spring-boot-starter>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-spr [...]
+<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 id=270-2019-02-14>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 id=021-2019-01-27>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 id=012-2019-01-27>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 id=dubbo-admin>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></bl [...]
+<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><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a class="btn btn-primary disabled"><span class=mr-1>←</span> Previous</a></li><a class="btn btn-primary disabled">Next <span class=ml-1>→</span></a></li></ul></div></main></div></div><footer class="bg-dark py-5 row d-print-none"><div class="container-fl [...]
\ No newline at end of file
diff --git a/en/blog/index.html b/en/blog/index.html
new file mode 100644
index 0000000..cdefc4a
--- /dev/null
+++ b/en/blog/index.html
@@ -0,0 +1,48 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.80.0"><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=alternate type=application/rss+xml href=http://dubbo.apache.org/en/blog/index.xml><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/pn [...]
+<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav" id=td-section-nav><div class="nav-item dropdown d-block d-lg-none"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=tru [...]
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2 href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/>Dubbo extensible mechanism - part 2</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1 href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/>Dubbo extensible mechanism - part 1</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Dubbo Async Server</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/>Introduction to the Dubbo protocol</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/>Integrate Dubbo with Kubernetes</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/>How to prepare an Apache Release</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/>New Async Call</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/>The fourth Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/>Dubbo Consumer Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/>Dubbo Invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-provider-configuration href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/>Dubbo Provider Configuration</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/>Dubbo QoS Introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/>Dubbo start/stop in spring boot</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/>dubbo2.js introduction</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo href=/en/blog/2018/08/14/generic-invoke-of-dubbo/>Generic invoke</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance href=/en/blog/2018/08/10/dubbos-load-balance/>Dubbo's Load Balance</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo href=/en/blog/2018/08/07/use-annotations-in-dubbo/>Use Annotations In Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/>Using Zookeeper in Dubbo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101 href=/en/blog/2018/08/07/dubbo-101/>Your First Dubbo Demo</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/>The third Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/>Introduce sentinel</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint href=/en/blog/2018/07/12/tracking-with-pinpoint/>Tracking with Pinpoint</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter href=/en/blog/2018/07/01/your-first-dubbo-filter/>Your First Dubbo Filter</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/>The second Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/>The first Dubbo meetup</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/>ApacheCon NA</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018 href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/>GSoC 2018</a>
+<a class="td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018 href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/>QCon Beijing 2018</a></li></ul></ul><ul class="td-sidebar-nav__section pr-md-3"><li class=td-sidebar-nav__section-title><a href=/en/blog/releases/ class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Releases</a></li><ul><li class=collapse id=enblogreleases><a class="td-side [...]
+<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/_index.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+th [...]
+<a href="https://github.com/apache/dubbo-website/issues/new?title=Apache%20Dubbo%20Blog" target=_blank><i class="fab fa-github fa-fw"></i>Create documentation issue</a>
+<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i>Create project issue</a></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5 pr-md-4" role=main><a class="btn btn-lg -bg-orange td-rss-button d-none d-lg-block" href=http://dubbo.apache.org/en/blog/index.xml target=_blank>RSS <i class="fa fa-rss ml-2"></i></a><div class=row><div class=col-12><h2>Posts in 2020</h2><ul class="list-unstyled mt-4"><li class="media mb-4"><div class=media-bo [...]
+Apache Dubbo GitHub: https://github.com/apache/dubbo
+Release Notes: https://github.com/apache/dubbo/releases
+2.7.7 (2020-05-18) source | asc | sha512 …</p><p class=pt-0><a href=/en/blog/2020/05/18/past-releases/>Read more</a></p></div></li></ul><h2>Posts in 2019</h2><ul class="list-unstyled mt-4"><li class="media mb-4"><div class=media-body><h5 class="mt-0 mb-1"><a href=/en/blog/2019/08/26/service-test/>Service test in dubbo admin</a></h5><p class="mb-2 mb-md-3"><small class=text-muted>Monday, August 26, 2019 in Articles</small></p><p class="pt-0 mt-0">Based on the metadata of Dubbo2.7, Dubbo A [...]
+Usage Deploy the provider: You can download the demo here. This project is based …</p><p class=pt-0><a href=/en/blog/2019/08/26/service-test/>Read more</a></p></div></li><li class="media mb-4"><div class=media-body><h5 class="mt-0 mb-1"><a href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/>Use apache skywalking in dubbo</a></h5><p class="mb-2 mb-md-3"><small class=text-muted>Sunday, August 11, 2019 in Articles</small></p><p class="pt-0 mt-0">Introduction to Apache Sky [...]
+Implementation background It is …</p><p class=pt-0><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/>Read more</a></p></div></li><li class="media mb-4"><div class=media-body><h5 class="mt-0 mb-1"><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Dubbo Async Client</a></h5><p class="mb-2 mb-md-3"><small class=text-muted>Wednesday, February 20, 2019 in Articles</small></p><p cl [...]
+Biz~ represents business thread, that is, the thread where the business logic is located. Biz~ thread pool may be created and maintained by …</p><p class=pt-0><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/>Read more</a></p></div></li><li class="media mb-4"><div class=media-body><h5 class="mt-0 mb-1"><a href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Use Seata in Dubbo</a></h5><p class [...]
+Storage service: deduct storage count on given commodity. Order service: create order according to purchase request. Account service: …</p><p class=pt-0><a href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/>Read more</a></p></div></li></ul><h2>Posts in 2018</h2><ul class="list-unstyled mt-4"><li class="media mb-4"><div class=media-body><h5 class="mt-0 mb-1"><a href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>The fifth Du [...]
+Please enjoy the slides of the topics:
+Ding Li: How to involve in dubbo community slides Shenli Cao: Dubbo 2.7 introduction slides Tao Yang: Dubbo practice in netease koala slides Mercy Ma: Nacos …</p><p class=pt-0><a href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/>Read more</a></p></div></li><li class="media mb-4"><div class=media-body><h5 class="mt-0 mb-1"><a href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Use Dubbo with Nacos</a></h5><p class="mb-2 mb-md-3"><small class [...]
+Preparation Works Before you integrate dubbo-registry-nacos into your Dubbo project, make sure the Nacos service is …</p><p class=pt-0><a href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/>Read more</a></p></div></li></ul></div></div><div class="row pl-2 pt-2"><div class=col><ul class=pagination><li class=page-item><a href=/en/blog/ class=page-link aria-label=First><span aria-hidden=true>&#171;&#171;</span></a></li><li class="page-item disabled"><a class=page-link [...]
\ No newline at end of file
diff --git a/en/blog/index.xml b/en/blog/index.xml
new file mode 100644
index 0000000..e520654
--- /dev/null
+++ b/en/blog/index.xml
@@ -0,0 +1,5471 @@
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – Apache Dubbo Blog</title><link>http://dubbo.apache.org/en/blog/</link><description>Recent content in Apache Dubbo Blog on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><atom:link href="http://dubbo.apache.org/en/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Past Releases</title><link>http://dubbo.apache.org/en/blog/2020/05/18 [...]
+&lt;h2 id="verification">Verification&lt;/h2>
+&lt;p>you can follow these &lt;a href="https://www.apache.org/info/verification">procedures&lt;/a> and the &lt;a href="https://www.apache.org/dist/dubbo/KEYS">KEYS&lt;/a> file to verify the download files&lt;/p>
+&lt;h2 id="apache-dubbo">Apache Dubbo&lt;/h2>
+&lt;blockquote>
+&lt;p>GitHub: &lt;a href="https://github.com/apache/dubbo">https://github.com/apache/dubbo&lt;/a>&lt;br>
+Release Notes: &lt;a href="https://github.com/apache/dubbo/releases">https://github.com/apache/dubbo/releases&lt;/a>&lt;/p>
+&lt;/blockquote>
+&lt;h3 id="277-2020-05-18">2.7.7 (2020-05-18)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.7/apache-dubbo-2.7.7-src.zip">source&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.7/apache-dubbo-2.7.7-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.7/apache-dubbo-2.7.7-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="275-2019-12-29">2.7.5 (2019-12-29)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.5/apache-dubbo-2.7.5-src.zip">source&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.5/apache-dubbo-2.7.5-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.5/apache-dubbo-2.7.5-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="2741-2019-10-27">2.7.4.1 (2019-10-27)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.4.1/apache-dubbo-2.7.4.1-src.zip">source&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.4.1/apache-dubbo-2.7.4.1-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.4.1/apache-dubbo-2.7.4.1-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="274-2019-10-19">2.7.4 (2019-10-19)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.4/apache-dubbo-2.7.4-src.zip">source&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.4/apache-dubbo-2.7.4-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.4/apache-dubbo-2.7.4-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="273-2019-07-19">2.7.3 (2019-07-19)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://www.apache.org/dyn/closer.cgi?path=dubbo/2.7.3/apache-dubbo-2.7.3-src.zip">source&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.3/apache-dubbo-2.7.3-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.7.3/apache-dubbo-2.7.3-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="272-2019-06-06">2.7.2 (2019-06-06)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/dubbo/2.7.2/apache-dubbo-2.7.2-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="271-2019-03-26">2.7.1 (2019-03-26)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-src.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip">binary&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.1/apache-dubbo-incubating-2.7.1-bin.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="270-2019-01-29">2.7.0 (2019-01-29)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-source-release.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-bin-release.zip">binary&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.7.0/apache-dubbo-incubating-2.7.0-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="267-2019-07-15">2.6.7 (2019-07-15)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-source-release.zip">source&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-bin-release.zip">binary&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/dubbo/2.6.7/apache-dubbo-2.6.7-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="266-2019-03-07">2.6.6 (2019-03-07)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;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&lt;/a> |
+&lt;a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;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&lt;/a> |
+&lt;a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://www.apache.org/dist/incubator/dubbo/2.6.6/apache-dubbo-incubating-2.6.6-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="265-2018-11-23">2.6.5 (2018-11-23)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-source-release.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-bin-release.zip">binary&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.5/apache-dubbo-incubating-2.6.5-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="264-2018-10-08">2.6.4 (2018-10-08)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip">binary&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.4/apache-dubbo-incubating-2.6.4-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="263-2018-09-11">2.6.3 (2018-09-11)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip">binary&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.3/apache-dubbo-incubating-2.6.3-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="262-2018-06-07">2.6.2 (2018-06-07)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip">binary&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/2.6.2/dubbo-incubating-2.6.2-bin-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h2 id="dubbo-spring-boot-starter">Dubbo Spring Boot Starter&lt;/h2>
+&lt;blockquote>
+&lt;p>GitHub: &lt;a href="https://github.com/apache/incubator-dubbo-spring-boot-project">https://github.com/apache/incubator-dubbo-spring-boot-project&lt;/a>&lt;br>
+Release Notes: &lt;a href="https://github.com/apache/incubator-dubbo-spring-boot-project/releases">https://github.com/apache/incubator-dubbo-spring-boot-project/releases&lt;/a>&lt;/p>
+&lt;/blockquote>
+&lt;h3 id="271-2019-04-09">2.7.1 (2019-04-09)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="270-2019-02-14">2.7.0 (2019-02-14)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="021-2019-01-27">0.2.1 (2019-01-27)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h3 id="012-2019-01-27">0.1.2 (2019-01-27)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;li>&lt;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&lt;/a> |
+&lt;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&lt;/a> |
+&lt;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&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h2 id="dubbo-admin">Dubbo Admin&lt;/h2>
+&lt;blockquote>
+&lt;p>GitHub: &lt;a href="https://github.com/apache/incubator-dubbo-admin">https://github.com/apache/incubator-dubbo-admin&lt;/a>&lt;br>
+Release Notes: &lt;a href="https://github.com/apache/incubator-dubbo-admin/releases">https://github.com/apache/incubator-dubbo-admin/releases&lt;/a>&lt;/p>
+&lt;/blockquote>
+&lt;h3 id="01-2019-02-15">0.1 (2019-02-15)&lt;/h3>
+&lt;ul>
+&lt;li>&lt;a href="https://archive.apache.org/dist/incubator/dubbo/dubbo-ops/0.1/apache-dubbo-ops-incubating-0.1-source-release.zip">source&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/dubbo-ops/0.1/apache-dubbo-ops-incubating-0.1-source-release.zip.asc">asc&lt;/a> |
+&lt;a href="https://archive.apache.org/dist/incubator/dubbo/dubbo-ops/0.1/apache-dubbo-ops-incubating-0.1-source-release.zip.sha512">sha512&lt;/a>&lt;/li>
+&lt;/ul></description></item><item><title>Blog: Dubbo Admin service test</title><link>http://dubbo.apache.org/en/blog/2019/08/26/service-test/</link><pubDate>Mon, 26 Aug 2019 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2019/08/26/service-test/</guid><description>
+&lt;p>Based on the metadata of Dubbo2.7, Dubbo Admin implements the service test function, which can call the real service provider on the console through generalized call.&lt;/p>
+&lt;h2 id="usage">Usage&lt;/h2>
+&lt;ul>
+&lt;li>
+&lt;p>Deploy the provider: You can download the demo &lt;a href="https://github.com/nzomkxia/dubbo-demo">here&lt;/a>. This project is based on Spring Boot, which is convenient to start in the IDE or command line. For service testing, you only need to start &lt;code>dubbo-basic-provider&lt;/code>.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Service-seeking: After completing the server deployment, you can query the corresponding service on the Dubbo Admin&amp;rsquo;s &lt;code>service test&lt;/code> page:
+&lt;img src="http://dubbo.apache.org/imgs/blog/admin/testSearch.jpg" alt="testSearch">&lt;br>
+the information here is similar to the metadata, including the method name, parameter type and return value. Click the label on the right to enter the &lt;code>service test&lt;/code> page.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Service test:
+&lt;img src="http://dubbo.apache.org/imgs/blog/admin/testSuccess.jpg" alt="testSuccess">&lt;br>
+&lt;code>service test&lt;/code> page contains two json editor, the parameter&amp;rsquo;s informations are all stored in a json format, where you need to fill in the corresponding parameter values (in this case, the number type is String ), after filling, click &lt;code>execute&lt;/code> to initiate the call to the server, and the result of the call is displayed in the editor on the right. If the call fails, the detailed cause of the failure is displayed. Let&amp;rsquo;s look at the examp [...]
+&lt;img src="http://dubbo.apache.org/imgs/blog/admin/testFail.jpg" alt="testFail">&lt;/p>
+&lt;p>In this case, the Dubbo service provider&amp;rsquo;s process is shut down before the service test is executed, you can see that the returned result is an &lt;code>No provider availble&lt;/code> exception. As with normal calls, business and framework exceptions are returned in the results, for easy business troubleshooting.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Complex type parameters &lt;br>
+Consider the following methods and types in &lt;code>UserService&lt;/code>:&lt;/p>
+&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#586e75">//org.apache.dubbo.demo.api.UserService
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>Result &lt;span style="color:#268bd2">getUser&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">,&lt;/span> UserInfoDO userInfoDO&lt;span style="color:#719e07">);&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">UserInfoDO&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> id&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> LocationDO locationDO&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> DepartmentDO departmentDO&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">toString&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;UserInfoDO{&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;id=&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> id &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;, locationDO=&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> locationDO&lt;span style="color:#719e07">.&lt;/span>toString&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;, departmentDO=&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> departmentDO&lt;span style="color:#719e07">.&lt;/span>toString&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#39;}&amp;#39;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DepartmentDO&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> String departName&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> LocationDO departLocation&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">toString&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;DepartmentDO{&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;departName=&amp;#39;&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> departName &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#39;\&amp;#39;&amp;#39;&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;, departLocation=&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> departLocation&lt;span style="color:#719e07">.&lt;/span>toString&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#39;}&amp;#39;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">LocationDO&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> String address&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> postNum&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">toString&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;LocationDO{&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;address=&amp;#39;&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> address &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#39;\&amp;#39;&amp;#39;&lt;/span> &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;, postNum=&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> postNum &lt;span style="color:#719e07">+&lt;/span>
+&lt;span style="color:#2aa198">&amp;#39;}&amp;#39;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The parameters are complex complex type. When the service is tested, the value of each field will be filled out layer by layer, As shown below:&lt;br>
+&lt;img src="http://dubbo.apache.org/imgs/blog/admin/complex.jpg" alt="complex">
+It can also make successful call and the result is returned.&lt;/p>
+&lt;h2 id="principledata-source">Principle:Data source&lt;/h2>
+&lt;p>In the service test, the most important thing is the complete method signature, and the type information of the parameters, with which the values of each parameter can be filled step by step to assemble the complete service consumer. In Dubbo 2.7, the metadata center has been added. The method signature and parameter type information of Dubbo Admin is from here:&lt;br>
+&lt;img src="http://dubbo.apache.org/imgs/blog/admin/metadata.png" alt="medatada">
+As shown, the server will register the metadata information of the service to the metadata center when it runs,the format is as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
+...
+&lt;span style="color:#268bd2">&amp;#34;methods&amp;#34;&lt;/span>: [
+{
+&lt;span style="color:#268bd2">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;sayHello&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;parameterTypes&amp;#34;&lt;/span>: [
+&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.model.User&amp;#34;&lt;/span>
+],
+&lt;span style="color:#268bd2">&amp;#34;returnType&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.model.Result&amp;#34;&lt;/span>
+},
+...
+],
+&lt;span style="color:#268bd2">&amp;#34;types&amp;#34;&lt;/span>: [
+{
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;char&amp;#34;&lt;/span>
+},
+{
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;long&amp;#34;&lt;/span>
+},
+{
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.model.Result&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;properties&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;msg&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;java.lang.String&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;properties&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;value&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;char[]&amp;#34;&lt;/span>
+},
+&lt;span style="color:#268bd2">&amp;#34;hash&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;int&amp;#34;&lt;/span>
+}
+}
+},
+&lt;span style="color:#268bd2">&amp;#34;userName&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;java.lang.String&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;properties&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;value&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;char[]&amp;#34;&lt;/span>
+},
+&lt;span style="color:#268bd2">&amp;#34;hash&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;int&amp;#34;&lt;/span>
+}
+}
+}
+}
+},
+{
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.model.User&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;properties&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;id&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;java.lang.Long&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;properties&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;value&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;long&amp;#34;&lt;/span>
+}
+}
+},
+&lt;span style="color:#268bd2">&amp;#34;username&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;java.lang.Sring&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;properties&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;value&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;char[]&amp;#34;&lt;/span>
+},
+&lt;span style="color:#268bd2">&amp;#34;hash&amp;#34;&lt;/span>: {
+&lt;span style="color:#268bd2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;int&amp;#34;&lt;/span>
+}
+}
+}
+}
+},
+...
+]
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Related to service testing is the method and type information contained in &lt;code>methods&lt;/code> and &lt;code>types&lt;/code>. Based on this information, Dubbo Admin renders the parameters into the Json Editor of the service test page, where the user enters the values of each parameter and each member variable.&lt;/p>
+&lt;h2 id="principle-generalized-calls">Principle: Generalized calls&lt;/h2>
+&lt;p>With the parameter type, the next question is how to call to the server. In the traditional Dubbo RPC call, the client needs to rely on the server&amp;rsquo;s API jar package ( refer to the &lt;a href="https://github.com/nzomkxia/dubbo-demo/tree/master/dubbo-basic-consumer">dubbo-basic-consumer&lt;/a> in the previous demo ), which is unlikely for Dubbo Admin, because the up and down of services are dynamic, Dubbo Admin can not dynamically increase the jar package dependencies, so y [...]
+&lt;h2 id="summary-and-outlook">Summary and outlook&lt;/h2>
+&lt;p>This article briefly introduces the usage and principle of service testing, and will further enhance this function in the future, such as processing the parameter types of abstract classes, importing parameter values from json files, supporting the saving of parameter values, etc., to facilitate regression testing of the service interface.&lt;/p></description></item><item><title>Blog: Tracing Dubbo service with Apache Skywalking</title><link>http://dubbo.apache.org/en/blog/2019/08/ [...]
+&lt;h2 id="introduction-to-apache-skywalking">Introduction to Apache Skywalking&lt;/h2>
+&lt;p>&lt;a href="https://github.com/apache/incubator-skywalking">Apache Skywalking&lt;/a> is the APM system that it designed for micro-services architectures and cloud native architecture systems and supports distribute tracking. &lt;a href="https://github.com/apache/incubator-skywalking">Apache skywalking (incubator)&lt;/a> collects and analyzes the trace data and generates the relationship between the application and the service metric, Apache skywalking supports multiple languages ag [...]
+&lt;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 si [...]
+&lt;h2 id="dubbo-and-apache-skywalking">Dubbo and Apache Skywalking&lt;/h2>
+&lt;h3 id="build-the-dubbo-demo--project">Build the Dubbo demo project&lt;/h3>
+&lt;p>The Dubbo demo has been uploaded to the &lt;a href="https://github.com/SkywalkingTest/dubbo-trace-example">GitHub repository&lt;/a>.&lt;/p>
+&lt;h4 id="api-project">API project&lt;/h4>
+&lt;p>Service interface definition:
+package org.apache.skywalking.demo.interfaces;&lt;/p>
+&lt;p>public interface HelloService {
+String sayHello(String name);
+}&lt;/p>
+&lt;h4 id="service-provider-project">Service provider project&lt;/h4>
+&lt;p>package org.apache.skywalking.demo.provider;&lt;/p>
+&lt;p>@Service(version = &amp;ldquo;${demo.service.version}&amp;rdquo;,
+application = &amp;ldquo;${dubbo.application.id}&amp;rdquo;,
+protocol = &amp;ldquo;${dubbo.protocol.id}&amp;rdquo;,
+registry = &amp;ldquo;${dubbo.registry.id}&amp;rdquo;, timeout = 60000)
+public class HelloServiceImpl implements HelloService {&lt;/p>
+&lt;pre>&lt;code>public String sayHello(String name) {
+LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
+return &amp;quot;Hello, &amp;quot; + name;
+}
+&lt;/code>&lt;/pre>
+&lt;p>}&lt;/p>
+&lt;h4 id="service-consumer-project">Service consumer project&lt;/h4>
+&lt;p>package org.apache.skywalking.demo.consumer;&lt;/p>
+&lt;p>@RestController
+public class ConsumerController {&lt;/p>
+&lt;pre>&lt;code>private static int COUNT = 0;
+@Reference(version = &amp;quot;${demo.service.version}&amp;quot;,
+application = &amp;quot;${dubbo.application.id}&amp;quot;,
+url = &amp;quot;dubbo://localhost:20880&amp;quot;, timeout = 60000)
+private HelloService helloService;
+@GetMapping(&amp;quot;/sayHello/{name}&amp;quot;)
+public String sayHello(@PathVariable(name = &amp;quot;name&amp;quot;) String name) {
+if ((COUNT++) % 3 == 0){
+throw new RuntimeException();
+}
+LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
+return helloService.sayHello(name);
+}
+&lt;/code>&lt;/pre>
+&lt;p>}&lt;/p>
+&lt;h3 id="deploy-apache-skywalking">Deploy Apache Skywalking&lt;/h3>
+&lt;p>&lt;a href="https://github.com/apache/incubator-skywalking">Apache skywalking&lt;/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 &lt;a href="https://github.com/apache/incubator-skywalking/blob/master/docs/en/Deploy-backend-in-cluster-mode.md">document&lt;/a>.&lt;/p>
+&lt;h4 id="third-party-components">Third-party components&lt;/h4>
+&lt;ol>
+&lt;li>JDK 8+&lt;/li>
+&lt;li>Elasticsearch 5.x&lt;/li>
+&lt;/ol>
+&lt;h4 id="deployment-step">Deployment step&lt;/h4>
+&lt;ol>
+&lt;li>Download &lt;a href="http://skywalking.apache.org/downloads/">Apache Skywalking Collector&lt;/a>&lt;/li>
+&lt;li>Deploy Elasticsearch service
+&lt;ul>
+&lt;li>Set &lt;code>cluster.name&lt;/code> to &lt;code>CollectorDBCluster&lt;/code>&lt;/li>
+&lt;li>Set &lt;code>network.host&lt;/code> to &lt;code>0.0.0.0&lt;/code>&lt;/li>
+&lt;li>Start elasticsearch service&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;li>Unzip and start the Skywalking Collector. Run the ' bin/startup.sh ' command to start skywalking Collector&lt;/li>
+&lt;/ol>
+&lt;h4 id="deploy-the-demo">Deploy the demo&lt;/h4>
+&lt;p>Before you deploy the demo service, please run the following command:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">./mvnw clean package
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="deploy-the-provider-service">Deploy the provider service&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">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
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="deploy-the-consumer-service">Deploy the consumer service&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">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
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="visit-demo-service">visit demo service&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">curl http://localhost:8080/sayHello/test
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="skywalking-scren-snapshot">Skywalking scren snapshot&lt;/h2>
+&lt;h3 id="dashboard">Dashboard&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-dashboard.png" alt="/admin-guide/images/skywalking-dashboard.png">&lt;/p>
+&lt;h3 id="topology">Topology&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-topology.png" alt="/admin-guide/images/skywalking-topology.png">&lt;/p>
+&lt;h3 id="application-view">Application view&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-application.png" alt="/admin-guide/images/skywalking-application.png">&lt;/p>
+&lt;p>JVM Information
+&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-application_instance.png" alt="/admin-guide/images/skywalking-application_instance.png">&lt;/p>
+&lt;h3 id="service-view">Service view&lt;/h3>
+&lt;p>Consumer side
+&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-service-consumer.png" alt="/admin-guide/images/skywalking-service-consumer.png">&lt;/p>
+&lt;p>provider side
+&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-service-provider.png" alt="/admin-guide/images/skywalking-service-provider.png">&lt;/p>
+&lt;h3 id="trace">Trace&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-trace.png" alt="/admin-guide/images/skywalking-trace.png">&lt;/p>
+&lt;p>Span info
+&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-span-Info.png" alt="/admin-guide/images/skywalking-span-Info.png">&lt;/p>
+&lt;h3 id="alarm-view">Alarm view&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/skywalking-alarm.png" alt="/admin-guide/images/skywalking-alarm.png">&lt;/p></description></item><item><title>Blog: Dubbo extensible mechanism source code analysis - part 2</title><link>http://dubbo.apache.org/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/</link><pubDate>Thu, 02 May 2019 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-p [...]
+&lt;p>In the &lt;a href="http://dubbo.apache.org/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/" title="">actual implementation of the Dubbo extensibility mechanism&lt;/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&amp;rsquo;s extension mechanism is great? Next, we will go deep into the source code of Dubbo and see what it is.&lt;/p>
+&lt;h2 id="extensionloader">ExtensionLoader&lt;/h2>
+&lt;p>&lt;code>ExtensionLoader&lt;/code> is the core class, which is responsible for the loading and lifecycle management of extension points. Let&amp;rsquo;s start with this class. There are many methods of Extension, and the common methods include:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>public static &amp;lt;T&amp;gt; ExtensionLoader&amp;lt;T&amp;gt; getExtensionLoader(Class&amp;lt;T&amp;gt; type)&lt;/code>&lt;/li>
+&lt;li>&lt;code>public T getExtension(String name)&lt;/code>&lt;/li>
+&lt;li>&lt;code>public T getAdaptiveExtension()&lt;/code>&lt;/li>
+&lt;/ul>
+&lt;p>The common usages are:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName)&lt;/code>&lt;/li>
+&lt;li>&lt;code>RouterFactory routerFactory = ExtensionLoader.getExtensionLoader(RouterFactory.class).getAdaptiveExtension()&lt;/code>&lt;/li>
+&lt;/ul>
+&lt;p>Notice: In the source code shown below, I&amp;rsquo;ll remove extraneous code (such as logging, exception catching, and so on) to make it easy to read and understand.&lt;/p>
+&lt;ol>
+&lt;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.&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> ExtensionLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span st [...]
+&lt;span style="color:#586e75">// An extension point must be an interface
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(!&lt;/span>type&lt;span style="color:#719e07">.&lt;/span>isInterface&lt;span style="color:#719e07">())&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalArgumentException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Extension type(&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> type &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34;) is not interface!&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#586e75">// @SPI annotations must be provided
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(!&lt;/span>withExtensionAnnotation&lt;span style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">))&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalArgumentException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Extension type without @SPI Annotation!&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#586e75">// Get the corresponding ExtensionLoader from the cache according to the interface
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#586e75">// Each extension will only be loaded once
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> ExtensionLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> loader &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>ExtensionLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;)&lt;/span> EXTENSION_LOADERS&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>type&lt;span  [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>loader &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// Initialize extension
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> EXTENSION_LOADERS&lt;span style="color:#719e07">.&lt;/span>putIfAbsent&lt;span style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ExtensionLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;(&lt;/span>type&lt;span style="color:#719e07">));&lt;/span>
+loader &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>ExtensionLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;)&lt;/span> EXTENSION_LOADERS&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> loader&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#268bd2">ExtensionLoader&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> type&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>type &lt;span style="color:#719e07">=&lt;/span> type&lt;span style="color:#719e07">;&lt;/span>
+objectFactory &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>type &lt;span style="color:#719e07">==&lt;/span> ExtensionFactory&lt;span style="color:#719e07">.&lt;/span>class &lt;span style="color:#719e07">?&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">:&lt;/span> ExtensionLoader&lt;span style="color:#719e07">.&lt;/span>getExtensionLoader&lt;span style="color:#719e07">(&lt;/span>ExtensionFactory&lt;span style= [...]
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
+&lt;li>getExtension&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> T &lt;span style="color:#268bd2">getExtension&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Holder&lt;span style="color:#719e07">&amp;lt;&lt;/span>Object&lt;span style="color:#719e07">&amp;gt;&lt;/span> holder &lt;span style="color:#719e07">=&lt;/span> cachedInstances&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>holder &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+cachedInstances&lt;span style="color:#719e07">.&lt;/span>putIfAbsent&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Holder&lt;span style="color:#719e07">&amp;lt;&lt;/span>Object&lt;span style="color:#719e07">&amp;gt;());&lt;/span>
+holder &lt;span style="color:#719e07">=&lt;/span> cachedInstances&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+Object instance &lt;span style="color:#719e07">=&lt;/span> holder&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#586e75">// Get it from the cache. If it does not exist, create
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>instance &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">synchronized&lt;/span> &lt;span style="color:#719e07">(&lt;/span>holder&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+instance &lt;span style="color:#719e07">=&lt;/span> holder&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>instance &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+instance &lt;span style="color:#719e07">=&lt;/span> createExtension&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+holder&lt;span style="color:#719e07">.&lt;/span>set&lt;span style="color:#719e07">(&lt;/span>instance&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#719e07">(&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> instance&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Some judgments and caching have been made in the getExtension method, and the main logic is in the createExtension method. Let&amp;rsquo;s move on to the createExtension method.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> T &lt;span style="color:#268bd2">createExtension&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// Get the extension class according to the name of extension point. For example, for LoadBalance, get the RandomLoadBalance class according to random
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> clazz &lt;span style="color:#719e07">=&lt;/span> getExtensionClasses&lt;span style="color:#719e07">().&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+T instance &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> EXTENSION_INSTANCES&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>clazz&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>instance &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// Use reflection to call newInstance to create an example of an extension class
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> EXTENSION_INSTANCES&lt;span style="color:#719e07">.&lt;/span>putIfAbsent&lt;span style="color:#719e07">(&lt;/span>clazz&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">(&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> clazz&lt;span style="color:#719e07">.&lt;/span>newInstance&lt;span style="color:#719e07">());&lt;/span>
+instance &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> EXTENSION_INSTANCES&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>clazz&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#586e75">// Make dependency injection for the extended class samples
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> injectExtension&lt;span style="color:#719e07">(&lt;/span>instance&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#586e75">// If there is a wrapper, add the wrapper
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> Set&lt;span style="color:#719e07">&amp;lt;&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;&lt;/span> wrapperClasses &lt;span style="color:#719e07">=&lt;/span> cachedWrapperClasses&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>wrapperClasses &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#719e07">!&lt;/span>wrapperClasses&lt;span style="color:#719e07">.&lt;/span>isEmpty&lt;span style="color:#719e07">())&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> wrapperClass &lt;span style="color:#719e07">:&lt;/span> wrapperClasses&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+instance &lt;span style="color:#719e07">=&lt;/span> injectExtension&lt;span style="color:#719e07">((&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> wrapperClass&lt;span style="color:#719e07">.&lt;/span>getConstructor&lt;span style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">).&lt;/span>newInstance&lt;span style="color:#719e07">(&lt;/span>instance&lt;span style="color:#719e07">));&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> instance&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The createExtension method has done the following:&lt;/p>
+&lt;ol>
+&lt;li>First, get the corresponding extension class according to name. Read the extension point configuration file from the &lt;code>META-INF&lt;/code> folder under ClassPath.&lt;/li>
+&lt;li>Use reflection to create an instance of an extended class.&lt;/li>
+&lt;li>make dependency injection for the attributes of the extended class instance. That is, IoC.&lt;/li>
+&lt;li>If there is a wrapper, add the wrapper. That is, AOP.&lt;/li>
+&lt;/ol>
+&lt;p>Let&amp;rsquo;s focus on these four processes.&lt;/p>
+&lt;ol>
+&lt;li>Get the corresponding extension class according to name. Let’s read the code first:&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;&lt;/span> getExtensionClasses&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;&lt;/span> classes &lt;span style="color:#719e07">=&lt;/span> cachedClasses&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>classes &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">synchronized&lt;/span> &lt;span style="color:#719e07">(&lt;/span>cachedClasses&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+classes &lt;span style="color:#719e07">=&lt;/span> cachedClasses&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>classes &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+classes &lt;span style="color:#719e07">=&lt;/span> loadExtensionClasses&lt;span style="color:#719e07">();&lt;/span>
+cachedClasses&lt;span style="color:#719e07">.&lt;/span>set&lt;span style="color:#719e07">(&lt;/span>classes&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> classes&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#586e75">// synchronized in getExtensionClasses
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>&lt;span style="color:#268bd2">private&lt;/span> Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;&lt;/span> loadExtensionClasses&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">final&lt;/span> SPI defaultAnnotation &lt;span style="color:#719e07">=&lt;/span> type&lt;span style="color:#719e07">.&lt;/span>getAnnotation&lt;span style="color:#719e07">(&lt;/span>SPI&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>defaultAnnotation &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String value &lt;span style="color:#719e07">=&lt;/span> defaultAnnotation&lt;span style="color:#719e07">.&lt;/span>value&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>value &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#719e07">(&lt;/span>value &lt;span style="color:#719e07">=&lt;/span> value&lt;span style="color:#719e07">.&lt;/span>trim&lt;span style="color:#719e07">()).&lt;/span>length&lt;span style="color:#719e07">()&lt;/span> &lt;span styl [...]
+String&lt;span style="color:#719e07">[]&lt;/span> names &lt;span style="color:#719e07">=&lt;/span> NAME_SEPARATOR&lt;span style="color:#719e07">.&lt;/span>split&lt;span style="color:#719e07">(&lt;/span>value&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>names&lt;span style="color:#719e07">.&lt;/span>length &lt;span style="color:#719e07">&amp;gt;&lt;/span> 1&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalStateException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;more than 1 default extension name on extension &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> type&lt;span style="color:#719e07">.&lt;/span>getName&lt;span style="color:#719e07">());&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>names&lt;span style="color:#719e07">.&lt;/span>length &lt;span style="color:#719e07">==&lt;/span> 1&lt;span style="color:#719e07">)&lt;/span> cachedDefaultName &lt;span style="color:#719e07">=&lt;/span> names&lt;span style="color:#719e07">[&lt;/span>0&lt;span style="color:#719e07">];&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;&lt;/span> extensionClasses &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> HashMap&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;();&lt;/span>
+loadFile&lt;span style="color:#719e07">(&lt;/span>extensionClasses&lt;span style="color:#719e07">,&lt;/span> DUBBO_INTERNAL_DIRECTORY&lt;span style="color:#719e07">);&lt;/span>
+loadFile&lt;span style="color:#719e07">(&lt;/span>extensionClasses&lt;span style="color:#719e07">,&lt;/span> DUBBO_DIRECTORY&lt;span style="color:#719e07">);&lt;/span>
+loadFile&lt;span style="color:#719e07">(&lt;/span>extensionClasses&lt;span style="color:#719e07">,&lt;/span> SERVICES_DIRECTORY&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> extensionClasses&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>META-INF/dubbo/internal&lt;/code>&lt;/li>
+&lt;li>&lt;code>META-INF/dubbo&lt;/code>&lt;/li>
+&lt;li>&lt;code>META-INF/services&lt;/code>&lt;/li>
+&lt;/ul>
+&lt;ol start="2">
+&lt;li>Use reflection to create an extended instance. This process is very simple. We can do this using &lt;code>clazz.newInstance()&lt;/code>. The attributes of the extended instance created are all null values.&lt;/li>
+&lt;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&amp;rsquo;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 extensi [...]
+&lt;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.&lt;/li>
+&lt;/ol>
+&lt;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.&lt;/p>
+&lt;h2 id="auto-assembly-of-dubbo-spi-advanced-usage">Auto-assembly of Dubbo SPI advanced usage&lt;/h2>
+&lt;p>The relevant code for auto-assembly is in the injectExtension method:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> T &lt;span style="color:#268bd2">injectExtension&lt;/span>&lt;span style="color:#719e07">(&lt;/span>T instance&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>Method method &lt;span style="color:#719e07">:&lt;/span> instance&lt;span style="color:#719e07">.&lt;/span>getClass&lt;span style="color:#719e07">().&lt;/span>getMethods&lt;span style="color:#719e07">())&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>method&lt;span style="color:#719e07">.&lt;/span>getName&lt;span style="color:#719e07">().&lt;/span>startsWith&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;set&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> method&lt;span style="color:#719e07">.&lt;/span>getParameterTypes&lt;span style="color:#719e07">().&lt;/span>length &lt;span style="color:#719e07">==&lt;/span> 1
+&lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> Modifier&lt;span style="color:#719e07">.&lt;/span>isPublic&lt;span style="color:#719e07">(&lt;/span>method&lt;span style="color:#719e07">.&lt;/span>getModifiers&lt;span style="color:#719e07">()))&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> pt &lt;span style="color:#719e07">=&lt;/span> method&lt;span style="color:#719e07">.&lt;/span>getParameterTypes&lt;span style="color:#719e07">()[&lt;/span>0&lt;span style="color:#719e07">];&lt;/span>
+String property &lt;span style="color:#719e07">=&lt;/span> method&lt;span style="color:#719e07">.&lt;/span>getName&lt;span style="color:#719e07">().&lt;/span>length&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">&amp;gt;&lt;/span> 3 &lt;span style="color:#719e07">?&lt;/span> method&lt;span style="color:#719e07">.&lt;/span>getName&lt;span style="color:#719e07">().&lt;/span>substring&lt;span style="color:#719e07">(&lt;/span>3&lt;span style="color:#719e07">,&lt;/s [...]
+Object object &lt;span style="color:#719e07">=&lt;/span> objectFactory&lt;span style="color:#719e07">.&lt;/span>getExtension&lt;span style="color:#719e07">(&lt;/span>pt&lt;span style="color:#719e07">,&lt;/span> property&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>object &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+method&lt;span style="color:#719e07">.&lt;/span>invoke&lt;span style="color:#719e07">(&lt;/span>instance&lt;span style="color:#719e07">,&lt;/span> object&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> instance&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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&amp;rsquo;s set method. H [...]
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#268bd2">ExtensionLoader&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> type&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>type &lt;span style="color:#719e07">=&lt;/span> type&lt;span style="color:#719e07">;&lt;/span>
+objectFactory &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>type &lt;span style="color:#719e07">==&lt;/span> ExtensionFactory&lt;span style="color:#719e07">.&lt;/span>class &lt;span style="color:#719e07">?&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">:&lt;/span> ExtensionLoader&lt;span style="color:#719e07">.&lt;/span>getExtensionLoader&lt;span style="color:#719e07">(&lt;/span>ExtensionFactory&lt;span style= [...]
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>ObjectFacore is also an extension, obtained through &lt;code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()&lt;/code>.&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-extensionfactory.png" alt="Dubbo-ExtensionFactory" title="">&lt;/p>
+&lt;p>ExtensionFactory includes three implementations:&lt;/p>
+&lt;ol>
+&lt;li>SpiExtensionFactory: use Dubbo&amp;rsquo;s Spi to load Extension.&lt;/li>
+&lt;li>SpringExtensionFactory: load Extension from the Spring container.&lt;/li>
+&lt;li>AdaptiveExtensionFactory: adaptive AdaptiveExtensionLoader&lt;/li>
+&lt;/ol>
+&lt;p>Pay attention to the AdaptiveExtensionLoader here, the source code is as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@Adaptive&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AdaptiveExtensionFactory&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> ExtensionFactory &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#268bd2">final&lt;/span> List&lt;span style="color:#719e07">&amp;lt;&lt;/span>ExtensionFactory&lt;span style="color:#719e07">&amp;gt;&lt;/span> factories&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">AdaptiveExtensionFactory&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ExtensionLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>ExtensionFactory&lt;span style="color:#719e07">&amp;gt;&lt;/span> loader &lt;span style="color:#719e07">=&lt;/span> ExtensionLoader&lt;span style="color:#719e07">.&lt;/span>getExtensionLoader&lt;span style="color:#719e07">(&lt;/span>ExtensionFactory&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+List&lt;span style="color:#719e07">&amp;lt;&lt;/span>ExtensionFactory&lt;span style="color:#719e07">&amp;gt;&lt;/span> list &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ArrayList&lt;span style="color:#719e07">&amp;lt;&lt;/span>ExtensionFactory&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>String name &lt;span style="color:#719e07">:&lt;/span> loader&lt;span style="color:#719e07">.&lt;/span>getSupportedExtensions&lt;span style="color:#719e07">())&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+list&lt;span style="color:#719e07">.&lt;/span>add&lt;span style="color:#719e07">(&lt;/span>loader&lt;span style="color:#719e07">.&lt;/span>getExtension&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">));&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+factories &lt;span style="color:#719e07">=&lt;/span> Collections&lt;span style="color:#719e07">.&lt;/span>unmodifiableList&lt;span style="color:#719e07">(&lt;/span>list&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> T &lt;span style="color:#268bd2">getExtension&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> type&lt;span style="color:#719e07">,&lt;/span> String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>ExtensionFactory factory &lt;span style="color:#719e07">:&lt;/span> factories&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+T extension &lt;span style="color:#719e07">=&lt;/span> factory&lt;span style="color:#719e07">.&lt;/span>getExtension&lt;span style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">,&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>extension &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> extension&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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 &lt;code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())&lt;/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&amp;rsquo;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 compo [...]
+&lt;h2 id="aop-of-dubbo-spi-advanced-usage">AOP of Dubbo SPI advanced usage&lt;/h2>
+&lt;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&amp;rsquo;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.&lt;/p>
+&lt;h3 id="what-is-the-wrapper-class">What is the Wrapper class&lt;/h3>
+&lt;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&amp;rsquo;s a Wrapper class:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">A&lt;/span>&lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> A a&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">A&lt;/span>&lt;span style="color:#719e07">(&lt;/span>A a&lt;span style="color:#719e07">){&lt;/span>
+&lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>a &lt;span style="color:#719e07">=&lt;/span> a&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Class A has a constructor &lt;code>public A(A a)&lt;/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.&lt;/p>
+&lt;h3 id="how-to-configure-the-wrapper-class">How to configure the Wrapper class&lt;/h3>
+&lt;p>The Wrapper class in Dubbo is also an extension point. Like other extension points, it is also configured in the &lt;code>META-INF&lt;/code> folder. For example, the ProtocolFilterWrapper and ProtocolListenerWrapper in the previous example are configured in the path &lt;code>dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-text" data-lang="text">filter=org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper
+listener=org.apache.dubbo.rpc.protocol.ProtocolListenerWrapper
+mock=org.apache.dubbo.rpc.support.MockProtocol
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>When Dubbo loads the extension configuration file, there is a piece of code as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+clazz&lt;span style="color:#719e07">.&lt;/span>getConstructor&lt;span style="color:#719e07">(&lt;/span>type&lt;span style="color:#719e07">);&lt;/span>
+Set&lt;span style="color:#719e07">&amp;lt;&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;&lt;/span> wrappers &lt;span style="color:#719e07">=&lt;/span> cachedWrapperClasses&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>wrappers &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+cachedWrapperClasses &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ConcurrentHashSet&lt;span style="color:#719e07">&amp;lt;&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&amp;gt;();&lt;/span>
+wrappers &lt;span style="color:#719e07">=&lt;/span> cachedWrapperClasses&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+wrappers&lt;span style="color:#719e07">.&lt;/span>add&lt;span style="color:#719e07">(&lt;/span>clazz&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>NoSuchMethodException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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 &lt;code>clazz.getConstructor(type)&lt;/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 &lt;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&lt;/code>.
+The code of ProtocolFilterWrapper is as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">ProtocolFilterWrapper&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> Protocol &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#268bd2">final&lt;/span> Protocol protocol&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">// One parameter is the copy constructor of Protocol
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">ProtocolFilterWrapper&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Protocol protocol&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>protocol &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalArgumentException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;protocol == null&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>protocol &lt;span style="color:#719e07">=&lt;/span> protocol&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>ProtocolFilterWrapper has a constructor &lt;code>public ProtocolFilterWrapper(Protocol protocol)&lt;/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.&lt;/p>
+&lt;h2 id="extension-point-adaptive">Extension point adaptive&lt;/h2>
+&lt;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&amp;rsquo;s first look at the code to create an adaptive extension class:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> T &lt;span style="color:#268bd2">getAdaptiveExtension&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Object instance &lt;span style="color:#719e07">=&lt;/span> cachedAdaptiveInstance&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>instance &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">synchronized&lt;/span> &lt;span style="color:#719e07">(&lt;/span>cachedAdaptiveInstance&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+instance &lt;span style="color:#719e07">=&lt;/span> cachedAdaptiveInstance&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>instance &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+instance &lt;span style="color:#719e07">=&lt;/span> createAdaptiveExtension&lt;span style="color:#719e07">();&lt;/span>
+cachedAdaptiveInstance&lt;span style="color:#719e07">.&lt;/span>set&lt;span style="color:#719e07">(&lt;/span>instance&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#719e07">(&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> instance&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Continue to read the createAdaptiveExtension method:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> T &lt;span style="color:#268bd2">createAdaptiveExtension&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> injectExtension&lt;span style="color:#719e07">((&lt;/span>T&lt;span style="color:#719e07">)&lt;/span> getAdaptiveExtensionClass&lt;span style="color:#719e07">().&lt;/span>newInstance&lt;span style="color:#719e07">());&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Continue to read the getAdaptiveExtensionClass method:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> getAdaptiveExtensionClass&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+getExtensionClasses&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>cachedAdaptiveClass &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> cachedAdaptiveClass&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> cachedAdaptiveClass &lt;span style="color:#719e07">=&lt;/span> createAdaptiveExtensionClass&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">private&lt;/span> Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> createAdaptiveExtensionClass&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String code &lt;span style="color:#719e07">=&lt;/span> createAdaptiveExtensionClassCode&lt;span style="color:#719e07">();&lt;/span>
+ClassLoader classLoader &lt;span style="color:#719e07">=&lt;/span> findClassLoader&lt;span style="color:#719e07">();&lt;/span>
+org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>common&lt;span style="color:#719e07">.&lt;/span>compiler&lt;span style="color:#719e07">.&lt;/span>Compiler compiler &lt;span style="color:#719e07">=&lt;/span> ExtensionLoader&lt;span style="color:#719e07">.&lt;/span>getExtensionLoader&lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#71 [...]
+&lt;span style="color:#719e07">return&lt;/span> compiler&lt;span style="color:#719e07">.&lt;/span>compile&lt;span style="color:#719e07">(&lt;/span>code&lt;span style="color:#719e07">,&lt;/span> classLoader&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The default implementation of Compiler&amp;rsquo;s code is javassist.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@SPI&lt;/span>&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;javassist&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">Compiler&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> compile&lt;span style="color:#719e07">(&lt;/span>String code&lt;span style="color:#719e07">,&lt;/span> ClassLoader classLoader&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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&amp;rsquo;t have to care about the API of the [...]
+Below are the Java code example for Protocol adaptive class created by createAdaptiveExtensionClassCode method:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.rpc&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.common.extension.ExtensionLoader&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">Protocol$Adaptive&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Protocol &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">destroy&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> UnsupportedOperationException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;method public abstract void org.apache.dubbo.rpc.Protocol.destroy() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> &lt;span style="color:#268bd2">getDefaultPort&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> UnsupportedOperationException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;method public abstract int org.apache.dubbo.rpc.Protocol.getDefaultPort() of interface org.apache.dubbo.rpc.Protocol is not adaptive method!&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Exporter &lt;span style="color:#268bd2">export&lt;/span>&lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="co [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>arg0 &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalArgumentException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.rpc.Invoker argument == null&amp;#34;&lt;/span>&lt;spa [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>arg0&lt;span style="color:#719e07">.&lt;/span>getUrl&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalArgumentException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.rpc.Invoker argument getUrl() == null&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>common&lt;span style="color:#719e07">.&lt;/span>URL url &lt;span style="color:#719e07">=&lt;/span> arg0&lt;span style="color:#719e07">.&lt;/span>getUrl&lt;span style="color:#719e07">();&lt;/span>
+String extName &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>url&lt;span style="color:#719e07">.&lt;/span>getProtocol&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">?&lt;/span> &lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> &lt;span style="color:#719e07">:&lt;/span> url&lt;span style="color:#719e07">.&lt;/span>getPro [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>extName &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalStateException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url(&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> url&lt;span style="color:#719e07">.&lt;/span>toString&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa1 [...]
+org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Protocol extension &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Protocol&lt;span s [...]
+&lt;span style="color:#719e07">return&lt;/span> extension&lt;span style="color:#719e07">.&lt;/span>export&lt;span style="color:#719e07">(&lt;/span>arg0&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Invoker &lt;span style="color:#268bd2">refer&lt;/span>&lt;span style="color:#719e07">(&lt;/span>java&lt;span style="color:#719e07">.&lt;/span>lang&lt;span style="color:#719e07">.&lt;/span>Class arg0&lt;span style="color:#719e07">,&lt;/span> org&lt;span style= [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>arg1 &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalArgumentException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;url == null&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>common&lt;span style="color:#719e07">.&lt;/span>URL url &lt;span style="color:#719e07">=&lt;/span> arg1&lt;span style="color:#719e07">;&lt;/span>
+String extName &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>url&lt;span style="color:#719e07">.&lt;/span>getProtocol&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">?&lt;/span> &lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> &lt;span style="color:#719e07">:&lt;/span> url&lt;span style="color:#719e07">.&lt;/span>getPro [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>extName &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">throw&lt;/span> &lt;span style="color:#719e07">new&lt;/span> IllegalStateException&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url(&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> url&lt;span style="color:#719e07">.&lt;/span>toString&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa1 [...]
+org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Protocol extension &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>rpc&lt;span style="color:#719e07">.&lt;/span>Protocol&lt;span s [...]
+&lt;span style="color:#719e07">return&lt;/span> extension&lt;span style="color:#719e07">.&lt;/span>refer&lt;span style="color:#719e07">(&lt;/span>arg0&lt;span style="color:#719e07">,&lt;/span> arg1&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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 &lt;code>createAdaptiveExtensionClassCode&lt;/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:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@SPI&lt;/span>&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">Protocol&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#dc322f">int&lt;/span> &lt;span style="color:#268bd2">getDefaultPort&lt;/span>&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#268bd2">@Adaptive&lt;/span>
+&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> Exporter&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">export&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Invoker&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> invoker&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws& [...]
+&lt;span style="color:#268bd2">@Adaptive&lt;/span>
+&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> Invoker&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">refer&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Class&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> type&lt;span style="color:#719e07">,&lt;/span> URL url&lt;span style="color:#719e07">)&lt;/s [...]
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">destroy&lt;/span>&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p></description></item><item><title>Blo [...]
+&lt;h2 id="1-extension-mechanism-of-dubbo">1. Extension Mechanism of Dubbo&lt;/h2>
+&lt;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 &amp;mdash; 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 isolat [...]
+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&amp;rsquo;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&amp;rsquo;s extension mechanism in detail.&lt;/p>
+&lt;h2 id="2extension-solutions">2.Extension Solutions&lt;/h2>
+&lt;p>Creating Extensible applications usually considers:&lt;/p>
+&lt;ul>
+&lt;li>Factory method pattern&lt;/li>
+&lt;li>IoC container&lt;/li>
+&lt;li>OSGi (Open Services Gateway initiative)&lt;/li>
+&lt;/ul>
+&lt;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.&lt;/p>
+&lt;h2 id="3java-spi-mechanism">3.Java SPI Mechanism&lt;/h2>
+&lt;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.&lt;/p>
+&lt;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 &lt;code>META-INF/services&lt;/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 &lt;code>java.util.ServiceLoader&lt;/code> to load implementations of a  [...]
+&lt;ol>
+&lt;li>Define an interface IRepository to store data.&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">IRepository&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">save&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String data&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
+&lt;li>Create 2 implementations for IRepository: MysqlRepository and MongoRepository&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">MysqlRepository&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> IRepository &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">save&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String data&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Save &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> data &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34; to Mysql&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">MongoRepository&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> IRepository &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">save&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String data&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Save &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> data &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34; to Mongo&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
+&lt;li>Create a configuration file under &lt;code>META-INF/services&lt;/code>.&lt;/li>
+&lt;/ol>
+&lt;p>The file name is &lt;code>META-INF/services/com.demo.IRepository&lt;/code>, the content of file is:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-text" data-lang="text">com.demo.MongoRepository
+com.demo.MysqlRepository
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
+&lt;li>Load IRepository using ServiceLoader&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">ServiceLoader&lt;span style="color:#719e07">&amp;lt;&lt;/span>IRepository&lt;span style="color:#719e07">&amp;gt;&lt;/span> serviceLoader &lt;span style="color:#719e07">=&lt;/span> ServiceLoader&lt;span style="color:#719e07">.&lt;/span>load&lt;span style="color:#719e07">(&lt;/span>IRepository&lt;span style="color:#719e07" [...]
+Iterator&lt;span style="color:#719e07">&amp;lt;&lt;/span>IRepository&lt;span style="color:#719e07">&amp;gt;&lt;/span> it &lt;span style="color:#719e07">=&lt;/span> serviceLoader&lt;span style="color:#719e07">.&lt;/span>iterator&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">while&lt;/span> &lt;span style="color:#719e07">(&lt;/span>it &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span> &lt;span style="color:#719e07">&amp;amp;&amp;amp;&lt;/span> it&lt;span style="color:#719e07">.&lt;/span>hasNext&lt;span style="color:#719e07">()){&lt;/span>
+IRepository demoService &lt;span style="color:#719e07">=&lt;/span> it&lt;span style="color:#719e07">.&lt;/span>next&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;class:&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> demoService&lt;span style="color:#719e07">.&lt;/span>getClass&lt;span style="color:#719e07">().&lt;/span>getName&lt;span style="color:#719e07">());&lt;/span>
+demoService&lt;span style="color:#719e07">.&lt;/span>save&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;tom&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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&lt;/p>
+&lt;h2 id="4-dubbo-spi-mechanism">4. Dubbo SPI Mechanism&lt;/h2>
+&lt;p>Java SPI is simple to use. It also supports basic extension point functions, however, it has some disadvantages:&lt;/p>
+&lt;ul>
+&lt;li>It will load and instantiate all implementations at once to find the requested implementation.&lt;/li>
+&lt;li>The configuration file only includes the extension implementation but does not name them, which makes it hard to reference them in applications.&lt;/li>
+&lt;li>If extensions depend on other extensions, Java SPI cannot automatically load the dependency SPI.&lt;/li>
+&lt;li>It does not provide functions such as IOC or AOP in Spring.&lt;/li>
+&lt;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.&lt;/li>
+&lt;/ul>
+&lt;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.&lt;/p>
+&lt;h2 id="5-basic-concepts-for-dubbo-extension-point-mechanism">5. Basic Concepts for Dubbo Extension Point Mechanism&lt;/h2>
+&lt;p>Before diving into Dubbo&amp;rsquo;s extension mechanism,Let us first declare some basic concepts in Dubbo SPI. Those terms will appear multiple times in the following section.&lt;/p>
+&lt;h3 id="51-extension-point">5.1 Extension Point&lt;/h3>
+&lt;p>an interface of java.&lt;/p>
+&lt;h3 id="52-extension">5.2 Extension&lt;/h3>
+&lt;p>an implementation class of the Extension Point&lt;/p>
+&lt;h3 id="53-extension-instance">5.3 Extension Instance&lt;/h3>
+&lt;p>instance of an extension point implementation class&lt;/p>
+&lt;h3 id="54-extension-adaptive-instance">5.4 Extension Adaptive Instance&lt;/h3>
+&lt;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  [...]
+&lt;ul>
+&lt;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 i [...]
+&lt;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. Adapti [...]
+&lt;/ul>
+&lt;h3 id="55-spi">5.5 @SPI&lt;/h3>
+&lt;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.&lt;/p>
+&lt;h3 id="56-adaptive">5.6 @Adaptive&lt;/h3>
+&lt;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 fu [...]
+&lt;h3 id="57-extentionloader">5.7 ExtentionLoader&lt;/h3>
+&lt;p>Similar to the Java SPI ServiceLoader, it is responsible for loading extensions and life-cycle maintenance.&lt;/p>
+&lt;h3 id="58-extension-alias">5.8 Extension Alias&lt;/h3>
+&lt;p>Different from Java, each extension in Dubbo has an alias, which is used to reference them in the application, such as&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#268bd2">random&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
+&lt;span style="color:#268bd2">roundrobin&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>where random, roundrobin are alias of the corresponding extensions, and we can directly use them in the configuration file.&lt;/p>
+&lt;h3 id="59-paths">5.9 Paths&lt;/h3>
+&lt;p>Similar to the way Java SPI loading the extension configuration from the &lt;code>META-INF/services&lt;/code> directory, Dubbo will also load the extension configuration file from the following path:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>META-INF/dubbo/internal&lt;/code>&lt;/li>
+&lt;li>&lt;code>META-INF/dubbo&lt;/code>&lt;/li>
+&lt;li>&lt;code>META-INF/services&lt;/code>&lt;/li>
+&lt;/ul>
+&lt;h2 id="6-interpretation-for-dubbos-loadbalance-extension-point">6. Interpretation for Dubbo&amp;rsquo;s LoadBalance Extension Point&lt;/h2>
+&lt;p>Now that we know some basic idea about Dubbo, let us check a practical extension point in Dubbo to get some intuition.&lt;/p>
+&lt;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.&lt;/p>
+&lt;h3 id="61-loadbalance-interfance">6.1 LoadBalance Interfance&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@SPI&lt;/span>&lt;span style="color:#719e07">(&lt;/span>RandomLoadBalance&lt;span style="color:#719e07">.&lt;/span>NAME&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">LoadBalance&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Adaptive&lt;/span>&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;loadbalance&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> Invoker&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">select&lt;/span>&lt;span style="color:#719e07">(&lt;/span>List&lt;span style="color:#719e07">&amp;lt;&lt;/span>Invoker&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&amp;gt;&lt;/span> invokers&lt;span style="colo [...]
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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:&lt;/p>
+&lt;ul>
+&lt;li>@SPI(&lt;a href="http://RandomLoadBalance.NAME">RandomLoadBalance.NAME&lt;/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 wi [...]
+&lt;code>RandomLoadBalance.NAME&lt;/code> is a constant with value “random” and is a random load balancing implementation. The definition of random is in the configuration file &lt;code>META-INF/dubbo/internal/com.alibaba.dubbo.rpc.cluster.LoadBalance&lt;/code>:&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#268bd2">random&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
+&lt;span style="color:#268bd2">roundrobin&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
+&lt;span style="color:#268bd2">leastactive&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
+&lt;span style="color:#268bd2">consistenthash&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;p>&lt;img src="https://raw.githubusercontent.com/vangoleo/wiki/master/dubbo/dubbo_loadbalance.png" alt="dubbo-loadbalance | left" title="">&lt;/p>
+&lt;ul>
+&lt;li>@Adaptive(&amp;ldquo;loadbalance&amp;rdquo;) 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 &lt;code>loadbalance&lt;/code> indicates that the value of loadbalance in method is the extension implementation that will be actually called. How [...]
+&lt;/ul>
+&lt;h3 id="62-obtain-loadbalance-extension">6.2 Obtain LoadBalance extension&lt;/h3>
+&lt;p>The code of LoadBalance in Dubbo is as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">LoadBalance lb &lt;span style="color:#719e07">=&lt;/span> ExtensionLoader&lt;span style="color:#719e07">.&lt;/span>getExtensionLoader&lt;span style="color:#719e07">(&lt;/span>LoadBalance&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">).&lt;/span>getExtension&lt;span style="color:#719e07">(&l [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;h2 id="7-customize-a-loadbalance-extension">7. Customize a LoadBalance Extension&lt;/h2>
+&lt;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(&lt;a href="https://github.com/vangoleo/dubbo-spi-demo">https://github.com/vangoleo/dubbo-spi-demo&lt;/a>).&lt;/p>
+&lt;h3 id="71-implement-loadbalance-interface">7.1 implement LoadBalance Interface&lt;/h3>
+&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> com.dubbo.spi.demo.consumer&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DemoLoadBalance&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> LoadBalance &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> Invoker&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">select&lt;/span>&lt;span style="color:#719e07">(&lt;/span>List&lt;span style="color:#719e07">&amp;lt;&lt;/span>Invoker&lt;span style="color:#719e07">&amp;lt;&lt;/span>T&lt;span style="color:#719e07">&amp;gt [...]
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;DemoLoadBalance: Select the first invoker...&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> invokers&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">(&lt;/span>0&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="72-add-extension-configuration-file">7.2 Add extension configuration file&lt;/h3>
+&lt;p>Add file:&lt;code>META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance&lt;/code>. The content of file is:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">&lt;span style="color:#268bd2">demo&lt;/span>&lt;span style="color:#719e07">=&lt;/span>com.dubbo.spi.demo.consumer.DemoLoadBalance
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="73-configure-customized-loadbalance">7.3 Configure customized LoadBalance&lt;/h3>
+&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;helloService&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.dubbo.spi.demo.api.IHelloService&amp;#34;&lt;/span> loadbalance=&lt;span style="color:#2aa198">&amp;#34;demo&amp;#34;&lt;/span> &l [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configure &amp;lt;loadbalance=&amp;ldquo;demo&amp;rdquo;&amp;gt; in &lt;a href="dubbo:reference">dubbo:reference&lt;/a> at consumer part.&lt;/p>
+&lt;h3 id="74-launch-dubbo">7.4 launch Dubbo&lt;/h3>
+&lt;p>Launch Dubbo and call IHelloService, the console will output log: &lt;code>DemoLoadBalance: Select the first invoker...&lt;/code>, which means Dubbo does use our customized LoadBalance.&lt;/p>
+&lt;h2 id="summary">Summary&lt;/h2>
+&lt;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:&lt;/p>
+&lt;ul>
+&lt;li>Build extensions on Dubbo does not require modifications on the original source code base.&lt;/li>
+&lt;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.&lt;/li>
+&lt;li>Dubbo&amp;rsquo;s extension mechanism default: @SPI(&amp;ldquo;dubbo&amp;rdquo;) represents the default SPI object.&lt;/li>
+&lt;li>Dubbo&amp;rsquo;s extension mechanism supports the advanced features such as IoC and AoP, etc.&lt;/li>
+&lt;li>Dubbo&amp;rsquo;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.&lt;/li>
+&lt;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.&lt;/li>
+&lt;/ul>
+&lt;p>In the next article, we will go deep and check Dubbo&amp;rsquo;s source code to learn more about Dubbo&amp;rsquo;s extensibility mechanism.&lt;/p></description></item><item><title>Blog: Implementation background and practice of Dubbo client asynchronous interface</title><link>http://dubbo.apache.org/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/</link><pubDate>Wed, 20 Feb 2019 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/e [...]
+&lt;h2 id="preface">Preface&lt;/h2>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubboasyn_client/1_en.png" alt="image | left">&lt;/p>
+&lt;p>Let&amp;rsquo;s start with a brief introduction about the stages of a complete Dubbo invocation.&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;p>Biz~ represents business thread, that is, the thread where the business logic is located. Biz~ thread pool may be created and maintained by business itself, most of which may be managed by system framework itself (for example, a web system runs under Tomcat container, Biz~ thread is maintained by Tomcat); IO~ stands for network data processing thread, which is created and maintained by IO framework (such as Netty, Grizzly). Dubbo Remoting&amp;rsquo;s default Netty implementation is [...]
+&lt;/li>
+&lt;li>
+&lt;p>As we all know, the way of data communication between threads is shared variables. The data communication between Biz and IO is Queue. Specifically to Dubbo, Biz put a task in EventLoop&amp;rsquo;s LinkedBlockingQueue in the client side implementation (i.e. the steps labeled in Figure 1 above), and the corresponding Thread in the EventLoop will keep iteration the Queue to keep on executing the information the task contains. Specific code can refer to SingleThreadEventExecutor (by t [...]
+&lt;/li>
+&lt;li>
+&lt;p>As shown in the figure above, a standard RPC call passes through four message (event) transfers of 1,2,3,4, respectively are the client business thread sending requests to the client IO thread, the server business logic thread receiving the server IO thread requests, the server logic thread responding to the server IO thread after processing, and the client IO thread receiving the results feedback to the business logic thread.&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;h2 id="client-asynchronization">Client Asynchronization&lt;/h2>
+&lt;h3 id="background">Background&lt;/h3>
+&lt;p>In the Java language (other languages are not clear), a call of the local interface can be transparently converted into the call of remote RPC through the proxy mechanism. Most business parties prefer this programming method similar to the local interface to do remote service invocation. Therefore, although RPC is naturally asynchronous internally, users using Dubbo mostly use synchronization, while asynchrony becomes a minority use scenario. The advantage of synchronization is tha [...]
+&lt;p>Therefore, the motivation of client asynchronization is to save thread resource overhead at the cost of understanding how asynchronization is used. In the synchronous mode, the return type of API interface represents a certain business class, while in the asynchronous case, the response and the request are completely independent events, so it is most suitable for the return type of API interface to be CompletionStage mentioned above, which is the inevitable asynchronization support [...]
+&lt;p>The example blow is to illustrate it.&lt;/p>
+&lt;h3 id="the-sample">The sample&lt;/h3>
+&lt;p>Refer to the example code for event notification: &lt;a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify&lt;/a>&lt;/p>
+&lt;p>Event notification allows the Consumer to trigger &amp;lsquo;oninvoke&amp;rsquo;, &amp;lsquo;onreturn&amp;rsquo; and &amp;lsquo;onthrow&amp;rsquo; events, which respectively represent before the call, after the call returns normally, or when an exception occurs.&lt;/p>
+&lt;p>You can specify a method for notifying events when configuring the Consumer, such as:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoCallback&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.notify.impl.NotifyImpl&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span> check=&lt;span style="color:#2aa198">&amp;#34;false&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.notify.api.DemoService&amp;#34;&lt;/span> version=&lt;span style="color:#2aa198">&amp;#34;1.0.0&amp;#34;&lt;/span> group=&lt;span style="color:#2aa198">&amp;#34;cn&amp;#34;&lt;/span>&lt;span style="color:#2 [...]
+&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;sayHello&amp;#34;&lt;/span> onreturn=&lt;span style="color:#2aa198">&amp;#34;demoCallback.onreturn&amp;#34;&lt;/span> onthrow=&lt;span style="color:#2aa198">&amp;#34;demoCallback.onthrow&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:reference&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The code for NotifyImpl is as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">NotifyImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> Notify&lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>Integer&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">&amp;gt;&lt;/span> ret &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> HashMap&lt;span style="color:#719e07">&amp;lt;&lt;/span>Integer&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">onreturn&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> id&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ret&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>id&lt;span style="color:#719e07">,&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;onreturn: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">onthrow&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Throwable ex&lt;span style="color:#719e07">,&lt;/span> String name&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> id&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;onthrow: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>It is important to note that the parameters for the three methods in the custom Notify interface are as follows:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>oninvoke&lt;/code> The parameters of the method are the same as those of the calling method.&lt;/li>
+&lt;li>&lt;code>onreturn&lt;/code> The first parameter of the method is the return value of the calling method, and the rest is the parameters of the calling method.&lt;/li>
+&lt;li>&lt;code>onthrow&lt;/code> The first parameter to the method is the call exception, and the rest is the parameter to the calling method.&lt;/li>
+&lt;/ul>
+&lt;p>In the above configuration, the &lt;code>sayHello&lt;/code> method is called synchronously, so the execution of the event notification method is also synchronously executed. &lt;code>async=true&lt;/code> can be configured to make the method call asynchronous, and the notification event method is also executed asynchronously. In particular, the &lt;code>oninvoke&lt;/code> method executes synchronously, regardless of whether it is invoked asynchronously or not.&lt;/p>
+&lt;h3 id="practical-advice">Practical advice&lt;/h3>
+&lt;ul>
+&lt;li>
+&lt;div data-type="alignment" data-value="justify" style="text-align:justify">
+&lt;div data-type="p">Logical Non-Strongly dependent results after RPC invocation: Asynchronous callbacks are suitable for client-side asynchronous invocation when the client &lt;strong>is not strongly dependent on the server response&lt;/strong>.&lt;/div>
+&lt;/div>
+&lt;/li>
+&lt;li>
+&lt;div data-type="alignment" data-value="justify" style="text-align:justify">
+&lt;div data-type="p">RX scenario: after learning about reactive programming model, I believe that as long as the programming thinking can embrace reactive and the state machine design of business model can be adjusted appropriately, asynchronous solutions can be applied in all scenarios, so as to achieve better terminal response experience. For Dubbo, the current asynchronous interface model needs to be improved like the reactive model interface in order to make the user more naturally  [...]
+&lt;/div>
+&lt;/li>
+&lt;/ul>
+&lt;h3 id="conclusions">Conclusions&lt;/h3>
+&lt;ul>
+&lt;li>The motivation of client asynchronization is that the request sending and response processing are two different independent events, how the response is handled and in which thread is handled are not required to be coupled with the business logic thread of the request sending event.&lt;/li>
+&lt;li>The processing logic of response event callbacks in which thread to process is to be selected according to the situation. It is recommended that if the callback logic is relatively simple, it should be directly in the IO thread; if it contains IO type synchronization operations such as remote access or DB access, it is recommended that it be processed in a separate thread pool.&lt;/li>
+&lt;/ul></description></item><item><title>Blog: Implementation background and practice of Dubbo server asynchronous interface</title><link>http://dubbo.apache.org/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/</link><pubDate>Wed, 20 Feb 2019 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/</guid><description>
+&lt;h2 id="preface">Preface&lt;/h2>
+&lt;p>It is suggested to make an understanding of the thread phase involved in the process of Dubbo first, please refer to &lt;a href="http://dubbo.apache.org/en-us/blog/dubboAsync_client.html">Implementation background and practice of Dubbo client asynchronous interface&lt;/a> for details.&lt;/p>
+&lt;h2 id="implementation-background">Implementation background&lt;/h2>
+&lt;p>It is necessary to introduce the server-side thread strategy in more detail to deepen the user&amp;rsquo;s judgment basis for selecting server-side asynchrony. It is also necessary to introduce coroutines, the &amp;ldquo;secret weapon&amp;rdquo; often used in server-side asynchrony.&lt;/p>
+&lt;h3 id="server-side-thread-strategy">Server-side thread strategy&lt;/h3>
+&lt;p>Dubbo supports a variety of NIO frameworks to implement remoting protocols. Whether Netty, Mina or Grizzly, the implementations are much the same. They are all based on event-driven methods to establish network channels and read data streams. Taking introduction to &lt;a href="https://javaee.github.io/grizzly/iostrategies.html">Thread Strategy&lt;/a> of Grizzly as an example, the following four categories are usually supported. Dubbo as an RPC framework, the default choice is the f [...]
+&lt;ol>
+&lt;li>&lt;strong>Worker-thread Strategy&lt;/strong>&lt;/li>
+&lt;/ol>
+&lt;p>The most useful IOStrategy, where Selector thread delegates NIO events processing to a worker threads.&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubboasyn_server/1.png" alt="workerthread-strategy.png">&lt;/p>
+&lt;p>This IOStrategy is very scalable and safe. We can change the size of selector and worker thread pool as required and there is no risk that some problem, which may occur during the specific NIO event processing, will impact other Channels registered on the same Selector.&lt;/p>
+&lt;p>The disadvantage is the cost of thread context switching.&lt;/p>
+&lt;ol start="2">
+&lt;li>&lt;strong>Same-thread Strategy&lt;/strong>&lt;/li>
+&lt;/ol>
+&lt;p>Potentially the most efficient IOStrategy. Unlike the worker-thread IOStrategy, the same-thread IOStrategy processes NIO events in the current thread, avoiding expensive thread context switches.&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubboasyn_server/2.png" alt="samethread-strategy.png">&lt;/p>
+&lt;p>This IOStrategy is still pretty scalable, because we can tune the selector thread pool size, but it does have drawbacks. Care needs to be taken that channel NIO event processing won’t block or execute any long lasting operation, because it may block the processing of other NIO events that occur on the same Selector.&lt;/p>
+&lt;ol start="3">
+&lt;li>&lt;strong>Dynamic Strategy&lt;/strong>&lt;/li>
+&lt;/ol>
+&lt;p>As mentioned previously worker-thread and same-thread strategies have distinct advantages and disadvantages. However, what if a strategy could try to swap them smartly during runtime depending on the current conditions (load, gathered statistics… etc)?&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubboasyn_server/3.png" alt="dynamic-strategy.png">&lt;/p>
+&lt;p>Potentially this IOStrategy could bring a lot of benefit and allow finer control of the resources. However, it’s important to not overload the condition evaluation logic, as its complexity will make this IOStrategy inefficient comparing to previous two strategies.&lt;/p>
+&lt;p>By the way, I want you to pay more attention to this strategy, which is probably the best combination of Dubbo server asynchrony.&lt;/p>
+&lt;ol start="4">
+&lt;li>&lt;strong>Leader-follower Strategy&lt;/strong>&lt;/li>
+&lt;/ol>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubboasyn_server/4.png" alt="leaderfollower-strategy.png">&lt;/p>
+&lt;p>This IOStrategy is similar to worker-thread IOStrategy, but instead of passing NIO event processing to a worker thread, it changes worker thread to a selector thread by passing it the control over Selector and the actual NIO event processing takes place in the current thread. This strategy actually confuses worker and IO thread stages, which is not recommended.&lt;/p>
+&lt;h3 id="coroutine-and-thread">Coroutine and thread&lt;/h3>
+&lt;p>In terms of CPU resource management, the minimum scheduling unit of OS and JVM is thread. The coroutine library implemented by business application through extension can have independent running unit. In fact, it is also done based on thread. The principle should be to save the context and switch to another coroutine when IO blocking or lock waiting is encountered.&lt;/p>
+&lt;p>&lt;strong>In the default Dubbo thread strategy, there are worker thread pools to execute the business logic, but the ThreadPool Full problem often occurs. In order to release worker threads as soon as possible, another thread will be set up in the implementation of the business service. The cost is thread context switching again, and it&amp;rsquo;s necessary to consider link-level data transfer (such as tracing information) and flow-control export controls, etc. Of course, if Dubb [...]
+&lt;h2 id="the-sample">The sample&lt;/h2>
+&lt;p>Use an example to experience the Dubbo server-side asynchronous interface. For Demo code, visit &lt;a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify&lt;/a>。&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> AsyncService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Main sayHello() method start.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#268bd2">final&lt;/span> AsyncContext asyncContext &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>startAsync&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(()&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>signalContextSwitch&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Attachment from consumer: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">().&lt;/span>getAttachment&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;consumer-key1&amp;#3 [...]
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34; -- Async start.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>500&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>InterruptedException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+e&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>write&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34;, response from provider.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34; -- Async end.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}).&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Main sayHello() method end.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;hello, &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="practical-suggestions">Practical suggestions&lt;/h2>
+&lt;ul>
+&lt;li>Don&amp;rsquo;t rely too much on server-side asynchrony.&lt;/li>
+&lt;li>Server-side asynchrony is basically a false proposition in the face of event-driven or Reactive.&lt;span data-type="color" style="color:rgb(36, 41, 46)">&lt;span data-type="background" style="background-color:rgb(255, 255, 255)">Supplement the reason: the server asynchrony is said Dubbo server-side business threads (default is 200) is not enough, but in the Event-Driven mode, 200 threads certainly do not need that much, just as much as the number of CPU cores. As long as the busin [...]
+&lt;li>To use server-side asynchrony, it is recommended that the server-side thread strategy adopt the Same_thread pattern + Coroutine Library.&lt;/li>
+&lt;/ul>
+&lt;h2 id="conclusions">Conclusions&lt;/h2>
+&lt;p>When Dubbo supports business applications, it encounters a variety of requirements scenarios, and server-side asynchrony provides users with a solution to deal with ThreadPool Full. In the case of ThreadPool Full, if the current system bottleneck is CPU, this solution is not recommended. If the system load is not high, increasing the number of worker threads or using server asynchrony can be considered.&lt;/p></description></item><item><title>Blog: How to use Seata to ensure consis [...]
+&lt;h2 id="use-case">Use case&lt;/h2>
+&lt;p>A business logic for user purchasing commodities. The whole business logic is powered by 3 microservices:&lt;/p>
+&lt;ul>
+&lt;li>Storage service: deduct storage count on given commodity.&lt;/li>
+&lt;li>Order service: create order according to purchase request.&lt;/li>
+&lt;li>Account service: debit the balance of user&amp;rsquo;s account.&lt;/li>
+&lt;/ul>
+&lt;h3 id="architecture">Architecture&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/fescar/fescar-1.png" alt="Architecture">&lt;/p>
+&lt;h3 id="storageservice">StorageService&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">StorageService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * deduct storage count
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">deduct&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String commodityCode&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> count&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="orderservice">OrderService&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">OrderService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * create order
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+Order &lt;span style="color:#268bd2">create&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String userId&lt;span style="color:#719e07">,&lt;/span> String commodityCode&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> orderCount&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="accountservice">AccountService&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AccountService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * debit balance of user&amp;#39;s account
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">debit&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String userId&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> money&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="main-business-logic">Main business logic&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">BusinessServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> BusinessService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> StorageService storageService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> OrderService orderService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * purchase
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">purchase&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String userId&lt;span style="color:#719e07">,&lt;/span> String commodityCode&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> orderCount&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+storageService&lt;span style="color:#719e07">.&lt;/span>deduct&lt;span style="color:#719e07">(&lt;/span>commodityCode&lt;span style="color:#719e07">,&lt;/span> orderCount&lt;span style="color:#719e07">);&lt;/span>
+orderService&lt;span style="color:#719e07">.&lt;/span>create&lt;span style="color:#719e07">(&lt;/span>userId&lt;span style="color:#719e07">,&lt;/span> commodityCode&lt;span style="color:#719e07">,&lt;/span> orderCount&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">StorageServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> StorageService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> StorageDAO storageDAO&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">deduct&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String commodityCode&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> count&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Storage storage &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Storage&lt;span style="color:#719e07">();&lt;/span>
+storage&lt;span style="color:#719e07">.&lt;/span>setCount&lt;span style="color:#719e07">(&lt;/span>count&lt;span style="color:#719e07">);&lt;/span>
+storage&lt;span style="color:#719e07">.&lt;/span>setCommodityCode&lt;span style="color:#719e07">(&lt;/span>commodityCode&lt;span style="color:#719e07">);&lt;/span>
+storageDAO&lt;span style="color:#719e07">.&lt;/span>update&lt;span style="color:#719e07">(&lt;/span>storage&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">OrderServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> OrderService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> OrderDAO orderDAO&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> AccountService accountService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> Order &lt;span style="color:#268bd2">create&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String userId&lt;span style="color:#719e07">,&lt;/span> String commodityCode&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> orderCount&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#dc322f">int&lt;/span> orderMoney &lt;span style="color:#719e07">=&lt;/span> calculate&lt;span style="color:#719e07">(&lt;/span>commodityCode&lt;span style="color:#719e07">,&lt;/span> orderCount&lt;span style="color:#719e07">);&lt;/span>
+accountService&lt;span style="color:#719e07">.&lt;/span>debit&lt;span style="color:#719e07">(&lt;/span>userId&lt;span style="color:#719e07">,&lt;/span> orderMoney&lt;span style="color:#719e07">);&lt;/span>
+Order order &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Order&lt;span style="color:#719e07">();&lt;/span>
+order&lt;span style="color:#719e07">.&lt;/span>userId &lt;span style="color:#719e07">=&lt;/span> userId&lt;span style="color:#719e07">;&lt;/span>
+order&lt;span style="color:#719e07">.&lt;/span>commodityCode &lt;span style="color:#719e07">=&lt;/span> commodityCode&lt;span style="color:#719e07">;&lt;/span>
+order&lt;span style="color:#719e07">.&lt;/span>count &lt;span style="color:#719e07">=&lt;/span> orderCount&lt;span style="color:#719e07">;&lt;/span>
+order&lt;span style="color:#719e07">.&lt;/span>money &lt;span style="color:#719e07">=&lt;/span> orderMoney&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> orderDAO&lt;span style="color:#719e07">.&lt;/span>insert&lt;span style="color:#719e07">(&lt;/span>order&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="distributed-transaction-solution-with-seata">Distributed Transaction Solution with Seata&lt;/h2>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/fescar/fescar-2.png" alt="undefined">&lt;/p>
+&lt;p>We just need an annotation &lt;code>@GlobalTransactional&lt;/code> on business method:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java"> &lt;span style="color:#268bd2">@GlobalTransactional&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">purchase&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String userId&lt;span style="color:#719e07">,&lt;/span> String commodityCode&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> orderCount&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">......&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="example-powered-by-dubbo--seata">Example powered by Dubbo + Seata&lt;/h2>
+&lt;h3 id="step-1-setup-database">Step 1: Setup database&lt;/h3>
+&lt;ul>
+&lt;li>Requirement: MySQL with InnoDB engine.&lt;/li>
+&lt;/ul>
+&lt;p>&lt;strong>Note:&lt;/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.&lt;/p>
+&lt;p>Modify Spring XML with the database URL/username/password you just created.&lt;/p>
+&lt;p>dubbo-account-service.xml
+dubbo-order-service.xml
+dubbo-storage-service.xml&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml"> &lt;span style="color:#268bd2">&amp;lt;property&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;url&amp;#34;&lt;/span> value=&lt;span style="color:#2aa198">&amp;#34;jdbc:mysql://x.x.x.x:3306/xxx&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;property&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;username&amp;#34;&lt;/span> value=&lt;span style="color:#2aa198">&amp;#34;xxx&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;property&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;password&amp;#34;&lt;/span> value=&lt;span style="color:#2aa198">&amp;#34;xxx&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-2-create-undo_log-table-for-seata">Step 2: Create undo_log table for Seata&lt;/h3>
+&lt;p>&lt;code>UNDO_LOG&lt;/code> table is required by Seata AT mode.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sql" data-lang="sql">&lt;span style="color:#586e75">-- Note that when Seata version is upgraded to 0.3.0+, it is changed from the previous normal index to the unique index.
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>&lt;span style="color:#719e07">CREATE&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">`&lt;/span>undo_log&lt;span style="color:#719e07">`&lt;/span> (
+&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">bigint&lt;/span>(&lt;span style="color:#2aa198">20&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span> AUTO_INCREMENT,
+&lt;span style="color:#719e07">`&lt;/span>branch_id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">bigint&lt;/span>(&lt;span style="color:#2aa198">20&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>xid&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">100&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>context&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">128&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>rollback_info&lt;span style="color:#719e07">`&lt;/span> longblob &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>log_status&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>log_created&lt;span style="color:#719e07">`&lt;/span> datetime &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>log_modified&lt;span style="color:#719e07">`&lt;/span> datetime &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>ext&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">100&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">PRIMARY&lt;/span> &lt;span style="color:#719e07">KEY&lt;/span> (&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span>),
+&lt;span style="color:#719e07">UNIQUE&lt;/span> &lt;span style="color:#719e07">KEY&lt;/span> &lt;span style="color:#719e07">`&lt;/span>ux_undo_log&lt;span style="color:#719e07">`&lt;/span> (&lt;span style="color:#719e07">`&lt;/span>xid&lt;span style="color:#719e07">`&lt;/span>,&lt;span style="color:#719e07">`&lt;/span>branch_id&lt;span style="color:#719e07">`&lt;/span>)
+) ENGINE&lt;span style="color:#719e07">=&lt;/span>InnoDB AUTO_INCREMENT&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">1&lt;/span> &lt;span style="color:#719e07">DEFAULT&lt;/span> CHARSET&lt;span style="color:#719e07">=&lt;/span>utf8;
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-3-create-tables-for-example-business">Step 3: Create tables for example business&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sql" data-lang="sql">
+&lt;span style="color:#719e07">DROP&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">IF&lt;/span> &lt;span style="color:#719e07">EXISTS&lt;/span> &lt;span style="color:#719e07">`&lt;/span>storage_tbl&lt;span style="color:#719e07">`&lt;/span>;
+&lt;span style="color:#719e07">CREATE&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">`&lt;/span>storage_tbl&lt;span style="color:#719e07">`&lt;/span> (
+&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span> AUTO_INCREMENT,
+&lt;span style="color:#719e07">`&lt;/span>commodity_code&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">255&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>&lt;span style="color:#719e07">count&lt;/span>&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#2aa198">0&lt;/span>,
+&lt;span style="color:#719e07">PRIMARY&lt;/span> &lt;span style="color:#719e07">KEY&lt;/span> (&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span>),
+&lt;span style="color:#719e07">UNIQUE&lt;/span> &lt;span style="color:#719e07">KEY&lt;/span> (&lt;span style="color:#719e07">`&lt;/span>commodity_code&lt;span style="color:#719e07">`&lt;/span>)
+) ENGINE&lt;span style="color:#719e07">=&lt;/span>InnoDB &lt;span style="color:#719e07">DEFAULT&lt;/span> CHARSET&lt;span style="color:#719e07">=&lt;/span>utf8;
+&lt;span style="color:#719e07">DROP&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">IF&lt;/span> &lt;span style="color:#719e07">EXISTS&lt;/span> &lt;span style="color:#719e07">`&lt;/span>order_tbl&lt;span style="color:#719e07">`&lt;/span>;
+&lt;span style="color:#719e07">CREATE&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">`&lt;/span>order_tbl&lt;span style="color:#719e07">`&lt;/span> (
+&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span> AUTO_INCREMENT,
+&lt;span style="color:#719e07">`&lt;/span>user_id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">255&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>commodity_code&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">255&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>&lt;span style="color:#719e07">count&lt;/span>&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#2aa198">0&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>money&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#2aa198">0&lt;/span>,
+&lt;span style="color:#719e07">PRIMARY&lt;/span> &lt;span style="color:#719e07">KEY&lt;/span> (&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span>)
+) ENGINE&lt;span style="color:#719e07">=&lt;/span>InnoDB &lt;span style="color:#719e07">DEFAULT&lt;/span> CHARSET&lt;span style="color:#719e07">=&lt;/span>utf8;
+&lt;span style="color:#719e07">DROP&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">IF&lt;/span> &lt;span style="color:#719e07">EXISTS&lt;/span> &lt;span style="color:#719e07">`&lt;/span>account_tbl&lt;span style="color:#719e07">`&lt;/span>;
+&lt;span style="color:#719e07">CREATE&lt;/span> &lt;span style="color:#719e07">TABLE&lt;/span> &lt;span style="color:#719e07">`&lt;/span>account_tbl&lt;span style="color:#719e07">`&lt;/span> (
+&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">NOT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span> AUTO_INCREMENT,
+&lt;span style="color:#719e07">`&lt;/span>user_id&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">varchar&lt;/span>(&lt;span style="color:#2aa198">255&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#719e07">NULL&lt;/span>,
+&lt;span style="color:#719e07">`&lt;/span>money&lt;span style="color:#719e07">`&lt;/span> &lt;span style="color:#b58900">int&lt;/span>(&lt;span style="color:#2aa198">11&lt;/span>) &lt;span style="color:#719e07">DEFAULT&lt;/span> &lt;span style="color:#2aa198">0&lt;/span>,
+&lt;span style="color:#719e07">PRIMARY&lt;/span> &lt;span style="color:#719e07">KEY&lt;/span> (&lt;span style="color:#719e07">`&lt;/span>id&lt;span style="color:#719e07">`&lt;/span>)
+) ENGINE&lt;span style="color:#719e07">=&lt;/span>InnoDB &lt;span style="color:#719e07">DEFAULT&lt;/span> CHARSET&lt;span style="color:#719e07">=&lt;/span>utf8;
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-4-start-seata-server">Step 4: Start Seata-Server&lt;/h3>
+&lt;ul>
+&lt;li>Download server &lt;a href="https://github.com/seata/seata/releases">package&lt;/a>, unzip it.&lt;/li>
+&lt;li>Start Seata-Server&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">Usage: sh seata-server.sh&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">for&lt;/span> linux and mac&lt;span style="color:#719e07">)&lt;/span> or cmd seata-server.bat&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">for&lt;/span> windows&lt;span style="color:#719e07">)&lt [...]
+Options:
+--host, -h
+The host to bind.
+Default: 0.0.0.0
+--port, -p
+The port to listen.
+Default: &lt;span style="color:#2aa198">8091&lt;/span>
+--storeMode, -m
+log store mode : file、db
+Default: file
+--help
+e.g.
+sh seata-server.sh -p &lt;span style="color:#2aa198">8091&lt;/span> -h 127.0.0.1 -m file
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="step-5-run-example">Step 5: Run example&lt;/h3>
+&lt;ul>
+&lt;li>Start AccountService (&lt;a href="https://github.com/seata/seata-samples/blob/master/dubbo/src/main/java/io/seata/samples/dubbo/starter/DubboAccountServiceStarter.java">DubboAccountServiceStarter&lt;/a>).&lt;/li>
+&lt;li>Start StorageService (&lt;a href="https://github.com/seata/seata-samples/blob/master/dubbo/src/main/java/io/seata/samples/dubbo/starter/DubboStorageServiceStarter.java">DubboStorageServiceStarter&lt;/a>).&lt;/li>
+&lt;li>Start OrderService (&lt;a href="https://github.com/seata/seata-samples/blob/master/dubbo/src/main/java/io/seata/samples/dubbo/starter/DubboOrderServiceStarter.java">DubboOrderServiceStarter&lt;/a>).&lt;/li>
+&lt;li>Run BusinessService for test (&lt;a href="https://github.com/seata/seata-samples/blob/master/dubbo/src/main/java/io/seata/samples/dubbo/starter/DubboBusinessTester.java">DubboBusinessTester&lt;/a>).&lt;/li>
+&lt;/ul>
+&lt;h3 id="related-projects">Related projects&lt;/h3>
+&lt;ul>
+&lt;li>Seata: &lt;a href="https://github.com/seata/seata">https://github.com/seata/seata&lt;/a>&lt;/li>
+&lt;li>Seata Samples : &lt;a href="https://github.com/seata/seata-samples">https://github.com/seata/seata-samples&lt;/a>&lt;/li>
+&lt;/ul></description></item><item><title>Blog: The fifth Dubbo meetup has been held in Hangzhou</title><link>http://dubbo.apache.org/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/</link><pubDate>Mon, 10 Dec 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/</guid><description>
+&lt;p>The fifth Dubbo meetup has been held in Hangzhou,&lt;/p>
+&lt;p>Please enjoy the slides of the topics:&lt;/p>
+&lt;ul>
+&lt;li>Ding Li: How to involve in dubbo community &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/how-to-involve-in-dubbo-community.pdf">slides&lt;/a>&lt;/li>
+&lt;li>Shenli Cao: Dubbo 2.7 introduction &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-2.7-introduction.pdf">slides&lt;/a>&lt;/li>
+&lt;li>Tao Yang: Dubbo practice in netease koala &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-practice-in-netease-koala.pdf">slides&lt;/a>&lt;/li>
+&lt;li>Mercy Ma: Nacos support in Dubbo &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/nacos-support-in-dubbo.pdf">slides&lt;/a>&lt;/li>
+&lt;li>Yihao Zhao: Sentinel: Sentinel support for Dubbo &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/sentinel-support-for-dubbo.pdf">slides&lt;/a>&lt;/li>
+&lt;li>Zhixuan Chen: Troubleshooting Dubbo with Arthas &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/troubleshooting-dubbo-with-arthas.pdf">slides&lt;/a>&lt;/li>
+&lt;/ul></description></item><item><title>Blog: Dubbo Integrates with Nacos to Become a Registry</title><link>http://dubbo.apache.org/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/</link><pubDate>Wed, 07 Nov 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/</guid><description>
+&lt;p>Nacos is an important registry in Dubbo ecosystem, and dubbo-registry-nacos is the implementation of Dubbo-integrated Nacos registry.&lt;/p>
+&lt;h2 id="preparation-works">Preparation Works&lt;/h2>
+&lt;p>Before you integrate dubbo-registry-nacos into your Dubbo project, 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 the Quick Start for Nacos: &lt;a href="https://nacos.io/en-us/docs/quick-start.html">https://nacos.io/en-us/docs/quick-start.html&lt;/a>. Nacos versions above 0.6.1 are recommended.&lt;/p>
+&lt;h2 id="get-started-quickly">Get Started Quickly&lt;/h2>
+&lt;p>The operation steps for Dubbo to integrate Nacos into a registry are simple, the general steps can be divided into &amp;ldquo;add Maven dependency&amp;rdquo; and &amp;ldquo;configure the registry.&amp;rdquo;&lt;/p>
+&lt;h2 id="increase-maven-dependency">Increase Maven Dependency&lt;/h2>
+&lt;p>First, you need to add the Maven dependency of dubbo-registry-nacos to your project&amp;rsquo;s pom.xml file, and it is strongly recommended that you use Dubbo 2.6.5:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dependencies&amp;gt;&lt;/span>
+...
+&lt;span style="color:#586e75">&amp;lt;!-- Dubbo Nacos registry dependency --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dependency&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>dubbo-registry-nacos&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>0.0.2&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dependency&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Keep latest Nacos client version --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dependency&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache.nacos&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>nacos-client&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>[0.6.1,)&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dependency&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Dubbo dependency --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dependency&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>dubbo&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>2.6.5&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dependency&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Alibaba Spring Context extension --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dependency&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache.spring&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>spring-context-support&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>1.0.2&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dependency&amp;gt;&lt;/span>
+...
+&lt;span style="color:#268bd2">&amp;lt;/dependencies&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>When you add dubbo-registry-nacos to your project, you don&amp;rsquo;t need to programmatically implement the service discovery and registration logic, the actual implementation is provided by the third-party package, and then to configure the Naocs registry.&lt;/p>
+&lt;h2 id="configure-the-registry">Configure the Registry&lt;/h2>
+&lt;p>Assuming your Dubbo application is assembled by the Spring Framework, there are two configuration options: Dubbo Spring externalization configuration and Spring XML configuration files, I strongly recommend the former.&lt;/p>
+&lt;h2 id="dubbo-spring-externalization-configuration">Dubbo Spring Externalization Configuration&lt;/h2>
+&lt;p>Dubbo Spring externalization configuration is a new feature introduced by Dubbo 2.5.8, which automatically generates and binds Dubbo configuration Bean through the Spring Environment property, simplifying configuration and lowering the threshold for microservice development.&lt;/p>
+&lt;p>Assume your Dubbo application uses Zookeeper as the registry and its server IP address is 10.20.153.10, the registered address is also stored in the dubbo-config.properties file as a Dubbo externalization configuration attribute, as shown below:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">## application
+dubbo.application.name = your-dubbo-application
+## Zookeeper registry address
+dubbo.registry.address = zookeeper://10.20.153.10:2181
+...
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Assuming your Nacos Server is also running on server 10.20.153.10 and using the default Nacos service port 8848, you can simply adjust the dubbo.registry.address property as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">## 其他属性保持不变
+## Nacos registry address
+dubbo.registry.address = nacos://10.20.153.10:8848
+...
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Subsequently, restart your Dubbo application, and Dubbo&amp;rsquo;s service delivery and consumption information can be displayed in the Nacos console:&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-registry-nacos-1.png" alt="image-20181213103845976">&lt;/p>
+&lt;p>As shown in the figure, the service name prefixed with providers: is the meta-information for the service provider, and consumers: represents the meta-information of the service consumer. Click &amp;ldquo;Details&amp;rdquo; to view service status details:&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-registry-nacos-2.png" alt="image-20181213104145998">&lt;/p>
+&lt;p>If you are using the Spring XML configuration file to assemble the Dubbo registry, refer to the next section.&lt;/p>
+&lt;h2 id="spring-xml-configuration-file">Spring XML Configuration File&lt;/h2>
+&lt;p>Also, assume your Dubbo application uses Zookeeper as the registry and its server IP address is 10.20.153.10 and assemble the Spring Bean in an XML file, as shown below:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#719e07">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;beans&lt;/span> xmlns=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans&amp;#34;&lt;/span>
+xmlns:xsi=&lt;span style="color:#2aa198">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
+xmlns:dubbo=&lt;span style="color:#2aa198">&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;&lt;/span>
+xsi:schemaLocation=&lt;span style="color:#2aa198">&amp;#34;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&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Provider application information for dependency calculation --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:application&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo-provider-xml-demo&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Using the Zookeeper registry Zookeeper --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:registry&lt;/span> address=&lt;span style="color:#2aa198">&amp;#34;zookeeper://10.20.153.10:2181&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+...
+&lt;span style="color:#268bd2">&amp;lt;/beans&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Similar to the Dubbo Spring externalization configuration, simply adjust the address property configuration:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#719e07">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;beans&lt;/span> xmlns=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans&amp;#34;&lt;/span>
+xmlns:xsi=&lt;span style="color:#2aa198">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
+xmlns:dubbo=&lt;span style="color:#2aa198">&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;&lt;/span>
+xsi:schemaLocation=&lt;span style="color:#2aa198">&amp;#34;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&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Provider application information for dependency calculation--&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:application&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo-provider-xml-demo&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Using the Nacos registry --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:registry&lt;/span> address=&lt;span style="color:#2aa198">&amp;#34;nacos://10.20.153.10:8848&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+...
+&lt;span style="color:#268bd2">&amp;lt;/beans&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once you restart the Dubbo application, you can also see that the registration meta-information for both service providers and consumers is presented in the Nacos console:&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-registry-nacos-3.png" alt="image-20181213113049185">&lt;/p>
+&lt;p>Do you absolutely configure or switch Nacos registry super Easy? If you want to get more or unclear, refer to the complete example below.&lt;/p>
+&lt;h2 id="complete-example">Complete Example&lt;/h2>
+&lt;p>The metadata in the above image is derived from the Dubbo Spring annotation-driven example and the Dubbo Spring XML configuration-driven example, both of which will be described below, you can choose your preferred programming model. Before we get into the formal discussion, let&amp;rsquo;s look at the preparations for both, as they both rely on Java service interfaces and implementations. Also, ensure that the Nacos service is started in the local (127.0.0.1) environment.&lt;/p>
+&lt;h3 id="example-interfaces-and-implementations">Example Interfaces and Implementations&lt;/h3>
+&lt;p>First, define the sample interface, as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.demo.service&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * DemoService
+&lt;/span>&lt;span style="color:#586e75"> *
+&lt;/span>&lt;span style="color:#586e75"> * @since 2.7.4
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">DemoService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">sayName&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Provide implementation classes for the above interfaces:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.demo.service&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.config.annotation.Service&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.rpc.RpcContext&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.beans.factory.annotation.Value&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * Default {@link DemoService}
+&lt;/span>&lt;span style="color:#586e75"> *
+&lt;/span>&lt;span style="color:#586e75"> * @since 2.7.4
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">@Service&lt;/span>&lt;span style="color:#719e07">(&lt;/span>version &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;${demo.service.version}&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DefaultService&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> DemoService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Value&lt;/span>&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;${demo.service.name}&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> String serviceName&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayName&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+RpcContext rpcContext &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> String&lt;span style="color:#719e07">.&lt;/span>format&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Service [name :%s , port : %d] %s(\&amp;#34;%s\&amp;#34;) : Hello,%s&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span>
+serviceName&lt;span style="color:#719e07">,&lt;/span>
+rpcContext&lt;span style="color:#719e07">.&lt;/span>getLocalPort&lt;span style="color:#719e07">(),&lt;/span>
+rpcContext&lt;span style="color:#719e07">.&lt;/span>getMethodName&lt;span style="color:#719e07">(),&lt;/span>
+name&lt;span style="color:#719e07">,&lt;/span>
+name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once the interface and implementation are ready, the annotation-driven and XML configuration-driven implementations will be used below.&lt;/p>
+&lt;h2 id="spring-annotation-driven-example">Spring Annotation-driven Example&lt;/h2>
+&lt;p>Dubbo 2.7.4 reconstructs the Spring annotation-driven programming model.&lt;/p>
+&lt;h3 id="service-provider-annotation-driven-implementation">Service Provider Annotation-driven Implementation&lt;/h3>
+&lt;ul>
+&lt;li>Define property source of Dubbo provider externalization configuration - provider-config.properties&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">## application
+dubbo.application.name = dubbo-provider-demo
+## Nacos registry address
+dubbo.registry.address = nacos://127.0.0.1:8848
+## Dubbo Protocol
+dubbo.protocol.name = dubbo
+dubbo.protocol.port = -1
+# Provider @Service version
+demo.service.version=1.0.0
+demo.service.name = demoService
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>Implement service provider bootstrap - DemoServiceProviderBootstrap&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.demo.provider&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.config.spring.context.annotation.EnableDubbo&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.demo.service.DemoService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.context.annotation.AnnotationConfigApplicationContext&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.context.annotation.PropertySource&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> java.io.IOException&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * {@link DemoService} provider demo
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">@EnableDubbo&lt;/span>&lt;span style="color:#719e07">(&lt;/span>scanBasePackages &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.service&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">@PropertySource&lt;/span>&lt;span style="color:#719e07">(&lt;/span>value &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;classpath:/provider-config.properties&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DemoServiceProviderBootstrap&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> IOException &lt;span style="color:#719e07">{&lt;/span>
+AnnotationConfigApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> AnnotationConfigApplicationContext&lt;span style="color:#719e07">();&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>register&lt;span style="color:#719e07">(&lt;/span>DemoServiceProviderBootstrap&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>refresh&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;DemoService provider is starting...&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Wherein, the annotation @EnableDubbo activates the Dubbo annotation-driven and externalization configuration, its scanBasePackages property scans the specified Java package, exposes all service interface implementation classes labeled @Service as Spring Bean, and then exports the Dubbo service.&lt;/p>
+&lt;p>@PropertySource is the standard import property configuration resource annotation introduced by Spring Framework 3.1, which provides externalization configuration for Dubbo.&lt;/p>
+&lt;h2 id="service-consumer-annotation-driven-implementation">Service consumer annotation-driven implementation&lt;/h2>
+&lt;ul>
+&lt;li>Define property source of Dubbo consumer externalization configuration - consumer-config.properties&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">## Dubbo Application info
+dubbo.application.name = dubbo-consumer-demo
+## Nacos registry address
+dubbo.registry.address = nacos://127.0.0.1:8848
+# @Reference version
+demo.service.version= 1.0.0
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Similarly, the dubbo.registry.address property points to the Nacos registry, through which metadata about other Dubbo services is obtained.&lt;/p>
+&lt;ul>
+&lt;li>Implement service consumer bootstrap class - DemoServiceConsumerBootstrap&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.demo.consumer&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.config.annotation.Reference&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.config.spring.context.annotation.EnableDubbo&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.demo.service.DemoService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.context.annotation.AnnotationConfigApplicationContext&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.context.annotation.PropertySource&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> javax.annotation.PostConstruct&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> java.io.IOException&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * {@link DemoService} consumer demo
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">@EnableDubbo&lt;/span>
+&lt;span style="color:#268bd2">@PropertySource&lt;/span>&lt;span style="color:#719e07">(&lt;/span>value &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;classpath:/consumer-config.properties&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DemoServiceConsumerBootstrap&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Reference&lt;/span>&lt;span style="color:#719e07">(&lt;/span>version &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;${demo.service.version}&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> DemoService demoService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@PostConstruct&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">init&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#dc322f">int&lt;/span> i &lt;span style="color:#719e07">=&lt;/span> 0&lt;span style="color:#719e07">;&lt;/span> i &lt;span style="color:#719e07">&amp;lt;&lt;/span> 10&lt;span style="color:#719e07">;&lt;/span> i&lt;span style="color:#719e07">++)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>demoService&lt;span style="color:#719e07">.&lt;/span>sayName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;小马哥(mercyblitz)&amp;#34;&lt;/span>&lt;span style="color:#719e07">));&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> IOException &lt;span style="color:#719e07">{&lt;/span>
+AnnotationConfigApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> AnnotationConfigApplicationContext&lt;span style="color:#719e07">();&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>register&lt;span style="color:#719e07">(&lt;/span>DemoServiceConsumerBootstrap&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>refresh&lt;span style="color:#719e07">();&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>close&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Similarly, the @EnableDubbo annotation activates the Dubbo annotation-driven and externalization configuration, although it currently belongs to the service consumer and does not require the Java package name to scan the service implementation labeled @Service.&lt;/p>
+&lt;p>@Reference is a dependency injection annotation for Dubbo remote services that requires service provider and consumer contract interface, version, and group information. In the current service consumption example, the service version of DemoService is derived from the property configuration file consumer-config.properties.&lt;/p>
+&lt;p>The @PostConstruct code shows that when the DemoServiceConsumerBootstrap Bean is initialized, it executes ten Dubbo remote method invocation.&lt;/p>
+&lt;h3 id="run-the-annotation-driven-example">Run the Annotation-driven Example&lt;/h3>
+&lt;p>Start DemoServiceProviderBootstrap twice locally and the registry will have two health services:&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-registry-nacos-4.png" alt="image-20181213123909636">&lt;/p>
+&lt;p>Run DemoServiceConsumerBootstrap again and the results are as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">Service [name :demoService , port : 20880] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20880] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :demoService , port : 20881] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Run correctly and the service consumer uses a load balancing strategy to allocate ten RPC calls equally to two Dubbo service provider instances.&lt;/p>
+&lt;h3 id="spring-xml-configuration-driven-example">Spring XML Configuration-driven Example&lt;/h3>
+&lt;p>Spring XML configuration-driven is the programming model of traditional Spring assembly components.&lt;/p>
+&lt;h4 id="service-provider-xml-configuration-driven">Service Provider XML Configuration-driven&lt;/h4>
+&lt;p>Define the service provider XML context configuration file - /META-INF/spring/dubbo-provider-context.xml&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#719e07">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;beans&lt;/span> xmlns=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans&amp;#34;&lt;/span>
+xmlns:xsi=&lt;span style="color:#2aa198">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
+xmlns:dubbo=&lt;span style="color:#2aa198">&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;&lt;/span>
+xsi:schemaLocation=&lt;span style="color:#2aa198">&amp;#34;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&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!--
+&lt;/span>&lt;span style="color:#586e75">
+&lt;/span>&lt;span style="color:#586e75">Provider application information for dependency calculation
+&lt;/span>&lt;span style="color:#586e75"> --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:application&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo-provider-xml-demo&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Using the Nacos registry --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:registry&lt;/span> address=&lt;span style="color:#2aa198">&amp;#34;nacos://127.0.0.1:8848&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Using Dubbo protocol to expose services on random ports --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;-1&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Declare the service interface to be exposed --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.service.DemoService&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span> version=&lt;span style="color:#2aa198">&amp;#34;2.0.0&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Implement services like local beans --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.service.DefaultService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/beans&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>Implement service provider bootstrap class - DemoServiceProviderBootstrap&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.demo.provider&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.demo.service.DemoService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.context.support.ClassPathXmlApplicationContext&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> java.io.IOException&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * {@link DemoService} provider demo XML bootstrap
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DemoServiceProviderXmlBootstrap&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> IOException &lt;span style="color:#719e07">{&lt;/span>
+ClassPathXmlApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ClassPathXmlApplicationContext&lt;span style="color:#719e07">();&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>setConfigLocation&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;/META-INF/spring/dubbo-provider-context.xml&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>refresh&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;DemoService provider (XML) is starting...&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="service-consumer-xml-configuration-driven">Service Consumer XML Configuration-driven&lt;/h4>
+&lt;p>Define the consumer provider XML context configuration file - /META-INF/spring/dubbo- consumer-context.xml&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#719e07">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;beans&lt;/span> xmlns=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans&amp;#34;&lt;/span>
+xmlns:xsi=&lt;span style="color:#2aa198">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
+xmlns:dubbo=&lt;span style="color:#2aa198">&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;&lt;/span>
+xsi:schemaLocation=&lt;span style="color:#2aa198">&amp;#34;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&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!--
+&lt;/span>&lt;span style="color:#586e75">
+&lt;/span>&lt;span style="color:#586e75">Provider application information for dependency calculation
+&lt;/span>&lt;span style="color:#586e75"> --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:application&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo-consumer-xml-demo&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Using the Nacos registry--&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:registry&lt;/span> address=&lt;span style="color:#2aa198">&amp;#34;nacos://127.0.0.1:8848&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- Reference service interface --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.service.DemoService&amp;#34;&lt;/span> version=&lt;span style="color:#2aa198">&amp;#34;2.0.0&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/beans&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>Implement service consumer bootstrap class - DemoServiceConsumerBootstrap&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.demo.consumer&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.apache.dubbo.demo.service.DemoService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> org.springframework.context.support.ClassPathXmlApplicationContext&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> java.io.IOException&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * {@link DemoService} consumer demo XML bootstrap
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DemoServiceConsumerXmlBootstrap&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> IOException &lt;span style="color:#719e07">{&lt;/span>
+ClassPathXmlApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ClassPathXmlApplicationContext&lt;span style="color:#719e07">();&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>setConfigLocation&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;/META-INF/spring/dubbo-consumer-context.xml&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>refresh&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;DemoService consumer (XML) is starting...&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+DemoService demoService &lt;span style="color:#719e07">=&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>getBean&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> DemoService&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#dc322f">int&lt;/span> i &lt;span style="color:#719e07">=&lt;/span> 0&lt;span style="color:#719e07">;&lt;/span> i &lt;span style="color:#719e07">&amp;lt;&lt;/span> 10&lt;span style="color:#719e07">;&lt;/span> i&lt;span style="color:#719e07">++)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>demoService&lt;span style="color:#719e07">.&lt;/span>sayName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;小马哥(mercyblitz)&amp;#34;&lt;/span>&lt;span style="color:#719e07">));&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>close&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="run-xml-configuration-driven-example">Run XML Configuration-driven Example&lt;/h4>
+&lt;p>As such, start two DemoServiceProviderXmlBootstrap bootstraps and observe the changes in the Nacos registry service provider:&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-registry-nacos-5.png" alt="image-20181213125527201">&lt;/p>
+&lt;p>The service version driven by the XML configuration is 2.0.0, so the registration service is correct.&lt;/p>
+&lt;p>Run the service consumer bootstrap DemoServiceConsumerXmlBootstrap again and observe the console output:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">Service [name :null , port : 20882] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20882] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+Service [name :null , port : 20883] sayName(&amp;#34;小马哥(mercyblitz)&amp;#34;) : Hello,小马哥(mercyblitz)
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>As a result, both operation and load balancing are normal due to the property demo.service.name has not been added to the current example, the &amp;ldquo;name&amp;rdquo; information is output as null. For more information, please refer to: &lt;a href="https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos">https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos&lt;/a>.&lt;/p>
+&lt;p>If you&amp;rsquo;re interested in or fond of open source projects like Dubbo and Nacos, try clicking &amp;ldquo;star&amp;rdquo; to support them. The links are as follows:&lt;/p>
+&lt;ul>
+&lt;li>Apache Dubbo: &lt;a href="https://github.com/apache/dubbo">https://github.com/apache/dubbo&lt;/a>&lt;/li>
+&lt;li>Dubbo Nacos Registry: &lt;a href="https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos">https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos&lt;/a>&lt;/li>
+&lt;li>Alibaba Nacos: &lt;a href="https://github.com/alibaba/nacos">https://github.com/alibaba/nacos&lt;/a>&lt;/li>
+&lt;/ul></description></item><item><title>Blog: Introduction to the Dubbo protocol</title><link>http://dubbo.apache.org/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/</link><pubDate>Fri, 05 Oct 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/</guid><description>
+&lt;h2 id="the-concept-of-the-protocol">The concept of the protocol&lt;/h2>
+&lt;p>The protocol is the foundation of communication between two network entities, and data is transmitted from one entity to another in the form of a byte stream over the network. In the world of byte streams, this one-dimensional byte stream cannot be reshaped into two-dimensional or multi-dimensional data structures and domain objects without a protocol.&lt;/p>
+&lt;h3 id="what-is-the-protocol">What is the protocol&lt;/h3>
+&lt;p>The protocol is the semantics determined by both parties for the communication. For example, we design a protocol for string transmission, which allows the client to send a string and the server receives the corresponding string.&lt;/p>
+&lt;p>This protocol is quite simple, first 4-byte represent the total length of the message, followed by 1-byte represents the length of the charset, and then followed by the message payload, charset name and string body.&lt;/p>
+&lt;p>For example, Send a string &lt;code>abc&lt;/code> encoded by &lt;code>iso-8859-1&lt;/code> to the server end. After protocol trans-coding, the content is: &lt;code>18 = 4 + 1 + 10 + 3|10|iso-8859-1|abc&lt;/code>, when the server receives these byte streams, it first reads 4-byte and converts it to int, in this case is 18, which is the length of message. Then continue to read the remaining 14 bytes, the remaining first byte read will be the length of the charset name, which is 10, t [...]
+&lt;p>In the previous example of a custom string transfer protocol, we have already seen the role of protocols in data transmission. Without a protocol, the data exchange cannot be completed. The following is Wikipedia&amp;rsquo;s definition of the communication protocol.&lt;/p>
+&lt;blockquote>
+&lt;p>In telecommunication, a communication protocol is a system of rules that allow two or more entities of a communications system to transmit information via any kind of variation of a physical quantity. The protocol defines the rules syntax, semantics and synchronization of communication and possible error recovery methods. Protocols may be implemented by hardware, software, or a combination of both.&lt;/p>
+&lt;/blockquote>
+&lt;p>Communication protocols need to define syntax, semantics, and communication synchronization operations. The content described here is actually a formal description of the previous custom string transfer protocol.&lt;/p>
+&lt;h3 id="the-definition-of-codec">The definition of &lt;code>Codec&lt;/code>&lt;/h3>
+&lt;p>&lt;code>org.apache.dubbo.remoting.Codec2&lt;/code> define the &lt;strong>Codec&lt;/strong>&amp;rsquo;s I/O processing, so the main methods are &lt;code>encode&lt;/code> and &lt;code>decode&lt;/code>, as defined below:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@SPI&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">Codec2&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Adaptive&lt;/span>&lt;span style="color:#719e07">({&lt;/span>Constants&lt;span style="color:#719e07">.&lt;/span>CODEC_KEY&lt;span style="color:#719e07">})&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">encode&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Channel channel&lt;span style="color:#719e07">,&lt;/span> ChannelBuffer buffer&lt;span style="color:#719e07">,&lt;/span> Object message&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> IOException&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Adaptive&lt;/span>&lt;span style="color:#719e07">({&lt;/span>Constants&lt;span style="color:#719e07">.&lt;/span>CODEC_KEY&lt;span style="color:#719e07">})&lt;/span>
+Object &lt;span style="color:#268bd2">decode&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Channel channel&lt;span style="color:#719e07">,&lt;/span> ChannelBuffer buffer&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> IOException&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">enum&lt;/span> DecodeResult &lt;span style="color:#719e07">{&lt;/span>
+NEED_MORE_INPUT&lt;span style="color:#719e07">,&lt;/span> SKIP_SOME_INPUT
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>Codec&lt;/code> works on a protocol, &lt;code>encode&lt;/code> method means to encode the communication object to the &lt;code>ByteBufferWrapper&lt;/code>, and &lt;code>decode&lt;/code> method decodes the &lt;code>ChannelBuffer&lt;/code> read from the network into &lt;code>Object&lt;/code>, which is the communication object.&lt;/p>
+&lt;h2 id="common-protocol-mode">Common protocol mode&lt;/h2>
+&lt;p>Protocols in application layer have three general forms: fixed-length protocol, special delimiter protocol and protocol header + payload mode. The specific contents of these forms are described below.&lt;/p>
+&lt;p>When reading data from the network in the form of a byte stream, it is necessary to determine when a meaningful transmission content ends. Moreover, the transmission of data on the network, there are sticky packets and fragment packets problem. The solution to this problem is that the protocol can accurately identify, when the sticky packets or fragment packets occurs, it can handle it correctly.&lt;/p>
+&lt;h3 id="fixed-length-protocol">Fixed-length protocol&lt;/h3>
+&lt;p>The fixed-length protocol means that the length of the protocol content is fixed. For example, the protocol byte length is 50. When 50 bytes are read from the network, the decoding operation is performed. The fixed-length protocol is more efficient when reading or writing, because the size of the data cache is basically determined, just like an array. The defect is the lack of adaptability. Taking the RPC scene as an example, it is difficult to estimate the length.&lt;/p>
+&lt;blockquote>
+&lt;p>Refer to Netty&amp;rsquo;s &lt;code>FixedLengthFrameDecoder&lt;/code>&lt;/p>
+&lt;/blockquote>
+&lt;h3 id="special-delimiter-protocol">Special delimiter protocol&lt;/h3>
+&lt;p>Compared to fixed-length protocols, if we can define a special character as the end of each protocol unit, we can communicate in a variable length, so as to balance the data transmission and efficiency, such as the delimiter \n.&lt;/p>
+&lt;p>The problem with the special delimiter method is that it think about the process of protocol transmission in a simple way. For a protocol unit, it must be read all before it can be processed. In addition, it must be prevented that the data transmitted by the user cannot be the same as the delimiter, otherwise it will be disordered.&lt;/p>
+&lt;blockquote>
+&lt;p>Refer to Netty&amp;rsquo;s &lt;code>DelimiterBasedFrameDecoder&lt;/code>&lt;/p>
+&lt;/blockquote>
+&lt;h3 id="variable-length-protocolprotocol-head--payload">Variable length protocol(protocol head + payload)&lt;/h3>
+&lt;p>Generally, it is a custom protocol, which is composed of a fixed length and a variable content. The fixed length part needs to specify the length of the variable content part.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">+————————————————+
+|fixed-length |
++————————————————+
+|variable content|
++————————————————+
+&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
+&lt;p>Refer to Netty&amp;rsquo;s &lt;code>LengthFieldBasedFrameDecoder&lt;/code>&lt;/p>
+&lt;/blockquote>
+&lt;p>The Dubbo protocol is actually a variable length protocol, which is covered in more detail in later chapters.&lt;/p>
+&lt;h2 id="the-dubbo-protocol">The Dubbo protocol&lt;/h2>
+&lt;h3 id="overview-to-the-dubbo-protocol">Overview to the Dubbo protocol&lt;/h3>
+&lt;p>The Dubbo framework defines a proprietary RPC protocol in which the specific content of the request and response protocols is presented using a table.&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/dev/dubbo_protocol_header.png" alt="/dev-guide/images/dubbo_protocol_header.jpg">&lt;/p>
+&lt;h3 id="dubbo-protocol-details">Dubbo protocol details&lt;/h3>
+&lt;ul>
+&lt;li>
+&lt;p>Magic - Magic High &amp;amp; Magic Low (16 bits)&lt;/p>
+&lt;p>Identify protocol version, Dubbo protocol: 0xdabb&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Req/Res (1 bit)&lt;/p>
+&lt;p>Identify a request or response. request: 1; response: 0.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>2 Way (1 bit)&lt;/p>
+&lt;p>Only useful when Req/Res is 1(request), identifying if you expect to return a value from the server. Set to 1 if a return value from the server is required.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Event (1 bit)&lt;/p>
+&lt;p>Identifies whether it is an event message, for example, a heartbeat event. Set to 1 if this is an event.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Serialization ID (5 bit)&lt;/p>
+&lt;p>Identifies the serialization type: for example, the value of fastjson is 6.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Status (8 bits)&lt;/p>
+&lt;p>Only useful when Req/Res is 0 (response), used to identify the status of the response&lt;/p>
+&lt;ul>
+&lt;li>20 - OK&lt;/li>
+&lt;li>30 - CLIENT_TIMEOUT&lt;/li>
+&lt;li>31 - SERVER_TIMEOUT&lt;/li>
+&lt;li>40 - BAD_REQUEST&lt;/li>
+&lt;li>50 - BAD_RESPONSE&lt;/li>
+&lt;li>60 - SERVICE_NOT_FOUND&lt;/li>
+&lt;li>70 - SERVICE_ERROR&lt;/li>
+&lt;li>80 - SERVER_ERROR&lt;/li>
+&lt;li>90 - CLIENT_ERROR&lt;/li>
+&lt;li>100 - SERVER_THREADPOOL_EXHAUSTED_ERROR&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;li>
+&lt;p>Request ID (64 bits)&lt;/p>
+&lt;p>Identifies the only request, the type is long.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Data Length (32 bits)&lt;/p>
+&lt;p>The length of the serialized content (variable part), counted in bytes, the type is int.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Variable Part&lt;/p>
+&lt;p>After being serialized by a specific serialization type (identified by the serialization ID), each part is a byte [] or byte.&lt;/p>
+&lt;ul>
+&lt;li>If it is a request packet (Req/Res = 1), each part is:
+&lt;ul>
+&lt;li>Dubbo version&lt;/li>
+&lt;li>Service name&lt;/li>
+&lt;li>Service version&lt;/li>
+&lt;li>Method name&lt;/li>
+&lt;li>Method parameter types&lt;/li>
+&lt;li>Method arguments&lt;/li>
+&lt;li>Attachments&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;li>If it is a response packet (Req/Res = 0), each part is:
+&lt;ul>
+&lt;li>Return value&amp;rsquo;s type (byte), identifying the type of value returned from the server:
+&lt;ul>
+&lt;li>Return null: RESPONSE_NULL_VALUE 2&lt;/li>
+&lt;li>Normal response value: RESPONSE_VALUE 1&lt;/li>
+&lt;li>Exception: RESPONSE_WITH_EXCEPTION 0&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;li>Return value: response bytes returned from the server&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;/ul>
+&lt;p>&lt;strong>Note:&lt;/strong> For the variable part, when uses json serialization in current version of Dubbo framework, an additional line break is added as a separator between each part of the content. Please add a new line break after each part of the variable part, such as:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">Dubbo version bytes (line break)
+Service name bytes (line break)
+...
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="advantages-and-disadvantages-about-the-dubbo-protocol">Advantages and disadvantages about the Dubbo protocol&lt;/h2>
+&lt;h3 id="advantages">Advantages&lt;/h3>
+&lt;ul>
+&lt;li>The protocol is designed to be very compact. The data type can be represented by 1 bit will not be represented by a byte, such as a boolean type identifier.&lt;/li>
+&lt;li>The request header is the same as response header, and the specific content is assembled to the variable part through the serializer, and it is simple to implement.&lt;/li>
+&lt;/ul>
+&lt;h3 id="to-be-improved">To be improved&lt;/h3>
+&lt;ul>
+&lt;li>
+&lt;p>Similar to the http request, the header can determine the resource to be accessed, and Dubbo needs to involve the specific serializer to resolve the service name, method, method signature, and these resource locators are string type or string array. It&amp;rsquo;s easy to convert to bytes, so it can be assembled into the header. Similar to http2 header compression, resources called for rpc can also be negotiated with an int to identify, which improves performance. This is easier to [...]
+&lt;/li>
+&lt;li>
+&lt;p>Use req/res to determine if it is a request, then you can refine the protocol, remove some unwanted identifiers and add some specific identifiers. For example, &lt;code>status&lt;/code>, &lt;code>twoWay&lt;/code> can be strictly customized to remove redundant identifiers. There is also a timeout identifier that is transmitted as the &lt;code>attachment&lt;/code> of the Dubbo. In theory, it should be placed in the header of the request protocol, because the timeout is essential in t [...]
+&lt;/li>
+&lt;li>
+&lt;p>Dubbo will convert the service name &lt;code>com.alibaba.middleware.hsf.guide.api.param.ModifyOrderPriceParam&lt;/code> to &lt;code>Lcom/alibaba/middleware/hsf/guide/api/param/ModifyOrderPriceParam;&lt;/code>, which is theoretically unnecessary, simply append a &lt;code>;&lt;/code> will be fine.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>The Dubbo protocol does not reserve extension fields, and cannot add new identifiers. The scalability is not very good. For example, the only way to add the &lt;code>response context&lt;/code> function is to change the protocol version, but this requires both the client and server versions to be upgraded. Very unfriendly in distributed scenarios.&lt;/p>
+&lt;/li>
+&lt;/ul>
+&lt;h2 id="conclusion">Conclusion&lt;/h2>
+&lt;p>This article mainly introduces the concept of the protocol and the commonly used protocol mode. Then it analyzes the Dubbo protocol in detail and also mentions some shortcomings. However, compared with its simplicity and ease of implementation, the above shortcomings are not enough to drive us to redesign a new version of the protocol, so we welcome suggestions and features for protocol optimization.&lt;/p></description></item><item><title>Blog: Integrate Dubbo with Kubernetes</tit [...]
+&lt;h1 id="general-goal">General goal&lt;/h1>
+&lt;p>Dubbo&amp;rsquo;s provider don&amp;rsquo;t care about service registration.Open its Dubbo service port,the declaration and publishment of the service will be executed by Kubernetes.
+Dubbo&amp;rsquo;s consumer directly discovers the corresponding service endpoints of Kubernetes during service discovery procedure, thereby reusing Dubbo&amp;rsquo;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 : &lt;a href="https://github.com/dubbo/dubbo-Kubernetes">https://github.com/dubbo/dubbo-uberne [...]
+&lt;h1 id="introduction">Introduction&lt;/h1>
+&lt;p>Kubernates is a hierarchical system with rich secondary development function based on the expansibility.&lt;/p>
+&lt;ul>
+&lt;li>First of all, Kubernates&amp;rsquo;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).&lt;/li>
+&lt;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.&lt;/li>
+&lt;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.&lt;/li>
+&lt;/ul>
+&lt;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 pr [...]
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/k8s/1.png" alt="img">&lt;/p>
+&lt;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.&lt;/p>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th style="text-align:left">The design of microservice&lt;/th>
+&lt;th style="text-align:left">The function of Kubernetes&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td style="text-align:left">Point 1:API gateway&lt;/td>
+&lt;td style="text-align:left">Ingress&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 2:Statelessness, distinguish between stateful and stateless applications&lt;/td>
+&lt;td style="text-align:left">Stateless corresponds to Deployment,and stateful corresponds to StatefulSet&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 3:Horizontal expansion of the database&lt;/td>
+&lt;td style="text-align:left">Headless service points to PaaS service or StatefulSet deployment&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 4:Cache&lt;/td>
+&lt;td style="text-align:left">Headless service points to PaaS service or StatefulSet deployment&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 5:Service splitting and service discovery&lt;/td>
+&lt;td style="text-align:left">Service&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 6:Service orchestration and flexibility&lt;/td>
+&lt;td style="text-align:left">Replicas of deployment&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 7:Unified configuration center&lt;/td>
+&lt;td style="text-align:left">ConfigMap&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 8:Unified log center&lt;/td>
+&lt;td style="text-align:left">DaemonSet deploys log agent&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 9:Circut break, current limiting and downgrade&lt;/td>
+&lt;td style="text-align:left">Service Mesh&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td style="text-align:left">Point 10:Comprehensive monitoring&lt;/td>
+&lt;td style="text-align:left">Cadsivor, DaemonSet deploys and monitors Agent&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;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&amp;rsquo;s a bit complicated, but the concepts it covers are more or less heard for us, and it solves problems that we&amp;rsquo;re familiar with:&lt;/p>
+&lt;ul>
+&lt;li>Deployment&lt;/li>
+&lt;li>Delivery&lt;/li>
+&lt;li>APIs&lt;/li>
+&lt;li>Versioning&lt;/li>
+&lt;li>Contracts&lt;/li>
+&lt;li>Scaling / Autoscaling&lt;/li>
+&lt;li>Service Discovery&lt;/li>
+&lt;li>Load Balancing&lt;/li>
+&lt;li>Routing / Adaptive Routing&lt;/li>
+&lt;li>Health Checking&lt;/li>
+&lt;li>Configuration&lt;/li>
+&lt;li>Circuit Breaking&lt;/li>
+&lt;li>Bulk-heads&lt;/li>
+&lt;li>TTL / Deadlining&lt;/li>
+&lt;li>Latency Tracing&lt;/li>
+&lt;li>Service Causal Tracing&lt;/li>
+&lt;li>Distributed logging&lt;/li>
+&lt;li>Metrics Exposure, Collection&lt;/li>
+&lt;/ul>
+&lt;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&amp;rsquo;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 cl [...]
+&lt;blockquote>
+&lt;p>&lt;span data-type="color" style="color:rgb(119, 119, 119)">&lt;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.&lt;/span>&lt;/span>&lt;/p>
+&lt;/blockquote>
+&lt;p>We will know the existing solution, Dubbo integrates the Clould Native Equipment - Kubernetes&amp;rsquo;s basic abilities to solve the microservices&amp;rsquo;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.&lt;/p>
+&lt;h1 id="tspan-data-typecolor-stylecolorrgb51-51-51span-data-typebackground-stylebackground-colorrgb255-255-255houghtspanspanplan">T&lt;span data-type="color" style="color:rgb(51, 51, 51)">&lt;span data-type="background" style="background-color:rgb(255, 255, 255)">hought&lt;/span>&lt;/span>/Plan&lt;/h1>
+&lt;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.&lt;/p>
+&lt;blockquote>
+&lt;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.&lt;/p>
+&lt;/blockquote>
+&lt;p>In conclusion, the Kubernetes service has the following characteristics:&lt;/p>
+&lt;ul>
+&lt;li>Each Service has a unique name and corresponding IP. IP is automatically assigned by Kubernetes and the name is defined by the developer.&lt;/li>
+&lt;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.&lt;/li>
+&lt;/ul>
+&lt;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&amp;ndash;VIP, behind the vip are multiple endpoints, which is the factual processing node.&lt;/p>
+&lt;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:&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;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&amp;rsquo;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&amp;rsquo;s poin [...]
+&lt;p>&lt;img src="https://img.alicdn.com/tfs/TB1Kj1ktpkoBKNjSZFEXXbrEVXa-985-213.png" alt="img">&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;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:&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;p>The above two thoughts need to consider the following two points:&lt;/p>
+&lt;ol>
+&lt;li>Kubernetes and Dubbo are consistent with the mapping name of service. Dubbo&amp;rsquo;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 [...]
+&lt;li>Port problem:The default Pod and Pod network interoperability is solved, need to be validated.&lt;/li>
+&lt;/ol>
+&lt;h2 id="demo-verification">Demo Verification&lt;/h2>
+&lt;p>The following is a demo deployment through Kubernetes service in Alibaba Cloud&amp;rsquo;s Container Registry and EDAS. Visit Alibaba Cloud -》Container Registry.&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;p>Create repo and bind the github codebase. As shown below.
+&lt;img src="https://img.alicdn.com/tfs/TB1m.tEtrorBKNjSZFjXXc_SpXa-1892-870.png" alt="img">&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;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.
+&lt;img src="https://img.alicdn.com/tfs/TB1oYqvtcIrBKNjSZK9XXagoVXa-1872-888.png" alt="img">&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Switch to Enterprise Distributed Application Services (EDAS) products panel, visit Resource Management -&amp;gt; Clusters. Create Kubernetes cluster and bind ECS. As shown below.
+&lt;img src="https://img.alicdn.com/tfs/TB1b1p2trZnBKNjSZFKXXcGOVXa-1858-833.png" alt="img">&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Application Management -&amp;gt; Create application, type Kubernetes application and specify the image in the container registry . As shown below.
+&lt;img src="https://img.alicdn.com/tfs/TB1_YywtDCWBKNjSZFtXXaC3FXa-1737-588.png" alt="img">&lt;/p>
+&lt;p>&lt;img src="https://img.alicdn.com/tfs/TB18uzTtdcnBKNjSZR0XXcFqFXa-1820-861.png" alt="">&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>After creation , then deploy applications. As shown below.
+&lt;img src="https://img.alicdn.com/tfs/TB1fEpEtrorBKNjSZFjXXc_SpXa-1846-783.png" alt="">&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;ul>
+&lt;li>
+&lt;p>The supplementary application name cannot have uppercase letters, all lowercase, otherwise there is a problem of deployment failure.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>When creating an app, after selecting the image, the next button cannot be clicked and you need to click Choose to continue.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>EDAS has two independent Kubernetes services, one based on Alibaba Cloud&amp;rsquo;s container service, and one set by Lark. I experience the latter.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>The development joint of Docker and IDE integration, you need to consider the relevant plug-ins for integrating IDEA.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>There is always an error in deployment, maybe there is a problem with the Kubernetes service. Need further investigation.&lt;/p>
+&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-json" data-lang="json">{
+&lt;span style="color:#268bd2">&amp;#34;kind&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;Pod&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;namespace&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;lzumwsrddf831iwarhehd14zh2-default&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;dubbo-k8s-demo-610694273-jq238&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;uid&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;12892e67-8bc8-11e8-b96a-00163e02c37b&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;apiVersion&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;v1&amp;#34;&lt;/span>,
+&lt;span style="color:#268bd2">&amp;#34;resourceVersion&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;850282769&amp;#34;&lt;/span>
+}, &lt;span style="color:#2aa198">&amp;#34;reason&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;FailedSync&amp;#34;&lt;/span>, &lt;span style="color:#2aa198">&amp;#34;message&amp;#34;&lt;/span>: &lt;span style="color:#2aa198">&amp;#34;Error syncing pod&amp;#34;&lt;/span>, &amp;#34;
+&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blog: How to prepare an Apache Release</title><link>http://dubbo.apache.org/en/blog/2018/09/02/how-to-prepare-an-apache-release/</link><pubDate>Sun, 02 Sep 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/09/02/how-to-prepare-an-apache-release/</guid><description>
+&lt;h2 id="understanding-the-apache-release-cycle">Understanding the Apache Release Cycle&lt;/h2>
+&lt;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.&lt;/p>
+&lt;p>Please refer to the following links for more information on ASF&amp;rsquo;s release guide:&lt;/p>
+&lt;ul>
+&lt;li>&lt;a href="http://www.apache.org/dev/release-publishing">Apache Release Guide&lt;/a>&lt;/li>
+&lt;li>&lt;a href="http://www.apache.org/dev/release.html">Apache Release Policy&lt;/a>&lt;/li>
+&lt;li>&lt;a href="http://www.apache.org/dev/publishing-maven-artifacts.html">Maven Release Info&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;h2 id="preparation-of-local-building-environment">Preparation of Local Building Environment&lt;/h2>
+&lt;p>Mainly including the related preparation of signature utilities and Maven repository certification&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;p>Install GPG,refer to &lt;a href="https://www.gnupg.org/download/index.html">https://www.gnupg.org/download/index.html&lt;/a>&lt;/p>
+&lt;ul>
+&lt;li>For example, in Mac OS&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">$ brew install gpg
+$ gpg --version &lt;span style="color:#586e75">#check version,should be 2.x&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Generate the key with GPG&lt;/p>
+&lt;ul>
+&lt;li>Generate the key according to the prompt&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ gpg2 --full-gen-key
+gpg &lt;span style="color:#719e07">(&lt;/span>GnuPG&lt;span style="color:#719e07">)&lt;/span> 2.0.12; Copyright &lt;span style="color:#719e07">(&lt;/span>C&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#2aa198">2009&lt;/span> 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 &lt;span style="color:#719e07">select&lt;/span> what kind of key you want:
+&lt;span style="color:#719e07">(&lt;/span>1&lt;span style="color:#719e07">)&lt;/span> RSA and RSA &lt;span style="color:#719e07">(&lt;/span>default&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">(&lt;/span>2&lt;span style="color:#719e07">)&lt;/span> DSA and Elgamal
+&lt;span style="color:#719e07">(&lt;/span>3&lt;span style="color:#719e07">)&lt;/span> DSA &lt;span style="color:#719e07">(&lt;/span>sign only&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#719e07">(&lt;/span>4&lt;span style="color:#719e07">)&lt;/span> RSA &lt;span style="color:#719e07">(&lt;/span>sign only&lt;span style="color:#719e07">)&lt;/span>
+Your selection? &lt;span style="color:#2aa198">1&lt;/span>
+RSA keys may be between &lt;span style="color:#2aa198">1024&lt;/span> and &lt;span style="color:#2aa198">4096&lt;/span> bits long.
+What keysize &lt;span style="color:#719e07">do&lt;/span> you want? &lt;span style="color:#719e07">(&lt;/span>2048&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#2aa198">4096&lt;/span>
+Requested keysize is &lt;span style="color:#2aa198">4096&lt;/span> bits
+Please specify how long the key should be valid.
+&lt;span style="color:#268bd2">0&lt;/span> &lt;span style="color:#719e07">=&lt;/span> key does not expire
+&amp;lt;n&amp;gt; &lt;span style="color:#719e07">=&lt;/span> key expires in n days
+&amp;lt;n&amp;gt;w &lt;span style="color:#719e07">=&lt;/span> key expires in n weeks
+&amp;lt;n&amp;gt;m &lt;span style="color:#719e07">=&lt;/span> key expires in n months
+&amp;lt;n&amp;gt;y &lt;span style="color:#719e07">=&lt;/span> key expires in n years
+Key is valid &lt;span style="color:#719e07">for&lt;/span>? &lt;span style="color:#719e07">(&lt;/span>0&lt;span style="color:#719e07">)&lt;/span>
+Key does not expire at all
+Is this correct? &lt;span style="color:#719e07">(&lt;/span>y/N&lt;span style="color:#719e07">)&lt;/span> 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:
+&lt;span style="color:#2aa198">&amp;#34;Robert Burrell Donkin (CODE SIGNING KEY) &amp;lt;rdonkin@apache.org&amp;gt;&amp;#34;&lt;/span>
+Change &lt;span style="color:#719e07">(&lt;/span>N&lt;span style="color:#719e07">)&lt;/span>ame, &lt;span style="color:#719e07">(&lt;/span>C&lt;span style="color:#719e07">)&lt;/span>omment, &lt;span style="color:#719e07">(&lt;/span>E&lt;span style="color:#719e07">)&lt;/span>mail or &lt;span style="color:#719e07">(&lt;/span>O&lt;span style="color:#719e07">)&lt;/span>kay/&lt;span style="color:#719e07">(&lt;/span>Q&lt;span style="color:#719e07">)&lt;/span>uit? O
+You need a Passphrase to protect your secret key. &lt;span style="color:#586e75"># enter the password, which will be used frequently when packaging.&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>View key id&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">$ gpg --list-keys
+pub rsa4096/28681CB1 2018-04-26 &lt;span style="color:#586e75"># 28681CB1 is the key id&lt;/span>
+uid &lt;span style="color:#719e07">[&lt;/span>ultimate&lt;span style="color:#719e07">]&lt;/span> liujun &lt;span style="color:#719e07">(&lt;/span>apache-dubbo&lt;span style="color:#719e07">)&lt;/span> &amp;lt;liujun@apache.org&amp;gt;
+sub rsa4096/D3D6984B 2018-04-26
+&lt;span style="color:#586e75">########### Note: Different diaplay for different version.&lt;/span>
+$ gpg --list-keys
+pub rsa4096 2018-11-12 &lt;span style="color:#719e07">[&lt;/span>SC&lt;span style="color:#719e07">]&lt;/span>
+63AAE9838F4A303E40BAF5FEA3A1CA7A5D4A3981 &lt;span style="color:#586e75"># Last 8 character(5D4A3981) as key id,it will be used when send public key to keyserver&lt;/span>
+uid &lt;span style="color:#719e07">[&lt;/span> 绝对 &lt;span style="color:#719e07">]&lt;/span> Victory Cao &lt;span style="color:#719e07">(&lt;/span>CODE SIGNING KEY&lt;span style="color:#719e07">)&lt;/span> &amp;lt;victory@apache.org&amp;gt;
+sub rsa4096 2018-11-12 &lt;span style="color:#719e07">[&lt;/span>E&lt;span style="color:#719e07">]&lt;/span>
+&lt;span style="color:#586e75"># send public key to keyserver via key id &lt;/span>
+$ gpg --keyserver pgpkeys.mit.edu --send-key 28681CB1
+&lt;span style="color:#586e75"># 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.&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>If there are multiple public keys,you can set the default key&lt;/li>
+&lt;/ul>
+&lt;p>~/.gnupg/gpg.conf&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback"># 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
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>If there are multiple public keys, you can also delete unuseful key:&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">&lt;span style="color:#586e75">### Delete the private key first, then delete the public key.&lt;/span>
+$ gpg --yes --delete-secret-keys shenglicao2@gmail.com &lt;span style="color:#586e75">### indicate email address &lt;/span>
+$ gpg --delete-keys 1808C6444C781C0AEA0AAD4C4D6A8007D20DB8A4
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Set up Apache central repository.&lt;/p>
+&lt;ul>
+&lt;li>The parent pom of Dubbo project is apache pom&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;parent&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>apache&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>19&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/parent&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>
+&lt;p>Add the following contents to .m2/settings.xml&lt;/p>
+&lt;p>Enter the passwords after
+encrypting by &lt;a href="http://maven.apache.org/guides/mini/guide-encryption.html">maven-encryption-plugin&lt;/a>&lt;/p>
+&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;settings&amp;gt;&lt;/span>
+...
+&lt;span style="color:#268bd2">&amp;lt;servers&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- To publish a snapshot of some part of Maven --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;server&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;id&amp;gt;&lt;/span>apache.snapshots.https&lt;span style="color:#268bd2">&amp;lt;/id&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;username&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP USERNAME --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/username&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;password&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/password&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/server&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- To stage a release of some part of Maven --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;server&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;id&amp;gt;&lt;/span>apache.releases.https&lt;span style="color:#268bd2">&amp;lt;/id&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;username&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP USERNAME --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/username&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;password&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/password&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/server&amp;gt;&lt;/span>
+...
+&lt;span style="color:#586e75">&amp;lt;!-- gpg passphrase used when generate key --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;server&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;id&amp;gt;&lt;/span>gpg.passphrase&lt;span style="color:#268bd2">&amp;lt;/id&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;passphrase&amp;gt;&lt;/span>&lt;span style="color:#586e75">&amp;lt;!-- yourKeyPassword --&amp;gt;&lt;/span>&lt;span style="color:#268bd2">&amp;lt;/passphrase&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/server&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/servers&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/settings&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;/ol>
+&lt;h2 id="pack--upload">Pack &amp;amp; Upload&lt;/h2>
+&lt;ol>
+&lt;li>
+&lt;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.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>First of all, verify that the maven component packing, source packing, signature, etc are working properly on the ${release_version}-release branch.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ mvn clean install -Papache-release
+$ mvn deploy
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;/ol>
+&lt;p>This push the snapshot package to the maven central repository.&lt;/p>
+&lt;ol start="3">
+&lt;li>
+&lt;p>Release with maven-release-plugin&lt;/p>
+&lt;ul>
+&lt;li>verify with dryRun&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ mvn release:prepare -Prelease -Darguments&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;-Dmaven.test.skip=true&amp;#34;&lt;/span> -DautoVersionSubmodules&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span> -Dusername&lt;span style="color:#719e07">= [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>After verification, run release:prepare&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ mvn release:clean
+$ mvn release:prepare -Prelease -Darguments&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;-Dmaven.test.skip=true&amp;#34;&lt;/span> -DautoVersionSubmodules&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span> -Dusername&lt;span style="color:#719e07">=&lt;/span>YOUR GITHUB ID -DpushChanges&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">false&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
+&lt;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 &lt;code>Personal access tokens&lt;/code> instead. You can go to &lt;a href="https://github.com/settings/profile,">https://github.com/settings/profile,&lt;/a> click &lt;code>Developer settings&lt;/code> -&amp;gt; &lt;code>Personal access tokens&lt;/code>, and generate a new token if not. Please refer to this &lt;a href="https: [...]
+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&lt;/p>
+&lt;/blockquote>
+&lt;p>After executing the above commands, you will find that:&lt;/p>
+&lt;ol>
+&lt;li>source-release.zip and bin-release.zip are generated under dubbo-distribution directory, please unzip it and check the file structure&lt;/li>
+&lt;li>&lt;code>-DpushChanges=false&lt;/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 &lt;code>[maven-release-plugin] prepare release dubbo-x.x.x&lt;/code> added.&lt;/li>
+&lt;li>The branch version is upgraded to ${release_version+1}-SNAPSHOT automatically. If &lt;code>-DpushChanges=true&lt;/code> is specified, the modifications will be pushed to the remote repository, you will see a commit called &lt;code>[maven-release-plugin] prepare for next development iteration&lt;/code> added.&lt;/li>
+&lt;/ol>
+&lt;p>If &lt;code>-DpushChanges=false&lt;/code> is specified, you will have to manually push the commit to remote repository before go to next step.&lt;/p>
+&lt;ul>
+&lt;li>Run release:perform&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ mvn release:perform -Prelease -Darguments&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;-Dmaven.test.skip=true&amp;#34;&lt;/span> -DautoVersionSubmodules&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span> -Dusername&lt;span style="color:#719e07">= [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Maven will download the source code from the tag you just pushed, compile it, and deploy to remote maven repsoitry in staging state.&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;h3 id="note">Note&lt;/h3>
+&lt;blockquote>
+&lt;p>When you deploy the package into repository, it will be interrupted for network. So you must restart to desploy.&lt;br>
+The problem is that missing package occurred many times at deploying. So you should check the quantity of package, especially parent package.&lt;/p>
+&lt;/blockquote>
+&lt;h2 id="prepare-apache-release">Prepare Apache Release&lt;/h2>
+&lt;ol>
+&lt;li>
+&lt;p>Prepare the svn local environment (Apache hosting the release content of project by svn)&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Checkout dubbo to local directory&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ svn checkout https://dist.apache.org/repos/dist/dev/incubator/dubbo
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Assume that the local directory is &lt;code>~/apache/incubator/dubbo&lt;/code>&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>The current release version is ${release_version}, new directory&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ &lt;span style="color:#b58900">cd&lt;/span> ~/apache/incubator/dubbo &lt;span style="color:#586e75"># dubbo svn root directory&lt;/span>
+$ mkdir &lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Add public key to &lt;a href="https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS">KEYS&lt;/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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ gpg -a --export your_key_id &amp;gt;&amp;gt; KEYS
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>For more information on how to get your key id, please refer to this &lt;a href="https://help.github.com/articles/generating-a-new-gpg-key/">guide&lt;/a>&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Copy the source.zip package from the Dubbo root directory to the svn local repository dubbo/${release_version}&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Generate sha512 sign&lt;/p>
+&lt;p>For source-release.zip&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ shasum -a &lt;span style="color:#2aa198">512&lt;/span> apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-source-release.zip &amp;gt;&amp;gt; apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style=" [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>For bin-release.zip&lt;/p>
+&lt;p>Please add &lt;code>-b&lt;/code> paramter when generating sha512 for bin-release.zip, which indicates it is a binary file.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ shasum -b -a &lt;span style="color:#2aa198">512&lt;/span> apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-bin-release.zip &amp;gt;&amp;gt; apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style=" [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should generate something like this:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">b8f13d1df6d6c9a1facc72fafc00b2d22bea1e600517c507467d8fca2f776a7a3877101742da53114bfa629ca5b941eb4d9ef989de43f0833e2a794e7ccf5c8a *apache-dubbo-spring-boot-project-2.7.0-bin-release.zip
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note there is a &lt;code>*&lt;/code> sign before the file name.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>If the binary release is accompanied with the source release. Run the following command in the dubbo-distribution module:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ mvn install
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Commit to Apache svn&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ svn status
+$ svn commit -m &lt;span style="color:#2aa198">&amp;#39;prepare for ${release_version} RC1&amp;#39;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;/ol>
+&lt;h2 id="verify-release-candidates">Verify Release Candidates&lt;/h2>
+&lt;p>&lt;strong>A full check list can be found &lt;a href="https://wiki.apache.org/incubator/IncubatorReleaseChecklist">here&lt;/a>&lt;/strong>&lt;/p>
+&lt;p>The verification link includes but is not limited to the following contents and forms:&lt;/p>
+&lt;h3 id="check-signatures-and-hashes-are-good">Check signatures and hashes are good&lt;/h3>
+&lt;h4 id="check-the-sha512-sum">check the sha512 sum&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">$ shasum -c apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-source-release.zip.sha512
+$ shasum -c apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-bin-release.zip.sha512
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="check-the-gpg-signarure">check the gpg signarure&lt;/h4>
+&lt;p>If it&amp;rsquo;s your first time verify a release candidte, you should import public keys first.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh"> $ curl https://dist.apache.org/repos/dist/dev/incubator/dubbo/KEYS &amp;gt;&amp;gt; KEYS &lt;span style="color:#586e75"># download public keys to local directory&lt;/span>
+$ gpg --import KEYS &lt;span style="color:#586e75"># import keys&lt;/span>
+$ gpg —edit-key liujun
+&amp;gt; trust &lt;span style="color:#586e75"># type trust command&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now, you can verify signature with command&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="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
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="check-source-release-file-content">Check source release file content&lt;/h3>
+&lt;p>Unzip apache-dubbo-${release_version}-source-release.zip to the default directory and check the following:&lt;/p>
+&lt;ul>
+&lt;li>Directory with &amp;lsquo;incubating&amp;rsquo; in name
+&lt;code>apache-dubbo-${release_version}-source-release&lt;/code>&lt;/li>
+&lt;li>DISCLAIMER exists&lt;/li>
+&lt;li>LICENSE and NOTICE exists and contents are good&lt;/li>
+&lt;li>All files and no binary files exist&lt;/li>
+&lt;li>All files has standard ASF License header&lt;/li>
+&lt;li>Can compile from source&lt;/li>
+&lt;li>All unit tests can pass
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">mvn clean &lt;span style="color:#b58900">test&lt;/span> &lt;span style="color:#586e75"># This will run all unit tests&lt;/span>
+&lt;span style="color:#586e75"># you can also open rat and style plugin to check if every file meets requirements.&lt;/span>
+mvn clean &lt;span style="color:#b58900">test&lt;/span> -Drat.skip&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">false&lt;/span> -Dcheckstyle.skip&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">false&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>Release candidates match with corresponding tags, you can find tag link and hash in vote email.
+&lt;ul>
+&lt;li>check the version number in pom.xml are the same&lt;/li>
+&lt;li>check there are no extra files or directories in the source package, for example, no empty directories or useless log files.&lt;br>
+&lt;code>diff -r rc_dir tag_dir&lt;/code>&lt;/li>
+&lt;li>check the top n tag commits, dive into the related files and check if the source package has the same changes&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;/ul>
+&lt;h3 id="check-binary-distribution-file-content">Check binary distribution file content&lt;/h3>
+&lt;p>Unzip apache-dubbo-${release_version}-bin-release.zip and check:&lt;/p>
+&lt;ul>
+&lt;li>Check signatures are good&lt;/li>
+&lt;li>&amp;lsquo;incubating&amp;rsquo; in name&lt;/li>
+&lt;li>LICENSE and NOTICE exists and contents are good&lt;/li>
+&lt;/ul>
+&lt;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.&lt;/p>
+&lt;h2 id="release-vote">Release vote&lt;/h2>
+&lt;p>The voting is divided into two phases:&lt;/p>
+&lt;ol>
+&lt;li>Dubbo community votes and sends the voting email to &lt;a href="mailto:dev@dubbo.apache.org">dev@dubbo.apache.org&lt;/a>. After reviewing by community developers and winning 3 binding tickets that agree to release, you can go to the next stage of voting.&lt;/li>
+&lt;li>Apache community votes and sends the voting email to &lt;a href="mailto:general@incubator.apache.org">general@incubator.apache.org&lt;/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.&lt;/li>
+&lt;/ol>
+&lt;p>The mail template for Apache Dubbo vote:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-tex" data-lang="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/dubbo/tree/dubbo-2.6.2
+Hash for the release tag:
+afab04c53edab38d52275d2a198ea1aff7a4f41e
+Release Notes:
+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
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The mail template for Apache Incubator vote:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-text" data-lang="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™ is a high-performance, java based, open source
+RPC framework. Dubbo offers three key functionalities, which include
+interface based remote call, fault tolerance &amp;amp; load balancing, and
+automatic service registration &amp;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/dubbo/tree/dubbo-2.6.4
+Hash for the release tag:
+88037747a3b69d3225c73f6fbcda36ebd8435887
+Release Notes:
+*https://github.com/apache/dubbo/blob/dubbo-2.6.4/CHANGES.md
+&amp;lt;https://github.com/apache/dubbo/blob/dubbo-2.6.4/CHANGES.md&amp;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/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
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The mail template to announce the vote result:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-text" data-lang="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
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="official-release">Official Release&lt;/h2>
+&lt;p>When the release vote has passed,&lt;/p>
+&lt;ol>
+&lt;li>Add the release files to &lt;a href="https://dist.apache.org/repos/dist/release/incubator/dubbo">official release directory&lt;/a>&lt;/li>
+&lt;li>Remove the release files in &lt;a href="https://dist.apache.org/repos/dist/dev/incubator/dubbo">dev directory&lt;/a>&lt;/li>
+&lt;li>Remove the the release file for the previous release under &lt;a href="https://dist.apache.org/repos/dist/release/incubator/dubbo/">official release directory&lt;/a>, which will be archived and can be found &lt;a href="https://archive.apache.org/dist/incubator/dubbo/">here&lt;/a>&lt;/li>
+&lt;li>Publish &lt;a href="https://github.com/apache/dubbo/releases">release notes&lt;/a> on Github.&lt;/li>
+&lt;li>Update the recommend dependency on &lt;a href="https://github.com/apache/dubbo#maven-dependency">Github&lt;/a> to the latest version, also update the version in other place if necessary.&lt;/li>
+&lt;li>Add the download link to official website &lt;a href="http://dubbo.apache.org/en-us/blog/download.html,">http://dubbo.apache.org/en-us/blog/download.html,&lt;/a> using the ASF mirror system. The latest release download link should be something like &lt;a href="https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/$VERSION/apache-dubbo-$VERSION-source-release.zip">this&lt;/a>. The download link for the previous release version should be changed like &lt;a href="https://archive [...]
+&lt;li>Make sure all the commits in the release branch are merged into master branch, and then remove the remote release branch. For example: &lt;code>git push origin --delete 2.7.0-release&lt;/code>&lt;/li>
+&lt;li>Send mail to &lt;a href="mailto:dev@dubbo.apache.org">dev@dubbo.apache.org&lt;/a> and &lt;a href="mailto:general@incubator.apache.org">general@incubator.apache.org&lt;/a>, notify the community that the release is completed.
+The mail template to announce release:&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-text" data-lang="text">Hello Community,
+The Apache Dubbo team is pleased to announce that the
+2.6.6 has just been released.
+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;amp; load balancing, and
+automatic service registration &amp;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/dubbo/releases
+[4] https://github.com/apache/dubbo/issues
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="complete-maven-convenient-binary-release">Complete Maven Convenient Binary release&lt;/h2>
+&lt;p>&lt;strong>&lt;a href="https://repository.apache.org/">repository.apache.org&lt;/a> The permissions of the nexus repository have been applied, see &lt;a href="https://issues.apache.org/jira/browse/INFRA-16451">jira&lt;/a>。&lt;/strong>&lt;/p>
+&lt;p>To release the maven artifacts, go to &lt;a href="https://repository.apache.org">repository.apache.org&lt;/a>, and choose the staging repository, click the release button. Wait for a moment and verify it at &lt;a href="https://repository.apache.org/content/repositories/releases/org/apache/dubbo/">here&lt;/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 &lt;a href="https://repo.maven.apache.org/mave [...]
+&lt;h2 id="faq">FAQ&lt;/h2>
+&lt;h4 id="gpg-signing-failed-inappropriate-ioctl-for-device">gpg: signing failed: Inappropriate ioctl for device&lt;/h4>
+&lt;p>If you&amp;rsquo;ve encoutered this error, try the following commands:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">export GPG_TTY=$(tty)
+&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blog: How to implement a fully asynchronous calls chain based on Dubbo</title><link>http://dubbo.apache.org/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/</link><pubDate>Sun, 02 Sep 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/</guid><description>
+&lt;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 sum [...]
+&lt;h2 id="asynchronous-mode-before-version-26x">Asynchronous mode before version 2.6.x&lt;/h2>
+&lt;p>Dubbo Provides some asynchronous programming capabilities in 2.6.x and earlier versions, including &lt;a href="http://dubbo.apache.org/zh-cn/docs/user/demos/async-call.html">Asynchronous Call&lt;/a>, &lt;a href="http://dubbo.apache.org/zh-cn/docs/user/demos/callback-parameter.html">Parameter Callback&lt;/a> and &lt;a href="http://dubbo.apache.org/zh-cn/docs/user/demos/events-notify.html">Event Notification&lt;/a> on Consumer side. There are some brief introductions to the usage and [...]
+&lt;p>But the current asynchronous method has the following problems:&lt;/p>
+&lt;ul>
+&lt;li>Methods to access Future object are not direct enough.&lt;/li>
+&lt;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.&lt;/li>
+&lt;li>Asynchronization on Provider side is not supported.&lt;/li>
+&lt;/ul>
+&lt;p>Take the asynchronous method of Consumer side as an example:&lt;/p>
+&lt;ol>
+&lt;li>Define a original synchronous interface and add the declaration to support asynchronous calls.&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">FooService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">findFoo&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;fooService&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.foo.FooService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;findFoo&amp;#34;&lt;/span> async=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:reference&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
+&lt;li>Obtain Future object through RpcContext.&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#586e75">// this call will return null immediately
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>fooService&lt;span style="color:#719e07">.&lt;/span>findFoo&lt;span style="color:#719e07">(&lt;/span>fooId&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#586e75">// Obtain the Future instance. When the result is returned, Future instance will be notified and the result will be set to Future instance.
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>Future&lt;span style="color:#719e07">&amp;lt;&lt;/span>Foo&lt;span style="color:#719e07">&amp;gt;&lt;/span> fooFuture &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">().&lt;/span>getFuture&lt;span style="color:#719e07">();&lt;/span>
+fooFuture&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>or&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#586e75">// this call will return null immediately
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>fooService&lt;span style="color:#719e07">.&lt;/span>findFoo&lt;span style="color:#719e07">(&lt;/span>fooId&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#586e75">// get Dubbo&amp;#39;s built-in ResponseFuture, and set the callback
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>ResponseFuture future &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">((&lt;/span>FutureAdapter&lt;span style="color:#719e07">)&lt;/span>RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">().&lt;/span>getFuture&lt;span style="color:#719e07">()).&lt;/span>getFuture&lt;span style="color:#719e07">();&lt;/span>
+future&lt;span style="color:#719e07">.&lt;/span>setCallback&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> ResponseCallback&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">done&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Object response&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>print&lt;span style="color:#719e07">(&lt;/span>response&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">caught&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Throwable exception&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+exception&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">});&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>From this simple example, we can see there are some inconveniences in use:&lt;/p>
+&lt;ol>
+&lt;li>The synchronization interface of findFoo cannot directly return a Future object representing the asynchronous result, which is further obtained through RpcContext.&lt;/li>
+&lt;li>Future object can only be obtained from get method that will block until getting the result.&lt;/li>
+&lt;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.&lt;/li>
+&lt;/ol>
+&lt;h2 id="enhancement-based-on-completablefuture-in-version-270">Enhancement based on CompletableFuture in version 2.7.0&lt;/h2>
+&lt;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.&lt;/p>
+&lt;p>Support for Java 8 has been upgraded in Dubbo 2.7.0, and Dubbo has enhanced the current asynchronous functionality based on CompletableFuture.&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AsyncService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>If you don&amp;rsquo;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AsyncService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@AsyncFor&lt;/span>&lt;span style="color:#719e07">(&lt;/span>AsyncService&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">GrettingServiceAsync&lt;/span> &lt;span style="color:#268bd2">extends&lt;/span> GreetingsService &lt;span style="color:#719e07">{&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHiAsync&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;p>Providing an asynchronous method definition for each synchronization method can be inconvenient. Further, using &lt;a href="https://github.com/dubbo/dubbo-async-processor">Annotation Processor implementation&lt;/a> in the Dubbo ecosystem can automatically generate asynchronous method definitions for us.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Similarly, if your original interface definition doesn&amp;rsquo;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 : &lt;code>RpcContext.startAsync()&lt;/code>.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AsyncService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> AsyncService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">final&lt;/span> AsyncContext asyncContext &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>startAsync&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(()&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>write&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34;, response from provider.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}).&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>At the beginning of the method body, it starts asynchronization by running &lt;code>RpcContext.startAsync()&lt;/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 &lt;code>asyncContext.write&lt;/code>.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>RpcContext returns CompletableFuture directly.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> f &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">().&lt;/span>getCompletableFuture&lt;span style="color:#719e07 [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;/ol>
+&lt;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.&lt;/p>
+&lt;p>Next, let&amp;rsquo;s illustrate how to implement a fully asynchronous Dubbo service call chain through a few examples.&lt;/p>
+&lt;h2 id="example-1completablefuture-interface">example 1:CompletableFuture interface&lt;/h2>
+&lt;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 &lt;a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-original-future">dubbo-samples-async-original-future&lt;/a>.&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;p>Interface definition&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AsyncService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note that the return type of this interface is &lt;code>CompletableFuture&amp;lt;String&amp;gt;&lt;/code>.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Provider Side&lt;/p>
+&lt;ul>
+&lt;li>
+&lt;p>Implementation&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> AsyncService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> CompletableFuture&lt;span style="color:#719e07">.&lt;/span>supplyAsync&lt;span style="color:#719e07">(()&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>5000&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>InterruptedException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+e&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;async response from provider.&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">});&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>Config&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.api.AsyncService&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The Config is the same as the original interface.&lt;/p>
+&lt;/li>
+&lt;/ul>
+&lt;/li>
+&lt;li>
+&lt;p>Consumer Side&lt;/p>
+&lt;ul>
+&lt;li>Config&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span> timeout=&lt;span style="color:#2aa198">&amp;#34;10000&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.api.AsyncService&amp;#34;&lt; [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The Config is the same as the original interface.&lt;/p>
+&lt;ul>
+&lt;li>Call remote service&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/sp [...]
+ClassPathXmlApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ClassPathXmlApplicationContext&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{&lt;/span>&lt;span style="color:#2aa198">&amp;#34;META-INF/spring/async-consumer.xml&amp;#34;&lt;/span>&lt;span style="color:#719e07">});&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#268bd2">final&lt;/span> AsyncService asyncService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>AsyncService&lt;span style="color:#719e07">)&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>getBean&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> future &lt;span style="color:#719e07">=&lt;/span> asyncService&lt;span style="color:#719e07">.&lt;/span>sayHello&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;async call request&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+future&lt;span style="color:#719e07">.&lt;/span>whenComplete&lt;span style="color:#719e07">((&lt;/span>v&lt;span style="color:#719e07">,&lt;/span> t&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>t &lt;span style="color:#719e07">!=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+t&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">else&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Response: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> v&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">});&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Executed before response return.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>CompletableFuture&amp;lt;String&amp;gt; future = asyncService.sayHello(&amp;quot;async call request&amp;quot;);&lt;/code>It is convenient to return the Future instance, which implements the asynchronous service call on the Consumer side.&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;h2 id="example-2synchronous-interface-uses-annotation-processor">Example 2:Synchronous interface uses Annotation Processor&lt;/h2>
+&lt;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 &lt;a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-generated-future">dubbo-samples-async-generated-future&lt;/a>.&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;p>Interface definition&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@DubboAsync&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">GreetingsService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">sayHi&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is a generic definition of the Dubbo service interface. Note that add the @DubboAsync annotation when using Annotation Processor.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dependency&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>com.alibaba&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>dubbo-async-processer&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>1.0.0-SNAPSHOT&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dependency&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;plugin&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache.maven.plugins&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>maven-compiler-plugin&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>3.7.0&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;configuration&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;source&amp;gt;&lt;/span>1.8&lt;span style="color:#268bd2">&amp;lt;/source&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;target&amp;gt;&lt;/span>1.8&lt;span style="color:#268bd2">&amp;lt;/target&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;annotationProcessorPaths&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;path&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>com.alibaba&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>dubbo-async-processer&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>1.0.0-SNAPSHOT&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/path&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/annotationProcessorPaths&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/configuration&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/plugin&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75">* Generated by dubbo-async-processer
+&lt;/span>&lt;span style="color:#586e75">*/&lt;/span>
+&lt;span style="color:#719e07">package&lt;/span> com.alibaba.dubbo.samples.api&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">import&lt;/span> java.util.concurrent.CompletableFuture&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@javax.annotation.Generated&lt;/span>&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.async.processor.AsyncAnnotationProcessor&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">@org.apache.dubbo.common.config.AsyncFor&lt;/span>&lt;span style="color:#719e07">(&lt;/span>com&lt;span style="color:#719e07">.&lt;/span>alibaba&lt;span style="color:#719e07">.&lt;/span>dubbo&lt;span style="color:#719e07">.&lt;/span>samples&lt;span style="color:#719e07">.&lt;/span>api&lt;span style="color:#719e07">.&lt;/span>GreetingsService&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">GreetingsServiceAsync&lt;/span> &lt;span style="color:#268bd2">extends&lt;/span> GreetingsService &lt;span style="color:#719e07">{&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>java&lt;span style="color:#719e07">.&lt;/span>lang&lt;span style="color:#719e07">.&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHiAsync&lt;/span>&lt;span style="color:#719e07">(&lt;/span>java&lt;span style="color:#719e07">.&lt;/span>lang&lt;span style="color:#719e07">.&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Provider side&lt;/p>
+&lt;ul>
+&lt;li>Config&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;greetingsService&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.impl.GreetingsServiceImpl&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.api.GreetingsService&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;greetingsService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>Service implementation&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">GreetingsServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> GreetingsService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHi&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;hi, &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Consumer side&lt;/p>
+&lt;ul>
+&lt;li>Config&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml"> &lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;greetingsService&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.api.GreetingsServiceAsync&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note that the service interface uses &lt;strong>GreetingsServiceAsync&lt;/strong>&lt;/p>
+&lt;ul>
+&lt;li>Service call&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java"> &lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/s [...]
+ClassPathXmlApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ClassPathXmlApplicationContext&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{&lt;/span>&lt;span style="color:#2aa198">&amp;#34;META-INF/spring/async-consumer.xml&amp;#34;&lt;/span>&lt;span style="color:#719e07">});&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+GreetingsServiceAsync greetingsService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>GreetingsServiceAsync&lt;span style="color:#719e07">)&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>getBean&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;greetingsService&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> future &lt;span style="color:#719e07">=&lt;/span> greetingsService&lt;span style="color:#719e07">.&lt;/span>sayHiAsync&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;async call reqeust&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;async call ret :&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> future&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">());&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this way, we can use &lt;code>CompletableFuture&amp;lt;String&amp;gt; future = greetingsService.sayHiAsync(&amp;quot;async call reqeust&amp;quot;);&lt;/code> directly,and return CompletableFuture.&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;h2 id="example-3use-asynccontext">Example 3:Use AsyncContext&lt;/h2>
+&lt;p>This example demonstrates how to implement the Provider-side asynchronous execution through AsyncContext based on the original synchronous interface. Code link &lt;a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async/dubbo-samples-async-provider">dubbo-samples-async-provider&lt;/a>.&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;p>Interface definition&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AsyncService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Provider side&lt;/p>
+&lt;ul>
+&lt;li>Config&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.impl.AsyncServiceImpl&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> async=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.api.AsyncService&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note that adding &lt;code>async=&amp;quot;true&amp;quot;&lt;/code> indicates that this is a service that starts the Provider-side execution asynchronously.&lt;/p>
+&lt;ul>
+&lt;li>Asynchronous execution implementation&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> AsyncService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">final&lt;/span> AsyncContext asyncContext &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>startAsync&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(()&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>signalContextSwitch&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>500&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>InterruptedException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+e&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>write&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34;, response from provider.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}).&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;li>
+&lt;p>Consumer side&lt;/p>
+&lt;ul>
+&lt;li>Config&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.api.AsyncService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
+&lt;li>Service call&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java"> &lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/s [...]
+ClassPathXmlApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ClassPathXmlApplicationContext&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{&lt;/span>&lt;span style="color:#2aa198">&amp;#34;META-INF/spring/async-consumer.xml&amp;#34;&lt;/span>&lt;span style="color:#719e07">});&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+AsyncService asyncService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>AsyncService&lt;span style="color:#719e07">)&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>getBean&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>asyncService&lt;span style="color:#719e07">.&lt;/span>sayHello&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;async call request&amp;#34;&lt;/span>&lt;span style="color:#719e07">));&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
+&lt;/ol>
+&lt;h2 id="new-problems-resulted-from-asynchronization">New problems resulted from asynchronization&lt;/h2>
+&lt;h3 id="filter-chain">Filter Chain&lt;/h3>
+&lt;p>The following is a complete Filter chain for a normal Dubbo call.&lt;/p>
+&lt;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.&lt;/p>
+&lt;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.&lt;/p>
+&lt;p>The following is an example of extending the Filter and supporting the asynchronous Filter chain.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@Activate&lt;/span>&lt;span style="color:#719e07">(&lt;/span>group &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">{&lt;/span>Constants&lt;span style="color:#719e07">.&lt;/span>PROVIDER&lt;span style="color:#719e07">,&lt;/span> Constants&lt;span style="color:#719e0 [...]
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncPostprocessFilter&lt;/span> &lt;span style="color:#268bd2">extends&lt;/span> AbstractPostProcessFilter &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> Result &lt;span style="color:#268bd2">invoke&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Invoker&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> invoker&lt;span style="color:#719e07">,&lt;/span> Invocation invocation&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> RpcException &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> postProcessResult&lt;span style="color:#719e07">(&lt;/span>invoker&lt;span style="color:#719e07">.&lt;/span>invoke&lt;span style="color:#719e07">(&lt;/span>invocation&lt;span style="color:#719e07">),&lt;/span> invoker&lt;span style="color:#719e07">,&lt;/span> invocation&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">protected&lt;/span> Result &lt;span style="color:#268bd2">doPostProcess&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Result result&lt;span style="color:#719e07">,&lt;/span> Invoker&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> invoker&lt;span style="color:#719e07">,&lt;/span> Invocation invocation&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Filter get the return value: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> result&lt;span style="color:#719e07">.&lt;/span>getValue&lt;span style="color:#719e07">());&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> result&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="context-passing">Context passing&lt;/h3>
+&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> AsyncService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// Save the context of the current thread
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> RpcContext context &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> CompletableFuture&lt;span style="color:#719e07">.&lt;/span>supplyAsync&lt;span style="color:#719e07">(()&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// Set context into new thread
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>setContext&lt;span style="color:#719e07">(&lt;/span>context&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>5000&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>InterruptedException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+e&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;async response from provider.&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">});&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>However, AsyncContext also provides the signalContextSwitch() method for a convenient Context switch.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AsyncServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> AsyncService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">final&lt;/span> AsyncContext asyncContext &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>startAsync&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(()&lt;/span> &lt;span style="color:#719e07">-&amp;gt;&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>signalContextSwitch&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>500&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>InterruptedException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+e&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+asyncContext&lt;span style="color:#719e07">.&lt;/span>write&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34;, response from provider.&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}).&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blog: The fourth Dubbo meetup has been held in Chengdu</title><link>http://dubbo.apache.org/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/</link><pubDate>Sun, 26 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/</guid><description>
+&lt;h1 id="the-fourth-dubbo-meetup-has-been-held-in-chengdu">The fourth Dubbo meetup has been held in Chengdu&lt;/h1>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/meetup-chengdu/all-hands.webp" alt="img">&lt;/p>
+&lt;h2 id="the-depth-of-the-user-communication">The depth of the user communication&lt;/h2>
+&lt;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.&lt;/p>
+&lt;h2 id="meetup-activity-information">Meetup activity information&lt;/h2>
+&lt;p>The event is still full, total enrollment of 976, 350 + site users, live PV 13207.&lt;/p>
+&lt;h2 id="the-registration-information">The registration information&lt;/h2>
+&lt;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.&lt;/br>
+Sign up link:http://www.huodongxing.com/event/7453091088400&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-chengdu-meetup-img.jpg" alt="img">&lt;/p></description></item><item><title>Blog: Dubbo Basic Usage - Dubbo Consumer Configuration</title><link>http://dubbo.apache.org/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/</link><pubDate>Tue, 14 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/</guid><description>
+&lt;h2 id="dubbo-consumer-configuration">Dubbo Consumer Configuration&lt;/h2>
+&lt;h3 id="consumer-configuration-detailed">Consumer Configuration Detailed&lt;/h3>
+&lt;p>There are 3 ways to configure the Dubbo Consumer: XML configuration, API call mode configuration, and annotation mode configuration.&lt;/p>
+&lt;h4 id="xml-configuration">XML Configuration&lt;/h4>
+&lt;h6 id="example-of-the-simplest-configuration">Example of the simplest configuration:&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">
+&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
+&amp;lt;beans xmlns=&amp;#34;http://www.springframework.org/schema/beans&amp;#34;
+Xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;
+Xmlns:dubbo=&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;
+Xsi:schemaLocation=&amp;#34;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&amp;#34;&amp;gt;
+&amp;lt;dubbo:application name=&amp;#34;hello-world-app&amp;#34; /&amp;gt;
+&amp;lt;dubbo:registry address=&amp;#34;multicast://224.5.6.7:1234&amp;#34; /&amp;gt;
+&amp;lt;dubbo:protocol name=&amp;#34;dubbo&amp;#34; port=&amp;#34;20880&amp;#34; /&amp;gt;
+&amp;lt;dubbo:reference id=&amp;#34;demoServiceRemote&amp;#34; interface=&amp;#34;com.alibaba.dubbo.demo.DemoService&amp;#34; /&amp;gt;
+&amp;lt;/beans&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
+&lt;p>For the supported configuration tags and corresponding configuration items, refer to the usage in the provider.&lt;/p>
+&lt;/blockquote>
+&lt;blockquote>
+&lt;p>Next, focus on the configuration of &amp;lt;dubbo:reference/&amp;gt;.&lt;/p>
+&lt;/blockquote>
+&lt;ul>
+&lt;li>&amp;lt;dubbo:reference/&amp;gt; List of main attributes supported:&lt;/li>
+&lt;/ul>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Property Name&lt;/th>
+&lt;th>Description&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>id&lt;/td>
+&lt;td>service reference id, as java bean id, requires unique&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>Interface&lt;/td>
+&lt;td>interface name for finding services&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>version&lt;/td>
+&lt;td>version number, consistent with the service provider&amp;rsquo;s version&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>timeout&lt;/td>
+&lt;td>service method call timeout (ms)&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>retries&lt;/td>
+&lt;td>The number of retry attempts by the remote service, excluding the first call, no need to retry, please set to 0&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>Connections&lt;/td>
+&lt;td>For each provider&amp;rsquo;s maximum number of connections, rmi, http, hessian, etc. The short connection protocol indicates the number of restricted connections, and the dubbo equal-length connection association indicates the number of long connections established&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>Loadbalance&lt;/td>
+&lt;td>Load balancing policy, optional values: random, roundrobin, leastactive, respectively: random, polling, least active call&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>async&lt;/td>
+&lt;td>Whether to execute asynchronously, unreliable asynchronous, just ignore return value, do not block execution thread&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>generic&lt;/td>
+&lt;td>generalized call, can bypass&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>check&lt;/td>
+&lt;td>Check if the provider exists at startup, true error, false ignore&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>Actives&lt;/td>
+&lt;td>Maximum concurrent calls per method per service consumer&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;p>For other configuration properties, please refer to xsd: &lt;a href="http://dubbo.apache.org/schema/dubbo/dubbo.xsd">http://dubbo.apache.org/schema/dubbo/dubbo.xsd&lt;/a>&lt;/p>
+&lt;ul>
+&lt;li>&amp;lt;dubbo:method/&amp;gt; As a child of &amp;lt;dubbo:reference/&amp;gt;, it can be configured for methods. The more commonly used attributes are:&lt;/li>
+&lt;/ul>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Property Name&lt;/th>
+&lt;th>Description&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>executes&lt;/td>
+&lt;td>request ceiling for service execution&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>retries&lt;/td>
+&lt;td>Timeout retries&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>timeout&lt;/td>
+&lt;td>call timeout&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>Loadbalance&lt;/td>
+&lt;td>Load balancing policy, optional values: random, roundrobin, leastactive, respectively: random, polling, least active call&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>async&lt;/td>
+&lt;td>Whether to execute asynchronously, unreliable asynchronous, just ignore return value, do not block execution thread&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>Actives&lt;/td>
+&lt;td>Maximum concurrent call limit per service consumer&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;p>For other properties, you can refer to xsd above.&lt;/p>
+&lt;h6 id="configured-coverage-relationship">Configured coverage relationship&lt;/h6>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/user/dubbo-config-override.jpg" alt="undefined">&lt;/p>
+&lt;p>Coverage diagram for configuration&lt;/p>
+&lt;p>It contains the configuration of the consumer side and the provider, pay attention to the distinction.&lt;/p>
+&lt;h4 id="annotation">annotation&lt;/h4>
+&lt;h6 id="reference-annotation-remote-service">Reference Annotation Remote Service&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">
+Public class AnnotationConsumeService {
+@com.alibaba.dubbo.config.annotation.Reference
+Public AnnotateService annotateService;
+// ...
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The configuration in this way is the same as the previous configuration in xml.&lt;/p>
+&lt;blockquote>
+&lt;p>To specify the way dubbo scans the path, refer to the implementation of the provider in the previous section.&lt;/p>
+&lt;/blockquote>
+&lt;h4 id="api-direct-trigger">api direct trigger&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">Import com.alibaba.dubbo.rpc.config.ApplicationConfig;
+Import com.alibaba.dubbo.rpc.config.RegistryConfig;
+Import com.alibaba.dubbo.rpc.config.ConsumerConfig;
+Import com.alibaba.dubbo.rpc.config.ReferenceConfig;
+Import com.xxx.XxxService;
+// current application configuration
+ApplicationConfig application = new ApplicationConfig();
+application.setName(&amp;#34;yyy&amp;#34;);
+// Connect to the registry configuration
+RegistryConfig registry = new RegistryConfig();
+registry.setAddress(&amp;#34;10.20.130.230:9090&amp;#34;);
+registry.setUsername(&amp;#34;aaa&amp;#34;);
+registry.setPassword(&amp;#34;bbb&amp;#34;);
+// Note: ReferenceConfig is a heavy object that internally encapsulates the connection to the registry and the connection to the service provider.
+// reference remote service
+ReferenceConfig&amp;lt;XxxService&amp;gt; reference = new ReferenceConfig&amp;lt;XxxService&amp;gt;(); // This instance is heavy, encapsulates the connection to the registry and the connection to the provider, please cache it yourself, otherwise it may cause memory and connection leaks.
+reference.setApplication(application);
+reference.setRegistry(registry); // Multiple registries can use setRegistries()
+reference.setInterface(XxxService.class);
+reference.setVersion(&amp;#34;1.0.0&amp;#34;);
+// Use xxxService like local beans
+XxxService xxxService = reference.get();
+&lt;/code>&lt;/pre>&lt;/div>&lt;h6 id="methodspecial-settings">methodSpecial settings&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">
+// Method level configuration
+List&amp;lt;MethodConfig&amp;gt; methods = new ArrayList&amp;lt;MethodConfig&amp;gt;();
+MethodConfig method = new MethodConfig();
+method.setName(&amp;#34;createXxx&amp;#34;);
+method.setTimeout(10000);
+method.setRetries(0);
+Methods.add(method);
+// reference remote service
+ReferenceConfig&amp;lt;XxxService&amp;gt; reference = new ReferenceConfig&amp;lt;XxxService&amp;gt;(); // This instance is heavy, encapsulates the connection to the registry and the connection to the provider, please cache it yourself, otherwise it may cause memory and connection leaks.
+...
+reference.setMethods(methods); // Set method level configuration
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="consumer-calling-remote-service">Consumer Calling Remote Service&lt;/h3>
+&lt;p>The above chapters are more from a configuration point of view, and then through a complete example, explain the complete use of dubbo consumer.&lt;/p>
+&lt;p>There is only one service UserReadService in this example, there is a method getUserById. Need to call a remote service through Dubbo. The specific steps are as follows:&lt;/p>
+&lt;ol>
+&lt;li>Create a project
+If there is already a project, you can ignore it. Create a spring boot project that can be created at &lt;a href="https://start.spring.io/">https://start.spring.io/&lt;/a>.
+The provider of the service has been defined in the provider section.&lt;/li>
+&lt;li>Call the service&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">@RestController
+Public class UserTestController{
+@Autowired
+Private UserReadService userReadService;
+@RequestMapping(&amp;#34;/user/getById&amp;#34;)
+Public String getUserById(Long id){
+// just test
+Return userReadService.getUserById(id).toString();
+}
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>3.Dubbo configuration&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">
+&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
+&amp;lt;beans xmlns=&amp;#34;http://www.springframework.org/schema/beans&amp;#34;
+Xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;
+Xmlns:dubbo=&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;
+Xsi:schemaLocation=&amp;#34;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&amp;#34;&amp;gt;
+&amp;lt;dubbo:application name=&amp;#34;hello-world-app&amp;#34; /&amp;gt;
+&amp;lt;dubbo:registry address=&amp;#34;multicast://224.5.6.7:1234&amp;#34; /&amp;gt;
+&amp;lt;dubbo:protocol name=&amp;#34;dubbo&amp;#34; port=&amp;#34;20880&amp;#34; /&amp;gt;
+&amp;lt;dubbo:reference id=&amp;#34;userReadService&amp;#34; interface=&amp;#34;com.package.UserReadService&amp;#34;check=&amp;#34;false&amp;#34; /&amp;gt;
+&amp;lt;/beans&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Other ways of configuring Dubbo can refer to the relevant configuration in the previous section, or use the integrated dubbo spring boot starter mode.&lt;/p></description></item><item><title>Blog: Dubbo: Several ways about synchronous/asynchronous invoke</title><link>http://dubbo.apache.org/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/</link><pubDate>Tue, 14 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/ [...]
+&lt;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:&lt;/p>
+&lt;ul>
+&lt;li>synchronous invoke&lt;/li>
+&lt;li>asynchronous invoke&lt;/li>
+&lt;li>parameters callback&lt;/li>
+&lt;li>event notification&lt;/li>
+&lt;/ul>
+&lt;h3 id="synchronous-invoke">Synchronous invoke&lt;/h3>
+&lt;p>Synchronous invoke is a kind of blocking invocation mode, that is the Consumer keeps blocking and waiting, until the Provider returns.&lt;/p>
+&lt;p>Generally, a typical synchronous invocation process is as follows:&lt;/p>
+&lt;ol>
+&lt;li>Consumer service thread invokes the remote API and sends requests to the Provider. Meanwhile, the current service thread stays in blocking state;&lt;/li>
+&lt;li>Provider process relative request after receiving it from Consumer. Then returns the results to Consumer;&lt;/li>
+&lt;li>After Consumer receiving results, the current thread continues to execute.&lt;/li>
+&lt;/ol>
+&lt;p>Here are two problems:&lt;/p>
+&lt;ol>
+&lt;li>How does Consumer service thread turn into &lt;code>blocking&lt;/code> state?&lt;/li>
+&lt;li>How does the service thread be awaked to execute after Consumer receiving results?&lt;/li>
+&lt;/ol>
+&lt;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 &lt;code>Future#get(timeout)&lt;/code> to block and wait for Provider returning results, with the &amp;lsquo;timeout&amp;rsquo; 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 r [...]
+&lt;h3 id="asynchronous-invoke">Asynchronous invoke&lt;/h3>
+&lt;p>For scenarios that Provider has a long response time, it&amp;rsquo;s necessary to implement asynchronous invoke based on Dubbo&amp;rsquo;s underlying asynchronous NIO. It could utilize the resource of Consumer effectively, and costs less than using multi-thread for Consumer.&lt;/p>
+&lt;p>Asynchronous invoke does not need specific configuration for Provider. In the example,the API of Provider is defined as follow:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">AsyncService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">goodbye&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="consumer-configuration">Consumer configuration&lt;/h5>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;asyncService&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.async.api.AsyncService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;goodbye&amp;#34;&lt;/span> async=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:reference&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Notice that if we need an asynchronous revoke method, we must use &lt;code>&amp;lt;dubbo:method/&amp;gt;&lt;/code> label to describe it.&lt;/p>
+&lt;h5 id="consumer-triggers-invocation">Consumer triggers invocation&lt;/h5>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">AsyncService service &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">...;&lt;/span>
+String result &lt;span style="color:#719e07">=&lt;/span> service&lt;span style="color:#719e07">.&lt;/span>goodbye&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;samples&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>&lt;span style="color:#586e75">// returns NULL and DO NOT use!
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>Future&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> future &lt;span style="color:#719e07">=&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">().&lt;/span>getFuture&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">...&lt;/span> &lt;span style="color:#586e75">// other service thread logic
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>result &lt;span style="color:#719e07">=&lt;/span> future&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span> &lt;span style="color:#586e75">// could use get(timeout, unit) to configure timeout, when it needs to get the asynchronous result
+&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After Dubbo Consumer triggers invocation, it uses &lt;code>RpcContext.getContext().getFuture()&lt;/code> to get the relative &lt;code>Future&lt;/code> object, and then it could start executing other tasks. Anytime when we need results, &lt;code>future.get(timeout)&lt;/code> is supposed to be called.&lt;/p>
+&lt;p>Under several special conditions, it could be set whether to wait for sending the request, to accelerate the return of invocation:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>sent=&amp;quot;true&amp;quot;&lt;/code> Waiting for sending the request, and return an exception if it fails;&lt;/li>
+&lt;li>&lt;code>sent=&amp;quot;false&amp;quot;&lt;/code> Do not wait for the request, and returns immediately after putting the request to the I/O queue.&lt;/li>
+&lt;/ul>
+&lt;p>We set it to &lt;code>false&lt;/code> by default. And detailed configuration is as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;goodbye&amp;#34;&lt;/span> async=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span> sent=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you only want to be asynchronous, then omit the result thoroughly, &lt;code>return=&amp;quot;false&amp;quot;&lt;/code> could be set to reduce the creation and management cost of Future:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;goodbye&amp;#34;&lt;/span> async=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span> return=&lt;span style="color:#2aa198">&amp;#34;false&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>At this time,&lt;code>RpcContext.getContext().getFuture()&lt;/code> will return &lt;code>null&lt;/code>。&lt;/p>
+&lt;p>The complete sequence diagram of asynchronous invoke is as follow:&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-async.svg" alt="Asynchronous invoke">&lt;/p>
+&lt;p>The sample locates at:https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-async&lt;/p>
+&lt;h3 id="parameters-callback">Parameters callback&lt;/h3>
+&lt;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.&lt;/p>
+&lt;h5 id="service-and-callback-definition-of-provider">Service and Callback definition of Provider&lt;/h5>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">CallbackService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">addListener&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String key&lt;span style="color:#719e07">,&lt;/span> CallbackListener listener&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">CallbackListener&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">changed&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String msg&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="service-implementation-of-provider">Service implementation of Provider&lt;/h5>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">CallbackServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> CallbackService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#268bd2">final&lt;/span> Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> CallbackListener&lt;span style="color:#719e07">&amp;gt;&lt;/span> listeners &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ConcurrentHashMap&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> CallbackListener [...]
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">CallbackServiceImpl&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread t &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> Runnable&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">run&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">while&lt;/span> &lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#cb4b16">true&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">for&lt;/span> &lt;span style="color:#719e07">(&lt;/span>Map&lt;span style="color:#719e07">.&lt;/span>Entry&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> CallbackListener&lt;span style="color:#719e07">&amp;gt;&lt;/span> entry &lt;span style="color:#719e07">:&lt;/span> listeners&lt;span style="color:#719e07">.&lt;/span>entrySet&lt;span style="color:#719e07">())&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+entry&lt;span style="color:#719e07">.&lt;/span>getValue&lt;span style="color:#719e07">().&lt;/span>changed&lt;span style="color:#719e07">(&lt;/span>getChanged&lt;span style="color:#719e07">(&lt;/span>entry&lt;span style="color:#719e07">.&lt;/span>getKey&lt;span style="color:#719e07">()));&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>Throwable t&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+listeners&lt;span style="color:#719e07">.&lt;/span>remove&lt;span style="color:#719e07">(&lt;/span>entry&lt;span style="color:#719e07">.&lt;/span>getKey&lt;span style="color:#719e07">());&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>5000&lt;span style="color:#719e07">);&lt;/span> &lt;span style="color:#586e75">// timely trigger change event
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>Throwable t&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+t&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">});&lt;/span>
+t&lt;span style="color:#719e07">.&lt;/span>setDaemon&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#cb4b16">true&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+t&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">addListener&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String key&lt;span style="color:#719e07">,&lt;/span> CallbackListener listener&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+listeners&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>key&lt;span style="color:#719e07">,&lt;/span> listener&lt;span style="color:#719e07">);&lt;/span>
+listener&lt;span style="color:#719e07">.&lt;/span>changed&lt;span style="color:#719e07">(&lt;/span>getChanged&lt;span style="color:#719e07">(&lt;/span>key&lt;span style="color:#719e07">));&lt;/span> &lt;span style="color:#586e75">// send notification for change
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> String &lt;span style="color:#268bd2">getChanged&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String key&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;Changed: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#719e07">new&lt;/span> SimpleDateFormat&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;yyyy-MM-dd HH:mm:ss&amp;#34;&lt;/span>&lt;span style="color:#719e07">).&lt;/span>format&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> Date&lt;span st [...]
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="service-exposure-of-provider">Service exposure of Provider&lt;/h5>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;callbackService&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.callback.impl.CallbackServiceImpl&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.callback.api.CallbackService&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;callbackService&amp;#34;&lt;/span> connections=&lt;span style="color:#2aa198">&amp;#34;1&amp;#34;&lt;/span> callbacks=&lt;span style="color:#2aa198">&amp;#34;1000&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;addListener&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:argument&lt;/span> index=&lt;span style="color:#2aa198">&amp;#34;1&amp;#34;&lt;/span> callback=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!--&amp;lt;dubbo:argument type=&amp;#34;com.demo.CallbackListener&amp;#34; callback=&amp;#34;true&amp;#34; /&amp;gt;--&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:method&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:service&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here,Provider needs to declare which parameter is the Callback parameter in the method.&lt;/p>
+&lt;h5 id="callback-interface-implementation-of-consumer">Callback interface implementation of Consumer&lt;/h5>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">CallbackService callbackService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">...;&lt;/span>
+callbackService&lt;span style="color:#719e07">.&lt;/span>addListener&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;foo.bar&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">new&lt;/span> CallbackListener&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">changed&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String msg&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;callback1:&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> msg&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">});&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;p>The sample code above is located at:https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-callback&lt;/p>
+&lt;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.&lt;/p>
+&lt;h3 id="event-notification">Event notification&lt;/h3>
+&lt;p>Event notification allows the Consumer triggering three events,particularly &lt;code>oninvoke&lt;/code>, &lt;code>onreturn&lt;/code>, &lt;code>onthrow&lt;/code> before calling, after calling or occurring exceptions.&lt;/p>
+&lt;p>You can specify which events need to be notified during configuring Consumer, such as:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoCallback&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.notify.impl.NotifyImpl&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:reference&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span> check=&lt;span style="color:#2aa198">&amp;#34;false&amp;#34;&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.notify.api.DemoService&amp;#34;&lt;/span> version=&lt;span style="color:#2aa198">&amp;#34;1.0.0&amp;#34;&lt;/span> group=&lt;span style="color:#2aa198">&amp;#34;cn&amp;#34;&lt;/span>&lt;span style="color:#2 [...]
+&lt;span style="color:#268bd2">&amp;lt;dubbo:method&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;sayHello&amp;#34;&lt;/span> onreturn=&lt;span style="color:#2aa198">&amp;#34;demoCallback.onreturn&amp;#34;&lt;/span> onthrow=&lt;span style="color:#2aa198">&amp;#34;demoCallback.onthrow&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:reference&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Among them,the code of NotifyImpl is as follow:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">NotifyImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> Notify&lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>Integer&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">&amp;gt;&lt;/span> ret &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> HashMap&lt;span style="color:#719e07">&amp;lt;&lt;/span>Integer&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">onreturn&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> id&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ret&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>id&lt;span style="color:#719e07">,&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;onreturn: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">onthrow&lt;/span>&lt;span style="color:#719e07">(&lt;/span>Throwable ex&lt;span style="color:#719e07">,&lt;/span> String name&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#dc322f">int&lt;/span> id&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;onthrow: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here we address that the parameter rules of three methods in the custom Notify interface are as follows:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>oninvoke&lt;/code> method&amp;rsquo;s parameters are the same as the calling method parameters;&lt;/li>
+&lt;li>&lt;code>onreturn&lt;/code> method&amp;rsquo;s first parameter is the returned value of calling method,and the others are the same as the calling method;&lt;/li>
+&lt;li>&lt;code>onthrow&lt;/code> method&amp;rsquo;s first parameter is an invoked exception,and the others are the same as the calling method.&lt;/li>
+&lt;/ul>
+&lt;p>In the above configuration, &lt;code>sayHello&lt;/code> method is an asynchronous invocation, so the execution of event notification method is also synchronous. You can configure the &lt;code>async = true&lt;/code> to make method invocation asynchronous, at this moment, event notification method is executed asynchronously. Especially emphasize that &lt;code>oninvoke&lt;/code> method is executed synchronously, whether is an asynchronous call or not.&lt;/p>
+&lt;p>Please refer to the sample code for event notification:https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-notify&lt;/p></description></item><item><title>Blog: Dubbo Basic Usage -- Dubbo Provider Configuration</title><link>http://dubbo.apache.org/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/</link><pubDate>Tue, 14 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/14/dubbo-basic-usage-dubbo-provider-configuration/</guid> [...]
+&lt;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.&lt;/p>
+&lt;h2 id="dubbo-provider-configuration">Dubbo Provider Configuration&lt;/h2>
+&lt;h3 id="provider-configuration-in-detail">Provider Configuration in Detail&lt;/h3>
+&lt;p>The configuration mode of Dubbo Provider has 4 different ways: XML Configuration, Properties Configuration, API Invocation Mode Configuration and Annotation Configuration.&lt;/p>
+&lt;h4 id="xml-configuration">XML Configuration&lt;/h4>
+&lt;h6 id="the-simplest-configuration-example">The simplest configuration example:&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
+&amp;lt;beans xmlns=&amp;#34;http://www.springframework.org/schema/beans&amp;#34;
+xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;
+xmlns:dubbo=&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;
+xsi:schemaLocation=&amp;#34;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&amp;#34;&amp;gt;
+&amp;lt;dubbo:application name=&amp;#34;hello-world-app&amp;#34; /&amp;gt;
+&amp;lt;dubbo:registry address=&amp;#34;multicast://224.5.6.7:1234&amp;#34; /&amp;gt;
+&amp;lt;dubbo:protocol name=&amp;#34;dubbo&amp;#34; port=&amp;#34;20880&amp;#34; /&amp;gt;
+&amp;lt;dubbo:service interface=&amp;#34;com.alibaba.dubbo.demo.DemoService&amp;#34; ref=&amp;#34;demoServiceLocal&amp;#34; /&amp;gt;
+&amp;lt;dubbo:reference id=&amp;#34;demoServiceRemote&amp;#34; interface=&amp;#34;com.alibaba.dubbo.demo.DemoService&amp;#34; /&amp;gt;
+&amp;lt;/beans&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>In the example above,note the way to write dubbo schema:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;beans xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;
+xmlns:dubbo=&amp;#34;http://code.alibabatech.com/schema/dubbo&amp;#34;
+xmlns=&amp;#34;http://www.springframework.org/schema/beans&amp;#34;
+xsi:schemaLocation=&amp;#34;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&amp;#34;&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;h6 id="supported-configuration-tags">Supported Configuration Tags&lt;/h6>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Tags&lt;/th>
+&lt;th>Application&lt;/th>
+&lt;th style="text-align:left">Describe&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:service/&amp;gt;&lt;/td>
+&lt;td>Service Configuration&lt;/td>
+&lt;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&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:reference/&amp;gt;&lt;/td>
+&lt;td>Reference Configuration&lt;/td>
+&lt;td style="text-align:left">Create a remote service agent, one reference can point to multiple registry centers&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:protocol/&amp;gt;&lt;/td>
+&lt;td>Protocol Configuration&lt;/td>
+&lt;td style="text-align:left">Configure protocol information for providing services, protocol is specified by the provider and accepted passively by the consumer&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:application/&amp;gt;&lt;/td>
+&lt;td>Application Configuration&lt;/td>
+&lt;td style="text-align:left">Configure current application information, regardless of whether the application is provider or consumer&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:module/&amp;gt;&lt;/td>
+&lt;td>Module Configuration&lt;/td>
+&lt;td style="text-align:left">Configure current module information. Optional&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:registry/&amp;gt;&lt;/td>
+&lt;td>Registry Center Configuration&lt;/td>
+&lt;td style="text-align:left">Configure information related to connect registry centers&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:monitor/&amp;gt;&lt;/td>
+&lt;td>Monitoring Center Configuration&lt;/td>
+&lt;td style="text-align:left">Configure information related to connect monitor centers. Optional&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:provider/&amp;gt;&lt;/td>
+&lt;td>Provider Configuration&lt;/td>
+&lt;td style="text-align:left">When some properties ProtocolConfig or ServiceConfig are not configured, use this default value. Optional&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:consumer/&amp;gt;&lt;/td>
+&lt;td>Consumer Configuration&lt;/td>
+&lt;td style="text-align:left">When some properties of ReferenceConfig are not configured, use this default value. Optional&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:method/&amp;gt;&lt;/td>
+&lt;td>Method Configuration&lt;/td>
+&lt;td style="text-align:left">Configure specific method level information of ServiceConfig and ReferenceConfig&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>&amp;lt;dubbo:argument/&amp;gt;&lt;/td>
+&lt;td>Parameter Configuration&lt;/td>
+&lt;td style="text-align:left">Configure parameters of specific method&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/user/dubbo-config.jpg" alt="undefined">&lt;/p>
+&lt;p>Configuration Diagram&lt;/p>
+&lt;h6 id="configuration-item-in-detail">Configuration item in detail&lt;/h6>
+&lt;ul>
+&lt;li>
+&lt;p>&amp;lt;dubbo:application name=&amp;ldquo;hello-world-app&amp;rdquo; /&amp;gt;&lt;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.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>&amp;lt;dubbo:registry address=&amp;ldquo;multicast://224.5.6.7:1234&amp;rdquo; /&amp;gt;&lt;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.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>&amp;lt;dubbo:protocol name=&amp;ldquo;dubbo&amp;rdquo; port=&amp;ldquo;20880&amp;rdquo; /&amp;gt;&lt;br>
+Here is the transport protocol and the default port, generally no changes are required.&lt;/p>
+&lt;/li>
+&lt;/ul>
+&lt;blockquote>
+&lt;p>Next, we will focus on the configuration of &amp;lt;dubbo:service/&amp;gt;&lt;/p>
+&lt;/blockquote>
+&lt;ul>
+&lt;li>&amp;lt;dubbo:service/&amp;gt;mainly supports the following properties:&lt;/li>
+&lt;/ul>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Properties Name&lt;/th>
+&lt;th>Description&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>version&lt;/td>
+&lt;td>Version number&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>scope&lt;/td>
+&lt;td>Service visibility, value can be local or remote,remote by default&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>actives&lt;/td>
+&lt;td>Maximum number of activated requests&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>async&lt;/td>
+&lt;td>Whether the method called asynchronously,false by default&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>cache&lt;/td>
+&lt;td>Service cache,optional value:lru/threadlocal/jcache&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>callbacks&lt;/td>
+&lt;td>Limitation of callback instance&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>generic&lt;/td>
+&lt;td>Generalized calls which can be bypassed&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>class&lt;/td>
+&lt;td>The implementation of the service&amp;rsquo;s class name&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>connections&lt;/td>
+&lt;td>The number of connections in the service&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>delay&lt;/td>
+&lt;td>The number of milliseconds delay for publicating the service&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>executes&lt;/td>
+&lt;td>Upper bound of service execution requests&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>retries&lt;/td>
+&lt;td>Timeout retry times&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>timeout&lt;/td>
+&lt;td>Invocation timeout time&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;p>For other configuration properties, please refer to xsd:http://dubbo.apache.org/schema/dubbo/dubbo.xsd&lt;/p>
+&lt;ul>
+&lt;li>&amp;lt;dubbo:method/&amp;gt; as the sub-element of &amp;lt;dubbo:service/&amp;gt; can be configured corresponding to method. Properties that are commonly used are:&lt;/li>
+&lt;/ul>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Properties Name&lt;/th>
+&lt;th>Description&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>executes&lt;/td>
+&lt;td>Upper bound of service execution requests&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>retries&lt;/td>
+&lt;td>Timeout retry times&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>timeout&lt;/td>
+&lt;td>Invocation timeout time&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;p>For other properties,you can refer to xsd above。&lt;/p>
+&lt;h6 id="configuration-override-relationship">Configuration Override Relationship&lt;/h6>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/user/dubbo-config-override.jpg" alt="undefined">&lt;/p>
+&lt;p>Configuration Coverage Relationship Diagram&lt;/p>
+&lt;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.&lt;/p>
+&lt;h4 id="dubboproperties-configuration">dubbo.properties Configuration&lt;/h4>
+&lt;blockquote>
+&lt;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.&lt;/p>
+&lt;/blockquote>
+&lt;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.&lt;/p>
+&lt;h6 id="dubboproperties-configuration-example">dubbo.properties Configuration example&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback"># 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
+&lt;/code>&lt;/pre>&lt;/div>&lt;h6 id="mapping-rule">Mapping Rule&lt;/h6>
+&lt;p>Split the tag name and properties in XML configuration with dots, and multiple properties should be split into multiple lines&lt;/p>
+&lt;ul>
+&lt;li>For example: dubbo.application.name=foo equivalents to &amp;lt;dubbo:application name=&amp;ldquo;foo&amp;rdquo; /&amp;gt;&lt;/li>
+&lt;li>For example: dubbo.registry.address=10.20.153.10:9090 equivalents to &amp;lt;dubbo:registry address=&amp;ldquo;10.20.153.10:9090&amp;rdquo; /&amp;gt;&lt;/li>
+&lt;/ul>
+&lt;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.&lt;/p>
+&lt;ul>
+&lt;li>For example: dubbo.protocol.rmi.port=1234 equivalents to &amp;lt;dubbo:protocol id=&amp;ldquo;rmi&amp;rdquo; name=&amp;ldquo;rmi&amp;rdquo; port=&amp;ldquo;1234&amp;rdquo; /&amp;gt;&lt;/li>
+&lt;li>For example: dubbo.registry.china.address=10.20.153.10:9090 equivalents to &amp;lt;dubbo:registry id=&amp;ldquo;china&amp;rdquo; address=&amp;ldquo;10.20.153.10:9090&amp;rdquo; /&amp;gt;&lt;/li>
+&lt;/ul>
+&lt;h6 id="coverage-strategy">Coverage Strategy&lt;/h6>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/user/dubbo-config.jpg" alt="undefined">&lt;/p>
+&lt;ul>
+&lt;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.&lt;/li>
+&lt;li>Then comes to XML, the configurations in dubbo.properties are invalid, if they are configured in XML.&lt;/li>
+&lt;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.&lt;/li>
+&lt;/ul>
+&lt;blockquote>
+&lt;p>Note:&lt;/p>
+&lt;/blockquote>
+&lt;ol>
+&lt;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.↩&lt;/li>
+&lt;li>When the protocol&amp;rsquo;s id is not configured, protocol name will be used as id as default.&lt;/li>
+&lt;/ol>
+&lt;h4 id="annotation">Annotation&lt;/h4>
+&lt;h6 id="service-annotation-exposure-service">Service Annotation Exposure Service&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">import com.alibaba.dubbo.config.annotation.Service;
+@Service(timeout = 5000)
+public class AnnotateServiceImpl implements AnnotateService {
+// ...
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;h6 id="javaconfig-configuration-public-module">Javaconfig Configuration Public Module&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">@Configuration
+public class DubboConfiguration {
+@Bean
+public ApplicationConfig applicationConfig() {
+ApplicationConfig applicationConfig = new ApplicationConfig();
+applicationConfig.setName(&amp;#34;provider-test&amp;#34;);
+return applicationConfig;
+}
+@Bean
+public RegistryConfig registryConfig() {
+RegistryConfig registryConfig = new RegistryConfig();
+registryConfig.setAddress(&amp;#34;zookeeper://127.0.0.1:2181&amp;#34;);
+registryConfig.setClient(&amp;#34;curator&amp;#34;);
+return registryConfig;
+}
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The result of configuration using this method is the same as that of using xml.&lt;/p>
+&lt;h6 id="specify-the-dubbo-scan-path">Specify the Dubbo Scan Path&lt;/h6>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">@SpringBootApplication
+@DubboComponentScan(basePackages = &amp;#34;com.alibaba.dubbo.test.service.impl&amp;#34;)
+public class ProviderTestApp {
+// ...
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>or use the spring bean xml configuration:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:annotation package=&amp;#34;com.chanshuyi.service.impl&amp;#34; /&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="api-trigger-directly">API Trigger Directly&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">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(&amp;#34;xxx&amp;#34;);
+// connect to registry center configuration
+RegistryConfig registry = new RegistryConfig();
+registry.setAddress(&amp;#34;10.20.130.230:9090&amp;#34;);
+registry.setUsername(&amp;#34;aaa&amp;#34;);
+registry.setPassword(&amp;#34;bbb&amp;#34;);
+// service provider&amp;#39;s protocol configuration
+ProtocolConfig protocol = new ProtocolConfig();
+protocol.setName(&amp;#34;dubbo&amp;#34;);
+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&amp;lt;XxxService&amp;gt; service = new ServiceConfig&amp;lt;XxxService&amp;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(&amp;#34;1.0.0&amp;#34;);
+// exposure and register service
+service.export();
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;h3 id="provider-interface-and-implement">Provider Interface and Implement&lt;/h3>
+&lt;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.&lt;/p>
+&lt;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:&lt;/p>
+&lt;ol>
+&lt;li>Create Project
+Skip this step if there is already a project. Create a Spring Boot project, which can be created through &lt;a href="https://start.spring.io/">https://start.spring.io/&lt;/a>.&lt;/li>
+&lt;li>Define Interface
+Define interface: UserReadService&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">public interface UserReadService{
+public User getUserById(Long userId);
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;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&amp;rsquo;s application.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">public UserReadServiceImpl implements UserReadService{
+public User getUserById(Long userId){
+return xxx;
+}
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
+&lt;li>Dubbo Configuration&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
+&amp;lt;beans xmlns=&amp;#34;http://www.springframework.org/schema/beans&amp;#34;
+xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;
+xmlns:dubbo=&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;
+xsi:schemaLocation=&amp;#34;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&amp;#34;&amp;gt;
+&amp;lt;dubbo:application name=&amp;#34;hello-world-app&amp;#34; /&amp;gt;
+&amp;lt;dubbo:registry address=&amp;#34;multicast://224.5.6.7:1234&amp;#34; /&amp;gt;
+&amp;lt;dubbo:protocol name=&amp;#34;dubbo&amp;#34; port=&amp;#34;20880&amp;#34; /&amp;gt;
+&amp;lt;bean id=&amp;#34;userReadService&amp;#34; class=&amp;#34;com.package.UserReadServiceImpl&amp;#34;/&amp;gt;
+&amp;lt;dubbo:service interface=&amp;#34;com.package.UserReadService&amp;#34; ref=&amp;#34;userReadService&amp;#34; /&amp;gt;
+&amp;lt;/beans&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p></description></item><item><title>Blog: Manipulating Services Dynamically via QoS</title><link>http://dubbo.apache.org/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/</link><pubDate>Tue, 14 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/1 [...]
+&lt;h1 id="manipulating-services-dynamically-via-qos">Manipulating Services Dynamically via QoS&lt;/h1>
+&lt;p>QoS (short form of &lt;strong>Quality of Service&lt;/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.&lt;/p>
+&lt;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).&lt;/p>
+&lt;h2 id="mechanism-of-qos">Mechanism of QoS&lt;/h2>
+&lt;p>From 2.5.8, QoS is introduced into Dubbo and is activated by default. All QoS&amp;rsquo;s features are abstracted to commands, which could be executed to get responses from QoS.&lt;/p>
+&lt;blockquote>
+&lt;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 &lt;a href="http://start.dubbo.io">http://start.dubbo.io&lt;/a>, there&amp;rsquo;s no need to add configurations because Netty4 is listed as a dependency by default.&lt;/p>
+&lt;/blockquote>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/qos-architecture.png" alt="undefined">&lt;/p>
+&lt;p>The picture above shows how QoS works:&lt;/p>
+&lt;ol>
+&lt;li>Start and listen to a port (22222 by default).&lt;/li>
+&lt;li>Choose a corresponding request handler by detecting the protocol (telnet or http) a request comply with.&lt;/li>
+&lt;li>Decode and parse the request to generate corresponding command according to the protocol.&lt;/li>
+&lt;li>Execute commands and return with responses.&lt;/li>
+&lt;/ol>
+&lt;h3 id="qos-commands">QoS Commands:&lt;/h3>
+&lt;p>Commands that QoS supports at the current moment include:&lt;/p>
+&lt;ul>
+&lt;li>&lt;code>help&lt;/code>, list available commands&lt;/li>
+&lt;li>&lt;code>ls&lt;/code>: list all active provider services and consumer services&lt;/li>
+&lt;li>&lt;code>online&lt;/code>: dynamically register a service or all services to registration center&lt;/li>
+&lt;li>&lt;code>offline&lt;/code>: dynamically remove (unregister) a services or all services from registration center&lt;/li>
+&lt;li>&lt;code>quit&lt;/code>: quit the current telnet session&lt;/li>
+&lt;/ul>
+&lt;p>Now we are going to demonstrate how to manipulate services dynamically via QoS.&lt;/p>
+&lt;h4 id="access-qos-via-telnet">Access QoS via Telnet&lt;/h4>
+&lt;p>Assuming that our Dubbo server has started, connect to it via telnet:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">$ telnet localhost &lt;span style="color:#2aa198">22222&lt;/span>
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is &lt;span style="color:#2aa198">&amp;#39;^]&amp;#39;&lt;/span>.
+????????? ??? ?? ??????????? ??????????? ????????
+??? ???? ??? ??? ??? ??? ??? ??? ??? ???
+??? ??? ??? ??? ??? ??? ??? ??? ??? ???
+??? ??? ??? ??? ?????????? ?????????? ??? ???
+??? ??? ??? ??? ??????????? ??????????? ??? ???
+??? ??? ??? ??? ??? ??? ??? ??? ??? ???
+??? ???? ??? ??? ??? ??? ??? ??? ??? ???
+????????? ????????? ??????????? ??????????? ????????
+dubbo&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>A &lt;code>dubbo&amp;gt;&lt;/code> prompt would show up once you connect to server. Now input &lt;code>help&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">dubbo&amp;gt;help
++---------+----------------------------------------------------------------------------------+
+| &lt;span style="color:#b58900">help&lt;/span> | &lt;span style="color:#b58900">help&lt;/span> &lt;span style="color:#b58900">command&lt;/span> |
++---------+----------------------------------------------------------------------------------+
+| ls | ls service |
++---------+----------------------------------------------------------------------------------+
+| offline | offline dubbo |
++---------+----------------------------------------------------------------------------------+
+| online | online dubbo |
++---------+----------------------------------------------------------------------------------+
+| quit | quit telnet console |
++---------+----------------------------------------------------------------------------------+
+dubbo&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>This command lists all available commands with explanations.&lt;/p>
+&lt;p>You can also use &lt;code>help&lt;/code> to a specific command to read examples of that command.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">dubbo&amp;gt;help online
++--------------+----------------------------------------------------------------------------------+
+| COMMAND NAME | online |
++--------------+----------------------------------------------------------------------------------+
+| EXAMPLE | online dubbo |
+| | online xx.xx.xxx.service |
++--------------+----------------------------------------------------------------------------------+
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Use &lt;code>ls&lt;/code> to check services' status:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">dubbo&amp;gt;ls
+As Provider side:
++------------------------------------------+---+
+| Provider Service Name |PUB|
++------------------------------------------+---+
+|org.apache.dubbo.demo.provider.DemoService| Y |
++------------------------------------------+---+
+As Consumer side:
++---------------------+---+
+|Consumer Service Name|NUM|
++---------------------+---+
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>There is a service named &lt;code>org.apache.dubbo.demo.provider.DemoService&lt;/code> in the provider side. &lt;code>PUB=Y&lt;/code> in the second columns means that the service has been published to the registration center, waiting to be called by the consumer side.&lt;/p>
+&lt;p>Assuming that we need to withdraw a service dynamically, we can use &lt;code>offline&lt;/code> command:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">dubbo&amp;gt;offline org.apache.dubbo.demo.provider.DemoService
+OK
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can see that the command responds with &lt;code>OK&lt;/code>. Check the services' status using &lt;code>ls&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">dubbo&amp;gt;ls
+As Provider side:
++------------------------------------------+---+
+| Provider Service Name |PUB|
++------------------------------------------+---+
+|org.apache.dubbo.demo.provider.DemoService| N |
++------------------------------------------+---+
+As Consumer side:
++---------------------+---+
+|Consumer Service Name|NUM|
++---------------------+---+
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can see that &lt;code>PUB&lt;/code> of &lt;code>org.apache.dubbo.demo.provider.DemoService&lt;/code> has been set to &lt;code>N&lt;/code>.&lt;/p>
+&lt;p>Quit the current telnet session using &lt;code>quit&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">dubbo&amp;gt;quit
+BYE!
+Connection closed by foreign host.
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="access-qos-via-http">Access QoS via HTTP&lt;/h4>
+&lt;p>In the example above we performed an offline action to &lt;code>org.apache.dubbo.demo.provider.DemoService&lt;/code>. Now we are going to demonstrate how to register the service above via HTTP.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">$ curl -i http://localhost:22222/online?service&lt;span style="color:#719e07">=&lt;/span>org.apache.dubbo.demo.provider.DemoService
+HTTP/1.1 &lt;span style="color:#2aa198">200&lt;/span> OK
+Content-Type: text/plain
+Content-Length: &lt;span style="color:#2aa198">2&lt;/span>
+OK%
+&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
+&lt;p>Beware of the parameters of online action. They need to be provided in the form of &lt;code>key=value&lt;/code>. However, &lt;code>key&lt;/code> would be ignored actually.&lt;/p>
+&lt;/blockquote>
+&lt;p>The action responds with &lt;code>OK&lt;/code>. Now use &lt;code>ls&lt;/code> to check providers' status at the current moment.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">$ 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|
++---------------------+---+
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can see that the service&amp;rsquo;s &lt;code>PUB&lt;/code> status has been changed to &lt;code>Y&lt;/code>.&lt;/p>
+&lt;h3 id="qos-parameters">QoS' Parameters&lt;/h3>
+&lt;p>You can use parameters that QoS provides to config its startup. These parameters include:&lt;/p>
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Parameter&lt;/th>
+&lt;th>Explanation&lt;/th>
+&lt;th>Default&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>qosEnable&lt;/td>
+&lt;td>Activate QoS or not&lt;/td>
+&lt;td>true&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>qosPort&lt;/td>
+&lt;td>The port QoS would bind to&lt;/td>
+&lt;td>22222&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>qosAcceptForeignIp&lt;/td>
+&lt;td>Enable remote access or not&lt;/td>
+&lt;td>false&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;blockquote>
+&lt;p>Attention. From 2.6.4/2.7.0, &lt;code>qosAcceptForeignIp&lt;/code> is set to &lt;code>false&lt;/code> by default, because it&amp;rsquo;s risky if this property is set to &lt;code>true&lt;/code>. Think twice before you turn it on.&lt;/p>
+&lt;/blockquote>
+&lt;p>You can configure these parameters in the following ways:&lt;/p>
+&lt;ul>
+&lt;li>System property&lt;/li>
+&lt;li>&lt;code>dubbo.properties&lt;/code>&lt;/li>
+&lt;li>XML&lt;/li>
+&lt;li>Spring-boot auto configuration&lt;/li>
+&lt;/ul>
+&lt;p>They have priority in the following order: system property &amp;gt; &lt;code>dubbo.properties&lt;/code> &amp;gt; XML &amp;gt; spring-boot.&lt;/p>
+&lt;h4 id="system-property">System Property&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">-Ddubbo.application.qos.enable=true
+-Ddubbo.application.qos.port=33333
+-Ddubbo.application.qos.accept.foreign.ip=false
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="dubboproperties">&lt;code>Dubbo.properties&lt;/code>&lt;/h4>
+&lt;p>Create a &lt;code>dubbo.properties&lt;/code> file in this directory &lt;code>src/main/resources&lt;/code> in your project, and copy the following codes into it:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">dubbo.application.qos.enable=true
+dubbo.application.qos.port=33333
+dubbo.application.qos.accept.foreign.ip=false
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="xml">XML&lt;/h4>
+&lt;p>If you are going to config using XML, you can try this:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#719e07">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;beans&lt;/span> xmlns=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans&amp;#34;&lt;/span>
+xmlns:xsi=&lt;span style="color:#2aa198">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
+xmlns:dubbo=&lt;span style="color:#2aa198">&amp;#34;http://dubbo.apache.org/schema/dubbo&amp;#34;&lt;/span>
+xsi:schemaLocation=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans
+&lt;/span>&lt;span style="color:#2aa198"> http://www.springframework.org/schema/beans/spring-beans.xsd
+&lt;/span>&lt;span style="color:#2aa198"> http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:application&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;demo-provider&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:parameter&lt;/span> key=&lt;span style="color:#2aa198">&amp;#34;qos.enable&amp;#34;&lt;/span> value=&lt;span style="color:#2aa198">&amp;#34;true&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:parameter&lt;/span> key=&lt;span style="color:#2aa198">&amp;#34;qos.accept.foreign.ip&amp;#34;&lt;/span> value=&lt;span style="color:#2aa198">&amp;#34;false&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:parameter&lt;/span> key=&lt;span style="color:#2aa198">&amp;#34;qos.port&amp;#34;&lt;/span> value=&lt;span style="color:#2aa198">&amp;#34;33333&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/dubbo:application&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:registry&lt;/span> address=&lt;span style="color:#2aa198">&amp;#34;multicast://224.5.6.7:1234&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;20880&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.provider.DemoService&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoService&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;org.apache.dubbo.demo.provider.DemoServiceImpl&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/beans&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="spring-boot-auto-configuration">&lt;code>spring-boot&lt;/code> auto configuration&lt;/h4>
+&lt;p>If you are developing a spring-boot application, you can configure in &lt;code>application.properties&lt;/code> or &lt;code>application.yml&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">dubbo.application.qosEnable=true
+dubbo.application.qosPort=33333
+dubbo.application.qosAcceptForeignIp=false
+&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blog: Source code analysis of spring-boot+Dubbo App start and stop</title><link>http://dubbo.apache.org/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/</link><pubDate>Tue, 14 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/</guid><description>
+&lt;h2 id="introduction">Introduction&lt;/h2>
+&lt;p>&lt;a href="https://github.com/apache/dubbo-spring-boot-project">Dubbo Spring Boot&lt;/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:&lt;/p>
+&lt;ul>
+&lt;li>&lt;a href="https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure">Autoconfigure&lt;/a> (ex: Annotation driver, Autoconfigure, etc.)&lt;/li>
+&lt;li>&lt;a href="https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator">Production-Ready&lt;/a> (ex: Security, Healthy check, Externalize configuration, etc.)&lt;/li>
+&lt;/ul>
+&lt;h2 id="the-analysis-of-dubboconsumer-startup">The analysis of DubboConsumer startup&lt;/h2>
+&lt;p>Have you ever thought about this : since the &lt;code>DubboConsumerDemo&lt;/code> application in &lt;code>dubbo-spring-boot-project&lt;/code> has only one line of code, why not just exit directly when the &lt;code>main&lt;/code> method is executed?&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@SpringBootApplication&lt;/span>&lt;span style="color:#719e07">(&lt;/span>scanBasePackages &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;com.alibaba.boot.dubbo.demo.consumer.controller&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DubboConsumerDemo&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+SpringApplication&lt;span style="color:#719e07">.&lt;/span>run&lt;span style="color:#719e07">(&lt;/span>DubboConsumerDemo&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">,&lt;/span>args&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>In fact, to answer this question, we need to abstract it first, that is, under what circumstances will a JVM process exit?&lt;/p>
+&lt;p>Take Java 8 as an example. By referring to the JVM language specification[1], there is a clear description in Section 12.8:&lt;/p>
+&lt;blockquote>
+&lt;p>A program terminates all its activity and &lt;em>exits&lt;/em> when one of two things happens:&lt;/p>
+&lt;ul>
+&lt;li>All the threads that are not daemon threads terminate.&lt;/li>
+&lt;li>Some thread invokes the &lt;code>exit&lt;/code> method of class &lt;code>Runtime&lt;/code> or class &lt;code>System&lt;/code>, and the &lt;code>exit&lt;/code> operation is not forbidden by the security manager.&lt;/li>
+&lt;/ul>
+&lt;/blockquote>
+&lt;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 &lt;code>jstack&lt;/code>, including whether they are daemon threads, and &lt;code>jstack&lt;/code> can be used to find out which threads are non-daemon.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">➜ jstack &lt;span style="color:#2aa198">57785&lt;/span> | grep tid | grep -v &lt;span style="color:#2aa198">&amp;#34;daemon&amp;#34;&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;container-0&amp;#34;&lt;/span> &lt;span style="color:#586e75">#37 prio=5 os_prio=31 tid=0x00007fbe312f5800 nid=0x7103 waiting on condition [0x0000700010144000]&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;container-1&amp;#34;&lt;/span> &lt;span style="color:#586e75">#49 prio=5 os_prio=31 tid=0x00007fbe3117f800 nid=0x7b03 waiting on condition [0x0000700010859000]&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;DestroyJavaVM&amp;#34;&lt;/span> &lt;span style="color:#586e75">#83 prio=5 os_prio=31 tid=0x00007fbe30011000 nid=0x2703 waiting on condition [0x0000000000000000]&lt;/span>
+&lt;span style="color:#2aa198">&amp;#34;VM Thread&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe3005e800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x3703 runnable
+&lt;span style="color:#2aa198">&amp;#34;GC Thread#0&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe30013800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x5403 runnable
+&lt;span style="color:#2aa198">&amp;#34;GC Thread#1&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe30021000 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x5303 runnable
+&lt;span style="color:#2aa198">&amp;#34;GC Thread#2&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe30021800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x2d03 runnable
+&lt;span style="color:#2aa198">&amp;#34;GC Thread#3&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe30022000 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x2f03 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Main Marker&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe30040800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x5203 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Conc#0&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe30041000 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x4f03 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Refine#0&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe31044800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x4e03 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Refine#1&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe31045800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x4d03 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Refine#2&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe31046000 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x4c03 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Refine#3&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe31047000 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x4b03 runnable
+&lt;span style="color:#2aa198">&amp;#34;G1 Young RemSet Sampling&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe31047800 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x3603 runnable
+&lt;span style="color:#2aa198">&amp;#34;VM Periodic Task Thread&amp;#34;&lt;/span> &lt;span style="color:#268bd2">os_prio&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">31&lt;/span> &lt;span style="color:#268bd2">tid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x00007fbe31129000 &lt;span style="color:#268bd2">nid&lt;/span>&lt;span style="color:#719e07">=&lt;/span>0x6703 waiting on condition
+&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
+&lt;p>We can find all the thread digests by &lt;code>grep tid&lt;/code> here, and find the line that doesn&amp;rsquo;t contain the daemon keyword by &lt;code>grep -v&lt;/code> command.&lt;/p>
+&lt;/blockquote>
+&lt;p>We can get some information from the above results:&lt;/p>
+&lt;ul>
+&lt;li>There are two &amp;ldquo;suspicious&amp;rdquo; threads : &lt;code>container-0&lt;/code>, &lt;code>container-1&lt;/code>. They are non-daemon thread in wait state.&lt;/li>
+&lt;li>There are alse some threads about GC, and threads that start with &lt;code>VM&lt;/code>. They are also some non-daemon threads, but they are most likely the JVM&amp;rsquo;s own threads, which we can ignore for now.&lt;/li>
+&lt;/ul>
+&lt;p>In summary, we can infer that it is likely that the &lt;code>container-0&lt;/code> and &lt;code>container-1&lt;/code> cause the JVM to not exit. Now let&amp;rsquo;s search through the source code to find out who created the two threads.&lt;/p>
+&lt;p>By the source code analysis of Spring-boot, we can find these code in the &lt;code>startDaemonAwaitThread&lt;/code> method of &lt;code>org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer&lt;/code>.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java"> &lt;span style="color:#268bd2">private&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">startDaemonAwaitThread&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread awaitThread &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;container-&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#719e07">(&lt;/span>containerCounter&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">()))&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">run&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+TomcatEmbeddedServletContainer&lt;span style="color:#719e07">.&lt;/span>this&lt;span style="color:#719e07">.&lt;/span>tomcat&lt;span style="color:#719e07">.&lt;/span>getServer&lt;span style="color:#719e07">().&lt;/span>await&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">};&lt;/span>
+awaitThread&lt;span style="color:#719e07">.&lt;/span>setContextClassLoader&lt;span style="color:#719e07">(&lt;/span>getClass&lt;span style="color:#719e07">().&lt;/span>getClassLoader&lt;span style="color:#719e07">());&lt;/span>
+awaitThread&lt;span style="color:#719e07">.&lt;/span>setDaemon&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#cb4b16">false&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+awaitThread&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Let&amp;rsquo;s add a breakpoint in this method, and focus on the call stack:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-plain" data-lang="plain">initialize:115, TomcatEmbeddedServletContainer (org.springframework.boot.context.embedded.tomcat)
+&amp;lt;init&amp;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)
+&lt;/code>&lt;/pre>&lt;/div>&lt;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 st [...]
+&lt;p>Let&amp;rsquo;s dig deeper to find out how the thread stay alive in Tomcat&amp;rsquo;s &lt;code>this.tomcat.getServer().await()&lt;/code> method.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">await&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// ...
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">if&lt;/span>&lt;span style="color:#719e07">(&lt;/span> port&lt;span style="color:#719e07">==-&lt;/span>1 &lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+awaitThread &lt;span style="color:#719e07">=&lt;/span> Thread&lt;span style="color:#719e07">.&lt;/span>currentThread&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">while&lt;/span>&lt;span style="color:#719e07">(!&lt;/span>stopAwait&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span> 10000 &lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span>&lt;span style="color:#719e07">(&lt;/span> InterruptedException ex &lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// continue and check the flag
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">finally&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+awaitThread &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#586e75">// ...
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>In the await method, the current thread checks the variable &lt;code>stopAwait&lt;/code> every 10 seconds in a while loop. It is a &lt;code>volatile&lt;/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 applicat [...]
+&lt;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 &lt;code>container-0&lt;/code> and &lt;code>container-1&lt;/code>.&lt;/p>
+&lt;p>Next, let&amp;rsquo;s see how this Spring-boot application exits.&lt;/p>
+&lt;h2 id="the-analysis-of-dubboconsumer-exit">The analysis of DubboConsumer exit&lt;/h2>
+&lt;p>As mentioned in the previous description, there is a thread that checks the variable &lt;code>stopAwait&lt;/code> continuously. So there must be a thread to modify &lt;code>stopAwait&lt;/code> at Stop, thus break the while loop. But who is modifying this variable?&lt;/p>
+&lt;p>By analyzing the source code, we can see that there is only one method that modifies &lt;code>stopAwait&lt;/code> : &lt;code>org.apache.catalina.core.StandardServer#stopAwait&lt;/code>. To figure out who is calling this method, we add a breakpoint here.&lt;/p>
+&lt;blockquote>
+&lt;p>Note that after adding a breakpoint in Intellij IDEA&amp;rsquo;s Debug mode, we also need to type &lt;code>kill -s INT $PID&lt;/code> or &lt;code>kill -s TERM $PID&lt;/code> in command line to trigger the breakpoint. Due to buggy IDEA, a single click to the stop button won&amp;rsquo;t trigger the breakpoint.&lt;/p>
+&lt;/blockquote>
+&lt;p>You can see the method is called by a thread called &lt;code>Thread-3&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">stopAwait:390&lt;span style="color:#719e07">,&lt;/span> StandardServer &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>catalina&lt;span style="color:#719e07">.&lt;/span>core&lt;span style="color:#719e07">)&lt;/span>
+stopInternal:819&lt;span style="color:#719e07">,&lt;/span> StandardServer &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>catalina&lt;span style="color:#719e07">.&lt;/span>core&lt;span style="color:#719e07">)&lt;/span>
+stop:226&lt;span style="color:#719e07">,&lt;/span> LifecycleBase &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>catalina&lt;span style="color:#719e07">.&lt;/span>util&lt;span style="color:#719e07">)&lt;/span>
+stop:377&lt;span style="color:#719e07">,&lt;/span> Tomcat &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>apache&lt;span style="color:#719e07">.&lt;/span>catalina&lt;span style="color:#719e07">.&lt;/span>startup&lt;span style="color:#719e07">)&lt;/span>
+stopTomcat:241&lt;span style="color:#719e07">,&lt;/span> TomcatEmbeddedServletContainer &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>springframework&lt;span style="color:#719e07">.&lt;/span>boot&lt;span style="color:#719e07">.&lt;/span>context&lt;span style="color:#719e07">.&lt;/span>embedded&lt;span style="color:#719e07">.&lt;/span>tomcat&lt;span style="color:#719e07">)&lt;/span>
+stop:295&lt;span style="color:#719e07">,&lt;/span> TomcatEmbeddedServletContainer &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>springframework&lt;span style="color:#719e07">.&lt;/span>boot&lt;span style="color:#719e07">.&lt;/span>context&lt;span style="color:#719e07">.&lt;/span>embedded&lt;span style="color:#719e07">.&lt;/span>tomcat&lt;span style="color:#719e07">)&lt;/span>
+stopAndReleaseEmbeddedServletContainer:306&lt;span style="color:#719e07">,&lt;/span> EmbeddedWebApplicationContext &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>springframework&lt;span style="color:#719e07">.&lt;/span>boot&lt;span style="color:#719e07">.&lt;/span>context&lt;span style="color:#719e07">.&lt;/span>embedded&lt;span style="color:#719e07">)&lt;/span>
+onClose:155&lt;span style="color:#719e07">,&lt;/span> EmbeddedWebApplicationContext &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>springframework&lt;span style="color:#719e07">.&lt;/span>boot&lt;span style="color:#719e07">.&lt;/span>context&lt;span style="color:#719e07">.&lt;/span>embedded&lt;span style="color:#719e07">)&lt;/span>
+doClose:1014&lt;span style="color:#719e07">,&lt;/span> AbstractApplicationContext &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>springframework&lt;span style="color:#719e07">.&lt;/span>context&lt;span style="color:#719e07">.&lt;/span>support&lt;span style="color:#719e07">)&lt;/span>
+run:929&lt;span style="color:#719e07">,&lt;/span> AbstractApplicationContext$2 &lt;span style="color:#719e07">(&lt;/span>org&lt;span style="color:#719e07">.&lt;/span>springframework&lt;span style="color:#719e07">.&lt;/span>context&lt;span style="color:#719e07">.&lt;/span>support&lt;span style="color:#719e07">)&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Through source code analysis, it was executed by Spring&amp;rsquo;s registered &lt;code>ShutdownHook&lt;/code>.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java"> &lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">registerShutdownHook&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>shutdownHook &lt;span style="color:#719e07">==&lt;/span> &lt;span style="color:#cb4b16">null&lt;/span>&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">// No shutdown hook registered yet.
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>shutdownHook &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">run&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">synchronized&lt;/span> &lt;span style="color:#719e07">(&lt;/span>startupShutdownMonitor&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+doClose&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">};&lt;/span>
+Runtime&lt;span style="color:#719e07">.&lt;/span>getRuntime&lt;span style="color:#719e07">().&lt;/span>addShutdownHook&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">this&lt;/span>&lt;span style="color:#719e07">.&lt;/span>shutdownHook&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>By reffering the Java API documentation[2], we found that ShutdownHook will be executed under the following two cases.&lt;/p>
+&lt;blockquote>
+&lt;p>The Java virtual machine &lt;em>shuts down&lt;/em> in response to two kinds of events:&lt;/p>
+&lt;ul>
+&lt;li>The program &lt;em>exits&lt;/em> normally, when the last non-daemon thread exits or when the &lt;code>exit&lt;/code> (equivalently, &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#exit-int-">&lt;code>System.exit&lt;/code>&lt;/a>) method is invoked, or&lt;/li>
+&lt;li>The virtual machine is &lt;em>terminated&lt;/em> in response to a user interrupt, such as typing &lt;code>^C&lt;/code>, or a system-wide event, such as user logoff or system shutdown.&lt;/li>
+&lt;/ul>
+&lt;/blockquote>
+&lt;ol>
+&lt;li>So it&amp;rsquo;s either a call of &lt;code>System.exit()&lt;/code>&lt;/li>
+&lt;li>Respond to external signals, such as Ctrl+C(actually sent as SIGINT signal), or &lt;code>SIGTERM&lt;/code> signal (&lt;code>kill $PID&lt;/code> will send &lt;code>SIGTERM&lt;/code> signal by default)&lt;/li>
+&lt;/ol>
+&lt;p>Therefore, the normal application will execute the above ShutdownHook during the stop process (except &lt;code>kill -9 $PID&lt;/code>). Its function is not only to close the Tomcat, but also to perform other cleanup work. It is unnecessary to go into details.&lt;/p>
+&lt;h2 id="summary">Summary&lt;/h2>
+&lt;ol>
+&lt;li>During the startup of &lt;code>DubboConsumer&lt;/code>, an independent non-daemon thread is launched to query the status of the variable continuously, thus the process can&amp;rsquo;t exit.&lt;/li>
+&lt;li>To stop the &lt;code>DubboConsumer&lt;/code>, one should call ShutdownHook to change the variable to let the thread break the loop.&lt;/li>
+&lt;/ol>
+&lt;h2 id="problems">Problems&lt;/h2>
+&lt;p>In the example of DubboProvider, we see that Provider doesn&amp;rsquo;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.&lt;/p>
+&lt;h3 id="notice">Notice&lt;/h3>
+&lt;p>By running the following unit test which create a thread in &lt;code>Intellij IDEA&lt;/code> , we are surprised to find that the program exits with less than 1000s. Why?(The thread being created is a non-daemon thread)&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java"> &lt;span style="color:#268bd2">@Test&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">test&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">new&lt;/span> Thread&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> Runnable&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">run&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">try&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+Thread&lt;span style="color:#719e07">.&lt;/span>sleep&lt;span style="color:#719e07">(&lt;/span>1000000&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">catch&lt;/span> &lt;span style="color:#719e07">(&lt;/span>InterruptedException e&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+e&lt;span style="color:#719e07">.&lt;/span>printStackTrace&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}).&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>[1] &lt;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&lt;/a>&lt;/p>
+&lt;p>[2] &lt;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&lt;/a>&lt;/p></description></item><item><title>Blog: Implementation of cross-language calls by Dubbo2.js</title><link>http://dubbo.apache.org/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/</link><pubDate>Tue, 14 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog [...]
+&lt;blockquote>
+&lt;p>&lt;a href="https://github.com/dubbo/dubbo2.js">dubbo2.js&lt;/a> is a Dubbo client for node.js developped by &lt;a href="https://www.qianmi.com/">Qianmiwang&lt;/a>. It supports Dubbo&amp;rsquo;s native protocol, which makes the RPC calls between javascript and java efficient and agile. This tool has been contributed to Dubbo&amp;rsquo;s community.&lt;/p>
+&lt;/blockquote>
+&lt;h2 id="cross-language-calls-for-micro-service">Cross-language calls for micro service&lt;/h2>
+&lt;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 [...]
+&lt;ul>
+&lt;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.&lt;/li>
+&lt;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.&lt;/li>
+&lt;li>Motan. &lt;a href="https://github.com/weibocom/motan">Motan&lt;/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  [...]
+&lt;/ul>
+&lt;p>According to the solutions below, there are two ways to solve the cross-language calls problem:&lt;/p>
+&lt;ul>
+&lt;li>communicating by a common protocol.&lt;/li>
+&lt;li>implementing an agent as a protocol adapter.&lt;/li>
+&lt;/ul>
+&lt;p>When a new team is choosing technical solutions, what I mentioned below could be our candidates. Meanwhile, the old system&amp;rsquo;s compatibility and migration costs should also be considered. The first trial we did is to work on RPC protocol.&lt;/p>
+&lt;h2 id="cross-language-calls-by-a-common-protocol">Cross-language calls by a common protocol&lt;/h2>
+&lt;h3 id="springmvc">SpringMVC&lt;/h3>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/springmvc.png" alt="springmvc">&lt;/p>
+&lt;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 interfa [...]
+&lt;h3 id="we-support-some-common-protocols">We support some common protocols&lt;/h3>
+&lt;p>Most of the service management frameworks support multiple protocols, dubbo as well. Besides its own protocol, the common protocols such as Dangdangwang&amp;rsquo;s &lt;a href="https://dangdangdotcom.github.io/dubbox/rest.html">Rest&lt;/a> protocol and Qianmiwang&amp;rsquo;s &lt;a href="https://github.com/apache/dubbo-rpc-jsonrpc">json-rpc&lt;/a> protocol are also supported.&lt;/p>
+&lt;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.&lt;/p>
+&lt;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. Usin [...]
+&lt;p>Json-rpc is Qianmiwang&amp;rsquo;s early solution for cross-language protocol. They open-sourced their &lt;a href="https://github.com/dubbo/dubbo-client-py">dubbo-client-py&lt;/a> and &lt;a href="https://github.com/QianmiOpen/dubbo-node-client">dubbo-node-client&lt;/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 ma [...]
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;20880&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;jsonrpc&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;8080&amp;#34;&lt;/span> &lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="customized-protocols-for-cross-language-support">Customized Protocols for Cross-language Support&lt;/h3>
+&lt;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.&lt;/p>
+&lt;h4 id="motan2-for-cross-language-support">Motan2 for cross-language support&lt;/h4>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/motan-protocol-en.png" alt="motan2">&lt;/p>
+&lt;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, &lt;a href="https://github.com/weibocom/motan-go/">motan-go&lt;/a>, &lt;a href="https://github.com/weibocom/motan-php">motan-p [...]
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/motan-agent.png" alt="agent">&lt;/p>
+&lt;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.&lt;/p>
+&lt;h4 id="dubbo-for-cross-language-support">Dubbo for cross-language support&lt;/h4>
+&lt;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 b [...]
+&lt;h5 id="dubbo-protocol-message-format">Dubbo protocol message format:&lt;/h5>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/dubbo-protocol.png" alt="dubbo协议">&lt;/p>
+&lt;p>Details in dubbo protocol header message:&lt;/p>
+&lt;ul>
+&lt;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.&lt;/li>
+&lt;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.&lt;/li>
+&lt;li>Status: used toset response status. Dubbo defines some types for response. Details can be found in &lt;span data-type="color" style="color:rgb(36, 41, 46)">&lt;span data-type="background" style="background-color:rgba(27, 31, 35, 0.05)">com.alibaba.dubbo.remoting.exchange.Response&lt;/span>&lt;/span>&lt;/li>
+&lt;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)&lt;/li>
+&lt;li>Body length: message body length, type int,record bytes of body content.&lt;/li>
+&lt;li>Body content: request param, where serializedresponse parameters are stored.&lt;/li>
+&lt;/ul>
+&lt;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:&lt;/p>
+&lt;ol>
+&lt;li>&lt;span data-type="color" style="color:#24292E">How &lt;/span>&lt;span data-type="color" style="color:#212121">can different languages ​​represent data types in java, especially dynamiclanguages with possible non-strict data types&lt;/span>?&lt;/li>
+&lt;li>&lt;span data-type="color" style="color:#24292E">How to serialize string across language?&lt;/span>&lt;/li>
+&lt;/ol>
+&lt;h2 id="how-does-dubbo2js-solve-problems">How does dubbo2.js solve problems?&lt;/h2>
+&lt;p>We have analyzed two obstacles above. The key to dubbo2.js in solving these two problems depends on two class libraries: &lt;a href="https://github.com/node-modules/js-to-java">js-to-java&lt;/a>,&lt;a href="https://github.com/node-modules/hessian.js">hessian.js&lt;/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 fi [...]
+&lt;h2 id="quick-start">Quick Start&lt;/h2>
+&lt;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.&lt;/p>
+&lt;h3 id="1-initiate-dubbo-java-provider">1. Initiate dubbo-java-provider&lt;/h3>
+&lt;p>Java provides the backend dubbo service. Firstly, let’s define the service interface:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">DemoProvider&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+String &lt;span style="color:#268bd2">echo&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">test&lt;/span>&lt;span style="color:#719e07">();&lt;/span>
+UserResponse &lt;span style="color:#268bd2">getUserInfo&lt;/span>&lt;span style="color:#719e07">(&lt;/span>UserRequest request&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then we implement the interface:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">DemoProviderImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> DemoProvider &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;[&amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#719e07">new&lt;/span> SimpleDateFormat&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;HH:mm:ss&amp;#34;&lt;/span>&lt;span style="color:#719e07">).&lt;/span>format&lt;span style="color:#719e [...]
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name &lt;span style="color:#719e07">+&lt;/span> &lt;span style="color:#2aa198">&amp;#34;, response form provider: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> RpcContext&lt;span style="color:#719e07">.&lt;/span>getContext&lt;span style="color:#719e07">().&lt;/span>getLocalAddress&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">echo&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;receive....&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;pang&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">test&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;test&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> UserResponse &lt;span style="color:#268bd2">getUserInfo&lt;/span>&lt;span style="color:#719e07">(&lt;/span>UserRequest request&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>request&lt;span style="color:#719e07">);&lt;/span>
+UserResponse response &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> UserResponse&lt;span style="color:#719e07">();&lt;/span>
+response&lt;span style="color:#719e07">.&lt;/span>setStatus&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;ok&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">&amp;gt;&lt;/span> map &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> HashMap&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+map&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#2aa198">&amp;#34;1&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+map&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#2aa198">&amp;#34;test&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+response&lt;span style="color:#719e07">.&lt;/span>setInfo&lt;span style="color:#719e07">(&lt;/span>map&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> response&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>After that,&lt;span data-type="color" style="color:#24292E"> we expose the dubbo service with xml files:&lt;/span>&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&lt;span style="color:#719e07">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;beans&lt;/span> xmlns:xsi=&lt;span style="color:#2aa198">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
+xmlns:dubbo=&lt;span style="color:#2aa198">&amp;#34;http://code.alibabatech.com/schema/dubbo&amp;#34;&lt;/span>
+xmlns=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans&amp;#34;&lt;/span>
+xsi:schemaLocation=&lt;span style="color:#2aa198">&amp;#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+&lt;/span>&lt;span style="color:#2aa198"> http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&amp;#34;&lt;/span>&lt;span style="color:#268bd2">&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- dubbo provider info, used to compute dependency --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:application&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;demo-provider&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:registry&lt;/span> protocol=&lt;span style="color:#2aa198">&amp;#34;zookeeper&amp;#34;&lt;/span> address=&lt;span style="color:#2aa198">&amp;#34;localhost:2181&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- dubbo protocol, used to expose service at port 20880 --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:protocol&lt;/span> name=&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span> port=&lt;span style="color:#2aa198">&amp;#34;20880&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- realize a service as a local bean --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;bean&lt;/span> id=&lt;span style="color:#2aa198">&amp;#34;demoProvider&amp;#34;&lt;/span> class=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.demo.provider.DemoProviderImpl&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#586e75">&amp;lt;!-- claim for service interfaces to expose --&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;dubbo:service&lt;/span> interface=&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.demo.DemoProvider&amp;#34;&lt;/span> ref=&lt;span style="color:#2aa198">&amp;#34;demoProvider&amp;#34;&lt;/span> version=&lt;span style="color:#2aa198">&amp;#34;1.0.0&amp;#34;&lt;/span>&lt;span style="color:#268bd2">/&amp;gt;&lt;/span>
+&lt;span style="color:#268bd2">&amp;lt;/beans&amp;gt;&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>After we implemented all the configurations on server side, initiate an object initiater to register a dubbo service locally:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">Provider&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> Exception &lt;span style="color:#719e07">{&lt;/span>
+ClassPathXmlApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ClassPathXmlApplicationContext&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{&lt;/span>&lt;span style="color:#2aa198">&amp;#34;META-INF/spring/dubbo-demo-provider.xml&amp;#34;&lt;/span>&lt;span style="color:#719e07">});&lt;/span>
+context&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-implement-dubbo-client-side-for-nodejs">2. Implement dubbo client-side for nodejs&lt;/h3>
+&lt;p>Install dubbo2.js using npm:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">npm install dubbo2.js --save
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configure dubboConfig.ts:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-typescript" data-lang="typescript">&lt;span style="color:#268bd2">import&lt;/span> { Dubbo, java, TDubboCallResult } &lt;span style="color:#268bd2">from&lt;/span> &lt;span style="color:#2aa198">&amp;#39;dubbo2.js&amp;#39;&lt;/span>
+&lt;span style="color:#268bd2">const&lt;/span> dubbo &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Dubbo({
+application&lt;span style="color:#719e07">:&lt;/span> {name&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;demo-provider&amp;#39;&lt;/span>},
+register&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;localhost:2181&amp;#39;&lt;/span>,
+dubboVersion&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;2.0.0&amp;#39;&lt;/span>,
+interfaces&lt;span style="color:#719e07">:&lt;/span> [
+&lt;span style="color:#2aa198">&amp;#39;com.alibaba.dubbo.demo.DemoProvider&amp;#39;&lt;/span>,
+],
+});
+&lt;span style="color:#268bd2">interface&lt;/span> IDemoService {
+sayHello(name: &lt;span style="color:#dc322f">string&lt;/span>)&lt;span style="color:#719e07">:&lt;/span> TDubboCallResult&amp;lt;&lt;span style="color:#268bd2">string&lt;/span>&amp;gt;;
+}
+&lt;span style="color:#268bd2">export&lt;/span> &lt;span style="color:#268bd2">const&lt;/span> demoService &lt;span style="color:#719e07">=&lt;/span> dubbo.proxyService&amp;lt;&lt;span style="color:#268bd2">IDemoService&lt;/span>&amp;gt;({
+dubboInterface&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;com.alibaba.dubbo.demo.DemoProvider&amp;#39;&lt;/span>,
+version&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;1.0.0&amp;#39;&lt;/span>,
+methods&lt;span style="color:#719e07">:&lt;/span> {
+sayHello(name: &lt;span style="color:#dc322f">string&lt;/span>) {
+&lt;span style="color:#719e07">return&lt;/span> [java.&lt;span style="color:#b58900">String&lt;/span>(name)];
+},
+echo() {},
+test() {},
+getUserInfo() {
+&lt;span style="color:#719e07">return&lt;/span> [
+java.combine(&lt;span style="color:#2aa198">&amp;#39;com.alibaba.dubbo.demo.UserRequest&amp;#39;&lt;/span>, {
+id: &lt;span style="color:#dc322f">1&lt;/span>,
+name&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;nodejs&amp;#39;&lt;/span>,
+email&lt;span style="color:#719e07">:&lt;/span> &lt;span style="color:#2aa198">&amp;#39;node@qianmi.com&amp;#39;&lt;/span>,
+}),
+];
+},
+},
+});
+&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
+&lt;p>Using typescript brings better coding experience.&lt;/p>
+&lt;/blockquote>
+&lt;p>Implement caller class main.ts:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-typescript" data-lang="typescript">&lt;span style="color:#268bd2">import&lt;/span> {demoService} &lt;span style="color:#268bd2">from&lt;/span> &lt;span style="color:#2aa198">&amp;#39;./dubboConfig&amp;#39;&lt;/span>
+demoService.sayHello(&lt;span style="color:#2aa198">&amp;#39;kirito&amp;#39;&lt;/span>).then(({res,err})&lt;span style="color:#719e07">=&amp;gt;&lt;/span>{
+console.log(res)
+});
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-call-maints">3. Call main.ts:&lt;/h3>
+&lt;p>Run nodejs client in Debug mode:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">&lt;span style="color:#268bd2">DEBUG&lt;/span>&lt;span style="color:#719e07">=&lt;/span>dubbo* ts-node main.ts
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Checkout running results:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">Hello kirito, response form provider: 172.19.6.151:20880
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Congratulations!&lt;/p>
+&lt;h2 id="features">Features&lt;/h2>
+&lt;ul>
+&lt;li>Support zookeeper as register center&lt;/li>
+&lt;li>Support TCP Dubbo Native protocol&lt;/li>
+&lt;li>Support directly Dubbo connection&lt;/li>
+&lt;li>Support link tracing&lt;/li>
+&lt;li>Generate dubbo interface Automatically&lt;/li>
+&lt;/ul>
+&lt;h2 id="more-details">More details&lt;/h2>
+&lt;p>The sample code in this article is available here, &lt;a href="https://github.com/dubbo/dubbo2.js">https://github.com/dubbo/dubbo2.js&lt;/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.&lt;/p></description></item><item><title>Blog: Generic invoke of Dubbo</title><link>http://dubbo.apache.org/en/blog/2018/08/14/generic-invoke-of-dubbo/</link><pubDate>Tue, 14  [...]
+&lt;h1 id="generic-invoke-of-dubbo">Generic invoke of Dubbo&lt;/h1>
+&lt;p>The generic invoke could be considered to be used in the following cases:&lt;/p>
+&lt;ul>
+&lt;li>Service test platform&lt;/li>
+&lt;li>API service gateway&lt;/li>
+&lt;/ul>
+&lt;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 &lt;code>Map&lt;/code>.
+Generic invoke does not require attention on the server and can be exposed as normal services.&lt;/p>
+&lt;p>Next, let&amp;rsquo;s take a look at how the consumer uses generic invoke for service call.&lt;/p>
+&lt;h2 id="generic-invoke-through-spring-xml-configuration">Generic invoke through Spring XML configuration&lt;/h2>
+&lt;p>Declare &lt;code>generic=&amp;quot;true&amp;quot;&lt;/code> in Spring configuration, such as&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-xml" data-lang="xml">&amp;#34;userService&amp;#34; interface=&amp;#34;com.alibaba.dubbo.samples.generic.api.IUserService&amp;#34; generic=&amp;#34;true&amp;#34;/&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Where you need to use it, you can call it by forcing a type cast to GenericService.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">GenericService userService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>GenericService&lt;span style="color:#719e07">)&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>getBean&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;userService&amp [...]
+&lt;span style="color:#586e75">// primary param and return value
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>String name &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">)&lt;/span> userService&lt;span style="color:#719e07">.&lt;/span>$invoke&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;delete&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{ [...]
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Among them,&lt;/p>
+&lt;ol>
+&lt;li>
+&lt;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.&lt;/p>
+&lt;/li>
+&lt;li>
+&lt;p>For arrays of method parameter types&lt;/p>
+&lt;p>i. If it is a basic type, such as int or long, use &lt;code>int.class.getName()&lt;/code> to get its type;&lt;/p>
+&lt;p>ii. If it is a basic type array, such as int[], use &lt;code>int[].class.getName()&lt;/code>;&lt;/p>
+&lt;p>iii. If it is a POJO, use the full class name directly, such as &lt;code>com.alibaba.dubbo.samples.generic.api.Params&lt;/code>.&lt;/p>
+&lt;/li>
+&lt;/ol>
+&lt;h2 id="generic-invoke-through-api-programming">Generic invoke through API programming&lt;/h2>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">ApplicationConfig application &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ApplicationConfig&lt;span style="color:#719e07">()&lt;/span>ApplicationConfig application &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ApplicationConfig&lt;span  [...]
+application&lt;span style="color:#719e07">.&lt;/span>setName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;api-generic-consumer&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+RegistryConfig registry &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> RegistryConfig&lt;span style="color:#719e07">();&lt;/span>
+registry&lt;span style="color:#719e07">.&lt;/span>setAddress&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;zookeeper://127.0.0.1:2181&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+application&lt;span style="color:#719e07">.&lt;/span>setRegistry&lt;span style="color:#719e07">(&lt;/span>registry&lt;span style="color:#719e07">);&lt;/span>
+ReferenceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;&lt;/span> reference &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ReferenceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+&lt;span style="color:#586e75">// weak type interface name
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>reference&lt;span style="color:#719e07">.&lt;/span>setInterface&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.generic.api.IUserService&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#586e75">// declared as a generalized interface
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>reference&lt;span style="color:#719e07">.&lt;/span>setGeneric&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#cb4b16">true&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+reference&lt;span style="color:#719e07">.&lt;/span>setApplication&lt;span style="color:#719e07">(&lt;/span>application&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#586e75">// replace all interface references with com.alibaba.dubbo.rpc.service.GenericService
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>GenericService genericService &lt;span style="color:#719e07">=&lt;/span> reference&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+String name &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">)&lt;/span> genericService&lt;span style="color:#719e07">.&lt;/span>$invoke&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;delete&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{&lt;/span>&lt;span style="color:#dc322f">int&lt; [...]
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Through the API, you don&amp;rsquo;t need to configure the service in advance like XML. You can dynamically construct ReferenceConfig; the API is more common than XML.&lt;/p>
+&lt;h2 id="the-case-where-parameters-or-return-values-are-pojos">The case where parameters or return values are POJOs&lt;/h2>
+&lt;p>For example, the method signature is &lt;code>User get(Params params)&lt;/code>, where &lt;code>User&lt;/code> has two attributes, id and name, and &lt;code>Params&lt;/code> has one attribute, query.&lt;/p>
+&lt;p>The following is the code of the consumer:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">String&lt;span style="color:#719e07">[]&lt;/span> parameterTypes &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> String&lt;span style="color:#719e07">[]{&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.generic.api.Params&amp;#34;&lt;/span>&lt;span style=" [...]
+Map&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Object&lt;span style="color:#719e07">&amp;gt;&lt;/span> params &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> HashMap&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">,&lt;/span> Object&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+param&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;class&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.generic.api.Params&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+param&lt;span style="color:#719e07">.&lt;/span>put&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;query&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#2aa198">&amp;#34;a=b&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+Object user &lt;span style="color:#719e07">=&lt;/span> userService&lt;span style="color:#719e07">.&lt;/span>$invoke&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;get&amp;#34;&lt;/span>&lt;span style="color:#719e07">,&lt;/span> parameterTypes&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#719e07">new&lt;/span> Object&lt;span style="color:#719e07">[]{&lt;/span>param&lt;span style="color:#719e07">});&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;sample one result: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> user&lt;span style="color:#719e07">);&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The output of the above code is:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">sample one result: {name=charles, id=1, class=com.alibaba.dubbo.samples.generic.api.User}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Here, the Dubbo framework will automatically convert the return value from POJO to Map.
+It can be seen that the return value &lt;code>user&lt;/code> is a HashMap, which stores three k/vs, name, id, and class.&lt;/p>
+&lt;h2 id="generic-interface-implementation">Generic interface implementation&lt;/h2>
+&lt;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.&lt;/p>
+&lt;h3 id="implementation-genericservice-on-the-server">Implementation GenericService on the server&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">GenericServiceImpl&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> GenericService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Override&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> Object &lt;span style="color:#268bd2">$invoke&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String method&lt;span style="color:#719e07">,&lt;/span> String&lt;span style="color:#719e07">[]&lt;/span> parameterTypes&lt;span style="color:#719e07">,&lt;/span> Object&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> GenericException &lt;span style="color: [...]
+&lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>method&lt;span style="color:#719e07">.&lt;/span>equals&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;hi&amp;#34;&lt;/span>&lt;span style="color:#719e07">))&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;hi, &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> args&lt;span style="color:#719e07">[&lt;/span>0&lt;span style="color:#719e07">];&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span> &lt;span style="color:#719e07">else&lt;/span> &lt;span style="color:#719e07">if&lt;/span> &lt;span style="color:#719e07">(&lt;/span>method&lt;span style="color:#719e07">.&lt;/span>equals&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;hello&amp;#34;&lt;/span>&lt;span style="color:#719e07">))&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;hello, &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> args&lt;span style="color:#719e07">[&lt;/span>0&lt;span style="color:#719e07">];&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;welcome&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="server-exposed-service">Server exposed service&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">ApplicationConfig application &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ApplicationConfig&lt;span style="color:#719e07">();&lt;/span>
+application&lt;span style="color:#719e07">.&lt;/span>setName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;api-generic-provider&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+RegistryConfig registry &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> RegistryConfig&lt;span style="color:#719e07">();&lt;/span>
+registry&lt;span style="color:#719e07">.&lt;/span>setAddress&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;zookeeper://127.0.0.1:2181&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+application&lt;span style="color:#719e07">.&lt;/span>setRegistry&lt;span style="color:#719e07">(&lt;/span>registry&lt;span style="color:#719e07">);&lt;/span>
+GenericService genericService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> GenericServiceImpl&lt;span style="color:#719e07">();&lt;/span>
+ServiceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;&lt;/span> service &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ServiceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+service&lt;span style="color:#719e07">.&lt;/span>setApplication&lt;span style="color:#719e07">(&lt;/span>application&lt;span style="color:#719e07">);&lt;/span>
+service&lt;span style="color:#719e07">.&lt;/span>setInterface&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.generic.api.HelloService&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+service&lt;span style="color:#719e07">.&lt;/span>setRef&lt;span style="color:#719e07">(&lt;/span>genericService&lt;span style="color:#719e07">);&lt;/span>
+service&lt;span style="color:#719e07">.&lt;/span>export&lt;span style="color:#719e07">();&lt;/span>
+ServiceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;&lt;/span> service2 &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ServiceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+service2&lt;span style="color:#719e07">.&lt;/span>setApplication&lt;span style="color:#719e07">(&lt;/span>application&lt;span style="color:#719e07">);&lt;/span>
+service2&lt;span style="color:#719e07">.&lt;/span>setInterface&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.generic.api.HiService&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+service2&lt;span style="color:#719e07">.&lt;/span>setRef&lt;span style="color:#719e07">(&lt;/span>genericService&lt;span style="color:#719e07">);&lt;/span>
+service2&lt;span style="color:#719e07">.&lt;/span>export&lt;span style="color:#719e07">();&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;h3 id="service-invoke-on-the-consumer">Service invoke on the consumer&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">ApplicationConfig application &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ApplicationConfig&lt;span style="color:#719e07">();&lt;/span>
+application&lt;span style="color:#719e07">.&lt;/span>setName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;api-generic-consumer&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+RegistryConfig registry &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> RegistryConfig&lt;span style="color:#719e07">();&lt;/span>
+registry&lt;span style="color:#719e07">.&lt;/span>setAddress&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;zookeeper://127.0.0.1:2181&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+application&lt;span style="color:#719e07">.&lt;/span>setRegistry&lt;span style="color:#719e07">(&lt;/span>registry&lt;span style="color:#719e07">);&lt;/span>
+ReferenceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;&lt;/span> reference &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ReferenceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+&lt;span style="color:#586e75">// weak type interface name
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>reference&lt;span style="color:#719e07">.&lt;/span>setInterface&lt;span style="color:#719e07">(&lt;/span>HiService&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+reference&lt;span style="color:#719e07">.&lt;/span>setApplication&lt;span style="color:#719e07">(&lt;/span>application&lt;span style="color:#719e07">);&lt;/span>
+HiService hiService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>HiService&lt;span style="color:#719e07">)&lt;/span> reference&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>hiService&lt;span style="color:#719e07">.&lt;/span>hi&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span>&lt;span style="color:#719e07">));&lt;/span>
+ReferenceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;&lt;/span> reference2 &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ReferenceConfig&lt;span style="color:#719e07">&amp;lt;&lt;/span>GenericService&lt;span style="color:#719e07">&amp;gt;();&lt;/span>
+&lt;span style="color:#586e75">// weak type interface name
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>reference2&lt;span style="color:#719e07">.&lt;/span>setInterface&lt;span style="color:#719e07">(&lt;/span>HelloService&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span>
+reference2&lt;span style="color:#719e07">.&lt;/span>setApplication&lt;span style="color:#719e07">(&lt;/span>application&lt;span style="color:#719e07">);&lt;/span>
+HelloService helloService &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">(&lt;/span>HelloService&lt;span style="color:#719e07">)&lt;/span> reference2&lt;span style="color:#719e07">.&lt;/span>get&lt;span style="color:#719e07">();&lt;/span>
+System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>helloService&lt;span style="color:#719e07">.&lt;/span>hello&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;community&amp;#34;&lt;/span>&lt;span style="color:#719e07">));&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;p>So far, a simple service Mock platform has been successfully launched!&lt;/p>
+&lt;h2 id="others">Others&lt;/h2>
+&lt;ul>
+&lt;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&amp;rsquo;t support generic invoke. Version 2.6.3 will support the generic invoke of these two protocols.&lt;/li>
+&lt;li>The relevant sample codes mentioned in this article can be found in dubbo-samples: &lt;a href="https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-generic">https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-generic&lt;/a>&lt;/li>
+&lt;/ul></description></item><item><title>Blog: Dubbo's Load Balance</title><link>http://dubbo.apache.org/en/blog/2018/08/10/dubbos-load-balance/</link><pubDate>Fri, 10 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/10/dubbos-load-balance/</guid><description>
+&lt;h2 id="background">Background&lt;/h2>
+&lt;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.&lt;/p>
+&lt;h2 id="concepts">Concepts&lt;/h2>
+&lt;p>Before discussing load balancing, I will explain these three concepts first.&lt;/p>
+&lt;ol>
+&lt;li>Load Balancing&lt;/li>
+&lt;li>Fault-tolerant Cluster&lt;/li>
+&lt;li>Service Route&lt;/li>
+&lt;/ol>
+&lt;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.&lt;/p>
+&lt;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:&lt;/p>
+&lt;ol>
+&lt;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.&lt;/li>
+&lt;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.&lt;/li>
+&lt;li>As a result, calling the 7th Provider failed.&lt;/li>
+&lt;li>Retried other servers according to the configured Fault-tolerant Cluster mode.&lt;/li>
+&lt;li>The call to the 13th Provider was successful.&lt;/li>
+&lt;/ol>
+&lt;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 differe [...]
+&lt;h2 id="dubbos-internal-load-balancing-strategy">Dubbo&amp;rsquo;s Internal Load Balancing Strategy&lt;/h2>
+&lt;p>Dubbo has four Internal Load Balancing Strategies:&lt;/p>
+&lt;ol>
+&lt;li>RandomLoadBalance: Random load balancing. Choose a Provider randomly. It is Dubbo&amp;rsquo;s default load balancing strategy.&lt;/li>
+&lt;li>Round Robin Load Balancing: Polling load balancing, then chooses one Provider.&lt;/li>
+&lt;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.&lt;/li>
+&lt;li>ConsistentHashLoadBalance: Consistent hash load balancing. Requests with the same parameters always fall on the same machine.&lt;/li>
+&lt;/ol>
+&lt;h3 id="1-random-load-balancing">1. Random Load Balancing&lt;/h3>
+&lt;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&amp;rsquo;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.&lt;/p>
+&lt;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.&lt;/p>
+&lt;h4 id="weight-based-load-balancing-algorithm">Weight-based Load Balancing Algorithm&lt;/h4>
+&lt;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 &lt;code>random.nexInt(length)&lt;/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 [...]
+&lt;table>
+&lt;thead>
+&lt;tr>
+&lt;th>Invoker&lt;/th>
+&lt;th>Weight&lt;/th>
+&lt;/tr>
+&lt;/thead>
+&lt;tbody>
+&lt;tr>
+&lt;td>A&lt;/td>
+&lt;td>10&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>B&lt;/td>
+&lt;td>20&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>C&lt;/td>
+&lt;td>20&lt;/td>
+&lt;/tr>
+&lt;tr>
+&lt;td>D&lt;/td>
+&lt;td>30&lt;/td>
+&lt;/tr>
+&lt;/tbody>
+&lt;/table>
+&lt;p>The total weight of A, B, C and D is 10 + 20 + 20 + 30 = 80. Spread 80 numbers in the following diagram:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">+-----------------------------------------------------------------------------------+
+| | | | |
++-----------------------------------------------------------------------------------+
+1 10 30 50 80
+|-----A----|---------B----------|----------C---------|---------------D--------------|
+---------------------15
+-------------------------------------------37
+-----------------------------------------------------------54
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>There are four areas in the above picture, and the lengths are the weights of A, B, C and D, respectively. Use &lt;code>random.nextInt(10 + 20 + 20 + 30)&lt;/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.&lt;/p>
+&lt;h4 id="random-load-balancing-source-code">Random load balancing Source code&lt;/h4>
+&lt;p>Below is the source code for random load balancing. For ease of reading and understanding, I removed the extraneous parts.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">public class RandomLoadBalance extends AbstractLoadBalance {
+private final Random random = new Random();
+protected &amp;lt;T&amp;gt; Invoker&amp;lt;T&amp;gt; doSelect(List&amp;lt;Invoker&amp;lt;T&amp;gt;&amp;gt; invokers, URL url, Invocation invocation) {
+int length = invokers.size(); // total invoker
+int totalWeight = 0; // Sum of invokers&amp;#39; 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 &amp;lt; length; i++) {
+int weight = getWeight(invokers.get(i), invocation);
+totalWeight += weight; // Sum
+if (sameWeight &amp;amp;&amp;amp; i &amp;gt; 0 &amp;amp;&amp;amp; weight != getWeight(invokers.get(i - 1), invocation)) {
+sameWeight = false;
+}
+}
+if (totalWeight &amp;gt; 0 &amp;amp;&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 &amp;lt; length; i++) {
+offset -= getWeight(invokers.get(i), invocation);
+if (offset &amp;lt; 0) {
+return invokers.get(i);
+}
+}
+}
+// If all invokers have the same weight
+return invokers.get(random.nextInt(length));
+}
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-round-robin-load-balancing">2. Round Robin Load Balancing&lt;/h3>
+&lt;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 seco [...]
+&lt;h3 id="3-minimum-active-call-load-balancing">3. Minimum Active Call Load Balancing&lt;/h3>
+&lt;p>Official explanation:&lt;/p>
+&lt;blockquote>
+&lt;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.&lt;/p>
+&lt;/blockquote>
+&lt;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 numb [...]
+&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">if (leastCount == 1) {
+// if there is only one minimum value then return directly
+return invokers.get(leastIndexs[0]);
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">if (! sameWeight &amp;amp;&amp;amp; totalWeight &amp;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 &amp;lt; leastCount; i++) {
+int leastIndex = leastIndexs[i];
+offsetWeight -= getWeight(invokers.get(leastIndex), invocation);
+if (offsetWeight &amp;lt;= 0)
+return invokers.get(leastIndex);
+}
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-consistent-hash-algorithm">4. Consistent Hash Algorithm&lt;/h3>
+&lt;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: &lt;a href="http://en.wikipedia.org/wiki/Consistent_hashing">http://en.wikipedia.org/wiki/Consistent_hashing&lt;/a>&lt;/p>
+&lt;p>By default, only the first parameter is hashed. Configure if you would like to modify it:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:parameter key=&amp;#34;hash.arguments&amp;#34; value=&amp;#34;0,1&amp;#34; /&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>By default, 160 virtual nodes are used. Configure if you would like to modify it:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:parameter key=&amp;#34;hash.nodes&amp;#34; value=&amp;#34;320&amp;#34; /&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;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 dep [...]
+&lt;h2 id="load-balancing-configuration">Load Balancing Configuration&lt;/h2>
+&lt;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.&lt;/p>
+&lt;h3 id="server-side-service-level">Server Side Service Level&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:service interface=&amp;#34;...&amp;#34; loadbalance=&amp;#34;roundrobin&amp;#34; /&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>All methods of the service use roundrobin load balancing.&lt;/p>
+&lt;h3 id="client-side-service-level">Client Side Service Level&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:reference interface=&amp;#34;...&amp;#34; loadbalance=&amp;#34;roundrobin&amp;#34; /&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>All methods of the service use roundrobin load balancing.&lt;/p>
+&lt;h3 id="server-side-method-level">Server Side Method Level&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:service interface=&amp;#34;...&amp;#34;&amp;gt;
+&amp;lt;dubbo:method name=&amp;#34;hello&amp;#34; loadbalance=&amp;#34;roundrobin&amp;#34;/&amp;gt;
+&amp;lt;/dubbo:service&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Only the hello method of the service uses roundrobin load balancing.&lt;/p>
+&lt;h3 id="client-side-method-level">Client Side Method Level&lt;/h3>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:reference interface=&amp;#34;...&amp;#34;&amp;gt;
+&amp;lt;dubbo:method name=&amp;#34;hello&amp;#34; loadbalance=&amp;#34;roundrobin&amp;#34;/&amp;gt;
+&amp;lt;/dubbo:reference&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Only the hello method of the service uses roundrobin load balancing.&lt;/p>
+&lt;p>Similar to other Dubbo configurations, multiple configurations are covered:&lt;/p>
+&lt;ol>
+&lt;li>The method level takes precedence, the interface level is next, and the global configuration comes last.&lt;/li>
+&lt;li>If the level is the same, the Consumer is given priority and the Provider is next&lt;/li>
+&lt;/ol>
+&lt;p>Therefore, the priority of the above four configurations is:&lt;/p>
+&lt;ol>
+&lt;li>Client side method level configuration.&lt;/li>
+&lt;li>Client side interface level configuration.&lt;/li>
+&lt;li>Server side method level configuration.&lt;/li>
+&lt;li>Server side interface level configuration.&lt;/li>
+&lt;/ol>
+&lt;h2 id="extended-load-balancing">Extended Load Balancing&lt;/h2>
+&lt;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.&lt;/p>
+&lt;ol>
+&lt;li>Implementing the LoadBalance interface&lt;/li>
+&lt;/ol>
+&lt;p>The following is Dubbo&amp;rsquo;s LoadBalance interface:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">@SPI(RandomLoadBalance.NAME)
+public interface LoadBalance {
+@Adaptive(&amp;#34;loadbalance&amp;#34;)
+&amp;lt;T&amp;gt; Invoker&amp;lt;T&amp;gt; select(List&amp;lt;Invoker&amp;lt;T&amp;gt;&amp;gt; invokers, URL url, Invocation invocation) throws RpcException;
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is the interface of the SPI. The parameters of the select method are as follows:&lt;/p>
+&lt;ul>
+&lt;li>invokers: A list of all service Providers.&lt;/li>
+&lt;li>url: Some configuration information, such as interface name, check or not, serialization.&lt;/li>
+&lt;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:&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-go" data-lang="go">&lt;span style="color:#719e07">package&lt;/span> com.demo.dubbo;
+public class DemoLoadBalance implements LoadBalance {
+@Override
+public &amp;lt;T&amp;gt; Invoker&amp;lt;T&amp;gt; &lt;span style="color:#719e07">select&lt;/span>(List&amp;lt;Invoker&amp;lt;T&lt;span style="color:#719e07">&amp;gt;&amp;gt;&lt;/span> invokers, URL url, Invocation invocation) throws RpcException {
+System.out.&lt;span style="color:#b58900">println&lt;/span>(&lt;span style="color:#2aa198">&amp;#34;[DemoLoadBalance]Select the first invoker...&amp;#34;&lt;/span>);
+&lt;span style="color:#719e07">return&lt;/span> invokers.&lt;span style="color:#268bd2">get&lt;/span>(&lt;span style="color:#2aa198">0&lt;/span>);
+}
+}
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
+&lt;li>Add a resource file&lt;/li>
+&lt;/ol>
+&lt;p>Add a file:
+&lt;code>src/main/resource/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance&lt;/code>
+This is a simple text file. The file contents are as follows:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">demo=my=com.demo.dubbo.DemoLoadBalance
+&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
+&lt;li>Configure to use custom LoadBalance&lt;/li>
+&lt;/ol>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-fallback" data-lang="fallback">&amp;lt;dubbo:reference id=&amp;#34;helloService&amp;#34; interface=&amp;#34;com.demo.dubbo.api.IHelloService&amp;#34; loadbalance=&amp;#34;demo&amp;#34; /&amp;gt;
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Configure &lt;code>&amp;lt;loadbalance=&amp;quot;demo&amp;quot;&amp;gt;&lt;/code> in &lt;code>dubbo:reference&lt;/code> at the Consumer side.&lt;/p>
+&lt;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.&lt;/p></description></item><item><title>Blog: Use Annotations In Dubbo</title><link>http://dubbo.apache.org/en/blog/2018/08/07/use-annotations-in-dubbo/</link><pubDate>Tue, 07 Aug 2018 00:00:00 +0000</pubDate><guid>http://dubbo.apache.org/en/blog/2018/08/07/use-annotations-in-dubbo/</guid><description>
+&lt;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:&lt;/p>
+&lt;ul>
+&lt;li>Annotation-Driven&lt;/li>
+&lt;li>External Configuration&lt;/li>
+&lt;li>Auto-Configure&lt;/li>
+&lt;/ul>
+&lt;p>New programming model have some advantages, for example, it does not require &lt;code>XML&lt;/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 a [...]
+&lt;h2 id="introduce-annotations">Introduce Annotations&lt;/h2>
+&lt;h3 id="enabledubbo">@EnableDubbo&lt;/h3>
+&lt;p>The annotations of &lt;code>@EnableDubbo&lt;/code> is a combination of both &lt;code>@EnableDubboConfig&lt;/code> and &lt;code>@DubboComponentScan&lt;/code>.Related to the annotation driver is &lt;code>@DubboComponentScan&lt;/code>.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.config.spring.context.annotation&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@EnableDubboConfig&lt;/span>
+&lt;span style="color:#268bd2">@DubboComponentScan&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">@interface&lt;/span> EnableDubbo &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * Base packages to scan for annotated @Service classes.
+&lt;/span>&lt;span style="color:#586e75"> * &amp;lt;p&amp;gt;
+&lt;/span>&lt;span style="color:#586e75"> * Use {@link #scanBasePackageClasses()} for a type-safe alternative to String-based
+&lt;/span>&lt;span style="color:#586e75"> * package names.
+&lt;/span>&lt;span style="color:#586e75"> *
+&lt;/span>&lt;span style="color:#586e75"> * @return the base packages to scan
+&lt;/span>&lt;span style="color:#586e75"> * @see DubboComponentScan#basePackages()
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">@AliasFor&lt;/span>&lt;span style="color:#719e07">(&lt;/span>annotation &lt;span style="color:#719e07">=&lt;/span> DubboComponentScan&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">,&lt;/span> attribute &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;basePackages&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+String&lt;span style="color:#719e07">[]&lt;/span> &lt;span style="color:#268bd2">scanBasePackages&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#719e07">{};&lt;/span>
+&lt;span style="color:#586e75">/**
+&lt;/span>&lt;span style="color:#586e75"> * Type-safe alternative to {@link #scanBasePackages()} for specifying the packages to
+&lt;/span>&lt;span style="color:#586e75"> * scan for annotated @Service classes. The package of each class specified will be
+&lt;/span>&lt;span style="color:#586e75"> * scanned.
+&lt;/span>&lt;span style="color:#586e75"> *
+&lt;/span>&lt;span style="color:#586e75"> * @return classes from the base packages to scan
+&lt;/span>&lt;span style="color:#586e75"> * @see DubboComponentScan#basePackageClasses
+&lt;/span>&lt;span style="color:#586e75"> */&lt;/span>
+&lt;span style="color:#268bd2">@AliasFor&lt;/span>&lt;span style="color:#719e07">(&lt;/span>annotation &lt;span style="color:#719e07">=&lt;/span> DubboComponentScan&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">,&lt;/span> attribute &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;basePackageClasses&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;[]&lt;/span> scanBasePackageClasses&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#719e07">{};&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>@bableDubbo&lt;/code> can be used to scan Dubbo&amp;rsquo;s service provider (marked by &lt;code>@Service&lt;/code>) and Dubbo&amp;rsquo;s service consumer (marked by &lt;code>Reference&lt;/code>) under the specified package name (via &lt;code>scanBasePackages&lt;/code>) or in the specified class (via &lt;code>scanBasePackageClasses&lt;/code>). After Dubbo&amp;rsquo;s service providers and consumers have been scanned, they have been assemble [...]
+&lt;h3 id="service">@Service&lt;/h3>
+&lt;p>&lt;code>@service&lt;/code> is used to configure Dubbo&amp;rsquo;s Service provider,for example:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#268bd2">@Service&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AnnotatedGreetingService&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> GreetingService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;hello, &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Via &lt;code>@Service&lt;/code>&amp;rsquo;s properties, you can customize Dubbo&amp;rsquo;s Service provider:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.config.annotation&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Documented&lt;/span>
+&lt;span style="color:#268bd2">@Retention&lt;/span>&lt;span style="color:#719e07">(&lt;/span>RetentionPolicy&lt;span style="color:#719e07">.&lt;/span>RUNTIME&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">@Target&lt;/span>&lt;span style="color:#719e07">({&lt;/span>ElementType&lt;span style="color:#719e07">.&lt;/span>TYPE&lt;span style="color:#719e07">})&lt;/span> &lt;span style="color:#586e75">// #1
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>&lt;span style="color:#268bd2">@Inherited&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">@interface&lt;/span> Service &lt;span style="color:#719e07">{&lt;/span>
+Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> interfaceClass&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#dc322f">void&lt;/span>&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #2
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">interfaceName&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #3
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">version&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #4
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">group&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #5
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#dc322f">boolean&lt;/span> &lt;span style="color:#268bd2">export&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#cb4b16">true&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #6
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#dc322f">boolean&lt;/span> &lt;span style="color:#268bd2">register&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#cb4b16">true&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #7
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>
+String &lt;span style="color:#268bd2">application&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #8
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">module&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #9
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">provider&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #10
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String&lt;span style="color:#719e07">[]&lt;/span> &lt;span style="color:#268bd2">protocol&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#719e07">{};&lt;/span> &lt;span style="color:#586e75">// #11
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">monitor&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #12
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String&lt;span style="color:#719e07">[]&lt;/span> &lt;span style="color:#268bd2">registry&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#719e07">{};&lt;/span> &lt;span style="color:#586e75">// #13
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Which is more important:&lt;/p>
+&lt;ol>
+&lt;li>&lt;strong>@Service&lt;/strong>: Can only be defined on a class, represent a service&lt;/li>
+&lt;li>&lt;strong>interfaceClass&lt;/strong>: specified &lt;code>interface&lt;/code>&amp;rsquo;s class implemented by the service provider&lt;/li>
+&lt;li>&lt;strong>interfaceName&lt;/strong>: specified &lt;code>interface&lt;/code>&amp;rsquo;s class name implemented by the service provider&lt;/li>
+&lt;li>&lt;strong>version&lt;/strong>: specified the version number of the service&lt;/li>
+&lt;li>&lt;strong>group&lt;/strong>:specified the group of services&lt;/li>
+&lt;li>&lt;strong>export&lt;/strong>:whether to expose service&lt;/li>
+&lt;li>&lt;strong>registry&lt;/strong>:Whether to register service to the registry&lt;/li>
+&lt;li>&lt;strong>application&lt;/strong>:application configuration&lt;/li>
+&lt;li>&lt;strong>module&lt;/strong>:module configuration&lt;/li>
+&lt;li>&lt;strong>provider&lt;/strong>:service provider configuration&lt;/li>
+&lt;li>&lt;strong>protocol&lt;/strong>:protocol configuration&lt;/li>
+&lt;li>&lt;strong>monitor&lt;/strong>:monitoring center configuration&lt;/li>
+&lt;li>&lt;strong>registr&lt;/strong>:registry configuration&lt;/li>
+&lt;/ol>
+&lt;p>In addition, it should be noted that, &lt;code>application&lt;/code>, &lt;code>module&lt;/code>, &lt;code>provider&lt;/code>, &lt;code>protocol&lt;/code>, &lt;code>monitor&lt;/code>, &lt;code>registry&lt;/code> (from 8 to 13) need to provide the name of the corresponding &lt;code>spring bean&lt;/code>,These bean assembly completed either through traditional XML configuration,or by the modern Java Config. This article will show you how to use &lt;code>Java Config&lt;/code>.&lt;/p>
+&lt;h3 id="reference">@Reference&lt;/h3>
+&lt;p>&lt;code>@Reference&lt;/code> is used to configure Dubbo&amp;rsquo;s Service consumer,for example:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">@Component&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">GreetingServiceConsumer&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Reference&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> GreetingService greetingService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">doSayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> greetingService&lt;span style="color:#719e07">.&lt;/span>sayHello&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Via &lt;code>@Reference&lt;/code>&amp;rsquo;s properties, you can customize Dubbo&amp;rsquo;s Service consumer:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#719e07">package&lt;/span> org.apache.dubbo.config.annotation&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">@Documented&lt;/span>
+&lt;span style="color:#268bd2">@Retention&lt;/span>&lt;span style="color:#719e07">(&lt;/span>RetentionPolicy&lt;span style="color:#719e07">.&lt;/span>RUNTIME&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">@Target&lt;/span>&lt;span style="color:#719e07">({&lt;/span>ElementType&lt;span style="color:#719e07">.&lt;/span>FIELD&lt;span style="color:#719e07">,&lt;/span> ElementType&lt;span style="color:#719e07">.&lt;/span>METHOD&lt;span style="color:#719e07">,&lt;/span> ElementType&lt;span style="color:#719e07">.&lt;/span>ANNOTATION_TYPE&lt;span style="color:#719e07">})&lt;/span> &lt;span style="color:#586e75">// #1
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">@interface&lt;/span> Reference &lt;span style="color:#719e07">{&lt;/span>
+Class&lt;span style="color:#719e07">&amp;lt;?&amp;gt;&lt;/span> interfaceClass&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#dc322f">void&lt;/span>&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #2
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">interfaceName&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #3
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">version&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #4
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">group&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #5
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">url&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #6
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>
+String &lt;span style="color:#268bd2">application&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #7
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">module&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #8
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">consumer&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #9
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">protocol&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #10
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String &lt;span style="color:#268bd2">monitor&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#2aa198">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#719e07">;&lt;/span> &lt;span style="color:#586e75">// #11
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String&lt;span style="color:#719e07">[]&lt;/span> &lt;span style="color:#268bd2">registry&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">default&lt;/span> &lt;span style="color:#719e07">{};&lt;/span> &lt;span style="color:#586e75">// #12
+&lt;/span>&lt;span style="color:#586e75">&lt;/span>&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Which is more important:&lt;/p>
+&lt;ol>
+&lt;li>&lt;strong>@Reference&lt;/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 &lt;code>@Reference&lt;/code> is defined in one field&lt;/li>
+&lt;li>&lt;strong>interfaceClass&lt;/strong> : specified &lt;code>interface&lt;/code>&amp;rsquo;s class implemented by the service provider&lt;/li>
+&lt;li>&lt;strong>interfaceName&lt;/strong>: specified &lt;code>interface&lt;/code>&amp;rsquo;s class name implemented by the service provider&lt;/li>
+&lt;li>&lt;strong>version&lt;/strong>: specified the version number of the service&lt;/li>
+&lt;li>&lt;strong>group&lt;/strong>:pecified the group of services&lt;/li>
+&lt;li>&lt;strong>url&lt;/strong>: invoking the registry directly by specifying the URL of the service provider&lt;/li>
+&lt;li>&lt;strong>application&lt;/strong>:application configuration&lt;/li>
+&lt;li>&lt;strong>module&lt;/strong>:module configuration&lt;/li>
+&lt;li>&lt;strong>consumer&lt;/strong>:service consumer configuration&lt;/li>
+&lt;li>&lt;strong>protocol&lt;/strong>:protocol configuration&lt;/li>
+&lt;li>&lt;strong>monitor&lt;/strong>:monitoring center configuration&lt;/li>
+&lt;li>&lt;strong>registr&lt;/strong>:registry configuration&lt;/li>
+&lt;/ol>
+&lt;p>In addition, it should be noted that, &lt;code>application&lt;/code>, &lt;code>module&lt;/code>, &lt;code>consumer&lt;/code>, &lt;code>protocol&lt;/code>, &lt;code>monitor&lt;/code>, &lt;code>registry&lt;/code> (from 7 to 12) need to provide the name of the corresponding &lt;code>spring bean&lt;/code>,These bean assembly completed either through traditional XML configuration,or by the modern Java Config. This article will show you how to use &lt;code>Java Config&lt;/code>.&lt;/p>
+&lt;h2 id="example-practice">Example practice&lt;/h2>
+&lt;p>After learn what &lt;code>@EnableDubbo&lt;/code>, &lt;code>@Service&lt;/code>, &lt;code>@Reference&lt;/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 &lt;a href="https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-annotation">https://github.com/dubbo/dubbo-samples/tree/master/dubbo-samples-annotation&lt;/a>&lt;/p>
+&lt;h3 id="1interface-definition">1.Interface Definition&lt;/h3>
+&lt;p>Define a simple &lt;code>GreetingService&lt;/code> interface with only a simple method &lt;code>sayHello&lt;/code> to the caller.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">GreetingService&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2serverservice-implementation">2.Server:Service Implementation&lt;/h3>
+&lt;p>Implement the &lt;code>GreetingService&lt;/code> interface, and mark it as a service for Dubbo via @Service.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">@Service&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">AnnotatedGreetingService&lt;/span> &lt;span style="color:#268bd2">implements&lt;/span> GreetingService &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">sayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> &lt;span style="color:#2aa198">&amp;#34;hello, &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> name&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3serverassembly-service-provider">3.Server:Assembly Service Provider&lt;/h3>
+&lt;p>You can discover, assemble, and provide Dubbo&amp;rsquo;s services through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">@Configuration&lt;/span>
+&lt;span style="color:#268bd2">@EnableDubbo&lt;/span>&lt;span style="color:#719e07">(&lt;/span>scanBasePackages &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.impl&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">ProviderConfiguration&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #1
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> ProviderConfig &lt;span style="color:#268bd2">providerConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ProviderConfig providerConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ProviderConfig&lt;span style="color:#719e07">();&lt;/span>
+providerConfig&lt;span style="color:#719e07">.&lt;/span>setTimeout&lt;span style="color:#719e07">(&lt;/span>1000&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> providerConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #2
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> ApplicationConfig &lt;span style="color:#268bd2">applicationConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ApplicationConfig applicationConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ApplicationConfig&lt;span style="color:#719e07">();&lt;/span>
+applicationConfig&lt;span style="color:#719e07">.&lt;/span>setName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dubbo-annotation-provider&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> applicationConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #3
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> RegistryConfig &lt;span style="color:#268bd2">registryConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+RegistryConfig registryConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> RegistryConfig&lt;span style="color:#719e07">();&lt;/span>
+registryConfig&lt;span style="color:#719e07">.&lt;/span>setProtocol&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;zookeeper&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+registryConfig&lt;span style="color:#719e07">.&lt;/span>setAddress&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;localhost&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+registryConfig&lt;span style="color:#719e07">.&lt;/span>setPort&lt;span style="color:#719e07">(&lt;/span>2181&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> registryConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #4
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> ProtocolConfig &lt;span style="color:#268bd2">protocolConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ProtocolConfig protocolConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ProtocolConfig&lt;span style="color:#719e07">();&lt;/span>
+protocolConfig&lt;span style="color:#719e07">.&lt;/span>setName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dubbo&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+protocolConfig&lt;span style="color:#719e07">.&lt;/span>setPort&lt;span style="color:#719e07">(&lt;/span>20880&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> protocolConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Description:&lt;/p>
+&lt;ul>
+&lt;li>Scan all classes marked with &lt;code>@Service&lt;/code> under &lt;code>com.alibaba.dubbo.samples.impl&lt;/code> with &lt;code>@EnableDubbo&lt;/code>&lt;/li>
+&lt;li>Via @Configuration, all @Beans in the ProviderConfiguration are assembled using the way of &lt;code>Java Config&lt;/code> and then injected into the Dubbo service, which means the class marked with &lt;code>@Service&lt;/code>.Which included:
+i. &lt;strong>ProviderConfig&lt;/strong>:Service provider configuration
+ii. &lt;strong>ApplicationConfig&lt;/strong>:Application configuration
+iii.&lt;strong>RegistryConfig&lt;/strong>:registry configuration
+iv. &lt;strong>ProtocolConfig&lt;/strong>:Protocol configuration&lt;/li>
+&lt;/ul>
+&lt;h3 id="4serverstart-service">4.Server:Start Service&lt;/h3>
+&lt;p>In the &lt;code>main&lt;/code> method to provide external &lt;code>Dubbo&lt;/code> service by starting a &lt;code>Spring Context&lt;/code>.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">ProviderBootstrap&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#268bd2">throws&lt;/span> Exception &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">new&lt;/span> EmbeddedZooKeeper&lt;span style="color:#719e07">(&lt;/span>2181&lt;span style="color:#719e07">,&lt;/span> &lt;span style="color:#cb4b16">false&lt;/span>&lt;span style="color:#719e07">).&lt;/span>start&lt;span style="color:#719e07">();&lt;/span> &lt;span style="color:#586e75">// #1
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> AnnotationConfigApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> AnnotationConfigApplicationContext&lt;span style="color:#719e07">(&lt;/span>ProviderConfiguration&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span> &lt;span style="color:#586e75">// #2
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span> &lt;span style="color:#586e75">// #3
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> System&lt;span style="color:#719e07">.&lt;/span>in&lt;span style="color:#719e07">.&lt;/span>read&lt;span style="color:#719e07">();&lt;/span> &lt;span style="color:#586e75">// #4
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Description:&lt;/p>
+&lt;ol>
+&lt;li>Start an embedded &lt;code>zookeeper&lt;/code> and provide service registry on port &lt;code>2181&lt;/code>&lt;/li>
+&lt;li>Initialize an example of an AnnotationConfigApplicationContext and pass the &lt;code>ProviderConfiguration&lt;/code> into the example to complete the automatic discovery and assembly of the &lt;code>Dubbo&lt;/code> service.&lt;/li>
+&lt;li>Start the &lt;code>Spring Context&lt;/code> and start providing external &lt;code>Dubbo&lt;/code> services.&lt;/li>
+&lt;li>Because it is a server, you need to prevent the process exit by blocking the main thread.&lt;/li>
+&lt;/ol>
+&lt;p>Start the &lt;code>main&lt;/code> method of the server, you will see the following output, on behalf of the server startup success, and registered the &lt;code>GreetingService&lt;/code> service in the &lt;code>ZookeeperRegistry&lt;/code>:&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">&lt;span style="color:#719e07">[&lt;/span>01/08/18 02:12:51:051 CST&lt;span style="color:#719e07">]&lt;/span> main INFO transport.AbstractServer: &lt;span style="color:#719e07">[&lt;/span>DUBBO&lt;span style="color:#719e07">]&lt;/span> Start NettyServer &lt;span style="color:#b58900">bind&lt;/span> /0.0.0.0:20880, &lt;span s [...]
+&lt;span style="color:#719e07">[&lt;/span>01/08/18 02:12:51:051 CST&lt;span style="color:#719e07">]&lt;/span> main INFO zookeeper.ZookeeperRegistry: &lt;span style="color:#719e07">[&lt;/span>DUBBO&lt;span style="color:#719e07">]&lt;/span> Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost&lt;span style="color:#719e07">=&lt;/span>true&amp;amp;&lt;span style="color:#268bd2">application&lt;/span>&lt;span style="color:#719e07">=&lt;/span>dubbo-annotati [...]
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5serverreference-service">5.Server:Reference Service&lt;/h3>
+&lt;p>Marking the member variable of the &lt;code>GreetingService&lt;/code> via &lt;code>@Reference&lt;/code> .The &lt;code>greetingService&lt;/code> is a reference to the &lt;code>Dubbo&lt;/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 &lt;code>GreetingService&lt;/code> interface.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">@Component&lt;/span>&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;annotatedConsumer&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">GreetingServiceConsumer&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Reference&lt;/span>
+&lt;span style="color:#268bd2">private&lt;/span> GreetingService greetingService&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> String &lt;span style="color:#268bd2">doSayHello&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String name&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> greetingService&lt;span style="color:#719e07">.&lt;/span>sayHello&lt;span style="color:#719e07">(&lt;/span>name&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6serverassembly-service-consumer">6.Server:Assembly Service consumer&lt;/h3>
+&lt;p>Just like &lt;strong>3. Server:Assembly Service Provider&lt;/strong> You can discover, assemble, and provide Dubbo&amp;rsquo;s service consumer through the Java config technology (@Configuration) and annotation scan (@EnableDubbo) in Spring.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">@Configuration&lt;/span>
+&lt;span style="color:#268bd2">@EnableDubbo&lt;/span>&lt;span style="color:#719e07">(&lt;/span>scanBasePackages &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.action&amp;#34;&lt;/span>&lt;span style="color:#719e07">)&lt;/span>
+&lt;span style="color:#268bd2">@ComponentScan&lt;/span>&lt;span style="color:#719e07">(&lt;/span>value &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">{&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.samples.action&amp;#34;&lt;/span>&lt;span style="color:#719e07">})&lt;/span>
+&lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">ConsumerConfiguration&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #1
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> ApplicationConfig &lt;span style="color:#268bd2">applicationConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ApplicationConfig applicationConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ApplicationConfig&lt;span style="color:#719e07">();&lt;/span>
+applicationConfig&lt;span style="color:#719e07">.&lt;/span>setName&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;dubbo-annotation-consumer&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> applicationConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #2
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> ConsumerConfig &lt;span style="color:#268bd2">consumerConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+ConsumerConfig consumerConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> ConsumerConfig&lt;span style="color:#719e07">();&lt;/span>
+consumerConfig&lt;span style="color:#719e07">.&lt;/span>setTimeout&lt;span style="color:#719e07">(&lt;/span>3000&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> consumerConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#268bd2">@Bean&lt;/span> &lt;span style="color:#586e75">// #3
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#268bd2">public&lt;/span> RegistryConfig &lt;span style="color:#268bd2">registryConfig&lt;/span>&lt;span style="color:#719e07">()&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+RegistryConfig registryConfig &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> RegistryConfig&lt;span style="color:#719e07">();&lt;/span>
+registryConfig&lt;span style="color:#719e07">.&lt;/span>setProtocol&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;zookeeper&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+registryConfig&lt;span style="color:#719e07">.&lt;/span>setAddress&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;localhost&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span>
+registryConfig&lt;span style="color:#719e07">.&lt;/span>setPort&lt;span style="color:#719e07">(&lt;/span>2181&lt;span style="color:#719e07">);&lt;/span>
+&lt;span style="color:#719e07">return&lt;/span> registryConfig&lt;span style="color:#719e07">;&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Description:&lt;/p>
+&lt;ul>
+&lt;li>Scan all classes marked with &lt;code>@Service&lt;/code> under &lt;code>com.alibaba.dubbo.samples.impl&lt;/code> with &lt;code>@Reference&lt;/code>&lt;/li>
+&lt;li>Via @Configuration, all @Beans in the ProviderConfiguration are assembled using the way of &lt;code>Java Config&lt;/code> and then injected into the Dubbo service, which means the class marked with &lt;code>@Reference&lt;/code>.Which included:
+i. &lt;code>ApplicationConfig&lt;/code>: Application configuration
+ii. &lt;code>ConsumerConfig&lt;/code>:Service consumer configuration
+iii.&lt;code>RegistryConfig&lt;/code>:Registry configuration.Note:The configuration here needs to be consistent with the configuration information of the EmbeddedZooKeeper when started by the service provider.&lt;/li>
+&lt;/ul>
+&lt;h3 id="7server-initiate-remote-calls">7.Server: Initiate Remote Calls&lt;/h3>
+&lt;p>In the &lt;code>main&lt;/code> method, you can start a &lt;code>Spring Context&lt;/code> to find the service consumer of the assembled &lt;code>Dubbo&lt;/code> from it, and initiate a remote call.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-Java" data-lang="Java">&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">class&lt;/span> &lt;span style="color:#268bd2">ConsumerBootstrap&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">static&lt;/span> &lt;span style="color:#dc322f">void&lt;/span> &lt;span style="color:#268bd2">main&lt;/span>&lt;span style="color:#719e07">(&lt;/span>String&lt;span style="color:#719e07">[]&lt;/span> args&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#719e07">{&lt;/span>
+AnnotationConfigApplicationContext context &lt;span style="color:#719e07">=&lt;/span> &lt;span style="color:#719e07">new&lt;/span> AnnotationConfigApplicationContext&lt;span style="color:#719e07">(&lt;/span>ConsumerConfiguration&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span> &lt;span style="color:#586e75">// #1
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>start&lt;span style="color:#719e07">();&lt;/span> &lt;span style="color:#586e75">// #2
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> GreetingServiceConsumer greetingServiceConsumer &lt;span style="color:#719e07">=&lt;/span> context&lt;span style="color:#719e07">.&lt;/span>getBean&lt;span style="color:#719e07">(&lt;/span>GreetingServiceConsumer&lt;span style="color:#719e07">.&lt;/span>class&lt;span style="color:#719e07">);&lt;/span> &lt;span style="color:#586e75">// #3
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> String hello &lt;span style="color:#719e07">=&lt;/span> greetingServiceConsumer&lt;span style="color:#719e07">.&lt;/span>doSayHello&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;annotation&amp;#34;&lt;/span>&lt;span style="color:#719e07">);&lt;/span> &lt;span style="color:#586e75">// #4
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> System&lt;span style="color:#719e07">.&lt;/span>out&lt;span style="color:#719e07">.&lt;/span>println&lt;span style="color:#719e07">(&lt;/span>&lt;span style="color:#2aa198">&amp;#34;result: &amp;#34;&lt;/span> &lt;span style="color:#719e07">+&lt;/span> hello&lt;span style="color:#719e07">);&lt;/span> &lt;span style="color:#586e75">// #5
+&lt;/span>&lt;span style="color:#586e75">&lt;/span> &lt;span style="color:#719e07">}&lt;/span>
+&lt;span style="color:#719e07">}&lt;/span>
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>Description:&lt;/p>
+&lt;ul>
+&lt;li>Initialize an example of an AnnotationConfigApplicationContext and pass the &lt;code>ProviderConfiguration&lt;/code> into the example to complete the automatic discovery and assembly of the &lt;code>Dubbo&lt;/code> service consumer.&lt;/li>
+&lt;li>start &lt;code>Spring Context&lt;/code>.&lt;/li>
+&lt;li>Find &lt;code>bean&lt;/code> which type is &lt;code>GreetingServiceConsumer&lt;/code> from &lt;code>Context&lt;/code>.&lt;/li>
+&lt;li>Call the &lt;code>doSayHello&lt;/code> method and finally initiate a remote call via Dubbo&amp;rsquo;s service reference (marked by @Reference)&lt;/li>
+&lt;li>Print call result
+Start the Server&amp;rsquo;s &lt;code>main&lt;/code> method, you will see the following output, which returns the &lt;code>result&lt;/code>: hello, annotation:&lt;/li>
+&lt;/ul>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">&lt;span style="color:#719e07">[&lt;/span>01/08/18 02:38:40:040 CST&lt;span style="color:#719e07">]&lt;/span> main INFO config.AbstractConfig: &lt;span style="color:#719e07">[&lt;/span>DUBBO&lt;span style="color:#719e07">]&lt;/span> Refer dubbo service com.alibaba.dubbo.samples.api.GreetingService from url zookeeper://localh [...]
+&lt;span style="color:#719e07">[&lt;/span>01/08/18 02:38:40:040 CST&lt;span style="color:#719e07">]&lt;/span> main INFO annotation.ReferenceBeanBuilder: &amp;lt;dubbo:reference &lt;span style="color:#268bd2">object&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;com.alibaba.dubbo.common.bytecode.proxy0@673be18f&amp;#34;&lt;/span> &lt;span style="color:#268bd2">singleton&lt;/span>&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2a [...]
+result: hello, annotation
+&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="conclusion">Conclusion&lt;/h2>
+&lt;p>By studying this article, the reader can master the basic concepts of &lt;code>Dubbo&lt;/code>&amp;rsquo;s exclusive &lt;code>annotations&lt;/code> , &lt;code>@EnableDubbo&lt;/code>, &lt;code>@Service&lt;/code>, &lt;code>@Reference&lt;/code>, and master it&amp;rsquo;s basic usage through a simple &lt;code>Dubbo&lt;/code> application.&lt;/p>
+&lt;p>In addition to traditional &lt;code>XML&lt;/code> configuration, &lt;code>Spring&lt;/code> offers more modern configurations such as annotation drivers, externalization, and auto-assembly.This article focuses on the development of &lt;code>Dubbo&lt;/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  [...]
+&lt;h2 id="introduction-of-zookeeper">Introduction of Zookeeper&lt;/h2>
+&lt;h3 id="the-basic-concept">The basic concept&lt;/h3>
+&lt;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.&lt;/p>
+&lt;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 &amp;lsquo;ZooKeeper ensemble&amp;rsquo;. 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. Clie [...]
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/zk-emsemble.png" alt="Diagram shows client-server architecture of ZooKeeper">
+&lt;em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O&amp;rsquo;Reilly&lt;/em>&lt;/p>
+&lt;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.&lt;/p>
+&lt;p>&lt;img src="http://dubbo.apache.org/imgs/blog/zk-tree.png" alt="zk-tree">
+&lt;em>Image Credit : ebook -Zookeeper-Distributed Process Coordination from O&amp;rsquo;Reilly&lt;/em>&lt;/p>
+&lt;h3 id="basic-implementation">Basic Implementation&lt;/h3>
+&lt;p>You could donwload and install Zookeeper directly&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.
+Or you could use Homebrew &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> &lt;code>brew install zookeeper&lt;/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. &lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/p>
+&lt;h4 id="1-running-the-zookeeper">1. Running the Zookeeper&lt;/h4>
+&lt;p>Execute the command to run zookeeper in a docker container&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">docker run --rm --name zookeeper -p 2181:2181 zookeeper
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="2-entering-the-zookeeper-container">2. Entering the zookeeper container&lt;/h4>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">docker &lt;span style="color:#b58900">exec&lt;/span> -it zookeeper bash
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>In the &lt;code>bin&lt;/code> directory, there is a command to start zookeeper &lt;code>zkServer&lt;/code> and the Management Console &lt;code>zkCli&lt;/code>&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">bash-4.4# ls -l bin
+total &lt;span style="color:#2aa198">36&lt;/span>
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">232&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 README.txt
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">1937&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkCleanup.sh
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">1056&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkCli.cmd
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">1534&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkCli.sh
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">1759&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkEnv.cmd
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">2696&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkEnv.sh
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">1089&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkServer.cmd
+-rwxr-xr-x &lt;span style="color:#2aa198">1&lt;/span> zookeepe zookeepe &lt;span style="color:#2aa198">6773&lt;/span> Mar &lt;span style="color:#2aa198">27&lt;/span> 04:32 zkServer.sh
+&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3-entering-the-zookeeper-management-interface-via-zkcli">3. Entering the zookeeper management interface via zkCli&lt;/h4>
+&lt;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.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="shell">bash-4.4# ps
+PID USER TIME COMMAND
+&lt;span style="color:#2aa198">1&lt;/span> zookeepe 0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir&lt;span style="color:#719e07">=&lt;/span>. -Dzookeeper.root
+&lt;span style="color:#2aa198">32&lt;/span> root 0:00 bash
+&lt;span style="color:#2aa198">42&lt;/span> root 0:00 ps
+&lt;/code>&lt;/pre>&lt;/div>&lt;p>So, it allows you to access Zookeeper&amp;rsquo;s console directly through &lt;code>zkCli &lt;/code> for management.&lt;/p>
+&lt;div class="highlight">&lt;pre style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-shell" data-lang="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
+&lt;span style="color:#719e07">[&lt;/span>zk: 127.0.0.1:2181&lt;span style="color:#719e07">(&lt;/span>CONNECTED&lt;span style="color:#719e07">)&lt;/span> 0&lt;span style="color:#719e07">]&lt;/span> &lt;span style="color:#b58900">help&lt;/span>
+ZooKeeper -server host:port cmd args
+stat path &lt;span style="color:#719e07">[&lt;/span>watch&lt;span style="color:#719e07">]&lt;/span>
+&lt;span style="color:#b58900">set&lt;/span> path data &lt;span style="color:#719e07">[&lt;/span>version&lt;span style="color:#719e07">]&lt;/span>
+ls path &lt;span style="color:#719e07">[&lt;/span>watch&lt;span style="color:#719e07">]&lt;/span>
+delquota &lt;span style="color:#719e07">[&lt;/span>-n|-b&lt;span style="color:#719e07">]&lt;/span> path
+ls2 path &lt;span style="color:#719e07">[&lt;/span>watch&lt;span style="color:#719e07">]&lt;/span>
+setAcl path acl
+setquota -n|-b val path
+&lt;span style="color:#b58900">history&lt;/span>
+redo cmdno
+printwatches on|off
+delete path &lt;span style="color:#719e07">[&lt;/span>version&lt;span style="color:#719e07">]&lt;/span>
+sync path
+listquota path
+rmr path
+get path &lt;span style="color:#719e07">[&lt;/span>watch&lt;span style="color:#719e07">]&lt;/span>
+create &lt;span style="color:#719e07">[&lt;/span>-s&lt;span style="color:#719e07">]&lt;/span> &lt;span style="color:#719e07">[&lt;/span>-e&lt;span style="color:#719e07">]&lt;/span> path data acl
+addauth scheme auth
+quit
+getAcl path
... 88710 lines suppressed ...