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

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


The following commit(s) were added to refs/heads/master by this push:
     new 473eec0300 Format advanced files (#1250)
473eec0300 is described below

commit 473eec03005b0c6696a1c6ff6777bb7abc0a8a9b
Author: Albumen Kevin <[email protected]>
AuthorDate: Mon Jul 18 16:13:52 2022 +0800

    Format advanced files (#1250)
---
 .../performance/simplify-registry-data.md          |  43 ++++---
 .../advanced-features-and-usage/rpc/async-call.md  |  47 ++------
 .../advanced-features-and-usage/rpc/attachment.md  |  78 ++++++++++++-
 .../rpc/callback-parameter.md                      |   6 +-
 .../advanced-features-and-usage/rpc/context.md     |  14 +--
 .../rpc/echo-service.md                            |   8 ++
 .../rpc/events-notify.md                           |   5 +-
 .../rpc/generic-service.md                         | 124 ++++++++++++---------
 .../rpc/group-merger.md                            |   5 +-
 .../advanced-features-and-usage/rpc/local-mock.md  |   2 -
 .../rpc/parameter-validation.md                    |   5 +-
 .../rpc/result-cache.md                            |   5 +-
 .../advanced-features-and-usage/security/tls.md    |  12 +-
 .../security/token-authorization.md                |   2 +
 .../service/multi-versions.md                      |  10 +-
 .../service/service-downgrade.md                   |  11 +-
 .../service/service-group.md                       |  43 +++++--
 static/imgs/v3/concepts/rpccontext.png             | Bin 0 -> 222532 bytes
 18 files changed, 260 insertions(+), 160 deletions(-)

diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/performance/simplify-registry-data.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/performance/simplify-registry-data.md
index 6704f7f595..99e5039520 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/performance/simplify-registry-data.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/performance/simplify-registry-data.md
@@ -7,7 +7,7 @@ weight: 3
 description: "了解 dubbo3 减少注册中心上服务的注册数据"
 ---  
 
-## 特性说明:
+## 特性说明
 
 Dubbo provider 中的服务配置项有接近 [30 个配置项](/zh/docs/references/xml/dubbo-parameter)。 
排除注册中心服务治理需要之外,很大一部分配置项是 provider 自己使用,不需要透传给消费者。这部分数据不需要进入注册中心,而只需要以 key-value 
形式持久化存储。
 
@@ -25,27 +25,27 @@ Dubbo consumer 中的配置项也有 [20+个配置项](/zh/docs/references/xml/d
 
 provider:
 
-| Constant Key  | Key  | remark |  
-| ------ | ------ | ------ |  
-| APPLICATION_KEY | application |  |  
-| CODEC_KEY | codec |  |  
-| EXCHANGER_KEY | exchanger |   |  
+| Constant Key  | Key           | remark |  
+| ------ |---------------| ------ |  
+| APPLICATION_KEY | application   |  |  
+| CODEC_KEY | codec         |  |  
+| EXCHANGER_KEY | exchanger     |   |  
 | SERIALIZATION_KEY | serialization |   |  
-| CLUSTER_KEY | cluster |  |  
-| CONNECTIONS_KEY | connections |   |  
-| DEPRECATED_KEY | deprecated |  |  
-| GROUP_KEY | group |   |  
-| LOADBALANCE_KEY | loadbalance |  |  
-| MOCK_KEY | mock |  |  
-| PATH_KEY | path |  |  
-| TIMEOUT_KEY | timeout |  |  
-| TOKEN_KEY | token |  |  
-| VERSION_KEY | version |  |  
-| WARMUP_KEY | warmup |  |  
-| WEIGHT_KEY | weight |  |  
-| TIMESTAMP_KEY | timestamp |  |  
-| DUBBO_VERSION_KEY | dubbo |  |  
-| SPECIFICATION_VERSION_KEY | **specVersion** | 新增,用于表述dubbo版本,如2.7.0 |  
+| CLUSTER_KEY | cluster       |  |  
+| CONNECTIONS_KEY | connections   |   |  
+| DEPRECATED_KEY | deprecated    |  |  
+| GROUP_KEY | group         |   |  
+| LOADBALANCE_KEY | loadbalance   |  |  
+| MOCK_KEY | mock          |  |  
+| PATH_KEY | path          |  |  
+| TIMEOUT_KEY | timeout       |  |  
+| TOKEN_KEY | token         |  |  
+| VERSION_KEY | version       |  |  
+| WARMUP_KEY | warmup        |  |  
+| WEIGHT_KEY | weight        |  |  
+| DUBBO_VERSION_KEY | dubbo         |  |  
+| RELEASE_KEY | release       |  |  
+| SIDE_KEY | side          |  |  
 
 
 consumer:
@@ -56,7 +56,6 @@ consumer:
 | VERSION_KEY |  version |  |  
 | GROUP_KEY | group |  |  
 | DUBBO_VERSION_KEY | dubbo |  |  
-| SPECIFICATION_VERSION_KEY | **specVersion** | 新增,用于表述dubbo版本,如2.7.0 |  
 
 Constant Key 表示来自于类 org.apache.dubbo.common.Constants 的字段。
 
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/async-call.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/async-call.md
index 7304ad3b15..7821d27b95 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/async-call.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/async-call.md
@@ -6,6 +6,7 @@ weight: 3
 description: "在 Dubbo 中发起异步调用"
 ---
 
+## 背景
 
 从 2.7.0 开始,Dubbo 的所有异步编程接口开始以 
[CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html)
 为基础
 
@@ -13,7 +14,6 @@ description: "在 Dubbo 中发起异步调用"
 
 ![/user-guide/images/future.jpg](/imgs/user/future.jpg)
 
-
 ## 使用 CompletableFuture 签名的接口
 
 需要服务提供者事先定义 CompletableFuture 签名的服务,接口定义指南如下:
@@ -28,6 +28,9 @@ Provider 端异步执行和 Consumer 端异步调用是相互独立的,你可
 - Consumer异步 - Provider异步
   {{% /alert %}}
 
+## 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-async)
 
 ## 定义 CompletableFuture 签名的接口
 
@@ -45,10 +48,8 @@ public interface AsyncService {
 public class AsyncServiceImpl implements AsyncService {
     @Override
     public CompletableFuture<String> sayHello(String name) {
-        RpcContext savedContext = RpcContext.getContext();
-        // 建议为supplyAsync提供自定义线程池,避免使用JDK公用线程池
         return CompletableFuture.supplyAsync(() -> {
-            System.out.println(savedContext.getAttachment("consumer-key1"));
+            System.out.println(name);
             try {
                 Thread.sleep(5000);
             } catch (InterruptedException e) {
@@ -146,7 +147,7 @@ System.out.println("Executed before response return.");
 // 此调用会立即返回null
 asyncService.sayHello("world");
 // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
-CompletableFuture<String> helloFuture = 
RpcContext.getContext().getCompletableFuture();
+CompletableFuture<String> helloFuture = 
RpcContext.getServiceContext().getCompletableFuture();
 // 为Future添加回调
 helloFuture.whenComplete((retValue, exception) -> {
     if (exception == null) {
@@ -160,7 +161,7 @@ helloFuture.whenComplete((retValue, exception) -> {
 或者,你也可以这样做异步调用:
 
 ```java
-CompletableFuture<String> future = RpcContext.getContext().asyncCall(
+CompletableFuture<String> future = RpcContext.getServiceContext().asyncCall(
     () -> {
         asyncService.sayHello("oneway call request1");
     }
@@ -170,40 +171,6 @@ future.get();
 ```
 
 
-
-## 重载服务接口
-
-如果你只有这样的同步服务定义,而又不喜欢 RpcContext 的异步使用方式。
-
-```java
-public interface GreetingsService {
-    String sayHi(String name);
-}
-```
-
-那还有一种方式,就是利用 Java 8 提供的 default 接口实现,重载一个带有 CompletableFuture 签名的方法。
-  
-> CompletableFuture 签名的方法目前只支持 Dubbo 协议,其他协议由于第三方实现问题,需要视具体情况而定。
-
-有两种方式来实现:
-
-1. 提供方或消费方自己修改接口签名
-
-```java
-public interface GreetingsService {
-    String sayHi(String name);
-    
-    // AsyncSignal is totally optional, you can use any parameter type as long 
as java allows your to do that.
-    default CompletableFuture<String> sayHi(String name, AsyncSignal signal) {
-        return CompletableFuture.completedFuture(sayHi(name));
-    }
-}
-```
-
-1. Dubbo 官方提供 compiler 
hacker,编译期自动重写同步方法,请[在此](https://github.com/dubbo/dubbo-async-processor#compiler-hacker-processer)讨论和跟进具体进展。
-
-
-
 你也可以设置是否等待消息发出: [^1]
 
 - `sent="true"` 等待消息发出,消息发送失败将抛出异常。
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/attachment.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/attachment.md
index afb62a05b5..cd214607ae 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/attachment.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/attachment.md
@@ -5,11 +5,31 @@ linkTitle: "调用链路传递隐式参数"
 weight: 5
 description: "通过 Dubbo 中的 Attachment 在服务消费方和提供方之间隐式传递参数"
 ---
+
 ## 特性说明
-可以通过 `RpcContext` 上的 `setAttachment` 和 `getAttachment` 在服务消费方和提供方之间进行参数的隐式传递。 
 
+可以通过 `RpcContext` 上的 `setAttachment` 和 `getAttachment` 在服务消费方和提供方之间进行参数的隐式传递。
+
+## 背景
+
+上下文信息是 RPC 框架很重要的一个功能,使用 RpcContext 
可以为单次调用指定不同配置。如分布式链路追踪场景,其实现原理就是在全链路的上下文中维护一个 traceId,Consumer 和 Provider 通过传递 
traceId 来连接一次RPC调用,分别上报日志后可以在追踪系统中串联并展示完整的调用流程。这样可以更方便地发现异常,定位问题。
+Dubbo 中的 RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 
请求时,RpcContext 的状态都会变化。比如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 
的信息,在 B 调 C 之后,RpcContext 记录的是 B 调 C 的信息。
+
+在 Dubbo 3 中,RpcContext 
被拆分为四大模块(ServerContext、ClientAttachment、ServerAttachment 和 ServiceContext)。
+
+它们分别承担了不同的指责:
+- ServiceContext:在 Dubbo 内部使用,用于传递调用链路上的参数信息,如 invoker 对象等
+- ClientAttachment:在 Client 端使用,往 ClientAttachment 中写入的参数将被传递到 Server 端
+- ServerAttachment:在 Server 端使用,从 ServerAttachment 中读取的参数是从 Client 中传递过来的
+- ServerContext:在 Client 端和 Server 端使用,用于从 Server 端回传 Client 端使用,Server 端写入到 
ServerContext 的参数在调用结束后可以在 Client 端的 ServerContext 获取到
+
+![/imgs/v3/concepts/rpccontext.png](/imgs/v3/concepts/rpccontext.png)
+
+如上图所示,消费端发起调用的时候可以直接通过 Method Invoke 向远程的服务发起调用,同时消费端往 RpcClientAttachment 
写入的数据会连同 Invoke 的参数信息写入到 Invocation 中。
+消费端的 Invocation 经过序列化后通过网络传输发送给服务端,服务端解析 Invocation 生成 Method Invoke 的参数和 
RpcServerAttachment,然后发起真实调用。
+在服务端处理结束之后,Method Response 结果会连同 RpcServiceContext 一起生成 Result 对象。
+服务端的 Result 结果对象经过序列化后通过网络传输发送回消费端,消费端解析 Result 生成 Method Response 结果和 
RpcServiceContext,返回真实调用结果和上下文给消费端。
 
-![/user-guide/images/context.png](/imgs/user/context.png)
 #### 注意:
 path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使用其它值。
 
@@ -22,21 +42,69 @@ path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使
 内部系统通过 Dubbo 调用时, traceId 如何透传到服务提供方。
 
 ## 使用方式
+
 #### 注意:
+
 `setAttachment` 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。
+
 #### 在服务消费方端设置隐式参数
-```xml
-RpcContext.getContext().setAttachment("index", "1"); // 
隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用
+
+```java
+RpcContext.getClientAttachment().setAttachment("index", "1"); // 
隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用
 xxxService.xxx(); // 远程调用
 // ...
 ```
+
 #### 在服务提供方端获取隐式参数
+
 ```java
 public class XxxServiceImpl implements XxxService {
  
     public void xxx() {
         // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用
-        String index = RpcContext.getContext().getAttachment("index"); 
+        String index = RpcContext.getServerAttachment().getAttachment("index");
     }
 }
 ```
+
+#### 在服务提供方写入回传参数
+
+```java
+public class XxxServiceImpl implements XxxService {
+ 
+    public void xxx() {
+        String index = xxx;
+        RpcContext.getServerContext().setAttachment("result", index);
+    }
+}
+```
+
+#### 在消费端获取回传参数
+
+```java
+xxxService.xxx(); // 远程调用
+String result = RpcContext.getServerContext().getAttachment("result");
+// ...
+```
+
+## 参数透传问题
+
+在 Dubbo 2.7 中,在 A 端设置的参数,调用 B 以后,如果 B 继续调用了 C,原来在 A 中设置的参数也会被带到 C 
端过去,造成参数污染的问题。
+Dubbo 3 对 RpcContext 进行了重构,支持可选参数透传,默认开启参数透传。
+
+在 Dubbo 3 中提供了如下的 SPI,默认无实现,用户可以自行定义实现,`select` 的结果(可以从 RpcClientAttachment 
获取当前所有参数)将作为需要透传的键值对传递到下一跳,如果返回 null 则表示不透传参数。
+
+```java
+@SPI
+public interface PenetrateAttachmentSelector {
+
+    /**
+     * Select some attachments to pass to next hop.
+     * These attachments can fetch from {@link 
RpcContext#getServerAttachment()} or user defined.
+     *
+     * @return attachment pass to next hop
+     */
+    Map<String, Object> select();
+
+}
+```
\ No newline at end of file
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/callback-parameter.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/callback-parameter.md
index 0dfc54703d..4d01bba427 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/callback-parameter.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/callback-parameter.md
@@ -123,8 +123,4 @@ callbackService.addListener("foo.bar", new 
CallbackListener(){
         System.out.println("callback1:" + msg);
     }
 });
-```
-
-#### 提示:
-`2.0.6` 及其以上版本支持
-
+```
\ No newline at end of file
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/context.md 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/context.md
index ff4546dde1..ee7e6bcbbd 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/context.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/context.md
@@ -22,11 +22,11 @@ RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请
 // 远程调用
 xxxService.xxx();
 // 本端是否为消费端,这里会返回true
-boolean isConsumerSide = RpcContext.getContext().isConsumerSide();
+boolean isConsumerSide = RpcContext.getServiceContext().isConsumerSide();
 // 获取最后一次调用的提供方IP地址
-String serverIP = RpcContext.getContext().getRemoteHost();
+String serverIP = RpcContext.getServiceContext().getRemoteHost();
 // 获取当前服务配置信息,所有配置信息都将转换为URL的参数
-String application = 
RpcContext.getContext().getUrl().getParameter("application");
+String application = 
RpcContext.getServiceContext().getUrl().getParameter("application");
 // 注意:每发起RPC调用,上下文状态会变化
 yyyService.yyy();
 ```
@@ -38,15 +38,15 @@ public class XxxServiceImpl implements XxxService {
  
     public void xxx() {
         // 本端是否为提供端,这里会返回true
-        boolean isProviderSide = RpcContext.getContext().isProviderSide();
+        boolean isProviderSide = 
RpcContext.getServiceContext().isProviderSide();
         // 获取调用方IP地址
-        String clientIP = RpcContext.getContext().getRemoteHost();
+        String clientIP = RpcContext.getServiceContext().getRemoteHost();
         // 获取当前服务配置信息,所有配置信息都将转换为URL的参数
-        String application = 
RpcContext.getContext().getUrl().getParameter("application");
+        String application = 
RpcContext.getServiceContext().getUrl().getParameter("application");
         // 注意:每发起RPC调用,上下文状态会变化
         yyyService.yyy();
         // 此时本端变成消费端,这里会返回false
-        boolean isProviderSide = RpcContext.getContext().isProviderSide();
+        boolean isProviderSide = 
RpcContext.getServiceContext().isProviderSide();
     } 
 }
 ```
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/echo-service.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/echo-service.md
index f9fef53179..cf12052a18 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/echo-service.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/echo-service.md
@@ -6,8 +6,16 @@ weight: 12
 description: "通过回声测试检测 Dubbo 服务是否可用"
 ---
 
+## 使用场景
+
 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
 
+## 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-echo](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-echo)
+
+## 使用方式
+
 所有服务自动实现 `EchoService` 接口,只需将任意服务引用强制转型为 `EchoService`,即可使用。
 
 Spring 配置:
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/events-notify.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/events-notify.md
index 5c9c3c6a0d..48b098fef8 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/events-notify.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/events-notify.md
@@ -8,8 +8,9 @@ description: "在调用前后出现异常时的事件通知"
 ## 特性说明
 在调用之前、调用之后、出现异常时,会触发 `oninvoke`、`onreturn`、`onthrow` 
三个事件,可以配置当事件发生时,通知哪个类的哪个方法。
 
-#### 提示:
-支持版本:`2.0.7` 之后
+## 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-notify](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-notify)
 
 ## 使用场景
 
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/generic-service.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/generic-service.md
index 311388d9ae..5ab3f8b061 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/generic-service.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/generic-service.md
@@ -9,19 +9,25 @@ description: "不需要服务端API的RPC调用"
 ## 特性说明
 
 泛化调用是指在调用方没有服务方提供的API(SDK)的情况下,对服务方进行调用,并且可以正常拿到调用结果。
+
 ## 使用场景
+
 泛化调用主要用于实现一个通用的远程服务 Mock 框架,可通过实现 GenericService 接口处理所有服务请求。比如如下场景:
 
-①网关服务:如果要搭建一个网关服务,那么服务网关要作为所有RPC服务的调用端。但是网关本身不应该依赖于服务提供方的接口API(这样会导致每有一个新的服务发布,就需要修改网关的代码以及重新部署),所以需要泛化调用的支持。
+1. 
网关服务:如果要搭建一个网关服务,那么服务网关要作为所有RPC服务的调用端。但是网关本身不应该依赖于服务提供方的接口API(这样会导致每有一个新的服务发布,就需要修改网关的代码以及重新部署),所以需要泛化调用的支持。
 
-②测试平台:如果要搭建一个可以测试RPC调用的平台,用户输入分组名、接口、方法名等信息,就可以测试对应的RPC服务。那么由于同样的原因(即会导致每有一个新的服务发布,就需要修改网关的代码以及重新部署),所以平台本身不应该依赖于服务提供方的接口API。所以需要泛化调用的支持。
+2. 
测试平台:如果要搭建一个可以测试RPC调用的平台,用户输入分组名、接口、方法名等信息,就可以测试对应的RPC服务。那么由于同样的原因(即会导致每有一个新的服务发布,就需要修改网关的代码以及重新部署),所以平台本身不应该依赖于服务提供方的接口API。所以需要泛化调用的支持。
 
 ## 使用方式
+
 demo可见[dubbo 
项目中的示例代码](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-generic)
 
 API部分以此demo为例讲解使用方式。
+
 ### 服务定义
+
 #### 服务接口
+
 ``` java
 public interface HelloService {
 
@@ -35,7 +41,9 @@ public interface HelloService {
 }
 
 ```
+
 #### 服务实现类
+
 ``` java
 public class HelloServiceImpl implements HelloService {
 
@@ -94,14 +102,17 @@ public class HelloServiceImpl implements HelloService {
 }
 
 ```
+
 ### 通过API使用泛化调用
+
 #### 服务启动方
-①在设置ServiceConfig时,使用setGeneric("true")来开启泛化调用
 
-②在设置ServiceConfig时,使用setRef指定实现类时,要设置一个GenericService的对象。而不是真正的服务实现类对象
+1. 在设置 `ServiceConfig` 时,使用`setGeneric("true")`来开启泛化调用
+
+2. 在设置 `ServiceConfig` 时,使用setRef指定实现类时,要设置一个 `GenericService` 
的对象。而不是真正的服务实现类对象
 
+3. 其他设置与正常Api服务启动一致即可
 
-③其他设置与正常Api服务启动一致即可
 ``` java
 private static String zookeeperAddress = "zookeeper://" + 
System.getProperty("zookeeper.address", "127.0.0.1") + ":2181";
 
@@ -136,17 +147,17 @@ private static String zookeeperAddress = "zookeeper://" + 
System.getProperty("zo
     }
 }
 ```
+
 #### 泛化调用方
 步骤:
 
-①在设置ReferenceConfig时,使用setGeneric("true")来开启泛化调用
+1. 在设置 `ReferenceConfig` 时,使用 `setGeneric("true")` 来开启泛化调用
 
-②配置完ReferenceConfig后,使用referenceConfig.get()获取到GenericService类的实例
+2. 配置完 `ReferenceConfig` 后,使用 `referenceConfig.get()` 获取到 `GenericService` 类的实例
 
+3. 使用其 `$invoke` 方法获取结果
 
-③使用其$invoke方法获取结果
-
-④其他设置与正常Api服务启动一致即可
+4. 其他设置与正常 Api 服务启动一致即可
 
 ``` java
     //定义泛化调用服务类
@@ -193,21 +204,24 @@ private static String zookeeperAddress = "zookeeper://" + 
System.getProperty("zo
         System.err.println("invokeSayHello(return): " + result);
         latch.await();
     }
-
 ```
+
 ### 通过Spring使用泛化调用
 Spring中服务暴露与服务发现有多种使用方式,如xml,注解。这里以xml为例。
 步骤:
 
-①生产者端无需改动
+1. 生产者端无需改动
+
+2. 消费者端原有的 `dubbo:reference` 标签加上 `generic=true` 的属性。
 
-②消费者端原有的reference标签加上generic=true的属性。
 ``` xml
    <dubbo:reference id="helloService" generic = "true" 
interface="org.apache.dubbo.samples.generic.call.api.HelloService"/>
 ```
-③获取到Bean容器,通过Bean容器拿到GenericService实例。
 
-④调用$invoke方法获取结果
+3. 获取到 Bean 容器,通过 Bean 容器拿到 `GenericService` 实例。
+
+4. 调用 `$invoke` 方法获取结果
+
 ``` java
 
     private static GenericService genericService;
@@ -221,45 +235,11 @@ Spring中服务暴露与服务发现有多种使用方式,如xml,注解。
         Object result = genericService.$invoke("sayHello", new 
String[]{"java.lang.String"}, new Object[]{"world"});
     }
 ```
-## 注意事项
-
-①如果参数为基本类型或者Date,List,Map等,则不需要转换,直接调用。
 
-②如果参数为其他POJO,则使用Map代替。
 
-如:
-``` java
-public class Student {
-    String name;
-    int age;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age = age;
-    }
-}
-
-```
-在调用时应该转换为:
-``` java
-Map<String, Object> student = new HashMap<String, Object>();
-student.put("name", "xxx");
-student.put("age", "xxx");
-```
-③对于其他序列化格式,需要特殊配置
 ### Protobuf对象泛化调用
-一般泛化调用只能用于生成的服务参数为POJO的情况,而 GoogleProtobuf 的对象是基于 Builder 生成的非正常POJO,可以通过 
protobuf-json 泛化调用。  
+
+一般泛化调用只能用于生成的服务参数为POJO的情况,而 GoogleProtobuf 的对象是基于 Builder 生成的非正常POJO,可以通过 
protobuf-json 泛化调用。
 
 GoogleProtobuf 序列化相关的Demo可以参考 
[protobuf-demo](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-protobuf)
 
@@ -352,3 +332,45 @@ Google Protobuf 对象缺少标准的 JSON 格式,生成的服务元数据信
 ```
 
 从服务元数据中也可以比较容易构建泛化调用对象。
+
+
+## 注意事项
+
+1. 如果参数为基本类型或者Date,List,Map等,则不需要转换,直接调用。
+
+2. 如果参数为其他POJO,则使用Map代替。
+
+如:
+``` java
+public class Student {
+    String name;
+    int age;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+}
+
+```
+
+在调用时应该转换为:
+
+``` java
+Map<String, Object> student = new HashMap<String, Object>();
+student.put("name", "xxx");
+student.put("age", "xxx");
+```
+
+3. 对于其他序列化格式,需要特殊配置
\ No newline at end of file
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/group-merger.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/group-merger.md
index 9af8704700..9b57b0fe2d 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/group-merger.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/group-merger.md
@@ -64,7 +64,4 @@ description: "通过分组对结果进行聚合并返回聚合后的结果"
 <dubbo:reference interface="com.xxx.MenuService" group="*">
     <dubbo:method name="getMenuItems" merger=".addAll" />
 </dubbo:reference>
-```
-
-#### 提示:
-从 `2.1.0` 版本开始支持
+```
\ No newline at end of file
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/local-mock.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/local-mock.md
index 1bd90601cb..081b8421f3 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/local-mock.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/local-mock.md
@@ -97,8 +97,6 @@ public class DemoService {
 
 ### 使用 force 和 fail 关键字来配置 Mock 的行为
 
-在 `2.6.6` 以上的版本,可以开始在 Spring XML 配置文件中使用 `fail:` 和 `force:`。
-
 `force:` 代表强制使用 Mock 行为,在这种情况下不会走远程调用。
 
 `fail:` 与默认行为一致,只有当远程调用发生错误时才使用 Mock 行为。也就是说,配置的时候其实是可以不使用 `fail` 关键字的,直接使用 
`throw` 或者 `return` 就可以了。 
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/parameter-validation.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/parameter-validation.md
index 24f708ab4e..ea65a9a911 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/parameter-validation.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/parameter-validation.md
@@ -33,6 +33,10 @@ description: "在 dubbo3 中进行参数校验"
 
 服务端在向外提供接口服务时,解决各种接口参数校验问题。
 
+## 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-validation](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-validation)
+
 ## 使用方式
 
 #### 参数标注示例
@@ -201,7 +205,6 @@ public class ValidationConsumer {
 ```
 
 #### 提示:
-自 `2.1.0` 版本开始支持, 如何使用 [dubbo 
项目中的示例代码](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-validation)
 
 验证方式可扩展,扩展方式参见开发者手册中的 
[验证扩展](../../../reference-manual/spi/description/validation)
 
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/result-cache.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/result-cache.md
index 5f34f506ad..0fa91adac1 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/result-cache.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/rpc/result-cache.md
@@ -33,7 +33,4 @@ description: "通过缓存结果加速访问速度"
 <dubbo:reference interface="com.foo.BarService">
     <dubbo:method name="findBar" cache="lru" />
 </dubbo:reference>
-```
-
-#### 提示:
-`2.1.0` 以上版本支持。
+```
\ No newline at end of file
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/tls.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/tls.md
index c0118fd79b..d4a9e83515 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/tls.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/tls.md
@@ -6,7 +6,8 @@ weight: 1
 description: " 了解在 dubbo3 的 TLS 保证传输安全"
 ---
 ## 特性说明
-2.7.5 版本在传输链路的安全性上做了很多工作,对于内置的 Dubbo Netty Server 和新引入的 gRPC 协议都提供了基于 TLS 
的安全链路传输机制。
+
+内置的 Dubbo Netty Server 和新引入的 gRPC 协议都提供了基于 TLS 的安全链路传输机制。
 
 TLS 的配置都有统一的入口。
 #### 配置类型
@@ -14,6 +15,13 @@ TLS 的配置都有统一的入口。
 - Consumer 端
 
 ## 使用场景
+
+对全链路有加密需求的用户可以使用 TLS。
+
+## 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-ssl](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-ssl)
+
 ## 使用方式
 
 ##### Provider 端
@@ -44,7 +52,7 @@ if (!mutualTls) {}
 }
 ```
 
-为尽可能保证应用启动的灵活性,TLS Cert 的指定还能通过 -D 参数或环境变量等方式来在启动阶段根据部署环境动态指定,参考 Dubbo 
[配置读取规则](/zh/docs/advanced/config-rule),TLS 
[示例](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-ssl)
+为尽可能保证应用启动的灵活性,TLS Cert 的指定还能通过 -D 参数或环境变量等方式来在启动阶段根据部署环境动态指定,参考 Dubbo 
[配置读取规则](/zh/docs/advanced/config-rule)
 
 #### 提示:
 在服务调用的安全性上,Dubbo 在后续的版本中会持续投入,其中服务发现/调用的鉴权机制预计在接下来的版本中就会和大家见面。
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/token-authorization.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/token-authorization.md
index 8dcfa99a82..b0d0b9d82a 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/token-authorization.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/security/token-authorization.md
@@ -5,12 +5,14 @@ linkTitle: "权限控制"
 weight: 2
 description: "了解 dubbo3 权限控制的配置和使用"
 ---
+
 ## 特性说明:
 通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,
 可以防止消费者绕过注册中心访问提供者,
 另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。
 
 ![/user-guide/images/dubbo-token.jpg](/imgs/user/dubbo-token.jpg)
+
 #### 设置类型:
 - 全局设置
 - 服务级别设置
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/multi-versions.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/multi-versions.md
index bd9f3a0d9c..32c864aa08 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/multi-versions.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/multi-versions.md
@@ -5,6 +5,7 @@ linkTitle: "服务分版本"
 weight: 1
 description: "在 Dubbo 中为同一个服务配置多个版本"
 ---
+
 ## 特性说明
 按照以下的步骤进行版本迁移:
 
@@ -18,6 +19,11 @@ description: "在 Dubbo 中为同一个服务配置多个版本"
 
 ## 使用场景
 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
+
+## 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-version](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-version)
+
 ## 使用方式
 - 服务提供者
 老版本服务提供者配置:
@@ -43,6 +49,4 @@ description: "在 Dubbo 中为同一个服务配置多个版本"
 如果不需要区分版本,可以按照以下的方式配置:
 ```xml
 <dubbo:reference id="barService" interface="com.foo.BarService" version="*" />
-```
-#### 提示:
-`2.2.0` 以上版本支持
+```
\ No newline at end of file
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-downgrade.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-downgrade.md
index 07790c44c4..4590415a7c 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-downgrade.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-downgrade.md
@@ -6,8 +6,14 @@ weight: 3
 description: "降级 Dubbo 服务"
 ---
 
+推荐使用相关限流降级组件(如 
[Sentinel](https://sentinelguard.io/zh-cn/docs/open-source-framework-integrations.html))以达到最佳体验。
+
+## 使用场景
+
 可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
 
+## 使用方式
+
 向注册中心写入动态配置覆盖规则:
 
 ```java
@@ -20,8 +26,3 @@ 
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=co
 
 * `mock=force:return+null` 表示消费方对该服务的方法调用都直接返回 null 
值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
 * 还可以改为 `mock=fail:return+null` 表示消费方对该服务的方法调用在失败后,再返回 null 
值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
-
-{{% alert title="提示" color="primary" %}}
-`2.2.0` 以上版本支持
-{{% /alert %}}
-
diff --git 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-group.md
 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-group.md
index 722f7efe8f..742a996bcc 100644
--- 
a/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-group.md
+++ 
b/content/zh/docs3-building/java-sdk/advanced-features-and-usage/service/service-group.md
@@ -5,8 +5,10 @@ linkTitle: "服务分组"
 weight: 2
 description: "使用服务分组区分服务接口的不同实现"
 ---
+
 # 特性说明
 
同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景,可使用服务分组来区分不同的实现方式。同时,这些不同实现所提供的服务是可并存的,也支持互相调用。
+
 ## 配置
 - 服务提供端
 - 服务消费端
@@ -14,12 +16,19 @@ description: "使用服务分组区分服务接口的不同实现"
 # 使用场景
 当一个接口有多种实现时,可以用 group 区分。
 
+# 参考用例
+
+[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-group](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-group)
+
 # 使用方式
 
Dubbo服务分组可选择使用[注解配置](#properties1)、[xml配置](#properties2)或[API配置](#properties3)方式
 
-## <a id="properties1">注解配置</a>
+## 注解配置
+
 ### 服务提供端
+
 使用@DubboService注解,添加group参数
+
 ```java
 @DubboService(group = "demo")
 public class DemoServiceImpl implements DemoService {
@@ -31,11 +40,15 @@ public class Demo2ServiceImpl implements DemoService {
  ...
 }
 ```
+
 启动Dubbo服务,可在注册中心看到相同服务名不同分组的服务,以Nacos作为注册中心为例,显示如下内容:
+
 ![image-service-group-1.png](/imgs/blog/service-group-1.png)
 
 ### 服务消费端
+
 使用@DubboReference注解,添加group参数
+
 ```java
 @DubboReference(group = "demo")
 private DemoService demoService;
@@ -47,12 +60,16 @@ private DemoService demoService2;
 @DubboReference(group = "*")
 private DemoService demoService2;
 ```
+
 同样启动Dubbo服务后,可在注册中心看到相同服务名不同分组的引用者,以Nacos作为注册中心为例,显示如下内容:
 ![image-service-group-2.png](/imgs/blog/service-group-2.png)
 
-## <a id="properties2">xml配置</a>
+## xml配置
+
 ### 服务提供端
+
 使用<dubbo:service />标签,添加group参数
+
 ```xml
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans";
@@ -69,11 +86,15 @@ private DemoService demoService2;
 ...
 </beans>
 ```
+
 启动Dubbo服务,可在注册中心看到相同服务名不同分组的服务,以Nacos作为注册中心为例,显示如下内容:
+
 ![image-service-group-1.png](/imgs/blog/service-group-1.png)
 
 ### 服务消费端
+
 使用<dubbo:reference/>注解,添加group参数
+
 ```xml
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans";
@@ -94,12 +115,17 @@ private DemoService demoService2;
     ...
 </beans>
 ```
+
 同样启动Dubbo服务后,可在注册中心看到相同服务名不同分组的引用者,以Nacos作为注册中心为例,显示如下内容:
+
 ![image-service-group-2.png](/imgs/blog/service-group-2.png)
 
-## <a id="properties3">API配置</a>
+## API配置
+
 ### 服务提供端
+
 使用org.apache.dubbo.config.ServiceConfig类,添加group参数
+
 ```java
 // ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
 // 请自行缓存,否则可能造成内存和连接泄漏
@@ -112,13 +138,16 @@ ServiceConfig<DemoService> service2 = new 
ServiceConfig<>();
 service.setInterface(DemoService.class);
 service.setGroup("demo2");
 ...
-
 ```
+
 启动Dubbo服务,可在注册中心看到相同服务名不同分组的服务,以Nacos作为注册中心为例,显示如下内容:
+
 ![image-service-group-1.png](/imgs/blog/service-group-1.png)
 
 ### 服务消费端
+
 使用org.apache.dubbo.config.ReferenceConfig,添加group参数
+
 ```java
 // ReferenceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
 // 请自行缓存,否则可能造成内存和连接泄漏
@@ -141,6 +170,6 @@ reference3.setGroup("*");
 同样启动Dubbo服务后,可在注册中心看到相同服务名不同分组的引用者,以Nacos作为注册中心为例,显示如下内容:
 ![image-service-group-2.png](/imgs/blog/service-group-2.png)
 
-{{% alert title="提示" color="primary" %}}
-`2.2.0` 以上版本支持,总是只调一个可用组的实现
-{{% /alert %}}
+### 提示
+
+总是**只调**一个可用组的实现
diff --git a/static/imgs/v3/concepts/rpccontext.png 
b/static/imgs/v3/concepts/rpccontext.png
new file mode 100644
index 0000000000..eaaeb57a31
Binary files /dev/null and b/static/imgs/v3/concepts/rpccontext.png differ

Reply via email to