You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eventmesh.apache.org by xi...@apache.org on 2022/05/24 21:14:44 UTC

[incubator-eventmesh] branch readme created (now acf60ee2)

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

xiaoyang pushed a change to branch readme
in repository https://gitbox.apache.org/repos/asf/incubator-eventmesh.git


      at acf60ee2 Update the README.md

This branch includes the following new commits:

     new acf60ee2 Update the README.md

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



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@eventmesh.apache.org
For additional commands, e-mail: commits-help@eventmesh.apache.org


[incubator-eventmesh] 01/01: Update the README.md

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

xiaoyang pushed a commit to branch readme
in repository https://gitbox.apache.org/repos/asf/incubator-eventmesh.git

commit acf60ee24f57d2d6d374682aabf41d5cb58d0e18
Author: Xiaoyang Liu <si...@gmail.com>
AuthorDate: Tue May 24 14:14:32 2022 -0700

    Update the README.md
    
    Signed-off-by: Xiaoyang Liu <si...@gmail.com>
---
 README.md                                          | 113 ++--
 docs/en/contribute/01-release.md                   | 731 +++++++++++++++++++++
 docs/en/contribute/02-write-unit-test.md           |  77 +++
 .../design-document => contribute}/_category_.json |   2 +-
 .../{design-document => }/01-workflow.md           |  39 +-
 .../{design-document => }/02-runtime-protocol.md   |   6 +-
 .../{design-document => }/03-stream.md             |  25 +-
 .../{design-document => }/04-schema-registry.md    |  50 +-
 .../{design-document => }/05-metrics-export.md     |   0
 .../{design-document => }/06-cloudevents.md        |   2 +-
 .../{design-document => }/07-tracing.md            |  12 +-
 .../{design-document => }/08-spi.md                |  13 +-
 .../{design-document => }/_category_.json          |   2 +-
 .../{01-eventmesh-runtime.md => 01-runtime.md}     |   0
 ...me-with-docker.md => 02-runtime-with-docker.md} |   0
 .../{03-eventmesh-store.md => 03-store.md}         |   0
 docs/en/instructions/eventmesh-unit-test-rule.md   | 128 ----
 docs/en/introduction.md                            |  12 +-
 docs/en/sdk-java/01-introduction.md                |  28 +-
 docs/en/sdk-java/02-http.md                        |   2 +-
 docs/en/sdk-java/03-tcp.md                         |   8 +-
 docs/en/sdk-java/04-grpc.md                        |   4 +-
 .../wechat-assistant.jpg}                          | Bin
 docs/images/{ => contact}/wechat-official.jpg      | Bin
 .../async-message.png}                             | Bin
 .../broadcast-message.png}                         | Bin
 .../cloudevents-pluggable-protocols.png            | Bin
 .../schema-registry-architecture.png}              | Bin
 .../schema-registry-process.jpg}                   | Bin
 .../schema-registry-project-structure.png}         | Bin
 .../stream-architecture.png}                       | Bin
 .../stream-component-interface.png}                | Bin
 .../stream-component-routes.png}                   | Bin
 .../stream-event-driven-consumer.png}              | Bin
 .../stream-sync-producer.png}                      | Bin
 .../sync-message.png}                              | Bin
 .../workflow-architecture.jpg}                     | Bin
 .../workflow-diagram.png}                          | Bin
 .../workflow-use-case.jpg}                         | Bin
 docs/images/eventmesh-architecture.png             | Bin 1170111 -> 119157 bytes
 docs/images/eventmesh-bridge.png                   | Bin 257492 -> 42076 bytes
 docs/images/eventmesh-orchestration.png            | Bin 2779741 -> 104648 bytes
 docs/images/logo.svg                               |  19 -
 .../eventmesh-architecture.png                     | Bin
 .../eventmesh-architecture.svg                     |   0
 docs/{images => test-images}/eventmesh-bridge.png  | Bin
 docs/{images => test-images}/eventmesh-bridge.svg  |   0
 .../eventmesh-ecosystem.png                        | Bin
 .../eventmesh-federation.png                       | Bin
 .../eventmesh-orchestration.png                    | Bin
 .../eventmesh-orchestrator.png                     | Bin
 .../eventmesh-orchestrator.svg                     |   0
 .../eventmesh-stream-arch.png                      | Bin
 docs/{images => test-images}/eventmesh.png         | Bin
 docs/test-images/favicon.ico                       | Bin 0 -> 1595 bytes
 .../features/cloudevents-pluggable-protocols.png   | Bin
 .../features/eventmesh-schemaregistry-arch.png     | Bin
 .../features/eventmesh-schemaregistry-process.jpg  | Bin
 .../eventmesh-schemaregistry-projectstructure.png  | Bin
 .../eventmesh-stream-component-interface.png       | Bin
 .../features/eventmesh-stream-component-routes.png | Bin
 .../eventmesh-stream-event_driven-consumer.png     | Bin
 .../features/eventmesh-stream-sync-producer.png    | Bin
 .../features/eventmesh-workflow-arch.jpg           | Bin
 .../features/eventmesh-workflow-diag.png           | Bin
 .../features/eventmesh-workflow-usecase.jpg        | Bin
 docs/test-images/incubator-logo.png                | Bin 0 -> 17961 bytes
 docs/test-images/logo.png                          | Bin 0 -> 58522 bytes
 docs/{images => test-images}/logo.svg              |   0
 .../protocol/eventmesh-async-message.png           | Bin
 .../protocol/eventmesh-broadcast-message.png       | Bin
 .../protocol/eventmesh-sync-message.png            | Bin
 docs/{cn => zh}/documentation/_category_.json      |   0
 docs/{cn => zh}/features/_category_.json           |   0
 docs/{cn => zh}/features/https.md                  |   0
 docs/{cn => zh}/features/spi.md                    |   0
 docs/{cn => zh}/instructions/_category_.json       |   0
 docs/{cn => zh}/instructions/eclipse.md            |   0
 .../eventmesh-metrics-Prometheus-instruction.md    |   0
 .../instructions/eventmesh-runtime-protocol.md     |   0
 .../eventmesh-runtime-quickstart-with-docker.md    |   0
 .../instructions/eventmesh-runtime-quickstart.md   |   0
 .../instructions/eventmesh-sdk-java-quickstart.md  |   0
 .../instructions/eventmesh-store-quickstart.md     |   0
 .../eventmesh-trace-Zipkin-instruction.md          |   0
 .../instructions/eventmesh-unit-test-rule.md       |   0
 docs/{cn => zh}/instructions/quickstart.md         |   0
 docs/{cn => zh}/intro.md                           |   0
 88 files changed, 961 insertions(+), 312 deletions(-)

diff --git a/README.md b/README.md
index 02f6ead7..9784c106 100644
--- a/README.md
+++ b/README.md
@@ -1,86 +1,89 @@
 # Apache EventMesh (Incubating)
 
