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 2019/11/05 09:13:00 UTC

[dubbo-website] branch asf-site updated: Automated deployment: Tue Nov 5 09:12:48 UTC 2019 8ef2c817748de9d13127407fcf00e6ffddc0670c

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 b405c43  Automated deployment: Tue Nov  5 09:12:48 UTC 2019 8ef2c817748de9d13127407fcf00e6ffddc0670c
b405c43 is described below

commit b405c43a5fd3739b973db329ea2b6c8712c34dc6
Author: htynkn <ht...@users.noreply.github.com>
AuthorDate: Tue Nov 5 09:12:48 2019 +0000

    Automated deployment: Tue Nov  5 09:12:48 UTC 2019 8ef2c817748de9d13127407fcf00e6ffddc0670c
---
 build/ecology.js                                   |   2 +-
 en-us/blog/dubbo-101.html                          |   8 +-
 en-us/blog/dubbo-101.json                          |   2 +-
 en-us/blog/dubbo-annotation.html                   |  14 +-
 en-us/blog/dubbo-annotation.json                   |   2 +-
 en-us/blog/dubbo-generic-invoke.html               |  32 +-
 en-us/blog/dubbo-generic-invoke.json               |   2 +-
 en-us/blog/dubbo-zk.html                           |   8 +-
 en-us/blog/dubbo-zk.json                           |   2 +-
 en-us/blog/first-dubbo-filter.html                 |   2 +-
 en-us/blog/first-dubbo-filter.json                 |   2 +-
 en-us/blog/introduction-to-dubbo-qos.html          |   2 +-
 en-us/blog/introduction-to-dubbo-qos.json          |   2 +-
 en-us/blog/introduction-to-dubbo-spi-2.html        |  48 +-
 en-us/blog/introduction-to-dubbo-spi-2.json        |   2 +-
 en-us/blog/introduction-to-dubbo-spi.html          |   4 +-
 en-us/blog/introduction-to-dubbo-spi.json          |   2 +-
 en-us/blog/pinpoint.html                           |   4 +-
 en-us/blog/pinpoint.json                           |   2 +-
 .../spring-boot-dubbo-start-stop-analysis.html     |   2 +-
 .../spring-boot-dubbo-start-stop-analysis.json     |   2 +-
 en-us/docs/admin/ops/pinpoint.html                 |   4 +-
 en-us/docs/admin/ops/pinpoint.json                 |   2 +-
 en-us/docs/dev/principals/dummy.html               |  44 +-
 en-us/docs/dev/principals/dummy.json               |   2 +-
 en-us/docs/user/benchmark-tool.html                |   4 +-
 en-us/docs/user/benchmark-tool.json                |   2 +-
 en-us/docs/user/configuration/annotation.html      |   2 +-
 en-us/docs/user/configuration/annotation.json      |   2 +-
 en-us/docs/user/configuration/api.html             |   4 +-
 en-us/docs/user/configuration/api.json             |   2 +-
 .../translate configuration-load-process.html      |   2 +-
 .../translate configuration-load-process.json      |   2 +-
 en-us/docs/user/demos/config-rule.html             |   2 +-
 en-us/docs/user/demos/config-rule.json             |   2 +-
 en-us/docs/user/demos/parameter-validation.html    |  44 +-
 en-us/docs/user/demos/parameter-validation.json    |   2 +-
 en-us/docs/user/demos/reference-config-cache.html  |   2 +-
 en-us/docs/user/demos/reference-config-cache.json  |   2 +-
 en-us/docs/user/demos/routing-rule.html            |   2 +-
 en-us/docs/user/demos/routing-rule.json            |   2 +-
 en-us/docs/user/demos/service-downgrade.html       |   2 +-
 en-us/docs/user/demos/service-downgrade.json       |   2 +-
 en-us/docs/user/demos/static-service.html          |   2 +-
 en-us/docs/user/demos/static-service.json          |   2 +-
 en-us/docs/user/references/protocol/memcached.html |   2 +-
 en-us/docs/user/references/protocol/memcached.json |   2 +-
 en-us/docs/user/references/protocol/redis.html     |   2 +-
 en-us/docs/user/references/protocol/redis.json     |   2 +-
 en-us/docs/user/references/protocol/rest.html      |   8 +-
 en-us/docs/user/references/protocol/rest.json      |   2 +-
 en-us/docs/user/rest.html                          |  10 +-
 en-us/docs/user/rest.json                          |   2 +-
 img/apollo-configcenter-dubbo.png                  | Bin 0 -> 645257 bytes
 img/blog/grpc/compiler-classes.png                 | Bin 0 -> 76594 bytes
 img/blog/grpc/compiler-protobuf.png                | Bin 0 -> 244582 bytes
 img/blog/grpc/dubbo-ptotocol.png                   | Bin 0 -> 763630 bytes
 img/blog/grpc/http1.png                            | Bin 0 -> 29116 bytes
 img/blog/grpc/http2.png                            | Bin 0 -> 5420 bytes
 md_json/blog.json                                  |   5 +
 .../Dubbo-supporting-gRPC-HTTP2-and-protobuf.html  | 634 +++++++++++++++++++++
 .../Dubbo-supporting-gRPC-HTTP2-and-protobuf.json  |   6 +
 zh-cn/blog/dubbo-101.html                          |  10 +-
 zh-cn/blog/dubbo-101.json                          |   2 +-
 zh-cn/blog/dubbo-annotation-driven.html            |  16 +-
 zh-cn/blog/dubbo-annotation-driven.json            |   2 +-
 zh-cn/blog/dubbo-annotation.html                   |  14 +-
 zh-cn/blog/dubbo-annotation.json                   |   2 +-
 zh-cn/blog/dubbo-compatible.html                   |   2 +-
 zh-cn/blog/dubbo-compatible.json                   |   2 +-
 zh-cn/blog/dubbo-echo-test.html                    |   8 +-
 zh-cn/blog/dubbo-echo-test.json                    |   2 +-
 zh-cn/blog/dubbo-externalized-configuration.html   |  62 +-
 zh-cn/blog/dubbo-externalized-configuration.json   |   2 +-
 zh-cn/blog/dubbo-generic-invoke.html               |  10 +-
 zh-cn/blog/dubbo-generic-invoke.json               |   2 +-
 zh-cn/blog/dubbo-meet-arthas.html                  |   2 +-
 zh-cn/blog/dubbo-meet-arthas.json                  |   2 +-
 zh-cn/blog/dubbo-network-interfaces.html           |   4 +-
 zh-cn/blog/dubbo-network-interfaces.json           |   2 +-
 zh-cn/blog/dubbo-registry-nacos-integration.html   |   6 +-
 zh-cn/blog/dubbo-registry-nacos-integration.json   |   2 +-
 zh-cn/blog/dubbo-rest.html                         | 102 ++--
 zh-cn/blog/dubbo-rest.json                         |   2 +-
 zh-cn/blog/dubbo-stub-mock.html                    |  22 +-
 zh-cn/blog/dubbo-stub-mock.json                    |   2 +-
 zh-cn/blog/dubbo-zk.html                           |   8 +-
 zh-cn/blog/dubbo-zk.json                           |   2 +-
 zh-cn/blog/first-dubbo-filter.html                 |   2 +-
 zh-cn/blog/first-dubbo-filter.json                 |   2 +-
 zh-cn/blog/introduction-to-dubbo-spi-2.html        |  48 +-
 zh-cn/blog/introduction-to-dubbo-spi-2.json        |   2 +-
 zh-cn/blog/introduction-to-dubbo-spi.html          |   4 +-
 zh-cn/blog/introduction-to-dubbo-spi.json          |   2 +-
 zh-cn/blog/pinpoint.html                           |   4 +-
 zh-cn/blog/pinpoint.json                           |   2 +-
 zh-cn/blog/service-and-version.html                |   4 +-
 zh-cn/blog/service-and-version.json                |   2 +-
 .../spring-boot-dubbo-start-stop-analysis.html     |   2 +-
 .../spring-boot-dubbo-start-stop-analysis.json     |   2 +-
 zh-cn/blog/test-verification.html                  |   4 +-
 zh-cn/blog/test-verification.json                  |   2 +-
 zh-cn/blog/use-zipkin-in-dubbo.html                |   2 +-
 zh-cn/blog/use-zipkin-in-dubbo.json                |   2 +-
 zh-cn/docs/admin/ops/pinpoint.html                 |   4 +-
 zh-cn/docs/admin/ops/pinpoint.json                 |   2 +-
 zh-cn/docs/dev/principals/dummy.html               |  44 +-
 zh-cn/docs/dev/principals/dummy.json               |   2 +-
 .../docs/source_code_guide/adaptive-extension.html |  56 +-
 .../docs/source_code_guide/adaptive-extension.json |   2 +-
 zh-cn/docs/source_code_guide/cluster.html          |   6 +-
 zh-cn/docs/source_code_guide/cluster.json          |   2 +-
 zh-cn/docs/source_code_guide/directory.html        |   2 +-
 zh-cn/docs/source_code_guide/directory.json        |   2 +-
 zh-cn/docs/source_code_guide/dubbo-spi.html        |  10 +-
 zh-cn/docs/source_code_guide/dubbo-spi.json        |   2 +-
 zh-cn/docs/source_code_guide/export-service.html   | 484 ++++++++--------
 zh-cn/docs/source_code_guide/export-service.json   |   2 +-
 zh-cn/docs/source_code_guide/loadbalance.html      |   2 +-
 zh-cn/docs/source_code_guide/loadbalance.json      |   2 +-
 zh-cn/docs/source_code_guide/refer-service.html    | 256 ++++-----
 zh-cn/docs/source_code_guide/refer-service.json    |   2 +-
 .../service-invoking-process.html                  |  12 +-
 .../service-invoking-process.json                  |   2 +-
 zh-cn/docs/user/benchmark-tool.html                |   4 +-
 zh-cn/docs/user/benchmark-tool.json                |   2 +-
 zh-cn/docs/user/configuration/annotation.html      |   2 +-
 zh-cn/docs/user/configuration/annotation.json      |   2 +-
 zh-cn/docs/user/configuration/api.html             |   4 +-
 zh-cn/docs/user/configuration/api.json             |   2 +-
 zh-cn/docs/user/configuration/config-center.html   |  10 +-
 zh-cn/docs/user/configuration/config-center.json   |   2 +-
 .../configuration/configuration-load-process.html  |   2 +-
 .../configuration/configuration-load-process.json  |   2 +-
 zh-cn/docs/user/configuration/properties.html      |   2 +-
 zh-cn/docs/user/configuration/properties.json      |   2 +-
 zh-cn/docs/user/demos/concurrency-control.html     |   2 +-
 zh-cn/docs/user/demos/concurrency-control.json     |   2 +-
 zh-cn/docs/user/demos/config-rule-deprecated.html  |   2 +-
 zh-cn/docs/user/demos/config-rule-deprecated.json  |   2 +-
 zh-cn/docs/user/demos/config-rule.html             |  78 +--
 zh-cn/docs/user/demos/config-rule.json             |   2 +-
 zh-cn/docs/user/demos/parameter-validation.html    |  44 +-
 zh-cn/docs/user/demos/parameter-validation.json    |   2 +-
 zh-cn/docs/user/demos/reference-config-cache.html  |   2 +-
 zh-cn/docs/user/demos/reference-config-cache.json  |   2 +-
 zh-cn/docs/user/demos/routing-rule-deprecated.html |   2 +-
 zh-cn/docs/user/demos/routing-rule-deprecated.json |   2 +-
 zh-cn/docs/user/demos/routing-rule.html            |  26 +-
 zh-cn/docs/user/demos/routing-rule.json            |   2 +-
 zh-cn/docs/user/demos/serialization.html           |  12 +-
 zh-cn/docs/user/demos/serialization.json           |   2 +-
 zh-cn/docs/user/demos/service-downgrade.html       |   2 +-
 zh-cn/docs/user/demos/service-downgrade.json       |   2 +-
 zh-cn/docs/user/demos/static-service.html          |   2 +-
 zh-cn/docs/user/demos/static-service.json          |   2 +-
 zh-cn/docs/user/recommend.html                     |   2 +-
 zh-cn/docs/user/recommend.json                     |   2 +-
 zh-cn/docs/user/references/protocol/memcached.html |   2 +-
 zh-cn/docs/user/references/protocol/memcached.json |   2 +-
 zh-cn/docs/user/references/protocol/redis.html     |   2 +-
 zh-cn/docs/user/references/protocol/redis.json     |   2 +-
 zh-cn/docs/user/references/protocol/rest.html      |   8 +-
 zh-cn/docs/user/references/protocol/rest.json      |   2 +-
 zh-cn/docs/user/rest.html                          |  10 +-
 zh-cn/docs/user/rest.json                          |   2 +-
 zh-cn/docs/user/serialization.html                 |  12 +-
 zh-cn/docs/user/serialization.json                 |   2 +-
 zh-cn/docs/user/versions/version-270.html          |  20 +-
 zh-cn/docs/user/versions/version-270.json          |   2 +-
 170 files changed, 1587 insertions(+), 944 deletions(-)

diff --git a/build/ecology.js b/build/ecology.js
index 95f72df..2a515b7 100644
--- a/build/ecology.js
+++ b/build/ecology.js
@@ -8,4 +8,4 @@ object-assign
 (c) Sindre Sorhus
 @license MIT
 */
-var a=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
\ No newline at end of file
+var a=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmn [...]
\ No newline at end of file
diff --git a/en-us/blog/dubbo-101.html b/en-us/blog/dubbo-101.html
index fbe96fe..63cd04d 100644
--- a/en-us/blog/dubbo-101.html
+++ b/en-us/blog/dubbo-101.html
@@ -122,7 +122,7 @@ Understand the work flow and basic concepts of RMI is helpful to handle current
         ServiceConfig&lt;GreetingsService&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;&gt;(); <span class="hljs-comment">// #1</span>
         service.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-provider"</span>)); <span class="hljs-comment">// #2</span>
         service.setRegistry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"multicast://224.5.6.7:1234"</span>)); <span class="hljs-comment">// #3</span>
-        service.setInterface(GreetingsService.class); <span class="hljs-comment">// #4</span>
+        service.setInterface(GreetingsService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #4</span>
         service.setRef(<span class="hljs-keyword">new</span> GreetingsServiceImpl()); <span class="hljs-comment">// #5</span>
         service.export(); <span class="hljs-comment">// #6</span>
         System.in.read(); <span class="hljs-comment">// #7</span>
@@ -145,7 +145,7 @@ Understand the work flow and basic concepts of RMI is helpful to handle current
         ReferenceConfig&lt;GreetingsService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;&gt;(); <span class="hljs-comment">// #1</span>
         reference.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-client"</span>)); <span class="hljs-comment">// #2</span>
         reference.setRegistry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"multicast://224.5.6.7:1234"</span>)); <span class="hljs-comment">// #3</span>
-        reference.setInterface(GreetingsService.class); <span class="hljs-comment">// #4</span>
+        reference.setInterface(GreetingsService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #4</span>
         GreetingsService greetingsService = reference.get(); <span class="hljs-comment">// #5</span>
         String message = greetingsService.sayHi(<span class="hljs-string">"dubbo"</span>); <span class="hljs-comment">// #6</span>
         System.out.println(message); <span class="hljs-comment">// #7</span>
@@ -155,7 +155,7 @@ Understand the work flow and basic concepts of RMI is helpful to handle current
 <p><strong>Notes</strong>:</p>
 <ol>
 <li>Create an instance of <em>ReferenceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li>
-<li>Create an instance of <em>AplicatonConfig</em>, and assemble it into <em>ReferenceConfig</em>.</li>
+<li>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 service provider.</li>
 <li>Assemble the service contract <em>GreetingsService</em> into <em>ReferenceConfig</em>.</li>
 <li>Obtain the agency of <em>GreetingsService</em> from <em>ReferenceConfig</em>.</li>
@@ -243,7 +243,7 @@ hi, dubbo
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoApplication</span> </span>{
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
 		<span class="hljs-keyword">new</span> EmbeddedZooKeeper(<span class="hljs-number">2181</span>, <span class="hljs-keyword">false</span>).start();  <span class="hljs-comment">// #1</span>
-		SpringApplication.run(DemoApplication.class, args); <span class="hljs-comment">// #2</span>
+		SpringApplication.run(DemoApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>; <span class="hljs-comment">// #2</span>
 	}
 }
 </code></pre>
diff --git a/en-us/blog/dubbo-101.json b/en-us/blog/dubbo-101.json
index 1c42ab1..7d8ead7 100644
--- a/en-us/blog/dubbo-101.json
+++ b/en-us/blog/dubbo-101.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-101.md",
-  "__html": "<h1>Your First Dubbo Demo</h1>\n<h2>Java RMI Introduction</h2>\n<p>Java RMI (Remote Method Invocation) is a mechanism that allows users to access or invocate an object and a method running on another JVM (Java Virtual Machine). RMI is an implementation of RPC (Remote Procedure Call) in java with support of OOP (Object Oriented Paradigms). Instead of bothering IDL (Interface Define Language), users can build distributed applications by depending on interfaces in an easy and n [...]
+  "__html": "<h1>Your First Dubbo Demo</h1>\n<h2>Java RMI Introduction</h2>\n<p>Java RMI (Remote Method Invocation) is a mechanism that allows users to access or invocate an object and a method running on another JVM (Java Virtual Machine). RMI is an implementation of RPC (Remote Procedure Call) in java with support of OOP (Object Oriented Paradigms). Instead of bothering IDL (Interface Define Language), users can build distributed applications by depending on interfaces in an easy and n [...]
   "link": "/en-us/blog/dubbo-101.html",
   "meta": {
     "title": "Your First Dubbo Demo",
diff --git a/en-us/blog/dubbo-annotation.html b/en-us/blog/dubbo-annotation.html
index 433c8b4..ee3aa01 100644
--- a/en-us/blog/dubbo-annotation.html
+++ b/en-us/blog/dubbo-annotation.html
@@ -37,7 +37,7 @@
      * <span class="hljs-doctag">@return</span> the base packages to scan
      * <span class="hljs-doctag">@see</span> DubboComponentScan#basePackages()
      */</span>
-    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class="hljs-string">"basePackages"</span>)
+    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">attribute</span> </span>= <span class="hljs-string">"basePackages"</span>)
     String[] scanBasePackages() <span class="hljs-keyword">default</span> {};
 
     <span class="hljs-comment">/**
@@ -48,7 +48,7 @@
      * <span class="hljs-doctag">@return</span> classes from the base packages to scan
      * <span class="hljs-doctag">@see</span> DubboComponentScan#basePackageClasses
      */</span>
-    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class="hljs-string">"basePackageClasses"</span>)
+    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">attribute</span> </span>= <span class="hljs-string">"basePackageClasses"</span>)
     Class&lt;?&gt;[] scanBasePackageClasses() <span class="hljs-keyword">default</span> {};    
 }
 </code></pre>
@@ -70,7 +70,7 @@
 <span class="hljs-meta">@Target</span>({ElementType.TYPE}) <span class="hljs-comment">// #1</span>
 <span class="hljs-meta">@Inherited</span>
 <span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Service {
-    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span>.class; <span class="hljs-comment">// #2</span>
+    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span><span class="hljs-class">.<span class="hljs-keyword">class</span></span>; <span class="hljs-comment">// #2</span>
     <span class="hljs-function">String <span class="hljs-title">interfaceName</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #3</span>
     <span class="hljs-function">String <span class="hljs-title">version</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #4</span>
     <span class="hljs-function">String <span class="hljs-title">group</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #5</span>
@@ -121,7 +121,7 @@
 <span class="hljs-meta">@Retention</span>(RetentionPolicy.RUNTIME)
 <span class="hljs-meta">@Target</span>({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) <span class="hljs-comment">// #1</span>
 <span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Reference {
-    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span>.class; <span class="hljs-comment">// #2</span>
+    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span><span class="hljs-class">.<span class="hljs-keyword">class</span></span>; <span class="hljs-comment">// #2</span>
     <span class="hljs-function">String <span class="hljs-title">interfaceName</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #3</span>
     <span class="hljs-function">String <span class="hljs-title">version</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #4</span>
     <span class="hljs-function">String <span class="hljs-title">group</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #5</span>
@@ -219,7 +219,7 @@ iv. <strong>ProtocolConfig</strong>:Protocol configuration</li>
 <pre><code class="language-Java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderBootstrap</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
         <span class="hljs-keyword">new</span> EmbeddedZooKeeper(<span class="hljs-number">2181</span>, <span class="hljs-keyword">false</span>).start(); <span class="hljs-comment">// #1</span>
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class); <span class="hljs-comment">// #2</span>
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #2</span>
         context.start(); <span class="hljs-comment">// #3</span>
         System.in.read(); <span class="hljs-comment">// #4</span>
     }
@@ -291,9 +291,9 @@ iii.<code>RegistryConfig</code>:Registry configuration.Note:The configuration he
 <p>In the <code>main</code> method, you can start a <code>Spring Context</code> to find the service consumer of the assembled <code>Dubbo</code> from it, and initiate a remote call.</p>
 <pre><code class="language-Java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerBootstrap</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class); <span class="hljs-comment">// #1</span>
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #1</span>
         context.start(); <span class="hljs-comment">// #2</span>
-        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class); <span class="hljs-comment">// #3</span>
+        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #3</span>
         String hello = greetingServiceConsumer.doSayHello(<span class="hljs-string">"annotation"</span>); <span class="hljs-comment">// #4</span>
         System.out.println(<span class="hljs-string">"result: "</span> + hello); <span class="hljs-comment">// #5</span>
     }
diff --git a/en-us/blog/dubbo-annotation.json b/en-us/blog/dubbo-annotation.json
index ce139f7..488711b 100644
--- a/en-us/blog/dubbo-annotation.json
+++ b/en-us/blog/dubbo-annotation.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-annotation.md",
-  "__html": "<h1>Use Annotations In Dubbo</h1>\n<p>With the widely promotion and implementation of Microservices Architecture, the Microservices Architecture represented by Spring Boot and Spring Cloud, in Java ecosystem, introduced some brand new programming model, like:</p>\n<ul>\n<li>Annotation-Driven</li>\n<li>External Configuration</li>\n<li>Auto-Configure</li>\n</ul>\n<p>New programming model have some advantages, for example, it does not require <code>XML</code> configuration, it  [...]
+  "__html": "<h1>Use Annotations In Dubbo</h1>\n<p>With the widely promotion and implementation of Microservices Architecture, the Microservices Architecture represented by Spring Boot and Spring Cloud, in Java ecosystem, introduced some brand new programming model, like:</p>\n<ul>\n<li>Annotation-Driven</li>\n<li>External Configuration</li>\n<li>Auto-Configure</li>\n</ul>\n<p>New programming model have some advantages, for example, it does not require <code>XML</code> configuration, it  [...]
   "link": "/en-us/blog/dubbo-annotation.html",
   "meta": {
     "title": "Use Annotations In Dubbo",
diff --git a/en-us/blog/dubbo-generic-invoke.html b/en-us/blog/dubbo-generic-invoke.html
index e94d317..94c2c5d 100644
--- a/en-us/blog/dubbo-generic-invoke.html
+++ b/en-us/blog/dubbo-generic-invoke.html
@@ -27,9 +27,9 @@ Generic invoke does not require attention on the server and can be exposed as no
 <pre><code class="language-xml">"userService" interface="com.alibaba.dubbo.samples.generic.api.IUserService" generic="true"/&gt;
 </code></pre>
 <p>Where you need to use it, you can call it by forcing a type cast to GenericService.</p>
-<pre><code class="language-java">GenericService userService = (GenericService) context.getBean(<span class="hljs-string">"userService"</span>);
-<span class="hljs-comment">// primary param and return value</span>
-String name = (String) userService.$invoke(<span class="hljs-string">"delete"</span>, <span class="hljs-keyword">new</span> String[]{<span class="hljs-keyword">int</span>.class.getName()}, <span class="hljs-keyword">new</span> Object[]{<span class="hljs-number">1</span>});
+<pre><code class="language-java">GenericService userService = (GenericService) context.getBean("userService");
+// primary param and return value
+String name = (String) userService.$invoke("delete", new String[]{int.class.getName()}, new Object[]{1});
 System.out.println(name);
 </code></pre>
 <p>Among them,</p>
@@ -45,26 +45,26 @@ System.out.println(name);
 </li>
 </ol>
 <h2>Generic invoke through API programming</h2>
-<pre><code class="language-java">ApplicationConfig application = <span class="hljs-keyword">new</span> ApplicationConfig()ApplicationConfig application = <span class="hljs-keyword">new</span> ApplicationConfig();
-application.setName(<span class="hljs-string">"api-generic-consumer"</span>);
+<pre><code class="language-java">ApplicationConfig application = new ApplicationConfig()ApplicationConfig application = new ApplicationConfig();
+application.setName("api-generic-consumer");
 
-RegistryConfig registry = <span class="hljs-keyword">new</span> RegistryConfig();
-registry.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>);
+RegistryConfig registry = new RegistryConfig();
+registry.setAddress("zookeeper://127.0.0.1:2181");
 
 application.setRegistry(registry);
 
-ReferenceConfig&lt;GenericService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
-<span class="hljs-comment">// weak type interface name</span>
-reference.setInterface(<span class="hljs-string">"com.alibaba.dubbo.samples.generic.api.IUserService"</span>);
-<span class="hljs-comment">// declared as a generalized interface</span>
-reference.setGeneric(<span class="hljs-keyword">true</span>);
+ReferenceConfig&lt;GenericService&gt; reference = new ReferenceConfig&lt;GenericService&gt;();
+// weak type interface name
+reference.setInterface("com.alibaba.dubbo.samples.generic.api.IUserService");
+// declared as a generalized interface
+reference.setGeneric(true);
 
 reference.setApplication(application);
 
-<span class="hljs-comment">// replace all interface references with com.alibaba.dubbo.rpc.service.GenericService</span>
+// replace all interface references with com.alibaba.dubbo.rpc.service.GenericService
 GenericService genericService = reference.get();
 
-String name = (String) genericService.$invoke(<span class="hljs-string">"delete"</span>, <span class="hljs-keyword">new</span> String[]{<span class="hljs-keyword">int</span>.class.getName()}, <span class="hljs-keyword">new</span> Object[]{<span class="hljs-number">1</span>});
+String name = (String) genericService.$invoke("delete", new String[]{int.class.getName()}, new Object[]{1});
 System.out.println(name);
 </code></pre>
 <p>Through the API, you don't need to configure the service in advance like XML. You can dynamically construct ReferenceConfig; the API is more common than XML.</p>
@@ -134,7 +134,7 @@ application.setRegistry(registry);
 
 ReferenceConfig&lt;GenericService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 <span class="hljs-comment">// weak type interface name</span>
-reference.setInterface(HiService.class);
+reference.setInterface(HiService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference.setApplication(application);
 
 HiService hiService = (HiService) reference.get();
@@ -142,7 +142,7 @@ System.out.println(hiService.hi(<span class="hljs-string">"dubbo"</span>));
 
 ReferenceConfig&lt;GenericService&gt; reference2 = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 <span class="hljs-comment">// weak type interface name</span>
-reference2.setInterface(HelloService.class);
+reference2.setInterface(HelloService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference2.setApplication(application);
 
 HelloService helloService = (HelloService) reference2.get();
diff --git a/en-us/blog/dubbo-generic-invoke.json b/en-us/blog/dubbo-generic-invoke.json
index 7b7dfd0..fa29070 100644
--- a/en-us/blog/dubbo-generic-invoke.json
+++ b/en-us/blog/dubbo-generic-invoke.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-generic-invoke.md",
-  "__html": "<h1>Generic invoke of Dubbo</h1>\n<p>The generic invoke could be considered to be used in the following cases:</p>\n<ul>\n<li>Service test platform</li>\n<li>API service gateway</li>\n</ul>\n<p>The generic invoke is mainly used when the consumer does not have an API interface;\ninstead of depending the interface jar package, the service call is initiated directly through the GenericService interface, and all POJOs in the parameters and return values are represented by a <cod [...]
+  "__html": "<h1>Generic invoke of Dubbo</h1>\n<p>The generic invoke could be considered to be used in the following cases:</p>\n<ul>\n<li>Service test platform</li>\n<li>API service gateway</li>\n</ul>\n<p>The generic invoke is mainly used when the consumer does not have an API interface;\ninstead of depending the interface jar package, the service call is initiated directly through the GenericService interface, and all POJOs in the parameters and return values are represented by a <cod [...]
   "link": "/en-us/blog/dubbo-generic-invoke.html",
   "meta": {
     "title": "Generic invoke of Dubbo",
diff --git a/en-us/blog/dubbo-zk.html b/en-us/blog/dubbo-zk.html
index c704486..05e3a03 100644
--- a/en-us/blog/dubbo-zk.html
+++ b/en-us/blog/dubbo-zk.html
@@ -105,7 +105,7 @@ world
 <h2>Using Zookeeper in Dubbo</h2>
 <p>Zookeeper is used for service registration discovery and configuration management in Dubbo, and the structure of data in Zookeeper is shown in the following figure:</p>
 <p><img src="../../img/blog/dubbo-in-zk.jpg" alt="dubbo-in-zk"></p>
-<p>First, all data related to Dubbo is organized under the root node of <code>/duboo</code>.</p>
+<p>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>.</p>
 <p>The three-level directory has two child nodes, <code>providers</code> and <code>consumers</code>, representing the supplier and customers of the service.</p>
 <p>The URL information for each application instance associated with the service will be recorded by the Level 4 directory. The <code>providers</code> and <code>consumer</code> will stored the providers information and the consumers information of the services seperately.<br>
@@ -150,7 +150,7 @@ For example, the service provider of <code>com.foo.BarService</code>  will regis
 <p>In the <code>main</code> method, you could provide the Dubbo service by running a Spring Context.</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderBootstrap</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class);
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.start();
         System.in.read();
     }
@@ -205,9 +205,9 @@ JLine support is enabled
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerBootstrap</span> </span>{
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.start();
-        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class);
+        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         String hello = greetingServiceConsumer.doSayHello(<span class="hljs-string">"zookeeper"</span>);
         System.out.println(<span class="hljs-string">"result: "</span> + hello);
         System.in.read();
diff --git a/en-us/blog/dubbo-zk.json b/en-us/blog/dubbo-zk.json
index bbbd96c..5e31a6d 100644
--- a/en-us/blog/dubbo-zk.json
+++ b/en-us/blog/dubbo-zk.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-zk.md",
-  "__html": "<h1>Using Zookeeper in Dubbo</h1>\n<h2>Introduction of Zookeeper</h2>\n<h3>The basic concept</h3>\n<p>In the mordern distrbuted applications, there are multiple coordination problems between nodes and nodes, including: leader election, group service, locking, configuration management, naming and synchronization. Apache Zookeeper, as its name implied, is a distributed, open-source coordination service framwork to address these demand.</p>\n<p>In order to ensure the high perfo [...]
+  "__html": "<h1>Using Zookeeper in Dubbo</h1>\n<h2>Introduction of Zookeeper</h2>\n<h3>The basic concept</h3>\n<p>In the mordern distrbuted applications, there are multiple coordination problems between nodes and nodes, including: leader election, group service, locking, configuration management, naming and synchronization. Apache Zookeeper, as its name implied, is a distributed, open-source coordination service framwork to address these demand.</p>\n<p>In order to ensure the high perfo [...]
   "link": "/en-us/blog/dubbo-zk.html",
   "meta": {
     "title": "Using Zookeeper in Dubbo",
diff --git a/en-us/blog/first-dubbo-filter.html b/en-us/blog/first-dubbo-filter.html
index 13f56fc..e108575 100644
--- a/en-us/blog/first-dubbo-filter.html
+++ b/en-us/blog/first-dubbo-filter.html
@@ -30,7 +30,7 @@ the Filter chain is constructed.</p>
     
     <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> &lt;T&gt; <span class="hljs-function">Invoker&lt;T&gt; <span class="hljs-title">buildInvokerChain</span><span class="hljs-params">(<span class="hljs-keyword">final</span> Invoker&lt;T&gt; invoker, String key, String group)</span> </span>{
         Invoker&lt;T&gt; last = invoker;
-        List&lt;Filter&gt; filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
+        List&lt;Filter&gt; filters = ExtensionLoader.getExtensionLoader(Filter<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getActivateExtension</span>(<span class="hljs-title">invoker</span>.<span class="hljs-title">getUrl</span>(), <span class="hljs-title">key</span>, <span class="hljs-title">group</span>)</span>;
         <span class="hljs-keyword">if</span> (filters.size() &gt; <span class="hljs-number">0</span>) {
             <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = filters.size() - <span class="hljs-number">1</span>; i &gt;= <span class="hljs-number">0</span>; i --) {
                 <span class="hljs-keyword">final</span> Filter filter = filters.get(i);
diff --git a/en-us/blog/first-dubbo-filter.json b/en-us/blog/first-dubbo-filter.json
index ed47b7e..b00f2c4 100644
--- a/en-us/blog/first-dubbo-filter.json
+++ b/en-us/blog/first-dubbo-filter.json
@@ -1,6 +1,6 @@
 {
   "filename": "first-dubbo-filter.md",
-  "__html": "<h1>First Dubbo Filter</h1>\n<h3>Overview</h3>\n<p>In overall design of Dubbo, Filter is a very important concept, most of Dubbo's functions are based on this\nextension point, and the Filter interception will be executed during each call.</p>\n<h4>Extension Mechanism of Dubbo Filter</h4>\n<p>There are already about 20 Filters implemented in Dubbo. Their entry is ProtocolFilterWrapper, ProtocolFilterWrapper\nmakes a Wrapper on Protocol and will be loaded when the extension i [...]
+  "__html": "<h1>First Dubbo Filter</h1>\n<h3>Overview</h3>\n<p>In overall design of Dubbo, Filter is a very important concept, most of Dubbo's functions are based on this\nextension point, and the Filter interception will be executed during each call.</p>\n<h4>Extension Mechanism of Dubbo Filter</h4>\n<p>There are already about 20 Filters implemented in Dubbo. Their entry is ProtocolFilterWrapper, ProtocolFilterWrapper\nmakes a Wrapper on Protocol and will be loaded when the extension i [...]
   "link": "/en-us/blog/first-dubbo-filter.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/blog/introduction-to-dubbo-qos.html b/en-us/blog/introduction-to-dubbo-qos.html
index f6d88a7..2c5627a 100644
--- a/en-us/blog/introduction-to-dubbo-qos.html
+++ b/en-us/blog/introduction-to-dubbo-qos.html
@@ -54,7 +54,7 @@ Escape character is '^]'.
   ?????????  ?????????  ???????????  ???????????   ????????
 <span class="hljs-meta">
 
-dubbo&gt;</span><span class="bash"></span>
+dubbo&gt;</span>
 </code></pre>
 <p>A <code>dubbo&gt;</code> prompt would show up once you connect to server. Now input <code>help</code>:</p>
 <pre><code class="language-sh">dubbo&gt;<span class="hljs-built_in">help</span>
diff --git a/en-us/blog/introduction-to-dubbo-qos.json b/en-us/blog/introduction-to-dubbo-qos.json
index 9bf7922..3723f36 100644
--- a/en-us/blog/introduction-to-dubbo-qos.json
+++ b/en-us/blog/introduction-to-dubbo-qos.json
@@ -1,6 +1,6 @@
 {
   "filename": "introduction-to-dubbo-qos.md",
-  "__html": "<h1>Manipulating Services Dynamically via QoS</h1>\n<p>QoS (short form of <strong>Quality of Service</strong>), is a common terminology talking about network devices. For example, by adjusting and manipulating the weights of ports of a router dynamically via QoS, engineers could give priority to services running on these ports and make sure these services' quality and reliability.</p>\n<p>In Dubbo, QoS is used to query and manipulate services dynamically, like getting a list [...]
+  "__html": "<h1>Manipulating Services Dynamically via QoS</h1>\n<p>QoS (short form of <strong>Quality of Service</strong>), is a common terminology talking about network devices. For example, by adjusting and manipulating the weights of ports of a router dynamically via QoS, engineers could give priority to services running on these ports and make sure these services' quality and reliability.</p>\n<p>In Dubbo, QoS is used to query and manipulate services dynamically, like getting a list [...]
   "link": "/en-us/blog/introduction-to-dubbo-qos.html",
   "meta": {
     "title": "Manipulating Services Dynamically via QoS",
diff --git a/en-us/blog/introduction-to-dubbo-spi-2.html b/en-us/blog/introduction-to-dubbo-spi-2.html
index c453549..3975962 100644
--- a/en-us/blog/introduction-to-dubbo-spi-2.html
+++ b/en-us/blog/introduction-to-dubbo-spi-2.html
@@ -31,29 +31,29 @@
 <li>getExtensionLoader
 This is a static factory method that enters an extensible interface and returns an ExtensionLoader entity class for this interface. With this entity class, you can get not only a specific extension based on name, but also an adaptive extension.</li>
 </ol>
-<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> &lt;T&gt; <span class="hljs-function">ExtensionLoader&lt;T&gt; <span class="hljs-title">getExtensionLoader</span><span class="hljs-params">(Class&lt;T&gt; type)</span> </span>{
-        <span class="hljs-comment">// An extension point must be an interface</span>
-        <span class="hljs-keyword">if</span> (!type.isInterface()) {
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Extension type("</span> + type + <span class="hljs-string">") is not interface!"</span>);
+<pre><code class="language-java">public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type) {
+        // An extension point must be an interface
+        if (!type.isInterface()) {
+            throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");
         }
-        <span class="hljs-comment">// @SPI annotations must be provided</span>
-        <span class="hljs-keyword">if</span> (!withExtensionAnnotation(type)) {
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Extension type without @SPI Annotation!"</span>);
+        // @SPI annotations must be provided
+        if (!withExtensionAnnotation(type)) {
+            throw new IllegalArgumentException("Extension type without @SPI Annotation!");
         }
-        <span class="hljs-comment">// Get the corresponding ExtensionLoader from the cache according to the interface</span>
-        <span class="hljs-comment">// Each extension will only be loaded once</span>
+        // Get the corresponding ExtensionLoader from the cache according to the interface
+        // Each extension will only be loaded once
         ExtensionLoader&lt;T&gt; loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);
-        <span class="hljs-keyword">if</span> (loader == <span class="hljs-keyword">null</span>) {
-            <span class="hljs-comment">// Initialize extension</span>
-            EXTENSION_LOADERS.putIfAbsent(type, <span class="hljs-keyword">new</span> ExtensionLoader&lt;T&gt;(type));
+        if (loader == null) {
+            // Initialize extension
+            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader&lt;T&gt;(type));
             loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);
         }
-        <span class="hljs-keyword">return</span> loader;
+        return loader;
 }
     
-<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">ExtensionLoader</span><span class="hljs-params">(Class&lt;?&gt; type)</span> </span>{
-        <span class="hljs-keyword">this</span>.type = type;
-        objectFactory = (type == ExtensionFactory.class ? <span class="hljs-keyword">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
+private ExtensionLoader(Class&lt;?&gt; type) {
+        this.type = type;
+        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
 }
 </code></pre>
 <ol start="2">
@@ -129,7 +129,7 @@ This is a static factory method that enters an extensible interface and returns
 
 <span class="hljs-comment">// synchronized in getExtensionClasses</span>
 <span class="hljs-keyword">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {
-        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);
+        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">if</span> (defaultAnnotation != <span class="hljs-keyword">null</span>) {
             String value = defaultAnnotation.value();
             <span class="hljs-keyword">if</span> (value != <span class="hljs-keyword">null</span> &amp;&amp; (value = value.trim()).length() &gt; <span class="hljs-number">0</span>) {
@@ -180,9 +180,9 @@ This is a static factory method that enters an extensible interface and returns
 }
 </code></pre>
 <p>To accomplish the automatic assembly of dependencies of the extended instances, you first need to know what the dependencies are and what the types of dependencies are. The solution of Dubbo is to find the Java standard setter method. That is, the method name starting with set has only one parameter. If such a set method exists in an extension class, Dubbo injects it into dependencies, which is similar to the injection of Spring's set method. However, dependency injection in Dubbo is  [...]
-<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">ExtensionLoader</span><span class="hljs-params">(Class&lt;?&gt; type)</span> </span>{
-        <span class="hljs-keyword">this</span>.type = type;
-        objectFactory = (type == ExtensionFactory.class ? <span class="hljs-keyword">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
+<pre><code class="language-java">private ExtensionLoader(Class&lt;?&gt; type) {
+        this.type = type;
+        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
 }
 </code></pre>
 <p>ObjectFacore is also an extension, obtained through <code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()</code>.</p>
@@ -200,7 +200,7 @@ This is a static factory method that enters an extensible interface and returns
     <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> List&lt;ExtensionFactory&gt; factories;
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">AdaptiveExtensionFactory</span><span class="hljs-params">()</span> </span>{
-        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);
+        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         List&lt;ExtensionFactory&gt; list = <span class="hljs-keyword">new</span> ArrayList&lt;ExtensionFactory&gt;();
         <span class="hljs-keyword">for</span> (String name : loader.getSupportedExtensions()) {
             list.add(loader.getExtension(name));
@@ -304,7 +304,7 @@ Let's first look at the code to create an adaptive extension class:</p>
 <pre><code class="language-java"><span class="hljs-keyword">private</span> Class&lt;?&gt; createAdaptiveExtensionClass() {
         String code = createAdaptiveExtensionClassCode();
         ClassLoader classLoader = findClassLoader();
-        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
+        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
         <span class="hljs-keyword">return</span> compiler.compile(code, classLoader);
 }
 </code></pre>
@@ -337,7 +337,7 @@ Below are the Java code example for Protocol adaptive class created by createAda
         String extName = (url.getProtocol() == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"dubbo"</span> : url.getProtocol());
         <span class="hljs-keyword">if</span> (extName == <span class="hljs-keyword">null</span>)
             <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url("</span> + url.toString() + <span class="hljs-string">") use keys([protocol])"</span>);
-        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
+        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">extName</span>)</span>;
         <span class="hljs-keyword">return</span> extension.export(arg0);
     }
 
@@ -347,7 +347,7 @@ Below are the Java code example for Protocol adaptive class created by createAda
         String extName = (url.getProtocol() == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"dubbo"</span> : url.getProtocol());
         <span class="hljs-keyword">if</span> (extName == <span class="hljs-keyword">null</span>)
             <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url("</span> + url.toString() + <span class="hljs-string">") use keys([protocol])"</span>);
-        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
+        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">extName</span>)</span>;
         <span class="hljs-keyword">return</span> extension.refer(arg0, arg1);
     }
 }
diff --git a/en-us/blog/introduction-to-dubbo-spi-2.json b/en-us/blog/introduction-to-dubbo-spi-2.json
index 188bef6..98e0ce9 100644
--- a/en-us/blog/introduction-to-dubbo-spi-2.json
+++ b/en-us/blog/introduction-to-dubbo-spi-2.json
@@ -1,6 +1,6 @@
 {
   "filename": "introduction-to-dubbo-spi-2.md",
-  "__html": "<h1>Dubbo extensible mechanism source code analysis</h1>\n<p>In the <a href=\"./introduction-to-dubbo-spi.md\">actual implementation of the Dubbo extensibility mechanism</a>, we learned some concepts of the Dubbo extension mechanism, explored the implementation of LoadBalance in Dubbo, and implemented a LoadBalance on our own. Do you think Dubbo's extension mechanism is great? Next, we will go deep into the source code of Dubbo and see what it is.</p>\n<h2>ExtensionLoader</h [...]
+  "__html": "<h1>Dubbo extensible mechanism source code analysis</h1>\n<p>In the <a href=\"./introduction-to-dubbo-spi.md\">actual implementation of the Dubbo extensibility mechanism</a>, we learned some concepts of the Dubbo extension mechanism, explored the implementation of LoadBalance in Dubbo, and implemented a LoadBalance on our own. Do you think Dubbo's extension mechanism is great? Next, we will go deep into the source code of Dubbo and see what it is.</p>\n<h2>ExtensionLoader</h [...]
   "link": "/en-us/blog/introduction-to-dubbo-spi-2.html",
   "meta": {
     "title": "Dubbo extensible mechanism source code analysis",
diff --git a/en-us/blog/introduction-to-dubbo-spi.html b/en-us/blog/introduction-to-dubbo-spi.html
index 8066822..1eea004 100644
--- a/en-us/blog/introduction-to-dubbo-spi.html
+++ b/en-us/blog/introduction-to-dubbo-spi.html
@@ -62,7 +62,7 @@ com.demo.MysqlRepository
 <ol start="4">
 <li>Load IRepository using ServiceLoader</li>
 </ol>
-<pre><code class="language-java">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository.class);
+<pre><code class="language-java">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 Iterator&lt;IRepository&gt; it = serviceLoader.iterator();
 <span class="hljs-keyword">while</span> (it != <span class="hljs-keyword">null</span> &amp;&amp; it.hasNext()){
     IRepository demoService = it.next();
@@ -146,7 +146,7 @@ consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalan
 </ul>
 <h3>6.2 Obtain LoadBalance extension</h3>
 <p>The code of LoadBalance in Dubbo is as follows:</p>
-<pre><code class="language-java">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName);
+<pre><code class="language-java">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">loadbalanceName</span>)</span>;
 </code></pre>
 <p>Using ExtensionLoader.getExtensionLoader(LoadBalance.class) method to obtain an implementation of ExtensionLoader, then we call getExtension and pass an extension alias to obtain the corresponding extension implementation.</p>
 <h2>7. Customize a LoadBalance Extension</h2>
diff --git a/en-us/blog/introduction-to-dubbo-spi.json b/en-us/blog/introduction-to-dubbo-spi.json
index f46d9de..b42222d 100644
--- a/en-us/blog/introduction-to-dubbo-spi.json
+++ b/en-us/blog/introduction-to-dubbo-spi.json
@@ -1,6 +1,6 @@
 {
   "filename": "introduction-to-dubbo-spi.md",
-  "__html": "<h1>Dubbo Extension Mechanism in Action</h1>\n<h2>1. Extension Mechanism of Dubbo</h2>\n<p>Dubbo is claimed as a high-performance RPC framework on its official website. Today, I want to talk about another great specialty of Dubbo --- its scalability.  As quote: Rome wasn’t built in a day. Any successful system always starts as a prototype. It is impossible to design a perfect system at the beginning. Instead, we should focus on true demand and keep improving the system. On t [...]
+  "__html": "<h1>Dubbo Extension Mechanism in Action</h1>\n<h2>1. Extension Mechanism of Dubbo</h2>\n<p>Dubbo is claimed as a high-performance RPC framework on its official website. Today, I want to talk about another great specialty of Dubbo --- its scalability.  As quote: Rome wasn’t built in a day. Any successful system always starts as a prototype. It is impossible to design a perfect system at the beginning. Instead, we should focus on true demand and keep improving the system. On t [...]
   "link": "/en-us/blog/introduction-to-dubbo-spi.html",
   "meta": {
     "title": "Dubbo Extension Mechanism in Action",
diff --git a/en-us/blog/pinpoint.html b/en-us/blog/pinpoint.html
index e7bec17..b229d91 100644
--- a/en-us/blog/pinpoint.html
+++ b/en-us/blog/pinpoint.html
@@ -181,7 +181,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoProviderApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoProviderApplication.class, args);
+		SpringApplication.run(DemoProviderApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
@@ -326,7 +326,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoConsumerApplication.class, args);
+		SpringApplication.run(DemoConsumerApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
diff --git a/en-us/blog/pinpoint.json b/en-us/blog/pinpoint.json
index 80cf5c9..bbd9bcc 100644
--- a/en-us/blog/pinpoint.json
+++ b/en-us/blog/pinpoint.json
@@ -1,6 +1,6 @@
 {
   "filename": "pinpoint.md",
-  "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).< [...]
+  "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).< [...]
   "link": "/en-us/blog/pinpoint.html",
   "meta": {
     "title": "Tracking with Pinpoint",
diff --git a/en-us/blog/spring-boot-dubbo-start-stop-analysis.html b/en-us/blog/spring-boot-dubbo-start-stop-analysis.html
index 7c08f4e..b34e61c 100644
--- a/en-us/blog/spring-boot-dubbo-start-stop-analysis.html
+++ b/en-us/blog/spring-boot-dubbo-start-stop-analysis.html
@@ -25,7 +25,7 @@
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DubboConsumerDemo</span> </span>{
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-        SpringApplication.run(DubboConsumerDemo.class,args);
+        SpringApplication.run(DubboConsumerDemo<span class="hljs-class">.<span class="hljs-keyword">class</span>,<span class="hljs-title">args</span>)</span>;
     }
 
 }
diff --git a/en-us/blog/spring-boot-dubbo-start-stop-analysis.json b/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
index 60e0cc8..c91fd3e 100644
--- a/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
+++ b/en-us/blog/spring-boot-dubbo-start-stop-analysis.json
@@ -1,6 +1,6 @@
 {
   "filename": "spring-boot-dubbo-start-stop-analysis.md",
-  "__html": "<h1>Source code analysis of spring-boot+Dubbo App start and stop</h1>\n<h2>Introduction</h2>\n<p><a href=\"https://github.com/apache/dubbo-spring-boot-project\">Dubbo Spring Boot</a> project is dedicated to simplifying the development of the Dubbo RPC framework in the Spring Boot application. It also integrates the feature of Spring Boot:</p>\n<ul>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">Autoconfigure</ [...]
+  "__html": "<h1>Source code analysis of spring-boot+Dubbo App start and stop</h1>\n<h2>Introduction</h2>\n<p><a href=\"https://github.com/apache/dubbo-spring-boot-project\">Dubbo Spring Boot</a> project is dedicated to simplifying the development of the Dubbo RPC framework in the Spring Boot application. It also integrates the feature of Spring Boot:</p>\n<ul>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">Autoconfigure</ [...]
   "link": "/en-us/blog/spring-boot-dubbo-start-stop-analysis.html",
   "meta": {
     "title": "Source code analysis of spring-boot+Dubbo App start and stop",
diff --git a/en-us/docs/admin/ops/pinpoint.html b/en-us/docs/admin/ops/pinpoint.html
index 18f48e0..e515dc7 100644
--- a/en-us/docs/admin/ops/pinpoint.html
+++ b/en-us/docs/admin/ops/pinpoint.html
@@ -181,7 +181,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoProviderApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoProviderApplication.class, args);
+		SpringApplication.run(DemoProviderApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
@@ -326,7 +326,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoConsumerApplication.class, args);
+		SpringApplication.run(DemoConsumerApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
diff --git a/en-us/docs/admin/ops/pinpoint.json b/en-us/docs/admin/ops/pinpoint.json
index 7451bde..3049b8c 100644
--- a/en-us/docs/admin/ops/pinpoint.json
+++ b/en-us/docs/admin/ops/pinpoint.json
@@ -1,6 +1,6 @@
 {
   "filename": "pinpoint.md",
-  "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).< [...]
+  "__html": "<h1>Tracking with Pinpoint</h1>\n<p>After using Dubbo to serve or integrate applications, assuming that a service backstage log shows an exception and that the service is invoked by multiple applications, it is often difficult to determine which application is called, and what is the cause of the problem, so we need a set of distributed tracking systems to quickly locate the problem. Pinpoint can help us quickly locate problems (of course, there are more than one solution).< [...]
   "link": "/en-us/docs/admin/ops/pinpoint.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/dev/principals/dummy.html b/en-us/docs/dev/principals/dummy.html
index 142fa00..295da0a 100644
--- a/en-us/docs/dev/principals/dummy.html
+++ b/en-us/docs/dev/principals/dummy.html
@@ -20,7 +20,7 @@
 <h2>Check for duplicated jars</h2>
 <p>The most annoying problem is that, if we have several jars with different version number at the same time, there will be a problem. Imagine that, a new version of the Class A may invoke a old version of the Class B, it's related to the JVM loading order. The problem may encounter occasionally and hard to resolve. So the first, let's try to avoid it. For each jar package, pick a class that will be loaded, check it for duplication for example:</p>
 <pre><code class="language-java"><span class="hljs-keyword">static</span> {  
-    Duplicate.checkDuplicate(Xxx.class);  
+    Duplicate.checkDuplicate(Xxx<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;  
 }  
 </code></pre>
 <p>Utility class for check duplication:</p>
@@ -72,43 +72,43 @@
 }  
 </code></pre>
 <p>Utility class for retrieve version:</p>
-<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Version</span> </span>{  
+<pre><code class="language-java">public final class Version {  
   
-    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">Version</span><span class="hljs-params">()</span> </span>{}  
+    private Version() {}  
   
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(Version.class);  
+    private static final Logger logger = LoggerFactory.getLogger(Version.class);  
   
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Pattern VERSION_PATTERN = Pattern.compile(<span class="hljs-string">"([0-9][0-9\\.\\-]*)\\.jar"</span>);  
+    private static final Pattern VERSION_PATTERN = Pattern.compile("([0-9][0-9\\.\\-]*)\\.jar");  
   
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String VERSION = getVersion(Version.class, <span class="hljs-string">"2.0.0"</span>);  
+    private static final String VERSION = getVersion(Version.class, "2.0.0");  
   
-    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getVersion</span><span class="hljs-params">()</span></span>{  
-        <span class="hljs-keyword">return</span> VERSION;  
+    public static String getVersion(){  
+        return VERSION;  
     }  
   
-    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getVersion</span><span class="hljs-params">(Class cls, String defaultVersion)</span> </span>{  
-        <span class="hljs-keyword">try</span> {  
-            <span class="hljs-comment">// search version number from MANIFEST.MF </span>
+    public static String getVersion(Class cls, String defaultVersion) {  
+        try {  
+            // search version number from MANIFEST.MF 
             String version = cls.getPackage().getImplementationVersion();  
-            <span class="hljs-keyword">if</span> (version == <span class="hljs-keyword">null</span> || version.length() == <span class="hljs-number">0</span>) {  
+            if (version == null || version.length() == 0) {  
                 version = cls.getPackage().getSpecificationVersion();  
             }  
-            <span class="hljs-keyword">if</span> (version == <span class="hljs-keyword">null</span> || version.length() == <span class="hljs-number">0</span>) {  
-                <span class="hljs-comment">// if not found, extract from jar name</span>
+            if (version == null || version.length() == 0) {  
+                // if not found, extract from jar name
                 String file = cls.getProtectionDomain().getCodeSource().getLocation().getFile();  
-                <span class="hljs-keyword">if</span> (file != <span class="hljs-keyword">null</span> &amp;amp;&amp;amp; file.length() &amp;gt; <span class="hljs-number">0</span> &amp;amp;&amp;amp; file.endsWith(<span class="hljs-string">".jar"</span>)) {  
+                if (file != null &amp;amp;&amp;amp; file.length() &amp;gt; 0 &amp;amp;&amp;amp; file.endsWith(".jar")) {  
                     Matcher matcher = VERSION_PATTERN.matcher(file);  
-                    <span class="hljs-keyword">while</span> (matcher.find() &amp;amp;&amp;amp; matcher.groupCount() &amp;gt; <span class="hljs-number">0</span>) {  
-                        version = matcher.group(<span class="hljs-number">1</span>);  
+                    while (matcher.find() &amp;amp;&amp;amp; matcher.groupCount() &amp;gt; 0) {  
+                        version = matcher.group(1);  
                     }  
                 }  
             }  
-            <span class="hljs-comment">// return version, return default if null</span>
-            <span class="hljs-keyword">return</span> version == <span class="hljs-keyword">null</span> || version.length() == <span class="hljs-number">0</span> ? defaultVersion : version;  
-        } <span class="hljs-keyword">catch</span> (Throwable e) { 
-            <span class="hljs-comment">// ignore exception, return default version</span>
+            // return version, return default if null
+            return version == null || version.length() == 0 ? defaultVersion : version;  
+        } catch (Throwable e) { 
+            // ignore exception, return default version
             logger.error(e.getMessage(), e);  
-            <span class="hljs-keyword">return</span> defaultVersion;  
+            return defaultVersion;  
         }  
     }  
   
diff --git a/en-us/docs/dev/principals/dummy.json b/en-us/docs/dev/principals/dummy.json
index 93f27d6..2f5b428 100644
--- a/en-us/docs/dev/principals/dummy.json
+++ b/en-us/docs/dev/principals/dummy.json
@@ -1,6 +1,6 @@
 {
   "filename": "dummy.md",
-  "__html": "<h1>&quot;Fool-proof&quot; design</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/804187\">http://javatar.iteye.com/blog/804187</a></p>\n</blockquote>\n<p>Recently I was feeling stupid because I solved too many stupid problems. The service framework is becoming more widely used. Every day, I have to help the endpoint user to resolve problems. Gradually, it is found that most of the problems are configuration errors, or duplicated files or classes, or network f [...]
+  "__html": "<h1>&quot;Fool-proof&quot; design</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/804187\">http://javatar.iteye.com/blog/804187</a></p>\n</blockquote>\n<p>Recently I was feeling stupid because I solved too many stupid problems. The service framework is becoming more widely used. Every day, I have to help the endpoint user to resolve problems. Gradually, it is found that most of the problems are configuration errors, or duplicated files or classes, or network f [...]
   "link": "/en-us/docs/dev/principals/dummy.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/benchmark-tool.html b/en-us/docs/user/benchmark-tool.html
index ede1463..cfd07f8 100644
--- a/en-us/docs/user/benchmark-tool.html
+++ b/en-us/docs/user/benchmark-tool.html
@@ -33,7 +33,7 @@
 <li>Implement the invoke method and create a local interface proxy by serviceFactory,and finish your own business logic, as follows:</li>
 </ul>
 <pre><code class="language-java">    <span class="hljs-function"><span class="hljs-keyword">public</span> Object <span class="hljs-title">invoke</span><span class="hljs-params">(ServiceFactory serviceFactory)</span> </span>{
-        DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);
+        DemoService demoService = (DemoService) serviceFactory.get(DemoService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">return</span> demoService.sendRequest(<span class="hljs-string">"hello"</span>);
     }
 </code></pre>
@@ -45,7 +45,7 @@
 <p>Put the demo.benchmark.jar and service API jar into directory dubbo.benchmark/lib</p>
 </li>
 <li>
-<p>Configuring duubo.properties</p>
+<p>Configuring dubbo.properties</p>
 </li>
 <li>
 <p>Run run.bat(windows) or <a href="http://run.sh">run.sh</a>(linux)</p>
diff --git a/en-us/docs/user/benchmark-tool.json b/en-us/docs/user/benchmark-tool.json
index dadb0a6..97e84c3 100644
--- a/en-us/docs/user/benchmark-tool.json
+++ b/en-us/docs/user/benchmark-tool.json
@@ -1,6 +1,6 @@
 {
   "filename": "benchmark-tool.md",
-  "__html": "<h1>Beanchmark testing tool installer</h1>\n<ul>\n<li>download: git clone <a href=\"https://github.com/apache/dubbo.git\">https://github.com/apache/dubbo.git</a></li>\n<li>compile benchmark: cd dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>uncompress benchmark: dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>Read ReadMe.txt (the contents are as follows, in the compressed package.)</p>\n<ul>\n<li>\n< [...]
+  "__html": "<h1>Beanchmark testing tool installer</h1>\n<ul>\n<li>download: git clone <a href=\"https://github.com/apache/dubbo.git\">https://github.com/apache/dubbo.git</a></li>\n<li>compile benchmark: cd dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>uncompress benchmark: dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>Read ReadMe.txt (the contents are as follows, in the compressed package.)</p>\n<ul>\n<li>\n< [...]
   "link": "/en-us/docs/user/benchmark-tool.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/annotation.html b/en-us/docs/user/configuration/annotation.html
index 3d51b98..a802c24 100644
--- a/en-us/docs/user/configuration/annotation.html
+++ b/en-us/docs/user/configuration/annotation.html
@@ -70,7 +70,7 @@ dubbo.consumer.timeout=3000
 </code></pre>
 <h3>Invoke service</h3>
 <pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
-    AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);
+    AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     context.start();
     <span class="hljs-keyword">final</span> AnnotationAction annotationAction = (AnnotationAction) context.getBean(<span class="hljs-string">"annotationAction"</span>);
     String hello = annotationAction.doSayHello(<span class="hljs-string">"world"</span>);
diff --git a/en-us/docs/user/configuration/annotation.json b/en-us/docs/user/configuration/annotation.json
index 2fe806a..2c7335a 100644
--- a/en-us/docs/user/configuration/annotation.json
+++ b/en-us/docs/user/configuration/annotation.json
@@ -1,6 +1,6 @@
 {
   "filename": "annotation.md",
-  "__html": "<h1>Annotation Configuration</h1>\n<p>Requires<code>2.6.3</code> or higher\nclick here to view the <a href=\"https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-annotation\">complete sample</a></p>\n<h2>Provider Side</h2>\n<h3><code>Service</code> annotation for exporting</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</sp [...]
+  "__html": "<h1>Annotation Configuration</h1>\n<p>Requires<code>2.6.3</code> or higher\nclick here to view the <a href=\"https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-annotation\">complete sample</a></p>\n<h2>Provider Side</h2>\n<h3><code>Service</code> annotation for exporting</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</sp [...]
   "link": "/en-us/docs/user/configuration/annotation.html",
   "meta": {
     "title": "Annotation Configuration",
diff --git a/en-us/docs/user/configuration/api.html b/en-us/docs/user/configuration/api.html
index d41be0d..81ff8dd 100644
--- a/en-us/docs/user/configuration/api.html
+++ b/en-us/docs/user/configuration/api.html
@@ -48,7 +48,7 @@ ServiceConfig&lt;XxxService&gt; service = <span class="hljs-keyword">new</span>
 service.setApplication(application);
 service.setRegistry(registry); <span class="hljs-comment">// Use setRegistries() for multi-registry case</span>
 service.setProtocol(protocol); <span class="hljs-comment">// Use setProtocols() for multi-protocol case</span>
-service.setInterface(XxxService.class);
+service.setInterface(XxxService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 service.setRef(xxxService);
 service.setVersion(<span class="hljs-string">"1.0.0"</span>);
  
@@ -78,7 +78,7 @@ registry.setPassword(<span class="hljs-string">"bbb"</span>);
 ReferenceConfig&lt;XxxService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class="hljs-comment">// In case of memory leak, please cache.</span>
 reference.setApplication(application);
 reference.setRegistry(registry); 
-reference.setInterface(XxxService.class);
+reference.setInterface(XxxService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference.setVersion(<span class="hljs-string">"1.0.0"</span>);
  
 <span class="hljs-comment">// Use xxxService just like a local bean</span>
diff --git a/en-us/docs/user/configuration/api.json b/en-us/docs/user/configuration/api.json
index bb5868b..5451378 100644
--- a/en-us/docs/user/configuration/api.json
+++ b/en-us/docs/user/configuration/api.json
@@ -1,6 +1,6 @@
 {
   "filename": "api.md",
-  "__html": "<h1>API Configuration</h1>\n<p>All API properties have counterparts in XML, see <a href=\"../references/xml/introduction.md\">XML References</a> for details. For example <code>ApplicationConfig.setName(&quot;xxx&quot;)</code> equals to  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>Provider Side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span>  [...]
+  "__html": "<h1>API Configuration</h1>\n<p>All API properties have counterparts in XML, see <a href=\"../references/xml/introduction.md\">XML References</a> for details. For example <code>ApplicationConfig.setName(&quot;xxx&quot;)</code> equals to  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>Provider Side</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span>  [...]
   "link": "/en-us/docs/user/configuration/api.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/configuration/translate configuration-load-process.html b/en-us/docs/user/configuration/translate configuration-load-process.html
index 1db4598..fc2dd07 100644
--- a/en-us/docs/user/configuration/translate configuration-load-process.html	
+++ b/en-us/docs/user/configuration/translate configuration-load-process.html	
@@ -148,7 +148,7 @@
     ServiceConfig&lt;GreetingsService&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;&gt;();
     service.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-provider"</span>));
     service.setRegistry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"multicast://224.5.6.7:1234"</span>));
-    service.setInterface(GreetingsService.class);
+    service.setInterface(GreetingsService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     service.setRef(<span class="hljs-keyword">new</span> GreetingsServiceImpl());
     service.export();
     System.out.println(<span class="hljs-string">"first-dubbo-provider is running."</span>);
diff --git a/en-us/docs/user/configuration/translate configuration-load-process.json b/en-us/docs/user/configuration/translate configuration-load-process.json
index 464ee44..001db7a 100644
--- a/en-us/docs/user/configuration/translate configuration-load-process.json	
+++ b/en-us/docs/user/configuration/translate configuration-load-process.json	
@@ -1,6 +1,6 @@
 {
   "filename": "translate configuration-load-process.md",
-  "__html": "<h1>Configuration Loading Process</h1>\n<p>This document focuses on <strong>how the Dubbo framework collects the required configuration</strong> (including application configuration, registry configuration, service configuration, etc.) <strong>during the application startup phase</strong> to complete the process of service exposure and reference.</p>\n<p>Depending on how you drive it (such as Spring or naked API programming), the configuration form will certainly vary, for d [...]
+  "__html": "<h1>Configuration Loading Process</h1>\n<p>This document focuses on <strong>how the Dubbo framework collects the required configuration</strong> (including application configuration, registry configuration, service configuration, etc.) <strong>during the application startup phase</strong> to complete the process of service exposure and reference.</p>\n<p>Depending on how you drive it (such as Spring or naked API programming), the configuration form will certainly vary, for d [...]
   "link": "/en-us/docs/user/configuration/translate configuration-load-process.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/config-rule.html b/en-us/docs/user/demos/config-rule.html
index dee6c4f..857f61e 100644
--- a/en-us/docs/user/demos/config-rule.html
+++ b/en-us/docs/user/demos/config-rule.html
@@ -14,7 +14,7 @@
 <body>
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a  [...]
 <p>Write then dynamic configuration to the registry center,This feature is usually done by the monitoring center or the center's page.</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000"</span>));
 </code></pre>
diff --git a/en-us/docs/user/demos/config-rule.json b/en-us/docs/user/demos/config-rule.json
index 1e1013a..84f3f69 100644
--- a/en-us/docs/user/demos/config-rule.json
+++ b/en-us/docs/user/demos/config-rule.json
@@ -1,6 +1,6 @@
 {
   "filename": "config-rule.md",
-  "__html": "<h1>Configure rule</h1>\n<p>Write then dynamic configuration to the registry center,This feature is usually done by the monitoring center or the center's page.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf [...]
+  "__html": "<h1>Configure rule</h1>\n<p>Write then dynamic configuration to the registry center,This feature is usually done by the monitoring center or the center's page.</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegistry registry = registryFactory.getRegistry(URL.valueO [...]
   "link": "/en-us/docs/user/demos/config-rule.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/parameter-validation.html b/en-us/docs/user/demos/parameter-validation.html
index 4d7f855..b0c9b59 100644
--- a/en-us/docs/user/demos/parameter-validation.html
+++ b/en-us/docs/user/demos/parameter-validation.html
@@ -46,8 +46,8 @@
     <span class="hljs-meta">@Size</span>(min = <span class="hljs-number">1</span>, max = <span class="hljs-number">20</span>) <span class="hljs-comment">// range</span>
     <span class="hljs-keyword">private</span> String name;
  
-    <span class="hljs-meta">@NotNull</span>(groups = ValidationService.Save.class) <span class="hljs-comment">// It is not allowed to be blank when saving. When it is updated, it is allowed to be blank, indicating that the field is not updated </span>
-    <span class="hljs-meta">@Pattern</span>(regexp = <span class="hljs-string">"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"</span>)
+    <span class="hljs-meta">@NotNull</span>(groups = ValidationService.Save<span class="hljs-class">.<span class="hljs-keyword">class</span>) // <span class="hljs-title">It</span> <span class="hljs-title">is</span> <span class="hljs-title">not</span> <span class="hljs-title">allowed</span> <span class="hljs-title">to</span> <span class="hljs-title">be</span> <span class="hljs-title">blank</span> <span class="hljs-title">when</span> <span class="hljs-title">saving</span>. <span class="hlj [...]
+    @<span class="hljs-title">Pattern</span>(<span class="hljs-title">regexp</span> </span>= <span class="hljs-string">"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"</span>)
     <span class="hljs-keyword">private</span> String email;
  
     <span class="hljs-meta">@Min</span>(<span class="hljs-number">18</span>) <span class="hljs-comment">// min value</span>
@@ -112,8 +112,8 @@
 <pre><code class="language-java"><span class="hljs-keyword">import</span> javax.validation.GroupSequence;
  
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">ValidationService</span> </span>{   
-    <span class="hljs-meta">@GroupSequence</span>(Update.class) <span class="hljs-comment">// validate the Update group rules at the same time</span>
-    <span class="hljs-meta">@interface</span> Save{}
+    <span class="hljs-meta">@GroupSequence</span>(Update<span class="hljs-class">.<span class="hljs-keyword">class</span>) // <span class="hljs-title">validate</span> <span class="hljs-title">the</span> <span class="hljs-title">Update</span> <span class="hljs-title">group</span> <span class="hljs-title">rules</span> <span class="hljs-title">at</span> <span class="hljs-title">the</span> <span class="hljs-title">same</span> <span class="hljs-title">time</span>
+    @<span class="hljs-title">interface</span> <span class="hljs-title">Save</span></span>{}
     <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">save</span><span class="hljs-params">(ValidationParameter parameter)</span></span>;
  
     <span class="hljs-meta">@interface</span> Update{} 
@@ -137,29 +137,29 @@
 <pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.examples.validation.api.ValidationService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"validationService"</span> <span class="hljs-attr">validation</span>=<span class="hljs-string">"true"</span> /&gt;</span>
 </code></pre>
 <h2>Validate Exception</h2>
-<pre><code class="language-java"><span class="hljs-keyword">import</span> javax.validation.ConstraintViolationException;
-<span class="hljs-keyword">import</span> javax.validation.ConstraintViolationException;
+<pre><code class="language-java">import javax.validation.ConstraintViolationException;
+import javax.validation.ConstraintViolationException;
  
-<span class="hljs-keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
  
-<span class="hljs-keyword">import</span> org.apache.dubbo.examples.validation.api.ValidationParameter;
-<span class="hljs-keyword">import</span> org.apache.dubbo.examples.validation.api.ValidationService;
-<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.examples.validation.api.ValidationParameter;
+import org.apache.dubbo.examples.validation.api.ValidationService;
+import org.apache.dubbo.rpc.RpcException;
  
-<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ValidationConsumer</span> </span>{   
-    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
-        String config = ValidationConsumer.class.getPackage().getName().replace(<span class="hljs-string">'.'</span>, <span class="hljs-string">'/'</span>) + <span class="hljs-string">"/validation-consumer.xml"</span>;
-        ClassPathXmlApplicationContext context = <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(config);
+public class ValidationConsumer {   
+    public static void main(String[] args) throws Exception {
+        String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + "/validation-consumer.xml";
+        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
         context.start();
-        ValidationService validationService = (ValidationService)context.getBean(<span class="hljs-string">"validationService"</span>);
-        <span class="hljs-comment">// Error</span>
-        <span class="hljs-keyword">try</span> {
-            parameter = <span class="hljs-keyword">new</span> ValidationParameter();
+        ValidationService validationService = (ValidationService)context.getBean("validationService");
+        // Error
+        try {
+            parameter = new ValidationParameter();
             validationService.save(parameter);
-            System.out.println(<span class="hljs-string">"Validation ERROR"</span>);
-        } <span class="hljs-keyword">catch</span> (RpcException e) { <span class="hljs-comment">// throw RpcException</span>
-            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); <span class="hljs-comment">// Inside a ConstraintViolationException</span>
-            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); <span class="hljs-comment">// You can get the collection of validation error details</span>
+            System.out.println("Validation ERROR");
+        } catch (RpcException e) { // throw RpcException
+            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); // Inside a ConstraintViolationException
+            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); // You can get the collection of validation error details
             System.out.println(violations);
         }
     } 
diff --git a/en-us/docs/user/demos/parameter-validation.json b/en-us/docs/user/demos/parameter-validation.json
index a6be139..6dc67ba 100644
--- a/en-us/docs/user/demos/parameter-validation.json
+++ b/en-us/docs/user/demos/parameter-validation.json
@@ -1,6 +1,6 @@
 {
   "filename": "parameter-validation.md",
-  "__html": "<h1>Parameter Validation</h1>\n<p>The parameter validation <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is based on [JSR303] (<a href=\"https://jcp.org/en/jsr/detail?id=303\">https://jcp.org/en/jsr/detail?id=303</a>). The user simply add the validation annotation of the JSR303 and declares the filter for validation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Maven Dependency</h2>\n<pre><code class=\"language- [...]
+  "__html": "<h1>Parameter Validation</h1>\n<p>The parameter validation <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> is based on [JSR303] (<a href=\"https://jcp.org/en/jsr/detail?id=303\">https://jcp.org/en/jsr/detail?id=303</a>). The user simply add the validation annotation of the JSR303 and declares the filter for validation <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Maven Dependency</h2>\n<pre><code class=\"language- [...]
   "link": "/en-us/docs/user/demos/parameter-validation.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/reference-config-cache.html b/en-us/docs/user/demos/reference-config-cache.html
index f51cdc0..55bbc10 100644
--- a/en-us/docs/user/demos/reference-config-cache.html
+++ b/en-us/docs/user/demos/reference-config-cache.html
@@ -17,7 +17,7 @@
 <p>Therefore, since <code>2.4.0</code>, dubbo provides a simple utility ReferenceConfigCache for caching instances of <code>ReferenceConfig</code>.</p>
 <p>Use as follows:</p>
 <pre><code class="language-java">ReferenceConfig&lt;XxxService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;XxxService&gt;();
-reference.setInterface(XxxService.class);
+reference.setInterface(XxxService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference.setVersion(<span class="hljs-string">"1.0.0"</span>);
 ......
 ReferenceConfigCache cache = ReferenceConfigCache.getCache();
diff --git a/en-us/docs/user/demos/reference-config-cache.json b/en-us/docs/user/demos/reference-config-cache.json
index 9011b60..61d972d 100644
--- a/en-us/docs/user/demos/reference-config-cache.json
+++ b/en-us/docs/user/demos/reference-config-cache.json
@@ -1,6 +1,6 @@
 {
   "filename": "reference-config-cache.md",
-  "__html": "<h1>ReferenceConfig Cache</h1>\n<p>The instance of <code>ReferenceConfig</code> is heavy. It encapsulates the connection to the registry and the connection to the provider, so it need to be cached. Otherwise, repeatedly generating <code>ReferenceConfig</code> may cause performance problems , memory and connection leaks. This problem is easy to ignored when programming in API mode.</p>\n<p>Therefore, since <code>2.4.0</code>, dubbo provides a simple utility ReferenceConfigCac [...]
+  "__html": "<h1>ReferenceConfig Cache</h1>\n<p>The instance of <code>ReferenceConfig</code> is heavy. It encapsulates the connection to the registry and the connection to the provider, so it need to be cached. Otherwise, repeatedly generating <code>ReferenceConfig</code> may cause performance problems , memory and connection leaks. This problem is easy to ignored when programming in API mode.</p>\n<p>Therefore, since <code>2.4.0</code>, dubbo provides a simple utility ReferenceConfigCac [...]
   "link": "/en-us/docs/user/demos/reference-config-cache.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/routing-rule.html b/en-us/docs/user/demos/routing-rule.html
index 60e45fd..29b16e0 100644
--- a/en-us/docs/user/demos/routing-rule.html
+++ b/en-us/docs/user/demos/routing-rule.html
@@ -16,7 +16,7 @@
 <p>The routing rules <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> determine the target server of one service call. It has two kinds of routing rules: conditional routing rules and script routing rules. It also support extension<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>.</p>
 <h2>Write Routing Rules</h2>
 <p>Writing routing rules to the registry is usually done by the monitoring center or the console page.</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"route://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule="</span> + URL.encode(<span class="hljs-string">"host = 10.20.153.10 =&gt; host = 10.20.153.11"</span>)));
 </code></pre>
diff --git a/en-us/docs/user/demos/routing-rule.json b/en-us/docs/user/demos/routing-rule.json
index 112b6b0..8ba667b 100644
--- a/en-us/docs/user/demos/routing-rule.json
+++ b/en-us/docs/user/demos/routing-rule.json
@@ -1,6 +1,6 @@
 {
   "filename": "routing-rule.md",
-  "__html": "<h1>Routing Rules</h1>\n<p>The routing rules <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> determine the target server of one service call. It has two kinds of routing rules: conditional routing rules and script routing rules. It also support extension<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Write Routing Rules</h2>\n<p>Writing routing rules to the registry is usually done by the monitoring center or the co [...]
+  "__html": "<h1>Routing Rules</h1>\n<p>The routing rules <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> determine the target server of one service call. It has two kinds of routing rules: conditional routing rules and script routing rules. It also support extension<sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>.</p>\n<h2>Write Routing Rules</h2>\n<p>Writing routing rules to the registry is usually done by the monitoring center or the co [...]
   "link": "/en-us/docs/user/demos/routing-rule.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/service-downgrade.html b/en-us/docs/user/demos/service-downgrade.html
index 207557e..6664ba3 100644
--- a/en-us/docs/user/demos/service-downgrade.html
+++ b/en-us/docs/user/demos/service-downgrade.html
@@ -15,7 +15,7 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a  [...]
 <p>You can temporarilly shield a non-critical service through the service downgrade and define the return policy for it.</p>
 <p>Publish dynamic configuration rule to the registry:</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null"</span>));
 </code></pre>
diff --git a/en-us/docs/user/demos/service-downgrade.json b/en-us/docs/user/demos/service-downgrade.json
index b1e4b76..70be702 100644
--- a/en-us/docs/user/demos/service-downgrade.json
+++ b/en-us/docs/user/demos/service-downgrade.json
@@ -1,6 +1,6 @@
 {
   "filename": "service-downgrade.md",
-  "__html": "<h1>Service-Downgrade</h1>\n<p>You can temporarilly shield a non-critical service through the service downgrade and define the return policy for it.</p>\n<p>Publish dynamic configuration rule to the registry:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.1 [...]
+  "__html": "<h1>Service-Downgrade</h1>\n<p>You can temporarilly shield a non-critical service through the service downgrade and define the return policy for it.</p>\n<p>Publish dynamic configuration rule to the registry:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegistry  [...]
   "link": "/en-us/docs/user/demos/service-downgrade.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/demos/static-service.html b/en-us/docs/user/demos/static-service.html
index 621b0af..386196d 100644
--- a/en-us/docs/user/demos/static-service.html
+++ b/en-us/docs/user/demos/static-service.html
@@ -23,7 +23,7 @@
 </code></pre>
 <p>dynamic mode is disabled when service provider initially registers, then we need to enable it manually. When disconnects, the setting will not be deleted automatically, need to disable it manually.</p>
 <p>For a third party service provider like “memcachd”, it can directly write the address information of service provider to registry, which can be used by consumer.</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo"</span>));
 </code></pre>
diff --git a/en-us/docs/user/demos/static-service.json b/en-us/docs/user/demos/static-service.json
index 26e4e73..6d6b5ba 100644
--- a/en-us/docs/user/demos/static-service.json
+++ b/en-us/docs/user/demos/static-service.json
@@ -1,6 +1,6 @@
 {
   "filename": "static-service.md",
-  "__html": "<h1>Static Service</h1>\n<ul>\n<li>Sometimes we want to manually manage the registration and deregistration for service provider, we need to set registry to non-dynamoic mode.</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</ [...]
+  "__html": "<h1>Static Service</h1>\n<ul>\n<li>Sometimes we want to manually manage the registration and deregistration for service provider, we need to set registry to non-dynamoic mode.</li>\n</ul>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</ [...]
   "link": "/en-us/docs/user/demos/static-service.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/memcached.html b/en-us/docs/user/references/protocol/memcached.html
index 535104f..2a1a2cf 100644
--- a/en-us/docs/user/references/protocol/memcached.html
+++ b/en-us/docs/user/references/protocol/memcached.html
@@ -15,7 +15,7 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a  [...]
 <p>RPC protocol based on memcached implementation.</p>
 <h2>Register memcached service address</h2>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash"</span>));
 </code></pre>
diff --git a/en-us/docs/user/references/protocol/memcached.json b/en-us/docs/user/references/protocol/memcached.json
index 838e53a..50dbc3e 100644
--- a/en-us/docs/user/references/protocol/memcached.json
+++ b/en-us/docs/user/references/protocol/memcached.json
@@ -1,6 +1,6 @@
 {
   "filename": "memcached.md",
-  "__html": "<h1>memcached://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register memcached service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"memcached: [...]
+  "__html": "<h1>memcached://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register memcached service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper [...]
   "link": "/en-us/docs/user/references/protocol/memcached.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/redis.html b/en-us/docs/user/references/protocol/redis.html
index d01b37c..4641078 100644
--- a/en-us/docs/user/references/protocol/redis.html
+++ b/en-us/docs/user/references/protocol/redis.html
@@ -15,7 +15,7 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a  [...]
 <p>RPC protocol based on memcached implementation.</p>
 <h2>Register redis service address</h2>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"redis://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash"</span>));
 </code></pre>
diff --git a/en-us/docs/user/references/protocol/redis.json b/en-us/docs/user/references/protocol/redis.json
index c05d639..f022eac 100644
--- a/en-us/docs/user/references/protocol/redis.json
+++ b/en-us/docs/user/references/protocol/redis.json
@@ -1,6 +1,6 @@
 {
   "filename": "redis.md",
-  "__html": "<h1>redis://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register redis service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\"redis://10.20.153. [...]
+  "__html": "<h1>redis://</h1>\n<p>RPC protocol based on memcached implementation.</p>\n<h2>Register redis service address</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20 [...]
   "link": "/en-us/docs/user/references/protocol/redis.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/references/protocol/rest.html b/en-us/docs/user/references/protocol/rest.html
index d1671ff..2c21148 100644
--- a/en-us/docs/user/references/protocol/rest.html
+++ b/en-us/docs/user/references/protocol/rest.html
@@ -280,12 +280,12 @@ http://localhost:8080/users/1003
 <p>注意:只有在设置server=&quot;jetty&quot;或者server=&quot;tomcat&quot;或者server=&quot;servlet&quot;的时候,你才能通过以上方法正确的得到HttpServletRequest和HttpServletResponse,因为只有这几种server实现了servlet容器。</p>
 </blockquote>
 <p>为了简化编程,在此你也可以用泛型的方式来直接获取特定类型的request/response:</p>
-<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());
+<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getRemoteAddr</span>())</span>;
 }
 
-<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse.class));
+<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
 }
 </code></pre>
 <p>如果request/response不符合指定的类型,这里也会返回null。</p>
diff --git a/en-us/docs/user/references/protocol/rest.json b/en-us/docs/user/references/protocol/rest.json
index 00b0ae5..0260fe8 100644
--- a/en-us/docs/user/references/protocol/rest.json
+++ b/en-us/docs/user/references/protocol/rest.json
@@ -1,6 +1,6 @@
 {
   "filename": "rest.md",
-  "__html": "<h1>rest://</h1>\n<p>基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持</p>\n<h2>快速入门</h2>\n<p>在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。</p>\n<p>这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。</p>\n<p>首先,开发服务的接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span  [...]
+  "__html": "<h1>rest://</h1>\n<p>基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持</p>\n<h2>快速入门</h2>\n<p>在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。</p>\n<p>这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。</p>\n<p>首先,开发服务的接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span  [...]
   "link": "/en-us/docs/user/references/protocol/rest.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/en-us/docs/user/rest.html b/en-us/docs/user/rest.html
index 019ba75..2982edb 100644
--- a/en-us/docs/user/rest.html
+++ b/en-us/docs/user/rest.html
@@ -424,12 +424,12 @@ In order to maintain the neutrality of the protocol, <code>RpcContext.getRequest
 implemented the servlet container.</p>
 </blockquote>
 <p>To simplify the programme, you can also use generic to get a specific type of request/response:</p>
-<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());
+<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getRemoteAddr</span>())</span>;
 }
 
-<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse.class));
+<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
 }
 </code></pre>
 <p>If request/response does not correspond to the specific type, it would return null.</p>
@@ -690,7 +690,7 @@ Response response = target.request().post(Entity.entity(user, MediaType.APPLICAT
     <span class="hljs-keyword">if</span> (response.getStatus() != <span class="hljs-number">200</span>) {
         <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"Failed with HTTP error code : "</span> + response.getStatus());
     }
-    System.out.println(<span class="hljs-string">"The generated id is "</span> + response.readEntity(RegistrationResult.class).getId());
+    System.out.println(<span class="hljs-string">"The generated id is "</span> + response.readEntity(RegistrationResult<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getId</span>())</span>;
 } <span class="hljs-keyword">finally</span> {
     response.close();
     client.close(); <span class="hljs-comment">//Do not close the client every time in real development, such as HTTP long connection is held by the client</span>
diff --git a/en-us/docs/user/rest.json b/en-us/docs/user/rest.json
index 9b078c0..b095c23 100644
--- a/en-us/docs/user/rest.json
+++ b/en-us/docs/user/rest.json
@@ -1,6 +1,6 @@
 {
   "filename": "rest.md",
-  "__html": "<h1>Developing RESTful Remoting in Dubbo</h1>\n<p><strong>Original author: Li Shen</strong></p>\n<p><strong>Document copyright: <a href=\"HTTP://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0license Signature - No interpretation</a></strong></p>\n<p>Working in progress ...</p>\n<blockquote>\n<p>This article is lengthy since REST involves many aspects. Besides, it refers to the document style of Spring and so on. Not only limited to usage of the framework but also strives t [...]
+  "__html": "<h1>Developing RESTful Remoting in Dubbo</h1>\n<p><strong>Original author: Li Shen</strong></p>\n<p><strong>Document copyright: <a href=\"HTTP://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0license Signature - No interpretation</a></strong></p>\n<p>Working in progress ...</p>\n<blockquote>\n<p>This article is lengthy since REST involves many aspects. Besides, it refers to the document style of Spring and so on. Not only limited to usage of the framework but also strives t [...]
   "link": "/en-us/docs/user/rest.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/img/apollo-configcenter-dubbo.png b/img/apollo-configcenter-dubbo.png
new file mode 100644
index 0000000..c6d48d5
Binary files /dev/null and b/img/apollo-configcenter-dubbo.png differ
diff --git a/img/blog/grpc/compiler-classes.png b/img/blog/grpc/compiler-classes.png
new file mode 100644
index 0000000..d48cac6
Binary files /dev/null and b/img/blog/grpc/compiler-classes.png differ
diff --git a/img/blog/grpc/compiler-protobuf.png b/img/blog/grpc/compiler-protobuf.png
new file mode 100644
index 0000000..8e084f1
Binary files /dev/null and b/img/blog/grpc/compiler-protobuf.png differ
diff --git a/img/blog/grpc/dubbo-ptotocol.png b/img/blog/grpc/dubbo-ptotocol.png
new file mode 100644
index 0000000..f12129b
Binary files /dev/null and b/img/blog/grpc/dubbo-ptotocol.png differ
diff --git a/img/blog/grpc/http1.png b/img/blog/grpc/http1.png
new file mode 100644
index 0000000..006ad83
Binary files /dev/null and b/img/blog/grpc/http1.png differ
diff --git a/img/blog/grpc/http2.png b/img/blog/grpc/http2.png
new file mode 100644
index 0000000..7a20692
Binary files /dev/null and b/img/blog/grpc/http2.png differ
diff --git a/md_json/blog.json b/md_json/blog.json
index 56ff2e0..f73e119 100644
--- a/md_json/blog.json
+++ b/md_json/blog.json
@@ -296,6 +296,11 @@
   ],
   "zh-cn": [
     {
+      "filename": "Dubbo-supporting-gRPC-HTTP2-and-protobuf.md",
+      "link": "/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.html",
+      "meta": {}
+    },
+    {
       "filename": "apachecon-na-2018.md",
       "link": "/zh-cn/blog/apachecon-na-2018.html",
       "meta": {
diff --git a/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.html b/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.html
new file mode 100644
index 0000000..ea75877
--- /dev/null
+++ b/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.html
@@ -0,0 +1,634 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+	<meta name="keywords" content="Dubbo-supporting-gRPC-HTTP2-and-protobuf" />
+	<meta name="description" content="Dubbo-supporting-gRPC-HTTP2-and-protobuf" />
+	<!-- 网页标签标题 -->
+	<title>Dubbo-supporting-gRPC-HTTP2-and-protobuf</title>
+	<link rel="shortcut icon" href="/img/dubbo.ico"/>
+	<link rel="stylesheet" href="/build/blogDetail.css" />
+</head>
+<body>
+	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a h [...]
+<p>本文整理自刘军在 Dubbo 成都 meetup 上分享的《Dubbo 在多语言和协议穿透性方向上的探索》。</p>
+<p>本文总体上可分为基础产品简介、Dubbo 对 gRPC (HTTP/2) 和 Protobuf 的支持及示例演示三部分,在简介部分介绍了 Dubbo、HTTP/2、gRPC、Protobuf 的基本概念和特点;第二部分介绍了 Dubbo 为何要支持 gRPC (HTTP/2) 和 Protobuf,以及这种支持为 gRPC 和 Dubbo 开发带来的好处与不同;第三部分通过两个实例分别演示了 Dubbo gRPC 和 Dubbo Protobuf 的使用方式。</p>
+<h2>基本介绍</h2>
+<h3>Dubbo 协议</h3>
+<p>从协议层面展开,以下是当前 2.7 版本支持的 Dubbo 协议</p>
+<p><img src="img/blog/grpc/dubbo-ptotocol.png" alt="image-20191029103919557"></p>
+<p>众所周知,Dubbo 协议是直接定义在 TCP 传输层协议之上,由于 TCP 高可靠全双工的特点,为 Dubbo 协议的定义提供了最大的灵活性,但同时也正是因为这样的灵活性,RPC 协议普遍都是定制化的私有协议,Dubbo 同样也面临这个问题。在这里我们着重讲一下 Dubbo 在协议通用性方面值得改进的地方,关于协议详细解析请参见<a href="http://dubbo.apache.org/zh-cn/blog/dubbo-protocol.html">官网博客</a></p>
+<ul>
+<li>Dubbo 协议体 Body 中有一个可扩展的 attachments 部分,这给 RPC 方法之外额外传递附加属性提供了可能,是一个很好的设计。但是类似的 Header 部分,却缺少类似的可扩展 attachments,这点可参考 HTTP 定义的 Ascii Header 设计,将 Body Attachments 和 Header Attachments 做职责划分。</li>
+<li>Body 协议体中的一些 RPC 请求定位符如 Service Name、Method Name、Version 等,可以提到 Header 中,和具体的序列化协议解耦,以更好的被网络基础设施识别或用于流量管控。</li>
+<li>扩展性不够好,欠缺协议升级方面的设计,如 Header 头中没有预留的状态标识位,或者像 HTTP 有专为协议升级或协商设计的特殊 packet。</li>
+<li>在 Java 版本的代码实现上,不够精简和通用。如在链路传输中,存在一些语言绑定的内容;消息体中存在冗余内容,如 Service Name 在 Body 和 Attachments 中都存在。</li>
+</ul>
+<h3>HTTP/1</h3>
+<p>相比于直接构建与 TPC 传输层的私有 RPC 协议,构建于 HTTP 之上的远程调用解决方案会有更好的通用性,如WebServices 或 REST 架构,使用 HTTP + JSON 可以说是一个事实标准的解决方案。</p>
+<p>之所有选择构建在 HTTP 之上,我认为有两个最大的优势:</p>
+<ol>
+<li>HTTP 的语义和可扩展性能很好的满足 RPC 调用需求。</li>
+<li>通用性,HTTP 协议几乎被网络上的所有设备所支持,具有很好的协议穿透性。</li>
+</ol>
+<p><img src="../../img/blog/grpc/http1.png" alt="image-20191029113404906"></p>
+<p>具体来说,HTTP/1 的优势和限制是:</p>
+<ul>
+<li>
+<p>典型的 Request – Response 模型,一个链路上一次只能有一个等待的 Request 请求</p>
+</li>
+<li>
+<p>HTTP/1 支持 Keep-Alive 链接,避免了链接重复创建开销</p>
+</li>
+<li>
+<p>Human Readable Headers,使用更通用、更易于人类阅读的头部传输格式</p>
+</li>
+<li>
+<p>无直接 Server Push 支持,需要使用 Polling Long-Polling 等变通模式</p>
+</li>
+</ul>
+<h3>HTTP/2</h3>
+<p>HTTP/2 保留了 HTTP/1 的所有语义,在保持兼容的同时,在通信模型和传输效率上做了很大的改进。</p>
+<p><img src="../../img/blog/grpc/http2.png" alt="image-20191029113416731"></p>
+<ul>
+<li>
+<p>支持单条链路上的 Multiplexing,相比于 Request - Response 独占链路,基于 Frame 实现更高效利用链路</p>
+</li>
+<li>
+<p>Request - Stream 语义,原生支持 Server Push 和 Stream 数据传输</p>
+</li>
+<li>
+<p>Flow Control,单条 Stream 粒度的和整个链路粒度的流量控制</p>
+</li>
+<li>
+<p>头部压缩 HPACK</p>
+</li>
+<li>
+<p>Binary Frame</p>
+</li>
+<li>
+<p>原生 TLS 支持</p>
+</li>
+</ul>
+<h3>gRPC</h3>
+<p>上面提到了在 HTTP 及 TCP 协议之上构建 RPC 协议各自的优缺点,相比于 Dubbo 构建于 TPC 传输层之上,Google 选择将 gRPC 直接定义在 HTTP/2 协议之上,关于 gRPC 的 [基本介绍](<a href="https://platformlab.stanford.edu/Seminar">https://platformlab.stanford.edu/Seminar</a> Talks/gRPC.pdf)和 <a href="https://grpc.io/blog/principles/?spm=ata.13261165.0.0.2be55017XbUhs8">设计愿景</a> 请参考以上两篇文章,我这里仅摘取 设计愿景 中几个能反映 gRPC 设计目的特性来做简单说明。</p>
+<ul>
+<li>
+<p>Coverage &amp; Simplicity,协议设计和框架实现要足够通用和简单,能运行在任何设备之上,甚至一些资源首先的如 IoT、Mobile 等设备。</p>
+</li>
+<li>
+<p>Interoperability &amp; Reach,要构建在更通用的协议之上,协议本身要能被网络上几乎所有的基础设施所支持。</p>
+</li>
+<li>
+<p>General Purpose &amp; Performant,要在场景和性能间做好平衡,首先协议本身要是适用于各种场景的,同时也要尽量有高的性能。</p>
+</li>
+<li>
+<p>Payload Agnostic,协议上传输的负载要保持语言和平台中立。</p>
+</li>
+<li>
+<p>Streaming,要支持 Request - Response、Request - Stream、Bi-Steam 等通信模型。</p>
+</li>
+<li>
+<p>Flow Control,协议自身具备流量感知和限制的能力。</p>
+</li>
+<li>
+<p>Metadata Exchange,在 RPC 服务定义之外,提供额外附加数据传输的能力。</p>
+</li>
+</ul>
+<p>总的来说,在这样的设计理念指导下,gRPC 最终被设计为一个跨语言、跨平台的、通用的、高性能的、基于 HTTP/2 的 RPC 协议和框架。</p>
+<h3>Protobuf</h3>
+<p><a href="https://developers.google.com/protocol-buffers/docs/overview">Protocol buffers (Protobuf)</a> 是 Google 推出的一个跨平台、语言中立的结构化数据描述和序列化的产品,它定义了一套结构化数据定义的协议,同时也提供了相应的 <a href="https://github.com/protocolbuffers/protobuf/releases/tag/v3.10.0">Compiler</a> 工具,用来将语言中立的描述转化为相应语言的具体描述。</p>
+<p>它的一些特性包括:</p>
+<ul>
+<li>
+<p>跨语言 跨平台,语言中立的数据描述格式,默认提供了生成多种语言的 Compiler 工具。</p>
+</li>
+<li>
+<p>安全性,由于反序列化的范围和输出内容格式都是 Compiler 在编译时预生成的,因此绕过了类似 Java Deserialization Vulnarability 的问题。</p>
+</li>
+<li>
+<p>二进制 高性能</p>
+</li>
+<li>
+<p>强类型</p>
+</li>
+<li>
+<p>字段变更向后兼容</p>
+</li>
+</ul>
+<pre><code class="language-idl">message Person {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+}
+</code></pre>
+<p>除了结构化数据描述之外,Protobuf 还支持定义 RPC 服务,它允许我们定义一个 <code>.proto</code> 的服务描述文件,进而利用 Protobuf Compiler 工具生成特定语言和 RPC 框架的接口和 stub。后续将要具体讲到的 gRPC + Protobuf、Dubbo-gRPC + Protobuf 以及 Dubbo + Protobuf 都是通过定制 Compiler 类实现的。</p>
+<pre><code class="language-idl">service SearchService {
+ rpc Search (SearchRequest) returns (SearchResponse);
+}
+</code></pre>
+<h2>Dubbo 所做的支持</h2>
+<p>跨语言的服务开发涉及到多个方面,从服务定义、RPC 协议到序列化协议都要做到语言中立,同时还针对每种语言有对应的 SDK 实现。虽然得益于社区的贡献,现在 Dubbo 在多语言 SDK 实现上逐步有了起色,已经提供了包括 Java, Go, PHP, C#, Python, NodeJs, C 等版本的客户端或全量实现版本,但在以上提到的跨语言友好型方面,以上三点还是有很多可改进之处。</p>
+<ul>
+<li>
+<p>协议,上面我们已经分析过 Dubbo 协议既有的缺点,如果能在 HTTP/2 之上构建应用层协议,则无疑能避免这些弊端,同时最大可能的提高协议的穿透性,避免网关等协议转换组件的存在,更有利于链路上的流量管控。考虑到 gRPC 是构建在 HTTP/2 之上,并且已经是云原生领域推荐的通信协议,Dubbo 在第一阶段选择了直接支持 gRPC 协议作为当前的 HTTP/2 解决方案。我们也知道 gRPC 框架自身的弊端在于易用性不足以及服务治理能力欠缺(这也是目前绝大多数厂商不会直接裸用 gRPC 框架的原因),通过将其集成进 Dubbo 框架,用户可以方便的使用 Dubbo 编程模型 + Dubbo 服务治理 + gRPC 协议通信的组合。</p>
+</li>
+<li>
+<p>服务定义,当前 Dubbo 的服务定义和具体的编程语言绑定,没有提供一种语言中立的服务描述格式,比如 Java 就是定义 Interface 接口,到了其他语言又得重新以另外的格式定义一遍。因此 Dubbo 通过支持 Protobuf 实现了语言中立的服务定义。</p>
+</li>
+<li>
+<p>序列化,Dubbo 当前支持的序列化包括 Json、Hessian2、Kryo、FST、Java 等,而这其中支持跨语言的只有 Json、Hessian2,通用的 Json 有固有的性能问题,而 Hessian2 无论在效率还是多语言 SDK 方面都有所欠缺。为此,Dubbo 通过支持 Protobuf 序列化来提供更高效、易用的跨语言序列化方案。</p>
+</li>
+</ul>
+<h2>示例</h2>
+<h3>示例 1,使用 Dubbo 开发 gRPC 服务</h3>
+<p><a href="https://grpc.io/">gRPC</a> 是 Google 开源的构建在 HTTP/2 之上的一个 PRC 通信协议。Dubbo 依赖其灵活的协议扩展机制,增加了对 gRPC (HTTP/2) 协议的支持。</p>
+<p>目前的支持限定在 Dubbo Java 语言版本,后续 Go 语言或其他语言版本将会以类似方式提供支持。下面,通过一个<a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-grpc">简单的示例</a>来演示如何在 Dubbo 中使用 gRPC 协议通信。</p>
+<h4>1. 定义服务 IDL</h4>
+<p>首先,通过标准的 Protobuf 协议定义服务如下:</p>
+<pre><code class="language-idl">syntax = &quot;proto3&quot;;
+
+option java_multiple_files = true;
+option java_package = &quot;io.grpc.examples.helloworld&quot;;
+option java_outer_classname = &quot;HelloWorldProto&quot;;
+option objc_class_prefix = &quot;HLW&quot;;
+
+package helloworld;
+
+// The greeting service definition.
+service Greeter {
+  // Sends a greeting
+  rpc SayHello (HelloRequest) returns (HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+  string message = 1;
+}
+
+</code></pre>
+<p>在此,我们定义了一个只有一个方法 sayHello 的 Greeter 服务,同时定义了方法的入参和出参,</p>
+<h4>2. PCompiler 生成 Stub</h4>
+<ol>
+<li>定义 Maven Protobuf Compiler 插件工具。这里我们扩展了 Protobuf 的 Compiler 工具,以用来生成 Dubbo 特有的 RPC stub,此当前以 Maven 插件的形式发布。</li>
+</ol>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.xolstice.maven.plugins<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>protobuf-maven-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>0.5.1<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">protocArtifact</span>&gt;</span>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}	
+    <span class="hljs-tag">&lt;/<span class="hljs-name">protocArtifact</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">pluginId</span>&gt;</span>dubbo-grpc-java<span class="hljs-tag">&lt;/<span class="hljs-name">pluginId</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">pluginArtifact</span>&gt;</span>org.apache.dubbo:protoc-gen-dubbo-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}<span class="hljs-tag">&lt;/<span class="hljs-name">pluginArtifact</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">outputDirectory</span>&gt;</span>build/generated/source/proto/main/java<span class="hljs-tag">&lt;/<span class="hljs-name">outputDirectory</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">clearOutputDirectory</span>&gt;</span>false<span class="hljs-tag">&lt;/<span class="hljs-name">clearOutputDirectory</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">pluginParameter</span>&gt;</span>grpc<span class="hljs-tag">&lt;/<span class="hljs-name">pluginParameter</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">executions</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">execution</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">goals</span>&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>compile<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>compile-custom<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
+      <span class="hljs-tag">&lt;/<span class="hljs-name">goals</span>&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">execution</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">executions</span>&gt;</span>
+<span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
+</code></pre>
+<p>其中,</p>
+<p>pluginArtifact 指定了 Dubbo 定制版本的 Java Protobuf Compiler 插件,通过这个插件来在编译过程中生成 Dubbo 定制版本的 gRPC stub。</p>
+<pre><code class="language-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">pluginArtifact</span>&gt;</span>org.apache.dubbo:protoc-gen-dubbo-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}<span class="hljs-tag">&lt;/<span class="hljs-name">pluginArtifact</span>&gt;</span>
+</code></pre>
+<p>由于 <code>protoc-gen-dubbo-java</code> 支持 gRPC 和 Dubbo 两种协议,可生成的 stub 类型,默认值是 gRPC,关于 dubbo 协议的使用可参见 <a href="">使用 Protobuf 开发 Dubbo 服务</a>。</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">pluginParameter</span>&gt;</span>grpc<span class="hljs-tag">&lt;/<span class="hljs-name">pluginParameter</span>&gt;</span>
+</code></pre>
+<ol start="2">
+<li>
+<p>生成 Java Bean 和 Dubbo-gRPC stub</p>
+<pre><code class="language-sh"><span class="hljs-comment"># 运行以下 maven 命令</span>
+$ mvn clean compile
+</code></pre>
+<p>生成的 Stub 和消息类 如下:
+<img src="../../img/blog/grpc/compiler-classes.png" alt="image-20191026130516896"></p>
+<p>重点关注 GreeterGrpc ,包含了所有 gRPC 标准的 stub 类/方法,同时增加了 Dubbo 特定的接口,之后 Provider 端的服务暴露和 Consumer 端的服务调用都将依赖这个接口。</p>
+<pre><code class="language-java"><span class="hljs-comment">/**
+ * Code generated for Dubbo
+ */</span>
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">IGreeter</span> </span>{
+
+<span class="hljs-keyword">default</span> <span class="hljs-keyword">public</span> io.grpc.examples.helloworld.<span class="hljs-function">HelloReply 	<span class="hljs-title">sayHello</span><span class="hljs-params">(io.grpc.examples.helloworld.HelloRequest request)</span> </span>{
+   <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnsupportedOperationException(<span class="hljs-string">"No need to override this method, extend XxxImplBase and override all methods it allows."</span>);
+}
+
+<span class="hljs-keyword">default</span> <span class="hljs-keyword">public</span> com.google.common.util.concurrent.ListenableFuture&lt;io.grpc.examples.helloworld.HelloReply&gt; sayHelloAsync(
+    io.grpc.examples.helloworld.HelloRequest request) {
+   <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnsupportedOperationException(<span class="hljs-string">"No need to override this method, extend XxxImplBase and override all methods it allows."</span>);
+}
+
+<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sayHello</span><span class="hljs-params">(io.grpc.examples.helloworld.HelloRequest request,
+    io.grpc.stub.StreamObserver&lt;io.grpc.examples.helloworld.HelloReply&gt; responseObserver)</span></span>;
+
+}
+</code></pre>
+</li>
+</ol>
+<h4>3. 业务逻辑开发</h4>
+<p>继承 <code>GreeterGrpc.GreeterImplBase</code> (来自第 2 步),编写业务逻辑,这点和原生 gRPC 是一致的。</p>
+<pre><code class="language-java"><span class="hljs-keyword">package</span> org.apache.dubbo.samples.basic.impl;
+
+<span class="hljs-keyword">import</span> io.grpc.examples.helloworld.GreeterGrpc;
+<span class="hljs-keyword">import</span> io.grpc.examples.helloworld.HelloReply;
+<span class="hljs-keyword">import</span> io.grpc.examples.helloworld.HelloRequest;
+<span class="hljs-keyword">import</span> io.grpc.stub.StreamObserver;
+
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GrpcGreeterImpl</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">GreeterGrpc</span>.<span class="hljs-title">GreeterImplBase</span> </span>{
+    <span class="hljs-meta">@Override</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sayHello</span><span class="hljs-params">(HelloRequest request, StreamObserver&lt;HelloReply&gt; responseObserver)</span> 		</span>{
+        System.out.println(<span class="hljs-string">"Received request from client."</span>);
+        System.out.println(<span class="hljs-string">"Executing thread is "</span> + Thread.currentThread().getName());
+        HelloReply reply = HelloReply.newBuilder()
+          .setMessage(<span class="hljs-string">"Hello "</span> + 	request.getName()).build();
+        responseObserver.onNext(reply);
+        responseObserver.onCompleted();
+    }
+}
+</code></pre>
+<h4>4. Provider 端暴露 Dubbo 服务</h4>
+<p>以 Spring XML 为例</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:application</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"demo-provider"</span>/&gt;</span>
+
+<span class="hljs-comment">&lt;!-- 指定服务暴露协议为 gRPC --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:protocol</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"grpc"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"grpc"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://${zookeeper.address:127.0.0.1}:2181"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"greeter"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.apache.dubbo.samples.basic.impl.GrpcGreeterImpl"</span>/&gt;</span>
+
+<span class="hljs-comment">&lt;!-- 指定 protoc-gen-dubbo-java 生成的接口 --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"io.grpc.examples.helloworld.GreeterGrpc$IGreeter"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"greeter"</span> <span class="hljs-attr">protocol</span>=<span class="hljs-string">"grpc"</span>/&gt;</span>
+</code></pre>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
+  ClassPathXmlApplicationContext context =
+    <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(<span class="hljs-string">"spring/dubbo-demo-provider.xml"</span>);
+  context.start();
+
+  System.out.println(<span class="hljs-string">"dubbo service started"</span>);
+  <span class="hljs-keyword">new</span> CountDownLatch(<span class="hljs-number">1</span>).await();
+}
+</code></pre>
+<h4>5. 引用 Dubbo 服务</h4>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:application</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"demo-consumer"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://${zookeeper.address:127.0.0.1}:2181"</span>/&gt;</span>
+
+<span class="hljs-comment">&lt;!-- 指定 protoc-gen-dubbo-java 生成的接口 --&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"greeter"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"io.grpc.examples.helloworld.GreeterGrpc$IGreeter"</span> <span class="hljs-attr">protocol</span>=<span class="hljs-string">"grpc"</span>/&gt;</span>
+</code></pre>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
+  ClassPathXmlApplicationContext context =
+    <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(<span class="hljs-string">"spring/dubbo-demo-consumer.xml"</span>);
+  context.start();
+
+  GreeterGrpc.IGreeter greeter = (GreeterGrpc.IGreeter) context.getBean(<span class="hljs-string">"greeter"</span>);
+
+  HelloReply reply = greeter.sayHello(HelloRequest.newBuilder().setName(<span class="hljs-string">"world!"</span>).build());
+  System.out.println(<span class="hljs-string">"Result: "</span> + reply.getMessage());
+
+  System.in.read();
+}
+</code></pre>
+<h4>示例1附:高级用法</h4>
+<p><strong>一、异步调用</strong></p>
+<p>再来看一遍 <code>protoc-gen-dubbo-java</code> 生成的接口:</p>
+<pre><code class="language-java"><span class="hljs-comment">/**
+ * Code generated for Dubbo
+ */</span>
+<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">IGreeter</span> </span>{
+  <span class="hljs-function"><span class="hljs-keyword">default</span> <span class="hljs-keyword">public</span> HelloReply <span class="hljs-title">sayHello</span><span class="hljs-params">(HelloRequest request)</span> </span>{
+     <span class="hljs-comment">// ......</span>
+  }
+  <span class="hljs-function"><span class="hljs-keyword">default</span> <span class="hljs-keyword">public</span> ListenableFuture&lt;HelloReply&gt; <span class="hljs-title">sayHelloAsync</span><span class="hljs-params">(HelloRequest request)</span> </span>{
+     <span class="hljs-comment">// ......</span>
+  }
+  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sayHello</span><span class="hljs-params">(HelloRequest request, StreamObserver&lt;HelloReply&gt; responseObserver)</span></span>;
+}
+</code></pre>
+<p>这里为 sayHello 方法生成了三种类型的重载方法,分别用于同步调用、异步调用和流式调用,如果消费端要进行异步调用,直接调用 sayHelloAsync() 即可:</p>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
+	<span class="hljs-comment">// ...</span>
+  GreeterGrpc.IGreeter greeter = (GreeterGrpc.IGreeter) context.getBean(<span class="hljs-string">"greeter"</span>);
+  ListenableFuture&lt;HelloReply&gt; future =   
+        greeter.sayHAsyncello(HelloRequest.newBuilder().setName(<span class="hljs-string">"world!"</span>).build());
+  <span class="hljs-comment">// ...</span>
+}
+</code></pre>
+<p><strong>二、高级配置</strong></p>
+<p>由于当前实现方式是直接集成了 gRPC-java SDK,因此很多配置还没有和 Dubbo 侧对齐,或者还没有以 Dubbo 的配置形式开放,因此,为了提供最大的灵活性,我们直接把 gRPC-java 的配置接口暴露了出来。</p>
+<p>绝大多数场景下,你可能并不会用到以下扩展,因为它们更多的是对 gRPC 协议的拦截或者 HTTP/2 层面的配置。同时使用这些扩展点可能需要对 HTTP/2 或 gRPC 有基本的了解。</p>
+<p><strong>扩展点</strong></p>
+<p>目前支持的扩展点如下:</p>
+<ul>
+<li>
+<p>org.apache.dubbo.rpc.protocol.grpc.interceptors.ClientInterceptor</p>
+</li>
+<li>
+<p>org.apache.dubbo.rpc.protocol.grpc.interceptors.GrpcConfigurator</p>
+</li>
+<li>
+<p>org.apache.dubbo.rpc.protocol.grpc.interceptors.ServerInterceptor</p>
+</li>
+<li>
+<p>org.apache.dubbo.rpc.protocol.grpc.interceptors.ServerTransportFilter</p>
+</li>
+</ul>
+<p>GrpcConfigurator 是最通用的扩展点,我们以此为例来说明一下,其基本定义如下:</p>
+<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">GrpcConfigurator</span> </span>{
+    <span class="hljs-comment">// 用来定制 gRPC NettyServerBuilder</span>
+    <span class="hljs-function"><span class="hljs-keyword">default</span> NettyServerBuilder <span class="hljs-title">configureServerBuilder</span><span class="hljs-params">(NettyServerBuilder builder, URL url)</span> </span>{
+        <span class="hljs-keyword">return</span> builder;
+    }
+    <span class="hljs-comment">// 用来定制 gRPC NettyChannelBuilder</span>
+    <span class="hljs-function"><span class="hljs-keyword">default</span> NettyChannelBuilder <span class="hljs-title">configureChannelBuilder</span><span class="hljs-params">(NettyChannelBuilder builder, URL url)</span> </span>{
+        <span class="hljs-keyword">return</span> builder;
+    }
+    <span class="hljs-comment">// 用来定制 gRPC CallOptions, 定义某个服务在每次请求间传递数据</span>
+    <span class="hljs-function"><span class="hljs-keyword">default</span> CallOptions <span class="hljs-title">configureCallOptions</span><span class="hljs-params">(CallOptions options, URL url)</span> </span>{
+        <span class="hljs-keyword">return</span> options;
+    }
+}
+</code></pre>
+<p>以下是一个示例扩展实现:</p>
+<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyGrpcConfigurator</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">GrpcConfigurator</span> </span>{
+    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> ExecutorService executor = Executors
+            .newFixedThreadPool(<span class="hljs-number">200</span>, <span class="hljs-keyword">new</span> NamedThreadFactory(<span class="hljs-string">"Customized-grpc"</span>, <span class="hljs-keyword">true</span>));
+
+    <span class="hljs-meta">@Override</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> NettyServerBuilder <span class="hljs-title">configureServerBuilder</span><span class="hljs-params">(NettyServerBuilder builder, URL url)</span> </span>{
+        <span class="hljs-keyword">return</span> builder.executor(executor);
+    }
+
+    <span class="hljs-meta">@Override</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> NettyChannelBuilder <span class="hljs-title">configureChannelBuilder</span><span class="hljs-params">(NettyChannelBuilder builder, URL url)</span>
+    </span>{
+        <span class="hljs-keyword">return</span> builder.flowControlWindow(<span class="hljs-number">10</span>);
+    }
+
+    <span class="hljs-meta">@Override</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> CallOptions <span class="hljs-title">configureCallOptions</span><span class="hljs-params">(CallOptions options, URL url)</span> </span>{
+        <span class="hljs-keyword">return</span> options.withOption(CallOptions.Key.create(<span class="hljs-string">"key"</span>), <span class="hljs-string">"value"</span>);
+    }
+}
+
+</code></pre>
+<p>配置为 Dubbo SPI,`resources/META-INF/services 增加配置文件</p>
+<pre><code class="language-properties"><span class="hljs-attr">default</span>=<span class="hljs-string">org.apache.dubbo.samples.basic.comtomize.MyGrpcConfigurator</span>
+</code></pre>
+<ol>
+<li>
+<p>指定 Provider 端线程池</p>
+<p>默认用的是 Dubbo 的线程池,有 fixed (默认)、cached、direct 等类型。以下演示了切换为业务自定义线程池。</p>
+<pre><code class="language-java"><span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> ExecutorService executor = Executors
+      .newFixedThreadPool(<span class="hljs-number">200</span>, <span class="hljs-keyword">new</span> NamedThreadFactory(<span class="hljs-string">"Customized-grpc"</span>, <span class="hljs-keyword">true</span>));
+
+<span class="hljs-function"><span class="hljs-keyword">public</span> NettyServerBuilder <span class="hljs-title">configureServerBuilder</span><span class="hljs-params">(NettyServerBuilder builder, URL url)</span> 
+</span>{
+  <span class="hljs-keyword">return</span> builder.executor(executor);
+}
+
+</code></pre>
+</li>
+<li>
+<p>指定 Consumer 端限流值</p>
+<p>设置 Consumer 限流值为 10</p>
+<pre><code class="language-java"><span class="hljs-meta">@Override</span>
+<span class="hljs-function"><span class="hljs-keyword">public</span> NettyChannelBuilder <span class="hljs-title">configureChannelBuilder</span><span class="hljs-params">(NettyChannelBuilder builder, URL url)</span>
+</span>{
+  <span class="hljs-keyword">return</span> builder.flowControlWindow(<span class="hljs-number">10</span>);
+}
+
+</code></pre>
+</li>
+<li>
+<p>传递附加参数</p>
+<p>DemoService 服务调用传递 key</p>
+<pre><code class="language-java"><span class="hljs-meta">@Override</span>
+<span class="hljs-function"><span class="hljs-keyword">public</span> CallOptions <span class="hljs-title">configureCallOptions</span><span class="hljs-params">(CallOptions options, URL url)</span> </span>{
+  <span class="hljs-keyword">if</span> (url.getServiceInterface().equals(<span class="hljs-string">"xxx.DemoService"</span>)) {
+    <span class="hljs-keyword">return</span> options.withOption(CallOptions.Key.create(<span class="hljs-string">"key"</span>), <span class="hljs-string">"value"</span>);
+  } <span class="hljs-keyword">else</span> {
+    <span class="hljs-keyword">return</span> options;
+  }
+}
+
+</code></pre>
+</li>
+</ol>
+<p><strong>三、TLS 配置</strong></p>
+<p>配置方式和 Dubbo 提供的通用的 <a href="">TLS 支持</a>一致,具体请参见文档</p>
+<h3>示例 2, 使用 Protobuf 开发 Dubbo 服务</h3>
+<p>下面,我们以一个<a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-protobuf">具体的示例</a>来看一下基于 Protobuf 的 Dubbo 服务开发流程。</p>
+<h4>1. 定义服务</h4>
+<p>通过标准 Protobuf 定义服务</p>
+<pre><code class="language-idl">syntax = &quot;proto3&quot;;
+
+option java_multiple_files = true;
+option java_package = &quot;org.apache.dubbo.demo&quot;;
+option java_outer_classname = &quot;DemoServiceProto&quot;;
+option objc_class_prefix = &quot;DEMOSRV&quot;;
+
+package demoservice;
+
+// The demo service definition.
+service DemoService {
+  rpc SayHello (HelloRequest) returns (HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+  string message = 1;
+}
+
+</code></pre>
+<p>这里定义了一个 DemoService 服务,服务只包含一个 sayHello 方法,同时定义了方法的入参和出参。</p>
+<h4>2. Compiler 编译服务</h4>
+<ol>
+<li>引入 Protobuf Compiler Maven 插件,同时指定 <code>protoc-gen-dubbo-java</code> RPC 扩展</li>
+</ol>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.xolstice.maven.plugins<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>protobuf-maven-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>0.5.1<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">protocArtifact</span>&gt;</span>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}	
+    <span class="hljs-tag">&lt;/<span class="hljs-name">protocArtifact</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">pluginId</span>&gt;</span>dubbo-grpc-java<span class="hljs-tag">&lt;/<span class="hljs-name">pluginId</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">pluginArtifact</span>&gt;</span>org.apache.dubbo:protoc-gen-dubbo-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}<span class="hljs-tag">&lt;/<span class="hljs-name">pluginArtifact</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">outputDirectory</span>&gt;</span>build/generated/source/proto/main/java<span class="hljs-tag">&lt;/<span class="hljs-name">outputDirectory</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">clearOutputDirectory</span>&gt;</span>false<span class="hljs-tag">&lt;/<span class="hljs-name">clearOutputDirectory</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">pluginParameter</span>&gt;</span>dubbo<span class="hljs-tag">&lt;/<span class="hljs-name">pluginParameter</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">executions</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">execution</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">goals</span>&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>compile<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>compile-custom<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
+      <span class="hljs-tag">&lt;/<span class="hljs-name">goals</span>&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">execution</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">executions</span>&gt;</span>
+<span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
+</code></pre>
+<p>注意,这里与 <a href="https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-grpc">Dubbo 对 gRPC</a> 支持部分的区别在于:
+<code>&lt;pluginParameter&gt;dubbo&lt;/pluginParameter&gt;</code></p>
+<ol start="2">
+<li>
+<p>生成 Dubbo stub</p>
+<pre><code class="language-shell"><span class="hljs-meta">#</span><span class="bash"> 运行以下 maven 命令</span>
+<span class="hljs-meta">$</span><span class="bash">mvn clean compile</span>
+</code></pre>
+<p>生成的 Java 类如下:</p>
+<p><img src="../../img/blog/grpc/compiler-protobuf.png" alt="image-20191028201240976"></p>
+<p>DemoServiceDubbo 为 Dubbo 定制的 stub</p>
+<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoServiceDubbo</span> </span>{
+
+  <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> AtomicBoolean registered = <span class="hljs-keyword">new</span> AtomicBoolean();
+
+  <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Class&lt;?&gt; init() {
+      Class&lt;?&gt; clazz = <span class="hljs-keyword">null</span>;
+      <span class="hljs-keyword">try</span> {
+          clazz = Class.forName(DemoServiceDubbo<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">getName</span>())</span>;
+          <span class="hljs-keyword">if</span> (registered.compareAndSet(<span class="hljs-keyword">false</span>, <span class="hljs-keyword">true</span>)) {
+              org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller(
+                  org.apache.dubbo.demo.HelloRequest.getDefaultInstance());
+              org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller(
+                  org.apache.dubbo.demo.HelloReply.getDefaultInstance());
+          }
+       } <span class="hljs-keyword">catch</span> (ClassNotFoundException e) {
+          <span class="hljs-comment">// ignore </span>
+       }
+       <span class="hljs-keyword">return</span> clazz;
+  }
+
+  <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">DemoServiceDubbo</span><span class="hljs-params">()</span> </span>{}
+
+  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String SERVICE_NAME = <span class="hljs-string">"demoservice.DemoService"</span>;
+
+  <span class="hljs-comment">/**
+   * Code generated for Dubbo
+   */</span>
+  <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">IDemoService</span> </span>{
+
+     <span class="hljs-keyword">static</span> Class&lt;?&gt; clazz = init();
+     org.apache.dubbo.demo.<span class="hljs-function">HelloReply <span class="hljs-title">sayHello</span><span class="hljs-params">(org.apache.dubbo.demo.HelloRequest request)</span></span>;
+
+     java.util.concurrent.CompletableFuture&lt;org.apache.dubbo.demo.HelloReply&gt; sayHelloAsync(
+  org.apache.dubbo.demo.HelloRequest request);
+
+ }
+
+}
+</code></pre>
+<p>最值得注意的是 <code>IDemoService</code> 接口,它会作为 Dubbo 服务定义基础接口。</p>
+</li>
+</ol>
+<h4>3. 开发业务逻辑</h4>
+<p>从这一步开始,所有开发流程就和直接定义 Java 接口一样了。实现接口定义业务逻辑。</p>
+<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">DemoServiceDubbo</span>.<span class="hljs-title">IDemoService</span> </span>{
+    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(DemoServiceImpl<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+
+    <span class="hljs-meta">@Override</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> HelloReply <span class="hljs-title">sayHello</span><span class="hljs-params">(HelloRequest request)</span> </span>{
+        logger.info(<span class="hljs-string">"Hello "</span> + request.getName() + <span class="hljs-string">", request from consumer: "</span> + RpcContext.getContext().getRemoteAddress());
+        <span class="hljs-keyword">return</span> HelloReply.newBuilder()
+                .setMessage(<span class="hljs-string">"Hello "</span> + request.getName() + <span class="hljs-string">", response from provider: "</span>
+                        + RpcContext.getContext().getLocalAddress())
+                .build();
+    }
+
+    <span class="hljs-meta">@Override</span>
+    <span class="hljs-function"><span class="hljs-keyword">public</span> CompletableFuture&lt;HelloReply&gt; <span class="hljs-title">sayHelloAsync</span><span class="hljs-params">(HelloRequest request)</span> </span>{
+        <span class="hljs-keyword">return</span> CompletableFuture.completedFuture(sayHello(request));
+    }
+}
+</code></pre>
+<h4>4. 配置 Provider</h4>
+<p>暴露 Dubbo 服务</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:application</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"demo-provider"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:protocol</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dubbo"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.apache.dubbo.demo.provider.DemoServiceImpl"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.demo.DemoServiceDubbo$IDemoService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"demoService"</span>/&gt;</span>
+
+</code></pre>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
+  ClassPathXmlApplicationContext context = 
+    <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(<span class="hljs-string">"spring/dubbo-provider.xml"</span>);
+  context.start();
+  System.in.read();
+}
+</code></pre>
+<h4>5. 配置 Consumer</h4>
+<p>引用 Dubbo 服务</p>
+<pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:application</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"demo-consumer"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:registry</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>/&gt;</span>
+
+<span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"demoService"</span> <span class="hljs-attr">check</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.demo.DemoServiceDubbo$IDemoService"</span>/&gt;</span>
+</code></pre>
+<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
+  ClassPathXmlApplicationContext context = 
+    <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(<span class="hljs-string">"spring/dubbo-consumer.xml"</span>);
+  context.start();
+  IDemoService demoService = context.getBean(<span class="hljs-string">"demoService"</span>, IDemoService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+  HelloRequest request = HelloRequest.newBuilder().setName(<span class="hljs-string">"Hello"</span>).build();
+  HelloReply reply = demoService.sayHello(request);
+  System.out.println(<span class="hljs-string">"result: "</span> + reply.getMessage());
+  System.in.read();
+}
+</code></pre>
+</section><footer class="footer-container"><div class="footer-body"><img src="/img/dubbo_gray.png"/><img class="apache" src="/img/apache_logo.png"/><div class="cols-container"><div class="col col-12"><h3></h3><p></p></div><div class="col col-4"><dl><dt>ASF</dt><dd><a href="http://www.apache.org" target="_self">基金会</a></dd><dd><a href="http://www.apache.org/licenses/" target="_self">证书</a></dd><dd><a href="http://www.apache.org/events/current-event" target="_self">事件</a></dd><dd><a href=" [...]
+	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
+	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
+	<script>
+		window.rootPath = '';
+  </script>
+  <script src="/build/blogDetail.js"></script>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112489517-1"></script>
+	<script>
+		window.dataLayer = window.dataLayer || [];
+		function gtag(){dataLayer.push(arguments);}
+		gtag('js', new Date());
+
+		gtag('config', 'UA-112489517-1');
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.json b/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.json
new file mode 100644
index 0000000..9fe4ff2
--- /dev/null
+++ b/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.json
@@ -0,0 +1,6 @@
+{
+  "filename": "Dubbo-supporting-gRPC-HTTP2-and-protobuf.md",
+  "__html": "<h1>Dubbo 在跨语言和协议穿透性方向上的探索:支持 HTTP/2 gRPC 和 Protobuf</h1>\n<p>本文整理自刘军在 Dubbo 成都 meetup 上分享的《Dubbo 在多语言和协议穿透性方向上的探索》。</p>\n<p>本文总体上可分为基础产品简介、Dubbo 对 gRPC (HTTP/2) 和 Protobuf 的支持及示例演示三部分,在简介部分介绍了 Dubbo、HTTP/2、gRPC、Protobuf 的基本概念和特点;第二部分介绍了 Dubbo 为何要支持 gRPC (HTTP/2) 和 Protobuf,以及这种支持为 gRPC 和 Dubbo 开发带来的好处与不同;第三部分通过两个实例分别演示了 Dubbo gRPC 和 Dubbo Protobuf 的使用方式。</p>\n<h2>基本介绍</h2>\n<h3>Dubbo 协议</h3>\n<p>从协议层面展开,以下是当前 2.7 版本支持的 Dubbo 协议</p>\n<p><img src=\"img/blog/grpc/dubbo-ptotoco [...]
+  "link": "/zh-cn/blog/Dubbo-supporting-gRPC-HTTP2-and-protobuf.html",
+  "meta": {}
+}
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-101.html b/zh-cn/blog/dubbo-101.html
index e908ba3..fb6ac09 100644
--- a/zh-cn/blog/dubbo-101.html
+++ b/zh-cn/blog/dubbo-101.html
@@ -120,7 +120,7 @@ String response = stub.sayHello(); <span class="hljs-comment">// #3</span>
         ServiceConfig&lt;GreetingsService&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;&gt;(); <span class="hljs-comment">// #1</span>
         service.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-provider"</span>)); <span class="hljs-comment">// #2</span>
         service.setRegistry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"multicast://224.5.6.7:1234"</span>)); <span class="hljs-comment">// #3</span>
-        service.setInterface(GreetingsService.class); <span class="hljs-comment">// #4</span>
+        service.setInterface(GreetingsService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #4</span>
         service.setRef(<span class="hljs-keyword">new</span> GreetingsServiceImpl()); <span class="hljs-comment">// #5</span>
         service.export(); <span class="hljs-comment">// #6</span>
         System.in.read(); <span class="hljs-comment">// #7</span>
@@ -130,7 +130,7 @@ String response = stub.sayHello(); <span class="hljs-comment">// #3</span>
 <p><strong>说明</strong>:</p>
 <ol>
 <li>创建一个 <em>ServiceConfig</em> 的实例,泛型参数信息是服务接口类型,即 <em>GreetingsService</em>。</li>
-<li>生成一个 <em>AplicatonConfig</em> 的实例,并将其装配进 <em>ServiceConfig</em>。</li>
+<li>生成一个 <em>ApplicationConfig</em> 的实例,并将其装配进 <em>ServiceConfig</em>。</li>
 <li>生成一个 <em>RegistryConfig</em> 实例,并将其装配进 <em>ServiceConfig</em>,这里使用的是组播方式,参数是 <code>multicast://224.5.6.7:1234</code>。合法的组播地址范围为:<em>224.0.0.0 - 239.255.255.255</em></li>
 <li>将服务契约 <em>GreetingsService</em> 装配进 <em>ServiceConfig</em>。</li>
 <li>将服务提供者提供的实现 <em>GreetingsServiceImpl</em> 的实例装配进 <em>ServiceConfig</em>。</li>
@@ -143,7 +143,7 @@ String response = stub.sayHello(); <span class="hljs-comment">// #3</span>
         ReferenceConfig&lt;GreetingsService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;&gt;(); <span class="hljs-comment">// #1</span>
         reference.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-client"</span>)); <span class="hljs-comment">// #2</span>
         reference.setRegistry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"multicast://224.5.6.7:1234"</span>)); <span class="hljs-comment">// #3</span>
-        reference.setInterface(GreetingsService.class); <span class="hljs-comment">// #4</span>
+        reference.setInterface(GreetingsService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #4</span>
         GreetingsService greetingsService = reference.get(); <span class="hljs-comment">// #5</span>
         String message = greetingsService.sayHi(<span class="hljs-string">"dubbo"</span>); <span class="hljs-comment">// #6</span>
         System.out.println(message); <span class="hljs-comment">// #7</span>
@@ -153,7 +153,7 @@ String response = stub.sayHello(); <span class="hljs-comment">// #3</span>
 <p><strong>说明</strong>:</p>
 <ol>
 <li>创建一个 <em>ReferenceConfig</em> 的实例,同样,泛型参数信息是服务接口类型,即 <em>GreetingService</em>。</li>
-<li>生成一个 <em>AplicatonConfig</em> 的实例,并将其装配进 <em>ReferenceConfig</em>。</li>
+<li>生成一个 <em>ApplicationConfig</em> 的实例,并将其装配进 <em>ReferenceConfig</em>。</li>
 <li>生成一个 <em>RegistryConfig</em> 实例,并将其装配进 <em>ReferenceConfig</em>,注意这里的组播地址信息需要与服务提供方的相同。</li>
 <li>将服务契约 <em>GreetingsService</em> 装配进 <em>ReferenceConfig</em>。</li>
 <li>从 <em>ReferenceConfig</em> 中获取到 <em>GreetingService</em> 的代理。</li>
@@ -241,7 +241,7 @@ hi, dubbo
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoApplication</span> </span>{
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
 		<span class="hljs-keyword">new</span> EmbeddedZooKeeper(<span class="hljs-number">2181</span>, <span class="hljs-keyword">false</span>).start();  <span class="hljs-comment">// #1</span>
-		SpringApplication.run(DemoApplication.class, args); <span class="hljs-comment">// #2</span>
+		SpringApplication.run(DemoApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>; <span class="hljs-comment">// #2</span>
 	}
 }
 </code></pre>
diff --git a/zh-cn/blog/dubbo-101.json b/zh-cn/blog/dubbo-101.json
index 8ae9717..9541bab 100644
--- a/zh-cn/blog/dubbo-101.json
+++ b/zh-cn/blog/dubbo-101.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-101.md",
-  "__html": "<h1>第一个 Dubbo 应用</h1>\n<h2>Java RMI 简介</h2>\n<p>Java RMI (Remote Method Invocation)- 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。</p>\n<h3>Java RMI 工作原理</h3>\n<p>一个典型的 RMI 调用如下图所示:</p>\n<ol>\n<li>服务端向 RMI 注册服务绑定自己的地址,</li>\n<li>客户端通过 RMI 注册服务获取目标地址,</li>\n<li>客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致,</li>\n<li>本地存根对象将调用信息打包,通过网络发送到服务端,</li>\n<li>服务端的 Skeleton 对象收到网络请求之后,将调用信息解包,</li>\n<li>然后找到真正 [...]
+  "__html": "<h1>第一个 Dubbo 应用</h1>\n<h2>Java RMI 简介</h2>\n<p>Java RMI (Remote Method Invocation)- 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。</p>\n<h3>Java RMI 工作原理</h3>\n<p>一个典型的 RMI 调用如下图所示:</p>\n<ol>\n<li>服务端向 RMI 注册服务绑定自己的地址,</li>\n<li>客户端通过 RMI 注册服务获取目标地址,</li>\n<li>客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致,</li>\n<li>本地存根对象将调用信息打包,通过网络发送到服务端,</li>\n<li>服务端的 Skeleton 对象收到网络请求之后,将调用信息解包,</li>\n<li>然后找到真正 [...]
   "link": "/zh-cn/blog/dubbo-101.html",
   "meta": {
     "title": "第一个 Dubbo 应用",
diff --git a/zh-cn/blog/dubbo-annotation-driven.html b/zh-cn/blog/dubbo-annotation-driven.html
index b48a885..a3ec962 100644
--- a/zh-cn/blog/dubbo-annotation-driven.html
+++ b/zh-cn/blog/dubbo-annotation-driven.html
@@ -181,7 +181,7 @@
 }
 </code></pre>
 <h6>服务提供方 Annotation 配置</h6>
-<p>将 <code>AnnotationDemoService</code> 暴露成Dubbo 服务,需要依赖 Spring Bean:<code>AplicationConfig</code>、<code>ProtocolConfig</code> 以及 <code>RegistryConfig</code>  。这三个 Spring Bean 过去可通过 XML 文件方式组装 Spring Bean:</p>
+<p>将 <code>AnnotationDemoService</code> 暴露成Dubbo 服务,需要依赖 Spring Bean:<code>ApplicationConfig</code>、<code>ProtocolConfig</code> 以及 <code>RegistryConfig</code>  。这三个 Spring Bean 过去可通过 XML 文件方式组装 Spring Bean:</p>
 <pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">beans</span> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span>
        <span class="hljs-attr">xmlns:dubbo</span>=<span class="hljs-string">"http://code.alibabatech.com/schema/dubbo"</span>
        <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans"</span>
@@ -268,11 +268,11 @@
         <span class="hljs-comment">// 创建 Annotation 配置上下文</span>
         AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册配置 Bean</span>
-        context.register(ProviderConfiguration.class);
+        context.register(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 启动上下文</span>
         context.refresh();
         <span class="hljs-comment">// 获取 DemoService Bean</span>
-        DemoService demoService = context.getBean(DemoService.class);
+        DemoService demoService = context.getBean(DemoService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 执行 sayHello 方法</span>
         String message = demoService.sayHello(<span class="hljs-string">"World"</span>);
         <span class="hljs-comment">// 控制台输出信息</span>
@@ -368,7 +368,7 @@
         <span class="hljs-comment">// 创建 Annotation 配置上下文</span>
         AnnotationConfigApplicationContext providerContext = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册配置 Bean</span>
-        providerContext.register(ProviderConfiguration.class);
+        providerContext.register(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 启动服务提供方上下文</span>
         providerContext.refresh();
     }
@@ -383,7 +383,7 @@
         <span class="hljs-comment">// 创建服务消费方 Annotation 配置上下文</span>
         AnnotationConfigApplicationContext consumerContext = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册服务消费方配置 Bean</span>
-        consumerContext.register(ConsumerConfiguration.class);
+        consumerContext.register(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 启动服务消费方上下文</span>
         consumerContext.refresh();
         <span class="hljs-comment">// 返回服务消费方 Annotation 配置上下文</span>
@@ -412,7 +412,7 @@
         <span class="hljs-comment">// 启动并且返回服务消费方上下文</span>
         ApplicationContext consumerContext = startConsumerContext();
         <span class="hljs-comment">// 获取 AnnotationDemoServiceConsumer Bean</span>
-        AnnotationDemoServiceConsumer consumer = consumerContext.getBean(AnnotationDemoServiceConsumer.class);
+        AnnotationDemoServiceConsumer consumer = consumerContext.getBean(AnnotationDemoServiceConsumer<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 执行 doSayHello 方法</span>
         String message = consumer.doSayHello(<span class="hljs-string">"World"</span>);
         <span class="hljs-comment">// 输出执行结果</span>
@@ -428,7 +428,7 @@
         <span class="hljs-comment">// 创建服务消费方 Annotation 配置上下文</span>
         AnnotationConfigApplicationContext consumerContext = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册服务消费方配置 Bean</span>
-        consumerContext.register(ConsumerConfiguration.class);
+        consumerContext.register(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 启动服务消费方上下文</span>
         consumerContext.refresh();
         <span class="hljs-comment">// 返回服务消费方 Annotation 配置上下文</span>
@@ -442,7 +442,7 @@
         <span class="hljs-comment">// 创建 Annotation 配置上下文</span>
         AnnotationConfigApplicationContext providerContext = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册配置 Bean</span>
-        providerContext.register(ProviderConfiguration.class);
+        providerContext.register(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-comment">// 启动服务提供方上下文</span>
         providerContext.refresh();
     }
diff --git a/zh-cn/blog/dubbo-annotation-driven.json b/zh-cn/blog/dubbo-annotation-driven.json
index b61b48c..fb5694d 100644
--- a/zh-cn/blog/dubbo-annotation-driven.json
+++ b/zh-cn/blog/dubbo-annotation-driven.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-annotation-driven.md",
-  "__html": "<h1>Dubbo 注解驱动(Annotation-Driven)</h1>\n<h2>注解驱动(Annotation-Driven)</h2>\n<h3><code>@DubboComponentScan</code></h3>\n<h4>起始版本: <code>2.5.7</code></h4>\n<h4><code>&lt;dubbo:annotation&gt;</code>历史遗留问题</h4>\n<h5>1. 注解支持不充分</h5>\n<p>在 Dubbo  <code>2.5.7</code>之前的版本 ,Dubbo 提供了两个核心注解 <code>@Service</code> 以及 <code>@Reference</code>,分别用于Dubbo 服务提供和 Dubbo 服务引用。</p>\n<p>其中,<code>@Service</code> 作为 XML 元素 <code>&lt;dubbo:service&gt;</code>的替代注解,与 Spring Framework <code>@org.springfra [...]
+  "__html": "<h1>Dubbo 注解驱动(Annotation-Driven)</h1>\n<h2>注解驱动(Annotation-Driven)</h2>\n<h3><code>@DubboComponentScan</code></h3>\n<h4>起始版本: <code>2.5.7</code></h4>\n<h4><code>&lt;dubbo:annotation&gt;</code>历史遗留问题</h4>\n<h5>1. 注解支持不充分</h5>\n<p>在 Dubbo  <code>2.5.7</code>之前的版本 ,Dubbo 提供了两个核心注解 <code>@Service</code> 以及 <code>@Reference</code>,分别用于Dubbo 服务提供和 Dubbo 服务引用。</p>\n<p>其中,<code>@Service</code> 作为 XML 元素 <code>&lt;dubbo:service&gt;</code>的替代注解,与 Spring Framework <code>@org.springfra [...]
   "link": "/zh-cn/blog/dubbo-annotation-driven.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-annotation.html b/zh-cn/blog/dubbo-annotation.html
index ea13f05..47ef246 100644
--- a/zh-cn/blog/dubbo-annotation.html
+++ b/zh-cn/blog/dubbo-annotation.html
@@ -37,7 +37,7 @@
      * <span class="hljs-doctag">@return</span> the base packages to scan
      * <span class="hljs-doctag">@see</span> DubboComponentScan#basePackages()
      */</span>
-    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class="hljs-string">"basePackages"</span>)
+    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">attribute</span> </span>= <span class="hljs-string">"basePackages"</span>)
     String[] scanBasePackages() <span class="hljs-keyword">default</span> {};
 
     <span class="hljs-comment">/**
@@ -48,7 +48,7 @@
      * <span class="hljs-doctag">@return</span> classes from the base packages to scan
      * <span class="hljs-doctag">@see</span> DubboComponentScan#basePackageClasses
      */</span>
-    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan.class, attribute = <span class="hljs-string">"basePackageClasses"</span>)
+    <span class="hljs-meta">@AliasFor</span>(annotation = DubboComponentScan<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">attribute</span> </span>= <span class="hljs-string">"basePackageClasses"</span>)
     Class&lt;?&gt;[] scanBasePackageClasses() <span class="hljs-keyword">default</span> {};    
 }
 </code></pre>
@@ -72,7 +72,7 @@
 <span class="hljs-meta">@Target</span>({ElementType.TYPE}) <span class="hljs-comment">// #1</span>
 <span class="hljs-meta">@Inherited</span>
 <span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Service {
-    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span>.class; <span class="hljs-comment">// #2</span>
+    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span><span class="hljs-class">.<span class="hljs-keyword">class</span></span>; <span class="hljs-comment">// #2</span>
     <span class="hljs-function">String <span class="hljs-title">interfaceName</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #3</span>
     <span class="hljs-function">String <span class="hljs-title">version</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #4</span>
     <span class="hljs-function">String <span class="hljs-title">group</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #5</span>
@@ -123,7 +123,7 @@
 <span class="hljs-meta">@Retention</span>(RetentionPolicy.RUNTIME)
 <span class="hljs-meta">@Target</span>({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE}) <span class="hljs-comment">// #1</span>
 <span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Reference {
-    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span>.class; <span class="hljs-comment">// #2</span>
+    Class&lt;?&gt; interfaceClass() <span class="hljs-keyword">default</span> <span class="hljs-keyword">void</span><span class="hljs-class">.<span class="hljs-keyword">class</span></span>; <span class="hljs-comment">// #2</span>
     <span class="hljs-function">String <span class="hljs-title">interfaceName</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #3</span>
     <span class="hljs-function">String <span class="hljs-title">version</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #4</span>
     <span class="hljs-function">String <span class="hljs-title">group</span><span class="hljs-params">()</span> <span class="hljs-keyword">default</span> ""</span>; <span class="hljs-comment">// #5</span>
@@ -227,7 +227,7 @@
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderBootstrap</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
         <span class="hljs-keyword">new</span> EmbeddedZooKeeper(<span class="hljs-number">2181</span>, <span class="hljs-keyword">false</span>).start(); <span class="hljs-comment">// #1</span>
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class); <span class="hljs-comment">// #2</span>
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #2</span>
         context.start(); <span class="hljs-comment">// #3</span>
         System.in.read(); <span class="hljs-comment">// #4</span>
     }
@@ -302,9 +302,9 @@
 <p>在 <code>main</code> 方法中通过启动一个 Spring Context,从其中查找到组装好的 Dubbo 的服务消费者,并发起一次远程调用。</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerBootstrap</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class); <span class="hljs-comment">// #1</span>
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #1</span>
         context.start(); <span class="hljs-comment">// #2</span>
-        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class); <span class="hljs-comment">// #3</span>
+        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>; <span class="hljs-comment">// #3</span>
         String hello = greetingServiceConsumer.doSayHello(<span class="hljs-string">"annotation"</span>); <span class="hljs-comment">// #4</span>
         System.out.println(<span class="hljs-string">"result: "</span> + hello); <span class="hljs-comment">// #5</span>
     }
diff --git a/zh-cn/blog/dubbo-annotation.json b/zh-cn/blog/dubbo-annotation.json
index f9a4f15..c584649 100644
--- a/zh-cn/blog/dubbo-annotation.json
+++ b/zh-cn/blog/dubbo-annotation.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-annotation.md",
-  "__html": "<h1>在 Dubbo 中使用注解</h1>\n<p>随着微服务架构的广泛地推广和实施。在 Java 生态系统中,以 Spring Boot 和 Spring Cloud 为代表的微服务框架,引入了全新的编程模型,包括:</p>\n<ul>\n<li>注解驱动(Annotation-Driven)</li>\n<li>外部化配置(External Configuration)</li>\n<li>以及自动装配(Auto-Configure)</li>\n</ul>\n<p>新的编程模型无需 XML 配置、简化部署、提升开发效率。为了更好地实践微服务架构,Dubbo 从 <code>2.5.8</code> 版本开始, 分别针对了上述的三个场景,提供了更完善的支持。本文不讨论传统的 XML 配置方式,而是侧重介绍注解这种方式。外部配置、自动装配两种自动装配会在另外的文章中专门介绍。</p>\n<h2>注解介绍</h2>\n<h3>@EnableDubbo</h3>\n<p><code>@EnableDubbo</code> 注解是 <code>@ [...]
+  "__html": "<h1>在 Dubbo 中使用注解</h1>\n<p>随着微服务架构的广泛地推广和实施。在 Java 生态系统中,以 Spring Boot 和 Spring Cloud 为代表的微服务框架,引入了全新的编程模型,包括:</p>\n<ul>\n<li>注解驱动(Annotation-Driven)</li>\n<li>外部化配置(External Configuration)</li>\n<li>以及自动装配(Auto-Configure)</li>\n</ul>\n<p>新的编程模型无需 XML 配置、简化部署、提升开发效率。为了更好地实践微服务架构,Dubbo 从 <code>2.5.8</code> 版本开始, 分别针对了上述的三个场景,提供了更完善的支持。本文不讨论传统的 XML 配置方式,而是侧重介绍注解这种方式。外部配置、自动装配两种自动装配会在另外的文章中专门介绍。</p>\n<h2>注解介绍</h2>\n<h3>@EnableDubbo</h3>\n<p><code>@EnableDubbo</code> 注解是 <code>@ [...]
   "link": "/zh-cn/blog/dubbo-annotation.html",
   "meta": {
     "title": "在 Dubbo 中使用注解",
diff --git a/zh-cn/blog/dubbo-compatible.html b/zh-cn/blog/dubbo-compatible.html
index 8b8f5b4..302e9b0 100644
--- a/zh-cn/blog/dubbo-compatible.html
+++ b/zh-cn/blog/dubbo-compatible.html
@@ -110,7 +110,7 @@
 <p>因此在<code>ExtensionLoader</code>这个类里,做了特殊的处理:</p>
 <pre><code class="language-java">    <span class="hljs-comment">// synchronized in getExtensionClasses</span>
     <span class="hljs-keyword">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {
-        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);
+        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">if</span> (defaultAnnotation != <span class="hljs-keyword">null</span>) {
             String value = defaultAnnotation.value();
             <span class="hljs-keyword">if</span> ((value = value.trim()).length() &gt; <span class="hljs-number">0</span>) {
diff --git a/zh-cn/blog/dubbo-compatible.json b/zh-cn/blog/dubbo-compatible.json
index ba40f67..2b9b792 100644
--- a/zh-cn/blog/dubbo-compatible.json
+++ b/zh-cn/blog/dubbo-compatible.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-compatible.md",
-  "__html": "<h1>Dubbo 2.7.x repackage后的兼容实现方案</h1>\n<p>Dubbo至加入Apache孵化器以来,一个很强的诉求就是需要rename groupId和package name,这两项工作在项目毕业前需要完成。其中rename package相对来说复杂一些,除了要修改所有类的包名为<code>org.apache.dubbo</code>外,更多的是需要考虑如何老版本的兼容性。</p>\n<p>常见的兼容性包括但不限于以下几种情况:</p>\n<ul>\n<li>用户API\n<ul>\n<li>编程API</li>\n<li>Spring注解</li>\n</ul>\n</li>\n<li>扩展SPI\n<ul>\n<li>扩展Filter</li>\n</ul>\n</li>\n</ul>\n<p>2.7.x里就是通过增加了一个新的模块<code>dubbo-compatible</code>来解决以上兼容性问题。</p>\n<h2>编程使用API</h2>\n<p>编程使用API是最直接最原始的使用方式,其他方 [...]
+  "__html": "<h1>Dubbo 2.7.x repackage后的兼容实现方案</h1>\n<p>Dubbo至加入Apache孵化器以来,一个很强的诉求就是需要rename groupId和package name,这两项工作在项目毕业前需要完成。其中rename package相对来说复杂一些,除了要修改所有类的包名为<code>org.apache.dubbo</code>外,更多的是需要考虑如何老版本的兼容性。</p>\n<p>常见的兼容性包括但不限于以下几种情况:</p>\n<ul>\n<li>用户API\n<ul>\n<li>编程API</li>\n<li>Spring注解</li>\n</ul>\n</li>\n<li>扩展SPI\n<ul>\n<li>扩展Filter</li>\n</ul>\n</li>\n</ul>\n<p>2.7.x里就是通过增加了一个新的模块<code>dubbo-compatible</code>来解决以上兼容性问题。</p>\n<h2>编程使用API</h2>\n<p>编程使用API是最直接最原始的使用方式,其他方 [...]
   "link": "/zh-cn/blog/dubbo-compatible.html",
   "meta": {
     "title": "Dubbo 2.7.x repackage后的兼容实现方案",
diff --git a/zh-cn/blog/dubbo-echo-test.html b/zh-cn/blog/dubbo-echo-test.html
index 3ecbf34..f944b7f 100644
--- a/zh-cn/blog/dubbo-echo-test.html
+++ b/zh-cn/blog/dubbo-echo-test.html
@@ -52,7 +52,7 @@ String status = echoService.$echo(<span class="hljs-string">"OK"</span>);
             <span class="hljs-keyword">if</span> (types != <span class="hljs-keyword">null</span> &amp;&amp; types.length &gt; <span class="hljs-number">0</span>) {
                 interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[types.length + <span class="hljs-number">2</span>];
                 interfaces[<span class="hljs-number">0</span>] = invoker.getInterface();
-                interfaces[<span class="hljs-number">1</span>] = EchoService.class;
+                interfaces[<span class="hljs-number">1</span>] = EchoService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
                 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; types.length; i++) {
                     <span class="hljs-comment">// TODO can we load successfully for a different classloader?.</span>
                     interfaces[i + <span class="hljs-number">2</span>] = ReflectUtils.forName(types[i]);
@@ -60,15 +60,15 @@ String status = echoService.$echo(<span class="hljs-string">"OK"</span>);
             }
         }
         <span class="hljs-keyword">if</span> (interfaces == <span class="hljs-keyword">null</span>) {
-            interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{invoker.getInterface(), EchoService.class};
+            interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{invoker.getInterface(), EchoService<span class="hljs-class">.<span class="hljs-keyword">class</span>}</span>;
         }
 
-        <span class="hljs-keyword">if</span> (!GenericService.class.isAssignableFrom(invoker.getInterface()) &amp;&amp; generic) {
+        <span class="hljs-keyword">if</span> (!GenericService<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">isAssignableFrom</span>(<span class="hljs-title">invoker</span>.<span class="hljs-title">getInterface</span>()) &amp;&amp; <span class="hljs-title">generic</span>) </span>{
             <span class="hljs-keyword">int</span> len = interfaces.length;
             Class&lt;?&gt;[] temp = interfaces;
             interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[len + <span class="hljs-number">1</span>];
             System.arraycopy(temp, <span class="hljs-number">0</span>, interfaces, <span class="hljs-number">0</span>, len);
-            interfaces[len] = com.alibaba.dubbo.rpc.service.GenericService.class;
+            interfaces[len] = com.alibaba.dubbo.rpc.service.GenericService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
         }
 
         <span class="hljs-keyword">return</span> getProxy(invoker, interfaces);
diff --git a/zh-cn/blog/dubbo-echo-test.json b/zh-cn/blog/dubbo-echo-test.json
index 0dc2f88..d2608cb 100644
--- a/zh-cn/blog/dubbo-echo-test.json
+++ b/zh-cn/blog/dubbo-echo-test.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-echo-test.md",
-  "__html": "<h1>回声测试</h1>\n<p>回声测试用于检测服务是否可用。客户端通过 EchoService 来使用回声测试。EchoService 申明如下:</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">EchoService</span> </span>{\n\n    <span class=\"hljs-comment\">/**\n     * echo test.\n     *\n     * <span class=\"hljs-doctag\">@param</span> message message.\n     * <span class=\"hljs-doctag\">@return</span> messag [...]
+  "__html": "<h1>回声测试</h1>\n<p>回声测试用于检测服务是否可用。客户端通过 EchoService 来使用回声测试。EchoService 申明如下:</p>\n<pre><code class=\"language-Java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface</span> <span class=\"hljs-title\">EchoService</span> </span>{\n\n    <span class=\"hljs-comment\">/**\n     * echo test.\n     *\n     * <span class=\"hljs-doctag\">@param</span> message message.\n     * <span class=\"hljs-doctag\">@return</span> messag [...]
   "link": "/zh-cn/blog/dubbo-echo-test.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-externalized-configuration.html b/zh-cn/blog/dubbo-externalized-configuration.html
index 31a602d..b4e3b4e 100644
--- a/zh-cn/blog/dubbo-externalized-configuration.html
+++ b/zh-cn/blog/dubbo-externalized-configuration.html
@@ -285,35 +285,35 @@ dubbo.registry.address=10.20.153.10:9090
         <span class="hljs-comment">// 创建配置上下文</span>
         AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册当前配置 Bean</span>
-        context.register(DubboConfiguration.class);
+        context.register(DubboConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.refresh();
  	    <span class="hljs-comment">// application</span>
-        ApplicationConfig applicationConfig = context.getBean(<span class="hljs-string">"applicationBean"</span>, ApplicationConfig.class);
+        ApplicationConfig applicationConfig = context.getBean(<span class="hljs-string">"applicationBean"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"applicationBean.name = %s \n"</span>, applicationConfig.getName());
 
         <span class="hljs-comment">// module</span>
-        ModuleConfig moduleConfig = context.getBean(<span class="hljs-string">"moduleBean"</span>, ModuleConfig.class);
+        ModuleConfig moduleConfig = context.getBean(<span class="hljs-string">"moduleBean"</span>, ModuleConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"moduleBean.name = %s \n"</span>, moduleConfig.getName());
 
         <span class="hljs-comment">// registry</span>
-        RegistryConfig registryConfig = context.getBean(RegistryConfig.class);
+        RegistryConfig registryConfig = context.getBean(RegistryConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"registryConfig.name = %s \n"</span>, registryConfig.getAddress());
 
         <span class="hljs-comment">// protocol</span>
-        ProtocolConfig protocolConfig = context.getBean(ProtocolConfig.class);
+        ProtocolConfig protocolConfig = context.getBean(ProtocolConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"protocolConfig.name = %s \n"</span>, protocolConfig.getName());
         System.out.printf(<span class="hljs-string">"protocolConfig.port = %s \n"</span>, protocolConfig.getPort());
 
         <span class="hljs-comment">// monitor</span>
-        MonitorConfig monitorConfig = context.getBean(MonitorConfig.class);
+        MonitorConfig monitorConfig = context.getBean(MonitorConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"monitorConfig.name = %s \n"</span>, monitorConfig.getAddress());
 
         <span class="hljs-comment">// provider</span>
-        ProviderConfig providerConfig = context.getBean(ProviderConfig.class);
+        ProviderConfig providerConfig = context.getBean(ProviderConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"providerConfig.name = %s \n"</span>, providerConfig.getHost());
 
         <span class="hljs-comment">// consumer</span>
-        ConsumerConfig consumerConfig = context.getBean(ConsumerConfig.class);
+        ConsumerConfig consumerConfig = context.getBean(ConsumerConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.printf(<span class="hljs-string">"consumerConfig.name = %s \n"</span>, consumerConfig.getClient());
     }
 }
@@ -356,13 +356,13 @@ consumerConfig.name = netty
         <span class="hljs-comment">// 创建配置上下文</span>
         AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册当前配置 Bean</span>
-        context.register(DubboMultipleConfiguration.class);
+        context.register(DubboMultipleConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.refresh();
 
         <span class="hljs-comment">// 获取 ApplicationConfig Bean:"applicationBean"、"applicationBean2" 和 "applicationBean3"</span>
-        ApplicationConfig applicationBean = context.getBean(<span class="hljs-string">"applicationBean"</span>, ApplicationConfig.class);
-        ApplicationConfig applicationBean2 = context.getBean(<span class="hljs-string">"applicationBean2"</span>, ApplicationConfig.class);
-        ApplicationConfig applicationBean3 = context.getBean(<span class="hljs-string">"applicationBean3"</span>, ApplicationConfig.class);
+        ApplicationConfig applicationBean = context.getBean(<span class="hljs-string">"applicationBean"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        ApplicationConfig applicationBean2 = context.getBean(<span class="hljs-string">"applicationBean2"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        ApplicationConfig applicationBean3 = context.getBean(<span class="hljs-string">"applicationBean3"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
         System.out.printf(<span class="hljs-string">"applicationBean.name = %s \n"</span>, applicationBean.getName());
         System.out.printf(<span class="hljs-string">"applicationBean2.name = %s \n"</span>, applicationBean2.getName());
@@ -459,22 +459,22 @@ applicationBean3.name = dubbo-demo-application3
 </code></pre>
 <h5><code>EnableDubboConfigBindings</code> 配置 Bean</h5>
 <p><code>DubboConfiguration</code> 作为 Dubbo 配置 Bean,除通过 <code>@EnableDubboConfigBinding</code> 绑定之外,还需要 <code>@PropertySource</code> 指定外部化配置文件(<code>classpath:/META-INF/bindings.properties</code>):</p>
-<pre><code class="language-java"><span class="hljs-comment">/**
+<pre><code class="language-java">/**
  * Dubbo 配置 Bean
  *
- * <span class="hljs-doctag">@author</span> &lt;a href="mailto:mercyblitz@gmail.com"&gt;Mercy&lt;/a&gt;
- */</span>
-<span class="hljs-meta">@EnableDubboConfigBindings</span>({
-        <span class="hljs-meta">@EnableDubboConfigBinding</span>(prefix = <span class="hljs-string">"${applications.prefix}"</span>,
-                type = ApplicationConfig.class, multiple = <span class="hljs-keyword">true</span>), <span class="hljs-comment">// 多 ApplicationConfig Bean 绑定</span>
-        <span class="hljs-meta">@EnableDubboConfigBinding</span>(prefix = <span class="hljs-string">"dubbo.module"</span>, <span class="hljs-comment">// 不带 "." 后缀</span>
-                type = ModuleConfig.class), <span class="hljs-comment">// 单 ModuleConfig Bean 绑定</span>
-        <span class="hljs-meta">@EnableDubboConfigBinding</span>(prefix = <span class="hljs-string">"dubbo.registry."</span>, <span class="hljs-comment">// 带 "." 后缀</span>
-                type = RegistryConfig.class) <span class="hljs-comment">// 单 RegistryConfig Bean 绑定</span>
+ * @author &lt;a href="mailto:mercyblitz@gmail.com"&gt;Mercy&lt;/a&gt;
+ */
+@EnableDubboConfigBindings({
+        @EnableDubboConfigBinding(prefix = "${applications.prefix}",
+                type = ApplicationConfig.class, multiple = true), // 多 ApplicationConfig Bean 绑定
+        @EnableDubboConfigBinding(prefix = "dubbo.module", // 不带 "." 后缀
+                type = ModuleConfig.class), // 单 ModuleConfig Bean 绑定
+        @EnableDubboConfigBinding(prefix = "dubbo.registry.", // 带 "." 后缀
+                type = RegistryConfig.class) // 单 RegistryConfig Bean 绑定
 })
-<span class="hljs-meta">@PropertySource</span>(<span class="hljs-string">"META-INF/bindings.properties"</span>)
-<span class="hljs-meta">@Configuration</span>
-<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DubboConfiguration</span> </span>{
+@PropertySource("META-INF/bindings.properties")
+@Configuration
+public class DubboConfiguration {
   
 }
 </code></pre>
@@ -491,24 +491,24 @@ applicationBean3.name = dubbo-demo-application3
         <span class="hljs-comment">// 创建配置上下文</span>
         AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
         <span class="hljs-comment">// 注册当前配置 Bean</span>
-        context.register(DubboConfiguration.class);
+        context.register(DubboConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.refresh();
  		<span class="hljs-comment">// 获取 ApplicationConfig Bean:"applicationBean"、"applicationBean2" 和 "applicationBean3"</span>
-        ApplicationConfig applicationBean = context.getBean(<span class="hljs-string">"applicationBean"</span>, ApplicationConfig.class);
-        ApplicationConfig applicationBean2 = context.getBean(<span class="hljs-string">"applicationBean2"</span>, ApplicationConfig.class);
-        ApplicationConfig applicationBean3 = context.getBean(<span class="hljs-string">"applicationBean3"</span>, ApplicationConfig.class);
+        ApplicationConfig applicationBean = context.getBean(<span class="hljs-string">"applicationBean"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        ApplicationConfig applicationBean2 = context.getBean(<span class="hljs-string">"applicationBean2"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        ApplicationConfig applicationBean3 = context.getBean(<span class="hljs-string">"applicationBean3"</span>, ApplicationConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
         System.out.printf(<span class="hljs-string">"applicationBean.name = %s \n"</span>, applicationBean.getName());
         System.out.printf(<span class="hljs-string">"applicationBean2.name = %s \n"</span>, applicationBean2.getName());
         System.out.printf(<span class="hljs-string">"applicationBean3.name = %s \n"</span>, applicationBean3.getName());
 
         <span class="hljs-comment">// 获取 ModuleConfig Bean:"moduleBean"</span>
-        ModuleConfig moduleBean = context.getBean(<span class="hljs-string">"moduleBean"</span>, ModuleConfig.class);
+        ModuleConfig moduleBean = context.getBean(<span class="hljs-string">"moduleBean"</span>, ModuleConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
         System.out.printf(<span class="hljs-string">"moduleBean.name = %s \n"</span>, moduleBean.getName());
 
         <span class="hljs-comment">// 获取 RegistryConfig Bean</span>
-        RegistryConfig registry = context.getBean(RegistryConfig.class);
+        RegistryConfig registry = context.getBean(RegistryConfig<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
         System.out.printf(<span class="hljs-string">"registry.address = %s \n"</span>, registry.getAddress());
     }
diff --git a/zh-cn/blog/dubbo-externalized-configuration.json b/zh-cn/blog/dubbo-externalized-configuration.json
index 81b5062..4aeed08 100644
--- a/zh-cn/blog/dubbo-externalized-configuration.json
+++ b/zh-cn/blog/dubbo-externalized-configuration.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-externalized-configuration.md",
-  "__html": "<h1>Dubbo 外部化配置(Externalized Configuration)</h1>\n<h2>外部化配置(External Configuration)</h2>\n<p>在<a href=\"Dubbo-Annotation-Driven.md\">Dubbo 注解驱动</a>例子中,无论是服务提供方,还是服务消费方,均需要转配相关配置Bean:</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        Applicatio [...]
+  "__html": "<h1>Dubbo 外部化配置(Externalized Configuration)</h1>\n<h2>外部化配置(External Configuration)</h2>\n<p>在<a href=\"Dubbo-Annotation-Driven.md\">Dubbo 注解驱动</a>例子中,无论是服务提供方,还是服务消费方,均需要转配相关配置Bean:</p>\n<pre><code class=\"language-java\">    <span class=\"hljs-meta\">@Bean</span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> ApplicationConfig <span class=\"hljs-title\">applicationConfig</span><span class=\"hljs-params\">()</span> </span>{\n        Applicatio [...]
   "link": "/zh-cn/blog/dubbo-externalized-configuration.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-generic-invoke.html b/zh-cn/blog/dubbo-generic-invoke.html
index 1807c37..09f46cc 100644
--- a/zh-cn/blog/dubbo-generic-invoke.html
+++ b/zh-cn/blog/dubbo-generic-invoke.html
@@ -25,9 +25,9 @@
 <pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"userService"</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"com.alibaba.dubbo.samples.generic.api.IUserService"</span> <span class="hljs-attr">generic</span>=<span class="hljs-string">"true"</span>/&gt;</span>
 </code></pre>
 <p>需要使用的地方,通过强制类型转化为 GenericService 进行调用:</p>
-<pre><code class="language-java">GenericService userService = (GenericService) context.getBean(<span class="hljs-string">"userService"</span>);
-<span class="hljs-comment">// primary param and return value</span>
-String name = (String) userService.$invoke(<span class="hljs-string">"delete"</span>, <span class="hljs-keyword">new</span> String[]{<span class="hljs-keyword">int</span>.class.getName()}, <span class="hljs-keyword">new</span> Object[]{<span class="hljs-number">1</span>});
+<pre><code class="language-java">GenericService userService = (GenericService) context.getBean("userService");
+// primary param and return value
+String name = (String) userService.$invoke("delete", new String[]{int.class.getName()}, new Object[]{1});
 System.out.println(name);
 </code></pre>
 <p>其中:</p>
@@ -130,7 +130,7 @@ application.setRegistry(registry);
 
 ReferenceConfig&lt;GenericService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 <span class="hljs-comment">// 弱类型接口名</span>
-reference.setInterface(HiService.class);
+reference.setInterface(HiService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference.setApplication(application);
 
 HiService hiService = (HiService) reference.get();
@@ -138,7 +138,7 @@ System.out.println(hiService.hi(<span class="hljs-string">"dubbo"</span>));
 
 ReferenceConfig&lt;GenericService&gt; reference2 = <span class="hljs-keyword">new</span> ReferenceConfig&lt;GenericService&gt;();
 <span class="hljs-comment">// 弱类型接口名</span>
-reference2.setInterface(HelloService.class);
+reference2.setInterface(HelloService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference2.setApplication(application);
 
 HelloService helloService = (HelloService) reference2.get();
diff --git a/zh-cn/blog/dubbo-generic-invoke.json b/zh-cn/blog/dubbo-generic-invoke.json
index 783a887..4b2d6db 100644
--- a/zh-cn/blog/dubbo-generic-invoke.json
+++ b/zh-cn/blog/dubbo-generic-invoke.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-generic-invoke.md",
-  "__html": "<h1>Dubbo的泛化调用</h1>\n<p>以下几种场景可以考虑使用泛化调用:</p>\n<ul>\n<li>服务测试平台</li>\n<li>API 服务网关</li>\n</ul>\n<p>泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 <code>Map</code> 表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。</p>\n<p>下面来看看消费端如何使用泛化调用进行服务调用。</p>\n<h2>通过 Spring XML 配置进行泛化调用</h2>\n<p>在 Spring 配置申明 <code>generic=&quot;true&quot;</code>,如:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> [...]
+  "__html": "<h1>Dubbo的泛化调用</h1>\n<p>以下几种场景可以考虑使用泛化调用:</p>\n<ul>\n<li>服务测试平台</li>\n<li>API 服务网关</li>\n</ul>\n<p>泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 <code>Map</code> 表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。</p>\n<p>下面来看看消费端如何使用泛化调用进行服务调用。</p>\n<h2>通过 Spring XML 配置进行泛化调用</h2>\n<p>在 Spring 配置申明 <code>generic=&quot;true&quot;</code>,如:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:reference</span> [...]
   "link": "/zh-cn/blog/dubbo-generic-invoke.html",
   "meta": {
     "title": "Dubbo的泛化调用",
diff --git a/zh-cn/blog/dubbo-meet-arthas.html b/zh-cn/blog/dubbo-meet-arthas.html
index 46788a6..3082382 100644
--- a/zh-cn/blog/dubbo-meet-arthas.html
+++ b/zh-cn/blog/dubbo-meet-arthas.html
@@ -259,7 +259,7 @@ ClassLoader:
   +-sun.misc.Launcher$ExtClassLoader@<span class="hljs-number">59878</span>d35
 
 Location:
-/Users/hengyunabc/.m2/repository/com/alibaba/dubbo/<span class="hljs-number">2.5</span>.10/dubbo-<span class="hljs-number">2.5</span>.10.jar
+/Users/hengyunabc/.m2/repository/com/alibaba/dubbo/<span class="hljs-number">2.5</span><span class="hljs-number">.10</span>/dubbo-<span class="hljs-number">2.5</span><span class="hljs-number">.10</span>.jar
 
 <span class="hljs-keyword">package</span> com.alibaba.dubbo.common.bytecode;
 
diff --git a/zh-cn/blog/dubbo-meet-arthas.json b/zh-cn/blog/dubbo-meet-arthas.json
index d00b163..26542a7 100644
--- a/zh-cn/blog/dubbo-meet-arthas.json
+++ b/zh-cn/blog/dubbo-meet-arthas.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-meet-arthas.md",
-  "__html": "<h1>当Dubbo遇上Arthas:排查问题的实践</h1>\n<p>Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/apache/dubbo\">https://github.com/apache/dubbo</a></li>\n<li>文档:<a href=\"http://dubbo.apache.org/zh-cn/\">http://dubbo.apache.org/zh-cn/</a></li>\n</ul>\n<p>Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/alibaba/arthas\">https://github.com/alibaba/arthas</a></li>\n<li>文档:<a href=\"http [...]
+  "__html": "<h1>当Dubbo遇上Arthas:排查问题的实践</h1>\n<p>Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/apache/dubbo\">https://github.com/apache/dubbo</a></li>\n<li>文档:<a href=\"http://dubbo.apache.org/zh-cn/\">http://dubbo.apache.org/zh-cn/</a></li>\n</ul>\n<p>Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。</p>\n<ul>\n<li>Github: <a href=\"https://github.com/alibaba/arthas\">https://github.com/alibaba/arthas</a></li>\n<li>文档:<a href=\"http [...]
   "link": "/zh-cn/blog/dubbo-meet-arthas.html",
   "meta": {
     "title": "当Dubbo遇上Arthas:排查问题的实践",
diff --git a/zh-cn/blog/dubbo-network-interfaces.html b/zh-cn/blog/dubbo-network-interfaces.html
index 67155f2..9310546 100644
--- a/zh-cn/blog/dubbo-network-interfaces.html
+++ b/zh-cn/blog/dubbo-network-interfaces.html
@@ -378,10 +378,10 @@ utun1: flags=8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1380
 <p>可以配置 <code>/etc/hosts</code> 文件,将 hostname 对应的 IP 显式配置进去。</p>
 <p><strong>Dubbo User Action 2:</strong></p>
 <p>可以使用启动参数去显式指定注册的 IP:</p>
-<pre><code class="language-java">-DDUBBO_IP_TO_REGISTRY=<span class="hljs-number">1.2</span>.3.4
+<pre><code class="language-java">-DDUBBO_IP_TO_REGISTRY=<span class="hljs-number">1.2</span><span class="hljs-number">.3</span><span class="hljs-number">.4</span>
 </code></pre>
 <p>也可以指定 Dubbo 服务绑定在哪块网卡上:</p>
-<pre><code class="language-java">-DDUBBO_IP_TO_BIND=<span class="hljs-number">1.2</span>.3.4
+<pre><code class="language-java">-DDUBBO_IP_TO_BIND=<span class="hljs-number">1.2</span><span class="hljs-number">.3</span><span class="hljs-number">.4</span>
 </code></pre>
 <h2>9 参考文章</h2>
 <p><a href="https://www.jianshu.com/p/09f9375b7fa7">TUN/TAP 设备浅析</a></p>
diff --git a/zh-cn/blog/dubbo-network-interfaces.json b/zh-cn/blog/dubbo-network-interfaces.json
index 92380d9..4cda448 100644
--- a/zh-cn/blog/dubbo-network-interfaces.json
+++ b/zh-cn/blog/dubbo-network-interfaces.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-network-interfaces.md",
-  "__html": "<h1>研究 Dubbo 网卡地址注册时的一点思考</h1>\n<h2>1 如何选择合适的网卡地址</h2>\n<p>可能相当一部分人还不知道我这篇文章到底要讲什么,我说个场景,大家应该就明晰了。在分布式服务调用过程中,以 Dubbo 为例,服务提供者往往需要将自身的 IP 地址上报给注册中心,供消费者去发现。在大多数情况下 Dubbo 都可以正常工作,但如果你留意过 Dubbo 的 github issue,其实有不少人反馈:Dubbo Provider 注册了错误的 IP。如果你能立刻联想到:多网卡、内外网地址共存、VPN、虚拟网卡等关键词,那我建议你一定要继续将本文看下去,因为我也想到了这些,它们都是本文所要探讨的东西!那么“如何选择合适的网卡地址”呢,Dubbo 现有的逻辑到底算不算完备?我们不急着回答它,而是带着这些问题一起进行研究,相信到文末,其中答案,各位看官自有
 评说。</p>\n<h2>2 Dubbo 是怎么做的</h2>\n<p>Dubbo 获取网卡地址的逻辑在各个版本中也是千回百转,走过弯路,也做过优化,我们用最新的 2.7 [...]
+  "__html": "<h1>研究 Dubbo 网卡地址注册时的一点思考</h1>\n<h2>1 如何选择合适的网卡地址</h2>\n<p>可能相当一部分人还不知道我这篇文章到底要讲什么,我说个场景,大家应该就明晰了。在分布式服务调用过程中,以 Dubbo 为例,服务提供者往往需要将自身的 IP 地址上报给注册中心,供消费者去发现。在大多数情况下 Dubbo 都可以正常工作,但如果你留意过 Dubbo 的 github issue,其实有不少人反馈:Dubbo Provider 注册了错误的 IP。如果你能立刻联想到:多网卡、内外网地址共存、VPN、虚拟网卡等关键词,那我建议你一定要继续将本文看下去,因为我也想到了这些,它们都是本文所要探讨的东西!那么“如何选择合适的网卡地址”呢,Dubbo 现有的逻辑到底算不算完备?我们不急着回答它,而是带着这些问题一起进行研究,相信到文末,其中答案,各位看官自有
 评说。</p>\n<h2>2 Dubbo 是怎么做的</h2>\n<p>Dubbo 获取网卡地址的逻辑在各个版本中也是千回百转,走过弯路,也做过优化,我们用最新的 2.7 [...]
   "link": "/zh-cn/blog/dubbo-network-interfaces.html",
   "meta": {
     "title": "研究 Dubbo 网卡地址注册时的一点思考",
diff --git a/zh-cn/blog/dubbo-registry-nacos-integration.html b/zh-cn/blog/dubbo-registry-nacos-integration.html
index 4015051..223fe7e 100644
--- a/zh-cn/blog/dubbo-registry-nacos-integration.html
+++ b/zh-cn/blog/dubbo-registry-nacos-integration.html
@@ -205,7 +205,7 @@
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
         AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
-        context.register(DemoServiceProviderBootstrap.class);
+        context.register(DemoServiceProviderBootstrap<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.refresh();
         System.out.println(<span class="hljs-string">"DemoService provider is starting..."</span>);
         System.in.read();
@@ -263,7 +263,7 @@
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
         AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext();
-        context.register(DemoServiceConsumerBootstrap.class);
+        context.register(DemoServiceConsumerBootstrap<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.refresh();
         context.close();
     }
@@ -384,7 +384,7 @@ public class DemoServiceProviderXmlBootstrap {
         context.setConfigLocation(<span class="hljs-string">"/META-INF/spring/dubbo-consumer-context.xml"</span>);
         context.refresh();
         System.out.println(<span class="hljs-string">"DemoService consumer (XML) is starting..."</span>);
-        DemoService demoService = context.getBean(<span class="hljs-string">"demoService"</span>, DemoService.class);
+        DemoService demoService = context.getBean(<span class="hljs-string">"demoService"</span>, DemoService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">10</span>; i++) {
             System.out.println(demoService.sayName(<span class="hljs-string">"小马哥(mercyblitz)"</span>));
         }
diff --git a/zh-cn/blog/dubbo-registry-nacos-integration.json b/zh-cn/blog/dubbo-registry-nacos-integration.json
index 4a5ddd6..aa7ff84 100644
--- a/zh-cn/blog/dubbo-registry-nacos-integration.json
+++ b/zh-cn/blog/dubbo-registry-nacos-integration.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-registry-nacos-integration.md",
-  "__html": "<h1>Dubbo 融合 Nacos 成为注册中心</h1>\n<p>Nacos 作为 Dubbo 生态系统中重要的注册中心实现,其中 <a href=\"https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos\"><code>dubbo-registry-nacos</code></a> 则是 Dubbo 融合 Nacos 注册中心的实现。</p>\n<h2>预备工作</h2>\n<p>当您将 <a href=\"https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos\"><code>dubbo-registry-nacos</code></a> 整合到您的 Dubbo 工程之前,请确保后台已经启动 Nacos 服务。如果您尚且不熟悉 Nacos 的基本使用的话,可先行参考 <a href=\"https://nacos.io/en-us [...]
+  "__html": "<h1>Dubbo 融合 Nacos 成为注册中心</h1>\n<p>Nacos 作为 Dubbo 生态系统中重要的注册中心实现,其中 <a href=\"https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos\"><code>dubbo-registry-nacos</code></a> 则是 Dubbo 融合 Nacos 注册中心的实现。</p>\n<h2>预备工作</h2>\n<p>当您将 <a href=\"https://github.com/apache/dubbo/tree/master/dubbo-registry/dubbo-registry-nacos\"><code>dubbo-registry-nacos</code></a> 整合到您的 Dubbo 工程之前,请确保后台已经启动 Nacos 服务。如果您尚且不熟悉 Nacos 的基本使用的话,可先行参考 <a href=\"https://nacos.io/en-us [...]
   "link": "/zh-cn/blog/dubbo-registry-nacos-integration.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-rest.html b/zh-cn/blog/dubbo-rest.html
index b6b4541..27a438b 100644
--- a/zh-cn/blog/dubbo-rest.html
+++ b/zh-cn/blog/dubbo-rest.html
@@ -237,7 +237,7 @@ $ curl -X POST -H <span class="hljs-string">"Content-Type: application/json"</sp
         ClassPathXmlApplicationContext context = <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(<span class="hljs-string">"spring/rest-consumer.xml"</span>);
         context.start();
 
-        UserService userService = context.getBean(<span class="hljs-string">"userService"</span>, UserService.class);
+        UserService userService = context.getBean(<span class="hljs-string">"userService"</span>, UserService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.println(<span class="hljs-string">"&gt;&gt;&gt; "</span> + userService.getUser(<span class="hljs-number">1L</span>));
 
         User user = <span class="hljs-keyword">new</span> User(<span class="hljs-number">2L</span>, <span class="hljs-string">"Larry Page"</span>);
@@ -303,7 +303,7 @@ $ curl -X POST -H <span class="hljs-string">"Content-Type: application/json"</sp
 <p>通过使用 <code>ProviderConfiguration</code> 来初始化一个 <code>AnnotationConfigApplicationContext</code> 实例,就可以完全摆脱 Spring XML 的配置文件,完全借助 annotation 来装配好一个 Dubbo 的服务提供方。</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RestProvider</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class);
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.start();
         System.in.read();
     }
@@ -361,10 +361,10 @@ $ curl -X POST -H <span class="hljs-string">"Content-Type: application/json"</sp
 <p>通过使用 <code>ConsumerConfiguration</code> 来初始化一个 <code>AnnotationConfigApplicationContext</code> 实例,就可以完全摆脱 Spring XML 的配置文件,完全借助 annotation 来装配好一个 Dubbo 的服务消费方。然后就可以通过查找 <code>UserServiceComponent</code> 类型的 Spring Bean 来发起远程调用。</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RestConsumer</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.start();
 
-        UserService userService = context.getBean(UserServiceComponent.class);
+        UserService userService = context.getBean(UserServiceComponent<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.println(<span class="hljs-string">"&gt;&gt;&gt; "</span> + userService.getUser(<span class="hljs-number">1L</span>));
 
         User user = <span class="hljs-keyword">new</span> User(<span class="hljs-number">2L</span>, <span class="hljs-string">"Larry Page"</span>);
@@ -503,59 +503,59 @@ INFO: Starting ProtocolHandler [<span class="hljs-string">"http-nio-8080"</span>
 <pre><code class="language-yaml"><span class="hljs-attr">openapi:</span> <span class="hljs-number">3.0</span><span class="hljs-number">.1</span>
 <span class="hljs-attr">paths:</span>
   <span class="hljs-string">/api/users/{id}:</span>
-<span class="hljs-attr">    get:</span>
-<span class="hljs-attr">      operationId:</span> <span class="hljs-string">getUser</span>
-<span class="hljs-attr">      parameters:</span>
-<span class="hljs-attr">      - name:</span> <span class="hljs-string">id</span>
-<span class="hljs-attr">        in:</span> <span class="hljs-string">path</span>
-<span class="hljs-attr">        required:</span> <span class="hljs-literal">true</span>
-<span class="hljs-attr">        schema:</span>
-<span class="hljs-attr">          type:</span> <span class="hljs-string">integer</span>
-<span class="hljs-attr">          format:</span> <span class="hljs-string">int64</span>
-<span class="hljs-attr">      responses:</span>
-<span class="hljs-attr">        default:</span>
-<span class="hljs-attr">          description:</span> <span class="hljs-string">default</span> <span class="hljs-string">response</span>
-<span class="hljs-attr">          content:</span>
-            <span class="hljs-string">application/json:</span>
-<span class="hljs-attr">              schema:</span>
+    <span class="hljs-attr">get:</span>
+      <span class="hljs-attr">operationId:</span> <span class="hljs-string">getUser</span>
+      <span class="hljs-attr">parameters:</span>
+      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">id</span>
+        <span class="hljs-attr">in:</span> <span class="hljs-string">path</span>
+        <span class="hljs-attr">required:</span> <span class="hljs-literal">true</span>
+        <span class="hljs-attr">schema:</span>
+          <span class="hljs-attr">type:</span> <span class="hljs-string">integer</span>
+          <span class="hljs-attr">format:</span> <span class="hljs-string">int64</span>
+      <span class="hljs-attr">responses:</span>
+        <span class="hljs-attr">default:</span>
+          <span class="hljs-attr">description:</span> <span class="hljs-string">default</span> <span class="hljs-string">response</span>
+          <span class="hljs-attr">content:</span>
+            <span class="hljs-attr">application/json:</span>
+              <span class="hljs-attr">schema:</span>
                 <span class="hljs-string">$ref:</span> <span class="hljs-string">'#/components/schemas/User'</span>
-            <span class="hljs-string">text/xml:</span>
-<span class="hljs-attr">              schema:</span>
+            <span class="hljs-attr">text/xml:</span>
+              <span class="hljs-attr">schema:</span>
                 <span class="hljs-string">$ref:</span> <span class="hljs-string">'#/components/schemas/User'</span>
   <span class="hljs-string">/api/users/register:</span>
-<span class="hljs-attr">    post:</span>
-<span class="hljs-attr">      operationId:</span> <span class="hljs-string">registerUser</span>
-<span class="hljs-attr">      requestBody:</span>
-<span class="hljs-attr">        description:</span> <span class="hljs-string">a</span> <span class="hljs-string">user</span> <span class="hljs-string">to</span> <span class="hljs-string">register</span>
-<span class="hljs-attr">        content:</span>
-          <span class="hljs-string">application/json:</span>
-<span class="hljs-attr">            schema:</span>
+    <span class="hljs-attr">post:</span>
+      <span class="hljs-attr">operationId:</span> <span class="hljs-string">registerUser</span>
+      <span class="hljs-attr">requestBody:</span>
+        <span class="hljs-attr">description:</span> <span class="hljs-string">a</span> <span class="hljs-string">user</span> <span class="hljs-string">to</span> <span class="hljs-string">register</span>
+        <span class="hljs-attr">content:</span>
+          <span class="hljs-attr">application/json:</span>
+            <span class="hljs-attr">schema:</span>
               <span class="hljs-string">$ref:</span> <span class="hljs-string">'#/components/schemas/User'</span>
-          <span class="hljs-string">text/xml:</span>
-<span class="hljs-attr">            schema:</span>
+          <span class="hljs-attr">text/xml:</span>
+            <span class="hljs-attr">schema:</span>
               <span class="hljs-string">$ref:</span> <span class="hljs-string">'#/components/schemas/User'</span>
-<span class="hljs-attr">      responses:</span>
-<span class="hljs-attr">        default:</span>
-<span class="hljs-attr">          description:</span> <span class="hljs-string">default</span> <span class="hljs-string">response</span>
-<span class="hljs-attr">          content:</span>
-            <span class="hljs-string">application/json:</span>
-<span class="hljs-attr">              schema:</span>
-<span class="hljs-attr">                type:</span> <span class="hljs-string">integer</span>
-<span class="hljs-attr">                format:</span> <span class="hljs-string">int64</span>
-            <span class="hljs-string">text/xml:</span>
-<span class="hljs-attr">              schema:</span>
-<span class="hljs-attr">                type:</span> <span class="hljs-string">integer</span>
-<span class="hljs-attr">                format:</span> <span class="hljs-string">int64</span>
+      <span class="hljs-attr">responses:</span>
+        <span class="hljs-attr">default:</span>
+          <span class="hljs-attr">description:</span> <span class="hljs-string">default</span> <span class="hljs-string">response</span>
+          <span class="hljs-attr">content:</span>
+            <span class="hljs-attr">application/json:</span>
+              <span class="hljs-attr">schema:</span>
+                <span class="hljs-attr">type:</span> <span class="hljs-string">integer</span>
+                <span class="hljs-attr">format:</span> <span class="hljs-string">int64</span>
+            <span class="hljs-attr">text/xml:</span>
+              <span class="hljs-attr">schema:</span>
+                <span class="hljs-attr">type:</span> <span class="hljs-string">integer</span>
+                <span class="hljs-attr">format:</span> <span class="hljs-string">int64</span>
 <span class="hljs-attr">components:</span>
-<span class="hljs-attr">  schemas:</span>
-<span class="hljs-attr">    User:</span>
-<span class="hljs-attr">      type:</span> <span class="hljs-string">object</span>
-<span class="hljs-attr">      properties:</span>
-<span class="hljs-attr">        id:</span>
-<span class="hljs-attr">          type:</span> <span class="hljs-string">integer</span>
-<span class="hljs-attr">          format:</span> <span class="hljs-string">int64</span>
-<span class="hljs-attr">        name:</span>
-<span class="hljs-attr">          type:</span> <span class="hljs-string">string</span>
+  <span class="hljs-attr">schemas:</span>
+    <span class="hljs-attr">User:</span>
+      <span class="hljs-attr">type:</span> <span class="hljs-string">object</span>
+      <span class="hljs-attr">properties:</span>
+        <span class="hljs-attr">id:</span>
+          <span class="hljs-attr">type:</span> <span class="hljs-string">integer</span>
+          <span class="hljs-attr">format:</span> <span class="hljs-string">int64</span>
+        <span class="hljs-attr">name:</span>
+          <span class="hljs-attr">type:</span> <span class="hljs-string">string</span>
 </code></pre>
 <h5>2. 集成 Swagger UI</h5>
 <p>在 pom.xml 中继续增加 swagger-ui 的依赖,这里使用的是 webjars 的版本,从集成的角度来说更加简洁。webjars 的工作机制可以参阅 webjars 官网 <sup class="footnote-ref"><a href="#fn5" id="fnref5">[5]</a></sup></p>
diff --git a/zh-cn/blog/dubbo-rest.json b/zh-cn/blog/dubbo-rest.json
index 9c3b98b..5fd4b9c 100644
--- a/zh-cn/blog/dubbo-rest.json
+++ b/zh-cn/blog/dubbo-rest.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-rest.md",
-  "__html": "<h1>在 Dubbo 中使用 REST</h1>\n<h2>什么是 REST</h2>\n<p>REST 是 Roy Thomas Fielding <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 在 2000 年他的博士论文 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>  “架构风格以及基于网络的软件架构设计” 中提出来的一个概念。REST 是 <strong>RE</strong>presentational <strong>S</strong>tate <strong>T</strong>ransfer 的缩写,翻译过来就是 “表现层状态转化”。REST 就是 Roy 在这篇论文中提出的面向互联网的软件所应当具备的架构风格。</p>\n<p>按照 REpresentational State Transfer 的字面意思,可以把应用看成是一个 [...]
+  "__html": "<h1>在 Dubbo 中使用 REST</h1>\n<h2>什么是 REST</h2>\n<p>REST 是 Roy Thomas Fielding <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 在 2000 年他的博士论文 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>  “架构风格以及基于网络的软件架构设计” 中提出来的一个概念。REST 是 <strong>RE</strong>presentational <strong>S</strong>tate <strong>T</strong>ransfer 的缩写,翻译过来就是 “表现层状态转化”。REST 就是 Roy 在这篇论文中提出的面向互联网的软件所应当具备的架构风格。</p>\n<p>按照 REpresentational State Transfer 的字面意思,可以把应用看成是一个 [...]
   "link": "/zh-cn/blog/dubbo-rest.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-stub-mock.html b/zh-cn/blog/dubbo-stub-mock.html
index 5abc8b2..dfe18f4 100644
--- a/zh-cn/blog/dubbo-stub-mock.html
+++ b/zh-cn/blog/dubbo-stub-mock.html
@@ -52,7 +52,7 @@
 <h2>开发一个本地存根 Stub</h2>
 <p>本地存根 <em>Stub</em> 由用户来提供,并在服务消费方部署。完整的示例可以在这里 <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 获得。</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoServiceStub</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">DemoService</span> </span>{ <span class="hljs-comment">// #1</span>
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Logger logger = LoggerFactory.getLogger(DemoServiceStub.class);
+    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Logger logger = LoggerFactory.getLogger(DemoServiceStub<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
     <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> DemoService demoService;
 
@@ -116,10 +116,10 @@
 </ol>
 <p>在客户端提供本地伪装的实现。当远程调用发生错误的时候,返回给调用方的不是服务端的 &quot;hello name&quot;,取而代之的是 &quot;mock name&quot;。</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoServiceMock</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">DemoService</span> </span>{
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Logger logger = LoggerFactory.getLogger(DemoServiceMock.class);
+    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Logger logger = LoggerFactory.getLogger(DemoServiceMock<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">sayHello</span><span class="hljs-params">(String name)</span> </span>{
-        logger.warn(<span class="hljs-string">"about to execute mock: "</span> + DemoServiceMock.class.getSimpleName());
+        logger.warn(<span class="hljs-string">"about to execute mock: "</span> + DemoServiceMock<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">getSimpleName</span>())</span>;
         <span class="hljs-keyword">return</span> <span class="hljs-string">"mock "</span> + name;
     }
 }
@@ -153,16 +153,16 @@
 [09/04/19 02:20:49:049 CST] main  INFO mock.MockConsumer: result: mock world
 </code></pre>
 <p>下面通过规则推送为例展示这种快捷方式的用法,更多的用法请参考 Dubbo 官方用户手册 <sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>。通过向配置中心推送指定服务的配置,就可以做到动态服务降级的目的。</p>
-<pre><code class="language-yaml"><span class="hljs-bullet">-</span><span class="hljs-bullet">--</span> <span class="hljs-comment"># 1</span>
+<pre><code class="language-yaml"><span class="hljs-string">---</span> <span class="hljs-comment"># 1</span>
 <span class="hljs-attr">configVersion:</span> <span class="hljs-string">v2.7</span>
 <span class="hljs-attr">scope:</span> <span class="hljs-string">service</span>
-<span class="hljs-attr">  key:</span> <span class="hljs-string">org.apache.dubbo.samples.mock.api.DemoService</span> <span class="hljs-comment">#2</span>
-<span class="hljs-attr">  enabled:</span> <span class="hljs-literal">true</span>
-<span class="hljs-attr">  configs:</span>
-<span class="hljs-attr">    - addresses:</span> <span class="hljs-string">[0.0.0.0]</span>
-<span class="hljs-attr">      side:</span> <span class="hljs-string">consumer</span> <span class="hljs-comment">#3</span>
-<span class="hljs-attr">      parameters:</span>
-<span class="hljs-attr">        mock:</span> <span class="hljs-string">return</span> <span class="hljs-string">configured-mock-value</span> <span class="hljs-comment">#4</span>
+  <span class="hljs-attr">key:</span> <span class="hljs-string">org.apache.dubbo.samples.mock.api.DemoService</span> <span class="hljs-comment">#2</span>
+  <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
+  <span class="hljs-attr">configs:</span>
+    <span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">[0.0.0.0]</span>
+      <span class="hljs-attr">side:</span> <span class="hljs-string">consumer</span> <span class="hljs-comment">#3</span>
+      <span class="hljs-attr">parameters:</span>
+        <span class="hljs-attr">mock:</span> <span class="hljs-string">return</span> <span class="hljs-string">configured-mock-value</span> <span class="hljs-comment">#4</span>
       <span class="hljs-string">...</span>
 </code></pre>
 <ol>
diff --git a/zh-cn/blog/dubbo-stub-mock.json b/zh-cn/blog/dubbo-stub-mock.json
index 573ea7b..51dc76f 100644
--- a/zh-cn/blog/dubbo-stub-mock.json
+++ b/zh-cn/blog/dubbo-stub-mock.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-stub-mock.md",
-  "__html": "<h1>本地存根和本地伪装</h1>\n<h2>基本概念</h2>\n<p>典型的 RPC 调用客户端是依赖并且只依赖接口编程来进行远程调用的。在真正发起远程调用之前,用户往往需要做一些预处理的工作,比如提前校验参数。在拿到返回调用结果之后,用户可能需要缓存结果,或者是在调用失败的时候构造容错数据,而不是简单的抛出异常。</p>\n<p>这个时候,用户可以编写出类似以下的代码来处理上面提出的这些场景:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">try</span> {\n    preProcess();\n    <span class=\"hljs-keyword\">return</span> service.invoke(...);\n} <span class=\"hljs-keyword\">catch</span> (Throwable e) {\n    <span class=\"hljs-keyword\">return</spa [...]
+  "__html": "<h1>本地存根和本地伪装</h1>\n<h2>基本概念</h2>\n<p>典型的 RPC 调用客户端是依赖并且只依赖接口编程来进行远程调用的。在真正发起远程调用之前,用户往往需要做一些预处理的工作,比如提前校验参数。在拿到返回调用结果之后,用户可能需要缓存结果,或者是在调用失败的时候构造容错数据,而不是简单的抛出异常。</p>\n<p>这个时候,用户可以编写出类似以下的代码来处理上面提出的这些场景:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">try</span> {\n    preProcess();\n    <span class=\"hljs-keyword\">return</span> service.invoke(...);\n} <span class=\"hljs-keyword\">catch</span> (Throwable e) {\n    <span class=\"hljs-keyword\">return</spa [...]
   "link": "/zh-cn/blog/dubbo-stub-mock.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/dubbo-zk.html b/zh-cn/blog/dubbo-zk.html
index 71a42cd..ad4c49f 100644
--- a/zh-cn/blog/dubbo-zk.html
+++ b/zh-cn/blog/dubbo-zk.html
@@ -103,7 +103,7 @@ world
 <h2>在 Dubbo 中使用 Zookeeper</h2>
 <p>Dubbo 使用 Zookeeper 用于服务的注册发现和配置管理,在 Zookeeper 中数据的组织由下图所示:</p>
 <p><img src="../../img/blog/dubbo-in-zk.jpg" alt="dubbo-in-zk"></p>
-<p>首先,所有 Dubbo 相关的数据都组织在 <code>/duboo</code> 的根节点下。</p>
+<p>首先,所有 Dubbo 相关的数据都组织在 <code>/dubbo</code> 的根节点下。</p>
 <p>二级目录是服务名,如 <code>com.foo.BarService</code>。</p>
 <p>三级目录有两个子节点,分别是 <code>providers</code> 和 <code>consumers</code>,表示该服务的提供者和消费者。</p>
 <p>四级目录记录了与该服务相关的每一个应用实例的 URL 信息,在 <code>providers</code> 下的表示该服务的所有提供者,而在 <code>consumers</code> 下的表示该服务的所有消费者。举例说明,<code>com.foo.BarService</code> 的服务提供者在启动时将自己的 URL 信息注册到 <code>/dubbo/com.foo.BarService/providers</code> 下;同样的,服务消费者将自己的信息注册到相应的 <code>consumers</code> 下,同时,服务消费者会订阅其所对应的 <code>providers</code> 节点,以便能够感知到服务提供方地址列表的变化。</p>
@@ -147,7 +147,7 @@ world
 <p>在 <code>main</code> 方法中通过启动一个 Spring Context 来对外提供 Dubbo 服务。</p>
 <pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProviderBootstrap</span> </span>{
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration.class);
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ProviderConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.start();
         System.in.read();
     }
@@ -201,9 +201,9 @@ JLine support is enabled
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConsumerBootstrap</span> </span>{
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException </span>{
-        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);
+        AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         context.start();
-        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class);
+        GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         String hello = greetingServiceConsumer.doSayHello(<span class="hljs-string">"zookeeper"</span>);
         System.out.println(<span class="hljs-string">"result: "</span> + hello);
         System.in.read();
diff --git a/zh-cn/blog/dubbo-zk.json b/zh-cn/blog/dubbo-zk.json
index dc396c3..7c75db6 100644
--- a/zh-cn/blog/dubbo-zk.json
+++ b/zh-cn/blog/dubbo-zk.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-zk.md",
-  "__html": "<h1>在 Dubbo 应用中使用 Zookeeper</h1>\n<h2>Zookeeper 介绍</h2>\n<h3>基本概念</h3>\n<p>在现代的分布式应用中,往往会出现节点和节点之间的协调问题,其中就包括了:选主、集群管理、分布式锁、分布式配置管理、统一命名服务、状态同步等诉求。<a href=\"https://zookeeper.apache.org\">Apache Zookeeper</a>,正如它的名字所暗示的那样,<em>动物园管理员</em>,就是为了解决这些诉求的一个分布式协调服务框架。</p>\n<p>为了保证高可用,ZooKeeper 本身也可以部署成集群模式,称之为 <em>ZooKeeper ensemble</em>。ZooKeeper 集群中始终确保其中的一台为 leader 的角色,并通过 <em>ZAB (Zookeeper Atomic Broadcast Protocol) <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1 [...]
+  "__html": "<h1>在 Dubbo 应用中使用 Zookeeper</h1>\n<h2>Zookeeper 介绍</h2>\n<h3>基本概念</h3>\n<p>在现代的分布式应用中,往往会出现节点和节点之间的协调问题,其中就包括了:选主、集群管理、分布式锁、分布式配置管理、统一命名服务、状态同步等诉求。<a href=\"https://zookeeper.apache.org\">Apache Zookeeper</a>,正如它的名字所暗示的那样,<em>动物园管理员</em>,就是为了解决这些诉求的一个分布式协调服务框架。</p>\n<p>为了保证高可用,ZooKeeper 本身也可以部署成集群模式,称之为 <em>ZooKeeper ensemble</em>。ZooKeeper 集群中始终确保其中的一台为 leader 的角色,并通过 <em>ZAB (Zookeeper Atomic Broadcast Protocol) <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1 [...]
   "link": "/zh-cn/blog/dubbo-zk.html",
   "meta": {
     "title": "在 Dubbo 应用中使用 Zookeeper",
diff --git a/zh-cn/blog/first-dubbo-filter.html b/zh-cn/blog/first-dubbo-filter.html
index 617acb1..9464c30 100644
--- a/zh-cn/blog/first-dubbo-filter.html
+++ b/zh-cn/blog/first-dubbo-filter.html
@@ -27,7 +27,7 @@
     
     <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> &lt;T&gt; <span class="hljs-function">Invoker&lt;T&gt; <span class="hljs-title">buildInvokerChain</span><span class="hljs-params">(<span class="hljs-keyword">final</span> Invoker&lt;T&gt; invoker, String key, String group)</span> </span>{
         Invoker&lt;T&gt; last = invoker;
-        List&lt;Filter&gt; filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
+        List&lt;Filter&gt; filters = ExtensionLoader.getExtensionLoader(Filter<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getActivateExtension</span>(<span class="hljs-title">invoker</span>.<span class="hljs-title">getUrl</span>(), <span class="hljs-title">key</span>, <span class="hljs-title">group</span>)</span>;
         <span class="hljs-keyword">if</span> (filters.size() &gt; <span class="hljs-number">0</span>) {
             <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = filters.size() - <span class="hljs-number">1</span>; i &gt;= <span class="hljs-number">0</span>; i --) {
                 <span class="hljs-keyword">final</span> Filter filter = filters.get(i);
diff --git a/zh-cn/blog/first-dubbo-filter.json b/zh-cn/blog/first-dubbo-filter.json
index 10df83b..4b42ed5 100644
--- a/zh-cn/blog/first-dubbo-filter.json
+++ b/zh-cn/blog/first-dubbo-filter.json
@@ -1,6 +1,6 @@
 {
   "filename": "first-dubbo-filter.md",
-  "__html": "<h1>第一个Dubbo Filter</h1>\n<h3>概述</h3>\n<p>在Dubbo的整体设计中,Filter是一个很重要的概念,包括Dubbo本身的大多数功能,都是基于此扩展点实现的,在每次的调用过程中,Filter的拦截都会被执行。</p>\n<h4>Dubbo Filter的加载机制</h4>\n<p>Dubbo中已经实现的Filter大概有二十几个,它们的入口都是ProtocolFilterWrapper,ProtocolFilterWrapper对Protocol做了Wrapper,会在加载扩展的时候被加载进来,下面我们来看下这个Filter链是如何构造的。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">//ProtocolFilterWrapper.java</span>\n<span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-functio [...]
+  "__html": "<h1>第一个Dubbo Filter</h1>\n<h3>概述</h3>\n<p>在Dubbo的整体设计中,Filter是一个很重要的概念,包括Dubbo本身的大多数功能,都是基于此扩展点实现的,在每次的调用过程中,Filter的拦截都会被执行。</p>\n<h4>Dubbo Filter的加载机制</h4>\n<p>Dubbo中已经实现的Filter大概有二十几个,它们的入口都是ProtocolFilterWrapper,ProtocolFilterWrapper对Protocol做了Wrapper,会在加载扩展的时候被加载进来,下面我们来看下这个Filter链是如何构造的。</p>\n<pre><code class=\"language-java\"><span class=\"hljs-comment\">//ProtocolFilterWrapper.java</span>\n<span class=\"hljs-keyword\">public</span> &lt;T&gt; <span class=\"hljs-functio [...]
   "link": "/zh-cn/blog/first-dubbo-filter.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/introduction-to-dubbo-spi-2.html b/zh-cn/blog/introduction-to-dubbo-spi-2.html
index fbb5d40..5a8b9b1 100644
--- a/zh-cn/blog/introduction-to-dubbo-spi-2.html
+++ b/zh-cn/blog/introduction-to-dubbo-spi-2.html
@@ -32,29 +32,29 @@ ExtensionLoader 的方法比较多,比较常用的方法有:</p>
 <li>getExtensionLoader方法
 这是一个静态工厂方法,入参是一个可扩展的接口,返回一个该接口的ExtensionLoader实体类。通过这个实体类,可以根据name获得具体的扩展,也可以获得一个自适应扩展。</li>
 </ol>
-<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> &lt;T&gt; <span class="hljs-function">ExtensionLoader&lt;T&gt; <span class="hljs-title">getExtensionLoader</span><span class="hljs-params">(Class&lt;T&gt; type)</span> </span>{
-        <span class="hljs-comment">// 扩展点必须是接口</span>
-        <span class="hljs-keyword">if</span> (!type.isInterface()) {
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Extension type("</span> + type + <span class="hljs-string">") is not interface!"</span>);
+<pre><code class="language-java">public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type) {
+        // 扩展点必须是接口
+        if (!type.isInterface()) {
+            throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");
         }
-        <span class="hljs-comment">// 必须要有@SPI注解</span>
-        <span class="hljs-keyword">if</span> (!withExtensionAnnotation(type)) {
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Extension type without @SPI Annotation!"</span>);
+        // 必须要有@SPI注解
+        if (!withExtensionAnnotation(type)) {
+            throw new IllegalArgumentException("Extension type without @SPI Annotation!");
         }
-        <span class="hljs-comment">// 从缓存中根据接口获取对应的ExtensionLoader</span>
-        <span class="hljs-comment">// 每个扩展只会被加载一次</span>
+        // 从缓存中根据接口获取对应的ExtensionLoader
+        // 每个扩展只会被加载一次
         ExtensionLoader&lt;T&gt; loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);
-        <span class="hljs-keyword">if</span> (loader == <span class="hljs-keyword">null</span>) {
-            <span class="hljs-comment">// 初始化扩展</span>
-            EXTENSION_LOADERS.putIfAbsent(type, <span class="hljs-keyword">new</span> ExtensionLoader&lt;T&gt;(type));
+        if (loader == null) {
+            // 初始化扩展
+            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader&lt;T&gt;(type));
             loader = (ExtensionLoader&lt;T&gt;) EXTENSION_LOADERS.get(type);
         }
-        <span class="hljs-keyword">return</span> loader;
+        return loader;
 }
     
-<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">ExtensionLoader</span><span class="hljs-params">(Class&lt;?&gt; type)</span> </span>{
-        <span class="hljs-keyword">this</span>.type = type;
-        objectFactory = (type == ExtensionFactory.class ? <span class="hljs-keyword">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
+private ExtensionLoader(Class&lt;?&gt; type) {
+        this.type = type;
+        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
 }
 </code></pre>
 <ol start="2">
@@ -131,7 +131,7 @@ ExtensionLoader 的方法比较多,比较常用的方法有:</p>
 
 <span class="hljs-comment">// synchronized in getExtensionClasses</span>
 <span class="hljs-keyword">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {
-        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);
+        <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">if</span> (defaultAnnotation != <span class="hljs-keyword">null</span>) {
             String value = defaultAnnotation.value();
             <span class="hljs-keyword">if</span> (value != <span class="hljs-keyword">null</span> &amp;&amp; (value = value.trim()).length() &gt; <span class="hljs-number">0</span>) {
@@ -186,9 +186,9 @@ ExtensionLoader 的方法比较多,比较常用的方法有:</p>
 </code></pre>
 <p>要实现对扩展实例的依赖的自动装配,首先需要知道有哪些依赖,这些依赖的类型是什么。Dubbo的方案是查找Java标准的setter方法。即方法名以set开始,只有一个参数。如果扩展类中有这样的set方法,Dubbo会对其进行依赖注入,类似于Spring的set方法注入。
 但是Dubbo中的依赖注入比Spring要复杂,因为Spring注入的都是Spring bean,都是由Spring容器来管理的。而Dubbo的依赖注入中,需要注入的可能是另一个Dubbo的扩展,也可能是一个Spring Bean,或是Google guice的组件,或其他任何一个框架中的组件。Dubbo需要能够从任何一个场景中加载扩展。在injectExtension方法中,是用<code>Object object = objectFactory.getExtension(pt, property)</code>来实现的。objectFactory是ExtensionFactory类型的,在创建ExtensionLoader时被初始化:</p>
-<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">ExtensionLoader</span><span class="hljs-params">(Class&lt;?&gt; type)</span> </span>{
-        <span class="hljs-keyword">this</span>.type = type;
-        objectFactory = (type == ExtensionFactory.class ? <span class="hljs-keyword">null</span> : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
+<pre><code class="language-java">private ExtensionLoader(Class&lt;?&gt; type) {
+        this.type = type;
+        objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
     }
 </code></pre>
 <p>objectFacory本身也是一个扩展,通过<code>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())</code>来获取。</p>
@@ -206,7 +206,7 @@ ExtensionLoader 的方法比较多,比较常用的方法有:</p>
     <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> List&lt;ExtensionFactory&gt; factories;
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">AdaptiveExtensionFactory</span><span class="hljs-params">()</span> </span>{
-        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);
+        ExtensionLoader&lt;ExtensionFactory&gt; loader = ExtensionLoader.getExtensionLoader(ExtensionFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         List&lt;ExtensionFactory&gt; list = <span class="hljs-keyword">new</span> ArrayList&lt;ExtensionFactory&gt;();
         <span class="hljs-keyword">for</span> (String name : loader.getSupportedExtensions()) {
             list.add(loader.getExtension(name));
@@ -310,7 +310,7 @@ ProtocolFilterWrapper代码如下:</p>
 <pre><code class="language-java"><span class="hljs-keyword">private</span> Class&lt;?&gt; createAdaptiveExtensionClass() {
         String code = createAdaptiveExtensionClassCode();
         ClassLoader classLoader = findClassLoader();
-        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
+        org.apache.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(org.apache.dubbo.common.compiler.Compiler<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
         <span class="hljs-keyword">return</span> compiler.compile(code, classLoader);
     }
 </code></pre>
@@ -343,7 +343,7 @@ ProtocolFilterWrapper代码如下:</p>
         String extName = (url.getProtocol() == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"dubbo"</span> : url.getProtocol());
         <span class="hljs-keyword">if</span> (extName == <span class="hljs-keyword">null</span>)
             <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url("</span> + url.toString() + <span class="hljs-string">") use keys([protocol])"</span>);
-        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
+        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">extName</span>)</span>;
         <span class="hljs-keyword">return</span> extension.export(arg0);
     }
 
@@ -353,7 +353,7 @@ ProtocolFilterWrapper代码如下:</p>
         String extName = (url.getProtocol() == <span class="hljs-keyword">null</span> ? <span class="hljs-string">"dubbo"</span> : url.getProtocol());
         <span class="hljs-keyword">if</span> (extName == <span class="hljs-keyword">null</span>)
             <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Fail to get extension(org.apache.dubbo.rpc.Protocol) name from url("</span> + url.toString() + <span class="hljs-string">") use keys([protocol])"</span>);
-        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);
+        org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">extName</span>)</span>;
         <span class="hljs-keyword">return</span> extension.refer(arg0, arg1);
     }
 }
diff --git a/zh-cn/blog/introduction-to-dubbo-spi-2.json b/zh-cn/blog/introduction-to-dubbo-spi-2.json
index b046e8f..4325bd8 100644
--- a/zh-cn/blog/introduction-to-dubbo-spi-2.json
+++ b/zh-cn/blog/introduction-to-dubbo-spi-2.json
@@ -1,6 +1,6 @@
 {
   "filename": "introduction-to-dubbo-spi-2.md",
-  "__html": "<h1>Dubbo可扩展机制源码解析</h1>\n<p>在<a href=\"./introduction-to-dubbo-spi.md\">Dubbo可扩展机制实战</a>中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现,并自己实现了一个LoadBalance。是不是觉得Dubbo的扩展机制很不错呀,接下来,我们就深入Dubbo的源码,一睹庐山真面目。</p>\n<h2>ExtensionLoader</h2>\n<p>ExtensionLoader 是最核心的类,负责扩展点的加载和生命周期管理。我们就以这个类开始吧。\nExtensionLoader 的方法比较多,比较常用的方法有:</p>\n<ul>\n<li><code>public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type)</code></li>\n<li><code>public T getExtension(Stri [...]
+  "__html": "<h1>Dubbo可扩展机制源码解析</h1>\n<p>在<a href=\"./introduction-to-dubbo-spi.md\">Dubbo可扩展机制实战</a>中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现,并自己实现了一个LoadBalance。是不是觉得Dubbo的扩展机制很不错呀,接下来,我们就深入Dubbo的源码,一睹庐山真面目。</p>\n<h2>ExtensionLoader</h2>\n<p>ExtensionLoader 是最核心的类,负责扩展点的加载和生命周期管理。我们就以这个类开始吧。\nExtensionLoader 的方法比较多,比较常用的方法有:</p>\n<ul>\n<li><code>public static &lt;T&gt; ExtensionLoader&lt;T&gt; getExtensionLoader(Class&lt;T&gt; type)</code></li>\n<li><code>public T getExtension(Stri [...]
   "link": "/zh-cn/blog/introduction-to-dubbo-spi-2.html",
   "meta": {
     "title": "Dubbo可扩展机制源码解析",
diff --git a/zh-cn/blog/introduction-to-dubbo-spi.html b/zh-cn/blog/introduction-to-dubbo-spi.html
index 1300e8c..d46a29d 100644
--- a/zh-cn/blog/introduction-to-dubbo-spi.html
+++ b/zh-cn/blog/introduction-to-dubbo-spi.html
@@ -67,7 +67,7 @@ com.demo.MysqlRepository
 <ol start="4">
 <li>通过ServiceLoader加载IRepository实现</li>
 </ol>
-<pre><code class="language-java">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository.class);
+<pre><code class="language-java">ServiceLoader&lt;IRepository&gt; serviceLoader = ServiceLoader.load(IRepository<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 Iterator&lt;IRepository&gt; it = serviceLoader.iterator();
 <span class="hljs-keyword">while</span> (it != <span class="hljs-keyword">null</span> &amp;&amp; it.hasNext()){
     IRepository demoService = it.next();
@@ -157,7 +157,7 @@ consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalan
 </ul>
 <h3>6.2 获取LoadBalance扩展</h3>
 <p>Dubbo中获取LoadBalance的代码如下:</p>
-<pre><code class="language-java">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(loadbalanceName);
+<pre><code class="language-java">LoadBalance lb = ExtensionLoader.getExtensionLoader(LoadBalance<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">loadbalanceName</span>)</span>;
 </code></pre>
 <p>使用ExtensionLoader.getExtensionLoader(LoadBalance.class)方法获取一个ExtensionLoader的实例,然后调用getExtension,传入一个扩展的别名来获取对应的扩展实例。</p>
 <h2>7. 自定义一个LoadBalance扩展</h2>
diff --git a/zh-cn/blog/introduction-to-dubbo-spi.json b/zh-cn/blog/introduction-to-dubbo-spi.json
index 3d0da31..09fe5ac 100644
--- a/zh-cn/blog/introduction-to-dubbo-spi.json
+++ b/zh-cn/blog/introduction-to-dubbo-spi.json
@@ -1,6 +1,6 @@
 {
   "filename": "introduction-to-dubbo-spi.md",
-  "__html": "<h1>Dubbo可扩展机制实战</h1>\n<h2>1. Dubbo的扩展机制</h2>\n<p>在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。\n如同罗马不是一天建成的,任何系统都一定是从小系统不断发展成为大系统的,想要从一开始就把系统设计的足够完善是不可能的,相反的,我们应该关注当下的需求,然后再不断地对系统进行迭代。在代码层面,要求我们适当的对关注点进行抽象和隔离,在软件不断添加功能和特性时,依然能保持良好的结构和可维护性,同时允许第三方开发者对其功能进行扩展。在某些时候,软件设计者对扩展性的追求甚至超过了性能。</p>\n<p>在谈到软件设计时,可扩展性一直被谈起,那到底什么才是可扩展性,什么样的框架才算有良好的可扩展性呢?它必须要做到以下两点:</p>\
 n<ol>\n<li>作为框架的维护者,在添加一个新功能时,只需要添加一些新代码,而不用大量的修改现有的代码,即符合开闭原则。</li>\n<li>作为框架的使用者,在添加一个新功能时,不需要去修改框架 [...]
+  "__html": "<h1>Dubbo可扩展机制实战</h1>\n<h2>1. Dubbo的扩展机制</h2>\n<p>在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。\n如同罗马不是一天建成的,任何系统都一定是从小系统不断发展成为大系统的,想要从一开始就把系统设计的足够完善是不可能的,相反的,我们应该关注当下的需求,然后再不断地对系统进行迭代。在代码层面,要求我们适当的对关注点进行抽象和隔离,在软件不断添加功能和特性时,依然能保持良好的结构和可维护性,同时允许第三方开发者对其功能进行扩展。在某些时候,软件设计者对扩展性的追求甚至超过了性能。</p>\n<p>在谈到软件设计时,可扩展性一直被谈起,那到底什么才是可扩展性,什么样的框架才算有良好的可扩展性呢?它必须要做到以下两点:</p>\
 n<ol>\n<li>作为框架的维护者,在添加一个新功能时,只需要添加一些新代码,而不用大量的修改现有的代码,即符合开闭原则。</li>\n<li>作为框架的使用者,在添加一个新功能时,不需要去修改框架 [...]
   "link": "/zh-cn/blog/introduction-to-dubbo-spi.html",
   "meta": {
     "title": "Dubbo可扩展机制实战",
diff --git a/zh-cn/blog/pinpoint.html b/zh-cn/blog/pinpoint.html
index dd1baf3..a61f70f 100644
--- a/zh-cn/blog/pinpoint.html
+++ b/zh-cn/blog/pinpoint.html
@@ -185,7 +185,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoProviderApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoProviderApplication.class, args);
+		SpringApplication.run(DemoProviderApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
@@ -333,7 +333,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoConsumerApplication.class, args);
+		SpringApplication.run(DemoConsumerApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
diff --git a/zh-cn/blog/pinpoint.json b/zh-cn/blog/pinpoint.json
index f2726e2..4380d1e 100644
--- a/zh-cn/blog/pinpoint.json
+++ b/zh-cn/blog/pinpoint.json
@@ -1,6 +1,6 @@
 {
   "filename": "pinpoint.md",
-  "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何 [...]
+  "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何 [...]
   "link": "/zh-cn/blog/pinpoint.html",
   "meta": {
     "title": "使用Pinpoint做分布式跟踪",
diff --git a/zh-cn/blog/service-and-version.html b/zh-cn/blog/service-and-version.html
index 5cc90d6..4e76f54 100644
--- a/zh-cn/blog/service-and-version.html
+++ b/zh-cn/blog/service-and-version.html
@@ -169,7 +169,7 @@
             <span class="hljs-keyword">return</span> resultList.iterator().next();
         }
 
-        <span class="hljs-keyword">if</span> (returnType == <span class="hljs-keyword">void</span>.class) {
+        <span class="hljs-keyword">if</span> (returnType == <span class="hljs-keyword">void</span><span class="hljs-class">.<span class="hljs-keyword">class</span>) </span>{
             <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> RpcResult((Object) <span class="hljs-keyword">null</span>);
         }
 </code></pre>
@@ -178,7 +178,7 @@
   <span class="hljs-keyword">if</span> (ConfigUtils.isDefault(merger)) {
       resultMerger = MergerFactory.getMerger(returnType);
   } <span class="hljs-keyword">else</span> {
-      resultMerger = ExtensionLoader.getExtensionLoader(Merger.class).getExtension(merger);
+      resultMerger = ExtensionLoader.getExtensionLoader(Merger<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">merger</span>)</span>;
   }
   <span class="hljs-keyword">if</span> (resultMerger != <span class="hljs-keyword">null</span>) {
       List&lt;Object&gt; rets = <span class="hljs-keyword">new</span> ArrayList&lt;Object&gt;(resultList.size());
diff --git a/zh-cn/blog/service-and-version.json b/zh-cn/blog/service-and-version.json
index aa6638c..62212fb 100644
--- a/zh-cn/blog/service-and-version.json
+++ b/zh-cn/blog/service-and-version.json
@@ -1,6 +1,6 @@
 {
   "filename": "service-and-version.md",
-  "__html": "<h1>Dubbo服务分组和版本聚合</h1>\n<p>我们在调用Dubbo服务的时候,一般只需要将Consumer端的<code>dubbo:reference</code>指定成服务端中<code>dubbo:service</code>暴露的服务,就可以找到服务端,完成调用,也就是说,Dubbo只需要服务接口信息就可以找到服务提供者。\n其实除了服务提供者以外,Dubbo也有服务分组和版本的概念,在客户端去寻找“匹配”的服务端的时候,需要服务接口,版本号,组别这三个信息都匹配,才算是一个有效的服务端:</p>\n<pre><code class=\"language-java\">   <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">boolean</span> <span class=\"hljs- [...]
+  "__html": "<h1>Dubbo服务分组和版本聚合</h1>\n<p>我们在调用Dubbo服务的时候,一般只需要将Consumer端的<code>dubbo:reference</code>指定成服务端中<code>dubbo:service</code>暴露的服务,就可以找到服务端,完成调用,也就是说,Dubbo只需要服务接口信息就可以找到服务提供者。\n其实除了服务提供者以外,Dubbo也有服务分组和版本的概念,在客户端去寻找“匹配”的服务端的时候,需要服务接口,版本号,组别这三个信息都匹配,才算是一个有效的服务端:</p>\n<pre><code class=\"language-java\">   <span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-keyword\">static</span> <span class=\"hljs-keyword\">boolean</span> <span class=\"hljs- [...]
   "link": "/zh-cn/blog/service-and-version.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html
index 9d7af4d..25fccc8 100644
--- a/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html
+++ b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html
@@ -25,7 +25,7 @@
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DubboConsumerDemo</span> </span>{
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-        SpringApplication.run(DubboConsumerDemo.class,args);
+        SpringApplication.run(DubboConsumerDemo<span class="hljs-class">.<span class="hljs-keyword">class</span>,<span class="hljs-title">args</span>)</span>;
     }
 
 }
diff --git a/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
index 181862a..8e779d7 100644
--- a/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
+++ b/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.json
@@ -1,6 +1,6 @@
 {
   "filename": "spring-boot-dubbo-start-stop-analysis.md",
-  "__html": "<h1>Spring Boot Dubbo应用启停源码分析</h1>\n<h2>背景介绍</h2>\n<p><a href=\"https://github.com/apache/dubbo-spring-boot-project\">Dubbo Spring Boot</a> 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发。同时也整合了 Spring Boot 特性:</p>\n<ul>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">自动装配</a> (比如: 注解驱动, 自动装配等).</li>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator\">Production-R [...]
+  "__html": "<h1>Spring Boot Dubbo应用启停源码分析</h1>\n<h2>背景介绍</h2>\n<p><a href=\"https://github.com/apache/dubbo-spring-boot-project\">Dubbo Spring Boot</a> 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发。同时也整合了 Spring Boot 特性:</p>\n<ul>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure\">自动装配</a> (比如: 注解驱动, 自动装配等).</li>\n<li><a href=\"https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-actuator\">Production-R [...]
   "link": "/zh-cn/blog/spring-boot-dubbo-start-stop-analysis.html",
   "meta": {
     "title": "Spring Boot Dubbo应用启停源码分析",
diff --git a/zh-cn/blog/test-verification.html b/zh-cn/blog/test-verification.html
index 47e27b7..db97962 100644
--- a/zh-cn/blog/test-verification.html
+++ b/zh-cn/blog/test-verification.html
@@ -65,14 +65,14 @@ assert(status.equals(&quot;OK&quot;));
             <span class="hljs-keyword">if</span> (types != <span class="hljs-keyword">null</span> &amp;&amp; types.length &gt; <span class="hljs-number">0</span>) {
                 interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[types.length + <span class="hljs-number">2</span>];
                 interfaces[<span class="hljs-number">0</span>] = invoker.getInterface();
-                interfaces[<span class="hljs-number">1</span>] = EchoService.class;
+                interfaces[<span class="hljs-number">1</span>] = EchoService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
                 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; types.length; i++) {
                     interfaces[i + <span class="hljs-number">1</span>] = ReflectUtils.forName(types[i]);
                 }
             }
         }
         <span class="hljs-keyword">if</span> (interfaces == <span class="hljs-keyword">null</span>) {
-            interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{invoker.getInterface(), EchoService.class};
+            interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{invoker.getInterface(), EchoService<span class="hljs-class">.<span class="hljs-keyword">class</span>}</span>;
         }
         <span class="hljs-keyword">return</span> getProxy(invoker, interfaces);
     }
diff --git a/zh-cn/blog/test-verification.json b/zh-cn/blog/test-verification.json
index 3ee71a1..66efcff 100644
--- a/zh-cn/blog/test-verification.json
+++ b/zh-cn/blog/test-verification.json
@@ -1,6 +1,6 @@
 {
   "filename": "test-verification.md",
-  "__html": "<h1>Dubbo测试验证</h1>\n<p>除了线上常规的使用场景以外,我们在日常使用中还需要一些特定的使用方式,比如对正在开发的功能进行验证测试,比如单独调用某台机器的服务,这篇文章就来介绍一下这些场景下的使用方式。</p>\n<h3>只订阅</h3>\n<p>为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。</p>\n<p>可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。<br>\n<img src=\"../../img/blog/subscribe-only.jpg\" alt=\"subscribe-only\">\n禁用注册配置</p>\n<pre><code>&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; register=&quot;false&quot; /&gt;\n</code></pre>\n<p>或者 [...]
+  "__html": "<h1>Dubbo测试验证</h1>\n<p>除了线上常规的使用场景以外,我们在日常使用中还需要一些特定的使用方式,比如对正在开发的功能进行验证测试,比如单独调用某台机器的服务,这篇文章就来介绍一下这些场景下的使用方式。</p>\n<h3>只订阅</h3>\n<p>为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。</p>\n<p>可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。<br>\n<img src=\"../../img/blog/subscribe-only.jpg\" alt=\"subscribe-only\">\n禁用注册配置</p>\n<pre><code>&lt;dubbo:registry address=&quot;10.20.153.10:9090&quot; register=&quot;false&quot; /&gt;\n</code></pre>\n<p>或者 [...]
   "link": "/zh-cn/blog/test-verification.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/blog/use-zipkin-in-dubbo.html b/zh-cn/blog/use-zipkin-in-dubbo.html
index 85cf6d3..3d32e27 100644
--- a/zh-cn/blog/use-zipkin-in-dubbo.html
+++ b/zh-cn/blog/use-zipkin-in-dubbo.html
@@ -482,7 +482,7 @@ o.s.b.w.e.u.UndertowServletWebServer     : Undertow started on port(s) 9411 (htt
 </li>
 </ol>
 <p>完成之后的工程的目录结构如下:</p>
-<p><img src="../../img/blog/zipkin-dubbo-project.png" alt="zipkin dubob project structure"></p>
+<p><img src="../../img/blog/zipkin-dubbo-project.png" alt="zipkin dubbo project structure"></p>
 <h3>运行</h3>
 <p>现在让我们把整个链路运行起来,看看 Zipkin 链路追踪的效果。</p>
 <h4>启动 Zookeeper Server</h4>
diff --git a/zh-cn/blog/use-zipkin-in-dubbo.json b/zh-cn/blog/use-zipkin-in-dubbo.json
index 9c7dd35..f14e22a 100644
--- a/zh-cn/blog/use-zipkin-in-dubbo.json
+++ b/zh-cn/blog/use-zipkin-in-dubbo.json
@@ -1,6 +1,6 @@
 {
   "filename": "use-zipkin-in-dubbo.md",
-  "__html": "<h1>在 Dubbo 中使用 Zipkin</h1>\n<p>随着业务的发展,应用的规模不断的扩大,传统的应用架构无法满足诉求,服务化架构改造势在必行,以 Dubbo 为代表的分布式服务框架成为了服务化改造架构中的基石。随着微服务理念逐渐被大众接受,应用进一步向更细粒度拆分,并且,不同的应用由不同的开发团队独立负责,整个分布式系统变得十分复杂。没有人能够清晰及时的知道当前系统整体的依赖关系。当出现问题时,也无法及时知道具体是链路上的哪个环节出了问题。</p>\n<p>在这个背景下,Google 发表了 <a href=\"https://ai.google/research/pubs/pub36356\">Dapper</a> 的论文,描述了如何通过一个分布式追踪系统解决上述问题。基于该论文,各大互联网公司实现并部署了自己的分布式追踪系统,其中比较出名的有阿里巴巴的 EagleEye。本文中提到的 Zipkin 是 Twitter
  公司开源的分布式追踪系统。下面会详细介绍如何在 Dubbo 中使用 Zipkin 来实现分布式追踪。</p>\n [...]
+  "__html": "<h1>在 Dubbo 中使用 Zipkin</h1>\n<p>随着业务的发展,应用的规模不断的扩大,传统的应用架构无法满足诉求,服务化架构改造势在必行,以 Dubbo 为代表的分布式服务框架成为了服务化改造架构中的基石。随着微服务理念逐渐被大众接受,应用进一步向更细粒度拆分,并且,不同的应用由不同的开发团队独立负责,整个分布式系统变得十分复杂。没有人能够清晰及时的知道当前系统整体的依赖关系。当出现问题时,也无法及时知道具体是链路上的哪个环节出了问题。</p>\n<p>在这个背景下,Google 发表了 <a href=\"https://ai.google/research/pubs/pub36356\">Dapper</a> 的论文,描述了如何通过一个分布式追踪系统解决上述问题。基于该论文,各大互联网公司实现并部署了自己的分布式追踪系统,其中比较出名的有阿里巴巴的 EagleEye。本文中提到的 Zipkin 是 Twitter
  公司开源的分布式追踪系统。下面会详细介绍如何在 Dubbo 中使用 Zipkin 来实现分布式追踪。</p>\n [...]
   "link": "/zh-cn/blog/use-zipkin-in-dubbo.html",
   "meta": {
     "title": "在 Dubbo 中使用 Zipkin",
diff --git a/zh-cn/docs/admin/ops/pinpoint.html b/zh-cn/docs/admin/ops/pinpoint.html
index 55b3c8f..a30d7f6 100644
--- a/zh-cn/docs/admin/ops/pinpoint.html
+++ b/zh-cn/docs/admin/ops/pinpoint.html
@@ -185,7 +185,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoProviderApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoProviderApplication.class, args);
+		SpringApplication.run(DemoProviderApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
@@ -333,7 +333,7 @@ public interface HelloService {
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoConsumerApplication</span> </span>{
 
 	<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-		SpringApplication.run(DemoConsumerApplication.class, args);
+		SpringApplication.run(DemoConsumerApplication<span class="hljs-class">.<span class="hljs-keyword">class</span>, <span class="hljs-title">args</span>)</span>;
 	}
 }
 </code></pre>
diff --git a/zh-cn/docs/admin/ops/pinpoint.json b/zh-cn/docs/admin/ops/pinpoint.json
index f61976f..1162fe7 100644
--- a/zh-cn/docs/admin/ops/pinpoint.json
+++ b/zh-cn/docs/admin/ops/pinpoint.json
@@ -1,6 +1,6 @@
 {
   "filename": "pinpoint.md",
-  "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何 [...]
+  "__html": "<h1>使用Pinpoint做分布式跟踪</h1>\n<p>在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p>\n<h2>什么是Pinpoint(摘自<a href=\"https://skyao.gitbooks.io/learning-pinpoint/\">Pinpoint学习笔记</a>)</h2>\n<p><a href=\"https://github.com/naver/pinpoint\">Pinpoint</a>是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。\n仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何 [...]
   "link": "/zh-cn/docs/admin/ops/pinpoint.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/dev/principals/dummy.html b/zh-cn/docs/dev/principals/dummy.html
index 9dc9e07..6bf3b26 100644
--- a/zh-cn/docs/dev/principals/dummy.html
+++ b/zh-cn/docs/dev/principals/dummy.html
@@ -20,7 +20,7 @@
 <h2>检查重复的jar包</h2>
 <p>最痴呆的问题,就是有多个版本的相同jar包,会出现新版本的 A 类,调用了旧版本的 B 类,而且和JVM加载顺序有关,问题带有偶然性,误导性,遇到这种莫名其妙的问题,最头疼,所以,第一条,先把它防住,在每个 jar 包中挑一个一定会加载的类,加上重复类检查,给个示例:</p>
 <pre><code class="language-java"><span class="hljs-keyword">static</span> {  
-    Duplicate.checkDuplicate(Xxx.class);  
+    Duplicate.checkDuplicate(Xxx<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;  
 }  
 </code></pre>
 <p>检查重复工具类:</p>
@@ -73,43 +73,43 @@
 }  
 </code></pre>
 <p>获取版本号工具类:</p>
-<pre><code class="language-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Version</span> </span>{  
+<pre><code class="language-java">public final class Version {  
   
-    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">Version</span><span class="hljs-params">()</span> </span>{}  
+    private Version() {}  
   
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(Version.class);  
+    private static final Logger logger = LoggerFactory.getLogger(Version.class);  
   
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Pattern VERSION_PATTERN = Pattern.compile(<span class="hljs-string">"([0-9][0-9\\.\\-]*)\\.jar"</span>);  
+    private static final Pattern VERSION_PATTERN = Pattern.compile("([0-9][0-9\\.\\-]*)\\.jar");  
   
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String VERSION = getVersion(Version.class, <span class="hljs-string">"2.0.0"</span>);  
+    private static final String VERSION = getVersion(Version.class, "2.0.0");  
   
-    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getVersion</span><span class="hljs-params">()</span></span>{  
-        <span class="hljs-keyword">return</span> VERSION;  
+    public static String getVersion(){  
+        return VERSION;  
     }  
   
-    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getVersion</span><span class="hljs-params">(Class cls, String defaultVersion)</span> </span>{  
-        <span class="hljs-keyword">try</span> {  
-            <span class="hljs-comment">// 首先查找MANIFEST.MF规范中的版本号  </span>
+    public static String getVersion(Class cls, String defaultVersion) {  
+        try {  
+            // 首先查找MANIFEST.MF规范中的版本号  
             String version = cls.getPackage().getImplementationVersion();  
-            <span class="hljs-keyword">if</span> (version == <span class="hljs-keyword">null</span> || version.length() == <span class="hljs-number">0</span>) {  
+            if (version == null || version.length() == 0) {  
                 version = cls.getPackage().getSpecificationVersion();  
             }  
-            <span class="hljs-keyword">if</span> (version == <span class="hljs-keyword">null</span> || version.length() == <span class="hljs-number">0</span>) {  
-                <span class="hljs-comment">// 如果MANIFEST.MF规范中没有版本号,基于jar包名获取版本号  </span>
+            if (version == null || version.length() == 0) {  
+                // 如果MANIFEST.MF规范中没有版本号,基于jar包名获取版本号  
                 String file = cls.getProtectionDomain().getCodeSource().getLocation().getFile();  
-                <span class="hljs-keyword">if</span> (file != <span class="hljs-keyword">null</span> &amp;&amp; file.length() &gt; <span class="hljs-number">0</span> &amp;&amp; file.endsWith(<span class="hljs-string">".jar"</span>)) {  
+                if (file != null &amp;&amp; file.length() &gt; 0 &amp;&amp; file.endsWith(".jar")) {  
                     Matcher matcher = VERSION_PATTERN.matcher(file);  
-                    <span class="hljs-keyword">while</span> (matcher.find() &amp;&amp; matcher.groupCount() &gt; <span class="hljs-number">0</span>) {  
-                        version = matcher.group(<span class="hljs-number">1</span>);  
+                    while (matcher.find() &amp;&amp; matcher.groupCount() &gt; 0) {  
+                        version = matcher.group(1);  
                     }  
                 }  
             }  
-            <span class="hljs-comment">// 返回版本号,如果为空返回缺省版本号  </span>
-            <span class="hljs-keyword">return</span> version == <span class="hljs-keyword">null</span> || version.length() == <span class="hljs-number">0</span> ? defaultVersion : version;  
-        } <span class="hljs-keyword">catch</span> (Throwable e) { <span class="hljs-comment">// 防御性容错  </span>
-            <span class="hljs-comment">// 忽略异常,返回缺省版本号  </span>
+            // 返回版本号,如果为空返回缺省版本号  
+            return version == null || version.length() == 0 ? defaultVersion : version;  
+        } catch (Throwable e) { // 防御性容错  
+            // 忽略异常,返回缺省版本号  
             logger.error(e.getMessage(), e);  
-            <span class="hljs-keyword">return</span> defaultVersion;  
+            return defaultVersion;  
         }  
     }  
   
diff --git a/zh-cn/docs/dev/principals/dummy.json b/zh-cn/docs/dev/principals/dummy.json
index bb94484..92d5d11 100644
--- a/zh-cn/docs/dev/principals/dummy.json
+++ b/zh-cn/docs/dev/principals/dummy.json
@@ -1,6 +1,6 @@
 {
   "filename": "dummy.md",
-  "__html": "<h1>防痴呆设计</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/804187\">http://javatar.iteye.com/blog/804187</a></p>\n</blockquote>\n<p>最近有点痴呆,因为解决了太多的痴呆问题。服务框架实施面越来越广,已有 50 多个项目在使用,每天都要去帮应用查问题,来来回回,发现大部分都是配置错误,或者重复的文件或类,或者网络不通等,所以准备在新版本中加入防痴呆设计。估且这么叫吧,可能很简单,但对排错速度还是有点帮助,希望能抛砖引玉,也希望大家多给力,想出更多的防范措施共享出来。</p>\n<h2>检查重复的jar包</h2>\n<p>最痴呆的问题,就是有多个版本的相同jar包,会出现新版本的 A 类,调用了旧版本的 B 类,而且和JVM加载顺序有关,问题带有偶然性,误导性,遇到这种莫名其妙的问题,最头疼,所以,第一条,先把它防住,在每个 jar 包�
 ��挑一个一定会加载的类,加上重复类检查,给个示例:</p [...]
+  "__html": "<h1>防痴呆设计</h1>\n<blockquote>\n<p><a href=\"http://javatar.iteye.com/blog/804187\">http://javatar.iteye.com/blog/804187</a></p>\n</blockquote>\n<p>最近有点痴呆,因为解决了太多的痴呆问题。服务框架实施面越来越广,已有 50 多个项目在使用,每天都要去帮应用查问题,来来回回,发现大部分都是配置错误,或者重复的文件或类,或者网络不通等,所以准备在新版本中加入防痴呆设计。估且这么叫吧,可能很简单,但对排错速度还是有点帮助,希望能抛砖引玉,也希望大家多给力,想出更多的防范措施共享出来。</p>\n<h2>检查重复的jar包</h2>\n<p>最痴呆的问题,就是有多个版本的相同jar包,会出现新版本的 A 类,调用了旧版本的 B 类,而且和JVM加载顺序有关,问题带有偶然性,误导性,遇到这种莫名其妙的问题,最头疼,所以,第一条,先把它防住,在每个 jar 包�
 ��挑一个一定会加载的类,加上重复类检查,给个示例:</p [...]
   "link": "/zh-cn/docs/dev/principals/dummy.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/source_code_guide/adaptive-extension.html b/zh-cn/docs/source_code_guide/adaptive-extension.html
index 13e3693..76906d2 100644
--- a/zh-cn/docs/source_code_guide/adaptive-extension.html
+++ b/zh-cn/docs/source_code_guide/adaptive-extension.html
@@ -33,7 +33,7 @@
         
         <span class="hljs-comment">// 2.通过 SPI 加载具体的 WheelMaker</span>
         WheelMaker wheelMaker = ExtensionLoader
-            .getExtensionLoader(WheelMaker.class).getExtension(wheelMakerName);
+            .getExtensionLoader(WheelMaker<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">wheelMakerName</span>)</span>;
         
         <span class="hljs-comment">// 3.调用目标方法</span>
         <span class="hljs-keyword">return</span> wheelMaker.makeWheel(URL url);
@@ -149,7 +149,7 @@
     String code = createAdaptiveExtensionClassCode();
     ClassLoader classLoader = findClassLoader();
     <span class="hljs-comment">// 获取编译器实现类</span>
-    com.alibaba.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
+    com.alibaba.dubbo.common.compiler.Compiler compiler = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.common.compiler.Compiler<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
     <span class="hljs-comment">// 编译代码,生成 Class</span>
     <span class="hljs-keyword">return</span> compiler.compile(code, classLoader);
 }
@@ -165,7 +165,7 @@ Method[] methods = type.getMethods();
 <span class="hljs-comment">// 遍历方法列表</span>
 <span class="hljs-keyword">for</span> (Method m : methods) {
     <span class="hljs-comment">// 检测方法上是否有 Adaptive 注解</span>
-    <span class="hljs-keyword">if</span> (m.isAnnotationPresent(Adaptive.class)) {
+    <span class="hljs-keyword">if</span> (m.isAnnotationPresent(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)) </span>{
         hasAdaptiveAnnotation = <span class="hljs-keyword">true</span>;
         <span class="hljs-keyword">break</span>;
     }
@@ -177,21 +177,21 @@ Method[] methods = type.getMethods();
 </code></pre>
 <h4>2.2.2 生成类</h4>
 <p>通过 Adaptive 注解检测后,即可开始生成代码。代码生成的顺序与 Java 文件内容顺序一致,首先会生成 package 语句,然后生成 import 语句,紧接着生成类名等代码。整个逻辑如下:</p>
-<pre><code class="language-java"><span class="hljs-comment">// 生成 package 代码:package + type 所在包</span>
-codeBuilder.append(<span class="hljs-string">"package "</span>).append(type.getPackage().getName()).append(<span class="hljs-string">";"</span>);
-<span class="hljs-comment">// 生成 import 代码:import + ExtensionLoader 全限定名</span>
-codeBuilder.append(<span class="hljs-string">"\nimport "</span>).append(ExtensionLoader.class.getName()).append(<span class="hljs-string">";"</span>);
-<span class="hljs-comment">// 生成类代码:public class + type简单名称 + $Adaptive + implements + type全限定名 + {</span>
-codeBuilder.append(<span class="hljs-string">"\npublic class "</span>)
+<pre><code class="language-java">// 生成 package 代码:package + type 所在包
+codeBuilder.append("package ").append(type.getPackage().getName()).append(";");
+// 生成 import 代码:import + ExtensionLoader 全限定名
+codeBuilder.append("\nimport ").append(ExtensionLoader.class.getName()).append(";");
+// 生成类代码:public class + type简单名称 + $Adaptive + implements + type全限定名 + {
+codeBuilder.append("\npublic class ")
     .append(type.getSimpleName())
-    .append(<span class="hljs-string">"$Adaptive"</span>)
-    .append(<span class="hljs-string">" implements "</span>)
+    .append("$Adaptive")
+    .append(" implements ")
     .append(type.getCanonicalName())
-    .append(<span class="hljs-string">" {"</span>);
+    .append(" {");
 
-<span class="hljs-comment">// ${生成方法}</span>
+// ${生成方法}
 
-codeBuilder.append(<span class="hljs-string">"\n}"</span>);
+codeBuilder.append("\n}");
 </code></pre>
 <p>这里使用 ${...} 占位符代表其他代码的生成逻辑,该部分逻辑将在随后进行分析。上面代码不是很难理解,下面直接通过一个例子展示该段代码所生成的内容。以 Dubbo 的 Protocol 接口为例,生成的代码如下:</p>
 <pre><code class="language-java"><span class="hljs-keyword">package</span> com.alibaba.dubbo.rpc;
@@ -208,7 +208,7 @@ codeBuilder.append(<span class="hljs-string">"\n}"</span>);
     
     <span class="hljs-comment">// 省略无关逻辑</span>
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-comment">// 如果方法上无 Adaptive 注解,则生成 throw new UnsupportedOperationException(...) 代码</span>
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
@@ -240,7 +240,7 @@ codeBuilder.append(<span class="hljs-string">"\n}"</span>);
     Class&lt;?&gt;[] pts = method.getParameterTypes();
     Class&lt;?&gt;[] ets = method.getExceptionTypes();
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// ${无 Adaptive 注解方法代码生成逻辑}</span>
@@ -248,7 +248,7 @@ codeBuilder.append(<span class="hljs-string">"\n}"</span>);
     	<span class="hljs-keyword">int</span> urlTypeIndex = -<span class="hljs-number">1</span>;
         <span class="hljs-comment">// 遍历参数列表,确定 URL 参数位置</span>
         <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; pts.length; ++i) {
-            <span class="hljs-keyword">if</span> (pts[i].equals(URL.class)) {
+            <span class="hljs-keyword">if</span> (pts[i].equals(URL<span class="hljs-class">.<span class="hljs-keyword">class</span>)) </span>{
                 urlTypeIndex = i;
                 <span class="hljs-keyword">break</span>;
             }
@@ -264,7 +264,7 @@ codeBuilder.append(<span class="hljs-string">"\n}"</span>);
             code.append(s);
 
             <span class="hljs-comment">// 为 URL 类型参数生成赋值代码,形如 URL url = arg1</span>
-            s = String.format(<span class="hljs-string">"\n%s url = arg%d;"</span>, URL.class.getName(), urlTypeIndex);
+            s = String.format(<span class="hljs-string">"\n%s url = arg%d;"</span>, URL<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">getName</span>(), <span class="hljs-title">urlTypeIndex</span>)</span>;
             code.append(s);
             
         <span class="hljs-comment">// 参数列表中不存在 URL 类型参数</span>
@@ -288,7 +288,7 @@ codeBuilder.append(<span class="hljs-string">"\n}"</span>);
                         &amp;&amp; Modifier.isPublic(m.getModifiers())
                         &amp;&amp; !Modifier.isStatic(m.getModifiers())
                         &amp;&amp; m.getParameterTypes().length == <span class="hljs-number">0</span>
-                        &amp;&amp; m.getReturnType() == URL.class) {
+                        &amp;&amp; m.getReturnType() == URL<span class="hljs-class">.<span class="hljs-keyword">class</span>) </span>{
                         urlTypeIndex = i;
                         attribMethod = name;
                         
@@ -319,7 +319,7 @@ codeBuilder.append(<span class="hljs-string">"\n}"</span>);
             <span class="hljs-comment">// 生成赋值语句,格式如下:</span>
             <span class="hljs-comment">// URL全限定名 url = argN.getter方法名(),比如 </span>
             <span class="hljs-comment">// com.alibaba.dubbo.common.URL url = invoker.getUrl();</span>
-            s = String.format(<span class="hljs-string">"%s url = arg%d.%s();"</span>, URL.class.getName(), urlTypeIndex, attribMethod);
+            s = String.format(<span class="hljs-string">"%s url = arg%d.%s();"</span>, URL<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">getName</span>(), <span class="hljs-title">urlTypeIndex</span>, <span class="hljs-title">attribMethod</span>)</span>;
             code.append(s);
         }
         
@@ -349,7 +349,7 @@ com.alibaba.dubbo.common.URL url = arg0.getUrl();
     Class&lt;?&gt;[] pts = method.getParameterTypes();
     Class&lt;?&gt;[] ets = method.getExceptionTypes();
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// ${无 Adaptive 注解方法代码生成逻辑}</span>
@@ -393,7 +393,7 @@ com.alibaba.dubbo.common.URL url = arg0.getUrl();
     Class&lt;?&gt;[] pts = method.getParameterTypes();    <span class="hljs-comment">// 获取参数类型列表</span>
     Class&lt;?&gt;[] ets = method.getExceptionTypes();
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// ${无 Adaptive 注解方法代码生成逻辑}</span>
@@ -441,7 +441,7 @@ com.alibaba.dubbo.common.URL url = arg0.getUrl();
     Class&lt;?&gt;[] pts = method.getParameterTypes();
     Class&lt;?&gt;[] ets = method.getExceptionTypes();
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// $无 Adaptive 注解方法代码生成逻辑}</span>
@@ -568,7 +568,7 @@ String[] value = [<span class="hljs-string">"client"</span>, <span class="hljs-s
     Class&lt;?&gt;[] pts = method.getParameterTypes();
     Class&lt;?&gt;[] ets = method.getExceptionTypes();
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// $无 Adaptive 注解方法代码生成逻辑}</span>
@@ -586,11 +586,11 @@ String[] value = [<span class="hljs-string">"client"</span>, <span class="hljs-s
         <span class="hljs-comment">//     .getExtensionLoader(type全限定名.class).getExtension(extName);</span>
         <span class="hljs-comment">// Tips: 格式化字符串中的 %&lt;s 表示使用前一个转换符所描述的参数,即 type 全限定名</span>
         s = String.format(<span class="hljs-string">"\n%s extension = (%&lt;s)%s.getExtensionLoader(%s.class).getExtension(extName);"</span>,
-                        type.getName(), ExtensionLoader.class.getSimpleName(), type.getName());
+                        type.getName(), ExtensionLoader<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">getSimpleName</span>(), <span class="hljs-title">type</span>.<span class="hljs-title">getName</span>())</span>;
         code.append(s);
 
 		<span class="hljs-comment">// 如果方法返回值类型非 void,则生成 return 语句。</span>
-        <span class="hljs-keyword">if</span> (!rt.equals(<span class="hljs-keyword">void</span>.class)) {
+        <span class="hljs-keyword">if</span> (!rt.equals(<span class="hljs-keyword">void</span><span class="hljs-class">.<span class="hljs-keyword">class</span>)) </span>{
             code.append(<span class="hljs-string">"\nreturn "</span>);
         }
 
@@ -611,7 +611,7 @@ String[] value = [<span class="hljs-string">"client"</span>, <span class="hljs-s
 </code></pre>
 <p>以 Protocol 接口举例说明,上面代码生成的内容如下:</p>
 <pre><code class="language-java">com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol) ExtensionLoader
-    .getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName);
+    .getExtensionLoader(com.alibaba.dubbo.rpc.Protocol<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">extName</span>)</span>;
 <span class="hljs-keyword">return</span> extension.refer(arg0, arg1);
 </code></pre>
 <h5>2.2.3.7 生成完整的方法</h5>
@@ -621,7 +621,7 @@ String[] value = [<span class="hljs-string">"client"</span>, <span class="hljs-s
     Class&lt;?&gt;[] pts = method.getParameterTypes();
     Class&lt;?&gt;[] ets = method.getExceptionTypes();
 
-    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
+    Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-number">512</span>);
     <span class="hljs-keyword">if</span> (adaptiveAnnotation == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// $无 Adaptive 注解方法代码生成逻辑}</span>
diff --git a/zh-cn/docs/source_code_guide/adaptive-extension.json b/zh-cn/docs/source_code_guide/adaptive-extension.json
index 030e496..bd72f6c 100644
--- a/zh-cn/docs/source_code_guide/adaptive-extension.json
+++ b/zh-cn/docs/source_code_guide/adaptive-extension.json
@@ -1,6 +1,6 @@
 {
   "filename": "adaptive-extension.md",
-  "__html": "<h2>1.原理</h2>\n<p>在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法除外)。拓展方法未被调用,拓展就无法被加载。对于这个矛盾的问题,Dubbo 通过自适应拓展机制很好的解决了。自适应拓展机制的实现逻辑比较复杂,首先 Dubbo 会为拓展接口生成具有代理功能的代码。然后通过 javassist 或 jdk 编译这段代码,得到 Class 类。最后再通过反射创建代理类,整个过程比较复杂。为了让大家对自适应拓展有一个感性的认识,下面我们通过一个示例进行演示。这是一个与汽车相关的例子,我们有一个车轮制造厂接口 WheelMaker:</p>\n<p
 re><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> < [...]
+  "__html": "<h2>1.原理</h2>\n<p>在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法除外)。拓展方法未被调用,拓展就无法被加载。对于这个矛盾的问题,Dubbo 通过自适应拓展机制很好的解决了。自适应拓展机制的实现逻辑比较复杂,首先 Dubbo 会为拓展接口生成具有代理功能的代码。然后通过 javassist 或 jdk 编译这段代码,得到 Class 类。最后再通过反射创建代理类,整个过程比较复杂。为了让大家对自适应拓展有一个感性的认识,下面我们通过一个示例进行演示。这是一个与汽车相关的例子,我们有一个车轮制造厂接口 WheelMaker:</p>\n<p
 re><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> < [...]
   "link": "/zh-cn/docs/source_code_guide/adaptive-extension.html",
   "meta": {
     "title": "SPI 自适应拓展",
diff --git a/zh-cn/docs/source_code_guide/cluster.html b/zh-cn/docs/source_code_guide/cluster.html
index 1af34c9..fd8a2c8 100644
--- a/zh-cn/docs/source_code_guide/cluster.html
+++ b/zh-cn/docs/source_code_guide/cluster.html
@@ -72,8 +72,8 @@
     List&lt;Invoker&lt;T&gt;&gt; invokers = list(invocation);
     <span class="hljs-keyword">if</span> (invokers != <span class="hljs-keyword">null</span> &amp;&amp; !invokers.isEmpty()) {
         <span class="hljs-comment">// 加载 LoadBalance</span>
-        loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(<span class="hljs-number">0</span>).getUrl()
-                .getMethodParameter(RpcUtils.getMethodName(invocation), Constants.LOADBALANCE_KEY, Constants.DEFAULT_LOADBALANCE));
+        loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">invokers</span>.<span class="hljs-title">get</span>(0).<span class="hljs-title">getUrl</span>()
+                .<span class="hljs-title">getMethodParameter</span>(<span class="hljs-title">RpcUtils</span>.<span class="hljs-title">getMethodName</span>(<span class="hljs-title">invocation</span>), <span class="hljs-title">Constants</span>.<span class="hljs-title">LOADBALANCE_KEY</span>, <span class="hljs-title">Constants</span>.<span class="hljs-title">DEFAULT_LOADBALANCE</span>))</span>;
     }
     RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);
     
@@ -198,7 +198,7 @@
         <span class="hljs-keyword">return</span> invokers.get(<span class="hljs-number">0</span>);
     <span class="hljs-keyword">if</span> (loadbalance == <span class="hljs-keyword">null</span>) {
         <span class="hljs-comment">// 如果 loadbalance 为空,这里通过 SPI 加载 Loadbalance,默认为 RandomLoadBalance</span>
-        loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(Constants.DEFAULT_LOADBALANCE);
+        loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getExtension</span>(<span class="hljs-title">Constants</span>.<span class="hljs-title">DEFAULT_LOADBALANCE</span>)</span>;
     }
     
     <span class="hljs-comment">// 通过负载均衡组件选择 Invoker</span>
diff --git a/zh-cn/docs/source_code_guide/cluster.json b/zh-cn/docs/source_code_guide/cluster.json
index 8d973bc..da99296 100644
--- a/zh-cn/docs/source_code_guide/cluster.json
+++ b/zh-cn/docs/source_code_guide/cluster.json
@@ -1,6 +1,6 @@
 {
   "filename": "cluster.md",
-  "__html": "<h2>1.简介</h2>\n<p>为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。集�
 �模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。< [...]
+  "__html": "<h2>1.简介</h2>\n<p>为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。集�
 �模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。< [...]
   "link": "/zh-cn/docs/source_code_guide/cluster.html",
   "meta": {
     "title": "集群",
diff --git a/zh-cn/docs/source_code_guide/directory.html b/zh-cn/docs/source_code_guide/directory.html
index fb351d2..54e819b 100644
--- a/zh-cn/docs/source_code_guide/directory.html
+++ b/zh-cn/docs/source_code_guide/directory.html
@@ -285,7 +285,7 @@
             <span class="hljs-keyword">continue</span>;
         }
         <span class="hljs-comment">// 通过 SPI 检测服务端协议是否被消费端支持,不支持则抛出异常</span>
-        <span class="hljs-keyword">if</span> (!ExtensionLoader.getExtensionLoader(Protocol.class).hasExtension(providerUrl.getProtocol())) {
+        <span class="hljs-keyword">if</span> (!ExtensionLoader.getExtensionLoader(Protocol<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">hasExtension</span>(<span class="hljs-title">providerUrl</span>.<span class="hljs-title">getProtocol</span>())) </span>{
             logger.error(<span class="hljs-keyword">new</span> IllegalStateException(<span class="hljs-string">"Unsupported protocol..."</span>));
             <span class="hljs-keyword">continue</span>;
         }
diff --git a/zh-cn/docs/source_code_guide/directory.json b/zh-cn/docs/source_code_guide/directory.json
index 473572d..6ecda00 100644
--- a/zh-cn/docs/source_code_guide/directory.json
+++ b/zh-cn/docs/source_code_guide/directory.json
@@ -1,6 +1,6 @@
 {
   "filename": "directory.md",
-  "__html": "<h2>1. 简介</h2>\n<p>本篇文章,将开始分析 Dubbo 集群容错方面的源码。集群容错源码包含四个部分,分别是服务目录 Directory、服务路由 Router、集群 Cluster 和负载均衡 LoadBalance。这几个部分的源码逻辑相对比较独立,我们将会分四篇文章进行分析。本篇文章作为集群容错的开篇文章,将和大家一起分析服务目录相关的源码。在进行深入分析之前,我们先来了解一下服务目录是什么。服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。在一个服务集群中,服务提供者数量并不是一成不变的,如果集群中新增了一台机器,相应地在服务目录中就要新增一条服务提供者记录。或者,如果服务提供者
 的配置修改了,服务目录中的记录也要做相应的更新。如果这样说,服务目录和注册中心的功能不就雷同了吗?确实如此,这里这么说是为了方便大家理解。实际上服务目录在获取注册中心的服务配置信息后,会为每条配置信息生成一 [...]
+  "__html": "<h2>1. 简介</h2>\n<p>本篇文章,将开始分析 Dubbo 集群容错方面的源码。集群容错源码包含四个部分,分别是服务目录 Directory、服务路由 Router、集群 Cluster 和负载均衡 LoadBalance。这几个部分的源码逻辑相对比较独立,我们将会分四篇文章进行分析。本篇文章作为集群容错的开篇文章,将和大家一起分析服务目录相关的源码。在进行深入分析之前,我们先来了解一下服务目录是什么。服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。在一个服务集群中,服务提供者数量并不是一成不变的,如果集群中新增了一台机器,相应地在服务目录中就要新增一条服务提供者记录。或者,如果服务提供者
 的配置修改了,服务目录中的记录也要做相应的更新。如果这样说,服务目录和注册中心的功能不就雷同了吗?确实如此,这里这么说是为了方便大家理解。实际上服务目录在获取注册中心的服务配置信息后,会为每条配置信息生成一 [...]
   "link": "/zh-cn/docs/source_code_guide/directory.html",
   "meta": {
     "title": "服务目录",
diff --git a/zh-cn/docs/source_code_guide/dubbo-spi.html b/zh-cn/docs/source_code_guide/dubbo-spi.html
index 294ca31..14b14f8 100644
--- a/zh-cn/docs/source_code_guide/dubbo-spi.html
+++ b/zh-cn/docs/source_code_guide/dubbo-spi.html
@@ -48,7 +48,7 @@ org.apache.spi.Bumblebee
 
     <span class="hljs-meta">@Test</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sayHello</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception </span>{
-        ServiceLoader&lt;Robot&gt; serviceLoader = ServiceLoader.load(Robot.class);
+        ServiceLoader&lt;Robot&gt; serviceLoader = ServiceLoader.load(Robot<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         System.out.println(<span class="hljs-string">"Java SPI"</span>);
         serviceLoader.forEach(Robot::sayHello);
     }
@@ -68,7 +68,7 @@ bumblebee = org.apache.spi.Bumblebee
     <span class="hljs-meta">@Test</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sayHello</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception </span>{
         ExtensionLoader&lt;Robot&gt; extensionLoader = 
-            ExtensionLoader.getExtensionLoader(Robot.class);
+            ExtensionLoader.getExtensionLoader(Robot<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         Robot optimusPrime = extensionLoader.getExtension(<span class="hljs-string">"optimusPrime"</span>);
         optimusPrime.sayHello();
         Robot bumblebee = extensionLoader.getExtension(<span class="hljs-string">"bumblebee"</span>);
@@ -172,7 +172,7 @@ bumblebee = org.apache.spi.Bumblebee
 <p>这里也是先检查缓存,若缓存未命中,则通过 synchronized 加锁。加锁后再次检查缓存,并判空。此时如果 classes 仍为 null,则通过 loadExtensionClasses 加载拓展类。下面分析 loadExtensionClasses 方法的逻辑。</p>
 <pre><code class="language-java"><span class="hljs-keyword">private</span> Map&lt;String, Class&lt;?&gt;&gt; loadExtensionClasses() {
     <span class="hljs-comment">// 获取 SPI 注解,这里的 type 变量是在调用 getExtensionLoader 方法时传入的</span>
-    <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI.class);
+    <span class="hljs-keyword">final</span> SPI defaultAnnotation = type.getAnnotation(SPI<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     <span class="hljs-keyword">if</span> (defaultAnnotation != <span class="hljs-keyword">null</span>) {
         String value = defaultAnnotation.value();
         <span class="hljs-keyword">if</span> ((value = value.trim()).length() &gt; <span class="hljs-number">0</span>) {
@@ -276,7 +276,7 @@ bumblebee = org.apache.spi.Bumblebee
     }
 
     <span class="hljs-comment">// 检测目标类上是否有 Adaptive 注解</span>
-    <span class="hljs-keyword">if</span> (clazz.isAnnotationPresent(Adaptive.class)) {
+    <span class="hljs-keyword">if</span> (clazz.isAnnotationPresent(Adaptive<span class="hljs-class">.<span class="hljs-keyword">class</span>)) </span>{
         <span class="hljs-keyword">if</span> (cachedAdaptiveClass == <span class="hljs-keyword">null</span>) {
             <span class="hljs-comment">// 设置 cachedAdaptiveClass缓存</span>
             cachedAdaptiveClass = clazz;
@@ -308,7 +308,7 @@ bumblebee = org.apache.spi.Bumblebee
         <span class="hljs-comment">// 切分 name</span>
         String[] names = NAME_SEPARATOR.split(name);
         <span class="hljs-keyword">if</span> (names != <span class="hljs-keyword">null</span> &amp;&amp; names.length &gt; <span class="hljs-number">0</span>) {
-            Activate activate = clazz.getAnnotation(Activate.class);
+            Activate activate = clazz.getAnnotation(Activate<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
             <span class="hljs-keyword">if</span> (activate != <span class="hljs-keyword">null</span>) {
                 <span class="hljs-comment">// 如果类上有 Activate 注解,则使用 names 数组的第一个元素作为键,</span>
                 <span class="hljs-comment">// 存储 name 到 Activate 注解对象的映射关系</span>
diff --git a/zh-cn/docs/source_code_guide/dubbo-spi.json b/zh-cn/docs/source_code_guide/dubbo-spi.json
index 2ee131c..005fbd3 100644
--- a/zh-cn/docs/source_code_guide/dubbo-spi.json
+++ b/zh-cn/docs/source_code_guide/dubbo-spi.json
@@ -1,6 +1,6 @@
 {
   "filename": "dubbo-spi.md",
-  "__html": "<h2>1.简介</h2>\n<p>SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。</p>\n<p>需要特别说明的是,本篇文章以及本系列其他文�
 �所分析的源码版本均为 <strong>dubbo-2.6.4</strong>。因此 [...]
+  "__html": "<h2>1.简介</h2>\n<p>SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。</p>\n<p>需要特别说明的是,本篇文章以及本系列其他文�
 �所分析的源码版本均为 <strong>dubbo-2.6.4</strong>。因此 [...]
   "link": "/zh-cn/docs/source_code_guide/dubbo-spi.html",
   "meta": {
     "title": "Dubbo SPI",
diff --git a/zh-cn/docs/source_code_guide/export-service.html b/zh-cn/docs/source_code_guide/export-service.html
index db65d03..a620c34 100644
--- a/zh-cn/docs/source_code_guide/export-service.html
+++ b/zh-cn/docs/source_code_guide/export-service.html
@@ -127,7 +127,7 @@
     <span class="hljs-comment">// 检测 ref 是否为泛化服务类型</span>
     <span class="hljs-keyword">if</span> (ref <span class="hljs-keyword">instanceof</span> GenericService) {
         <span class="hljs-comment">// 设置 interfaceClass 为 GenericService.class</span>
-        interfaceClass = GenericService.class;
+        interfaceClass = GenericService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
         <span class="hljs-keyword">if</span> (StringUtils.isEmpty(generic)) {
             <span class="hljs-comment">// 设置 generic = "true"</span>
             generic = Boolean.TRUE.toString();
@@ -212,65 +212,65 @@
 }
 </code></pre>
 <p>上面代码首先是通过 loadRegistries 加载注册中心链接,然后再遍历 ProtocolConfig 集合导出每个服务。并在导出服务的过程中,将服务注册到注册中心。下面,我们先来看一下 loadRegistries 方法的逻辑。</p>
-<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">protected</span> List&lt;URL&gt; <span class="hljs-title">loadRegistries</span><span class="hljs-params">(<span class="hljs-keyword">boolean</span> provider)</span> </span>{
-    <span class="hljs-comment">// 检测是否存在注册中心配置类,不存在则抛出异常</span>
+<pre><code class="language-java">protected List&lt;URL&gt; loadRegistries(boolean provider) {
+    // 检测是否存在注册中心配置类,不存在则抛出异常
     checkRegistry();
-    List&lt;URL&gt; registryList = <span class="hljs-keyword">new</span> ArrayList&lt;URL&gt;();
-    <span class="hljs-keyword">if</span> (registries != <span class="hljs-keyword">null</span> &amp;&amp; !registries.isEmpty()) {
-        <span class="hljs-keyword">for</span> (RegistryConfig config : registries) {
+    List&lt;URL&gt; registryList = new ArrayList&lt;URL&gt;();
+    if (registries != null &amp;&amp; !registries.isEmpty()) {
+        for (RegistryConfig config : registries) {
             String address = config.getAddress();
-            <span class="hljs-keyword">if</span> (address == <span class="hljs-keyword">null</span> || address.length() == <span class="hljs-number">0</span>) {
-                <span class="hljs-comment">// 若 address 为空,则将其设为 0.0.0.0</span>
+            if (address == null || address.length() == 0) {
+                // 若 address 为空,则将其设为 0.0.0.0
                 address = Constants.ANYHOST_VALUE;
             }
 
-            <span class="hljs-comment">// 从系统属性中加载注册中心地址</span>
-            String sysaddress = System.getProperty(<span class="hljs-string">"dubbo.registry.address"</span>);
-            <span class="hljs-keyword">if</span> (sysaddress != <span class="hljs-keyword">null</span> &amp;&amp; sysaddress.length() &gt; <span class="hljs-number">0</span>) {
+            // 从系统属性中加载注册中心地址
+            String sysaddress = System.getProperty("dubbo.registry.address");
+            if (sysaddress != null &amp;&amp; sysaddress.length() &gt; 0) {
                 address = sysaddress;
             }
-            <span class="hljs-comment">// 检测 address 是否合法</span>
-            <span class="hljs-keyword">if</span> (address.length() &gt; <span class="hljs-number">0</span> &amp;&amp; !RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {
-                Map&lt;String, String&gt; map = <span class="hljs-keyword">new</span> HashMap&lt;String, String&gt;();
-                <span class="hljs-comment">// 添加 ApplicationConfig 中的字段信息到 map 中</span>
+            // 检测 address 是否合法
+            if (address.length() &gt; 0 &amp;&amp; !RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {
+                Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
+                // 添加 ApplicationConfig 中的字段信息到 map 中
                 appendParameters(map, application);
-                <span class="hljs-comment">// 添加 RegistryConfig 字段信息到 map 中</span>
+                // 添加 RegistryConfig 字段信息到 map 中
                 appendParameters(map, config);
                 
-                <span class="hljs-comment">// 添加 path、pid,protocol 等信息到 map 中</span>
-                map.put(<span class="hljs-string">"path"</span>, RegistryService.class.getName());
-                map.put(<span class="hljs-string">"dubbo"</span>, Version.getProtocolVersion());
+                // 添加 path、pid,protocol 等信息到 map 中
+                map.put("path", RegistryService.class.getName());
+                map.put("dubbo", Version.getProtocolVersion());
                 map.put(Constants.TIMESTAMP_KEY, String.valueOf(System.currentTimeMillis()));
-                <span class="hljs-keyword">if</span> (ConfigUtils.getPid() &gt; <span class="hljs-number">0</span>) {
+                if (ConfigUtils.getPid() &gt; 0) {
                     map.put(Constants.PID_KEY, String.valueOf(ConfigUtils.getPid()));
                 }
-                <span class="hljs-keyword">if</span> (!map.containsKey(<span class="hljs-string">"protocol"</span>)) {
-                    <span class="hljs-keyword">if</span> (ExtensionLoader.getExtensionLoader(RegistryFactory.class).hasExtension(<span class="hljs-string">"remote"</span>)) {
-                        map.put(<span class="hljs-string">"protocol"</span>, <span class="hljs-string">"remote"</span>);
-                    } <span class="hljs-keyword">else</span> {
-                        map.put(<span class="hljs-string">"protocol"</span>, <span class="hljs-string">"dubbo"</span>);
+                if (!map.containsKey("protocol")) {
+                    if (ExtensionLoader.getExtensionLoader(RegistryFactory.class).hasExtension("remote")) {
+                        map.put("protocol", "remote");
+                    } else {
+                        map.put("protocol", "dubbo");
                     }
                 }
 
-                <span class="hljs-comment">// 解析得到 URL 列表,address 可能包含多个注册中心 ip,</span>
-                <span class="hljs-comment">// 因此解析得到的是一个 URL 列表</span>
+                // 解析得到 URL 列表,address 可能包含多个注册中心 ip,
+                // 因此解析得到的是一个 URL 列表
                 List&lt;URL&gt; urls = UrlUtils.parseURLs(address, map);
-                <span class="hljs-keyword">for</span> (URL url : urls) {
+                for (URL url : urls) {
                     url = url.addParameter(Constants.REGISTRY_KEY, url.getProtocol());
-                    <span class="hljs-comment">// 将 URL 协议头设置为 registry</span>
+                    // 将 URL 协议头设置为 registry
                     url = url.setProtocol(Constants.REGISTRY_PROTOCOL);
-                    <span class="hljs-comment">// 通过判断条件,决定是否添加 url 到 registryList 中,条件如下:</span>
-                    <span class="hljs-comment">// (服务提供者 &amp;&amp; register = true 或 null) </span>
-                    <span class="hljs-comment">//    || (非服务提供者 &amp;&amp; subscribe = true 或 null)</span>
-                    <span class="hljs-keyword">if</span> ((provider &amp;&amp; url.getParameter(Constants.REGISTER_KEY, <span class="hljs-keyword">true</span>))
-                            || (!provider &amp;&amp; url.getParameter(Constants.SUBSCRIBE_KEY, <span class="hljs-keyword">true</span>))) {
+                    // 通过判断条件,决定是否添加 url 到 registryList 中,条件如下:
+                    // (服务提供者 &amp;&amp; register = true 或 null) 
+                    //    || (非服务提供者 &amp;&amp; subscribe = true 或 null)
+                    if ((provider &amp;&amp; url.getParameter(Constants.REGISTER_KEY, true))
+                            || (!provider &amp;&amp; url.getParameter(Constants.SUBSCRIBE_KEY, true))) {
                         registryList.add(url);
                     }
                 }
             }
         }
     }
-    <span class="hljs-keyword">return</span> registryList;
+    return registryList;
 }
 </code></pre>
 <p>loadRegistries 方法主要包含如下的逻辑:</p>
@@ -469,11 +469,11 @@
     
     <span class="hljs-comment">// 省略无关代码</span>
     
-    <span class="hljs-keyword">if</span> (ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)
-            .hasExtension(url.getProtocol())) {
+    <span class="hljs-keyword">if</span> (ExtensionLoader.getExtensionLoader(ConfiguratorFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>)
+            .<span class="hljs-title">hasExtension</span>(<span class="hljs-title">url</span>.<span class="hljs-title">getProtocol</span>())) </span>{
         <span class="hljs-comment">// 加载 ConfiguratorFactory,并生成 Configurator 实例,然后通过实例配置 url</span>
-        url = ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)
-                .getExtension(url.getProtocol()).getConfigurator(url).configure(url);
+        url = ExtensionLoader.getExtensionLoader(ConfiguratorFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>)
+                .<span class="hljs-title">getExtension</span>(<span class="hljs-title">url</span>.<span class="hljs-title">getProtocol</span>()).<span class="hljs-title">getConfigurator</span>(<span class="hljs-title">url</span>).<span class="hljs-title">configure</span>(<span class="hljs-title">url</span>)</span>;
     }
 
     String scope = url.getParameter(Constants.SCOPE_KEY);
@@ -557,8 +557,8 @@
     <span class="hljs-keyword">while</span> (ClassGenerator.isDynamicClass(c))
         c = c.getSuperclass();
 
-    <span class="hljs-keyword">if</span> (c == Object.class)
-        <span class="hljs-keyword">return</span> OBJECT_WRAPPER;
+    <span class="hljs-keyword">if</span> (c == Object<span class="hljs-class">.<span class="hljs-keyword">class</span>)
+        <span class="hljs-title">return</span> <span class="hljs-title">OBJECT_WRAPPER</span></span>;
 
     <span class="hljs-comment">// 从缓存中获取 Wrapper 实例</span>
     Wrapper ret = WRAPPER_MAP.get(c);
@@ -572,239 +572,239 @@
 }
 </code></pre>
 <p>getWrapper 方法仅包含一些缓存操作逻辑,不难理解。下面我们看一下 makeWrapper 方法。</p>
-<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Wrapper <span class="hljs-title">makeWrapper</span><span class="hljs-params">(Class&lt;?&gt; c)</span> </span>{
-    <span class="hljs-comment">// 检测 c 是否为基本类型,若是则抛出异常</span>
-    <span class="hljs-keyword">if</span> (c.isPrimitive())
-        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Can not create wrapper for primitive type: "</span> + c);
+<pre><code class="language-java">private static Wrapper makeWrapper(Class&lt;?&gt; c) {
+    // 检测 c 是否为基本类型,若是则抛出异常
+    if (c.isPrimitive())
+        throw new IllegalArgumentException("Can not create wrapper for primitive type: " + c);
 
     String name = c.getName();
     ClassLoader cl = ClassHelper.getClassLoader(c);
 
-    <span class="hljs-comment">// c1 用于存储 setPropertyValue 方法代码</span>
-    StringBuilder c1 = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-string">"public void setPropertyValue(Object o, String n, Object v){ "</span>);
-    <span class="hljs-comment">// c2 用于存储 getPropertyValue 方法代码</span>
-    StringBuilder c2 = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-string">"public Object getPropertyValue(Object o, String n){ "</span>);
-    <span class="hljs-comment">// c3 用于存储 invokeMethod 方法代码</span>
-    StringBuilder c3 = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-string">"public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws "</span> + InvocationTargetException.class.getName() + <span class="hljs-string">"{ "</span>);
-
-    <span class="hljs-comment">// 生成类型转换代码及异常捕捉代码,比如:</span>
-    <span class="hljs-comment">//   DemoService w; try { w = ((DemoServcie) $1); }}catch(Throwable e){ throw new IllegalArgumentException(e); }</span>
-    c1.append(name).append(<span class="hljs-string">" w; try{ w = (("</span>).append(name).append(<span class="hljs-string">")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }"</span>);
-    c2.append(name).append(<span class="hljs-string">" w; try{ w = (("</span>).append(name).append(<span class="hljs-string">")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }"</span>);
-    c3.append(name).append(<span class="hljs-string">" w; try{ w = (("</span>).append(name).append(<span class="hljs-string">")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }"</span>);
-
-    <span class="hljs-comment">// pts 用于存储成员变量名和类型</span>
-    Map&lt;String, Class&lt;?&gt;&gt; pts = <span class="hljs-keyword">new</span> HashMap&lt;String, Class&lt;?&gt;&gt;();
-    <span class="hljs-comment">// ms 用于存储方法描述信息(可理解为方法签名)及 Method 实例</span>
-    Map&lt;String, Method&gt; ms = <span class="hljs-keyword">new</span> LinkedHashMap&lt;String, Method&gt;();
-    <span class="hljs-comment">// mns 为方法名列表</span>
-    List&lt;String&gt; mns = <span class="hljs-keyword">new</span> ArrayList&lt;String&gt;();
-    <span class="hljs-comment">// dmns 用于存储“定义在当前类中的方法”的名称</span>
-    List&lt;String&gt; dmns = <span class="hljs-keyword">new</span> ArrayList&lt;String&gt;();
-
-    <span class="hljs-comment">// --------------------------------✨ 分割线1 ✨-------------------------------------</span>
-
-    <span class="hljs-comment">// 获取 public 访问级别的字段,并为所有字段生成条件判断语句</span>
-    <span class="hljs-keyword">for</span> (Field f : c.getFields()) {
+    // c1 用于存储 setPropertyValue 方法代码
+    StringBuilder c1 = new StringBuilder("public void setPropertyValue(Object o, String n, Object v){ ");
+    // c2 用于存储 getPropertyValue 方法代码
+    StringBuilder c2 = new StringBuilder("public Object getPropertyValue(Object o, String n){ ");
+    // c3 用于存储 invokeMethod 方法代码
+    StringBuilder c3 = new StringBuilder("public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws " + InvocationTargetException.class.getName() + "{ ");
+
+    // 生成类型转换代码及异常捕捉代码,比如:
+    //   DemoService w; try { w = ((DemoServcie) $1); }}catch(Throwable e){ throw new IllegalArgumentException(e); }
+    c1.append(name).append(" w; try{ w = ((").append(name).append(")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }");
+    c2.append(name).append(" w; try{ w = ((").append(name).append(")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }");
+    c3.append(name).append(" w; try{ w = ((").append(name).append(")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }");
+
+    // pts 用于存储成员变量名和类型
+    Map&lt;String, Class&lt;?&gt;&gt; pts = new HashMap&lt;String, Class&lt;?&gt;&gt;();
+    // ms 用于存储方法描述信息(可理解为方法签名)及 Method 实例
+    Map&lt;String, Method&gt; ms = new LinkedHashMap&lt;String, Method&gt;();
+    // mns 为方法名列表
+    List&lt;String&gt; mns = new ArrayList&lt;String&gt;();
+    // dmns 用于存储“定义在当前类中的方法”的名称
+    List&lt;String&gt; dmns = new ArrayList&lt;String&gt;();
+
+    // --------------------------------✨ 分割线1 ✨-------------------------------------
+
+    // 获取 public 访问级别的字段,并为所有字段生成条件判断语句
+    for (Field f : c.getFields()) {
         String fn = f.getName();
         Class&lt;?&gt; ft = f.getType();
-        <span class="hljs-keyword">if</span> (Modifier.isStatic(f.getModifiers()) || Modifier.isTransient(f.getModifiers()))
-            <span class="hljs-comment">// 忽略关键字 static 或 transient 修饰的变量</span>
-            <span class="hljs-keyword">continue</span>;
+        if (Modifier.isStatic(f.getModifiers()) || Modifier.isTransient(f.getModifiers()))
+            // 忽略关键字 static 或 transient 修饰的变量
+            continue;
 
-        <span class="hljs-comment">// 生成条件判断及赋值语句,比如:</span>
-        <span class="hljs-comment">// if( $2.equals("name") ) { w.name = (java.lang.String) $3; return;}</span>
-        <span class="hljs-comment">// if( $2.equals("age") ) { w.age = ((Number) $3).intValue(); return;}</span>
-        c1.append(<span class="hljs-string">" if( $2.equals(\""</span>).append(fn).append(<span class="hljs-string">"\") ){ w."</span>).append(fn).append(<span class="hljs-string">"="</span>).append(arg(ft, <span class="hljs-string">"$3"</span>)).append(<span class="hljs-string">"; return; }"</span>);
+        // 生成条件判断及赋值语句,比如:
+        // if( $2.equals("name") ) { w.name = (java.lang.String) $3; return;}
+        // if( $2.equals("age") ) { w.age = ((Number) $3).intValue(); return;}
+        c1.append(" if( $2.equals(\"").append(fn).append("\") ){ w.").append(fn).append("=").append(arg(ft, "$3")).append("; return; }");
 
-        <span class="hljs-comment">// 生成条件判断及返回语句,比如:</span>
-        <span class="hljs-comment">// if( $2.equals("name") ) { return ($w)w.name; }</span>
-        c2.append(<span class="hljs-string">" if( $2.equals(\""</span>).append(fn).append(<span class="hljs-string">"\") ){ return ($w)w."</span>).append(fn).append(<span class="hljs-string">"; }"</span>);
+        // 生成条件判断及返回语句,比如:
+        // if( $2.equals("name") ) { return ($w)w.name; }
+        c2.append(" if( $2.equals(\"").append(fn).append("\") ){ return ($w)w.").append(fn).append("; }");
 
-        <span class="hljs-comment">// 存储 &lt;字段名, 字段类型&gt; 键值对到 pts 中</span>
+        // 存储 &lt;字段名, 字段类型&gt; 键值对到 pts 中
         pts.put(fn, ft);
     }
 
-    <span class="hljs-comment">// --------------------------------✨ 分割线2 ✨-------------------------------------</span>
+    // --------------------------------✨ 分割线2 ✨-------------------------------------
 
     Method[] methods = c.getMethods();
-    <span class="hljs-comment">// 检测 c 中是否包含在当前类中声明的方法</span>
-    <span class="hljs-keyword">boolean</span> hasMethod = hasMethods(methods);
-    <span class="hljs-keyword">if</span> (hasMethod) {
-        c3.append(<span class="hljs-string">" try{"</span>);
+    // 检测 c 中是否包含在当前类中声明的方法
+    boolean hasMethod = hasMethods(methods);
+    if (hasMethod) {
+        c3.append(" try{");
     }
-    <span class="hljs-keyword">for</span> (Method m : methods) {
-        <span class="hljs-keyword">if</span> (m.getDeclaringClass() == Object.class)
-            <span class="hljs-comment">// 忽略 Object 中定义的方法</span>
-            <span class="hljs-keyword">continue</span>;
+    for (Method m : methods) {
+        if (m.getDeclaringClass() == Object.class)
+            // 忽略 Object 中定义的方法
+            continue;
 
         String mn = m.getName();
-        <span class="hljs-comment">// 生成方法名判断语句,比如:</span>
-        <span class="hljs-comment">// if ( "sayHello".equals( $2 )</span>
-        c3.append(<span class="hljs-string">" if( \""</span>).append(mn).append(<span class="hljs-string">"\".equals( $2 ) "</span>);
-        <span class="hljs-keyword">int</span> len = m.getParameterTypes().length;
-        <span class="hljs-comment">// 生成“运行时传入的参数数量与方法参数列表长度”判断语句,比如:</span>
-        <span class="hljs-comment">// &amp;&amp; $3.length == 2</span>
-        c3.append(<span class="hljs-string">" &amp;&amp; "</span>).append(<span class="hljs-string">" $3.length == "</span>).append(len);
-
-        <span class="hljs-keyword">boolean</span> override = <span class="hljs-keyword">false</span>;
-        <span class="hljs-keyword">for</span> (Method m2 : methods) {
-            <span class="hljs-comment">// 检测方法是否存在重载情况,条件为:方法对象不同 &amp;&amp; 方法名相同</span>
-            <span class="hljs-keyword">if</span> (m != m2 &amp;&amp; m.getName().equals(m2.getName())) {
-                override = <span class="hljs-keyword">true</span>;
-                <span class="hljs-keyword">break</span>;
+        // 生成方法名判断语句,比如:
+        // if ( "sayHello".equals( $2 )
+        c3.append(" if( \"").append(mn).append("\".equals( $2 ) ");
+        int len = m.getParameterTypes().length;
+        // 生成“运行时传入的参数数量与方法参数列表长度”判断语句,比如:
+        // &amp;&amp; $3.length == 2
+        c3.append(" &amp;&amp; ").append(" $3.length == ").append(len);
+
+        boolean override = false;
+        for (Method m2 : methods) {
+            // 检测方法是否存在重载情况,条件为:方法对象不同 &amp;&amp; 方法名相同
+            if (m != m2 &amp;&amp; m.getName().equals(m2.getName())) {
+                override = true;
+                break;
             }
         }
-        <span class="hljs-comment">// 对重载方法进行处理,考虑下面的方法:</span>
-        <span class="hljs-comment">//    1. void sayHello(Integer, String)</span>
-        <span class="hljs-comment">//    2. void sayHello(Integer, Integer)</span>
-        <span class="hljs-comment">// 方法名相同,参数列表长度也相同,因此不能仅通过这两项判断两个方法是否相等。</span>
-        <span class="hljs-comment">// 需要进一步判断方法的参数类型</span>
-        <span class="hljs-keyword">if</span> (override) {
-            <span class="hljs-keyword">if</span> (len &gt; <span class="hljs-number">0</span>) {
-                <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> l = <span class="hljs-number">0</span>; l &lt; len; l++) {
-                    <span class="hljs-comment">// 生成参数类型进行检测代码,比如:</span>
-                    <span class="hljs-comment">// &amp;&amp; $3[0].getName().equals("java.lang.Integer") </span>
-                    <span class="hljs-comment">//    &amp;&amp; $3[1].getName().equals("java.lang.String")</span>
-                    c3.append(<span class="hljs-string">" &amp;&amp; "</span>).append(<span class="hljs-string">" $3["</span>).append(l).append(<span class="hljs-string">"].getName().equals(\""</span>)
-                            .append(m.getParameterTypes()[l].getName()).append(<span class="hljs-string">"\")"</span>);
+        // 对重载方法进行处理,考虑下面的方法:
+        //    1. void sayHello(Integer, String)
+        //    2. void sayHello(Integer, Integer)
+        // 方法名相同,参数列表长度也相同,因此不能仅通过这两项判断两个方法是否相等。
+        // 需要进一步判断方法的参数类型
+        if (override) {
+            if (len &gt; 0) {
+                for (int l = 0; l &lt; len; l++) {
+                    // 生成参数类型进行检测代码,比如:
+                    // &amp;&amp; $3[0].getName().equals("java.lang.Integer") 
+                    //    &amp;&amp; $3[1].getName().equals("java.lang.String")
+                    c3.append(" &amp;&amp; ").append(" $3[").append(l).append("].getName().equals(\"")
+                            .append(m.getParameterTypes()[l].getName()).append("\")");
                 }
             }
         }
 
-        <span class="hljs-comment">// 添加 ) {,完成方法判断语句,此时生成的代码可能如下(已格式化):</span>
-        <span class="hljs-comment">// if ("sayHello".equals($2) </span>
-        <span class="hljs-comment">//     &amp;&amp; $3.length == 2</span>
-        <span class="hljs-comment">//     &amp;&amp; $3[0].getName().equals("java.lang.Integer") </span>
-        <span class="hljs-comment">//     &amp;&amp; $3[1].getName().equals("java.lang.String")) {</span>
-        c3.append(<span class="hljs-string">" ) { "</span>);
-
-        <span class="hljs-comment">// 根据返回值类型生成目标方法调用语句</span>
-        <span class="hljs-keyword">if</span> (m.getReturnType() == Void.TYPE)
-            <span class="hljs-comment">// w.sayHello((java.lang.Integer)$4[0], (java.lang.String)$4[1]); return null;</span>
-            c3.append(<span class="hljs-string">" w."</span>).append(mn).append(<span class="hljs-string">'('</span>).append(args(m.getParameterTypes(), <span class="hljs-string">"$4"</span>)).append(<span class="hljs-string">");"</span>).append(<span class="hljs-string">" return null;"</span>);
-        <span class="hljs-keyword">else</span>
-            <span class="hljs-comment">// return w.sayHello((java.lang.Integer)$4[0], (java.lang.String)$4[1]);</span>
-            c3.append(<span class="hljs-string">" return ($w)w."</span>).append(mn).append(<span class="hljs-string">'('</span>).append(args(m.getParameterTypes(), <span class="hljs-string">"$4"</span>)).append(<span class="hljs-string">");"</span>);
-
-        <span class="hljs-comment">// 添加 }, 生成的代码形如(已格式化):</span>
-        <span class="hljs-comment">// if ("sayHello".equals($2) </span>
-        <span class="hljs-comment">//     &amp;&amp; $3.length == 2</span>
-        <span class="hljs-comment">//     &amp;&amp; $3[0].getName().equals("java.lang.Integer") </span>
-        <span class="hljs-comment">//     &amp;&amp; $3[1].getName().equals("java.lang.String")) {</span>
-        <span class="hljs-comment">//</span>
-        <span class="hljs-comment">//     w.sayHello((java.lang.Integer)$4[0], (java.lang.String)$4[1]); </span>
-        <span class="hljs-comment">//     return null;</span>
-        <span class="hljs-comment">// }</span>
-        c3.append(<span class="hljs-string">" }"</span>);
-
-        <span class="hljs-comment">// 添加方法名到 mns 集合中</span>
+        // 添加 ) {,完成方法判断语句,此时生成的代码可能如下(已格式化):
+        // if ("sayHello".equals($2) 
+        //     &amp;&amp; $3.length == 2
+        //     &amp;&amp; $3[0].getName().equals("java.lang.Integer") 
+        //     &amp;&amp; $3[1].getName().equals("java.lang.String")) {
+        c3.append(" ) { ");
+
+        // 根据返回值类型生成目标方法调用语句
+        if (m.getReturnType() == Void.TYPE)
+            // w.sayHello((java.lang.Integer)$4[0], (java.lang.String)$4[1]); return null;
+            c3.append(" w.").append(mn).append('(').append(args(m.getParameterTypes(), "$4")).append(");").append(" return null;");
+        else
+            // return w.sayHello((java.lang.Integer)$4[0], (java.lang.String)$4[1]);
+            c3.append(" return ($w)w.").append(mn).append('(').append(args(m.getParameterTypes(), "$4")).append(");");
+
+        // 添加 }, 生成的代码形如(已格式化):
+        // if ("sayHello".equals($2) 
+        //     &amp;&amp; $3.length == 2
+        //     &amp;&amp; $3[0].getName().equals("java.lang.Integer") 
+        //     &amp;&amp; $3[1].getName().equals("java.lang.String")) {
+        //
+        //     w.sayHello((java.lang.Integer)$4[0], (java.lang.String)$4[1]); 
+        //     return null;
+        // }
+        c3.append(" }");
+
+        // 添加方法名到 mns 集合中
         mns.add(mn);
-        <span class="hljs-comment">// 检测当前方法是否在 c 中被声明的</span>
-        <span class="hljs-keyword">if</span> (m.getDeclaringClass() == c)
-            <span class="hljs-comment">// 若是,则将当前方法名添加到 dmns 中</span>
+        // 检测当前方法是否在 c 中被声明的
+        if (m.getDeclaringClass() == c)
+            // 若是,则将当前方法名添加到 dmns 中
             dmns.add(mn);
         ms.put(ReflectUtils.getDesc(m), m);
     }
-    <span class="hljs-keyword">if</span> (hasMethod) {
-        <span class="hljs-comment">// 添加异常捕捉语句</span>
-        c3.append(<span class="hljs-string">" } catch(Throwable e) { "</span>);
-        c3.append(<span class="hljs-string">"     throw new java.lang.reflect.InvocationTargetException(e); "</span>);
-        c3.append(<span class="hljs-string">" }"</span>);
+    if (hasMethod) {
+        // 添加异常捕捉语句
+        c3.append(" } catch(Throwable e) { ");
+        c3.append("     throw new java.lang.reflect.InvocationTargetException(e); ");
+        c3.append(" }");
     }
 
-    <span class="hljs-comment">// 添加 NoSuchMethodException 异常抛出代码</span>
-    c3.append(<span class="hljs-string">" throw new "</span> + NoSuchMethodException.class.getName() + <span class="hljs-string">"(\"Not found method \\\"\"+$2+\"\\\" in class "</span> + c.getName() + <span class="hljs-string">".\"); }"</span>);
+    // 添加 NoSuchMethodException 异常抛出代码
+    c3.append(" throw new " + NoSuchMethodException.class.getName() + "(\"Not found method \\\"\"+$2+\"\\\" in class " + c.getName() + ".\"); }");
 
-    <span class="hljs-comment">// --------------------------------✨ 分割线3 ✨-------------------------------------</span>
+    // --------------------------------✨ 分割线3 ✨-------------------------------------
 
     Matcher matcher;
-    <span class="hljs-comment">// 处理 get/set 方法</span>
-    <span class="hljs-keyword">for</span> (Map.Entry&lt;String, Method&gt; entry : ms.entrySet()) {
+    // 处理 get/set 方法
+    for (Map.Entry&lt;String, Method&gt; entry : ms.entrySet()) {
         String md = entry.getKey();
         Method method = (Method) entry.getValue();
-        <span class="hljs-comment">// 匹配以 get 开头的方法</span>
-        <span class="hljs-keyword">if</span> ((matcher = ReflectUtils.GETTER_METHOD_DESC_PATTERN.matcher(md)).matches()) {
-            <span class="hljs-comment">// 获取属性名</span>
-            String pn = propertyName(matcher.group(<span class="hljs-number">1</span>));
-            <span class="hljs-comment">// 生成属性判断以及返回语句,示例如下:</span>
-            <span class="hljs-comment">// if( $2.equals("name") ) { return ($w).w.getName(); }</span>
-            c2.append(<span class="hljs-string">" if( $2.equals(\""</span>).append(pn).append(<span class="hljs-string">"\") ){ return ($w)w."</span>).append(method.getName()).append(<span class="hljs-string">"(); }"</span>);
+        // 匹配以 get 开头的方法
+        if ((matcher = ReflectUtils.GETTER_METHOD_DESC_PATTERN.matcher(md)).matches()) {
+            // 获取属性名
+            String pn = propertyName(matcher.group(1));
+            // 生成属性判断以及返回语句,示例如下:
+            // if( $2.equals("name") ) { return ($w).w.getName(); }
+            c2.append(" if( $2.equals(\"").append(pn).append("\") ){ return ($w)w.").append(method.getName()).append("(); }");
             pts.put(pn, method.getReturnType());
 
-        <span class="hljs-comment">// 匹配以 is/has/can 开头的方法</span>
-        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((matcher = ReflectUtils.IS_HAS_CAN_METHOD_DESC_PATTERN.matcher(md)).matches()) {
-            String pn = propertyName(matcher.group(<span class="hljs-number">1</span>));
-            <span class="hljs-comment">// 生成属性判断以及返回语句,示例如下:</span>
-            <span class="hljs-comment">// if( $2.equals("dream") ) { return ($w).w.hasDream(); }</span>
-            c2.append(<span class="hljs-string">" if( $2.equals(\""</span>).append(pn).append(<span class="hljs-string">"\") ){ return ($w)w."</span>).append(method.getName()).append(<span class="hljs-string">"(); }"</span>);
+        // 匹配以 is/has/can 开头的方法
+        } else if ((matcher = ReflectUtils.IS_HAS_CAN_METHOD_DESC_PATTERN.matcher(md)).matches()) {
+            String pn = propertyName(matcher.group(1));
+            // 生成属性判断以及返回语句,示例如下:
+            // if( $2.equals("dream") ) { return ($w).w.hasDream(); }
+            c2.append(" if( $2.equals(\"").append(pn).append("\") ){ return ($w)w.").append(method.getName()).append("(); }");
             pts.put(pn, method.getReturnType());
 
-        <span class="hljs-comment">// 匹配以 set 开头的方法</span>
-        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((matcher = ReflectUtils.SETTER_METHOD_DESC_PATTERN.matcher(md)).matches()) {
-            Class&lt;?&gt; pt = method.getParameterTypes()[<span class="hljs-number">0</span>];
-            String pn = propertyName(matcher.group(<span class="hljs-number">1</span>));
-            <span class="hljs-comment">// 生成属性判断以及 setter 调用语句,示例如下:</span>
-            <span class="hljs-comment">// if( $2.equals("name") ) { w.setName((java.lang.String)$3); return; }</span>
-            c1.append(<span class="hljs-string">" if( $2.equals(\""</span>).append(pn).append(<span class="hljs-string">"\") ){ w."</span>).append(method.getName()).append(<span class="hljs-string">"("</span>).append(arg(pt, <span class="hljs-string">"$3"</span>)).append(<span class="hljs-string">"); return; }"</span>);
+        // 匹配以 set 开头的方法
+        } else if ((matcher = ReflectUtils.SETTER_METHOD_DESC_PATTERN.matcher(md)).matches()) {
+            Class&lt;?&gt; pt = method.getParameterTypes()[0];
+            String pn = propertyName(matcher.group(1));
+            // 生成属性判断以及 setter 调用语句,示例如下:
+            // if( $2.equals("name") ) { w.setName((java.lang.String)$3); return; }
+            c1.append(" if( $2.equals(\"").append(pn).append("\") ){ w.").append(method.getName()).append("(").append(arg(pt, "$3")).append("); return; }");
             pts.put(pn, pt);
         }
     }
 
-    <span class="hljs-comment">// 添加 NoSuchPropertyException 异常抛出代码</span>
-    c1.append(<span class="hljs-string">" throw new "</span> + NoSuchPropertyException.class.getName() + <span class="hljs-string">"(\"Not found property \\\"\"+$2+\"\\\" filed or setter method in class "</span> + c.getName() + <span class="hljs-string">".\"); }"</span>);
-    c2.append(<span class="hljs-string">" throw new "</span> + NoSuchPropertyException.class.getName() + <span class="hljs-string">"(\"Not found property \\\"\"+$2+\"\\\" filed or setter method in class "</span> + c.getName() + <span class="hljs-string">".\"); }"</span>);
+    // 添加 NoSuchPropertyException 异常抛出代码
+    c1.append(" throw new " + NoSuchPropertyException.class.getName() + "(\"Not found property \\\"\"+$2+\"\\\" filed or setter method in class " + c.getName() + ".\"); }");
+    c2.append(" throw new " + NoSuchPropertyException.class.getName() + "(\"Not found property \\\"\"+$2+\"\\\" filed or setter method in class " + c.getName() + ".\"); }");
 
-    <span class="hljs-comment">// --------------------------------✨ 分割线4 ✨-------------------------------------</span>
+    // --------------------------------✨ 分割线4 ✨-------------------------------------
 
-    <span class="hljs-keyword">long</span> id = WRAPPER_CLASS_COUNTER.getAndIncrement();
-    <span class="hljs-comment">// 创建类生成器</span>
+    long id = WRAPPER_CLASS_COUNTER.getAndIncrement();
+    // 创建类生成器
     ClassGenerator cc = ClassGenerator.newInstance(cl);
-    <span class="hljs-comment">// 设置类名及超类</span>
-    cc.setClassName((Modifier.isPublic(c.getModifiers()) ? Wrapper.class.getName() : c.getName() + <span class="hljs-string">"$sw"</span>) + id);
+    // 设置类名及超类
+    cc.setClassName((Modifier.isPublic(c.getModifiers()) ? Wrapper.class.getName() : c.getName() + "$sw") + id);
     cc.setSuperClass(Wrapper.class);
 
-    <span class="hljs-comment">// 添加默认构造方法</span>
+    // 添加默认构造方法
     cc.addDefaultConstructor();
 
-    <span class="hljs-comment">// 添加字段</span>
-    cc.addField(<span class="hljs-string">"public static String[] pns;"</span>);
-    cc.addField(<span class="hljs-string">"public static "</span> + Map.class.getName() + <span class="hljs-string">" pts;"</span>);
-    cc.addField(<span class="hljs-string">"public static String[] mns;"</span>);
-    cc.addField(<span class="hljs-string">"public static String[] dmns;"</span>);
-    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>, len = ms.size(); i &lt; len; i++)
-        cc.addField(<span class="hljs-string">"public static Class[] mts"</span> + i + <span class="hljs-string">";"</span>);
-
-    <span class="hljs-comment">// 添加方法代码</span>
-    cc.addMethod(<span class="hljs-string">"public String[] getPropertyNames(){ return pns; }"</span>);
-    cc.addMethod(<span class="hljs-string">"public boolean hasProperty(String n){ return pts.containsKey($1); }"</span>);
-    cc.addMethod(<span class="hljs-string">"public Class getPropertyType(String n){ return (Class)pts.get($1); }"</span>);
-    cc.addMethod(<span class="hljs-string">"public String[] getMethodNames(){ return mns; }"</span>);
-    cc.addMethod(<span class="hljs-string">"public String[] getDeclaredMethodNames(){ return dmns; }"</span>);
+    // 添加字段
+    cc.addField("public static String[] pns;");
+    cc.addField("public static " + Map.class.getName() + " pts;");
+    cc.addField("public static String[] mns;");
+    cc.addField("public static String[] dmns;");
+    for (int i = 0, len = ms.size(); i &lt; len; i++)
+        cc.addField("public static Class[] mts" + i + ";");
+
+    // 添加方法代码
+    cc.addMethod("public String[] getPropertyNames(){ return pns; }");
+    cc.addMethod("public boolean hasProperty(String n){ return pts.containsKey($1); }");
+    cc.addMethod("public Class getPropertyType(String n){ return (Class)pts.get($1); }");
+    cc.addMethod("public String[] getMethodNames(){ return mns; }");
+    cc.addMethod("public String[] getDeclaredMethodNames(){ return dmns; }");
     cc.addMethod(c1.toString());
     cc.addMethod(c2.toString());
     cc.addMethod(c3.toString());
 
-    <span class="hljs-keyword">try</span> {
-        <span class="hljs-comment">// 生成类</span>
+    try {
+        // 生成类
         Class&lt;?&gt; wc = cc.toClass();
         
-        <span class="hljs-comment">// 设置字段值</span>
-        wc.getField(<span class="hljs-string">"pts"</span>).set(<span class="hljs-keyword">null</span>, pts);
-        wc.getField(<span class="hljs-string">"pns"</span>).set(<span class="hljs-keyword">null</span>, pts.keySet().toArray(<span class="hljs-keyword">new</span> String[<span class="hljs-number">0</span>]));
-        wc.getField(<span class="hljs-string">"mns"</span>).set(<span class="hljs-keyword">null</span>, mns.toArray(<span class="hljs-keyword">new</span> String[<span class="hljs-number">0</span>]));
-        wc.getField(<span class="hljs-string">"dmns"</span>).set(<span class="hljs-keyword">null</span>, dmns.toArray(<span class="hljs-keyword">new</span> String[<span class="hljs-number">0</span>]));
-        <span class="hljs-keyword">int</span> ix = <span class="hljs-number">0</span>;
-        <span class="hljs-keyword">for</span> (Method m : ms.values())
-            wc.getField(<span class="hljs-string">"mts"</span> + ix++).set(<span class="hljs-keyword">null</span>, m.getParameterTypes());
-
-        <span class="hljs-comment">// 创建 Wrapper 实例</span>
-        <span class="hljs-keyword">return</span> (Wrapper) wc.newInstance();
-    } <span class="hljs-keyword">catch</span> (RuntimeException e) {
-        <span class="hljs-keyword">throw</span> e;
-    } <span class="hljs-keyword">catch</span> (Throwable e) {
-        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e.getMessage(), e);
-    } <span class="hljs-keyword">finally</span> {
+        // 设置字段值
+        wc.getField("pts").set(null, pts);
+        wc.getField("pns").set(null, pts.keySet().toArray(new String[0]));
+        wc.getField("mns").set(null, mns.toArray(new String[0]));
+        wc.getField("dmns").set(null, dmns.toArray(new String[0]));
+        int ix = 0;
+        for (Method m : ms.values())
+            wc.getField("mts" + ix++).set(null, m.getParameterTypes());
+
+        // 创建 Wrapper 实例
+        return (Wrapper) wc.newInstance();
+    } catch (RuntimeException e) {
+        throw e;
+    } catch (Throwable e) {
+        throw new RuntimeException(e.getMessage(), e);
+    } finally {
         cc.release();
         ms.clear();
         mns.clear();
@@ -960,39 +960,39 @@
 }
 </code></pre>
 <p>如上,在同一台机器上(单网卡),同一个端口上仅允许启动一个服务器实例。若某个端口上已有服务器实例,此时则调用 reset 方法重置服务器的一些配置。考虑到篇幅问题,关于服务器实例重置的代码就不分析了。接下来分析服务器实例的创建过程。如下:</p>
-<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">private</span> ExchangeServer <span class="hljs-title">createServer</span><span class="hljs-params">(URL url)</span> </span>{
+<pre><code class="language-java">private ExchangeServer createServer(URL url) {
     url = url.addParameterIfAbsent(Constants.CHANNEL_READONLYEVENT_SENT_KEY,
-    <span class="hljs-comment">// 添加心跳检测配置到 url 中</span>
+    // 添加心跳检测配置到 url 中
     url = url.addParameterIfAbsent(Constants.HEARTBEAT_KEY, String.valueOf(Constants.DEFAULT_HEARTBEAT));
-	<span class="hljs-comment">// 获取 server 参数,默认为 netty</span>
+	// 获取 server 参数,默认为 netty
     String str = url.getParameter(Constants.SERVER_KEY, Constants.DEFAULT_REMOTING_SERVER);
 
-	<span class="hljs-comment">// 通过 SPI 检测是否存在 server 参数所代表的 Transporter 拓展,不存在则抛出异常</span>
-    <span class="hljs-keyword">if</span> (str != <span class="hljs-keyword">null</span> &amp;&amp; str.length() &gt; <span class="hljs-number">0</span> &amp;&amp; !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str))
-        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RpcException(<span class="hljs-string">"Unsupported server type: "</span> + str + <span class="hljs-string">", url: "</span> + url);
+	// 通过 SPI 检测是否存在 server 参数所代表的 Transporter 拓展,不存在则抛出异常
+    if (str != null &amp;&amp; str.length() &gt; 0 &amp;&amp; !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str))
+        throw new RpcException("Unsupported server type: " + str + ", url: " + url);
 
-    <span class="hljs-comment">// 添加编码解码器参数</span>
+    // 添加编码解码器参数
     url = url.addParameter(Constants.CODEC_KEY, DubboCodec.NAME);
     ExchangeServer server;
-    <span class="hljs-keyword">try</span> {
-        <span class="hljs-comment">// 创建 ExchangeServer</span>
+    try {
+        // 创建 ExchangeServer
         server = Exchangers.bind(url, requestHandler);
-    } <span class="hljs-keyword">catch</span> (RemotingException e) {
-        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RpcException(<span class="hljs-string">"Fail to start server..."</span>);
+    } catch (RemotingException e) {
+        throw new RpcException("Fail to start server...");
     }
                                    
-	<span class="hljs-comment">// 获取 client 参数,可指定 netty,mina</span>
+	// 获取 client 参数,可指定 netty,mina
     str = url.getParameter(Constants.CLIENT_KEY);
-    <span class="hljs-keyword">if</span> (str != <span class="hljs-keyword">null</span> &amp;&amp; str.length() &gt; <span class="hljs-number">0</span>) {
-        <span class="hljs-comment">// 获取所有的 Transporter 实现类名称集合,比如 supportedTypes = [netty, mina]</span>
+    if (str != null &amp;&amp; str.length() &gt; 0) {
+        // 获取所有的 Transporter 实现类名称集合,比如 supportedTypes = [netty, mina]
         Set&lt;String&gt; supportedTypes = ExtensionLoader.getExtensionLoader(Transporter.class).getSupportedExtensions();
-        <span class="hljs-comment">// 检测当前 Dubbo 所支持的 Transporter 实现类名称列表中,</span>
-        <span class="hljs-comment">// 是否包含 client 所表示的 Transporter,若不包含,则抛出异常</span>
-        <span class="hljs-keyword">if</span> (!supportedTypes.contains(str)) {
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RpcException(<span class="hljs-string">"Unsupported client type..."</span>);
+        // 检测当前 Dubbo 所支持的 Transporter 实现类名称列表中,
+        // 是否包含 client 所表示的 Transporter,若不包含,则抛出异常
+        if (!supportedTypes.contains(str)) {
+            throw new RpcException("Unsupported client type...");
         }
     }
-    <span class="hljs-keyword">return</span> server;
+    return server;
 }
 </code></pre>
 <p>如上,createServer 包含三个核心的逻辑。第一是检测是否存在 server 参数所代表的 Transporter 拓展,不存在则抛出异常。第二是创建服务器实例。第三是检测是否支持 client 参数所表示的 Transporter 拓展,不存在也是抛出异常。两次检测操作所对应的代码比较直白了,无需多说。但创建服务器的操作目前还不是很清晰,我们继续往下看。</p>
@@ -1076,7 +1076,7 @@
             <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RemotingException(<span class="hljs-string">"Failed to bind "</span>);
         }
 
-        DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension();
+        DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getDefaultExtension</span>()</span>;
         executor = (ExecutorService) dataStore.get(Constants.EXECUTOR_SERVICE_COMPONENT_KEY, Integer.toString(url.getPort()));
     }
     
@@ -1155,9 +1155,9 @@
 <h4>2.2.4.1 创建注册中心</h4>
 <p>本节内容以 Zookeeper 注册中心为例进行分析。下面先来看一下 getRegistry 方法的源码,这个方法由 AbstractRegistryFactory 实现。如下:</p>
 <pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> Registry <span class="hljs-title">getRegistry</span><span class="hljs-params">(URL url)</span> </span>{
-    url = url.setPath(RegistryService.class.getName())
-            .addParameter(Constants.INTERFACE_KEY, RegistryService.class.getName())
-            .removeParameters(Constants.EXPORT_KEY, Constants.REFER_KEY);
+    url = url.setPath(RegistryService<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">getName</span>())
+            .<span class="hljs-title">addParameter</span>(<span class="hljs-title">Constants</span>.<span class="hljs-title">INTERFACE_KEY</span>, <span class="hljs-title">RegistryService</span>.<span class="hljs-title">class</span>.<span class="hljs-title">getName</span>())
+            .<span class="hljs-title">removeParameters</span>(<span class="hljs-title">Constants</span>.<span class="hljs-title">EXPORT_KEY</span>, <span class="hljs-title">Constants</span>.<span class="hljs-title">REFER_KEY</span>)</span>;
     String key = url.toServiceString();
     LOCK.lock();
     <span class="hljs-keyword">try</span> {
diff --git a/zh-cn/docs/source_code_guide/export-service.json b/zh-cn/docs/source_code_guide/export-service.json
index e10d3ff..bebaa33 100644
--- a/zh-cn/docs/source_code_guide/export-service.json
+++ b/zh-cn/docs/source_code_guide/export-service.json
@@ -1,6 +1,6 @@
 {
   "filename": "export-service.md",
-  "__html": "<h2>1.简介</h2>\n<p>本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。</p>\n<h2>2.源码分析</h2>\n<p>服务导出的入口方法是 ServiceBean 的 onApplicationEvent。onApplicationEvent 是一个事件响应方法,该方法会在收到 Spring 上下文刷新事件后执行服务导出操作。方法代码如下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <s [...]
+  "__html": "<h2>1.简介</h2>\n<p>本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。</p>\n<h2>2.源码分析</h2>\n<p>服务导出的入口方法是 ServiceBean 的 onApplicationEvent。onApplicationEvent 是一个事件响应方法,该方法会在收到 Spring 上下文刷新事件后执行服务导出操作。方法代码如下:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public</span> <s [...]
   "link": "/zh-cn/docs/source_code_guide/export-service.html",
   "meta": {
     "title": "服务导出",
diff --git a/zh-cn/docs/source_code_guide/loadbalance.html b/zh-cn/docs/source_code_guide/loadbalance.html
index 4082b62..412e48b 100644
--- a/zh-cn/docs/source_code_guide/loadbalance.html
+++ b/zh-cn/docs/source_code_guide/loadbalance.html
@@ -229,7 +229,7 @@
 <p>问题出在了<code>offsetWeight &lt;= 0</code>上,举例说明,假设有一组 Invoker  的权重为 5、2、1,offsetWeight 最大值为 7。假设 offsetWeight = 7,你会发现,当 for 循环进行第二次遍历后 offsetWeight = 7 - 5 - 2 = 0,提前返回了。此时,此时权重为1的 Invoker 就没有机会被选中了。该问题在 Dubbo 2.6.5 中被修复了,修改后的代码如下:</p>
 <pre><code class="language-java"><span class="hljs-keyword">int</span> offsetWeight = random.nextInt(totalWeight) + <span class="hljs-number">1</span>;
 </code></pre>
-<p>以上就是 Dubob 2.6.5 对 LeastActiveLoadBalance 的更新,内容不是很多,先分析到这。接下来分析基于一致性 hash 思想的 ConsistentHashLoadBalance。</p>
+<p>以上就是 Dubbo 2.6.5 对 LeastActiveLoadBalance 的更新,内容不是很多,先分析到这。接下来分析基于一致性 hash 思想的 ConsistentHashLoadBalance。</p>
 <h3>2.3 ConsistentHashLoadBalance</h3>
 <p>一致性 hash 算法由麻省理工学院的 Karger 及其合作者于1997年提出的,算法提出之初是用于大规模缓存系统的负载均衡。它的工作过程是这样的,首先根据 ip 或者其他的信息为缓存节点生成一个 hash,并将这个 hash 投射到 [0, 2<sup>32</sup> - 1] 的圆环上。当有查询或写入请求时,则为缓存项的 key 生成一个 hash 值。然后查找第一个大于或等于该 hash 值的缓存节点,并到这个节点中查询或写入缓存项。如果当前节点挂了,则在下一次查询或写入缓存时,为缓存项查找另一个大于其 hash 值的缓存节点即可。大致效果如下图所示,每个缓存节点在圆环上占据一个位置。如果缓存项的 key 的 hash 值小于缓存节点 hash 值,则到该缓存节点中存储或读取缓存项。比如下面绿色点对应的缓存项将会被存储到 cache-2 节点中。由于 cache-3 挂了,原本应该存到该节点中的�
 �存项最终会存储到 cache-4 节点中。</p>
 <p><img src="./sources/images/consistent-hash.jpg" alt=""></p>
diff --git a/zh-cn/docs/source_code_guide/loadbalance.json b/zh-cn/docs/source_code_guide/loadbalance.json
index 0c23193..22adc19 100644
--- a/zh-cn/docs/source_code_guide/loadbalance.json
+++ b/zh-cn/docs/source_code_guide/loadbalance.json
@@ -1,6 +1,6 @@
 {
   "filename": "loadbalance.md",
-  "__html": "<h2>1.简介</h2>\n<p>LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分请求超时。因此将负载均衡到每个服务提供者上,是非常必要的。Dubbo 提供了4种负载均衡实现,分别是基于权重随
 机算法的 RandomLoadBalance、基于最少活跃调用数算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加权轮询算法的 Round [...]
+  "__html": "<h2>1.简介</h2>\n<p>LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分请求超时。因此将负载均衡到每个服务提供者上,是非常必要的。Dubbo 提供了4种负载均衡实现,分别是基于权重随
 机算法的 RandomLoadBalance、基于最少活跃调用数算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加权轮询算法的 Round [...]
   "link": "/zh-cn/docs/source_code_guide/loadbalance.html",
   "meta": {
     "title": "负载均衡",
diff --git a/zh-cn/docs/source_code_guide/refer-service.html b/zh-cn/docs/source_code_guide/refer-service.html
index a34028b..d8e66cd 100644
--- a/zh-cn/docs/source_code_guide/refer-service.html
+++ b/zh-cn/docs/source_code_guide/refer-service.html
@@ -60,7 +60,7 @@
 
     <span class="hljs-comment">// 检测是否为泛化接口</span>
     <span class="hljs-keyword">if</span> (ProtocolUtils.isGeneric(getGeneric())) {
-        interfaceClass = GenericService.class;
+        interfaceClass = GenericService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
     } <span class="hljs-keyword">else</span> {
         <span class="hljs-keyword">try</span> {
             <span class="hljs-comment">// 加载类</span>
@@ -436,7 +436,7 @@
     url = url.addParameterIfAbsent(Constants.HEARTBEAT_KEY, String.valueOf(Constants.DEFAULT_HEARTBEAT));
 
     <span class="hljs-comment">// 检测客户端类型是否存在,不存在则抛出异常</span>
-    <span class="hljs-keyword">if</span> (str != <span class="hljs-keyword">null</span> &amp;&amp; str.length() &gt; <span class="hljs-number">0</span> &amp;&amp; !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str)) {
+    <span class="hljs-keyword">if</span> (str != <span class="hljs-keyword">null</span> &amp;&amp; str.length() &gt; <span class="hljs-number">0</span> &amp;&amp; !ExtensionLoader.getExtensionLoader(Transporter<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">hasExtension</span>(<span class="hljs-title">str</span>)) </span>{
         <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RpcException(<span class="hljs-string">"Unsupported client type: ..."</span>);
     }
 
@@ -510,7 +510,7 @@
     url = url.setProtocol(url.getParameter(Constants.REGISTRY_KEY, Constants.DEFAULT_REGISTRY)).removeParameter(Constants.REGISTRY_KEY);
     <span class="hljs-comment">// 获取注册中心实例</span>
     Registry registry = registryFactory.getRegistry(url);
-    <span class="hljs-keyword">if</span> (RegistryService.class.equals(type)) {
+    <span class="hljs-keyword">if</span> (RegistryService<span class="hljs-class">.<span class="hljs-keyword">class</span>.<span class="hljs-title">equals</span>(<span class="hljs-title">type</span>)) </span>{
         <span class="hljs-keyword">return</span> proxyFactory.getInvoker((T) registry, type, url);
     }
 
@@ -579,7 +579,7 @@
             interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[types.length + <span class="hljs-number">2</span>];
             <span class="hljs-comment">// 设置服务接口类和 EchoService.class 到 interfaces 中</span>
             interfaces[<span class="hljs-number">0</span>] = invoker.getInterface();
-            interfaces[<span class="hljs-number">1</span>] = EchoService.class;
+            interfaces[<span class="hljs-number">1</span>] = EchoService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
             <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; types.length; i++) {
                 <span class="hljs-comment">// 加载接口类</span>
                 interfaces[i + <span class="hljs-number">1</span>] = ReflectUtils.forName(types[i]);
@@ -587,18 +587,18 @@
         }
     }
     <span class="hljs-keyword">if</span> (interfaces == <span class="hljs-keyword">null</span>) {
-        interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{invoker.getInterface(), EchoService.class};
+        interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{invoker.getInterface(), EchoService<span class="hljs-class">.<span class="hljs-keyword">class</span>}</span>;
     }
 
     <span class="hljs-comment">// 为 http 和 hessian 协议提供泛化调用支持,参考 pull request #1827</span>
-    <span class="hljs-keyword">if</span> (!invoker.getInterface().equals(GenericService.class) &amp;&amp; generic) {
+    <span class="hljs-keyword">if</span> (!invoker.getInterface().equals(GenericService<span class="hljs-class">.<span class="hljs-keyword">class</span>) &amp;&amp; <span class="hljs-title">generic</span>) </span>{
         <span class="hljs-keyword">int</span> len = interfaces.length;
         Class&lt;?&gt;[] temp = interfaces;
         <span class="hljs-comment">// 创建新的 interfaces 数组</span>
         interfaces = <span class="hljs-keyword">new</span> Class&lt;?&gt;[len + <span class="hljs-number">1</span>];
         System.arraycopy(temp, <span class="hljs-number">0</span>, interfaces, <span class="hljs-number">0</span>, len);
         <span class="hljs-comment">// 设置 GenericService.class 到数组中</span>
-        interfaces[len] = GenericService.class;
+        interfaces[len] = GenericService<span class="hljs-class">.<span class="hljs-keyword">class</span></span>;
     }
 
     <span class="hljs-comment">// 调用重载方法</span>
@@ -614,199 +614,199 @@
 }
 </code></pre>
 <p>上面代码并不多,首先是通过 Proxy 的 getProxy 方法获取 Proxy 子类,然后创建 InvokerInvocationHandler 对象,并将该对象传给 newInstance 生成 Proxy 实例。InvokerInvocationHandler 实现自 JDK 的 InvocationHandler 接口,具体的用途是拦截接口类调用。该类逻辑比较简单,这里就不分析了。下面我们重点关注一下 Proxy 的 getProxy 方法,如下。</p>
-<pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Proxy <span class="hljs-title">getProxy</span><span class="hljs-params">(Class&lt;?&gt;... ics)</span> </span>{
-    <span class="hljs-comment">// 调用重载方法</span>
-    <span class="hljs-keyword">return</span> getProxy(ClassHelper.getClassLoader(Proxy.class), ics);
+<pre><code class="language-java">public static Proxy getProxy(Class&lt;?&gt;... ics) {
+    // 调用重载方法
+    return getProxy(ClassHelper.getClassLoader(Proxy.class), ics);
 }
 
-<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Proxy <span class="hljs-title">getProxy</span><span class="hljs-params">(ClassLoader cl, Class&lt;?&gt;... ics)</span> </span>{
-    <span class="hljs-keyword">if</span> (ics.length &gt; <span class="hljs-number">65535</span>)
-        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"interface limit exceeded"</span>);
+public static Proxy getProxy(ClassLoader cl, Class&lt;?&gt;... ics) {
+    if (ics.length &gt; 65535)
+        throw new IllegalArgumentException("interface limit exceeded");
 
-    StringBuilder sb = <span class="hljs-keyword">new</span> StringBuilder();
-    <span class="hljs-comment">// 遍历接口列表</span>
-    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; ics.length; i++) {
+    StringBuilder sb = new StringBuilder();
+    // 遍历接口列表
+    for (int i = 0; i &lt; ics.length; i++) {
         String itf = ics[i].getName();
-        <span class="hljs-comment">// 检测类型是否为接口</span>
-        <span class="hljs-keyword">if</span> (!ics[i].isInterface())
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(itf + <span class="hljs-string">" is not a interface."</span>);
-
-        Class&lt;?&gt; tmp = <span class="hljs-keyword">null</span>;
-        <span class="hljs-keyword">try</span> {
-            <span class="hljs-comment">// 重新加载接口类</span>
-            tmp = Class.forName(itf, <span class="hljs-keyword">false</span>, cl);
-        } <span class="hljs-keyword">catch</span> (ClassNotFoundException e) {
+        // 检测类型是否为接口
+        if (!ics[i].isInterface())
+            throw new RuntimeException(itf + " is not a interface.");
+
+        Class&lt;?&gt; tmp = null;
+        try {
+            // 重新加载接口类
+            tmp = Class.forName(itf, false, cl);
+        } catch (ClassNotFoundException e) {
         }
 
-        <span class="hljs-comment">// 检测接口是否相同,这里 tmp 有可能为空</span>
-        <span class="hljs-keyword">if</span> (tmp != ics[i])
-            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(ics[i] + <span class="hljs-string">" is not visible from class loader"</span>);
+        // 检测接口是否相同,这里 tmp 有可能为空
+        if (tmp != ics[i])
+            throw new IllegalArgumentException(ics[i] + " is not visible from class loader");
 
-        <span class="hljs-comment">// 拼接接口全限定名,分隔符为 ;</span>
-        sb.append(itf).append(<span class="hljs-string">';'</span>);
+        // 拼接接口全限定名,分隔符为 ;
+        sb.append(itf).append(';');
     }
 
-    <span class="hljs-comment">// 使用拼接后的接口名作为 key</span>
+    // 使用拼接后的接口名作为 key
     String key = sb.toString();
 
     Map&lt;String, Object&gt; cache;
-    <span class="hljs-keyword">synchronized</span> (ProxyCacheMap) {
+    synchronized (ProxyCacheMap) {
         cache = ProxyCacheMap.get(cl);
-        <span class="hljs-keyword">if</span> (cache == <span class="hljs-keyword">null</span>) {
-            cache = <span class="hljs-keyword">new</span> HashMap&lt;String, Object&gt;();
+        if (cache == null) {
+            cache = new HashMap&lt;String, Object&gt;();
             ProxyCacheMap.put(cl, cache);
         }
     }
 
-    Proxy proxy = <span class="hljs-keyword">null</span>;
-    <span class="hljs-keyword">synchronized</span> (cache) {
-        <span class="hljs-keyword">do</span> {
-            <span class="hljs-comment">// 从缓存中获取 Reference&lt;Proxy&gt; 实例</span>
+    Proxy proxy = null;
+    synchronized (cache) {
+        do {
+            // 从缓存中获取 Reference&lt;Proxy&gt; 实例
             Object value = cache.get(key);
-            <span class="hljs-keyword">if</span> (value <span class="hljs-keyword">instanceof</span> Reference&lt;?&gt;) {
+            if (value instanceof Reference&lt;?&gt;) {
                 proxy = (Proxy) ((Reference&lt;?&gt;) value).get();
-                <span class="hljs-keyword">if</span> (proxy != <span class="hljs-keyword">null</span>) {
-                    <span class="hljs-keyword">return</span> proxy;
+                if (proxy != null) {
+                    return proxy;
                 }
             }
 
-            <span class="hljs-comment">// 并发控制,保证只有一个线程可以进行后续操作</span>
-            <span class="hljs-keyword">if</span> (value == PendingGenerationMarker) {
-                <span class="hljs-keyword">try</span> {
-                    <span class="hljs-comment">// 其他线程在此处进行等待</span>
+            // 并发控制,保证只有一个线程可以进行后续操作
+            if (value == PendingGenerationMarker) {
+                try {
+                    // 其他线程在此处进行等待
                     cache.wait();
-                } <span class="hljs-keyword">catch</span> (InterruptedException e) {
+                } catch (InterruptedException e) {
                 }
-            } <span class="hljs-keyword">else</span> {
-                <span class="hljs-comment">// 放置标志位到缓存中,并跳出 while 循环进行后续操作</span>
+            } else {
+                // 放置标志位到缓存中,并跳出 while 循环进行后续操作
                 cache.put(key, PendingGenerationMarker);
-                <span class="hljs-keyword">break</span>;
+                break;
             }
         }
-        <span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>);
+        while (true);
     }
 
-    <span class="hljs-keyword">long</span> id = PROXY_CLASS_COUNTER.getAndIncrement();
-    String pkg = <span class="hljs-keyword">null</span>;
-    ClassGenerator ccp = <span class="hljs-keyword">null</span>, ccm = <span class="hljs-keyword">null</span>;
-    <span class="hljs-keyword">try</span> {
-        <span class="hljs-comment">// 创建 ClassGenerator 对象</span>
+    long id = PROXY_CLASS_COUNTER.getAndIncrement();
+    String pkg = null;
+    ClassGenerator ccp = null, ccm = null;
+    try {
+        // 创建 ClassGenerator 对象
         ccp = ClassGenerator.newInstance(cl);
 
-        Set&lt;String&gt; worked = <span class="hljs-keyword">new</span> HashSet&lt;String&gt;();
-        List&lt;Method&gt; methods = <span class="hljs-keyword">new</span> ArrayList&lt;Method&gt;();
+        Set&lt;String&gt; worked = new HashSet&lt;String&gt;();
+        List&lt;Method&gt; methods = new ArrayList&lt;Method&gt;();
 
-        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; ics.length; i++) {
-            <span class="hljs-comment">// 检测接口访问级别是否为 protected 或 privete</span>
-            <span class="hljs-keyword">if</span> (!Modifier.isPublic(ics[i].getModifiers())) {
-                <span class="hljs-comment">// 获取接口包名</span>
+        for (int i = 0; i &lt; ics.length; i++) {
+            // 检测接口访问级别是否为 protected 或 privete
+            if (!Modifier.isPublic(ics[i].getModifiers())) {
+                // 获取接口包名
                 String npkg = ics[i].getPackage().getName();
-                <span class="hljs-keyword">if</span> (pkg == <span class="hljs-keyword">null</span>) {
+                if (pkg == null) {
                     pkg = npkg;
-                } <span class="hljs-keyword">else</span> {
-                    <span class="hljs-keyword">if</span> (!pkg.equals(npkg))
-                        <span class="hljs-comment">// 非 public 级别的接口必须在同一个包下,否者抛出异常</span>
-                        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"non-public interfaces from different packages"</span>);
+                } else {
+                    if (!pkg.equals(npkg))
+                        // 非 public 级别的接口必须在同一个包下,否者抛出异常
+                        throw new IllegalArgumentException("non-public interfaces from different packages");
                 }
             }
             
-            <span class="hljs-comment">// 添加接口到 ClassGenerator 中</span>
+            // 添加接口到 ClassGenerator 中
             ccp.addInterface(ics[i]);
 
-            <span class="hljs-comment">// 遍历接口方法</span>
-            <span class="hljs-keyword">for</span> (Method method : ics[i].getMethods()) {
-                <span class="hljs-comment">// 获取方法描述,可理解为方法签名</span>
+            // 遍历接口方法
+            for (Method method : ics[i].getMethods()) {
+                // 获取方法描述,可理解为方法签名
                 String desc = ReflectUtils.getDesc(method);
-                <span class="hljs-comment">// 如果方法描述字符串已在 worked 中,则忽略。考虑这种情况,</span>
-                <span class="hljs-comment">// A 接口和 B 接口中包含一个完全相同的方法</span>
-                <span class="hljs-keyword">if</span> (worked.contains(desc))
-                    <span class="hljs-keyword">continue</span>;
+                // 如果方法描述字符串已在 worked 中,则忽略。考虑这种情况,
+                // A 接口和 B 接口中包含一个完全相同的方法
+                if (worked.contains(desc))
+                    continue;
                 worked.add(desc);
 
-                <span class="hljs-keyword">int</span> ix = methods.size();
-                <span class="hljs-comment">// 获取方法返回值类型</span>
+                int ix = methods.size();
+                // 获取方法返回值类型
                 Class&lt;?&gt; rt = method.getReturnType();
-                <span class="hljs-comment">// 获取参数列表</span>
+                // 获取参数列表
                 Class&lt;?&gt;[] pts = method.getParameterTypes();
 
-                <span class="hljs-comment">// 生成 Object[] args = new Object[1...N]</span>
-                StringBuilder code = <span class="hljs-keyword">new</span> StringBuilder(<span class="hljs-string">"Object[] args = new Object["</span>).append(pts.length).append(<span class="hljs-string">"];"</span>);
-                <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>; j &lt; pts.length; j++)
-                    <span class="hljs-comment">// 生成 args[1...N] = ($w)$1...N;</span>
-                    code.append(<span class="hljs-string">" args["</span>).append(j).append(<span class="hljs-string">"] = ($w)$"</span>).append(j + <span class="hljs-number">1</span>).append(<span class="hljs-string">";"</span>);
-                <span class="hljs-comment">// 生成 InvokerHandler 接口的 invoker 方法调用语句,如下:</span>
-                <span class="hljs-comment">// Object ret = handler.invoke(this, methods[1...N], args);</span>
-                code.append(<span class="hljs-string">" Object ret = handler.invoke(this, methods["</span> + ix + <span class="hljs-string">"], args);"</span>);
+                // 生成 Object[] args = new Object[1...N]
+                StringBuilder code = new StringBuilder("Object[] args = new Object[").append(pts.length).append("];");
+                for (int j = 0; j &lt; pts.length; j++)
+                    // 生成 args[1...N] = ($w)$1...N;
+                    code.append(" args[").append(j).append("] = ($w)$").append(j + 1).append(";");
+                // 生成 InvokerHandler 接口的 invoker 方法调用语句,如下:
+                // Object ret = handler.invoke(this, methods[1...N], args);
+                code.append(" Object ret = handler.invoke(this, methods[" + ix + "], args);");
 
-                <span class="hljs-comment">// 返回值不为 void</span>
-                <span class="hljs-keyword">if</span> (!Void.TYPE.equals(rt))
-                    <span class="hljs-comment">// 生成返回语句,形如 return (java.lang.String) ret;</span>
-                    code.append(<span class="hljs-string">" return "</span>).append(asArgument(rt, <span class="hljs-string">"ret"</span>)).append(<span class="hljs-string">";"</span>);
+                // 返回值不为 void
+                if (!Void.TYPE.equals(rt))
+                    // 生成返回语句,形如 return (java.lang.String) ret;
+                    code.append(" return ").append(asArgument(rt, "ret")).append(";");
 
                 methods.add(method);
-                <span class="hljs-comment">// 添加方法名、访问控制符、参数列表、方法代码等信息到 ClassGenerator 中 </span>
+                // 添加方法名、访问控制符、参数列表、方法代码等信息到 ClassGenerator 中 
                 ccp.addMethod(method.getName(), method.getModifiers(), rt, pts, method.getExceptionTypes(), code.toString());
             }
         }
 
-        <span class="hljs-keyword">if</span> (pkg == <span class="hljs-keyword">null</span>)
+        if (pkg == null)
             pkg = PACKAGE_NAME;
 
-        <span class="hljs-comment">// 构建接口代理类名称:pkg + ".proxy" + id,比如 org.apache.dubbo.proxy0</span>
-        String pcn = pkg + <span class="hljs-string">".proxy"</span> + id;
+        // 构建接口代理类名称:pkg + ".proxy" + id,比如 org.apache.dubbo.proxy0
+        String pcn = pkg + ".proxy" + id;
         ccp.setClassName(pcn);
-        ccp.addField(<span class="hljs-string">"public static java.lang.reflect.Method[] methods;"</span>);
-        <span class="hljs-comment">// 生成 private java.lang.reflect.InvocationHandler handler;</span>
-        ccp.addField(<span class="hljs-string">"private "</span> + InvocationHandler.class.getName() + <span class="hljs-string">" handler;"</span>);
-
-        <span class="hljs-comment">// 为接口代理类添加带有 InvocationHandler 参数的构造方法,比如:</span>
-        <span class="hljs-comment">// porxy0(java.lang.reflect.InvocationHandler arg0) {</span>
-        <span class="hljs-comment">//     handler=$1;</span>
-    	<span class="hljs-comment">// }</span>
-        ccp.addConstructor(Modifier.PUBLIC, <span class="hljs-keyword">new</span> Class&lt;?&gt;[]{InvocationHandler.class}, <span class="hljs-keyword">new</span> Class&lt;?&gt;[<span class="hljs-number">0</span>], <span class="hljs-string">"handler=$1;"</span>);
-        <span class="hljs-comment">// 为接口代理类添加默认构造方法</span>
+        ccp.addField("public static java.lang.reflect.Method[] methods;");
+        // 生成 private java.lang.reflect.InvocationHandler handler;
+        ccp.addField("private " + InvocationHandler.class.getName() + " handler;");
+
+        // 为接口代理类添加带有 InvocationHandler 参数的构造方法,比如:
+        // porxy0(java.lang.reflect.InvocationHandler arg0) {
+        //     handler=$1;
+    	// }
+        ccp.addConstructor(Modifier.PUBLIC, new Class&lt;?&gt;[]{InvocationHandler.class}, new Class&lt;?&gt;[0], "handler=$1;");
+        // 为接口代理类添加默认构造方法
         ccp.addDefaultConstructor();
         
-        <span class="hljs-comment">// 生成接口代理类</span>
+        // 生成接口代理类
         Class&lt;?&gt; clazz = ccp.toClass();
-        clazz.getField(<span class="hljs-string">"methods"</span>).set(<span class="hljs-keyword">null</span>, methods.toArray(<span class="hljs-keyword">new</span> Method[<span class="hljs-number">0</span>]));
+        clazz.getField("methods").set(null, methods.toArray(new Method[0]));
 
-        <span class="hljs-comment">// 构建 Proxy 子类名称,比如 Proxy1,Proxy2 等</span>
+        // 构建 Proxy 子类名称,比如 Proxy1,Proxy2 等
         String fcn = Proxy.class.getName() + id;
         ccm = ClassGenerator.newInstance(cl);
         ccm.setClassName(fcn);
         ccm.addDefaultConstructor();
         ccm.setSuperClass(Proxy.class);
-        <span class="hljs-comment">// 为 Proxy 的抽象方法 newInstance 生成实现代码,形如:</span>
-        <span class="hljs-comment">// public Object newInstance(java.lang.reflect.InvocationHandler h) { </span>
-        <span class="hljs-comment">//     return new org.apache.dubbo.proxy0($1);</span>
-        <span class="hljs-comment">// }</span>
-        ccm.addMethod(<span class="hljs-string">"public Object newInstance("</span> + InvocationHandler.class.getName() + <span class="hljs-string">" h){ return new "</span> + pcn + <span class="hljs-string">"($1); }"</span>);
-        <span class="hljs-comment">// 生成 Proxy 实现类</span>
+        // 为 Proxy 的抽象方法 newInstance 生成实现代码,形如:
+        // public Object newInstance(java.lang.reflect.InvocationHandler h) { 
+        //     return new org.apache.dubbo.proxy0($1);
+        // }
+        ccm.addMethod("public Object newInstance(" + InvocationHandler.class.getName() + " h){ return new " + pcn + "($1); }");
+        // 生成 Proxy 实现类
         Class&lt;?&gt; pc = ccm.toClass();
-        <span class="hljs-comment">// 通过反射创建 Proxy 实例</span>
+        // 通过反射创建 Proxy 实例
         proxy = (Proxy) pc.newInstance();
-    } <span class="hljs-keyword">catch</span> (RuntimeException e) {
-        <span class="hljs-keyword">throw</span> e;
-    } <span class="hljs-keyword">catch</span> (Exception e) {
-        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e.getMessage(), e);
-    } <span class="hljs-keyword">finally</span> {
-        <span class="hljs-keyword">if</span> (ccp != <span class="hljs-keyword">null</span>)
-            <span class="hljs-comment">// 释放资源</span>
+    } catch (RuntimeException e) {
+        throw e;
+    } catch (Exception e) {
+        throw new RuntimeException(e.getMessage(), e);
+    } finally {
+        if (ccp != null)
+            // 释放资源
             ccp.release();
-        <span class="hljs-keyword">if</span> (ccm != <span class="hljs-keyword">null</span>)
+        if (ccm != null)
             ccm.release();
-        <span class="hljs-keyword">synchronized</span> (cache) {
-            <span class="hljs-keyword">if</span> (proxy == <span class="hljs-keyword">null</span>)
+        synchronized (cache) {
+            if (proxy == null)
                 cache.remove(key);
-            <span class="hljs-keyword">else</span>
-                <span class="hljs-comment">// 写缓存</span>
-                cache.put(key, <span class="hljs-keyword">new</span> WeakReference&lt;Proxy&gt;(proxy));
-            <span class="hljs-comment">// 唤醒其他等待线程</span>
+            else
+                // 写缓存
+                cache.put(key, new WeakReference&lt;Proxy&gt;(proxy));
+            // 唤醒其他等待线程
             cache.notifyAll();
         }
     }
-    <span class="hljs-keyword">return</span> proxy;
+    return proxy;
 }
 </code></pre>
 <p>上面代码比较复杂,我们写了大量的注释。大家在阅读这段代码时,要搞清楚 ccp 和 ccm 的用途,不然会被搞晕。ccp 用于为服务接口生成代理类,比如我们有一个 DemoService 接口,这个接口代理类就是由 ccp 生成的。ccm 则是用于为 org.apache.dubbo.common.bytecode.Proxy 抽象类生成子类,主要是实现 Proxy 类的抽象方法。下面以 org.apache.dubbo.demo.DemoService 这个接口为例,来看一下该接口代理类代码大致是怎样的(忽略 EchoService 接口)。</p>
diff --git a/zh-cn/docs/source_code_guide/refer-service.json b/zh-cn/docs/source_code_guide/refer-service.json
index 1f9271e..70e73d5 100644
--- a/zh-cn/docs/source_code_guide/refer-service.json
+++ b/zh-cn/docs/source_code_guide/refer-service.json
@@ -1,6 +1,6 @@
 {
   "filename": "refer-service.md",
-  "__html": "<h2>1. 简介</h2>\n<p>上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。这些步骤,将在后续章节中一一进行分析。</p>\n<h2>2.服务引用原理</h2>\n<p>Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 ReferenceBean 对应的服务被注入到其他类中时引用。这两�
 ��引用服务的时机区别在于,第一个是饿汉式的,第二个是懒汉式的。默认情况下,Dubbo 使用懒汉式引用服务。如果需要使用饿汉式,可通过配置 &lt [...]
+  "__html": "<h2>1. 简介</h2>\n<p>上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。这些步骤,将在后续章节中一一进行分析。</p>\n<h2>2.服务引用原理</h2>\n<p>Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 ReferenceBean 对应的服务被注入到其他类中时引用。这两�
 ��引用服务的时机区别在于,第一个是饿汉式的,第二个是懒汉式的。默认情况下,Dubbo 使用懒汉式引用服务。如果需要使用饿汉式,可通过配置 &lt [...]
   "link": "/zh-cn/docs/source_code_guide/refer-service.html",
   "meta": {
     "title": "服务引用",
diff --git a/zh-cn/docs/source_code_guide/service-invoking-process.html b/zh-cn/docs/source_code_guide/service-invoking-process.html
index d430903..cc6e015 100644
--- a/zh-cn/docs/source_code_guide/service-invoking-process.html
+++ b/zh-cn/docs/source_code_guide/service-invoking-process.html
@@ -89,7 +89,7 @@
         Class&lt;?&gt;[] parameterTypes = method.getParameterTypes();
         
         <span class="hljs-comment">// 拦截定义在 Object 类中的方法(未被子类重写),比如 wait/notify</span>
-        <span class="hljs-keyword">if</span> (method.getDeclaringClass() == Object.class) {
+        <span class="hljs-keyword">if</span> (method.getDeclaringClass() == Object<span class="hljs-class">.<span class="hljs-keyword">class</span>) </span>{
             <span class="hljs-keyword">return</span> method.invoke(invoker, args);
         }
         
@@ -750,7 +750,7 @@
     <span class="hljs-keyword">protected</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">byte</span> FLAG_TWOWAY = (<span class="hljs-keyword">byte</span>) <span class="hljs-number">0x40</span>;
     <span class="hljs-keyword">protected</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">byte</span> FLAG_EVENT = (<span class="hljs-keyword">byte</span>) <span class="hljs-number">0x20</span>;
     <span class="hljs-keyword">protected</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> SERIALIZATION_MASK = <span class="hljs-number">0x1f</span>;
-    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(ExchangeCodec.class);
+    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(ExchangeCodec<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> Short <span class="hljs-title">getMagicCode</span><span class="hljs-params">()</span> </span>{
         <span class="hljs-keyword">return</span> MAGIC;
@@ -1045,7 +1045,7 @@
             setParameterTypes(pts);
 
             <span class="hljs-comment">// 通过反序列化得到原 attachment 的内容</span>
-            Map&lt;String, String&gt; map = (Map&lt;String, String&gt;) in.readObject(Map.class);
+            Map&lt;String, String&gt; map = (Map&lt;String, String&gt;) in.readObject(Map<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
             <span class="hljs-keyword">if</span> (map != <span class="hljs-keyword">null</span> &amp;&amp; map.size() &gt; <span class="hljs-number">0</span>) {
                 Map&lt;String, String&gt; attachment = getAttachments();
                 <span class="hljs-keyword">if</span> (attachment == <span class="hljs-keyword">null</span>) {
@@ -1776,7 +1776,7 @@
             <span class="hljs-keyword">case</span> DubboCodec.RESPONSE_NULL_VALUE_WITH_ATTACHMENTS:
                 <span class="hljs-keyword">try</span> {
                     <span class="hljs-comment">// 反序列化 attachments 集合,并存储起来 </span>
-                    setAttachments((Map&lt;String, String&gt;) in.readObject(Map.class));
+                    setAttachments((Map&lt;String, String&gt;) in.readObject(Map<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
                 } <span class="hljs-keyword">catch</span> (ClassNotFoundException e) {
                     <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(StringUtils.toString(<span class="hljs-string">"Read response data failed."</span>, e));
                 }
@@ -1792,7 +1792,7 @@
                             (returnType.length == <span class="hljs-number">1</span> ? in.readObject((Class&lt;?&gt;) returnType[<span class="hljs-number">0</span>])
                                     : in.readObject((Class&lt;?&gt;) returnType[<span class="hljs-number">0</span>], returnType[<span class="hljs-number">1</span>])));
                     <span class="hljs-comment">// 反序列化 attachments 集合,并存储起来</span>
-                    setAttachments((Map&lt;String, String&gt;) in.readObject(Map.class));
+                    setAttachments((Map&lt;String, String&gt;) in.readObject(Map<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
                 } <span class="hljs-keyword">catch</span> (ClassNotFoundException e) {
                     <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(StringUtils.toString(<span class="hljs-string">"Read response data failed."</span>, e));
                 }
@@ -1808,7 +1808,7 @@
                     <span class="hljs-comment">// 设置异常对象</span>
                     setException((Throwable) obj);
                     <span class="hljs-comment">// 反序列化 attachments 集合,并存储起来</span>
-                    setAttachments((Map&lt;String, String&gt;) in.readObject(Map.class));
+                    setAttachments((Map&lt;String, String&gt;) in.readObject(Map<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
                 } <span class="hljs-keyword">catch</span> (ClassNotFoundException e) {
                     <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(StringUtils.toString(<span class="hljs-string">"Read response data failed."</span>, e));
                 }
diff --git a/zh-cn/docs/source_code_guide/service-invoking-process.json b/zh-cn/docs/source_code_guide/service-invoking-process.json
index 8ddf8e5..85dd8f6 100644
--- a/zh-cn/docs/source_code_guide/service-invoking-process.json
+++ b/zh-cn/docs/source_code_guide/service-invoking-process.json
@@ -1,6 +1,6 @@
 {
   "filename": "service-invoking-process.md",
-  "__html": "<h2>1. 简介</h2>\n<p>在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。介绍完本篇文章要分析的内容,接下来我们进入正题吧。</p>\n<h2>2. 源码分析</h2>\n<p>在进行源码分析之前,我们先来通过一张图了解 Dubbo 服务调用过程。</p>\n<p><img src=\"sources/images/send-reque
 st-process.jpg\" alt=\"\"></p>\n<p>首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client  [...]
+  "__html": "<h2>1. 简介</h2>\n<p>在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。介绍完本篇文章要分析的内容,接下来我们进入正题吧。</p>\n<h2>2. 源码分析</h2>\n<p>在进行源码分析之前,我们先来通过一张图了解 Dubbo 服务调用过程。</p>\n<p><img src=\"sources/images/send-reque
 st-process.jpg\" alt=\"\"></p>\n<p>首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client  [...]
   "link": "/zh-cn/docs/source_code_guide/service-invoking-process.html",
   "meta": {
     "title": "服务调用过程",
diff --git a/zh-cn/docs/user/benchmark-tool.html b/zh-cn/docs/user/benchmark-tool.html
index 44f4d8f..285f6ec 100644
--- a/zh-cn/docs/user/benchmark-tool.html
+++ b/zh-cn/docs/user/benchmark-tool.html
@@ -33,7 +33,7 @@
 <li>实现invoke方法,通过serviceFactory创建本地接口代理,并实现自己的业务逻辑,如下</li>
 </ul>
 <pre><code class="language-java">    <span class="hljs-function"><span class="hljs-keyword">public</span> Object <span class="hljs-title">invoke</span><span class="hljs-params">(ServiceFactory serviceFactory)</span> </span>{
-        DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);
+        DemoService demoService = (DemoService) serviceFactory.get(DemoService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">return</span> demoService.sendRequest(<span class="hljs-string">"hello"</span>);
     }
 </code></pre>
@@ -45,7 +45,7 @@
 <p>将demo.benchmark.jar 和服务的api包放到dubbo.benchmark/lib目录下</p>
 </li>
 <li>
-<p>配置duubo.properties</p>
+<p>配置dubbo.properties</p>
 </li>
 <li>
 <p>运行run.bat(windows)<a href="http://xn--run-du5f.sh">或run.sh</a>(linux)</p>
diff --git a/zh-cn/docs/user/benchmark-tool.json b/zh-cn/docs/user/benchmark-tool.json
index bfe4461..51c390f 100644
--- a/zh-cn/docs/user/benchmark-tool.json
+++ b/zh-cn/docs/user/benchmark-tool.json
@@ -1,6 +1,6 @@
 {
   "filename": "benchmark-tool.md",
-  "__html": "<h1>基准测试工具包</h1>\n<ul>\n<li>下载源码: git clone <a href=\"https://github.com/apache/dubbo.git\">https://github.com/apache/dubbo.git</a></li>\n<li>编译benchmark: cd dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>解压 benchmark压缩包: dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>阅读ReadMe.txt(内容如下,请以压缩包内的为准)</p>\n<ul>\n<li>\n<p>新建一个benchmark工程,如demo.benchmark</p>\n</li>\n<li>\n<p>导入自己服务的接口api包和dubbo.benchmark.j [...]
+  "__html": "<h1>基准测试工具包</h1>\n<ul>\n<li>下载源码: git clone <a href=\"https://github.com/apache/dubbo.git\">https://github.com/apache/dubbo.git</a></li>\n<li>编译benchmark: cd dubbo/dubbo-test/dubbo-test-benchmark; mvn clean install</li>\n<li>解压 benchmark压缩包: dubbo/dubbo-test/dubbo-test-benchmark/target/dubbo-test-benchmark-2.6.2-SNAPSHOT.tar.gz</li>\n</ul>\n<p>阅读ReadMe.txt(内容如下,请以压缩包内的为准)</p>\n<ul>\n<li>\n<p>新建一个benchmark工程,如demo.benchmark</p>\n</li>\n<li>\n<p>导入自己服务的接口api包和dubbo.benchmark.j [...]
   "link": "/zh-cn/docs/user/benchmark-tool.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/annotation.html b/zh-cn/docs/user/configuration/annotation.html
index 26c7378..185dc4b 100644
--- a/zh-cn/docs/user/configuration/annotation.html
+++ b/zh-cn/docs/user/configuration/annotation.html
@@ -71,7 +71,7 @@
 </code></pre>
 <h3>调用服务</h3>
 <pre><code class="language-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
-    AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration.class);
+    AnnotationConfigApplicationContext context = <span class="hljs-keyword">new</span> AnnotationConfigApplicationContext(ConsumerConfiguration<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     context.start();
     <span class="hljs-keyword">final</span> AnnotationAction annotationAction = (AnnotationAction) context.getBean(<span class="hljs-string">"annotationAction"</span>);
     String hello = annotationAction.doSayHello(<span class="hljs-string">"world"</span>);
diff --git a/zh-cn/docs/user/configuration/annotation.json b/zh-cn/docs/user/configuration/annotation.json
index c411085..c831563 100644
--- a/zh-cn/docs/user/configuration/annotation.json
+++ b/zh-cn/docs/user/configuration/annotation.json
@@ -1,6 +1,6 @@
 {
   "filename": "annotation.md",
-  "__html": "<h1>注解配置</h1>\n<p>需要 <code>2.6.3</code> 及以上版本支持\n点此查看<a href=\"https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-annotation\">完整示例</a></p>\n<h2>服务提供方</h2>\n<h3><code>Service</code>注解暴露服务</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotationServiceImpl</span> <span class=\"hljs-keywo [...]
+  "__html": "<h1>注解配置</h1>\n<p>需要 <code>2.6.3</code> 及以上版本支持\n点此查看<a href=\"https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-annotation\">完整示例</a></p>\n<h2>服务提供方</h2>\n<h3><code>Service</code>注解暴露服务</h3>\n<pre><code class=\"language-java\"><span class=\"hljs-meta\">@Service</span>\n<span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AnnotationServiceImpl</span> <span class=\"hljs-keywo [...]
   "link": "/zh-cn/docs/user/configuration/annotation.html",
   "meta": {
     "title": "注解配置",
diff --git a/zh-cn/docs/user/configuration/api.html b/zh-cn/docs/user/configuration/api.html
index 466040c..b545597 100644
--- a/zh-cn/docs/user/configuration/api.html
+++ b/zh-cn/docs/user/configuration/api.html
@@ -48,7 +48,7 @@ ServiceConfig&lt;XxxService&gt; service = <span class="hljs-keyword">new</span>
 service.setApplication(application);
 service.setRegistry(registry); <span class="hljs-comment">// 多个注册中心可以用setRegistries()</span>
 service.setProtocol(protocol); <span class="hljs-comment">// 多个协议可以用setProtocols()</span>
-service.setInterface(XxxService.class);
+service.setInterface(XxxService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 service.setRef(xxxService);
 service.setVersion(<span class="hljs-string">"1.0.0"</span>);
  
@@ -78,7 +78,7 @@ registry.setPassword(<span class="hljs-string">"bbb"</span>);
 ReferenceConfig&lt;XxxService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;XxxService&gt;(); <span class="hljs-comment">// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏</span>
 reference.setApplication(application);
 reference.setRegistry(registry); <span class="hljs-comment">// 多个注册中心可以用setRegistries()</span>
-reference.setInterface(XxxService.class);
+reference.setInterface(XxxService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference.setVersion(<span class="hljs-string">"1.0.0"</span>);
  
 <span class="hljs-comment">// 和本地bean一样使用xxxService</span>
diff --git a/zh-cn/docs/user/configuration/api.json b/zh-cn/docs/user/configuration/api.json
index ec91c0e..6741508 100644
--- a/zh-cn/docs/user/configuration/api.json
+++ b/zh-cn/docs/user/configuration/api.json
@@ -1,6 +1,6 @@
 {
   "filename": "api.md",
-  "__html": "<h1>API 配置</h1>\n<p>API 属性与配置项一对一,各属性含义,请参见:<a href=\"../references/xml/introduction.md\">配置参考手册</a>,比如:<code>ApplicationConfig.setName(&quot;xxx&quot;)</code> 对应  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>服务提供者</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> org.apache.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">impo [...]
+  "__html": "<h1>API 配置</h1>\n<p>API 属性与配置项一对一,各属性含义,请参见:<a href=\"../references/xml/introduction.md\">配置参考手册</a>,比如:<code>ApplicationConfig.setName(&quot;xxx&quot;)</code> 对应  <code>&lt;dubbo:application name=&quot;xxx&quot; /&gt;</code> <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup></p>\n<h2>服务提供者</h2>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">import</span> org.apache.dubbo.rpc.config.ApplicationConfig;\n<span class=\"hljs-keyword\">impo [...]
   "link": "/zh-cn/docs/user/configuration/api.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/config-center.html b/zh-cn/docs/user/configuration/config-center.html
index 188890f..01d1488 100644
--- a/zh-cn/docs/user/configuration/config-center.html
+++ b/zh-cn/docs/user/configuration/config-center.html
@@ -71,13 +71,11 @@ configCenter.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</
 <pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:config-center</span> <span class="hljs-attr">protocol</span>=<span class="hljs-string">"apollo"</span> <span class="hljs-attr">address</span>=<span class="hljs-string">"127.0.0.1:2181"</span>/&gt;</span>
 </code></pre>
 <p>Apollo中的一个核心概念是命名空间 - namespace(和上面zookeeper的namespace概念不同),在这里全局和应用级别配置就是通过命名空间来区分的。</p>
-<p>默认情况下,Dubbo会从名叫<code>dubbo</code>的命名空间中读取全局配置(<code>&lt;dubbo:config-center namespace=&quot;your namespace&quot;&gt;</code>)</p>
-<p><img src="/img/apollo-configcenter-dubbo.jpg" alt="image-20190128095444169"></p>
-<p>而应用自有的配置,会从<code>application</code>命名空间读取</p>
-<p><img src="/img/apollo-configcenter-application.jpg" alt="image-20190128095659517"></p>
+<p>默认情况下,Dubbo会从名叫<code>dubbo-properties</code>(由于 Apollo 不支持特殊后缀 <code>.properties</code> )的命名空间中读取全局配置(<code>&lt;dubbo:config-center namespace=&quot;your namespace&quot;&gt;</code>)</p>
+<p><img src="/img/apollo-configcenter-dubbo.png" alt="image-20190128095444169"></p>
 <blockquote>
-<p>注意:当前dubbo.properties是作为一个key存储在Apollo namespace中,为更好的适应Apollo的设计理念,在接下来的版本中可能会调整为</p>
-<p><img src="/img/apollo-configcenter-enhance.jpg" alt="image-20190128100058755"></p>
+<p>这里相当于是把 <code>dubbo.properties</code> 配置文件的内容存储在了 Apollo 中,应用通过关联共享的 <code>dubbo-properties</code> namespace 继承公共配置,
+应用也可以按照 Apollo 的做法来覆盖个别配置项。</p>
 </blockquote>
 <h4>自己加载外部化配置</h4>
 <p>所谓Dubbo对配置中心的支持,本质上就是把<code>.properties</code>从远程拉取到本地,然后和本地的配置做一次融合。理论上只要Dubbo框架能拿到需要的配置就可以正常的启动,它并不关心这些配置是自己加载到的还是应用直接塞给它的,所以Dubbo还提供了以下API,让用户将自己组织好的配置塞给Dubbo框架(配置加载的过程是用户要完成的),这样Dubbo框架就不再直接和Apollo或Zookeeper做读取配置交互。</p>
diff --git a/zh-cn/docs/user/configuration/config-center.json b/zh-cn/docs/user/configuration/config-center.json
index 3d4dbdc..f6caa56 100644
--- a/zh-cn/docs/user/configuration/config-center.json
+++ b/zh-cn/docs/user/configuration/config-center.json
@@ -1,6 +1,6 @@
 {
   "filename": "config-center.md",
-  "__html": "<h1>动态配置中心</h1>\n<p>配置中心(v2.7.0)在Dubbo中承担两个职责:</p>\n<ol>\n<li>外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。</li>\n<li>服务治理。服务治理规则的存储与通知。</li>\n</ol>\n<p>启用动态配置(以Zookeeper为例,可查看<a href=\"../references/xml/dubbo-config-center.md\">动态配置配置项详解</a>):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:config-center</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>/&gt; [...]
+  "__html": "<h1>动态配置中心</h1>\n<p>配置中心(v2.7.0)在Dubbo中承担两个职责:</p>\n<ol>\n<li>外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。</li>\n<li>服务治理。服务治理规则的存储与通知。</li>\n</ol>\n<p>启用动态配置(以Zookeeper为例,可查看<a href=\"../references/xml/dubbo-config-center.md\">动态配置配置项详解</a>):</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:config-center</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"zookeeper://127.0.0.1:2181\"</span>/&gt; [...]
   "link": "/zh-cn/docs/user/configuration/config-center.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/configuration-load-process.html b/zh-cn/docs/user/configuration/configuration-load-process.html
index 6ad67b8..44b2885 100644
--- a/zh-cn/docs/user/configuration/configuration-load-process.html
+++ b/zh-cn/docs/user/configuration/configuration-load-process.html
@@ -147,7 +147,7 @@
     ServiceConfig&lt;GreetingsService&gt; service = <span class="hljs-keyword">new</span> ServiceConfig&lt;&gt;();
     service.setApplication(<span class="hljs-keyword">new</span> ApplicationConfig(<span class="hljs-string">"first-dubbo-provider"</span>));
     service.setRegistry(<span class="hljs-keyword">new</span> RegistryConfig(<span class="hljs-string">"multicast://224.5.6.7:1234"</span>));
-    service.setInterface(GreetingsService.class);
+    service.setInterface(GreetingsService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
     service.setRef(<span class="hljs-keyword">new</span> GreetingsServiceImpl());
     service.export();
     System.out.println(<span class="hljs-string">"first-dubbo-provider is running."</span>);
diff --git a/zh-cn/docs/user/configuration/configuration-load-process.json b/zh-cn/docs/user/configuration/configuration-load-process.json
index 0d04e33..85e0674 100644
--- a/zh-cn/docs/user/configuration/configuration-load-process.json
+++ b/zh-cn/docs/user/configuration/configuration-load-process.json
@@ -1,6 +1,6 @@
 {
   "filename": "configuration-load-process.md",
-  "__html": "<h1>配置加载流程</h1>\n<p>此篇文档主要讲在<strong>应用启动阶段,Dubbo框架如何将所需要的配置采集起来</strong>(包括应用配置、注册中心配置、服务配置等),以完成服务的暴露和引用流程。</p>\n<p>根据驱动方式的不同(比如Spring或裸API编程)配置形式上肯定会有所差异,具体请参考<a href=\"./xml.md\">XML配置</a>、<a href=\"./annotation.md\">Annotation配置</a>、<a href=\"./api.md\">API配置</a>三篇文档。除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:</p>\n<ol>\n<li>Dubbo支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线URL后驱动后续的服务暴露、引用等流程。</li>\n<li>ApplicationConfig、ServiceConfig、ReferenceConfig可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式。 [...]
+  "__html": "<h1>配置加载流程</h1>\n<p>此篇文档主要讲在<strong>应用启动阶段,Dubbo框架如何将所需要的配置采集起来</strong>(包括应用配置、注册中心配置、服务配置等),以完成服务的暴露和引用流程。</p>\n<p>根据驱动方式的不同(比如Spring或裸API编程)配置形式上肯定会有所差异,具体请参考<a href=\"./xml.md\">XML配置</a>、<a href=\"./annotation.md\">Annotation配置</a>、<a href=\"./api.md\">API配置</a>三篇文档。除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:</p>\n<ol>\n<li>Dubbo支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线URL后驱动后续的服务暴露、引用等流程。</li>\n<li>ApplicationConfig、ServiceConfig、ReferenceConfig可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式。 [...]
   "link": "/zh-cn/docs/user/configuration/configuration-load-process.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/configuration/properties.html b/zh-cn/docs/user/configuration/properties.html
index ea175d3..7a9d3d8 100644
--- a/zh-cn/docs/user/configuration/properties.html
+++ b/zh-cn/docs/user/configuration/properties.html
@@ -32,7 +32,7 @@
 <span class="hljs-meta">dubbo.registry.address</span>=<span class="hljs-string">10.20.153.10:9090</span>
 </code></pre>
 <h2>重写与优先级</h2>
-<p><img src="https://github.com/apache/dubbo-website/blob/master/docs/en-us/user/sources/images/dubbo-properties-override.jpg" alt="properties-override"></p>
+<p><img src="../sources/images/dubbo-properties-override.jpg" alt="properties-override"></p>
 <p>优先级从高到低:</p>
 <ul>
 <li>JVM -D参数,当你部署或者启动应用时,它可以轻易地重写配置,比如,改变dubbo协议端口;</li>
diff --git a/zh-cn/docs/user/configuration/properties.json b/zh-cn/docs/user/configuration/properties.json
index 41345d6..ab6dd7a 100644
--- a/zh-cn/docs/user/configuration/properties.json
+++ b/zh-cn/docs/user/configuration/properties.json
@@ -1,6 +1,6 @@
 {
   "filename": "properties.md",
-  "__html": "<h1>属性配置</h1>\n<p>如果你的应用足够简单,例如,不需要多注册中心或多协议,并且需要在spring容器中共享配置,那么,我们可以直接使用 <code>dubbo.properties</code>作为默认配置。</p>\n<p>Dubbo可以自动加载classpath根目录下的dubbo.properties,但是你同样可以使用JVM参数来指定路径:<code>-Ddubbo.properties.file=xxx.properties</code>。</p>\n<h1>映射规则</h1>\n<p>可以将xml的tag名和属性名组合起来,用‘.’分隔。每行一个属性。</p>\n<ul>\n<li><code>dubbo.application.name=foo</code> 相当于 <code>&lt;dubbo:application name=&quot;foo&quot; /&gt;</code></li>\n<li><code>dubbo.registry.address=10.20.153.10:9090</code>  [...]
+  "__html": "<h1>属性配置</h1>\n<p>如果你的应用足够简单,例如,不需要多注册中心或多协议,并且需要在spring容器中共享配置,那么,我们可以直接使用 <code>dubbo.properties</code>作为默认配置。</p>\n<p>Dubbo可以自动加载classpath根目录下的dubbo.properties,但是你同样可以使用JVM参数来指定路径:<code>-Ddubbo.properties.file=xxx.properties</code>。</p>\n<h1>映射规则</h1>\n<p>可以将xml的tag名和属性名组合起来,用‘.’分隔。每行一个属性。</p>\n<ul>\n<li><code>dubbo.application.name=foo</code> 相当于 <code>&lt;dubbo:application name=&quot;foo&quot; /&gt;</code></li>\n<li><code>dubbo.registry.address=10.20.153.10:9090</code>  [...]
   "link": "/zh-cn/docs/user/configuration/properties.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/concurrency-control.html b/zh-cn/docs/user/demos/concurrency-control.html
index d828b06..d958bdb 100644
--- a/zh-cn/docs/user/demos/concurrency-control.html
+++ b/zh-cn/docs/user/demos/concurrency-control.html
@@ -42,7 +42,7 @@
     <span class="hljs-tag">&lt;<span class="hljs-name">dubbo:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sayHello"</span> <span class="hljs-attr">actives</span>=<span class="hljs-string">"10"</span> /&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">dubbo:service</span>&gt;</span>
 </code></pre>
-<p>如果 <code>&lt;dubbo:service&gt;</code> 和 <code>&lt;dubbo:reference&gt;</code> 都配了actives,<code>&lt;dubbo:reference&gt;</code> 优先,参见:<a href="../configuration/xml.md#%E9%85%8D%E7%BD%AE%E8%A6%86%E7%9B%96%E5%85%B3%E7%B3%BB">配置的覆盖策略</a>。</p>
+<p>如果 <code>&lt;dubbo:service&gt;</code> 和 <code>&lt;dubbo:reference&gt;</code> 都配了actives,<code>&lt;dubbo:reference&gt;</code> 优先,参见:<a href="../configuration/xml.md">配置的覆盖策略</a>。</p>
 <h2>Load Balance 均衡</h2>
 <p>配置服务的客户端的 <code>loadbalance</code> 属性为 <code>leastactive</code>,此 Loadbalance 会调用并发数最小的 Provider(Consumer端并发数)。</p>
 <pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:reference</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"com.foo.BarService"</span> <span class="hljs-attr">loadbalance</span>=<span class="hljs-string">"leastactive"</span> /&gt;</span>
diff --git a/zh-cn/docs/user/demos/concurrency-control.json b/zh-cn/docs/user/demos/concurrency-control.json
index e295c09..23ec205 100644
--- a/zh-cn/docs/user/demos/concurrency-control.json
+++ b/zh-cn/docs/user/demos/concurrency-control.json
@@ -1,6 +1,6 @@
 {
   "filename": "concurrency-control.md",
-  "__html": "<h1>并发控制</h1>\n<h2>配置样例</h2>\n<h3>样例 1</h3>\n<p>限制 <code>com.foo.BarService</code> 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h3>样例 2</h3>\n<p>限制 <code>com. [...]
+  "__html": "<h1>并发控制</h1>\n<h2>配置样例</h2>\n<h3>样例 1</h3>\n<p>限制 <code>com.foo.BarService</code> 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:service</span> <span class=\"hljs-attr\">interface</span>=<span class=\"hljs-string\">\"com.foo.BarService\"</span> <span class=\"hljs-attr\">executes</span>=<span class=\"hljs-string\">\"10\"</span> /&gt;</span>\n</code></pre>\n<h3>样例 2</h3>\n<p>限制 <code>com. [...]
   "link": "/zh-cn/docs/user/demos/concurrency-control.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/config-rule-deprecated.html b/zh-cn/docs/user/demos/config-rule-deprecated.html
index 1cb8a03..4995f14 100644
--- a/zh-cn/docs/user/demos/config-rule-deprecated.html
+++ b/zh-cn/docs/user/demos/config-rule-deprecated.html
@@ -14,7 +14,7 @@
 <body>
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
 <p>向注册中心写入动态配置覆盖规则 <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>。该功能通常由监控中心或治理中心的页面完成。</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000"</span>));
 </code></pre>
diff --git a/zh-cn/docs/user/demos/config-rule-deprecated.json b/zh-cn/docs/user/demos/config-rule-deprecated.json
index 1d2b62b..fc05356 100644
--- a/zh-cn/docs/user/demos/config-rule-deprecated.json
+++ b/zh-cn/docs/user/demos/config-rule-deprecated.json
@@ -1,6 +1,6 @@
 {
   "filename": "config-rule-deprecated.md",
-  "__html": "<h1>配置规则</h1>\n<p>向注册中心写入动态配置覆盖规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。该功能通常由监控中心或治理中心的页面完成。</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<span class=\"hljs-string\">\" [...]
+  "__html": "<h1>配置规则</h1>\n<p>向注册中心写入动态配置覆盖规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。该功能通常由监控中心或治理中心的页面完成。</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\ [...]
   "link": "/zh-cn/docs/user/demos/config-rule-deprecated.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/config-rule.html b/zh-cn/docs/user/demos/config-rule.html
index 04ef220..27208c9 100644
--- a/zh-cn/docs/user/demos/config-rule.html
+++ b/zh-cn/docs/user/demos/config-rule.html
@@ -27,10 +27,10 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">demo</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">["0.0.0.0:20880"]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">provider</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    weight:</span> <span class="hljs-number">1000</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">["0.0.0.0:20880"]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">provider</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">weight:</span> <span class="hljs-number">1000</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -43,10 +43,10 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">org.apache.dubbo.samples.governance.api.DemoService</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">[0.0.0.0]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">consumer</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    timeout:</span> <span class="hljs-number">6000</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">[0.0.0.0]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">consumer</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">timeout:</span> <span class="hljs-number">6000</span>
 <span class="hljs-string">...</span>
 
 </code></pre>
@@ -60,23 +60,23 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">app-name/group+service+version</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">["0.0.0.0"]</span>
-<span class="hljs-attr">  providerAddresses:</span> <span class="hljs-string">["1.1.1.1:20880",</span> <span class="hljs-string">"2.2.2.2:20881"</span><span class="hljs-string">]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">consumer</span>
-  <span class="hljs-string">applications/services:</span> <span class="hljs-string">[]</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    timeout:</span> <span class="hljs-number">1000</span>
-<span class="hljs-attr">    cluster:</span> <span class="hljs-string">failfase</span>
-<span class="hljs-attr">    loadbalance:</span> <span class="hljs-string">random</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">["0.0.0.0:20880"]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">provider</span>
-  <span class="hljs-string">applications/services:</span> <span class="hljs-string">[]</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    threadpool:</span> <span class="hljs-string">fixed</span>
-<span class="hljs-attr">    threads:</span> <span class="hljs-number">200</span>
-<span class="hljs-attr">    iothreads:</span> <span class="hljs-number">4</span>
-<span class="hljs-attr">    dispatcher:</span> <span class="hljs-string">all</span>
-<span class="hljs-attr">    weight:</span> <span class="hljs-number">200</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">["0.0.0.0"]</span>
+  <span class="hljs-attr">providerAddresses:</span> <span class="hljs-string">["1.1.1.1:20880",</span> <span class="hljs-string">"2.2.2.2:20881"</span><span class="hljs-string">]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">consumer</span>
+  <span class="hljs-attr">applications/services:</span> <span class="hljs-string">[]</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">timeout:</span> <span class="hljs-number">1000</span>
+    <span class="hljs-attr">cluster:</span> <span class="hljs-string">failfase</span>
+    <span class="hljs-attr">loadbalance:</span> <span class="hljs-string">random</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">["0.0.0.0:20880"]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">provider</span>
+  <span class="hljs-attr">applications/services:</span> <span class="hljs-string">[]</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">threadpool:</span> <span class="hljs-string">fixed</span>
+    <span class="hljs-attr">threads:</span> <span class="hljs-number">200</span>
+    <span class="hljs-attr">iothreads:</span> <span class="hljs-number">4</span>
+    <span class="hljs-attr">dispatcher:</span> <span class="hljs-string">all</span>
+    <span class="hljs-attr">weight:</span> <span class="hljs-number">200</span>
 <span class="hljs-string">...</span>
 </code></pre>
 <p>其中:</p>
@@ -139,10 +139,10 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">demo-provider</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">["10.20.153.10:20880"]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">provider</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    disabled:</span> <span class="hljs-literal">true</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">["10.20.153.10:20880"]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">provider</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">disabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -154,10 +154,10 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">demo-provider</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">["10.20.153.10:20880"]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">provider</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    weight:</span> <span class="hljs-number">200</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">["10.20.153.10:20880"]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">provider</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">weight:</span> <span class="hljs-number">200</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -169,9 +169,9 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">demo-consumer</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- side:</span> <span class="hljs-string">consumer</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    loadbalance:</span> <span class="hljs-string">random</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">side:</span> <span class="hljs-string">consumer</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">loadbalance:</span> <span class="hljs-string">random</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -183,9 +183,9 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">org.apache.dubbo.samples.governance.api.DemoService</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- side:</span> <span class="hljs-string">consumer</span>
-<span class="hljs-attr"> parameters:</span>
-<span class="hljs-attr">   force:</span> <span class="hljs-string">return</span> <span class="hljs-literal">null</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">side:</span> <span class="hljs-string">consumer</span>
+ <span class="hljs-attr">parameters:</span>
+   <span class="hljs-attr">force:</span> <span class="hljs-string">return</span> <span class="hljs-literal">null</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
diff --git a/zh-cn/docs/user/demos/config-rule.json b/zh-cn/docs/user/demos/config-rule.json
index 943ee34..d391cd5 100644
--- a/zh-cn/docs/user/demos/config-rule.json
+++ b/zh-cn/docs/user/demos/config-rule.json
@@ -1,6 +1,6 @@
 {
   "filename": "config-rule.md",
-  "__html": "<h1>配置规则</h1>\n<p>查看<a href=\"./config-rule-deprecated.md\">老版本配置规则</a>。</p>\n<p>覆盖规则是Dubbo设计的在无需重启应用的情况下,动态调整RPC调用行为的一种能力。2.7.0版本开始,支持从<strong>服务</strong>和<strong>应用</strong>两个粒度来调整动态配置。</p>\n<h2>概览</h2>\n<p>请在<a href=\"http://47.91.207.147/#/governance/config\">服务治理控制台</a>查看或修改覆盖规则。</p>\n<ul>\n<li>\n<p>应用粒度</p>\n<pre><code class=\"language-yaml\"><span class=\"hljs-comment\"># 将应用demo(key:demo)在20880端口上提供(side:provider)的所有服务(scope:application)的权重修改为1000(weight:1000)。</span [...]
+  "__html": "<h1>配置规则</h1>\n<p>查看<a href=\"./config-rule-deprecated.md\">老版本配置规则</a>。</p>\n<p>覆盖规则是Dubbo设计的在无需重启应用的情况下,动态调整RPC调用行为的一种能力。2.7.0版本开始,支持从<strong>服务</strong>和<strong>应用</strong>两个粒度来调整动态配置。</p>\n<h2>概览</h2>\n<p>请在<a href=\"http://47.91.207.147/#/governance/config\">服务治理控制台</a>查看或修改覆盖规则。</p>\n<ul>\n<li>\n<p>应用粒度</p>\n<pre><code class=\"language-yaml\"><span class=\"hljs-comment\"># 将应用demo(key:demo)在20880端口上提供(side:provider)的所有服务(scope:application)的权重修改为1000(weight:1000)。</span [...]
   "link": "/zh-cn/docs/user/demos/config-rule.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/parameter-validation.html b/zh-cn/docs/user/demos/parameter-validation.html
index fa9713b..c18a74f 100644
--- a/zh-cn/docs/user/demos/parameter-validation.html
+++ b/zh-cn/docs/user/demos/parameter-validation.html
@@ -46,8 +46,8 @@
     <span class="hljs-meta">@Size</span>(min = <span class="hljs-number">1</span>, max = <span class="hljs-number">20</span>) <span class="hljs-comment">// 长度或大小范围</span>
     <span class="hljs-keyword">private</span> String name;
  
-    <span class="hljs-meta">@NotNull</span>(groups = ValidationService.Save.class) <span class="hljs-comment">// 保存时不允许为空,更新时允许为空 ,表示不更新该字段</span>
-    <span class="hljs-meta">@Pattern</span>(regexp = <span class="hljs-string">"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"</span>)
+    <span class="hljs-meta">@NotNull</span>(groups = ValidationService.Save<span class="hljs-class">.<span class="hljs-keyword">class</span>) // 保存时不允许为空,更新时允许为空 ,表示不更新该字段
+    @<span class="hljs-title">Pattern</span>(<span class="hljs-title">regexp</span> </span>= <span class="hljs-string">"^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"</span>)
     <span class="hljs-keyword">private</span> String email;
  
     <span class="hljs-meta">@Min</span>(<span class="hljs-number">18</span>) <span class="hljs-comment">// 最小值</span>
@@ -112,8 +112,8 @@
 <pre><code class="language-java"><span class="hljs-keyword">import</span> javax.validation.GroupSequence;
  
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">ValidationService</span> </span>{   
-    <span class="hljs-meta">@GroupSequence</span>(Update.class) <span class="hljs-comment">// 同时验证Update组规则</span>
-    <span class="hljs-meta">@interface</span> Save{}
+    <span class="hljs-meta">@GroupSequence</span>(Update<span class="hljs-class">.<span class="hljs-keyword">class</span>) // 同时验证<span class="hljs-title">Update</span>组规则
+    @<span class="hljs-title">interface</span> <span class="hljs-title">Save</span></span>{}
     <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">save</span><span class="hljs-params">(ValidationParameter parameter)</span></span>;
  
     <span class="hljs-meta">@interface</span> Update{} 
@@ -137,29 +137,29 @@
 <pre><code class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dubbo:service</span> <span class="hljs-attr">interface</span>=<span class="hljs-string">"org.apache.dubbo.examples.validation.api.ValidationService"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"validationService"</span> <span class="hljs-attr">validation</span>=<span class="hljs-string">"true"</span> /&gt;</span>
 </code></pre>
 <h2>验证异常信息</h2>
-<pre><code class="language-java"><span class="hljs-keyword">import</span> javax.validation.ConstraintViolationException;
-<span class="hljs-keyword">import</span> javax.validation.ConstraintViolationException;
+<pre><code class="language-java">import javax.validation.ConstraintViolationException;
+import javax.validation.ConstraintViolationException;
  
-<span class="hljs-keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
  
-<span class="hljs-keyword">import</span> org.apache.dubbo.examples.validation.api.ValidationParameter;
-<span class="hljs-keyword">import</span> org.apache.dubbo.examples.validation.api.ValidationService;
-<span class="hljs-keyword">import</span> org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.examples.validation.api.ValidationParameter;
+import org.apache.dubbo.examples.validation.api.ValidationService;
+import org.apache.dubbo.rpc.RpcException;
  
-<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ValidationConsumer</span> </span>{   
-    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
-        String config = ValidationConsumer.class.getPackage().getName().replace(<span class="hljs-string">'.'</span>, <span class="hljs-string">'/'</span>) + <span class="hljs-string">"/validation-consumer.xml"</span>;
-        ClassPathXmlApplicationContext context = <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(config);
+public class ValidationConsumer {   
+    public static void main(String[] args) throws Exception {
+        String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + "/validation-consumer.xml";
+        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
         context.start();
-        ValidationService validationService = (ValidationService)context.getBean(<span class="hljs-string">"validationService"</span>);
-        <span class="hljs-comment">// Error</span>
-        <span class="hljs-keyword">try</span> {
-            parameter = <span class="hljs-keyword">new</span> ValidationParameter();
+        ValidationService validationService = (ValidationService)context.getBean("validationService");
+        // Error
+        try {
+            parameter = new ValidationParameter();
             validationService.save(parameter);
-            System.out.println(<span class="hljs-string">"Validation ERROR"</span>);
-        } <span class="hljs-keyword">catch</span> (RpcException e) { <span class="hljs-comment">// 抛出的是RpcException</span>
-            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); <span class="hljs-comment">// 里面嵌了一个ConstraintViolationException</span>
-            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); <span class="hljs-comment">// 可以拿到一个验证错误详细信息的集合</span>
+            System.out.println("Validation ERROR");
+        } catch (RpcException e) { // 抛出的是RpcException
+            ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); // 里面嵌了一个ConstraintViolationException
+            Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); // 可以拿到一个验证错误详细信息的集合
             System.out.println(violations);
         }
     } 
diff --git a/zh-cn/docs/user/demos/parameter-validation.json b/zh-cn/docs/user/demos/parameter-validation.json
index 9ded9f6..da25f8f 100644
--- a/zh-cn/docs/user/demos/parameter-validation.json
+++ b/zh-cn/docs/user/demos/parameter-validation.json
@@ -1,6 +1,6 @@
 {
   "filename": "parameter-validation.md",
-  "__html": "<h1>参数验证</h1>\n<p>参数验证功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 是基于 <a href=\"https://jcp.org/en/jsr/detail?id=303\">JSR303</a> 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>Maven 依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\ [...]
+  "__html": "<h1>参数验证</h1>\n<p>参数验证功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 是基于 <a href=\"https://jcp.org/en/jsr/detail?id=303\">JSR303</a> 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>Maven 依赖</h2>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\ [...]
   "link": "/zh-cn/docs/user/demos/parameter-validation.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/reference-config-cache.html b/zh-cn/docs/user/demos/reference-config-cache.html
index 01d1486..9936615 100644
--- a/zh-cn/docs/user/demos/reference-config-cache.html
+++ b/zh-cn/docs/user/demos/reference-config-cache.html
@@ -17,7 +17,7 @@
 <p>因此,自 <code>2.4.0</code> 版本开始, dubbo 提供了简单的工具类 <code>ReferenceConfigCache</code>用于缓存 <code>ReferenceConfig</code> 实例。</p>
 <p>使用方式如下:</p>
 <pre><code class="language-java">ReferenceConfig&lt;XxxService&gt; reference = <span class="hljs-keyword">new</span> ReferenceConfig&lt;XxxService&gt;();
-reference.setInterface(XxxService.class);
+reference.setInterface(XxxService<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
 reference.setVersion(<span class="hljs-string">"1.0.0"</span>);
 ......
 ReferenceConfigCache cache = ReferenceConfigCache.getCache();
diff --git a/zh-cn/docs/user/demos/reference-config-cache.json b/zh-cn/docs/user/demos/reference-config-cache.json
index ca7bd9c..8fcd5e5 100644
--- a/zh-cn/docs/user/demos/reference-config-cache.json
+++ b/zh-cn/docs/user/demos/reference-config-cache.json
@@ -1,6 +1,6 @@
 {
   "filename": "reference-config-cache.md",
-  "__html": "<h1>ReferenceConfig 缓存</h1>\n<p><code>ReferenceConfig</code> 实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存。否则重复生成 <code>ReferenceConfig</code> 可能造成性能问题并且会有内存和连接泄漏。在 API 方式编程时,容易忽略此问题。</p>\n<p>因此,自 <code>2.4.0</code> 版本开始, dubbo 提供了简单的工具类 <code>ReferenceConfigCache</code>用于缓存 <code>ReferenceConfig</code> 实例。</p>\n<p>使用方式如下:</p>\n<pre><code class=\"language-java\">ReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\nrefer [...]
+  "__html": "<h1>ReferenceConfig 缓存</h1>\n<p><code>ReferenceConfig</code> 实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存。否则重复生成 <code>ReferenceConfig</code> 可能造成性能问题并且会有内存和连接泄漏。在 API 方式编程时,容易忽略此问题。</p>\n<p>因此,自 <code>2.4.0</code> 版本开始, dubbo 提供了简单的工具类 <code>ReferenceConfigCache</code>用于缓存 <code>ReferenceConfig</code> 实例。</p>\n<p>使用方式如下:</p>\n<pre><code class=\"language-java\">ReferenceConfig&lt;XxxService&gt; reference = <span class=\"hljs-keyword\">new</span> ReferenceConfig&lt;XxxService&gt;();\nrefer [...]
   "link": "/zh-cn/docs/user/demos/reference-config-cache.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/routing-rule-deprecated.html b/zh-cn/docs/user/demos/routing-rule-deprecated.html
index 61a86f7..58f4288 100644
--- a/zh-cn/docs/user/demos/routing-rule-deprecated.html
+++ b/zh-cn/docs/user/demos/routing-rule-deprecated.html
@@ -16,7 +16,7 @@
 <p>路由规则 <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路由规则,并且支持可扩展 <sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>。</p>
 <h2>写入路由规则</h2>
 <p>向注册中心写入路由规则的操作通常由监控中心或治理中心的页面完成</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"route://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule="</span> + URL.encode(<span class="hljs-string">"host = 10.20.153.10 =&gt; host = 10.20.153.11"</span>)));
 </code></pre>
diff --git a/zh-cn/docs/user/demos/routing-rule-deprecated.json b/zh-cn/docs/user/demos/routing-rule-deprecated.json
index 4d02842..d1fec33 100644
--- a/zh-cn/docs/user/demos/routing-rule-deprecated.json
+++ b/zh-cn/docs/user/demos/routing-rule-deprecated.json
@@ -1,6 +1,6 @@
 {
   "filename": "routing-rule-deprecated.md",
-  "__html": "<h1>路由规则</h1>\n<p>路由规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路由规则,并且支持可扩展 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>写入路由规则</h2>\n<p>向注册中心写入路由规则的操作通常由监控中心或治理中心的页面完成</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(U [...]
+  "__html": "<h1>路由规则</h1>\n<p>路由规则 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路由规则,并且支持可扩展 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>写入路由规则</h2>\n<p>向注册中心写入路由规则的操作通常由监控中心或治理中心的页面完成</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class [...]
   "link": "/zh-cn/docs/user/demos/routing-rule-deprecated.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/routing-rule.html b/zh-cn/docs/user/demos/routing-rule.html
index 731ee3f..86b86ed 100644
--- a/zh-cn/docs/user/demos/routing-rule.html
+++ b/zh-cn/docs/user/demos/routing-rule.html
@@ -35,8 +35,8 @@
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">key:</span> <span class="hljs-string">governance-conditionrouter-consumer</span>
 <span class="hljs-attr">conditions:</span>
-<span class="hljs-bullet">  -</span> <span class="hljs-string">application=app1</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20880</span>
-<span class="hljs-bullet">  -</span> <span class="hljs-string">application=app2</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20881</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-string">application=app1</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20880</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-string">application=app2</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20881</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -51,8 +51,8 @@
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">key:</span> <span class="hljs-string">org.apache.dubbo.samples.governance.api.DemoService</span>
 <span class="hljs-attr">conditions:</span>
-<span class="hljs-bullet">  -</span> <span class="hljs-string">method=sayHello</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20880</span>
-<span class="hljs-bullet">  -</span> <span class="hljs-string">method=sayHi</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20881</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-string">method=sayHello</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20880</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-string">method=sayHi</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20881</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -172,15 +172,15 @@ application != bops =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96
 <span class="hljs-comment"># tag1包含一个实例 127.0.0.1:20880</span>
 <span class="hljs-comment"># tag2包含一个实例 127.0.0.1:20881</span>
 <span class="hljs-meta">---</span>
-<span class="hljs-attr">  force:</span> <span class="hljs-literal">false</span>
-<span class="hljs-attr">  runtime:</span> <span class="hljs-literal">true</span>
-<span class="hljs-attr">  enabled:</span> <span class="hljs-literal">true</span>
-<span class="hljs-attr">  key:</span> <span class="hljs-string">governance-tagrouter-provider</span>
-<span class="hljs-attr">  tags:</span>
-<span class="hljs-attr">    - name:</span> <span class="hljs-string">tag1</span>
-<span class="hljs-attr">      addresses:</span> <span class="hljs-string">["127.0.0.1:20880"]</span>
-<span class="hljs-attr">    - name:</span> <span class="hljs-string">tag2</span>
-<span class="hljs-attr">      addresses:</span> <span class="hljs-string">["127.0.0.1:20881"]</span>
+  <span class="hljs-attr">force:</span> <span class="hljs-literal">false</span>
+  <span class="hljs-attr">runtime:</span> <span class="hljs-literal">true</span>
+  <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
+  <span class="hljs-attr">key:</span> <span class="hljs-string">governance-tagrouter-provider</span>
+  <span class="hljs-attr">tags:</span>
+    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">tag1</span>
+      <span class="hljs-attr">addresses:</span> <span class="hljs-string">["127.0.0.1:20880"]</span>
+    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">tag2</span>
+      <span class="hljs-attr">addresses:</span> <span class="hljs-string">["127.0.0.1:20881"]</span>
  <span class="hljs-string">...</span>
 </code></pre>
 </li>
diff --git a/zh-cn/docs/user/demos/routing-rule.json b/zh-cn/docs/user/demos/routing-rule.json
index 67d0d59..4ff6cf7 100644
--- a/zh-cn/docs/user/demos/routing-rule.json
+++ b/zh-cn/docs/user/demos/routing-rule.json
@@ -1,6 +1,6 @@
 {
   "filename": "routing-rule.md",
-  "__html": "<h1>路由规则</h1>\n<p>在此查看<a href=\"./routing-rule-deprecated.md\">老版本路由规则(2.6.x or before)</a></p>\n<p>路由规则在发起一次RPC调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。</p>\n<ul>\n<li>条件路由。支持以服务或Consumer应用为粒度配置路由规则。</li>\n<li>标签路由。以Provider应用为粒度配置路由规则。</li>\n</ul>\n<p>后续我们计划在2.6.x版本的基础上继续增强脚本路由功能,老版本脚本路由规则配置方式请参见开篇链接。</p>\n<h2>条件路由</h2>\n<p>您可以随时在服务治理控制台<a href=\"https://github.com/apache/dubbo-admin\">Dubbo-Admin</a>写入路由规则</p>\n<h3>简介</h3>\n<ul>\n<li>\n<p>应用粒度</p>\n<pre><code class [...]
+  "__html": "<h1>路由规则</h1>\n<p>在此查看<a href=\"./routing-rule-deprecated.md\">老版本路由规则(2.6.x or before)</a></p>\n<p>路由规则在发起一次RPC调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。</p>\n<ul>\n<li>条件路由。支持以服务或Consumer应用为粒度配置路由规则。</li>\n<li>标签路由。以Provider应用为粒度配置路由规则。</li>\n</ul>\n<p>后续我们计划在2.6.x版本的基础上继续增强脚本路由功能,老版本脚本路由规则配置方式请参见开篇链接。</p>\n<h2>条件路由</h2>\n<p>您可以随时在服务治理控制台<a href=\"https://github.com/apache/dubbo-admin\">Dubbo-Admin</a>写入路由规则</p>\n<h3>简介</h3>\n<ul>\n<li>\n<p>应用粒度</p>\n<pre><code class [...]
   "link": "/zh-cn/docs/user/demos/routing-rule.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/serialization.html b/zh-cn/docs/user/demos/serialization.html
index 47a5cf3..6ce2b2e 100644
--- a/zh-cn/docs/user/demos/serialization.html
+++ b/zh-cn/docs/user/demos/serialization.html
@@ -25,12 +25,12 @@
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> Collection&lt;Class&gt; <span class="hljs-title">getSerializableClasses</span><span class="hljs-params">()</span> </span>{
         List&lt;Class&gt; classes = <span class="hljs-keyword">new</span> LinkedList&lt;Class&gt;();
-        classes.add(BidRequest.class);
-        classes.add(BidResponse.class);
-        classes.add(Device.class);
-        classes.add(Geo.class);
-        classes.add(Impression.class);
-        classes.add(SeatBid.class);
+        classes.add(BidRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(BidResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(Device<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(Geo<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(Impression<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(SeatBid<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">return</span> classes;
     }
 }
diff --git a/zh-cn/docs/user/demos/serialization.json b/zh-cn/docs/user/demos/serialization.json
index b06b77e..d3b54c6 100644
--- a/zh-cn/docs/user/demos/serialization.json
+++ b/zh-cn/docs/user/demos/serialization.json
@@ -1,6 +1,6 @@
 {
   "filename": "serialization.md",
-  "__html": "<h1>在Dubbo中使用高效的Java序列化(Kryo和FST)</h1>\n<h2>启用Kryo和FST</h2>\n<p>使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"kryo\"</span>/&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs [...]
+  "__html": "<h1>在Dubbo中使用高效的Java序列化(Kryo和FST)</h1>\n<h2>启用Kryo和FST</h2>\n<p>使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:protocol</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">\"dubbo\"</span> <span class=\"hljs-attr\">serialization</span>=<span class=\"hljs-string\">\"kryo\"</span>/&gt;</span>\n</code></pre>\n<pre><code class=\"language-xml\"><span class=\"hljs [...]
   "link": "/zh-cn/docs/user/demos/serialization.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/service-downgrade.html b/zh-cn/docs/user/demos/service-downgrade.html
index 0de5eee..39bb83f 100644
--- a/zh-cn/docs/user/demos/service-downgrade.html
+++ b/zh-cn/docs/user/demos/service-downgrade.html
@@ -15,7 +15,7 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
 <p>可以通过服务降级功能 <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。</p>
 <p>向注册中心写入动态配置覆盖规则:</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null"</span>));
 </code></pre>
diff --git a/zh-cn/docs/user/demos/service-downgrade.json b/zh-cn/docs/user/demos/service-downgrade.json
index f6c398b..60c8058 100644
--- a/zh-cn/docs/user/demos/service-downgrade.json
+++ b/zh-cn/docs/user/demos/service-downgrade.json
@@ -1,6 +1,6 @@
 {
   "filename": "service-downgrade.md",
-  "__html": "<h1>服务降级</h1>\n<p>可以通过服务降级功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。</p>\n<p>向注册中心写入动态配置覆盖规则:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20.153.10:2181\"</span>));\nregistry.register(URL.valueOf(<spa [...]
+  "__html": "<h1>服务降级</h1>\n<p>可以通过服务降级功能 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。</p>\n<p>向注册中心写入动态配置覆盖规则:</p>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<sp [...]
   "link": "/zh-cn/docs/user/demos/service-downgrade.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/demos/static-service.html b/zh-cn/docs/user/demos/static-service.html
index 08c72e6..f85688ce 100644
--- a/zh-cn/docs/user/demos/static-service.html
+++ b/zh-cn/docs/user/demos/static-service.html
@@ -21,7 +21,7 @@
 </code></pre>
 <p>服务提供者初次注册时为禁用状态,需人工启用。断线时,将不会被自动删除,需人工禁用。</p>
 <p>如果是一个第三方服务提供者,比如 memcached,可以直接向注册中心写入提供者地址信息,消费者正常使用 <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>:</p>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo"</span>));
 </code></pre>
diff --git a/zh-cn/docs/user/demos/static-service.json b/zh-cn/docs/user/demos/static-service.json
index 5519485..e33fcef 100644
--- a/zh-cn/docs/user/demos/static-service.json
+++ b/zh-cn/docs/user/demos/static-service.json
@@ -1,6 +1,6 @@
 {
   "filename": "static-service.md",
-  "__html": "<h1>静态服务</h1>\n<p>有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hl [...]
+  "__html": "<h1>静态服务</h1>\n<p>有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dubbo:registry</span> <span class=\"hljs-attr\">address</span>=<span class=\"hljs-string\">\"10.20.141.150:9090\"</span> <span class=\"hljs-attr\">dynamic</span>=<span class=\"hljs-string\">\"false\"</span> /&gt;</span>\n</code></pre>\n<p>或者</p>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hl [...]
   "link": "/zh-cn/docs/user/demos/static-service.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/recommend.html b/zh-cn/docs/user/recommend.html
index d784953..d555e7d 100644
--- a/zh-cn/docs/user/recommend.html
+++ b/zh-cn/docs/user/recommend.html
@@ -136,7 +136,7 @@
 <hr class="footnotes-sep">
 <section class="footnotes">
 <ol class="footnotes-list">
-<li id="fn1" class="footnote-item"><p>配置的覆盖规则:1) 方法级别配置优于接口级别,即小 Scope 优先 2) Consumer 端配置优于 Provider 端配置,优于全局配置,最后是 Dubbo 硬编码的配置值(<a href="./configuration/properties.md#%E8%A6%86%E7%9B%96%E7%AD%96%E7%95%A5">Dubbo 配置参考手册</a>) <a href="#fnref1" class="footnote-backref">↩︎</a></p>
+<li id="fn1" class="footnote-item"><p>配置的覆盖规则:1) 方法级别配置优于接口级别,即小 Scope 优先 2) Consumer 端配置优于 Provider 端配置,优于全局配置,最后是 Dubbo 硬编码的配置值(<a href="./configuration/properties.md">Dubbo 配置参考手册</a>) <a href="#fnref1" class="footnote-backref">↩︎</a></p>
 </li>
 <li id="fn2" class="footnote-item"><p>表示加上第一次调用,会调用 3 次 <a href="#fnref2" class="footnote-backref">↩︎</a></p>
 </li>
diff --git a/zh-cn/docs/user/recommend.json b/zh-cn/docs/user/recommend.json
index 271aa3a..243f76c 100644
--- a/zh-cn/docs/user/recommend.json
+++ b/zh-cn/docs/user/recommend.json
@@ -1,6 +1,6 @@
 {
   "filename": "recommend.md",
-  "__html": "<h1>推荐用法</h1>\n<h2>在 Provider 端尽量多配置 Consumer 端属性</h2>\n<p>原因如下:</p>\n<ul>\n<li>作服务的提供方,比服务消费方更清楚服务的性能参数,如调用的超时时间、合理的重试次数等</li>\n<li>在 Provider 端配置后,Consumer 端不配置则会使用 Provider 端的配置,即 Provider 端的配置可以作为 Consumer 的缺省值 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。否则,Consumer 会使用 Consumer 端的全局设置,这对于 Provider 是不可控的,并且往往是不合理的</li>\n</ul>\n<p>Provider 端尽量多配置 Consumer 端的属性,让 Provider 的实现者一开始就思考 Provider 端的服务特点和服务质量等问题。</p>\n<p>示例:</p>\n<pre><code class=\"l [...]
+  "__html": "<h1>推荐用法</h1>\n<h2>在 Provider 端尽量多配置 Consumer 端属性</h2>\n<p>原因如下:</p>\n<ul>\n<li>作服务的提供方,比服务消费方更清楚服务的性能参数,如调用的超时时间、合理的重试次数等</li>\n<li>在 Provider 端配置后,Consumer 端不配置则会使用 Provider 端的配置,即 Provider 端的配置可以作为 Consumer 的缺省值 <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>。否则,Consumer 会使用 Consumer 端的全局设置,这对于 Provider 是不可控的,并且往往是不合理的</li>\n</ul>\n<p>Provider 端尽量多配置 Consumer 端的属性,让 Provider 的实现者一开始就思考 Provider 端的服务特点和服务质量等问题。</p>\n<p>示例:</p>\n<pre><code class=\"l [...]
   "link": "/zh-cn/docs/user/recommend.html",
   "meta": {
     "title": "推荐用法",
diff --git a/zh-cn/docs/user/references/protocol/memcached.html b/zh-cn/docs/user/references/protocol/memcached.html
index db568c9..bbb8c98 100644
--- a/zh-cn/docs/user/references/protocol/memcached.html
+++ b/zh-cn/docs/user/references/protocol/memcached.html
@@ -15,7 +15,7 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
 <p>基于 memcached <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 实现的 RPC 协议 <sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>。</p>
 <h2>注册 memcached 服务的地址</h2>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash"</span>));
 </code></pre>
diff --git a/zh-cn/docs/user/references/protocol/memcached.json b/zh-cn/docs/user/references/protocol/memcached.json
index ddbc8a2..f8cbee5 100644
--- a/zh-cn/docs/user/references/protocol/memcached.json
+++ b/zh-cn/docs/user/references/protocol/memcached.json
@@ -1,6 +1,6 @@
 {
   "filename": "memcached.md",
-  "__html": "<h1>memcached://</h1>\n<p>基于 memcached <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 实现的 RPC 协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>注册 memcached 服务的地址</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookee [...]
+  "__html": "<h1>memcached://</h1>\n<p>基于 memcached <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 实现的 RPC 协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>注册 memcached 服务的地址</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</ [...]
   "link": "/zh-cn/docs/user/references/protocol/memcached.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/redis.html b/zh-cn/docs/user/references/protocol/redis.html
index 61efac1..ce0ba75 100644
--- a/zh-cn/docs/user/references/protocol/redis.html
+++ b/zh-cn/docs/user/references/protocol/redis.html
@@ -15,7 +15,7 @@
 	<div id="root"><div class="documentation-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/dubbo_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a [...]
 <p>基于 Redis <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 实现的 RPC 协议 <sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>。</p>
 <h2>注册 redis 服务的地址</h2>
-<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+<pre><code class="language-java">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getAdaptiveExtension</span>()</span>;
 Registry registry = registryFactory.getRegistry(URL.valueOf(<span class="hljs-string">"zookeeper://10.20.153.10:2181"</span>));
 registry.register(URL.valueOf(<span class="hljs-string">"redis://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash"</span>));
 </code></pre>
diff --git a/zh-cn/docs/user/references/protocol/redis.json b/zh-cn/docs/user/references/protocol/redis.json
index 79bd172..a070547 100644
--- a/zh-cn/docs/user/references/protocol/redis.json
+++ b/zh-cn/docs/user/references/protocol/redis.json
@@ -1,6 +1,6 @@
 {
   "filename": "redis.md",
-  "__html": "<h1>redis://</h1>\n<p>基于 Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 实现的 RPC 协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>注册 redis 服务的地址</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();\nRegistry registry = registryFactory.getRegistry(URL.valueOf(<span class=\"hljs-string\">\"zookeeper://10.20. [...]
+  "__html": "<h1>redis://</h1>\n<p>基于 Redis <sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> 实现的 RPC 协议 <sup class=\"footnote-ref\"><a href=\"#fn2\" id=\"fnref2\">[2]</a></sup>。</p>\n<h2>注册 redis 服务的地址</h2>\n<pre><code class=\"language-java\">RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class</span>).<span class=\"hljs-title\">getAdaptiveExtension</span>()</span>;\nRegi [...]
   "link": "/zh-cn/docs/user/references/protocol/redis.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/references/protocol/rest.html b/zh-cn/docs/user/references/protocol/rest.html
index f6408c1..8347977 100644
--- a/zh-cn/docs/user/references/protocol/rest.html
+++ b/zh-cn/docs/user/references/protocol/rest.html
@@ -280,12 +280,12 @@ http://localhost:8080/users/1003
 <p>注意:只有在设置server=&quot;jetty&quot;或者server=&quot;tomcat&quot;或者server=&quot;servlet&quot;的时候,你才能通过以上方法正确的得到HttpServletRequest和HttpServletResponse,因为只有这几种server实现了servlet容器。</p>
 </blockquote>
 <p>为了简化编程,在此你也可以用泛型的方式来直接获取特定类型的request/response:</p>
-<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());
+<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getRemoteAddr</span>())</span>;
 }
 
-<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse.class));
+<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
 }
 </code></pre>
 <p>如果request/response不符合指定的类型,这里也会返回null。</p>
diff --git a/zh-cn/docs/user/references/protocol/rest.json b/zh-cn/docs/user/references/protocol/rest.json
index eed5463..ef971eb 100644
--- a/zh-cn/docs/user/references/protocol/rest.json
+++ b/zh-cn/docs/user/references/protocol/rest.json
@@ -1,6 +1,6 @@
 {
   "filename": "rest.md",
-  "__html": "<h1>rest://</h1>\n<p>基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持</p>\n<h2>快速入门</h2>\n<p>在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。</p>\n<p>这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。</p>\n<p>首先,开发服务的接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span  [...]
+  "__html": "<h1>rest://</h1>\n<p>基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持</p>\n<h2>快速入门</h2>\n<p>在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。</p>\n<p>这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):</p>\n<pre><code>http://localhost:8080/users/register\n</code></pre>\n<p>而任何客户端都可以将包含用户信息的JSON字符串POST到以上URL来完成用户注册。</p>\n<p>首先,开发服务的接口:</p>\n<pre><code class=\"language-java\"><span class=\"hljs-keyword\">public</span> <span class=\"hljs-class\"><span  [...]
   "link": "/zh-cn/docs/user/references/protocol/rest.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/rest.html b/zh-cn/docs/user/rest.html
index c4df87b..d05cd95 100644
--- a/zh-cn/docs/user/rest.html
+++ b/zh-cn/docs/user/rest.html
@@ -416,12 +416,12 @@ http://localhost:8080/users/1003
 <p>注意:只有在设置server=&quot;jetty&quot;或者server=&quot;tomcat&quot;或者server=&quot;servlet&quot;的时候,你才能通过以上方法正确的得到HttpServletRequest和HttpServletResponse,因为只有这几种server实现了servlet容器。</p>
 </blockquote>
 <p>为了简化编程,在此你也可以用泛型的方式来直接获取特定类型的request/response:</p>
-<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr());
+<pre><code class="language-java"><span class="hljs-keyword">if</span> (RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Client address is "</span> + RpcContext.getContext().getRequest(HttpServletRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getRemoteAddr</span>())</span>;
 }
 
-<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse.class) != <span class="hljs-keyword">null</span>) {
-    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse.class));
+<span class="hljs-keyword">if</span> (RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>) !</span>= <span class="hljs-keyword">null</span>) {
+    System.out.println(<span class="hljs-string">"Response object from RpcContext: "</span> + RpcContext.getContext().getResponse(HttpServletResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>))</span>;
 }
 </code></pre>
 <p>如果request/response不符合指定的类型,这里也会返回null。</p>
@@ -679,7 +679,7 @@ Response response = target.request().post(Entity.entity(user, MediaType.APPLICAT
     <span class="hljs-keyword">if</span> (response.getStatus() != <span class="hljs-number">200</span>) {
         <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(<span class="hljs-string">"Failed with HTTP error code : "</span> + response.getStatus());
     }
-    System.out.println(<span class="hljs-string">"The generated id is "</span> + response.readEntity(RegistrationResult.class).getId());
+    System.out.println(<span class="hljs-string">"The generated id is "</span> + response.readEntity(RegistrationResult<span class="hljs-class">.<span class="hljs-keyword">class</span>).<span class="hljs-title">getId</span>())</span>;
 } <span class="hljs-keyword">finally</span> {
     response.close();
     client.close(); <span class="hljs-comment">// 在真正开发中不要每次关闭client,比如HTTP长连接是由client持有的</span>
diff --git a/zh-cn/docs/user/rest.json b/zh-cn/docs/user/rest.json
index 5a435f2..a4cfa24 100644
--- a/zh-cn/docs/user/rest.json
+++ b/zh-cn/docs/user/rest.json
@@ -1,6 +1,6 @@
 {
   "filename": "rest.md",
-  "__html": "<h1>在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)</h1>\n<p><strong>作者:沈理</strong></p>\n<p><strong>文档版权:<a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0许可证 署名-禁止演绎</a></strong></p>\n<p>完善中……</p>\n<blockquote>\n<p>本文篇幅较长,因为REST本身涉及面较多。另外,本文参照Spring等的文档风格,不仅仅局限于框架用法的阐述,同时也努力呈现框架的设计理念和优良应用的架构思想。</p>\n</blockquote>\n<blockquote>\n<p>对于想粗略了解dubbo和REST的人,只需浏览 <code>概述</code> 至 <code>标准Java REST API:JAX-RS简介</code> 几节即可。</p>\n</blockquote>\n<p>TODO 生成可点击的目录</p>\n<h2>目录 [...]
+  "__html": "<h1>在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)</h1>\n<p><strong>作者:沈理</strong></p>\n<p><strong>文档版权:<a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0许可证 署名-禁止演绎</a></strong></p>\n<p>完善中……</p>\n<blockquote>\n<p>本文篇幅较长,因为REST本身涉及面较多。另外,本文参照Spring等的文档风格,不仅仅局限于框架用法的阐述,同时也努力呈现框架的设计理念和优良应用的架构思想。</p>\n</blockquote>\n<blockquote>\n<p>对于想粗略了解dubbo和REST的人,只需浏览 <code>概述</code> 至 <code>标准Java REST API:JAX-RS简介</code> 几节即可。</p>\n</blockquote>\n<p>TODO 生成可点击的目录</p>\n<h2>目录 [...]
   "link": "/zh-cn/docs/user/rest.html",
   "meta": {
     "title": "在 Dubbo 中开发 REST 风格的远程调用(RESTful Remoting)",
diff --git a/zh-cn/docs/user/serialization.html b/zh-cn/docs/user/serialization.html
index 09b3558..2e2f3a5 100644
--- a/zh-cn/docs/user/serialization.html
+++ b/zh-cn/docs/user/serialization.html
@@ -71,12 +71,12 @@
 
     <span class="hljs-function"><span class="hljs-keyword">public</span> Collection&lt;Class&gt; <span class="hljs-title">getSerializableClasses</span><span class="hljs-params">()</span> </span>{
         List&lt;Class&gt; classes = <span class="hljs-keyword">new</span> LinkedList&lt;Class&gt;();
-        classes.add(BidRequest.class);
-        classes.add(BidResponse.class);
-        classes.add(Device.class);
-        classes.add(Geo.class);
-        classes.add(Impression.class);
-        classes.add(SeatBid.class);
+        classes.add(BidRequest<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(BidResponse<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(Device<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(Geo<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(Impression<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
+        classes.add(SeatBid<span class="hljs-class">.<span class="hljs-keyword">class</span>)</span>;
         <span class="hljs-keyword">return</span> classes;
     }
 }
diff --git a/zh-cn/docs/user/serialization.json b/zh-cn/docs/user/serialization.json
index 01e2224..53cc51e 100644
--- a/zh-cn/docs/user/serialization.json
+++ b/zh-cn/docs/user/serialization.json
@@ -1,6 +1,6 @@
 {
   "filename": "serialization.md",
-  "__html": "<h1>在Dubbo中使用高效的Java序列化(Kryo和FST)</h1>\n<p><strong>作者:沈理</strong></p>\n<p><strong>文档版权:<a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0许可证 署名-禁止演绎</a></strong></p>\n<p>完善中……</p>\n<p>TODO 生成可点击的目录</p>\n<h2>目录</h2>\n<ul>\n<li>序列化漫谈</li>\n<li>启用Kryo和FST</li>\n<li>注册被序列化类</li>\n<li>无参构造函数和Serializable接口</li>\n<li>序列化性能分析与测试\n<ul>\n<li>测试环境</li>\n<li>测试脚本</li>\n<li>Dubbo RPC中不同序列化生成字节大小比较</li>\n<li>Dubbo RPC中不同序列化响应时间和吞吐量对比</li>\n</ul>\n</li>\n<li>未来</li>\n</ul>\ [...]
+  "__html": "<h1>在Dubbo中使用高效的Java序列化(Kryo和FST)</h1>\n<p><strong>作者:沈理</strong></p>\n<p><strong>文档版权:<a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache 2.0许可证 署名-禁止演绎</a></strong></p>\n<p>完善中……</p>\n<p>TODO 生成可点击的目录</p>\n<h2>目录</h2>\n<ul>\n<li>序列化漫谈</li>\n<li>启用Kryo和FST</li>\n<li>注册被序列化类</li>\n<li>无参构造函数和Serializable接口</li>\n<li>序列化性能分析与测试\n<ul>\n<li>测试环境</li>\n<li>测试脚本</li>\n<li>Dubbo RPC中不同序列化生成字节大小比较</li>\n<li>Dubbo RPC中不同序列化响应时间和吞吐量对比</li>\n</ul>\n</li>\n<li>未来</li>\n</ul>\ [...]
   "link": "/zh-cn/docs/user/serialization.html",
   "meta": {}
 }
\ No newline at end of file
diff --git a/zh-cn/docs/user/versions/version-270.html b/zh-cn/docs/user/versions/version-270.html
index 542ac39..d7f6c97 100644
--- a/zh-cn/docs/user/versions/version-270.html
+++ b/zh-cn/docs/user/versions/version-270.html
@@ -116,8 +116,8 @@
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">key:</span> <span class="hljs-string">governance-conditionrouter-consumer</span>
 <span class="hljs-attr">conditions:</span>
-<span class="hljs-bullet">  -</span> <span class="hljs-string">application=app1</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20880</span>
-<span class="hljs-bullet">  -</span> <span class="hljs-string">application=app2</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20881</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-string">application=app1</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20880</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-string">application=app2</span> <span class="hljs-string">=&gt;</span> <span class="hljs-string">address=*:20881</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -129,10 +129,10 @@
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">key:</span> <span class="hljs-string">governance-tagrouter-provider</span>
 <span class="hljs-attr">tags:</span>
-<span class="hljs-attr">  - name:</span> <span class="hljs-string">tag1</span>
-<span class="hljs-attr">    addresses:</span> <span class="hljs-string">["127.0.0.1:20880"]</span>
-<span class="hljs-attr">  - name:</span> <span class="hljs-string">tag2</span>
-<span class="hljs-attr">    addresses:</span> <span class="hljs-string">["127.0.0.1:20881"]</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">tag1</span>
+    <span class="hljs-attr">addresses:</span> <span class="hljs-string">["127.0.0.1:20880"]</span>
+  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">tag2</span>
+    <span class="hljs-attr">addresses:</span> <span class="hljs-string">["127.0.0.1:20881"]</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
@@ -143,10 +143,10 @@
 <span class="hljs-attr">key:</span> <span class="hljs-string">org.apache.dubbo.samples.governance.api.DemoService</span>
 <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
 <span class="hljs-attr">configs:</span>
-<span class="hljs-attr">- addresses:</span> <span class="hljs-string">[0.0.0.0]</span>
-<span class="hljs-attr">  side:</span> <span class="hljs-string">consumer</span>
-<span class="hljs-attr">  parameters:</span>
-<span class="hljs-attr">    timeout:</span> <span class="hljs-number">6000</span>
+<span class="hljs-bullet">-</span> <span class="hljs-attr">addresses:</span> <span class="hljs-string">[0.0.0.0]</span>
+  <span class="hljs-attr">side:</span> <span class="hljs-string">consumer</span>
+  <span class="hljs-attr">parameters:</span>
+    <span class="hljs-attr">timeout:</span> <span class="hljs-number">6000</span>
 <span class="hljs-string">...</span>
 </code></pre>
 </li>
diff --git a/zh-cn/docs/user/versions/version-270.json b/zh-cn/docs/user/versions/version-270.json
index 66cad8f..cedc372 100644
--- a/zh-cn/docs/user/versions/version-270.json
+++ b/zh-cn/docs/user/versions/version-270.json
@@ -1,6 +1,6 @@
 {
   "filename": "version-270.md",
-  "__html": "<h1>升级与可能的兼容性问题总结</h1>\n<p>环境要求:需要<strong>Java 8</strong>及以上版本。</p>\n<p>2.7.0版本在改造的过程中遵循了一个原则,即<strong>保持与低版本的兼容性,因此从功能层面来说它是与2.6.x及更低版本完全兼容的</strong>,而接下来将要提到的兼容性问题主要是<a href=\"#1.1\">包重命名</a>带来的。另外,虽然功能用法保持向后兼容,但参考本文能帮助您尽快用到2.7.0版本的新特性。</p>\n<h2>升级步骤</h2>\n<ol>\n<li>升级pom到2.7.0(以all-in-one依赖为例)。</li>\n</ol>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"h [...]
+  "__html": "<h1>升级与可能的兼容性问题总结</h1>\n<p>环境要求:需要<strong>Java 8</strong>及以上版本。</p>\n<p>2.7.0版本在改造的过程中遵循了一个原则,即<strong>保持与低版本的兼容性,因此从功能层面来说它是与2.6.x及更低版本完全兼容的</strong>,而接下来将要提到的兼容性问题主要是<a href=\"#1.1\">包重命名</a>带来的。另外,虽然功能用法保持向后兼容,但参考本文能帮助您尽快用到2.7.0版本的新特性。</p>\n<h2>升级步骤</h2>\n<ol>\n<li>升级pom到2.7.0(以all-in-one依赖为例)。</li>\n</ol>\n<pre><code class=\"language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties</span>&gt;</span>\n    <span class=\"hljs-tag\">&lt;<span class=\"h [...]
   "link": "/zh-cn/docs/user/versions/version-270.html",
   "meta": {
     "title": "升级与可能的兼容性问题总结",