-[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
-[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh)
-[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
-[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
-[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases)
-[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
-[![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://join.slack.com/t/apacheeventmesh/shared_invite/zt-16y1n77va-q~JepYy3RqpkygDYmQaQbw)
+<div align="center">
 
-[点我查看中文版](README.zh-CN.md)
+<img src="docs/images/logo.png" width="256">
 
-![logo](docs/images/logo2.png)
+<br />
 
-## What is EventMesh?
+[![CI status](https://img.shields.io/github/workflow/status/apache/incubator-eventmesh/Continuous%20Integration?logo=github&style=for-the-badge)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml)
+[![CodeCov](https://img.shields.io/codecov/c/gh/apache/incubator-eventmesh/master?logo=codecov&style=for-the-badge)](https://codecov.io/gh/apache/incubator-eventmesh)
+[![Code Quality: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18&style=for-the-badge)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java)
+[![Total Alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18&style=for-the-badge)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/)
 
-EventMesh(incubating) is a dynamic event-driven application runtime used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks.
+[![License](https://img.shields.io/github/license/apache/incubator-eventmesh?style=for-the-badge)](https://www.apache.org/licenses/LICENSE-2.0.html)
+[![GitHub Release](https://img.shields.io/github/v/release/apache/eventmesh?style=for-the-badge)](https://github.com/apache/incubator-eventmesh/releases)
+[![Slack Status](https://img.shields.io/badge/slack-join_chat-blue.svg?logo=slack&style=for-the-badge)](https://join.slack.com/t/apacheeventmesh/shared_invite/zt-16y1n77va-q~JepYy3RqpkygDYmQaQbw)
 
-**Multi-runtime:**
-![architecture1](docs/images/eventmesh-architecture.png)
+[📦 Documentation](https://eventmesh.apache.org/docs/introduction) |
+[📔 Examples](https://github.com/apache/incubator-eventmesh/tree/master/eventmesh-examples) |
+[⚙️ Roadmap](https://eventmesh.apache.org/docs/roadmap) |
+[🖥️ 简体中文](README.zh-CN.md)
+</div>
 
-**Orchestrator:**
-![architecture1](docs/images/eventmesh-orchestrator.png)
+## What is EventMesh
 
-**Data Mesh:**
-![architecture1](docs/images/eventmesh-bridge.png)
+**Apache EventMesh (Incubating)** is a dynamic event-driven application runtime used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks.
 
-**Components:**
+[EventMesh](https://solace.com/what-is-an-event-mesh) is an architecture layer that provides dynamic distribution of events, thus event consumers could receive events from any event producer, no matter where the producer and consumer are attached to the mesh, without the need for configuration of event routing. It is enabled by a network of interconnected [event brokers](https://solace.com/what-is-an-event-broker/) and bridges applications and services in an [event-driven architecture](h [...]
 
-* **eventmesh-runtime** : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices.
-* **eventmesh-sdk-java** : currently supports HTTP and TCP protocols.
-* **eventmesh-connector-plugin** : plugins for connect a middleware such as RocketMQ/Kafka/Redis/Pulsar etc.
-* **eventmesh-registry-plugin** : plugins for registry adapter, such as Nacos/Etcd.
-* **eventmesh-security-plugin** : plugins for security adpater, such as ACL/Authentication/Authorization.
-* **eventmesh-protocol-plugin** : plugins for protocol adapter, such as CloudEvents/MQTT.
-* **eventmesh-admin** : clients,topics,subscriptions and other management.
+### Multi-Runtime Architecture
 
-## Quick Start
+![EventMesh Architecture](docs/images/eventmesh-architecture.png)
 
-1. [Store quickstart](docs/en/instructions/eventmesh-store-quickstart.md)
-2. [Runtime quickstart](docs/en/instructions/eventmesh-runtime-quickstart.md) or [Runtime quickstart with docker](docs/en/instructions/eventmesh-runtime-quickstart-with-docker.md).
-3. [Java SDK examples](docs/en/instructions/eventmesh-sdk-java-quickstart.md).
+### Orchestration
 
-## Documentation
+![EventMesh Orchestration](docs/images/eventmesh-orchestration.png)
 
-See EventMesh [Documentation](docs/en/intro.md) for all documents.
+### Data Mesh
 
-## Roadmap
+![EventMesh Data Mesh](docs/images/eventmesh-bridge.png)
 
-See EventMesh [Roadmap](docs/en/roadmap.md) for details.
+## Components
+
+Apache EventMesh (Incubating) consists of multiple components that integrate different middlewares and messaging protocols to enhance the functionalities of the application runtime.
+
+- **eventmesh-runtime**: The middleware that transmits events between producers and consumers, which supports cloud-native apps and microservices.
+- **eventmesh-sdk-java**: The Java SDK that supports HTTP, HTTPS, TCP, and [gRPC](https://grpc.io) protocols.
+- **eventmesh-connector-plugin**: The collection of plugins that connects middlewares such as [Apache Kafka](https://kafka.apache.org), [Apache RocketMQ](https://rocketmq.apache.org), [Apache Pulsar](https://pulsar.apache.org/), and [Redis](https://redis.io).
+- **eventmesh-registry-plugin**: The collection of plugins that integrate service registries such as [Nacos](https://nacos.io) and [etcd](https://etcd.io).
+- **eventmesh-security-plugin**: The collection of plugins that implement security mechanisms, such as ACL (access control list), authentication, and authorization.
+- **eventmesh-protocol-plugin**: The collection of plugins that implement messaging protocols, such as [CloudEvents](https://cloudevents.io) and [MQTT](https://mqtt.org).
+- **eventmesh-admin**: The control plane that manages clients, topics, and subscriptions.
 
 ## Contributing
 
-Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines.
+Each contributor has played an important role in promoting the robust development of Apache EventMesh (Incubating). We sincerely appreciate all contributors who have contributed code and documents.
 
-You can start with the issues labeled with good first issue.
-[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues)
+- [Contributing Guideline](https://eventmesh.apache.org/docs/contribute/contribute)
+- [List of Contributors](https://github.com/apache/incubator-eventmesh/graphs/contributors)
+- [Good First Issues](https://github.com/apache/incubator-eventmesh/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)
 
-## Landscape
+## CNCF Landscape
 
-<p align="center">
-<br/><br/>
-<img src="https://landscape.cncf.io/images/left-logo.svg" width="150"/>&nbsp;&nbsp;<img src="https://landscape.cncf.io/images/right-logo.svg" width="200"/>
-<br/><br/>
-EventMesh enriches the <a href="https://landscape.cncf.io/serverless?license=apache-license-2-0">CNCF CLOUD NATIVE Landscape.</a>
-</p>
+<div align="center">
 
-## License
+<img src="https://landscape.cncf.io/images/left-logo.svg" width="150"/>
+<img src="https://landscape.cncf.io/images/right-logo.svg" width="200"/>
 
-[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation.
+Apache EventMesh (Incubating) enriches the <a href="https://landscape.cncf.io/serverless?license=apache-license-2-0">CNCF Cloud Native Landscape.</a>
 
-## Community
+</div>
 
-|              WeChat Assistant                           |                WeChat public account                   | Slack                                                  |
-| :----------------------------------------------------:  | :----------------------------------------------------: | :----------------------------------------------------: |
-| ![wechat_qr](docs/images/mesh-helper.jpg) | ![wechat_official_qr](docs/images/wechat-official.png) |[Join slack chat](https://join.slack.com/t/apacheeventmesh/shared_invite/zt-16y1n77va-q~JepYy3RqpkygDYmQaQbw) |
+## License
+
+Apache EventMesh (Incubating) is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)
 
+## Community
 
+|WeChat Assistant|WeChat Official Account|Slack|
+|-|-|-|
+|<img src="docs/images/contact/wechat-assistant.jpg" width="128"/>|<img src="docs/images/contact/wechat-official.jpg" width="128"/>|[Join Slack Chat](https://join.slack.com/t/apacheeventmesh/shared_invite/zt-16y1n77va-q~JepYy3RqpkygDYmQaQbw)|
 
-Mailing Lists:
+### Mailing List
 
-| Name | Description |Subscribe |Unsubscribe|Archive
-| ----    | ----    |----    | ----    | ----    |
-|Users |User support and questions mailing list| [Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)|
-|Development |Development related discussions| [Subscribe](mailto:dev-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:dev-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?dev@eventmesh.apache.org)|
-|Commits |All commits to repositories| [Subscribe](mailto:commits-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:commits-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?commits@eventmesh.apache.org)|
+|Name|Description|Subscribe|Unsubscribe|Archive
+|-|-|-|-|-|
+|Users|User discussion|[Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org)|[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org)|[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)|
+|Development|Development discussion (Design Documents, Issues, etc.)|[Subscribe](mailto:dev-subscribe@eventmesh.incubator.apache.org)|[Unsubscribe](mailto:dev-unsubscribe@eventmesh.incubator.apache.org)|[Mail Archives](https://lists.apache.org/list.html?dev@eventmesh.apache.org)|
+|Commits|Commits to related repositories| [Subscribe](mailto:commits-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:commits-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?commits@eventmesh.apache.org)|
diff --git a/docs/en/contribute/01-release.md b/docs/en/contribute/01-release.md
new file mode 100644
index 00000000..0810a757
--- /dev/null
+++ b/docs/en/contribute/01-release.md
@@ -0,0 +1,731 @@
+# Release Creation Process
+
+:::caution
+The documentation of Release Creation Process is WIP (Work-in-Progress).
+:::
+
+## 理解 Apache 发布的内容和流程
+
+Source Release 是 Apache 关注的重点,也是发布的必须内容;而 Binary Release 是可选项,
+
+请参考以下链接,找到更多关于 ASF 的发布指南:
+
+- [Apache Release Guide](http://www.apache.org/dev/release-publishing)
+- [Apache Release Policy](http://www.apache.org/dev/release.html)
+- [Maven Release Info](http://www.apache.org/dev/publishing-maven-artifacts.html)
+
+
+## 本地构建环境准备
+
+主要包括签名工具、Maven 仓库认证相关准备
+
+### 1.安装GPG
+
+在[GnuPG官网](https://www.gnupg.org/download/index.html)下载安装包。GnuPG的1.x版本和2.x版本的命令有细微差别,下列说明以**GnuPG-2.x**版本为例
+
+```sh
+$ gpg --version #检查版本,应该为2.x
+```
+
+### 2.用gpg生成key
+
+根据提示,生成 key
+
+> 注意:请使用Apache邮箱生成GPG的Key
+
+```shell
+$ gpg --full-gen-key
+gpg (GnuPG) 2.0.12; Copyright (C) 2009 Free Software Foundation, Inc.
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Please select what kind of key you want:
+  (1) RSA and RSA (default)
+  (2) DSA and Elgamal
+  (3) DSA (sign only)
+  (4) RSA (sign only)
+Your selection? 1
+RSA keys may be between 1024 and 4096 bits long.
+What keysize do you want? (2048) 4096
+Requested keysize is 4096 bits
+Please specify how long the key should be valid.
+        0 = key does not expire
+     <n>  = key expires in n days
+     <n>w = key expires in n weeks
+     <n>m = key expires in n months
+     <n>y = key expires in n years
+Key is valid for? (0)
+Key does not expire at all
+Is this correct? (y/N) y
+
+GnuPG needs to construct a user ID to identify your key.
+
+Real name: ${输入用户名}
+Email address: ${邮箱地址}
+Comment: CODE SIGNING KEY
+You selected this USER-ID:
+   "${输入用户名} (CODE SIGNING KEY) <${邮箱地址}>"
+
+Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
+You need a Passphrase to protect your secret key. # 填入密码,以后打包过程中会经常用到
+```
+
+### 3.查看 key
+
+```shell
+$ gpg --list-keys
+pub   rsa4096/579C25F5 2021-04-26 # 579C25F5就是key id
+uid           [ultimate] ${输入用户名} <${邮箱地址}>
+sub   rsa4096 2021-04-26
+
+# 通过key id发送public key到keyserver
+$ gpg --keyserver pgpkeys.mit.edu --send-key 579C25F5
+# 其中,pgpkeys.mit.edu为随意挑选的keyserver,keyserver列表为:https://sks-keyservers.net/status/,相互之间是自动同步的,选任意一个都可以。
+$ gpg --keyserver hkp://pgpkeys.mit.edu --recv-keys 579C25F5 # 验证是否同步到公网,网络不好可能需多试几次
+```
+
+**注:如果有多个 public key,设置默认 key。**修改`~/.gnupg/gpg.conf`
+
+```sh
+# If you have more than 1 secret key in your keyring, you may want to
+# uncomment the following option and set your preferred keyid.
+default-key 28681CB1
+```
+
+**如果有多个 public key, 也可以删除无用的 key:**
+
+```shell
+$ gpg --delete-secret-keys 29BBC3CB # 先删除私钥,指明key id
+gpg (GnuPG) 2.2.27; Copyright (C) 2021 g10 Code GmbH
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+sec  rsa4096/EE8DAE7D29BBC3CB 2021-04-27 mikexue <mi...@apache.org>
+
+Delete this key from the keyring? (y/N) y
+This is a secret key! - really delete? (y/N) y
+```
+
+```shell
+$ gpg --delete-keys 29BBC3CB # 删除公钥,指明key id
+gpg (GnuPG) 2.2.27; Copyright (C) 2021 g10 Code GmbH
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+
+pub  rsa4096/EE8DAE7D29BBC3CB 2021-04-27 mikexue <mi...@apache.org>
+
+Delete this key from the keyring? (y/N) y
+```
+
+由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性。 通常,你可以在网站上公布一个公钥指纹,让其他人核对下载到的公钥是否为真。
+
+```shell
+# fingerprint参数生成公钥指纹:
+$gpg --fingerprint mikexue
+pub   rsa4096 2021-04-26 [SCA]
+      F84A 0041 D70B 37AF 9C7B  F0B3 39F4 29D7 579C 25F5
+uid           [ultimate] mikexue <mi...@apache.org>
+sub   rsa4096 2021-04-26 [E]
+```
+
+登录 [https://id.apache.org](https://id.apache.org/), 将上面的 fingerprint (即 F84A 0041 D70B 37AF 9C7B  F0B3 39F4 29D7 579C 25F5) 粘贴到自己的用户信息中 OpenPGP Public Key Primary Fingerprint
+
+
+
+## 发布Apache Maven仓库
+
+> 注:EventMesh使用Gradle构建,需修改gradle相关配置
+
+### 1.导出私钥文件
+
+```shell
+$ gpg --export-secret-keys -o secring.gpg #私钥文件妥善保管,后面配置需要
+```
+
+### 2.准备分支
+
+从主干分支拉取新分支作为发布分支,如现在要发布$`{release_version}`版本,则从develop分支拉出新分支`${release_version}-release`,此后`${release_version}` Release Candidates涉及的修改及打标签等都在`${release_version}-release`分支进行,最终发布完成后合入主干分支。
+
+### 3.更新版本说明
+
+更新官网项目的如下文件,并提交至master分支:
+
+https://github.com/apache/incubator-eventmesh-site/tree/master/events/release-notes
+
+### 4.配置根项目下gradle.properties文件
+
+```shell
+group=org.apache.eventmesh
+version=1.2.0-release
+#40位公钥的最后8位
+signing.keyId=579C25F5
+#生成密钥时填的passphrase
+signing.password=
+#导出的私钥文件secring.gpg路径
+signing.secretKeyRingFile=../secring.gpg
+#apache 账号
+apacheUserName=
+#apache 密码
+apachePassWord=
+```
+
+### 5.检查子模块下gradle.properties文件
+
+```shell
+group=org.apache.eventmesh
+version=${release_version}
+```
+
+### 6.检查并配置根项目下build.gradle文件
+
+```shell
+publishing {
+    publications {
+        mavenJava(MavenPublication) {
+            from components.java
+            artifact packageSources
+            artifact packageJavadoc
+            versionMapping {
+                usage('java-api') {
+                    fromResolutionOf('runtimeClasspath')
+                }
+                usage('java-runtime') {
+                    fromResolutionResult()
+                }
+            }
+            pom {
+                name = 'EventMesh'
+                description = 'Apache EventMesh'
+                url = 'https://github.com/apache/incubator-eventmesh'
+                licenses {
+                    license {
+                        name = 'The Apache License, Version 2.0'
+                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                    }
+                }
+                developers {
+                    developer {
+                        id = 'Apache EventMesh(incubating)'
+                        name = 'Apache EventMesh(incubating) of ASF'
+                        url = 'https://eventmesh.apache.org/'
+                    }
+                }
+                scm {
+                    connection = 'scm:git:git@github.com:apache/incubator-eventmesh.git'
+                    developerConnection = 'scm:git:git@github.com:apache/incubator-eventmesh.git'
+                    url = 'https://github.com/apache/incubator-eventmesh'
+                }
+            }
+        }
+    }
+    repositories {
+        maven {
+            def releasesRepoUrl = 'https://repository.apache.org/service/local/staging/deploy/maven2/'
+            def snapshotsRepoUrl = 'https://repository.apache.org/content/repositories/snapshots/'
+            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
+            credentials {
+                username apacheUserName
+                password apachePassWord
+            }
+
+        }
+    }
+}
+
+signing {
+    sign publishing.publications.mavenJava
+}
+```
+
+### 7.上传发布包
+
+执行如下命令,需要对jar、源码包、doc和pom等文件签名加密
+
+```shell
+$ gradle signMavenJavaPublication publish
+```
+
+上述命令执行成功后,待发布版本会自动上传到Apache的临时筹备仓库(staging repository)。所有被deploy到远程[maven仓库](http://repository.apache.org/)的Artifacts都会处于staging状态,访问https://repository.apache.org/#stagingRepositories, 使用Apache的LDAP账户登录后,就会看到上传的版本,`Repository`列的内容即为${STAGING.REPOSITORY}。 点击`Close`来告诉Nexus这个构建已经完成,只有这样该版本才是可用的。 如果电子签名等出现问题,`Close`会失败,可以通过`Activity`查看失败信息。
+
+
+
+## 发布Apache SVN仓库
+
+### 1.准备svn本机环境(Apache使用svn托管项目的发布内容)
+
+### 2.checkout到本地目录
+
+```shell
+$ svn checkout https://dist.apache.org/repos/dist/dev/incubator/eventmesh/
+# 假定本地目录为 ~/apache/eventmesh
+```
+
+### 3.添加gpg公钥
+
+添加public key到[KEYS](https://dist.apache.org/repos/dist/dev/incubator/eventmesh/KEYS)文件并提交到SVN仓库(第一次做发布的人需要做这个操作,具体操作参考KEYS文件里的说明)。KEYS主要是让参与投票的人在本地导入,用来校验sign的正确性
+
+Windows
+
+```sh
+$ gpg --list-sigs <your name> | out-file -append KEYS -encoding utf8
+$ gpg --armor --export <your name> | out-file -append KEYS -encoding utf8
+```
+
+> Mac OS/Linux
+
+```sh
+$ (gpg --list-sigs <your name> && gpg --armor --export <your name>) >> KEYS
+```
+
+### 4.添加待发布内容到SVN目录
+
+```shell
+$ cd ~/apache/eventmesh # eventmesh svn根目录
+$ mkdir ${release_version}-${rc_version}
+```
+
+#### 4.1 创建tag
+
+在`${release_version}-release`分支上创建tag,需带有rc版本,为预发布版本
+
+```shell
+$ git tag -a v{$release_version}-{$rc_version} -m "Tagging the ${release_version} first Release Candidate (Candidates start at zero)"
+$ git push origin --tags
+```
+
+#### 4.2 打包源码
+
+检查项目源码命名,将源码命名为`apache-eventmesh-${release_version}-incubating-src`,将源码打包为tar.gz格式
+
+```shell
+$ tar -czvf apache-eventmesh-${release_version}-incubating-source.tar.gz apache-eventmesh-${release_version}-incubating-src
+```
+
+#### 4.3 打包二进制
+
+> 编译上一步打包的源码
+
+检查编译后的文件命名,将二进制文件命名为`apache-eventmesh-${release_version}-incubating`
+
+> 注:需将源码根目录下的`NOTICE`文件,`DISCLAIMER-WIP`文件以及`tools/third-party-licenses`目录下的`LICENSE`文件拷贝到二进制的包中
+
+```shell
+$ gradle clean jar dist && gradle installPlugin && gradle tar -x test
+$ tar -czvf apache-eventmesh-${release_version}-incubating-bin.tar.gz apache-eventmesh-${release_version}-incubating
+```
+
+压缩source包、bin包,并将相关的压缩包拷贝到svn本地仓库下`/apache/eventmesh/${release_version}-${rc_version}`
+
+### 5.生成签名/sha512文件
+
+> 针对源码包与二进制包生成签名/sha512文件
+
+```shell
+$ for i in *.tar.gz; do echo $i; gpg --print-md SHA512 $i > $i.sha512 ; done #计算sha512
+$ for i in *.tar.gz; do echo $i; gpg --armor --output $i.asc --detach-sig $i ; done #计算签名
+```
+
+### 6.提交到Apache svn
+
+```shell
+$ cd ~/apache/eventmesh # eventmesh svn根目录
+$ svn status
+$ svn commit -m 'prepare for ${release_version}-${rc_version}'
+```
+
+
+
+## 验证Release Candidates
+
+详细检查列表请参考官方的[check list](https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist)
+
+从以下地址下载要发布的Release Candidates到本地环境:
+
+```shell
+https://dist.apache.org/repos/dist/dev/incubator/eventmesh/${release_version}-${rc_version}/
+```
+
+然后开始验证环节,验证包含但不限于以下内容和形式
+
+### 1.检查签名和hash等信息
+
+> 由于操作系统不同,检查的命令或有差异,具体可参考[官方检查步骤](https://www.apache.org/info/verification.html)
+
+#### 1.1检查sha512哈希
+
+> Mac OS/Linux
+
+```shell
+$ shasum -a apache-eventmesh-${release_version}-incubating-source.tar.gz
+#并将输出内容与 apache-eventmesh-${release_version}-${rc_version}-incubating-source.tar.gz.sha512文件内容作对比
+$ shasum -a apache-eventmesh-${release_version}-incubating-bin.tar.gz
+#并将输出内容与 apache-eventmesh-${release_version}-${rc_version}-incubating-bin.tar.gz.sha512文件内容作对比
+```
+
+> Windows
+
+```shell
+$ certUtil -hashfile apache-eventmesh-${release_version}-incubating-source.tar.gz SHA512
+#并将输出内容与 apache-eventmesh-${release_version}-${rc_version}-incubating-source.tar.gz.sha512文件内容作对比
+$ certUtil -hashfile apache-eventmesh-${release_version}-incubating-bin.tar.gz SHA512
+#并将输出内容与 apache-eventmesh-${release_version}-${rc_version}-incubating-bin.tar.gz.sha512文件内容作对比
+```
+
+#### 1.2检查gpg签名
+
+首先导入发布人公钥。从svn仓库导入KEYS到本地环境。(发布版本的人不需要再导入,帮助做验证的人需要导入,用户名填发版人的即可)
+
+```shell
+$ curl https://dist.apache.org/repos/dist/dev/incubator/eventmesh/KEYS >> KEYS
+$ gpg --import KEYS
+$ gpg --edit-key "${发布人的gpg用户名}"
+  > trust
+
+Please decide how far you trust this user to correctly verify other users' keys
+(by looking at passports, checking fingerprints from different sources, etc.)
+
+  1 = I don't know or won't say
+  2 = I do NOT trust
+  3 = I trust marginally
+  4 = I trust fully
+  5 = I trust ultimately
+  m = back to the main menu
+
+Your decision? 5
+
+  > save
+```
+
+然后使用如下命令检查签名
+
+```shell
+$ gpg --verify apache-eventmesh-${release_version}-incubating-source.tar.gz.asc apache-eventmesh-${release_version}-incubating-source-tar.gz
+$ gpg --verify apache-eventmesh-${release_version}-incubating-bin.tar.gz.asc apache-eventmesh-${release_version}-incubating-bin.tar.gz
+```
+
+### 2.检查源码包的文件内容
+
+解压缩`apache-eventmesh-${release_version}-incubating-source-tar.gz`,进行如下检查:
+
+- 检查源码包是否包含由于包含不必要文件,致使tar包过于庞大
+- 文件夹包含单词`incubating`
+- 存在`LICENSE`和`NOTICE`文件
+- 存在`DISCLAIMER`文件
+- `NOTICE`文件中的年份正确
+- 只存在文本文件,不存在二进制文件
+- 所有文件的开头都有ASF许可证
+- 能够正确编译,单元测试可以通过 (./gradle build) (目前支持JAVA 8/gradle 7.0/idea 2021.1.1及以上)
+- 检查是否有多余文件或文件夹,例如空文件夹等
+
+### 3.检查二进制包的文件内容
+
+- 文件夹包含单词`incubating`
+- 存在`LICENSE`和`NOTICE`文件
+- 存在`DISCLAIMER`文件
+- `NOTICE`文件中的年份正确
+- 所有文本文件开头都有ASF许可证
+- 检查第三方依赖许可证:
+  - 第三方依赖的许可证兼容
+  - 所有第三方依赖的许可证都在`LICENSE`文件中声名
+  - 依赖许可证的完整版全部在`license`目录
+  - 如果依赖的是Apache许可证并且存在`NOTICE`文件,那么这些`NOTICE`文件也需要加入到版本的`NOTICE`文件中
+
+你可以参考此文章:[ASF第三方许可证策](https://apache.org/legal/resolved.html)
+
+## 发起投票
+
+> EventMesh 仍在孵化阶段,需要进行两次投票
+
+- EventMesh社区投票,发送邮件至:`dev@eventmesh.apache.org`
+- incubator社区投票,发送邮件至:`general@incubator.apache.org` EventMesh毕业后,只需要在EventMesh社区投票
+
+### 1.EventMesh社区投票阶段
+
+1. EventMesh社区投票,发起投票邮件到`dev@eventmesh.apache.org`。PMC需要先按照文档检查版本的正确性,然后再进行投票。 经过至少72小时并统计到3个`+1 PMC member`票后,即可进入下一阶段的投票。
+2. 宣布投票结果,发起投票结果邮件到`dev@eventmesh.apache.org`。
+
+### 2.EventMesh社区投票模板
+
+标题:
+
+```
+[VOTE] Release Apache EventMesh (incubating) ${release_version} ${rc_version}
+```
+
+正文:
+
+```
+Hello EventMesh Community,
+
+    This is a call for vote to release Apache EventMesh (incubating) version ${release_version}-${rc_version}.
+
+	Release notes:
+	https://github.com/apache/incubator-eventmesh/releases/tag/v${release_version}-${rc_version}
+
+    The release candidates:
+    	https://dist.apache.org/repos/dist/dev/incubator/eventmesh/${release_version}-${rc_version}/
+
+    Maven artifacts are available in a staging repository at:
+    https://repository.apache.org/content/repositories/orgapacheeventmesh-{staging-id}
+
+	Git tag for the release:
+	https://github.com/apache/incubator-eventmesh/tree/v${release_version}-${rc_version}
+
+	Keys to verify the Release Candidate:
+	https://downloads.apache.org/incubator/eventmesh/KEYS
+
+	Hash for the release tag:
+	#hashCode of this release tag
+
+	GPG user ID:
+	${YOUR.GPG.USER.ID}
+
+	The vote will be open for at least 72 hours or until necessary number of votes are reached.
+
+	Please vote accordingly:
+
+	[ ] +1 approve
+
+	[ ] +0 no opinion
+
+	[ ] -1 disapprove with the reason
+
+	Checklist for reference:
+
+	[ ] Download links are valid.
+
+	[ ] Checksums and PGP signatures are valid.
+
+	[ ] Source code distributions have correct names matching the current release.
+
+	[ ] LICENSE and NOTICE files are correct for each EventMesh repo.
+
+	[ ] All files have license headers if necessary.
+
+	[ ] No compiled archives bundled in source archive.
+
+	More detail checklist  please refer:
+    https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist
+
+Thanks,
+Your EventMesh Release Manager
+```
+
+### 3.宣布投票结果模板
+
+标题:
+
+```
+[RESULT][VOTE] Release Apache EventMesh (incubating) ${release_version} ${rc_version}
+```
+
+正文:
+
+```
+Hello Apache EventMesh PPMC and Community,
+
+    The vote closes now as 72hr have passed. The vote PASSES with
+
+    xx (+1 non-binding) votes from the PPMC,
+    xx (+1 binding) votes from the IPMC,
+    xx (+1 non-binding) votes from the rest of the developer community,
+    and no further 0 or -1 votes.
+
+    The vote thread: {vote_mail_address}
+
+    I will now bring the vote to general@incubator.apache.org to get approval by the IPMC.
+    If this vote passes also, the release is accepted and will be published.
+
+Thank you for your support.
+Your EventMesh Release Manager
+```
+
+### 4.Incubator社区投票阶段
+
+1. Incubator社区投票,发起投票邮件到`general@incubator.apache.org`,需3个 `+1 IPMC Member`投票,方可进入下一阶段。
+2. 宣布投票结果,发起投票结果邮件到`general@incubator.apache.org` 并抄送至`dev@eventmesh.apache.org`。
+
+### 5.Incubator社区投票模板
+
+标题:
+
+```
+[VOTE] Release Apache EventMesh (incubating) ${release_version} ${rc_version}
+```
+
+内容:
+
+```
+Hello Incubator Community,
+
+	This is a call for a vote to release Apache EventMesh(Incubating) version ${release_version} ${rc_version}
+
+	The Apache EventMesh community has voted on and approved a proposal to release
+    Apache EventMesh(Incubating) version ${release_version} ${rc_version}
+
+    We now kindly request the Incubator PMC members review and vote on this
+    incubator release.
+
+    EventMesh community vote thread:
+    • [投票链接]
+
+    Vote result thread:
+    • [投票结果链接]
+
+    The release candidate:
+    •https://dist.apache.org/repos/dist/dev/incubator/eventmesh/${release_version}-${rc_version}/
+
+	Git tag for the release:
+	• https://github.com/apache/incubator-eventmesh/tree/${release_version}-${rc_version}
+	Release notes:
+	• https://github.com/apache/incubator-eventmesh/releases/tag/${release_version}-${rc_version}
+
+	The artifacts signed with PGP key [填写你个人的KEY], corresponding to [填写你个人的邮箱], that can be found in keys file:
+	• https://downloads.apache.org/incubator/eventmesh/KEYS
+
+	The vote will be open for at least 72 hours or until necessary number of votes are reached.
+
+	Please vote accordingly:
+
+	[ ] +1 approve
+	[ ] +0 no opinion
+	[ ] -1 disapprove with the reason
+
+Thanks,
+On behalf of Apache EventMesh(Incubating) community
+```
+
+### 6.宣布投票结果模板
+
+标题:
+
+```
+[RESULT][VOTE] Release Apache EventMesh (incubating) ${release_version} ${rc_version}
+```
+
+内容:
+
+```
+Hi all,
+
+	Thanks for reviewing and voting for Apache EventMesh(Incubating) version ${release_version} ${rc_version} release, I am happy to announce the release voting has passed with [投票结果数] binding votes, no +0 or -1 votes.
+
+	 Binding votes are from IPMC
+	   - xxx
+   	   - xxx
+       - xxx
+
+     Non-binding votes:
+       +1 xxx
+       +0 xxx
+       -1 xxx
+
+    The voting thread is:
+    • [投票结果链接]
+
+    Many thanks for all our mentors helping us with the release procedure, and all IPMC helped us to review and vote for Apache EventMesh(Incubating) release. I will be 		working on publishing the artifacts soon.
+
+Thanks,
+On behalf of Apache EventMesh(Incubating) community
+```
+
+## 正式发布
+
+### 1.合并分支
+
+合并`${release_version}-release`分支的改动到`master`分支,合并完成后删除`release`分支
+
+```shell
+$ git checkout master
+$ git merge origin/${release_version}-release
+$ git pull
+$ git push origin master
+$ git push --delete origin ${release_version}-release
+$ git branch -d ${release_version}-release
+```
+
+### 2.迁移源码与二进制包
+
+将源码和二进制包从svn的`dev`目录移动到`release`目录
+
+```shell
+$ svn mv https://dist.apache.org/repos/dist/dev/incubator/eventmesh/${release_version}-${rc_version} https://dist.apache.org/repos/dist/release/incubator/eventmesh/ -m "transfer packages for ${release_version}-${rc_version}" #移动源码包与二进制包
+$ svn delete https://dist.apache.org/repos/dist/release/incubator/eventmesh/KEYS -m "delete KEYS" #清除原有release目录下的KEYS
+$ svn cp https://dist.apache.org/repos/dist/dev/incubator/eventmesh/KEYS https://dist.apache.org/repos/dist/release/incubator/eventmesh/ -m "transfer KEYS for ${release_version}-${rc_version}" #拷贝dev目录KEYS到release目录
+```
+
+### 3.确认dev和release下的包是否正确
+
+- 确认[dev](https://dist.apache.org/repos/dist/dev/incubator/eventmesh/)下的`${release_version}-${rc_version}`已被删除
+- 删除[release](https://dist.apache.org/repos/dist/release/incubator/eventmesh/)目录下上一个版本的发布包,这些包会被自动保存在[这里](https://archive.apache.org/dist/incubator/eventmesh/)
+
+```shell
+$ svn delete https://dist.apache.org/repos/dist/release/incubator/eventmesh/${last_release_version} -m "Delete ${last_release_version}"
+```
+
+### 4.在Apache Staging仓库发布版本
+
+- 登录http://repository.apache.org , 使用Apache账号登录
+- 点击左侧的Staging repositories,
+- 搜索EventMesh关键字,选择你最近上传的仓库,投票邮件中指定的仓库
+- 点击上方的`Release`按钮,这个过程会进行一系列检查
+
+> 等仓库同步到其他数据源,一般需要24小时
+
+### 5.GitHub版本发布
+
+1.Tag the commit (on which the vote happened) with the release version without `-${RELEASE_CANDIDATE}`. 例如:after a successful vote on `v1.2-rc5`, the hash will be tagged again with `v1.2` only.
+
+2.在 [GitHub Releases](https://github.com/apache/incubator-eventmesh/releases) 页面的 `${release_version}` 版本上点击 `Edit`
+
+编辑版本号及版本说明,并点击 `Publish release`
+
+### 6.更新下载页面
+
+等待并确认新的发布版本同步至 Apache 镜像后,更新如下页面:
+
+https://eventmesh.apache.org/download/
+
+https://eventmesh.apache.org/zh/download/
+
+GPG签名文件和哈希校验文件的下载连接应该使用这个前缀:`https://downloads.apache.org/incubator/eventmesh/`
+
+> 注意:项目下载链接应该使用 https://www.apache.org/dyn/closer.lua 而不是 closer.cgi 或者 mirrors.cgi
+
+### 7.邮件通知版本发布完成
+
+> 请确保Apache Staging仓库已发布成功,一般是在该步骤的24小时后发布邮件
+
+发邮件到 `dev@eventmesh.apache.org` 、 `announce@apache.org`和`general@incubator.apache.org`
+
+标题:
+
+```
+[ANNOUNCE] Apache EventMesh (incubating) ${release_version} available
+```
+
+正文:
+
+```
+Hi all,
+
+Apache EventMesh (incubating) Team is glad to announce the new release of Apache EventMesh (incubating) ${release_version}.
+
+Apache EventMesh (incubating) is a dynamic cloud-native eventing infrastructure used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks.
+
+Download Links: https://eventmesh.apache.org/projects/eventmesh/download/
+
+Release Notes: https://eventmesh.apache.org/events/release-notes/v${release_version}/
+
+Website: https://eventmesh.apache.org/
+
+EventMesh Resources:
+- Issue: https://github.com/apache/incubator-eventmesh/issues
+- Mailing list: dev@eventmesh.apache.org
+
+
+
+Apache EventMesh (incubating) Team
+```
+
diff --git a/docs/en/contribute/02-write-unit-test.md b/docs/en/contribute/02-write-unit-test.md
new file mode 100644
index 00000000..0c48e46b
--- /dev/null
+++ b/docs/en/contribute/02-write-unit-test.md
@@ -0,0 +1,77 @@
+# Unit Test Requirement
+
+- Each unit test case should use assertions instead of `System.out` output or `if` statement
+- Each unit test case shouldn't call other cases or depend on the order of execution.
+- Each unit test case should be repeatable and not depend on the external environment because the test might be executed in the continuous integration.
+- The scope of each unit test should be small enough to help locate the problem at the method level.
+
+## Location and Naming Rules
+
+- The unit test should be placed in `src/test/java`.
+- The unit test configuration file should be placed in `src/test/resources`. For example:
+  - Class to be tested: `src/main/java/org/apache/eventmesh/common/protocol/http/body/BaseResponseBody.java`
+  - Unit test: `src/test/java/org/apache/eventmesh/common/protocol/http/body/BaseResponseBodyTest.java`
+  - Unit test configuration: `src/test/resources/configuration.properties`
+- The package name of the unit test class should be identical to the class to be tested.
+- The name of the unit test class should be `{class or interface to be tested}Test`. For example:
+  - Class to be tested: `EventMeshUtil`
+  - Unit test class: `EventMeshUtilTest`
+- The name of each test case should be `test{method name}`. For example:
+  - Method to be tested: `addProp(String key, String val)`
+  - Unit test case: `testAddProp`
+
+## Assertion Usage
+
+### Common Assertion
+
+| Methods | Instructions |
+| :-------------- | :-------------- |
+| `assertEquals`    | Determines whether two objects or primitive types are equal |
+| `assertNotEquals` | Determines whether two objects or primitive types are not equal |
+| `assertTrue`      | Determines whether the given Boolean value is `true` |
+| `assertFalse`    | Determines whether the given Boolean value is `false` |
+| `assertNull`      | Determines whether the given object reference is `null` |
+| `assertNotNull`   | Determines whether the given object reference is not `null` |
+| `assertAll`       | When multiple decision logic are processed together if only one error is reported, the whole test will fail |
+
+### Example
+
+#### `assertEquals()`
+
+```java
+configuration.init();
+Assert.assertEquals("value1", configuration.eventMeshEnv);
+```
+
+#### `assertTrue()`
+
+```java
+BaseResponseHeader header = BaseResponseHeader.buildHeader("200");
+Assert.assertTrue(header.toMap().containsKey(ProtocolKey.REQUEST_CODE));
+```
+
+#### `assertFalse()`
+
+```java
+Class<NacosRegistryService> nacosRegistryServiceClass = NacosRegistryService.class;
+Field initStatus = nacosRegistryServiceClass.getDeclaredField("INIT_STATUS");
+initStatus.setAccessible(true);
+Object initStatusField = initStatus.get(nacosRegistryService);
+Assert.assertFalse((Boolean.parseBoolean(initStatusField.toString())));
+```
+
+#### `assertNull()`
+
+```java
+DefaultFullHttpResponse response = httpCommand.httpResponse();
+Assert.assertNull(response);
+```
+
+#### `assertNotNull()`
+
+```java
+Codec.Decoder cd = new Codec.Decoder();
+ArrayList<Object> result = new ArrayList<>();
+cd.decode(null, buf, result);
+Assert.assertNotNull(result.get(0));
+```
diff --git a/docs/en/design-document/design-document/_category_.json b/docs/en/contribute/_category_.json
similarity index 58%
copy from docs/en/design-document/design-document/_category_.json
copy to docs/en/contribute/_category_.json
index e0ab3c0c..56d36f91 100644
--- a/docs/en/design-document/design-document/_category_.json
+++ b/docs/en/contribute/_category_.json
@@ -1,5 +1,5 @@
 {
   "position": 5,
-  "label": "Design Document",
+  "label": "Contribute",
   "collapsed": false
 }
diff --git a/docs/en/design-document/design-document/01-workflow.md b/docs/en/design-document/01-workflow.md
similarity index 79%
rename from docs/en/design-document/design-document/01-workflow.md
rename to docs/en/design-document/01-workflow.md
index 879d0982..43589178 100644
--- a/docs/en/design-document/design-document/01-workflow.md
+++ b/docs/en/design-document/01-workflow.md
@@ -2,46 +2,31 @@
 
 ## Business Problem
 
-Imaging you are building a simple Order Management System for an E-Commerce Store.
-The system should be able to receive and provision new orders from a store website. The provisioning process
-should be able to process all orders, handle payments, as well as process shipments.
+Imaging you are building a simple Order Management System for an E-Commerce Store. The system should be able to receive and provision new orders from a store website. The provisioning process should be able to process all orders, handle payments, as well as process shipments.
 
-For high availability and high performance, you architect the system using event-driven architecture (EDA), and build microservice apps to handle
-store frontend, order management, payment processing, and shipment management.
-You deploy the whole system in a cloud environment. To handle high workloads, you leverage a messaging system to buffer the loads,
-and scale up multiple instances of microservices. The architecture could look similar to:
+For high availability and high performance, you architect the system using event-driven architecture (EDA), and build microservice apps to handle store frontend, order management, payment processing, and shipment management. You deploy the whole system in a cloud environment. To handle high workloads, you leverage a messaging system to buffer the loads, and scale up multiple instances of microservices. The architecture could look similar to:
 
-![eventmesh-workflow-uc](/images/features/eventmesh-workflow-usecase.jpg)
+![Workflow Use Case](/images/design-document/workflow-use-case.jpg)
 
 While each microservice is acting on its own event channels, EventMesh plays a crucial role of doing Event Orchestration.
 
 We use [CNCF Serverless Workflow](https://serverlessworkflow.io/) to describe this Event Workflow Orchestration.
 
-## About CNCF Serverless Workflow
+## CNCF Serverless Workflow
 
-CNCF Serverless Workflow defines a vendor-neutral, open-source, and fully community-driven ecosystem
-for defining and running DSL-based workflows that target the Serverless technology domain.
+CNCF Serverless Workflow defines a vendor-neutral, open-source, and fully community-driven ecosystem for defining and running DSL-based workflows that target the Serverless technology domain.
 
-Serverless Workflow defines a Domain Specific Language (DSL)
-to describe stateful and stateless workflow-based orchestrations of serverless functions and microservices.
+Serverless Workflow defines a Domain Specific Language (DSL) to describe stateful and stateless workflow-based orchestrations of serverless functions and microservices.
 
-More about this can be found in its [official github site](https://github.com/serverlessworkflow/specification)
+More details could be found in its [official github site](https://github.com/serverlessworkflow/specification)
 
 ## EventMesh Workflow
 
-We leverage Serverless Workflow DSL to describe the EventMesh workflow. Based on its spec, the workflow is consists of a series of
-workflow states used to describe the control-flow logic.
-At this time we only support event related workflow states. See the supported states in [Workflow DSL Design](#workflow-dsl-design-wip).
+We leverage Serverless Workflow DSL to describe the EventMesh workflow. Based on its spec, the workflow is consists of a series of workflow states used to describe the control-flow logic. At this time we only support event related workflow states. See the supported states in [Workflow DSL Design](#workflow-dsl-design-wip).
 
-A `workflow state` can include applicable `actions`, or services/functions that should be invoked during workflow execution.
-These `actions` can reference reusable `function` definitions which define how these functions/services should be invoked.
-They can also reference events that trigger event-based service invocations, and events to wait for that denote completion of
-such event-based service invocation completion.
+A `workflow state` can include applicable `actions`, or services/functions that should be invoked during workflow execution. These `actions` can reference reusable `function` definitions which define how these functions/services should be invoked. They can also reference events that trigger event-based service invocations, and events to wait for that denote completion of such event-based service invocation completion.
 
-In EDA solution, we usually defined our event-driven microservice using AsyncAPI.
-Serverless workflow `function` definitions support defining invocation semantics using AsyncAPI.
-See [Using Funtions for AsyncAPI Service](https://github.com/serverlessworkflow/specification/blob/main/specification.md#using-functions-for-async-api-service-invocations)
-for more information.
+In EDA solution, we usually defined our event-driven microservice using AsyncAPI. Serverless workflow `function` definitions support defining invocation semantics using AsyncAPI. See [Using Funtions for AsyncAPI Service](https://github.com/serverlessworkflow/specification/blob/main/specification.md#using-functions-for-async-api-service-invocations) for more information.
 
 ### AsyncAPI
 
@@ -196,13 +181,13 @@ events:
 
 The corresponding workflow diagram is the following:
 
-![eventmesh-workflow-diag](/images/features/eventmesh-workflow-diag.png)
+![Workflow Diagram](/images/design-document/workflow-diagram.png)
 
 ## EventMesh Workflow Engine
 
 In the following architecture diagram, the EventMesh Catalog, EventMesh Workflow Engine and EventMesh Runtime are running in three different processors.
 
-![eventmesh-workflow-arch](/images/features/eventmesh-workflow-arch.jpg)
+![Workflow Architecture](/images/design-document/workflow-architecture.jpg)
 
 The steps running the workflow is the followings:
 
diff --git a/docs/en/design-document/design-document/02-runtime-protocol.md b/docs/en/design-document/02-runtime-protocol.md
similarity index 98%
rename from docs/en/design-document/design-document/02-runtime-protocol.md
rename to docs/en/design-document/02-runtime-protocol.md
index 841f4ac2..165528b2 100644
--- a/docs/en/design-document/design-document/02-runtime-protocol.md
+++ b/docs/en/design-document/02-runtime-protocol.md
@@ -128,15 +128,15 @@ public enum Command {
 
 #### Sync Message
 
-![sync-msg](/images/protocol/eventmesh-sync-message.png)
+![Sync Message](/images/design-document/sync-message.png)
 
 #### Async Message
 
-![async-msg](/images/protocol/eventmesh-async-message.png)
+![Async Message](/images/design-document/async-message.png)
 
 #### Boardcast Message
 
-![broadcast-msg](/images/protocol/eventmesh-broadcast-message.png)
+![Boardcast Message](/images/design-document/broadcast-message.png)
 
 ## HTTP Protocol
 
diff --git a/docs/en/design-document/design-document/03-stream.md b/docs/en/design-document/03-stream.md
similarity index 84%
rename from docs/en/design-document/design-document/03-stream.md
rename to docs/en/design-document/03-stream.md
index da66dc02..7f2534a5 100644
--- a/docs/en/design-document/design-document/03-stream.md
+++ b/docs/en/design-document/03-stream.md
@@ -1,11 +1,6 @@
 # EventMesh Stream
 
-## Introduction
-
-[EventMesh(incubating)](https://github.com/apache/incubator-eventmesh) is a dynamic
-cloud-native eventing infrastructure.
-
-## An overview of Event Streaming
+## Overview of Event Streaming
 
 Event Streaming is an implementation of Pub/Sub architecture pattern,it consist of
 
@@ -41,7 +36,7 @@ and easily integrate various systems consuming or producing data.
 
 ## Architecture
 
-![eventmesh-stream-arch](/images/eventmesh-stream-arch.png)
+![Stream Architecture](/images/design-document/stream-architecture.png)
 
 ## Design
 
@@ -88,7 +83,7 @@ The main advantage of the pipeline is that you can create complex event processi
 
 Component interface is the primary entry point, you can use Component object as a factory to create EndPoint objects.
 
-![eventmesh-stream-component-interface](/images/features/eventmesh-stream-component-interface.png)
+![Stream Component Interface](/images/design-document/stream-component-interface.png)
 
 ### EndPoint
 
@@ -97,14 +92,14 @@ EndPoint which is act as factories for creating Consumer, Producer and Event obj
 - `createConsumer()` — Creates a consumer endpoint, which represents the source endpoint at the beginning of a route.
 - `createProducer()` — Creates a producer endpoint, which represents the target endpoint at the end of a route.
 
-![eventmesh-stream-component-routes](/images/features/eventmesh-stream-component-routes.png)
+![Stream Component Routes](/images/design-document/stream-component-routes.png)
 
 #### Producer
 
 User can create following types of producer
 > Synchronous Producer-Processing thread blocks until the producer has finished the event processing.
 
-![eventmesh-stream-sync-producer](/images/features/eventmesh-stream-sync-producer.png)
+![Stream Sync Producer](/images/design-document/stream-sync-producer.png)
 
 In future Producer Types:
 
@@ -115,15 +110,9 @@ In future Producer Types:
 User can create following types of consumer
 > Event-driven consumer-the processing of an incoming request is initiated when message binder call a method in consumer.
 
-![eventmesh-stream-event_driven-consumer](/images/features/eventmesh-stream-event_driven-consumer.png)
+![Stream Event-Driven Consumer](/images/design-document/stream-event-driven-consumer.png)
 
-In Future
+In the Future
 
 - Scheduled poll consumer
 - Custom polling consumer
-
-## Appendix
-
-### References
-
-- <https://donovanmuller.blog/camel-spring-cloud-stream/>
diff --git a/docs/en/design-document/design-document/04-schema-registry.md b/docs/en/design-document/04-schema-registry.md
similarity index 76%
rename from docs/en/design-document/design-document/04-schema-registry.md
rename to docs/en/design-document/04-schema-registry.md
index b4127ef1..7c5d2282 100644
--- a/docs/en/design-document/design-document/04-schema-registry.md
+++ b/docs/en/design-document/04-schema-registry.md
@@ -1,10 +1,6 @@
-# EventMesh SchemaRegistry (OpenSchema)
+# EventMesh Schema Registry (OpenSchema)
 
-## Introduction
-
-[EventMesh(incubating)](https://github.com/apache/incubator-eventmesh) is a dynamic cloud-native eventing infrastructure.
-
-## An Overview of Schema and Schema Registry
+## Overview of Schema and Schema Registry
 
 ### Schema
 
@@ -20,7 +16,7 @@ Schema Registry is a server provides RESTful interfaces. It could receive and st
 
 It could be applied to validation process and (de-)serialization process.
 
-### A Comparison of Schema Registry in Other Projects
+### Comparison of Schema Registry in Different Projects
 
 Project | Application
 :---: | :---
@@ -28,7 +24,7 @@ EMQ[[2]](#References) | Mainly in (de-)serialization process. Use "Schema Regist
 Pulsar[[3]](#References) | Mainly in validation process. Use "Schema Registry" to validate a message.
 Confluentinc[[4]](#References) | In both validation and (de-)serialization process.
 
-## An Overview of OpenSchema
+## Overview of OpenSchema
 
 OpenSchema[[5]](#References) proposes a specification for data schema when exchanging the message and event in more and more modern cloud-native applications. It designs a RESTful interface for storing and retrieving such as Avro, JSON Schema, and Protobuf3 schemas from three aspects(subject/schema/compatibility).
 
@@ -43,32 +39,32 @@ OpenSchema[[5]](#References) proposes a specification for data schema when excha
 
 ### Architecture
 
-![OpenSchema](/images/features/eventmesh-schemaregistry-arch.png)
+![OpenSchema](/images/design-document/schema-registry-architecture.png)
 
 ### Process of Transferring Messages under Schema Registry
 
-![Process](/images/features/eventmesh-schemaregistry-process.jpg)
+![Process](/images/design-document/schema-registry-process.jpg)
 
-The highlevel process of messages transmission undergoes 10 steps as follows:
+The highlevel process of messages transmission contains 10 steps as follows:
 
-- step1: Consumer subscribes "TOPIC" messages from EventMesh.
-- step2: Producer registers a schema to EventMesh.
-- step3: EventMesh registers a schema to Schema Registry.
-- step4: Schema Registry returns the id of newly created schema; EventMesh caches such id and schema.
-- step5: EventMesh returns the id of schema to Producer.
-- step6: Producer patches the id in front of messages and send messages to EventMesh.
-- step7: EventMesh validates the messages in the entry port and send it to EventStore; EventMesh retrieves messages from EventStore.
-- step8: EventMesh unpatches the id and send it to Schema Registry(if such `<id, schema>` does not exists in local cache).
-- step9: Schema Registry returns schema and EventMesh caches it.
-- step10: EventMesh patches schema in front of messages and push it to consumer.
+- 1: Consumer subscribes "TOPIC" messages from EventMesh.
+- 2: Producer registers a schema to EventMesh.
+- 3: EventMesh registers a schema to Schema Registry.
+- 4: Schema Registry returns the id of newly created schema; EventMesh caches such id and schema.
+- 5: EventMesh returns the id of schema to Producer.
+- 6: Producer patches the id in front of messages and send messages to EventMesh.
+- 7: EventMesh validates the messages in the entry port and send it to EventStore; EventMesh retrieves messages from EventStore.
+- 8: EventMesh unpatches the id and send it to Schema Registry(if such `<id, schema>` does not exists in local cache).
+- 9: Schema Registry returns schema and EventMesh caches it.
+- 10: EventMesh patches schema in front of messages and push it to consumer.
 
 ## Current Progress
 
 ### Status
 
-**Current state** : Developing
+**Current state**: Developing
 
-**Discussion thread** : ISSUE #339
+**Discussion thread**: ISSUE #339
 
 ### Proposed Changes
 
@@ -97,7 +93,7 @@ No. | Status Code | Exception Code | Description | status
 10 | 500 | 50001 | Storage Service Exception | ✔
 11 | ^ | 50002 | Timeout Exception | ✔
 
-#### API developing status
+#### API Development Status
 
 No. | Type | URL | response | exception | code | test
 --- | --- | --- | --- | --- | --- | ---
@@ -123,15 +119,15 @@ No. | Type | URL | response | exception | code | test
 
 ```CompatibilityController.java```+```CompatibilityService.java``` : ```OpenSchema 7.3.1~7.3.3 (API 11~13)``` + ```Check for Compatibility```
 
-![Project_Structure](/images/features/eventmesh-schemaregistry-projectstructure.png)
+![Project Structure](/images/design-document/schema-registry-project-structure.png)
 
 ## References
 
 [1] [schema validator (github.com)](https://github.com/search?q=schema+validator)
 
-[2] [EMQ : Schema Registry](https://www.jianshu.com/p/33e0655c642b)
+[2] [EMQ: Schema Registry](https://www.jianshu.com/p/33e0655c642b)
 
-[3] [Pulsar : Schema Registry](https://mp.weixin.qq.com/s/PaB66-Si00cX80py5ig5Mw)
+[3] [Pulsar: Schema Registry](https://mp.weixin.qq.com/s/PaB66-Si00cX80py5ig5Mw)
 
 [4] [confluentinc/schema-registry](https://github.com/confluentinc/schema-registry)
 
diff --git a/docs/en/design-document/design-document/05-metrics-export.md b/docs/en/design-document/05-metrics-export.md
similarity index 100%
rename from docs/en/design-document/design-document/05-metrics-export.md
rename to docs/en/design-document/05-metrics-export.md
diff --git a/docs/en/design-document/design-document/06-cloudevents.md b/docs/en/design-document/06-cloudevents.md
similarity index 98%
rename from docs/en/design-document/design-document/06-cloudevents.md
rename to docs/en/design-document/06-cloudevents.md
index 1cbf50af..bff91b45 100644
--- a/docs/en/design-document/design-document/06-cloudevents.md
+++ b/docs/en/design-document/06-cloudevents.md
@@ -44,7 +44,7 @@ should be an easy way to achieve the requirements.
 
 ### Pluggable Protocols
 
-![pluggable-protocols](/images/features/cloudevents-pluggable-protocols.png)
+![Pluggable Protocols](/images/design-document/cloudevents-pluggable-protocols.png)
 
 ### Process of CloudEvents under EventMesh
 
diff --git a/docs/en/design-document/design-document/07-tracing.md b/docs/en/design-document/07-tracing.md
similarity index 90%
rename from docs/en/design-document/design-document/07-tracing.md
rename to docs/en/design-document/07-tracing.md
index 16f46be2..1b191965 100644
--- a/docs/en/design-document/design-document/07-tracing.md
+++ b/docs/en/design-document/07-tracing.md
@@ -1,10 +1,6 @@
 # Distributed Tracing
 
-## Introduction
-
-[EventMesh(incubating)](https://github.com/apache/incubator-eventmesh) is a dynamic cloud-native eventing infrastructure.
-
-## An overview of OpenTelemetry
+## Overview of OpenTelemetry
 
 OpenTelemetry is a collection of tools, APIs, and SDKs. You can use it to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior.
 
@@ -16,9 +12,9 @@ OpenTelemetry is a collection of tools, APIs, and SDKs. You can use it to instru
 
 ## Design Details
 
-- SpanProcessor:   BatchSpanProcessor
+- SpanProcessor: BatchSpanProcessor
 
-- Exporter:  log(default), would be changed from properties
+- Exporter: log(default), would be changed from properties
 
 ```java
 // Configure the batch spans processor. This span processor exports span in batches.
@@ -80,7 +76,7 @@ Additional, this will surround with try catch.If the specified exporter cannot b
 
 #### Improvement of different exporter
 
-SPI(To be completed)
+SPI (To be completed)
 
 ## Appendix
 
diff --git a/docs/en/design-document/design-document/08-spi.md b/docs/en/design-document/08-spi.md
similarity index 96%
rename from docs/en/design-document/design-document/08-spi.md
rename to docs/en/design-document/08-spi.md
index 381bf841..94da666e 100644
--- a/docs/en/design-document/design-document/08-spi.md
+++ b/docs/en/design-document/08-spi.md
@@ -19,12 +19,10 @@ EventMeshSPI is an SPI declaration annotation, all extended interface that want
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE})
 public @interface EventMeshSPI {
-
     /**
      * If true, the spi instance is singleton
      */
     boolean isSingleton() default false;
-
 }
 ```
 
@@ -38,7 +36,6 @@ EventMeshExtensionFactory is a factory used to get the SPI extension instance wh
 
 ```java
 public enum EventMeshExtensionFactory {
-  ;
     /**
      * @param extensionType extension plugin class type
      * @param extensionName extension instance name
@@ -46,7 +43,7 @@ public enum EventMeshExtensionFactory {
      * @return plugin instance
      */
     public static <T> T getExtension(Class<T> extensionType, String extensionName) {
-    ...
+        /* ... */
     }
 }
 ```
@@ -66,7 +63,6 @@ ExtensionClassLoader is used to load extension instance classed, it has two subc
  * </ul>
  */
 public interface ExtensionClassLoader {
-
     /**
      * load
      *
@@ -91,7 +87,7 @@ which indicates the MeshMQProducer is an SPI interface.
 ```java
 @EventMeshSPI(isSingleton = false)
 public interface MeshMQProducer extends Producer {
-...
+    /* ... */
 }
 ```
 
@@ -99,7 +95,7 @@ Then we create an eventmesh-connector-rocketmq module, which contains the concre
 
 ```java
 public class RocketMQProducerImpl implements MeshMQProducer {
-...
+    /* ... */
 }
 ```
 
@@ -114,5 +110,4 @@ The content of the file is the extension instance name and the corresponding ins
 rocketmq=org.apache.eventmesh.connector.rocketmq.producer.RocketMQProducerImpl
 ```
 
-At this point, an SPI expansion module is complete. We can use `EventMeshExtensionFactory.getExtension(MeshMQProducer.class, “rocketmq”)`
-to get the RocketMQProducerImpl instance.
+At this point, an SPI expansion module is complete. We can use `EventMeshExtensionFactory.getExtension(MeshMQProducer.class, "rocketmq")` to get the `RocketMQProducerImpl` instance.
diff --git a/docs/en/design-document/design-document/_category_.json b/docs/en/design-document/_category_.json
similarity index 76%
rename from docs/en/design-document/design-document/_category_.json
rename to docs/en/design-document/_category_.json
index e0ab3c0c..f9283e2f 100644
--- a/docs/en/design-document/design-document/_category_.json
+++ b/docs/en/design-document/_category_.json
@@ -1,5 +1,5 @@
 {
-  "position": 5,
+  "position": 6,
   "label": "Design Document",
   "collapsed": false
 }
diff --git a/docs/en/installation/01-eventmesh-runtime.md b/docs/en/installation/01-runtime.md
similarity index 100%
rename from docs/en/installation/01-eventmesh-runtime.md
rename to docs/en/installation/01-runtime.md
diff --git a/docs/en/installation/02-eventmesh-runtime-with-docker.md b/docs/en/installation/02-runtime-with-docker.md
similarity index 100%
rename from docs/en/installation/02-eventmesh-runtime-with-docker.md
rename to docs/en/installation/02-runtime-with-docker.md
diff --git a/docs/en/installation/03-eventmesh-store.md b/docs/en/installation/03-store.md
similarity index 100%
rename from docs/en/installation/03-eventmesh-store.md
rename to docs/en/installation/03-store.md
diff --git a/docs/en/instructions/eventmesh-unit-test-rule.md b/docs/en/instructions/eventmesh-unit-test-rule.md
deleted file mode 100644
index 92fea29d..00000000
--- a/docs/en/instructions/eventmesh-unit-test-rule.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Unit test guidelines
-
-## Directory and naming rules
-
-+ Unit test code must be placed in the project directory: src/test/java  
-  The test configuration file must also be placed in: src/test/resources  
-  Example:  
-  Business class: `src/main/java/org/apache/eventmesh/common/protocol/http/body/BaseResponseBody.java`  
-  Corresponding test class: `src/test/java/org/apache/eventmesh/common/protocol/http/body/BaseResponseBodyTest.java`  
-  Configuration file: `src/test/resources/configuration.properties`
-  
-+ The package name of the test class is the same as that of the tested class(as shown above)
-  
-+ Naming specifications for test classes:  
-  Tested (class, interface) name + Test  
-  Example:  
-  Business class name: `EventMeshUtil`  
-  Corresponding test class name: `EventMeshUtilTest`
-  
-+ Test case naming specification:  
-  test + Method name,use test as the prefix of the method name  
-  Example:  
-  Business method names:
-  ```
-    public EventMeshMessage addProp(String key, String val) {
-        if (prop == null) {
-            prop = new HashMap<>();
-        }
-        prop.put(key, val);
-        return this;
-    }
-  ```
-  Corresponding test method name:
-  ```
-    public void testAddProp() {
-        EventMeshMessage message = createLiteMessage();
-        message.addProp("key3", "value3");
-        Assert.assertEquals(3L, message.getProp().size());
-        Assert.assertEquals("value1", message.getProp("key1"));
-    }
-  ```
-
-## Coding specification
-
-+ Unit tests must use assertions for verification, and are not allowed to use `System.out` output and `if` for judgmental verification (you can use log to print critical log output)
-  
-+ Incremental code should ensure that the unit test passes
-  
-+ Unit tests should ensure that the test granularity is small enough to help position the problem, generally at the method level  
-  Note: Only with small test granularity can we locate the wrong position as soon as possible.
-  
-+ Keep unit tests independent, to keep unit tests stable, reliable and maintainable, unit test cases should never call each other or depend on the order in which they are executed
-  
-+ Unit tests must be repeatable and not affected by the external environment  
-  Note: Unit tests are usually placed in continuous integration, and if a single unit test is dependent on an external environment, it is easy to make the integration mechanism unavailable
-
-## Use of assertions
-
-**The result verification of all test cases must use the assertion pattern**
-
-### General assertions
-
-| Methods | Instructions | Note |
-| :-------------- | :-------------- | -------------- |
-| assertEquals    | Determines whether two objects or primitive types are equal |  |
-| assertNotEquals | Determines whether two objects or primitive types are not equal |  |
-| assertTrue      | Determines whether the given Boolean value is true |  |
-| assertFalse     | Determines whether the given Boolean value is false |  |
-| assertNull      | Determines whether the given object reference is null |  |
-| assertNotNull   | Determines whether the given object reference is not null |  |
-| assertAll       | When multiple decision logic are processed together, if only one error is reported, the whole test will fail |  |
-
-### Assertion Usage Examples
-
-+ assertEquals()
-```
- configuration.init();
- Assert.assertEquals("value1", configuration.eventMeshEnv);
-```
-
-+ assertTrue()
-```
- BaseResponseHeader header = BaseResponseHeader.buildHeader("200");
- Assert.assertTrue(header.toMap().containsKey(ProtocolKey.REQUEST_CODE));
-```
-
-+ assertFalse()
-```
- Class<NacosRegistryService> nacosRegistryServiceClass = NacosRegistryService.class;
- Field initStatus = nacosRegistryServiceClass.getDeclaredField("INIT_STATUS");
- initStatus.setAccessible(true);
- Object initStatusField = initStatus.get(nacosRegistryService);
- Assert.assertFalse((Boolean.parseBoolean(initStatusField.toString())));
-```
-
-+ assertNull()
-```
- DefaultFullHttpResponse response = httpCommand.httpResponse();
- Assert.assertNull(response);
-```
-
-+ assertNotNull()
-```
- Codec.Decoder cd = new Codec.Decoder();
- ArrayList<Object> result = new ArrayList<>();
- cd.decode(null, buf, result);
- Assert.assertNotNull(result.get(0));
-```
-
-+ Each object in the set result set needs to be asserted (using map as an example)
-```
- Map<String, Object> headerParam = new HashMap<>();
- headerParam.put(ProtocolKey.REQUEST_CODE, 200);
- headerParam.put(ProtocolKey.LANGUAGE, Constants.LANGUAGE_JAVA);
- headerParam.put(ProtocolKey.VERSION, "1.0");
- headerParam.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER, "default cluster");
- headerParam.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, "127.0.0.1");
- headerParam.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, "DEV");
- headerParam.put(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, "IDC");
- header = PushMessageRequestHeader.buildHeader(headerParam);
- Assert.assertThat(header.toMap().get(ProtocolKey.REQUEST_CODE), is(200));
- Assert.assertThat(header.toMap().get(ProtocolKey.LANGUAGE), is(Constants.LANGUAGE_JAVA));
- Assert.assertThat(header.toMap().get(ProtocolKey.VERSION), is(ProtocolVersion.V1));
- Assert.assertThat(header.toMap().get(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER), is("default cluster"));
- Assert.assertThat(header.toMap().get(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP), is("127.0.0.1"));
- Assert.assertThat(header.toMap().get(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV), is("DEV"));
- Assert.assertThat(header.toMap().get(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC), is("IDC"));
-```
diff --git a/docs/en/introduction.md b/docs/en/introduction.md
index 98a48491..4bb804dd 100644
--- a/docs/en/introduction.md
+++ b/docs/en/introduction.md
@@ -14,17 +14,17 @@ sidebar_position: 0
 
 **Apache EventMesh (Incubating)** is a dynamic event-driven application runtime used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks.
 
-## What is Event Mesh
+## What is EventMesh
 
-[Event Mesh](https://solace.com/what-is-an-event-mesh) is an architecture layer that provides dynamic distribution of events, thus event consumers could receive events from any event producer, no matter where the producer and consumer are attached to the mesh, without the need for configuration of event routing. It is enabled by a network of interconnected [event brokers](https://solace.com/what-is-an-event-broker/) and bridges applications and services in an [event-driven architecture]( [...]
+[EventMesh](https://solace.com/what-is-an-event-mesh) is an architecture layer that provides dynamic distribution of events, thus event consumers could receive events from any event producer, no matter where the producer and consumer are attached to the mesh, without the need for configuration of event routing. It is enabled by a network of interconnected [event brokers](https://solace.com/what-is-an-event-broker/) and bridges applications and services in an [event-driven architecture](h [...]
 
 ## Features
 
-- **Communication Protocol**: EventMesh is able to communicate with clients with TCP, HTTP, or gRPC.
-- **CloudEvents**: EventMesh supports the [CloudEvents](https://cloudevents.io) specification as the format of the events. CloudEvents is a specification for describing event data in common formats to provide interoperability across services, platforms and systems.
-- **Schema Registry**: EventMesh implements a schema registry that receives and stores schemas from clients and provides interface for other clients to retrieve schemas.
+- **Communication Protocol**: EventMesh could communicate with clients with TCP, HTTP, or gRPC.
+- **CloudEvents**: EventMesh supports the [CloudEvents](https://cloudevents.io) specification as the format of the events. CloudEvents is a specification for describing event data in common formats to provide interoperability across services, platforms, and systems.
+- **Schema Registry**: EventMesh implements a schema registry that receives and stores schemas from clients and provides an interface for other clients to retrieve schemas.
 - **Observability**: EventMesh exposed a range of metrics, such as the average latency of the HTTP protocol and the number of delivered messages. The metrics could be collected and analyzed with Prometheus or OpenTelemetry.
-- **Event Workflow Orchestration**: EventMesh Workflow is able to receive an event and decide which command to trigger next based on the workflow definitions and the current workflow state. The workflow definition could be written with the [Serverless Workflow](https://serverlessworkflow.io) DSL.
+- **Event Workflow Orchestration**: EventMesh Workflow could receive an event and decide which command to trigger next based on the workflow definitions and the current workflow state. The workflow definition could be written with the [Serverless Workflow](https://serverlessworkflow.io) DSL.
 
 ## Components
 
diff --git a/docs/en/sdk-java/01-introduction.md b/docs/en/sdk-java/01-introduction.md
index 59f2abc9..42b9c419 100644
--- a/docs/en/sdk-java/01-introduction.md
+++ b/docs/en/sdk-java/01-introduction.md
@@ -1,5 +1,29 @@
-# EventMesh SDK for Java
+# Installation
 
 [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.eventmesh/eventmesh-sdk-java/badge.svg?style=for-the-badge)](https://maven-badges.herokuapp.com/maven-central/org.apache.eventmesh/eventmesh-sdk-java)
 
-EventMesh SDK for Java is a collection of Java libraries to integrate EventMesh in a Java application. The SDK supports sending and receiving synchronous message, asynchronous message, and broadcast message in TCP, HTTP, and gRPC protocols. The SDK implements EventMesh Message, CloudEvents, and OpenMessaging formats. The demo project is available in the [`eventmesh-example`](https://github.com/apache/incubator-eventmesh/tree/master/eventmesh-examples) module.
+EventMesh SDK for Java is a collection of Java libraries to integrate EventMesh in a Java application. The SDK supports sending and receiving synchronous messages, asynchronous messages, and broadcast messages in TCP, HTTP, and gRPC protocols. The SDK implements EventMesh Message, CloudEvents, and OpenMessaging formats. The demo project is available in the [`eventmesh-example`](https://github.com/apache/incubator-eventmesh/tree/master/eventmesh-examples) module.
+
+## Gradle
+
+To install EventMesh SDK for Java with Gradle, declare `org.apache.eventmesh:eventmesh-sdk-java` as `implementation` in the dependencies block of the module's `build.gradle` file.
+
+```groovy
+dependencies {
+  implementation 'org.apache.eventmesh:eventmesh-sdk-java:1.4.0'
+}
+```
+
+## Maven
+
+To install EventMesh SDK for Java with Maven, declare `org.apache.eventmesh:eventmesh-sdk-java` as a dependency in the dependencies block of the project's `pom.xml` file.
+
+```xml
+<dependencies>
+  <dependency>
+    <groupId>org.apache.eventmesh</groupId>
+    <artifactId>eventmesh-sdk-java</artifactId>
+    <version>1.4.0</version>
+  </dependency>
+</dependencies>
+```
diff --git a/docs/en/sdk-java/02-http.md b/docs/en/sdk-java/02-http.md
index 3257adfa..eb71cb5f 100644
--- a/docs/en/sdk-java/02-http.md
+++ b/docs/en/sdk-java/02-http.md
@@ -1,6 +1,6 @@
 # HTTP Protocol
 
-EventMesh SDK for Java implements the HTTP producer and consumer of asynchronous messages. Both the producer and consumer requires an instance of `EventMEshHttpClientConfig` class that specifies the configuration of EventMesh HTTP client. The `liteEventMeshAddr`, `userName`, and `password` fields should match the `eventmesh.properties` file of EventMesh runtime.
+EventMesh SDK for Java implements the HTTP producer and consumer of asynchronous messages. Both the producer and consumer require an instance of `EventMeshHttpClientConfig` class that specifies the configuration of EventMesh HTTP client. The `liteEventMeshAddr`, `userName`, and `password` fields should match the `eventmesh.properties` file of EventMesh runtime.
 
 ```java
 import org.apache.eventmesh.client.http.conf.EventMeshHttpClientConfig;
diff --git a/docs/en/sdk-java/03-tcp.md b/docs/en/sdk-java/03-tcp.md
index 7a4b0a89..be6f9e31 100644
--- a/docs/en/sdk-java/03-tcp.md
+++ b/docs/en/sdk-java/03-tcp.md
@@ -1,6 +1,6 @@
 # TCP Protocol
 
-EventMesh SDK for Java implements the TCP producer and consumer of synchronous, asynchronous, and broadcast messages. Both the producer and consumer requires an instance of `EventMeshTCPClientConfig` class that specifies the configuration of EventMesh gRPC client. The `host` and `port` fields should match the `eventmesh.properties` file of EventMesh runtime.
+EventMesh SDK for Java implements the TCP producer and consumer of synchronous, asynchronous, and broadcast messages. Both the producer and consumer require an instance of `EventMeshTCPClientConfig` class that specifies the configuration of EventMesh gRPC client. The `host` and `port` fields should match the `eventmesh.properties` file of EventMesh runtime.
 
 ```java
 import org.apache.eventmesh.client.tcp.conf.EventMeshTCPClientConfig;
@@ -29,7 +29,7 @@ public interface ReceiveMsgHook<ProtocolMessage> {
 }
 ```
 
-The `EventMeshTCPClient` class implements the `subscribe` method. The `subscribe` method accepts the topic, the `SubscriptionMode`, and the `SubscriptionType`. The `handle` method will be invoked when the consumer receives a message from the topic it subscribes to. If the `SubscriptionType` is `SYNC`, the return value of `handle` will be sent back to the producer.
+The `EventMeshTCPClient` class implements the `subscribe` method. The `subscribe` method accepts the topic, the `SubscriptionMode`, and the `SubscriptionType`. The `handle` method will be invoked when the consumer receives a message from the topic it subscribes. If the `SubscriptionType` is `SYNC`, the return value of `handle` will be sent back to the producer.
 
 ```java
 import org.apache.eventmesh.client.tcp.EventMeshTCPClient;
@@ -72,7 +72,7 @@ public class TCPConsumer implements ReceiveMsgHook<CloudEvent> {
 
 ### Asynchronous Producer
 
-The `EventMeshTCPClient` class implements the `publish` method. The `publish` method accepts the message to be published and an optional timeout value, and returns the response message from the consumer.
+The `EventMeshTCPClient` class implements the `publish` method. The `publish` method accepts the message to be published and an optional timeout value and returns the response message from the consumer.
 
 ```java
 /* ... */
@@ -93,7 +93,7 @@ client.publish(event, 1000);
 
 ### Synchronous Producer
 
-The `EventMeshTCPClient` class implements the `rr` method. The `rr` method accepts the message to be published and an optional timeout value, and returns the response message from the consumer.
+The `EventMeshTCPClient` class implements the `rr` method. The `rr` method accepts the message to be published and an optional timeout value and returns the response message from the consumer.
 
 ```java
 /* ... */
diff --git a/docs/en/sdk-java/04-grpc.md b/docs/en/sdk-java/04-grpc.md
index 3a248f21..81f03a8d 100644
--- a/docs/en/sdk-java/04-grpc.md
+++ b/docs/en/sdk-java/04-grpc.md
@@ -1,6 +1,6 @@
 # gRPC Protocol
 
-EventMesh SDK for Java implements the gRPC producer and consumer of synchronous, asynchronous, and broadcast messages. Both the producer and consumer requires an instance of `EventMeshGrpcClientConfig` class that specifies the configuration of EventMesh gRPC client. The `liteEventMeshAddr`, `userName`, and `password` fields should match the `eventmesh.properties` file of EventMesh runtime.
+EventMesh SDK for Java implements the gRPC producer and consumer of synchronous, asynchronous, and broadcast messages. Both the producer and consumer require an instance of `EventMeshGrpcClientConfig` class that specifies the configuration of EventMesh gRPC client. The `liteEventMeshAddr`, `userName`, and `password` fields should match the `eventmesh.properties` file of EventMesh runtime.
 
 ```java
 import org.apache.eventmesh.client.grpc.config.EventMeshGrpcClientConfig;
@@ -33,7 +33,7 @@ public interface ReceiveMsgHook<T> {
 }
 ```
 
-The `EventMeshGrpcConsumer` class implements the `registerListener`, `subscribe`, and `unsubscribe` methods. The `subscribe` method accepts a list of `SubscriptionItem` that defines the topics to be subscribed. The `registerListener` accepts an instance of a class that implements the `ReceiveMsgHook`. The `handle` method will be invoked when the consumer receives a message from the topic it subscribes to. If the `SubscriptionType` is `SYNC`, the return value of `handle` will be sent back [...]
+The `EventMeshGrpcConsumer` class implements the `registerListener`, `subscribe`, and `unsubscribe` methods. The `subscribe` method accepts a list of `SubscriptionItem` that defines the topics to be subscribed to. The `registerListener` accepts an instance of a class that implements the `ReceiveMsgHook`. The `handle` method will be invoked when the consumer receives a message from the topic it subscribes. If the `SubscriptionType` is `SYNC`, the return value of `handle` will be sent back [...]
 
 ```java
 import org.apache.eventmesh.client.grpc.consumer.EventMeshGrpcConsumer;
diff --git a/docs/images/mesh-helper.jpg b/docs/images/contact/wechat-assistant.jpg
similarity index 100%
rename from docs/images/mesh-helper.jpg
rename to docs/images/contact/wechat-assistant.jpg
diff --git a/docs/images/wechat-official.jpg b/docs/images/contact/wechat-official.jpg
similarity index 100%
rename from docs/images/wechat-official.jpg
rename to docs/images/contact/wechat-official.jpg
diff --git a/docs/images/protocol/eventmesh-async-message.png b/docs/images/design-document/async-message.png
similarity index 100%
copy from docs/images/protocol/eventmesh-async-message.png
copy to docs/images/design-document/async-message.png
diff --git a/docs/images/protocol/eventmesh-broadcast-message.png b/docs/images/design-document/broadcast-message.png
similarity index 100%
copy from docs/images/protocol/eventmesh-broadcast-message.png
copy to docs/images/design-document/broadcast-message.png
diff --git a/docs/images/features/cloudevents-pluggable-protocols.png b/docs/images/design-document/cloudevents-pluggable-protocols.png
similarity index 100%
copy from docs/images/features/cloudevents-pluggable-protocols.png
copy to docs/images/design-document/cloudevents-pluggable-protocols.png
diff --git a/docs/images/features/eventmesh-schemaregistry-arch.png b/docs/images/design-document/schema-registry-architecture.png
similarity index 100%
copy from docs/images/features/eventmesh-schemaregistry-arch.png
copy to docs/images/design-document/schema-registry-architecture.png
diff --git a/docs/images/features/eventmesh-schemaregistry-process.jpg b/docs/images/design-document/schema-registry-process.jpg
similarity index 100%
copy from docs/images/features/eventmesh-schemaregistry-process.jpg
copy to docs/images/design-document/schema-registry-process.jpg
diff --git a/docs/images/features/eventmesh-schemaregistry-projectstructure.png b/docs/images/design-document/schema-registry-project-structure.png
similarity index 100%
copy from docs/images/features/eventmesh-schemaregistry-projectstructure.png
copy to docs/images/design-document/schema-registry-project-structure.png
diff --git a/docs/images/eventmesh-stream-arch.png b/docs/images/design-document/stream-architecture.png
similarity index 100%
copy from docs/images/eventmesh-stream-arch.png
copy to docs/images/design-document/stream-architecture.png
diff --git a/docs/images/features/eventmesh-stream-component-interface.png b/docs/images/design-document/stream-component-interface.png
similarity index 100%
copy from docs/images/features/eventmesh-stream-component-interface.png
copy to docs/images/design-document/stream-component-interface.png
diff --git a/docs/images/features/eventmesh-stream-component-routes.png b/docs/images/design-document/stream-component-routes.png
similarity index 100%
copy from docs/images/features/eventmesh-stream-component-routes.png
copy to docs/images/design-document/stream-component-routes.png
diff --git a/docs/images/features/eventmesh-stream-event_driven-consumer.png b/docs/images/design-document/stream-event-driven-consumer.png
similarity index 100%
copy from docs/images/features/eventmesh-stream-event_driven-consumer.png
copy to docs/images/design-document/stream-event-driven-consumer.png
diff --git a/docs/images/features/eventmesh-stream-sync-producer.png b/docs/images/design-document/stream-sync-producer.png
similarity index 100%
copy from docs/images/features/eventmesh-stream-sync-producer.png
copy to docs/images/design-document/stream-sync-producer.png
diff --git a/docs/images/protocol/eventmesh-sync-message.png b/docs/images/design-document/sync-message.png
similarity index 100%
copy from docs/images/protocol/eventmesh-sync-message.png
copy to docs/images/design-document/sync-message.png
diff --git a/docs/images/features/eventmesh-workflow-arch.jpg b/docs/images/design-document/workflow-architecture.jpg
similarity index 100%
copy from docs/images/features/eventmesh-workflow-arch.jpg
copy to docs/images/design-document/workflow-architecture.jpg
diff --git a/docs/images/features/eventmesh-workflow-diag.png b/docs/images/design-document/workflow-diagram.png
similarity index 100%
copy from docs/images/features/eventmesh-workflow-diag.png
copy to docs/images/design-document/workflow-diagram.png
diff --git a/docs/images/features/eventmesh-workflow-usecase.jpg b/docs/images/design-document/workflow-use-case.jpg
similarity index 100%
copy from docs/images/features/eventmesh-workflow-usecase.jpg
copy to docs/images/design-document/workflow-use-case.jpg
diff --git a/docs/images/eventmesh-architecture.png b/docs/images/eventmesh-architecture.png
index d2fcb68a..5405afc5 100644
Binary files a/docs/images/eventmesh-architecture.png and b/docs/images/eventmesh-architecture.png differ
diff --git a/docs/images/eventmesh-bridge.png b/docs/images/eventmesh-bridge.png
index 9b4fb4ca..b8d1220f 100644
Binary files a/docs/images/eventmesh-bridge.png and b/docs/images/eventmesh-bridge.png differ
diff --git a/docs/images/eventmesh-orchestration.png b/docs/images/eventmesh-orchestration.png
index 7c1fe959..40b28208 100644
Binary files a/docs/images/eventmesh-orchestration.png and b/docs/images/eventmesh-orchestration.png differ
diff --git a/docs/images/logo.svg b/docs/images/logo.svg
index 261a7e11..9db6d0d0 100644
--- a/docs/images/logo.svg
+++ b/docs/images/logo.svg
@@ -1,20 +1 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
--->
-
 <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#FFF" d="M99 52h84v34H99z"/><path d="M23 163c-7.398 0-13.843-4.027-17.303-10A19.886 19.886 0 0 0 3 163c0 11.046 8.954 20 20 20h20v-20H23z" fill="#3ECC5F"/><path d="M112.98 57.376L183 53V43c0-11.046-8.954-20-20-20H73l-2.5-4.33c-1.112-1.925-3.889-1.925-5 0L63 23l-2.5-4.33c-1.111-1.925-3.889-1.925-5 0L53 23l-2.5-4.33c-1.111-1.925-3.889-1.925-5 0L43 23c-.022 0 [...]
\ No newline at end of file
diff --git a/docs/images/eventmesh-architecture.png b/docs/test-images/eventmesh-architecture.png
similarity index 100%
copy from docs/images/eventmesh-architecture.png
copy to docs/test-images/eventmesh-architecture.png
diff --git a/docs/images/eventmesh-architecture.svg b/docs/test-images/eventmesh-architecture.svg
similarity index 100%
rename from docs/images/eventmesh-architecture.svg
rename to docs/test-images/eventmesh-architecture.svg
diff --git a/docs/images/eventmesh-bridge.png b/docs/test-images/eventmesh-bridge.png
similarity index 100%
copy from docs/images/eventmesh-bridge.png
copy to docs/test-images/eventmesh-bridge.png
diff --git a/docs/images/eventmesh-bridge.svg b/docs/test-images/eventmesh-bridge.svg
similarity index 100%
rename from docs/images/eventmesh-bridge.svg
rename to docs/test-images/eventmesh-bridge.svg
diff --git a/docs/images/eventmesh-ecosystem.png b/docs/test-images/eventmesh-ecosystem.png
similarity index 100%
rename from docs/images/eventmesh-ecosystem.png
rename to docs/test-images/eventmesh-ecosystem.png
diff --git a/docs/images/eventmesh-federation.png b/docs/test-images/eventmesh-federation.png
similarity index 100%
rename from docs/images/eventmesh-federation.png
rename to docs/test-images/eventmesh-federation.png
diff --git a/docs/images/eventmesh-orchestration.png b/docs/test-images/eventmesh-orchestration.png
similarity index 100%
copy from docs/images/eventmesh-orchestration.png
copy to docs/test-images/eventmesh-orchestration.png
diff --git a/docs/images/eventmesh-orchestrator.png b/docs/test-images/eventmesh-orchestrator.png
similarity index 100%
rename from docs/images/eventmesh-orchestrator.png
rename to docs/test-images/eventmesh-orchestrator.png
diff --git a/docs/images/eventmesh-orchestrator.svg b/docs/test-images/eventmesh-orchestrator.svg
similarity index 100%
rename from docs/images/eventmesh-orchestrator.svg
rename to docs/test-images/eventmesh-orchestrator.svg
diff --git a/docs/images/eventmesh-stream-arch.png b/docs/test-images/eventmesh-stream-arch.png
similarity index 100%
rename from docs/images/eventmesh-stream-arch.png
rename to docs/test-images/eventmesh-stream-arch.png
diff --git a/docs/images/eventmesh.png b/docs/test-images/eventmesh.png
similarity index 100%
rename from docs/images/eventmesh.png
rename to docs/test-images/eventmesh.png
diff --git a/docs/test-images/favicon.ico b/docs/test-images/favicon.ico
new file mode 100644
index 00000000..b6b6c2c6
Binary files /dev/null and b/docs/test-images/favicon.ico differ
diff --git a/docs/images/features/cloudevents-pluggable-protocols.png b/docs/test-images/features/cloudevents-pluggable-protocols.png
similarity index 100%
rename from docs/images/features/cloudevents-pluggable-protocols.png
rename to docs/test-images/features/cloudevents-pluggable-protocols.png
diff --git a/docs/images/features/eventmesh-schemaregistry-arch.png b/docs/test-images/features/eventmesh-schemaregistry-arch.png
similarity index 100%
rename from docs/images/features/eventmesh-schemaregistry-arch.png
rename to docs/test-images/features/eventmesh-schemaregistry-arch.png
diff --git a/docs/images/features/eventmesh-schemaregistry-process.jpg b/docs/test-images/features/eventmesh-schemaregistry-process.jpg
similarity index 100%
rename from docs/images/features/eventmesh-schemaregistry-process.jpg
rename to docs/test-images/features/eventmesh-schemaregistry-process.jpg
diff --git a/docs/images/features/eventmesh-schemaregistry-projectstructure.png b/docs/test-images/features/eventmesh-schemaregistry-projectstructure.png
similarity index 100%
rename from docs/images/features/eventmesh-schemaregistry-projectstructure.png
rename to docs/test-images/features/eventmesh-schemaregistry-projectstructure.png
diff --git a/docs/images/features/eventmesh-stream-component-interface.png b/docs/test-images/features/eventmesh-stream-component-interface.png
similarity index 100%
rename from docs/images/features/eventmesh-stream-component-interface.png
rename to docs/test-images/features/eventmesh-stream-component-interface.png
diff --git a/docs/images/features/eventmesh-stream-component-routes.png b/docs/test-images/features/eventmesh-stream-component-routes.png
similarity index 100%
rename from docs/images/features/eventmesh-stream-component-routes.png
rename to docs/test-images/features/eventmesh-stream-component-routes.png
diff --git a/docs/images/features/eventmesh-stream-event_driven-consumer.png b/docs/test-images/features/eventmesh-stream-event_driven-consumer.png
similarity index 100%
rename from docs/images/features/eventmesh-stream-event_driven-consumer.png
rename to docs/test-images/features/eventmesh-stream-event_driven-consumer.png
diff --git a/docs/images/features/eventmesh-stream-sync-producer.png b/docs/test-images/features/eventmesh-stream-sync-producer.png
similarity index 100%
rename from docs/images/features/eventmesh-stream-sync-producer.png
rename to docs/test-images/features/eventmesh-stream-sync-producer.png
diff --git a/docs/images/features/eventmesh-workflow-arch.jpg b/docs/test-images/features/eventmesh-workflow-arch.jpg
similarity index 100%
rename from docs/images/features/eventmesh-workflow-arch.jpg
rename to docs/test-images/features/eventmesh-workflow-arch.jpg
diff --git a/docs/images/features/eventmesh-workflow-diag.png b/docs/test-images/features/eventmesh-workflow-diag.png
similarity index 100%
rename from docs/images/features/eventmesh-workflow-diag.png
rename to docs/test-images/features/eventmesh-workflow-diag.png
diff --git a/docs/images/features/eventmesh-workflow-usecase.jpg b/docs/test-images/features/eventmesh-workflow-usecase.jpg
similarity index 100%
rename from docs/images/features/eventmesh-workflow-usecase.jpg
rename to docs/test-images/features/eventmesh-workflow-usecase.jpg
diff --git a/docs/test-images/incubator-logo.png b/docs/test-images/incubator-logo.png
new file mode 100644
index 00000000..759252f0
Binary files /dev/null and b/docs/test-images/incubator-logo.png differ
diff --git a/docs/test-images/logo.png b/docs/test-images/logo.png
new file mode 100644
index 00000000..e8545510
Binary files /dev/null and b/docs/test-images/logo.png differ
diff --git a/docs/images/logo.svg b/docs/test-images/logo.svg
similarity index 100%
copy from docs/images/logo.svg
copy to docs/test-images/logo.svg
diff --git a/docs/images/protocol/eventmesh-async-message.png b/docs/test-images/protocol/eventmesh-async-message.png
similarity index 100%
rename from docs/images/protocol/eventmesh-async-message.png
rename to docs/test-images/protocol/eventmesh-async-message.png
diff --git a/docs/images/protocol/eventmesh-broadcast-message.png b/docs/test-images/protocol/eventmesh-broadcast-message.png
similarity index 100%
rename from docs/images/protocol/eventmesh-broadcast-message.png
rename to docs/test-images/protocol/eventmesh-broadcast-message.png
diff --git a/docs/images/protocol/eventmesh-sync-message.png b/docs/test-images/protocol/eventmesh-sync-message.png
similarity index 100%
rename from docs/images/protocol/eventmesh-sync-message.png
rename to docs/test-images/protocol/eventmesh-sync-message.png
diff --git a/docs/cn/documentation/_category_.json b/docs/zh/documentation/_category_.json
similarity index 100%
rename from docs/cn/documentation/_category_.json
rename to docs/zh/documentation/_category_.json
diff --git a/docs/cn/features/_category_.json b/docs/zh/features/_category_.json
similarity index 100%
rename from docs/cn/features/_category_.json
rename to docs/zh/features/_category_.json
diff --git a/docs/cn/features/https.md b/docs/zh/features/https.md
similarity index 100%
rename from docs/cn/features/https.md
rename to docs/zh/features/https.md
diff --git a/docs/cn/features/spi.md b/docs/zh/features/spi.md
similarity index 100%
rename from docs/cn/features/spi.md
rename to docs/zh/features/spi.md
diff --git a/docs/cn/instructions/_category_.json b/docs/zh/instructions/_category_.json
similarity index 100%
rename from docs/cn/instructions/_category_.json
rename to docs/zh/instructions/_category_.json
diff --git a/docs/cn/instructions/eclipse.md b/docs/zh/instructions/eclipse.md
similarity index 100%
rename from docs/cn/instructions/eclipse.md
rename to docs/zh/instructions/eclipse.md
diff --git a/docs/cn/instructions/eventmesh-metrics-Prometheus-instruction.md b/docs/zh/instructions/eventmesh-metrics-Prometheus-instruction.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-metrics-Prometheus-instruction.md
rename to docs/zh/instructions/eventmesh-metrics-Prometheus-instruction.md
diff --git a/docs/cn/instructions/eventmesh-runtime-protocol.md b/docs/zh/instructions/eventmesh-runtime-protocol.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-runtime-protocol.md
rename to docs/zh/instructions/eventmesh-runtime-protocol.md
diff --git a/docs/cn/instructions/eventmesh-runtime-quickstart-with-docker.md b/docs/zh/instructions/eventmesh-runtime-quickstart-with-docker.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-runtime-quickstart-with-docker.md
rename to docs/zh/instructions/eventmesh-runtime-quickstart-with-docker.md
diff --git a/docs/cn/instructions/eventmesh-runtime-quickstart.md b/docs/zh/instructions/eventmesh-runtime-quickstart.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-runtime-quickstart.md
rename to docs/zh/instructions/eventmesh-runtime-quickstart.md
diff --git a/docs/cn/instructions/eventmesh-sdk-java-quickstart.md b/docs/zh/instructions/eventmesh-sdk-java-quickstart.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-sdk-java-quickstart.md
rename to docs/zh/instructions/eventmesh-sdk-java-quickstart.md
diff --git a/docs/cn/instructions/eventmesh-store-quickstart.md b/docs/zh/instructions/eventmesh-store-quickstart.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-store-quickstart.md
rename to docs/zh/instructions/eventmesh-store-quickstart.md
diff --git a/docs/cn/instructions/eventmesh-trace-Zipkin-instruction.md b/docs/zh/instructions/eventmesh-trace-Zipkin-instruction.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-trace-Zipkin-instruction.md
rename to docs/zh/instructions/eventmesh-trace-Zipkin-instruction.md
diff --git a/docs/cn/instructions/eventmesh-unit-test-rule.md b/docs/zh/instructions/eventmesh-unit-test-rule.md
similarity index 100%
rename from docs/cn/instructions/eventmesh-unit-test-rule.md
rename to docs/zh/instructions/eventmesh-unit-test-rule.md
diff --git a/docs/cn/instructions/quickstart.md b/docs/zh/instructions/quickstart.md
similarity index 100%
rename from docs/cn/instructions/quickstart.md
rename to docs/zh/instructions/quickstart.md
diff --git a/docs/cn/intro.md b/docs/zh/intro.md
similarity index 100%
rename from docs/cn/intro.md
rename to docs/zh/intro.md


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@eventmesh.apache.org
For additional commands, e-mail: commits-help@eventmesh.apache.org